43 lines
1.2 KiB
Rust
43 lines
1.2 KiB
Rust
|
use crate::{gamelog::GameLog, InBackpack, Name, Position, WantsToPickupItem};
|
||
|
use specs::prelude::*;
|
||
|
|
||
|
pub struct ItemCollectionSystem {}
|
||
|
|
||
|
impl<'a> System<'a> for ItemCollectionSystem {
|
||
|
#[allow(clippy::type_complexity)]
|
||
|
type SystemData = (
|
||
|
ReadExpect<'a, Entity>,
|
||
|
WriteExpect<'a, GameLog>,
|
||
|
WriteStorage<'a, WantsToPickupItem>,
|
||
|
WriteStorage<'a, Position>,
|
||
|
ReadStorage<'a, Name>,
|
||
|
WriteStorage<'a, InBackpack>,
|
||
|
);
|
||
|
|
||
|
fn run(&mut self, data: Self::SystemData) {
|
||
|
let (player_entity, mut gamelog, mut wants_pickup, mut positions, names, mut backpack) =
|
||
|
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");
|
||
|
|
||
|
if pickup.collected_by == *player_entity {
|
||
|
gamelog.entries.push(format!(
|
||
|
"You pick up the {}.",
|
||
|
names.get(pickup.item).unwrap().name
|
||
|
));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
wants_pickup.clear();
|
||
|
}
|
||
|
}
|