use ::bracket_lib::prelude::*; use ::specs::prelude::*; use super::{get_item_display_name, item_result_menu, ItemMenuResult}; use crate::components::{Equipped, InBackpack, Item, Name, ObfuscatedName}; use crate::{MasterDungeonMap, State}; pub fn identify_menu(gs: &mut State, ctx: &mut BTerm) -> (ItemMenuResult, Option) { let mut draw_batch = DrawBatch::new(); let player_entity = gs.ecs.fetch::(); let equipped = gs.ecs.read_storage::(); let backpack = gs.ecs.read_storage::(); let entities = gs.ecs.entities(); let item_components = gs.ecs.read_storage::(); let names = gs.ecs.read_storage::(); let dm = gs.ecs.fetch::(); let obfuscated = gs.ecs.read_storage::(); let mut items: Vec<(Entity, String)> = Vec::new(); (&entities, &item_components) .join() .filter(|(item_entity, _item)| { let mut keep = false; if let Some(bp) = backpack.get(*item_entity) { if bp.owner == *player_entity { if let Some(name) = names.get(*item_entity) { if obfuscated.get(*item_entity).is_some() && !dm.identified_items.contains(&name.name) { keep = true; } } } } // It's equipped, so we know it's cursed if let Some(equip) = equipped.get(*item_entity) { if equip.owner == *player_entity { if let Some(name) = names.get(*item_entity) { if obfuscated.get(*item_entity).is_some() && !dm.identified_items.contains(&name.name) { keep = true; } } } } keep }) .for_each(|item| items.push((item.0, get_item_display_name(&gs.ecs, item.0)))); let result = item_result_menu( &mut draw_batch, "Identify Which Item?", items.len(), &items, ctx.key, ); draw_batch .submit(6000) .expect("Failed to batch render Identify menu"); result }