aboutsummaryrefslogtreecommitdiff
path: root/server/bot/src/algos/customer.rs
diff options
context:
space:
mode:
Diffstat (limited to 'server/bot/src/algos/customer.rs')
-rw-r--r--server/bot/src/algos/customer.rs219
1 files changed, 219 insertions, 0 deletions
diff --git a/server/bot/src/algos/customer.rs b/server/bot/src/algos/customer.rs
new file mode 100644
index 00000000..167fc0d7
--- /dev/null
+++ b/server/bot/src/algos/customer.rs
@@ -0,0 +1,219 @@
+/*
+ Hurry Curry! - a game about cooking
+ Copyright 2024 metamuffin
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Affero General Public License as published by
+ the Free Software Foundation, version 3 of the License only.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see <https://www.gnu.org/licenses/>.
+
+*/
+use crate::{pathfinding::Path, BotAlgo, BotInput};
+use hurrycurry_protocol::{glam::IVec2, DemandIndex};
+
+#[derive(Debug, Clone)]
+pub enum Customer {
+ New,
+ Entering {
+ path: Path,
+ chair: IVec2,
+ },
+ Waiting {
+ demand: DemandIndex,
+ chair: IVec2,
+ timeout: f32,
+ },
+ Eating {
+ demand: DemandIndex,
+ target: IVec2,
+ progress: f32,
+ chair: IVec2,
+ },
+ Exiting {
+ path: Path,
+ },
+}
+
+impl Default for Customer {
+ fn default() -> Self {
+ Customer::New
+ }
+}
+
+impl BotAlgo for Customer {
+ fn tick(
+ &mut self,
+ me: hurrycurry_protocol::PlayerID,
+ game: &hurrycurry_client_lib::Game,
+ dt: f32,
+ ) -> BotInput {
+ let _ = (me, game, dt);
+ BotInput::default()
+ // let Some(playerdata) = game.players.get_mut(&player) else {
+ // return BotInput::default();
+ // };
+ // match state {
+ // let chair = self.select_chair().ok_or(anyhow!("no free chair found"))?;
+ // let from = game.data.customer_spawn.as_ivec2();
+ // let path = find_path(&game.walkable, from, chair)
+ // .ok_or(anyhow!("no path from {from} to {chair}"))?;
+ // info!("{id:?} -> entering");
+
+ // CustomerState::Entering { path, chair } => {
+ // playerdata
+ // .movement
+ // .input(path.next_direction(playerdata.position()), false);
+ // if path.is_done() {
+ // let demand = DemandIndex(random::<u32>() as usize % self.demands.len());
+ // self.cpackets.push_back(PacketS::Communicate {
+ // message: Some(Message::Item(self.demands[demand.0].from)),
+ // persist: true,
+ // player,
+ // });
+ // info!("{player:?} -> waiting");
+ // *state = CustomerState::Waiting {
+ // chair: *chair,
+ // timeout: 90. + random::<f32>() * 60.,
+ // demand,
+ // };
+ // }
+ // }
+ // CustomerState::Waiting {
+ // chair,
+ // demand,
+ // timeout,
+ // } => {
+ // playerdata
+ // .movement
+ // .input((chair.as_vec2() + 0.5) - playerdata.position(), false);
+ // *timeout -= dt;
+ // if *timeout <= 0. {
+ // self.cpackets.push_back(PacketS::Communicate {
+ // message: None,
+ // persist: true,
+ // player,
+ // });
+ // self.cpackets.push_back(PacketS::Communicate {
+ // message: Some(Message::Effect("angry".to_string())),
+ // persist: false,
+ // player,
+ // });
+ // let path = find_path(
+ // &game.walkable,
+ // playerdata.position().as_ivec2(),
+ // game.data.customer_spawn.as_ivec2(),
+ // )
+ // .expect("no path to exit");
+ // *self.chairs.get_mut(chair).unwrap() = true;
+ // game.score.demands_failed += 1;
+ // game.score.points -= 1;
+ // game.score_changed = true;
+ // info!("{player:?} -> exiting");
+ // *state = CustomerState::Exiting { path }
+ // } else {
+ // let demand_data = &self.demands[demand.0];
+ // let demand_pos = [IVec2::NEG_X, IVec2::NEG_Y, IVec2::X, IVec2::Y]
+ // .into_iter()
+ // .find_map(|off| {
+ // let pos = *chair + off;
+ // if game
+ // .tiles
+ // .get(&pos)
+ // .map(|t| {
+ // t.item
+ // .as_ref()
+ // .map(|i| i.kind == demand_data.from)
+ // .unwrap_or_default()
+ // })
+ // .unwrap_or_default()
+ // {
+ // Some(pos)
+ // } else {
+ // None
+ // }
+ // });
+ // if let Some(pos) = demand_pos {
+ // self.cpackets.push_back(PacketS::Communicate {
+ // persist: true,
+ // message: None,
+ // player,
+ // });
+ // self.cpackets.push_back(PacketS::Communicate {
+ // message: Some(Message::Effect("satisfied".to_string())),
+ // persist: false,
+ // player,
+ // });
+ // self.cpackets.push_back(PacketS::Interact {
+ // pos: Some(pos),
+ // player,
+ // });
+ // self.cpackets
+ // .push_back(PacketS::Interact { pos: None, player });
+ // info!("{player:?} -> eating");
+ // *state = CustomerState::Eating {
+ // demand: *demand,
+ // target: pos,
+ // progress: 0.,
+ // chair: *chair,
+ // }
+ // }
+ // }
+ // }
+ // CustomerState::Eating {
+ // demand,
+ // target,
+ // progress,
+ // chair,
+ // } => {
+ // playerdata
+ // .movement
+ // .input((chair.as_vec2() + 0.5) - playerdata.position(), false);
+ // let demand = &self.demands[demand.0];
+ // *progress += dt / demand.duration;
+ // if *progress >= 1. {
+ // self.cpackets.push_back(PacketS::ReplaceHand {
+ // player,
+ // item: demand.to,
+ // });
+ // if demand.to.is_some() {
+ // self.cpackets.push_back(PacketS::Interact {
+ // player,
+ // pos: Some(*target),
+ // });
+ // self.cpackets
+ // .push_back(PacketS::Interact { player, pos: None });
+ // }
+ // let path = find_path(
+ // &game.walkable,
+ // playerdata.position().as_ivec2(),
+ // game.data.customer_spawn.as_ivec2(),
+ // )
+ // .ok_or(anyhow!("no path to exit"))?;
+ // *self.chairs.get_mut(chair).unwrap() = true;
+ // game.score.demands_completed += 1;
+ // game.score.points += demand.points;
+ // game.score_changed = true;
+ // info!("{player:?} -> exiting");
+ // *state = CustomerState::Exiting { path }
+ // }
+ // }
+ // CustomerState::Exiting { path } => {
+ // playerdata
+ // .movement
+ // .input(path.next_direction(playerdata.position()), false);
+ // if path.is_done() {
+ // info!("{player:?} -> leave");
+ // self.cpackets.push_back(PacketS::Leave { player });
+ // customers_to_remove.push(player);
+ // }
+ // }
+ // }
+ }
+}