diff options
Diffstat (limited to 'server/src/entity/tutorial.rs')
| -rw-r--r-- | server/src/entity/tutorial.rs | 49 |
1 files changed, 31 insertions, 18 deletions
diff --git a/server/src/entity/tutorial.rs b/server/src/entity/tutorial.rs index d1390b20..87896a09 100644 --- a/server/src/entity/tutorial.rs +++ b/server/src/entity/tutorial.rs @@ -169,10 +169,9 @@ impl StepContext<'_> { fn find_tile(&self, tile: TileIndex) -> Option<IVec2> { self.ent .game - .tiles - .iter() - .find(|(_, t)| t.kind == tile) - .map(|(p, _)| *p) + .tile_index + .get(&tile) + .and_then(|s| s.iter().next().copied()) } fn aquire_placed_item(&mut self, item: ItemIndex) -> Result<IVec2, (Option<IVec2>, Message)> { debug!( @@ -193,9 +192,14 @@ impl StepContext<'_> { }) { Err(( Some(*pos), - match self.ent.game.data.tile_name(tile.kind) { - "stove" | "oven" => trm!("s.tutorial.prevent_burning"), - _ => trm!("s.tutorial.take_now"), + if tile + .parts + .iter() + .any(|p| matches!(self.ent.game.data.tile_name(*p), "stove" | "oven")) + { + trm!("s.tutorial.prevent_burning") + } else { + trm!("s.tutorial.take_now") }, )) } else { @@ -288,11 +292,16 @@ impl StepContext<'_> { speed, .. } => { - for (pos, tile) in self.ent.game.tiles.iter().filter(|(_, t)| t.kind == *tile) { - if let Some(item) = &tile.item - && item.kind == *input - { - return Err((Some(*pos), trm!("s.tutorial.hold_interact"))); + if let Some(tiles) = self.ent.game.tile_index.get(tile) { + for pos in tiles { + let Some(tile) = self.ent.game.tiles.get(pos) else { + continue; + }; + if let Some(item) = &tile.item + && item.kind == *input + { + return Err((Some(*pos), trm!("s.tutorial.hold_interact"))); + } } } if let Some(pos) = self.find_tile(*tile) { @@ -312,12 +321,16 @@ impl StepContext<'_> { input, .. } => { - for (_pos, tile) in self.ent.game.tiles.iter().filter(|(_, t)| t.kind == *tile) - { - if let Some(item) = &tile.item - && item.kind == *input - { - return Err((None, trm!("s.tutorial.wait_finish"))); + if let Some(tiles) = self.ent.game.tile_index.get(tile) { + for pos in tiles { + let Some(tile) = self.ent.game.tiles.get(pos) else { + continue; + }; + if let Some(item) = &tile.item + && item.kind == *input + { + return Err((None, trm!("s.tutorial.wait_finish"))); + } } } if let Some(pos) = self.find_tile(*tile) { |