/* 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::{Entity, EntityContext}; use crate::interaction::interact; use anyhow::{bail, Result}; use hurrycurry_protocol::{glam::IVec2, ItemLocation}; #[derive(Debug, Default, Clone)] pub struct ItemPortal { pub(super) from: IVec2, pub(super) to: IVec2, } impl Entity for ItemPortal { fn tick(&mut self, c: EntityContext) -> Result<()> { if self.from == self.to { bail!("item portal ends in itself") } let [Some(from), Some(to)] = c.game.tiles.get_many_mut([&self.from, &self.to]) else { bail!("at least one item portal end not on map"); }; if from.item.is_some() { interact( &c.game.data, true, Some(to.kind), None, &mut to.item, ItemLocation::Tile(self.to), &mut from.item, ItemLocation::Tile(self.from), &mut c.game.score, c.score_changed, true, c.packet_out, ); } Ok(()) } }