57 lines
1.9 KiB
Rust
57 lines
1.9 KiB
Rust
use crate::{ Beatitude, IdentifiedBeatitude, IdentifiedItem, Item, MasterDungeonMap, Name, ObfuscatedName, Player };
|
|
use specs::prelude::*;
|
|
use crate::data::events::*;
|
|
use crate::gamelog;
|
|
|
|
pub struct ItemIdentificationSystem {}
|
|
|
|
impl<'a> System<'a> for ItemIdentificationSystem {
|
|
#[allow(clippy::type_complexity)]
|
|
type SystemData = (
|
|
ReadStorage<'a, Player>,
|
|
WriteStorage<'a, IdentifiedItem>,
|
|
WriteStorage<'a, Beatitude>,
|
|
WriteStorage<'a, IdentifiedBeatitude>,
|
|
WriteExpect<'a, MasterDungeonMap>,
|
|
ReadStorage<'a, Item>,
|
|
ReadStorage<'a, Name>,
|
|
WriteStorage<'a, ObfuscatedName>,
|
|
Entities<'a>,
|
|
);
|
|
|
|
fn run(&mut self, data: Self::SystemData) {
|
|
let (
|
|
player,
|
|
mut identified,
|
|
mut beatitudes,
|
|
mut identified_beatitudes,
|
|
mut dm,
|
|
items,
|
|
names,
|
|
mut obfuscated_names,
|
|
entities,
|
|
) = data;
|
|
for (_p, id) in (&player, &identified).join() {
|
|
let tag = crate::raws::get_id_from_name(id.name.clone());
|
|
if !dm.identified_items.contains(&id.name) && crate::raws::is_tag_magic(&tag) {
|
|
if gamelog::get_event_count(EVENT::COUNT_TURN) != 1 {
|
|
gamelog::record_event(EVENT::IDENTIFIED(id.name.clone()));
|
|
}
|
|
dm.identified_items.insert(id.name.clone());
|
|
for (entity, _item, name) in (&entities, &items, &names).join() {
|
|
if name.name == id.name {
|
|
obfuscated_names.remove(entity);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
for (e, _id) in (&entities, &identified_beatitudes).join() {
|
|
if let Some(beatitude) = beatitudes.get_mut(e) {
|
|
beatitude.known = true;
|
|
}
|
|
}
|
|
// Clean up
|
|
identified.clear();
|
|
identified_beatitudes.clear();
|
|
}
|
|
}
|