diff options
Diffstat (limited to 'server/bot/src/algos')
-rw-r--r-- | server/bot/src/algos/customer.rs | 16 | ||||
-rw-r--r-- | server/bot/src/algos/simple.rs | 41 | ||||
-rw-r--r-- | server/bot/src/algos/waiter.rs | 2 |
3 files changed, 22 insertions, 37 deletions
diff --git a/server/bot/src/algos/customer.rs b/server/bot/src/algos/customer.rs index 043e5358..cb5c5b59 100644 --- a/server/bot/src/algos/customer.rs +++ b/server/bot/src/algos/customer.rs @@ -134,15 +134,17 @@ impl CustomerState { let check = *ticks % 10 == 0; if path.is_done() { let demand = DemandIndex(random::<u32>() as usize % game.data.demands.len()); + let requested_item = game.data.demands[demand.0].input; info!("{me:?} -> waiting"); let timeout = 90. + random::<f32>() * 60.; let mut facing = Vec2::ZERO; for off in [IVec2::NEG_X, IVec2::NEG_Y, IVec2::X, IVec2::Y] { - if game - .tiles - .get(&(off + *chair)) - .is_some_and(|t| game.data.is_tile_interactable(t.kind)) - { + if game.tiles.get(&(off + *chair)).is_some_and(|t| { + game.data + .tile_placeable_items + .get(&t.kind) + .map_or(true, |p| p.contains(&requested_item)) + }) { facing = off.as_vec2(); } } @@ -158,9 +160,9 @@ impl CustomerState { let message_item = if config.unknown_order { game.data .get_item_by_name("unknown-order") - .unwrap_or(game.data.demands[demand.0].input) + .unwrap_or(requested_item) } else { - game.data.demands[demand.0].input + requested_item }; BotInput { extra: vec![PacketS::Communicate { 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 { diff --git a/server/bot/src/algos/waiter.rs b/server/bot/src/algos/waiter.rs index ab0402e6..bde87f94 100644 --- a/server/bot/src/algos/waiter.rs +++ b/server/bot/src/algos/waiter.rs @@ -102,7 +102,7 @@ impl Context<'_, Waiter> { if let Some(pos) = self.find_occupied_table_or_floor() { self.assert_tile_is_clear(pos)?; } - let mut dems = self.find_demands_with_table(); + let mut dems = self.find_demands(); dems.sort_by_key(|(_, _, x)| (*x * 1000.) as i32); for (item, table, _) in dems { if self.game.data.item_name(item) == "unknown-order" { |