summaryrefslogtreecommitdiff
path: root/server/bot/src/algos/waiter.rs
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2024-08-12 16:09:40 +0200
committermetamuffin <metamuffin@disroot.org>2024-08-12 16:09:40 +0200
commit7aa0f026f6f0f72efc5513688ecec21a1e43ea74 (patch)
tree12a1ed96f74725ba96a7b2514cf556a2b6d05770 /server/bot/src/algos/waiter.rs
parentada25eeb227b201b1519ff46a888476a832256e6 (diff)
downloadhurrycurry-7aa0f026f6f0f72efc5513688ecec21a1e43ea74.tar
hurrycurry-7aa0f026f6f0f72efc5513688ecec21a1e43ea74.tar.bz2
hurrycurry-7aa0f026f6f0f72efc5513688ecec21a1e43ea74.tar.zst
bot: generalize simple and add waiter
Diffstat (limited to 'server/bot/src/algos/waiter.rs')
-rw-r--r--server/bot/src/algos/waiter.rs93
1 files changed, 93 insertions, 0 deletions
diff --git a/server/bot/src/algos/waiter.rs b/server/bot/src/algos/waiter.rs
new file mode 100644
index 00000000..125b5510
--- /dev/null
+++ b/server/bot/src/algos/waiter.rs
@@ -0,0 +1,93 @@
+use super::simple::State;
+use crate::{algos::simple::Context, pathfinding::Path, BotAlgo, BotInput};
+use hurrycurry_client_lib::Game;
+use hurrycurry_protocol::{glam::IVec2, ItemIndex, PlayerID};
+use log::debug;
+
+#[derive(Default)]
+pub struct Waiter {
+ path: Option<(Path, IVec2, f32)>,
+ cooldown: f32,
+}
+
+type LogicRes<Out = ()> = Result<Out, ()>;
+
+impl BotAlgo for Waiter {
+ fn tick(&mut self, me: PlayerID, game: &Game, dt: f32) -> BotInput {
+ let Some(player) = game.players.get(&me) else {
+ return BotInput::default();
+ };
+ let pos = player.movement.position;
+
+ if self.cooldown > 0. {
+ self.cooldown -= dt;
+ return BotInput::default();
+ }
+
+ if let Some((path, target, down)) = &mut self.path {
+ let direction = path.next_direction(pos);
+ let arrived = path.is_done();
+ let target = *target;
+ if arrived {
+ *down -= dt;
+ if *down < 0. {
+ self.path = None;
+ self.cooldown = 0.2;
+ }
+ }
+ return BotInput {
+ direction,
+ boost: false,
+ interact: if arrived { Some(target) } else { None },
+ };
+ }
+ Context {
+ game,
+ own_position: pos.as_ivec2(),
+ me,
+ state: self,
+ recursion_abort: 0,
+ }
+ .update()
+ .ok();
+
+ BotInput::default()
+ }
+}
+
+impl State for Waiter {
+ fn cooldown(&mut self, dur: f32) {
+ self.cooldown += dur
+ }
+ fn queue_segment(&mut self, path: Path, tile: IVec2, duration: f32) {
+ self.path = Some((path, tile, duration));
+ }
+ fn get_empty_tile_priority(&self) -> &'static [&'static str] {
+ &["counter-window", "counter"]
+ }
+}
+
+impl Context<'_, Waiter> {
+ fn aquire_item(&mut self, item: ItemIndex) -> LogicRes {
+ debug!("aquire item {:?}", self.game.data.item_names[item.0]);
+ if self.is_hand_item(item) {
+ return Ok(());
+ }
+ if let Some(pos) = self.find_item_on_map(item) {
+ self.assert_hand_is_clear()?;
+ self.interact_with(pos, 0.)?;
+ return Ok(());
+ }
+ Err(())
+ }
+ fn update(&mut self) -> LogicRes {
+ if let Some(pos) = self.find_occupied_table_or_floor() {
+ self.assert_tile_is_clear(pos)?;
+ }
+ if let Some((item, table)) = self.find_demand() {
+ self.aquire_item(item)?;
+ self.interact_with(table, 0.)?;
+ }
+ Ok(())
+ }
+}