/* 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 . */ use super::EntityT; use crate::{ data::Gamedata, game::{interact_effect, Tile}, }; use anyhow::{anyhow, Result}; use hurrycurry_protocol::{glam::IVec2, ItemIndex, ItemLocation, PacketC}; use std::collections::{HashMap, VecDeque}; #[derive(Debug, Clone)] pub struct Conveyor { pub(super) from: IVec2, pub(super) to: IVec2, pub(super) filter_tile: Option, pub(super) filter_item: Option, pub(super) cooldown: f32, pub(super) max_cooldown: f32, } impl EntityT for Conveyor { fn tick( &mut self, data: &Gamedata, points: &mut i64, packet_out: &mut VecDeque, tiles: &mut HashMap, dt: f32, ) -> Result<()> { let from = tiles .get(&self.from) .ok_or(anyhow!("conveyor from missing"))?; if let Some(from_item) = from.item.as_ref() { let filter = if let Some(t) = &self.filter_tile { let filter_tile = tiles.get(t).ok_or(anyhow!("conveyor filter missing"))?; filter_tile.item.as_ref().map(|e| e.kind) } else if let Some(i) = &self.filter_item { Some(*i) } else { None }; if let Some(filter) = filter { if from_item.kind != filter { return Ok(()); } } self.cooldown += dt; if self.cooldown < self.max_cooldown { return Ok(()); } self.cooldown = 0.; let [from, to] = tiles .get_many_mut([&self.from, &self.to]) .ok_or(anyhow!("conveyor does ends in itself"))?; interact_effect( data, true, &mut to.item, ItemLocation::Tile(self.to), &mut from.item, ItemLocation::Tile(self.from), Some(to.kind), packet_out, points, true, ); } Ok(()) } }