Now you can heal yourself.

master
Zed A. Shaw 17 hours ago
parent e03a63f9fb
commit f19c1dbb20
  1. 15
      gui/combat_ui.cpp
  2. 1
      gui/combat_ui.hpp
  3. 7
      gui/fsm.cpp
  4. 17
      gui/status_ui.cpp
  5. 27
      systems.cpp
  6. 1
      systems.hpp

@ -68,10 +68,10 @@ namespace gui {
auto& inventory = $level.world->get<inventory::Model>($level.player); auto& inventory = $level.world->get<inventory::Model>($level.player);
if(inventory.has("pocket_l")) { if(inventory.has("pocket_l")) {
auto healing_item = inventory.get("pocket_l");
$gui.set<Icon>(healing_button, {"healing_potion_small"}); $gui.set<Icon>(healing_button, {"healing_potion_small"});
$gui.set<Clickable>(healing_button, $gui.set<Clickable>(healing_button, {[&](auto gui_id, auto) {
guecs::make_action($level, Events::GUI::USE_ITEM, {healing_item})); use_item(gui_id, "pocket_l");
}});
} else { } else {
$gui.remove<Icon>(healing_button); $gui.remove<Icon>(healing_button);
$gui.remove<Clickable>(healing_button); $gui.remove<Clickable>(healing_button);
@ -85,6 +85,15 @@ namespace gui {
$gui.init(); $gui.init();
} }
void CombatUI::use_item(guecs::Entity gui_id, const string& slot) {
auto& inventory = $level.world->get<inventory::Model>($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>(Events::GUI::USE_ITEM, gui_id, {healing_item});
}
void CombatUI::render(sf::RenderWindow& window) { void CombatUI::render(sf::RenderWindow& window) {
$gui.render(window); $gui.render(window);
} }

@ -20,5 +20,6 @@ namespace gui {
guecs::Entity make_button(std::string name, Events::GUI event, guecs::Entity make_button(std::string name, Events::GUI event,
int action, const std::string &icon_name, int action, const std::string &icon_name,
const std::string &sound, const std::string &effect_name); const std::string &sound, const std::string &effect_name);
void use_item(guecs::Entity gui_id, const string& slot);
}; };
} }

@ -502,13 +502,18 @@ namespace gui {
break; break;
case eGUI::USE_ITEM: { case eGUI::USE_ITEM: {
auto what = std::any_cast<DinkyECS::Entity>(data); auto what = std::any_cast<DinkyECS::Entity>(data);
dbc::log(fmt::format("USE ITEM: {}", what));
if(System::use_item($level, what)) {
$status_ui.update();
}
break; break;
} }
case eGUI::DEATH: { case eGUI::DEATH: {
$status_ui.update(); $status_ui.update();
if(entity != player.entity) { if(entity != player.entity) {
$main_ui.dead_entity(entity); $main_ui.dead_entity(entity);
} else {
dbc::log("NEED TO HANDLE PLAYER DYING.");
} }
} break; } break;
case eGUI::NOOP: { case eGUI::NOOP: {

@ -76,8 +76,12 @@ namespace gui {
void StatusUI::update() { void StatusUI::update() {
auto player = $level.world->get_the<components::Player>(); auto player = $level.world->get_the<components::Player>();
auto& inventory = $level.world->get<inventory::Model>(player.entity); auto& inventory = $level.world->get<inventory::Model>(player.entity);
for(auto& [slot, world_entity] : inventory.by_slot) {
for(const auto& [slot, cell] : $gui.cells()) {
if(inventory.has(slot)) {
auto gui_id = $gui.entity(slot); auto gui_id = $gui.entity(slot);
auto world_entity = inventory.get(slot);
auto& sprite = $level.world->get<components::Sprite>(world_entity); auto& sprite = $level.world->get<components::Sprite>(world_entity);
$gui.set_init<guecs::Icon>(gui_id, {sprite.name}); $gui.set_init<guecs::Icon>(gui_id, {sprite.name});
@ -85,6 +89,14 @@ namespace gui {
[&, gui_id]() { return remove_slot(gui_id); }}; [&, gui_id]() { return remove_slot(gui_id); }};
grabber.setSprite($gui, gui_id); grabber.setSprite($gui, gui_id);
$gui.set<guecs::GrabSource>(gui_id, grabber); $gui.set<guecs::GrabSource>(gui_id, grabber);
} else {
auto gui_id = $gui.entity(slot);
if($gui.has<guecs::GrabSource>(gui_id)) {
$gui.remove<guecs::GrabSource>(gui_id);
$gui.remove<guecs::Icon>(gui_id);
}
}
} }
} }
@ -123,8 +135,7 @@ namespace gui {
void StatusUI::remove_slot(guecs::Entity slot_id) { void StatusUI::remove_slot(guecs::Entity slot_id) {
auto& slot_name = $gui.name_for(slot_id); auto& slot_name = $gui.name_for(slot_id);
System::remove_from_container(*$level.world, $level.player, slot_name); System::remove_from_container(*$level.world, $level.player, slot_name);
$gui.remove<guecs::GrabSource>(slot_id); update();
$gui.remove<guecs::Icon>(slot_id);
} }
void StatusUI::swap(guecs::Entity gui_a, guecs::Entity gui_b) { void StatusUI::swap(guecs::Entity gui_a, guecs::Entity gui_b) {

@ -590,3 +590,30 @@ void System::render_map(Matrix& tiles, EntityGrid& entity_map, sf::RenderTexture
render.display(); render.display();
} }
bool System::use_item(GameLevel& level, Entity what) {
auto& world = *level.world;
auto& inventory = world.get<inventory::Model>(level.player);
auto& player_combat = world.get<Combat>(level.player);
if(player_combat.hp >= player_combat.max_hp) return false;
if(auto curative = world.get_if<Curative>(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<Curative>(what);
return true;
} else {
dbc::log(fmt::format("no usable item at {}", what));
return false;
}
}

@ -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 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); void set_position(DinkyECS::World& world, SpatialMap& collision, Entity entity, Position pos);
bool use_item(GameLevel& level, Entity what);
} }

Loading…
Cancel
Save