/* Hurry Curry! - a game about cooking Copyright (C) 2025 Hurry Curry! Contributors 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 . */ use super::simple::State; use crate::{BotAlgo, PacketSink, algos::simple::Context, step::StepState}; use hurrycurry_game_core::Game; use hurrycurry_protocol::{ItemIndex, PlayerID}; use log::debug; pub struct Waiter { step: StepState, me: PlayerID, } type LogicRes = Result; impl Waiter { pub fn new(me: PlayerID) -> Self { Self { step: StepState::new_idle(me), me, } } } impl BotAlgo for Waiter { fn tick(&mut self, mut out: PacketSink, game: &Game, dt: f32) { if self.step.is_busy() { return self.step.tick(&mut out, game, dt); } Context { game, me: self.me, state: self, recursion_abort: 0, } .update() .ok(); } } impl State for Waiter { fn queue_step(&mut self, step: StepState) { self.step = step; } 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(true); } if let Some(pos) = self.find_item_on_map(item) { self.assert_hand_is_clear()?; self.interact_with(pos, 0.)?; return Ok(true); } Ok(false) } fn update(&mut self) -> LogicRes { if let Some(pos) = self.find_occupied_table_or_floor() { self.assert_tile_is_clear(pos)?; } 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" { self.interact_with(table, 0.)?; } if self.aquire_item(item)? { self.interact_with(table, 0.)?; } } self.assert_hand_is_clear()?; Ok(()) } }