use ::specs::prelude::*; use super::obfuscate_name; use crate::components::{ EquipmentChanged, InBackpack, MagicItem, Name, ObfuscatedName, Position, WantsToPickupItem, }; use crate::{colors, gamelog, MasterDungeonMap}; pub struct ItemCollectionSystem {} impl<'a> System<'a> for ItemCollectionSystem { #[allow(clippy::type_complexity)] type SystemData = ( ReadExpect<'a, Entity>, WriteStorage<'a, WantsToPickupItem>, WriteStorage<'a, Position>, ReadStorage<'a, Name>, WriteStorage<'a, InBackpack>, WriteStorage<'a, EquipmentChanged>, ReadStorage<'a, MagicItem>, ReadStorage<'a, ObfuscatedName>, ReadExpect<'a, MasterDungeonMap>, ); fn run(&mut self, data: Self::SystemData) { let ( player_entity, mut wants_pickup, mut positions, names, mut backpack, mut dirty, magic_items, obfuscated_names, dm, ) = data; for pickup in wants_pickup.join() { positions.remove(pickup.item); backpack .insert( pickup.item, InBackpack { owner: pickup.collected_by, }, ) .expect("Failed to add item to backpack"); dirty .insert(pickup.collected_by, EquipmentChanged {}) .expect("Unable to insert equipment change"); if pickup.collected_by == *player_entity { gamelog::line("You pick up the") .append_color( colors::CYAN, obfuscate_name(pickup.item, &names, &magic_items, &obfuscated_names, &dm), ) .log(); } } wants_pickup.clear(); } }