aboutsummaryrefslogtreecommitdiff
path: root/server/bot/src
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
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')
-rw-r--r--server/bot/src/algos/customer.rs16
-rw-r--r--server/bot/src/algos/simple.rs41
-rw-r--r--server/bot/src/algos/waiter.rs2
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" {