diff --git a/gui/combat_ui.cpp b/gui/combat_ui.cpp index 9675aa5..c5e5a16 100644 --- a/gui/combat_ui.cpp +++ b/gui/combat_ui.cpp @@ -68,10 +68,10 @@ namespace gui { auto& inventory = $level.world->get($level.player); if(inventory.has("pocket_l")) { - auto healing_item = inventory.get("pocket_l"); $gui.set(healing_button, {"healing_potion_small"}); - $gui.set(healing_button, - guecs::make_action($level, Events::GUI::USE_ITEM, {healing_item})); + $gui.set(healing_button, {[&](auto gui_id, auto) { + use_item(gui_id, "pocket_l"); + }}); } else { $gui.remove(healing_button); $gui.remove(healing_button); @@ -85,6 +85,15 @@ namespace gui { $gui.init(); } + void CombatUI::use_item(guecs::Entity gui_id, const string& slot) { + auto& inventory = $level.world->get($level.player); + dbc::check(inventory.has(slot), fmt::format( + "attempted to use an item but {} isn't in your inventory", slot)); + + auto healing_item = inventory.get(slot); + $level.world->send(Events::GUI::USE_ITEM, gui_id, {healing_item}); + } + void CombatUI::render(sf::RenderWindow& window) { $gui.render(window); } diff --git a/gui/combat_ui.hpp b/gui/combat_ui.hpp index e8f4a3d..1d01022 100644 --- a/gui/combat_ui.hpp +++ b/gui/combat_ui.hpp @@ -20,5 +20,6 @@ namespace gui { guecs::Entity make_button(std::string name, Events::GUI event, int action, const std::string &icon_name, const std::string &sound, const std::string &effect_name); + void use_item(guecs::Entity gui_id, const string& slot); }; } diff --git a/gui/fsm.cpp b/gui/fsm.cpp index b80486a..c3f6038 100644 --- a/gui/fsm.cpp +++ b/gui/fsm.cpp @@ -502,13 +502,18 @@ namespace gui { break; case eGUI::USE_ITEM: { auto what = std::any_cast(data); - dbc::log(fmt::format("USE ITEM: {}", what)); + + if(System::use_item($level, what)) { + $status_ui.update(); + } break; } case eGUI::DEATH: { $status_ui.update(); if(entity != player.entity) { $main_ui.dead_entity(entity); + } else { + dbc::log("NEED TO HANDLE PLAYER DYING."); } } break; case eGUI::NOOP: { diff --git a/gui/status_ui.cpp b/gui/status_ui.cpp index 302d972..bb98543 100644 --- a/gui/status_ui.cpp +++ b/gui/status_ui.cpp @@ -76,15 +76,27 @@ namespace gui { void StatusUI::update() { auto player = $level.world->get_the(); auto& inventory = $level.world->get(player.entity); - for(auto& [slot, world_entity] : inventory.by_slot) { - auto gui_id = $gui.entity(slot); - - auto& sprite = $level.world->get(world_entity); - $gui.set_init(gui_id, {sprite.name}); - guecs::GrabSource grabber{ world_entity, - [&, gui_id]() { return remove_slot(gui_id); }}; - grabber.setSprite($gui, gui_id); - $gui.set(gui_id, grabber); + + for(const auto& [slot, cell] : $gui.cells()) { + + if(inventory.has(slot)) { + auto gui_id = $gui.entity(slot); + auto world_entity = inventory.get(slot); + + auto& sprite = $level.world->get(world_entity); + $gui.set_init(gui_id, {sprite.name}); + guecs::GrabSource grabber{ world_entity, + [&, gui_id]() { return remove_slot(gui_id); }}; + grabber.setSprite($gui, gui_id); + $gui.set(gui_id, grabber); + } else { + auto gui_id = $gui.entity(slot); + + if($gui.has(gui_id)) { + $gui.remove(gui_id); + $gui.remove(gui_id); + } + } } } @@ -123,8 +135,7 @@ namespace gui { void StatusUI::remove_slot(guecs::Entity slot_id) { auto& slot_name = $gui.name_for(slot_id); System::remove_from_container(*$level.world, $level.player, slot_name); - $gui.remove(slot_id); - $gui.remove(slot_id); + update(); } void StatusUI::swap(guecs::Entity gui_a, guecs::Entity gui_b) { diff --git a/systems.cpp b/systems.cpp index daec0df..87effc4 100644 --- a/systems.cpp +++ b/systems.cpp @@ -590,3 +590,30 @@ void System::render_map(Matrix& tiles, EntityGrid& entity_map, sf::RenderTexture render.display(); } + +bool System::use_item(GameLevel& level, Entity what) { + auto& world = *level.world; + auto& inventory = world.get(level.player); + auto& player_combat = world.get(level.player); + + if(player_combat.hp >= player_combat.max_hp) return false; + + if(auto curative = world.get_if(what)) { + inventory.remove(what); + + player_combat.hp += curative->hp; + + if(player_combat.hp > player_combat.max_hp) { + player_combat.hp = player_combat.max_hp; + } + + dbc::log(fmt::format("player health now {}", + player_combat.hp)); + + world.remove(what); + return true; + } else { + dbc::log(fmt::format("no usable item at {}", what)); + return false; + } +} diff --git a/systems.hpp b/systems.hpp index 5632d17..040a866 100644 --- a/systems.hpp +++ b/systems.hpp @@ -42,4 +42,5 @@ namespace System { void render_map(Matrix& tiles, EntityGrid& entity_map, sf::RenderTexture& render, int compass_dir, wchar_t player_display); void set_position(DinkyECS::World& world, SpatialMap& collision, Entity entity, Position pos); + bool use_item(GameLevel& level, Entity what); }