#include "gui/combat_ui.hpp" #include "constants.hpp" #include "rituals.hpp" #include #include "gui/guecstra.hpp" #include "inventory.hpp" namespace gui { using namespace guecs; CombatUI::CombatUI(GameLevel level) : $level(level) { $gui.position(COMBAT_UI_X, COMBAT_UI_Y, COMBAT_UI_WIDTH, COMBAT_UI_HEIGHT); $gui.layout( "[button_0 | button_1 | button_2 | button_3" "|button_4 | button_5 | button_6 | =healing_button | =hp_gauge ]" ); } guecs::Entity CombatUI::make_button( std::string name, Events::GUI event, int action, const std::string &icon_name, const std::string &sound, const std::string &effect_name) { auto button = $gui.entity(name); $gui.set(button, {icon_name}); $gui.set(button, {sound}); $gui.set(button, {.duration=0.5f, .name=effect_name}); $gui.set(button, guecs::make_action($level, event, {action})); return button; } void CombatUI::init() { using guecs::THEME; $gui.set($gui.MAIN, {$gui.$parser, THEME.DARK_MID}); auto& the_belt = $level.world->get_the(); for(int slot = 0; slot < the_belt.max_slots; slot++) { if(the_belt.has(slot)) { std::string name = fmt::format("button_{}", slot); auto& ritual = the_belt.get(slot); using enum ritual::Element; switch(ritual.element) { case FIRE: make_button(name, Events::GUI::ATTACK, slot, "broken_yoyo", "fireball_01", "flame"); break; case LIGHTNING: make_button(name, Events::GUI::ATTACK, slot, "pocket_watch", "electric_shock_01", "lightning"); break; default: make_button(name, Events::GUI::ATTACK, slot, "severed_finger", "punch_cartoony", "ui_shader"); } } } auto healing_button = $gui.entity("healing_button"); auto& inventory = $level.world->get($level.player); if(inventory.has("pocket_l")) { $gui.set(healing_button, {"healing_potion_small"}); $gui.set(healing_button, {[&](auto gui_id, auto) { use_item(gui_id, "pocket_l"); }}); } else { $gui.remove(healing_button); $gui.remove(healing_button); } auto hp_gauge = $gui.entity("hp_gauge"); $gui.set(hp_gauge, {"stone_doll_cursed"}); $gui.set(hp_gauge, guecs::make_action($level, Events::GUI::HP_STATUS, {})); $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); } void CombatUI::update_level(GameLevel &level) { $level = level; init(); } bool CombatUI::mouse(float x, float y, bool hover) { return $gui.mouse(x, y, hover); } }