/* 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}; pub struct DishWasher { me: PlayerID, step: StepState, dirty_plate: Option, } type LogicRes = Result; impl DishWasher { pub fn new(me: PlayerID) -> Self { Self { me, step: StepState::new_idle(me), dirty_plate: None, } } } impl BotAlgo for DishWasher { fn tick(&mut self, mut out: PacketSink, game: &Game, dt: f32) { if self.dirty_plate.is_none() { self.dirty_plate = game.data.get_item_by_name("dirty-plate"); if self.dirty_plate.is_none() { return; } } 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 DishWasher { fn queue_step(&mut self, step: StepState) { self.step = step; } fn get_empty_tile_priority(&self) -> &'static [&'static str] { &["counter-window", "counter"] } } impl Context<'_, DishWasher> { fn update(&mut self) -> LogicRes { if let Some(sink) = self.find_empty_interactable_tile_by_name("sink") { if self.is_hand_item(self.state.dirty_plate.unwrap()) { // TODO clear sink first but dont "steal" items from others working there self.interact_with(sink, 2.0)?; } else { self.assert_hand_is_clear()?; } if let Some(pos) = self.find_item_on_map(self.state.dirty_plate.unwrap()) { self.assert_tile_is_clear(pos)?; } } else { self.assert_hand_is_clear()?; } Ok(()) } }