use ::rltk::{Rltk, VirtualKeyCode}; use ::specs::prelude::*; use super::enums::*; use super::{get_item_color, get_item_display_name}; use crate::components::{InBackpack, Name}; use crate::{colors, State}; pub fn drop_item_menu(gs: &mut State, ctx: &mut Rltk) -> (ItemMenuResult, Option) { let player_entity = gs.ecs.fetch::(); let names = gs.ecs.read_storage::(); let backpack = gs.ecs.read_storage::(); let entities = gs.ecs.entities(); let inventory = (&backpack, &names) .join() .filter(|item| item.0.owner == *player_entity); let count = inventory.count(); let mut y = (25 - (count / 2)) as i32; ctx.draw_box( 15, y - 2, 31, (count + 3) as i32, colors::WHITE, colors::BLACK, ); ctx.print_color(18, y - 2, colors::YELLOW, colors::BLACK, "Drop Which Item?"); ctx.print_color( 18, y + count as i32 + 1, colors::YELLOW, colors::BLACK, "ESCAPE to cancel", ); let mut equippable: Vec = Vec::new(); let mut j = 0; #[allow(clippy::explicit_counter_loop)] for (entity, _pack) in (&entities, &backpack) .join() .filter(|item| item.1.owner == *player_entity) { ctx.set(17, y, colors::WHITE, colors::BLACK, rltk::to_cp437('(')); ctx.set( 18, y, colors::YELLOW, colors::BLACK, 97 + j as rltk::FontCharType, ); ctx.set(19, y, colors::WHITE, colors::BLACK, rltk::to_cp437(')')); ctx.print_color( 21, y, get_item_color(&gs.ecs, entity), colors::BLACK, &get_item_display_name(&gs.ecs, entity), ); equippable.push(entity); y += 1; j += 1; } match ctx.key { None => (ItemMenuResult::NoResponse, None), Some(key) => match key { VirtualKeyCode::Escape => (ItemMenuResult::Cancel, None), _ => { let selection = rltk::letter_to_option(key); if selection > -1 && selection < count as i32 { return ( ItemMenuResult::Selected, Some(equippable[selection as usize]), ); } (ItemMenuResult::NoResponse, None) } }, } }