From b6d7ab1f3ffd2f2d44fab16d16657a1136c766ff Mon Sep 17 00:00:00 2001 From: zr3 Date: Tue, 6 Feb 2024 23:29:51 -0800 Subject: [PATCH] feat: ui improvements, added inventory and equipment displays --- README.md | 2 +- delightful-thyme/index.html | 2 +- wild-thyme/src/game_loop.rs | 11 +++- wild-thyme/src/gui.rs | 98 +++++++++++++++++++++++++----- wild-thyme/src/inventory_system.rs | 4 +- wild-thyme/src/main.rs | 7 --- wild-thyme/src/map_builders/mod.rs | 2 +- wild-thyme/src/player.rs | 2 +- 8 files changed, 98 insertions(+), 30 deletions(-) diff --git a/README.md b/README.md index 3b06b98..88d39e8 100644 --- a/README.md +++ b/README.md @@ -58,7 +58,7 @@ at each level, the game uses an LLM to summarize what happened, and also to come ✔️ m6: cicd, auth, backend - m7: cleanup, bug fixes and feedback +✔️ m7: cleanup, bug fixes and feedback m8: final polish diff --git a/delightful-thyme/index.html b/delightful-thyme/index.html index 66dd89b..ebcb100 100644 --- a/delightful-thyme/index.html +++ b/delightful-thyme/index.html @@ -46,7 +46,7 @@

[SPACE] : pick up, portal, interact on item you stand on

[I] : inventory

[D] : drop item on ground

-

[R] : remove (unwear/unwield) an item

+

[E] : remove (unwear/unwield) equipment

[ENTER] : see what is on the screen (scan all)

[MOUSE HOVER] : see what is on the screen (under mouse)

diff --git a/wild-thyme/src/game_loop.rs b/wild-thyme/src/game_loop.rs index b47b793..751f181 100644 --- a/wild-thyme/src/game_loop.rs +++ b/wild-thyme/src/game_loop.rs @@ -1,6 +1,6 @@ use crate::{ components::{ - HighlightObject, Ranged, TeleportsPlayer, WantsToDropItem, WantsToRemoveItem, + HighlightObject, Ranged, TeleportsPlayer, Viewshed, WantsToDropItem, WantsToRemoveItem, WantsToUseItem, }, discovery_system, @@ -24,6 +24,15 @@ impl State { match current_runstate { // core game loop RunState::CoreLevelStart => { + { + let player_entity = self.ecs.fetch::(); + let mut viewshed_components = self.ecs.write_storage::(); + let vs = viewshed_components.get_mut(*player_entity); + if let Some(vs) = vs { + // start in the dark on all levels except druid levels + vs.dirty = self.ecs.fetch::().level % 5 == 0; + } + } self.run_systems(); return RunState::CorePreRound; } diff --git a/wild-thyme/src/gui.rs b/wild-thyme/src/gui.rs index d3294e6..1e9d850 100644 --- a/wild-thyme/src/gui.rs +++ b/wild-thyme/src/gui.rs @@ -5,7 +5,7 @@ use specs::prelude::*; use crate::{ components::{ Backpack, CombatStats, Equipped, Hidden, HighlightObject, HungerClock, HungerState, - InBackpack, Viewshed, + InBackpack, Renderable, Viewshed, }, gamelog::LogEntry, get_visible_tooltips, @@ -33,13 +33,77 @@ pub fn draw_ui(ecs: &World, ctx: &mut Rltk) { 43, 79, 6, - RGB::from_hex("#c9c9c9").expect("hardcoded"), + RGB::named(rltk::BURLYWOOD), + RGB::named(rltk::BLACK), + ); + // inventory side box + ctx.draw_box( + 76, + 0, + 2, + 11, + RGB::named(rltk::BURLYWOOD), RGB::named(rltk::BLACK), ); + ctx.print_color( + 77, + 0, + RGB::named(rltk::BURLYWOOD), + RGB::named(rltk::BLACK), + "I", + ); + let player_entity = ecs.fetch::(); + let backpack_items = ecs.read_storage::(); + let renderables = ecs.read_storage::(); + let inventory = (&backpack_items, &renderables) + .join() + .filter(|item| item.0.owner == *player_entity); + let mut item_index = 0; + for (_inpack, renderable) in inventory { + ctx.set( + 77, + 1 + item_index, + renderable.fg, + renderable.bg, + renderable.glyph, + ); + item_index += 1; + } + // equipment side box + ctx.draw_box( + 76, + 13, + 2, + 3, + RGB::named(rltk::BURLYWOOD), + RGB::named(rltk::BLACK), + ); + ctx.print_color( + 77, + 13, + RGB::named(rltk::BURLYWOOD), + RGB::named(rltk::BLACK), + "E", + ); + let equipped_items = ecs.read_storage::(); + let currently_equipped = (&equipped_items, &renderables) + .join() + .filter(|item| item.0.owner == *player_entity); + item_index = 0; + for (_equipped, renderable) in currently_equipped { + ctx.set( + 77, + 14 + item_index, + renderable.fg, + renderable.bg, + renderable.glyph, + ); + item_index += 1; + } // depth level let map = ecs.fetch::(); - let depth = format!("depth: {}", map.depth); + let depth = format!("trail: {}", map.depth); ctx.print_color( 2, 43, @@ -127,8 +191,8 @@ pub fn draw_ui(ecs: &World, ctx: &mut Rltk) { false => RGB::from_hex("#606060").expect("hardcoded"), }, LogEntry::Alert { .. } => match s.read { - true => RGB::from_hex("#803030").expect("hardcoded"), - false => RGB::from_hex("#d07060").expect("hardcoded"), + true => RGB::from_hex("#653030").expect("hardcoded"), + false => RGB::from_hex("#a04040").expect("hardcoded"), }, }; ctx.print_color(2, y, color, RGB::named(rltk::BLACK), line); @@ -286,6 +350,7 @@ pub fn show_inventory(gs: &mut State, ctx: &mut Rltk) -> (ItemMenuResult, Option let backpack_items = gs.ecs.read_storage::(); let backpacks = gs.ecs.read_storage::(); let entities = gs.ecs.entities(); + let renderables = gs.ecs.read_storage::(); let inventory = (&backpack_items, &names) .join() @@ -301,7 +366,7 @@ pub fn show_inventory(gs: &mut State, ctx: &mut Rltk) -> (ItemMenuResult, Option y - 2, 31, (count + 3) as i32, - RGB::named(rltk::WHITE), + RGB::named(rltk::BURLYWOOD), RGB::named(rltk::BLACK), ); let padding; @@ -340,7 +405,7 @@ pub fn show_inventory(gs: &mut State, ctx: &mut Rltk) -> (ItemMenuResult, Option let mut equippable: Vec = Vec::new(); let mut j = 0; - for (entity, _pack, name) in (&entities, &backpack_items, &names) + for (entity, _pack, name, renderable) in (&entities, &backpack_items, &names, &renderables) .join() .filter(|item| item.1.owner == *player_entity) { @@ -365,8 +430,15 @@ pub fn show_inventory(gs: &mut State, ctx: &mut Rltk) -> (ItemMenuResult, Option RGB::named(rltk::BLACK), rltk::to_cp437(')'), ); + ctx.set(21, y, renderable.fg, renderable.bg, renderable.glyph); - ctx.print(21, y, &name.name.to_string()); + ctx.print_color( + 23, + y, + RGB::from_hex("#a0a0a0").expect("hardcoded"), + RGB::named(rltk::BLACK), + &name.name.to_string(), + ); equippable.push(entity); y += 1; j += 1; @@ -407,7 +479,7 @@ pub fn show_drop_item(gs: &mut State, ctx: &mut Rltk) -> (ItemMenuResult, Option y - 2, 31, (count + 3) as i32, - RGB::named(rltk::WHITE), + RGB::named(rltk::BURLYWOOD), RGB::named(rltk::BLACK), ); ctx.print_color( @@ -494,7 +566,7 @@ pub fn show_remove_item(gs: &mut State, ctx: &mut Rltk) -> (ItemMenuResult, Opti y - 2, 31, (count + 3) as i32, - RGB::named(rltk::WHITE), + RGB::named(rltk::BURLYWOOD), RGB::named(rltk::BLACK), ); ctx.print_color( @@ -643,12 +715,6 @@ pub fn game_over(ctx: &mut Rltk, stats: &OverallStats) -> GameOverResult { "OH NO YOU DIED!!", ); - ctx.print_color_centered( - 15, - RGB::named(rltk::WHITE), - RGB::named(rltk::BLACK), - format!("YOU: {}", stats.name), - ); print_stat(ctx, 16, "deepest level", stats.deepest_level); print_stat(ctx, 17, "most items held", stats.most_items_held); print_stat(ctx, 18, "GOOD THYME eaten", stats.thyme_eaten); diff --git a/wild-thyme/src/inventory_system.rs b/wild-thyme/src/inventory_system.rs index eb842d5..47a69d3 100644 --- a/wild-thyme/src/inventory_system.rs +++ b/wild-thyme/src/inventory_system.rs @@ -430,7 +430,7 @@ impl<'a> System<'a> for UseItemSystem { let item_maps = magic_mapper.get(used_item.item); if let Some(_item_maps) = item_maps { gamelog.log(LogEntry::Alert { - alert: format!("YOU can now SEE this level!"), + alert: format!("YOU can now SEE the trail!"), }); item_was_used = true; *runstate = RunState::ActionMagicMapReveal { @@ -598,7 +598,7 @@ impl<'a> System<'a> for ItemRemoveSystem { .expect("should be able to add unequipped item to backpack"); } if entity == *player_entity { - if backpack_too_full { + if !backpack_too_full { gamelog.log(LogEntry::Action { subject: format!("YOU"), object: format!("{}", name.name), diff --git a/wild-thyme/src/main.rs b/wild-thyme/src/main.rs index 57d49e7..6f42944 100644 --- a/wild-thyme/src/main.rs +++ b/wild-thyme/src/main.rs @@ -340,13 +340,6 @@ impl State { player_pos_comp.x = player_pos.x; player_pos_comp.y = player_pos.y; } - - // Mark the player's visibility as dirty - let mut viewshed_components = self.ecs.write_storage::(); - let vs = viewshed_components.get_mut(*player_entity); - if let Some(vs) = vs { - vs.dirty = true; - } } } diff --git a/wild-thyme/src/map_builders/mod.rs b/wild-thyme/src/map_builders/mod.rs index a2b9af6..ed749cf 100644 --- a/wild-thyme/src/map_builders/mod.rs +++ b/wild-thyme/src/map_builders/mod.rs @@ -26,7 +26,7 @@ pub fn make_builder(new_depth: i32) -> Box { Box::new(TownLevelBuilder::new()) } else if new_depth % 3 == 0 { Box::new(NestLevelBuilder::new(new_depth)) - } else if new_depth % 10 == 0 { + } else if new_depth % 5 == 0 { Box::new(WizardLevelBuilder::new(new_depth)) } else if new_depth == 13 { Box::new(SimpleMapBuilder::new(new_depth)) diff --git a/wild-thyme/src/player.rs b/wild-thyme/src/player.rs index 8f8fb42..61f30a7 100644 --- a/wild-thyme/src/player.rs +++ b/wild-thyme/src/player.rs @@ -119,7 +119,7 @@ pub fn player_input(gs: &mut State, ctx: &mut Rltk) -> RunState { VirtualKeyCode::I => return RunState::MenuInventory, VirtualKeyCode::D => return RunState::MenuDropItem, - VirtualKeyCode::R => return RunState::MenuRemoveItem, + VirtualKeyCode::E => return RunState::MenuRemoveItem, VirtualKeyCode::Return => { return RunState::ActionShowObjects {