65 lines
1.9 KiB
Rust
65 lines
1.9 KiB
Rust
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();
|
|
}
|
|
}
|