aboutsummaryrefslogtreecommitdiff
path: root/server/bot/src/algos/simple.rs
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2025-09-30 01:19:01 +0200
committermetamuffin <metamuffin@disroot.org>2025-09-30 01:19:09 +0200
commit5033c326094edc1ff4234b994e95d987cb937fc4 (patch)
tree5fa426a77109722df163c15ce8d647170cd8fcea /server/bot/src/algos/simple.rs
parent727752b87bbe7146adb0f9e9e27d6e64b785ec2f (diff)
downloadhurrycurry-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.rs41
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 {