aboutsummaryrefslogtreecommitdiff
path: root/server/src/entity
diff options
context:
space:
mode:
Diffstat (limited to 'server/src/entity')
-rw-r--r--server/src/entity/tutorial.rs27
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;