#include "gui/status_ui.hpp" #include "components.hpp" #include #include "rand.hpp" #include #include "gui/guecstra.hpp" namespace gui { using namespace guecs; using std::any, std::any_cast, std::string, std::make_any; StatusUI::StatusUI(GameLevel level) : $level(level), $ritual_ui(level) { $gui.position(STATUS_UI_X, STATUS_UI_Y, STATUS_UI_WIDTH, STATUS_UI_HEIGHT); $gui.layout( "[ritual_ui]" "[earing|armor_head|amulet]" "[back|*%(200,300)character_view|_|armor_bdy]" "[hand_r|_|_ |hand_l]" "[ring_r|_|_ |ring_l]" "[pocket_r|armor_leg|pocket_l]"); } void StatusUI::init() { $gui.set($gui.MAIN, {$gui.$parser}); for(auto& [name, cell] : $gui.cells()) { if(name == "character_view") { auto char_view = $gui.entity(name); $gui.set(char_view, {}); $gui.set(char_view, {"armored_knight"}); } else { auto button = $gui.entity(name); $gui.set(button, {}); $gui.set(button, {make_any(name)}); if(name == "ritual_ui") { $gui.set(button, { [this](auto, auto){ select_ritual(); } }); $gui.set(button, {"pickup"}); } else { $gui.set(button, {guecs::to_wstring(name)}); $gui.set(button, { guecs::make_action(*$level.world, Events::GUI::INV_SELECT, {button}) }); $gui.set(button, { .commit=[&, button]() -> bool { return place_slot(button); } }); } } } $ritual_ui.event(ritual::Event::STARTED); $gui.init(); } bool StatusUI::mouse(float x, float y, bool hover) { if($ritual_ui.is_open()) { return $ritual_ui.mouse(x, y, hover); } else { return $gui.mouse(x, y, hover); } } void StatusUI::select_ritual() { $ritual_ui.event(ritual::Event::TOGGLE); } void StatusUI::update() { dbc::log("REWRITE ME!"); } void StatusUI::render(sf::RenderWindow &window) { $gui.render(window); // $gui.debug_layout(window); $ritual_ui.render(window); } void StatusUI::update_level(GameLevel &level) { $level = level; init(); } bool StatusUI::place_slot(DinkyECS::Entity gui_id) { if($level.world->has($selected_entity)) { auto& sprite = $level.world->get($selected_entity); $gui.set_init(gui_id, {sprite.name}); $slots.insert_or_assign(gui_id, $selected_entity); return true; } else { return false; } } guecs::DropTarget& StatusUI::get_drop_target(DinkyECS::Entity gui_id) { return $gui.get(gui_id); } void StatusUI::begin_drop(DinkyECS::Entity entity) { $selected_entity = entity; } bool StatusUI::commit_drop(DinkyECS::Entity gui_id) { auto& drop = get_drop_target(gui_id); return drop.commit(); } bool StatusUI::has_grab_source(DinkyECS::Entity gui_id) { return $gui.has(gui_id); } guecs::GrabSource& StatusUI::get_grab_source(DinkyECS::Entity gui_id) { dbc::check(has_grab_source(gui_id), "invalid GrabSource requested, entity isn't in the GUI."); return static_cast($gui.get(gui_id)); } std::optional StatusUI::begin_grab(DinkyECS::Entity slot_id) { (void)slot_id; return std::nullopt; } void StatusUI::commit_grab(DinkyECS::Entity slot_id) { (void)slot_id; } }