Horrendous hash key gets worse -- REFACTOR THIS LATER

This commit is contained in:
Llywelwyn 2023-08-13 18:43:04 +01:00
parent a5b8a7306b
commit 7795044d36
4 changed files with 56 additions and 18 deletions

View file

@ -208,6 +208,20 @@ pub struct Item {
pub value: f32, // base pub value: f32, // base
} }
#[derive(Debug, Serialize, Deserialize, Clone, Eq, PartialEq, Hash)]
pub enum MagicItemClass {
Common,
Uncommon,
Rare,
VeryRare,
Legendary,
}
#[derive(Component, Debug, Serialize, Deserialize, Clone)]
pub struct MagicItem {
pub class: MagicItemClass,
}
#[derive(Component, Debug, Serialize, Deserialize, Clone)] #[derive(Component, Debug, Serialize, Deserialize, Clone)]
pub struct EquipmentChanged {} pub struct EquipmentChanged {}

View file

@ -144,17 +144,23 @@ pub fn draw_ui(ecs: &World, ctx: &mut Rltk) {
} }
// Draw equipment // Draw equipment
let names = ecs.read_storage::<Name>(); let names = ecs.read_storage::<Name>();
let mut equipment: Vec<String> = Vec::new(); let renderables = ecs.read_storage::<Renderable>();
for (_equipped, name) in (&equipped, &names).join().filter(|item| item.0.owner == *player_entity) { let mut equipment: Vec<(String, RGB)> = Vec::new();
equipment.push(format!("{} (worn)", &name.name)); for (_equipped, name, renderable) in
(&equipped, &names, &renderables).join().filter(|item| item.0.owner == *player_entity)
{
equipment.push((name.name.to_string(), renderable.fg));
} }
let mut y = 1; let mut y = 1;
if !equipment.is_empty() { if !equipment.is_empty() {
ctx.print_color(72, y, RGB::named(rltk::BLACK), RGB::named(rltk::WHITE), "Equipment"); ctx.print_color(72, y, RGB::named(rltk::BLACK), RGB::named(rltk::WHITE), "Equipment");
let mut j = 0;
for item in equipment { for item in equipment {
y += 1; y += 1;
ctx.print_color(72, y, RGB::named(rltk::YELLOW), RGB::named(rltk::BLACK), "-"); ctx.set(72, y, RGB::named(rltk::YELLOW), RGB::named(rltk::BLACK), 97 + j as rltk::FontCharType);
ctx.print_color(74, y, RGB::named(rltk::WHITE), RGB::named(rltk::BLACK), item); j += 1;
ctx.print_color(74, y, item.1, RGB::named(rltk::BLACK), &item.0);
ctx.print_color(74 + &item.0.len() + 1, y, RGB::named(rltk::WHITE), RGB::named(rltk::BLACK), "(worn)");
} }
y += 2; y += 2;
} }
@ -280,11 +286,17 @@ pub enum ItemMenuResult {
Selected, Selected,
} }
pub fn print_options(inventory: BTreeMap<(String, String), i32>, mut x: i32, mut y: i32, ctx: &mut Rltk) -> (i32, i32) { pub fn print_options(
inventory: BTreeMap<(String, String, (u8, u8, u8)), i32>,
mut x: i32,
mut y: i32,
ctx: &mut Rltk,
) -> (i32, i32) {
let mut j = 0; let mut j = 0;
let initial_x: i32 = x; let initial_x: i32 = x;
let mut width: i32 = -1; let mut width: i32 = -1;
for (name, item_count) in &inventory { for (name, item_count) in &inventory {
let fg = RGB::from_u8(name.2 .0, name.2 .1, name.2 .2);
x = initial_x; x = initial_x;
// Print the character required to access this item. i.e. (a) // Print the character required to access this item. i.e. (a)
if j < 26 { if j < 26 {
@ -299,25 +311,25 @@ pub fn print_options(inventory: BTreeMap<(String, String), i32>, mut x: i32, mut
if item_count > &1 { if item_count > &1 {
// If more than one, print the number and pluralise // If more than one, print the number and pluralise
// i.e. (a) 3 daggers // i.e. (a) 3 daggers
ctx.print(x, y, item_count); ctx.print_color(x, y, fg, RGB::named(rltk::BLACK), item_count);
x += 2; x += 2;
ctx.print(x, y, name.1.to_string()); ctx.print_color(x, y, fg, RGB::named(rltk::BLACK), name.1.to_string());
} else { } else {
if name.0.ends_with("s") { if name.0.ends_with("s") {
ctx.print(x, y, "some"); ctx.print_color(x, y, fg, RGB::named(rltk::BLACK), "some");
x += 5; x += 5;
} else if ['a', 'e', 'i', 'o', 'u'].iter().any(|&v| name.0.starts_with(v)) { } else if ['a', 'e', 'i', 'o', 'u'].iter().any(|&v| name.0.starts_with(v)) {
// If one and starts with a vowel, print 'an' // If one and starts with a vowel, print 'an'
// i.e. (a) an apple // i.e. (a) an apple
ctx.print(x, y, "an"); ctx.print_color(x, y, fg, RGB::named(rltk::BLACK), "an");
x += 3; x += 3;
} else { } else {
// If one and not a vowel, print 'a' // If one and not a vowel, print 'a'
// i.e. (a) a dagger // i.e. (a) a dagger
ctx.print(x, y, "a"); ctx.print_color(x, y, fg, RGB::named(rltk::BLACK), "a");
x += 2; x += 2;
} }
ctx.print(x, y, name.0.to_string()); ctx.print_color(x, y, fg, RGB::named(rltk::BLACK), name.0.to_string());
} }
let this_width = x - initial_x + name.0.len() as i32; let this_width = x - initial_x + name.0.len() as i32;
width = if width > this_width { width } else { this_width }; width = if width > this_width { width } else { this_width };
@ -329,7 +341,7 @@ pub fn print_options(inventory: BTreeMap<(String, String), i32>, mut x: i32, mut
return (y, width); return (y, width);
} }
pub fn get_max_inventory_width(inventory: &BTreeMap<(String, String), i32>) -> i32 { pub fn get_max_inventory_width(inventory: &BTreeMap<(String, String, (u8, u8, u8)), i32>) -> i32 {
let mut width: i32 = 0; let mut width: i32 = 0;
for (name, count) in inventory { for (name, count) in inventory {
let mut this_width = name.0.len() as i32; let mut this_width = name.0.len() as i32;
@ -395,17 +407,24 @@ pub fn show_help(ctx: &mut Rltk) -> YesNoResult {
} }
} }
pub fn get_player_inventory(ecs: &World) -> (BTreeMap<(String, String), i32>, BTreeMap<String, Entity>) { pub fn get_player_inventory(ecs: &World) -> (BTreeMap<(String, String, (u8, u8, u8)), i32>, BTreeMap<String, Entity>) {
let player_entity = ecs.fetch::<Entity>(); let player_entity = ecs.fetch::<Entity>();
let names = ecs.read_storage::<Name>(); let names = ecs.read_storage::<Name>();
let backpack = ecs.read_storage::<InBackpack>(); let backpack = ecs.read_storage::<InBackpack>();
let entities = ecs.entities(); let entities = ecs.entities();
let renderables = ecs.read_storage::<Renderable>();
let mut inventory_ids: BTreeMap<String, Entity> = BTreeMap::new(); let mut inventory_ids: BTreeMap<String, Entity> = BTreeMap::new();
let mut player_inventory: BTreeMap<(String, String), i32> = BTreeMap::new(); let mut player_inventory: BTreeMap<(String, String, (u8, u8, u8)), i32> = BTreeMap::new();
for (entity, _pack, name) in (&entities, &backpack, &names).join().filter(|item| item.1.owner == *player_entity) { for (entity, _pack, name) in (&entities, &backpack, &names).join().filter(|item| item.1.owner == *player_entity) {
// RGB can't be used as a key. This is converting the RGB (tuple of f32) into a tuple of u8s.
let (r, g, b): (u8, u8, u8) = if let Some(renderable) = renderables.get(entity) {
((renderable.fg.r * 255.0) as u8, (renderable.fg.g * 255.0) as u8, (renderable.fg.b * 255.0) as u8)
} else {
(255, 255, 255)
};
player_inventory player_inventory
.entry((name.name.to_string(), name.plural.to_string())) .entry((name.name.to_string(), name.plural.to_string(), (r, g, b)))
.and_modify(|count| *count += 1) .and_modify(|count| *count += 1)
.or_insert(1); .or_insert(1);
inventory_ids.entry(name.name.to_string()).or_insert(entity); inventory_ids.entry(name.name.to_string()).or_insert(entity);
@ -518,9 +537,11 @@ pub fn remove_item_menu(gs: &mut State, ctx: &mut Rltk) -> (ItemMenuResult, Opti
y += 1; y += 1;
let mut j = 0; let mut j = 0;
for (_, name) in &equippable { let renderables = gs.ecs.read_storage::<Renderable>();
for (e, name) in &equippable {
let fg = if let Some(renderable) = renderables.get(*e) { renderable.fg } else { RGB::named(rltk::WHITE) };
ctx.set(x + 1, y, RGB::named(rltk::YELLOW), RGB::named(rltk::BLACK), 97 + j as rltk::FontCharType); ctx.set(x + 1, y, RGB::named(rltk::YELLOW), RGB::named(rltk::BLACK), 97 + j as rltk::FontCharType);
ctx.print(x + 3, y, name); ctx.print_color(x + 3, y, fg, RGB::named(rltk::BLACK), name);
y += 1; y += 1;
j += 1; j += 1;
} }

View file

@ -536,6 +536,7 @@ fn main() -> rltk::BError {
gs.ecs.register::<WantsToMelee>(); gs.ecs.register::<WantsToMelee>();
gs.ecs.register::<SufferDamage>(); gs.ecs.register::<SufferDamage>();
gs.ecs.register::<Item>(); gs.ecs.register::<Item>();
gs.ecs.register::<MagicItem>();
gs.ecs.register::<GrantsXP>(); gs.ecs.register::<GrantsXP>();
gs.ecs.register::<LootTable>(); gs.ecs.register::<LootTable>();
gs.ecs.register::<Energy>(); gs.ecs.register::<Energy>();

View file

@ -77,6 +77,7 @@ pub fn save_game(ecs: &mut World) {
InflictsDamage, InflictsDamage,
Item, Item,
LootTable, LootTable,
MagicItem,
MagicMapper, MagicMapper,
MeleeWeapon, MeleeWeapon,
Mind, Mind,
@ -189,6 +190,7 @@ pub fn load_game(ecs: &mut World) {
InflictsDamage, InflictsDamage,
Item, Item,
LootTable, LootTable,
MagicItem,
MagicMapper, MagicMapper,
MeleeWeapon, MeleeWeapon,
Mind, Mind,