diff options
author | metamuffin <metamuffin@disroot.org> | 2025-09-30 01:19:01 +0200 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2025-09-30 01:19:09 +0200 |
commit | 5033c326094edc1ff4234b994e95d987cb937fc4 (patch) | |
tree | 5fa426a77109722df163c15ce8d647170cd8fcea /server/bot/src/algos/simple.rs | |
parent | 727752b87bbe7146adb0f9e9e27d6e64b785ec2f (diff) | |
download | hurrycurry-5033c326094edc1ff4234b994e95d987cb937fc4.tar hurrycurry-5033c326094edc1ff4234b994e95d987cb937fc4.tar.bz2 hurrycurry-5033c326094edc1ff4234b994e95d987cb937fc4.tar.zst |
Implement tile placeable items for server-side (#433)
Diffstat (limited to 'server/bot/src/algos/simple.rs')
-rw-r--r-- | server/bot/src/algos/simple.rs | 41 |
1 files changed, 12 insertions, 29 deletions
diff --git a/server/bot/src/algos/simple.rs b/server/bot/src/algos/simple.rs index f232062a..42cc4223 100644 --- a/server/bot/src/algos/simple.rs +++ b/server/bot/src/algos/simple.rs @@ -118,28 +118,8 @@ impl<S> Context<'_, S> { .map(|p| p.items[0].is_some()) .unwrap_or(false) } - pub fn find_demand(&self) -> Option<(ItemIndex, IVec2)> { - self.game - .players - .iter() - .find_map(|(_, pl)| match &pl.communicate_persist { - Some((Message::Item(item), _)) => { - let pos = pl.movement.position.as_ivec2(); - [IVec2::X, IVec2::Y, -IVec2::X, -IVec2::Y] - .into_iter() - .find(|off| { - self.game - .tiles - .get(&(pos + *off)) - .is_some_and(|t| self.game.data.tile_interact[t.kind.0]) - }) - .map(|off| pos + off) - .map(|pos| (*item, pos)) - } - _ => None, - }) - } - pub fn find_demands_with_table(&self) -> Vec<(ItemIndex, IVec2, f32)> { + /// Returns (requested_item, table_pos, remaining_time) + pub fn find_demands(&self) -> Vec<(ItemIndex, IVec2, f32)> { self.game .players .iter() @@ -149,10 +129,13 @@ impl<S> Context<'_, S> { [IVec2::X, IVec2::Y, -IVec2::X, -IVec2::Y] .into_iter() .find(|off| { - self.game - .tiles - .get(&(pos + *off)) - .is_some_and(|t| self.game.data.tile_interact[t.kind.0]) + self.game.tiles.get(&(pos + *off)).is_some_and(|t| { + self.game + .data + .tile_placeable_items + .get(&t.kind) + .map_or(true, |placable| placable.contains(item)) + }) }) .map(|off| pos + off) .map(|pos| (*item, pos, timeout.remaining)) @@ -202,7 +185,7 @@ impl<S> Context<'_, S> { .tiles .iter() .find(|(_, t)| { - self.game.data.tile_interact[t.kind.0] + !self.game.data.tile_placeable_items.contains_key(&t.kind) && t.item.is_none() && self.game.data.tile_names[t.kind.0] == name }) @@ -228,7 +211,7 @@ impl<S: State> Context<'_, S> { self.game .tiles .iter() - .find(|(_, t)| self.game.data.tile_interact[t.kind.0] && t.item.is_none()) + .find(|(_, t)| !self.game.data.tile_placeable_items.contains_key(&t.kind)) // TODO filter by placable item .map(|(p, _)| *p) } pub fn clear_tile(&mut self, pos: IVec2) -> LogicRes { @@ -378,7 +361,7 @@ impl Context<'_, Simple> { Err(()) } pub fn update(&mut self) -> LogicRes { - if let Some((item, table)) = self.find_demand() { + if let Some((item, table, _)) = self.find_demands().pop() { if self.game.data.item_name(item) == "unknown-order" { self.interact_with(table, 0.)?; } else { |