use crate::position::Position; use crate::player::Player; pub trait Artifact { //! An artifact that can be collected by the player /// get the position of the artifact in the level fn get_immutable_position(&self) -> &Position; /// call to apply the effects of the artifact to the player fn collect(&mut self, player: &mut Player); } pub struct Chest { /// a chest that contains some gold position: Position, gold: usize, } impl Chest { pub fn new(position: Position) -> Self { Self { position, gold: 10, } } } impl Artifact for Chest { fn get_immutable_position(&self) -> &Position { &self.position } fn collect(&mut self, player: &mut Player) { player.retrieve_gold(self.gold); self.gold = 0; } } pub struct Potion { /// a potion that restores some health position: Position, health: usize, } impl Potion { pub fn new(position: Position) -> Self { Self { position, health: 5, } } } impl Artifact for Potion { fn get_immutable_position(&self) -> &Position { &self.position } fn collect(&mut self, player: &mut Player) { player.change_life(self.health.try_into().unwrap()); self.health = 0; } }