diff options
Diffstat (limited to 'server/src/entity')
-rw-r--r-- | server/src/entity/tutorial.rs | 27 |
1 files changed, 26 insertions, 1 deletions
diff --git a/server/src/entity/tutorial.rs b/server/src/entity/tutorial.rs index 64bdaf7d..889815a6 100644 --- a/server/src/entity/tutorial.rs +++ b/server/src/entity/tutorial.rs @@ -11,6 +11,7 @@ pub struct Tutorial { target: ItemIndex, next_update_due: f32, + had_aquired_target: bool, current_hint: Option<(Option<IVec2>, Message)>, delete_timer: f32, @@ -24,6 +25,7 @@ impl Tutorial { target: item, current_hint: None, delete_timer: 1.5, + had_aquired_target: false, } } } @@ -50,10 +52,11 @@ impl Entity for Tutorial { let mut hint = StepContext { ent: &c, + had_aquired_target: &mut self.had_aquired_target, player: self.player, recursion_abort: 0, } - .aquire_item(self.target) + .fulfil_demand(self.target) .err(); if hint.is_none() { self.delete_timer -= TARGET_DT; @@ -98,6 +101,7 @@ impl Entity for Tutorial { struct StepContext<'a> { ent: &'a EntityContext<'a>, + had_aquired_target: &'a mut bool, recursion_abort: usize, player: PlayerID, } @@ -110,6 +114,16 @@ impl<'a> StepContext<'a> { .get(&self.player) .map_or(false, |p| p.item.as_ref().map_or(false, |i| i.kind == item)) } + pub fn find_demand(&self, item: ItemIndex) -> Option<IVec2> { + self.ent + .game + .players + .iter() + .find_map(|(_, pl)| match &pl.communicate_persist { + Some((Message::Item(i), _)) if *i == item => Some(pl.movement.position.as_ivec2()), + _ => None, + }) + } fn find_recipe_with_output(&self, item: ItemIndex) -> Option<RecipeIndex> { self.ent .game @@ -147,6 +161,17 @@ impl<'a> StepContext<'a> { self.aquire_item(item)?; Err((None, trm!("s.tutorial.put_away"))) } + fn fulfil_demand(&mut self, item: ItemIndex) -> Result<(), (Option<IVec2>, Message)> { + if !*self.had_aquired_target { + self.aquire_item(item)?; + *self.had_aquired_target = true; + } + if let Some(pos) = self.find_demand(item) { + Err((Some(pos), trm!("s.tutorial.serve"))) + } else { + Ok(()) + } + } fn aquire_item(&mut self, item: ItemIndex) -> Result<(), (Option<IVec2>, Message)> { debug!("aquire item {:?}", self.ent.game.data.item_names[item.0]); self.recursion_abort += 1; |