diff options
Diffstat (limited to 'server/bot/src/algos/waiter.rs')
-rw-r--r-- | server/bot/src/algos/waiter.rs | 93 |
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(()) + } +} |