diff --git a/gui/fsm.cpp b/gui/fsm.cpp index 54e754f..cdaba54 100644 --- a/gui/fsm.cpp +++ b/gui/fsm.cpp @@ -6,6 +6,7 @@ #include "components.hpp" #include #include "systems.hpp" +#include "gui/uisystems.hpp" #include "events.hpp" #include "sound.hpp" #include "shaders.hpp" @@ -133,23 +134,19 @@ namespace gui { state(State::IDLE); break; case LOOT_SELECT: { - $grab_source = std::any_cast(data); - auto& source = $loot_ui.get_grab_source(*$grab_source); - source.grab(); + auto gui_id = std::any_cast(data); + $grab_source = UISystem::loot_grab($loot_ui.$gui, gui_id); } break; case INV_SELECT: { - auto gui_id = std::any_cast(data); - if($grab_source) { - auto& drop = $status_ui.get_drop_target(gui_id); - auto& grab = $loot_ui.get_grab_source(*$grab_source); + auto gui_id = std::any_cast(data); + bool dropped = UISystem::loot_drop( + $loot_ui.$gui, $status_ui.$gui, + *$grab_source, gui_id); - if(drop.commit(grab.world_entity)) { - grab.commit(); - $grab_source = std::nullopt; + if(dropped) { + state(State::LOOTING); } - - state(State::LOOTING); } } break; case MOUSE_CLICK: @@ -158,7 +155,7 @@ namespace gui { case MOUSE_DRAG: case MOUSE_MOVE: { if($grab_source) { - auto& source = $loot_ui.get_grab_source(*$grab_source); + auto& source = $loot_ui.$gui.get(*$grab_source); source.move($router.position); } mouse_action(true); @@ -186,24 +183,20 @@ namespace gui { state(State::IDLE); break; case LOOT_SELECT: { - auto gui_id = std::any_cast(data); - if($grab_source) { - auto& drop = $loot_ui.get_drop_target(gui_id); - auto& grab = $status_ui.get_grab_source(*$grab_source); + auto gui_id = std::any_cast(data); + bool dropped = UISystem::loot_drop( + $status_ui.$gui, $loot_ui.$gui, + *$grab_source, gui_id); - if(drop.commit(grab.world_entity)) { - grab.commit(); - $grab_source = std::nullopt; + if(dropped) { + state(State::LOOTING); } - - state(State::LOOTING); } } break; case INV_SELECT: { - $grab_source = std::any_cast(data); - auto& source = $status_ui.get_grab_source(*$grab_source); - source.grab(); + auto gui_id = std::any_cast(data); + $grab_source = UISystem::loot_grab($status_ui.$gui, gui_id); } break; case MOUSE_CLICK: mouse_action(false); @@ -211,7 +204,7 @@ namespace gui { case MOUSE_DRAG: case MOUSE_MOVE: { if($grab_source) { - auto& source = $status_ui.get_grab_source(*$grab_source); + auto& source = $status_ui.$gui.get(*$grab_source); source.move($router.position); } mouse_action(true); @@ -236,6 +229,8 @@ namespace gui { state(State::IDLE); break; case LOOT_SELECT: + // BUG: this actually should init the select, so that in LOOT_GRAB + // I can allow people to place it back into the loot ui state(State::LOOT_GRAB); LOOT_GRAB(ev, data); break; diff --git a/gui/fsm.hpp b/gui/fsm.hpp index d7366b7..5351477 100644 --- a/gui/fsm.hpp +++ b/gui/fsm.hpp @@ -49,8 +49,7 @@ namespace gui { LootUI $loot_ui; sf::Font $font; gui::routing::Router $router; - std::optional $grab_source; - std::optional $drop_target; + std::optional $grab_source; FSM(); diff --git a/gui/guecstra.cpp b/gui/guecstra.cpp index 102507a..fc11aa9 100644 --- a/gui/guecstra.cpp +++ b/gui/guecstra.cpp @@ -24,7 +24,7 @@ namespace guecs { return world_entity; } - void GrabSource::setSprite(guecs::UI& gui, DinkyECS::Entity gui_id) { + void GrabSource::setSprite(guecs::UI& gui, guecs::Entity gui_id) { dbc::check(gui.has(gui_id), "GrabSource given sprite gui_id that doesn't exist"); auto& sp = gui.get(gui_id); diff --git a/gui/guecstra.hpp b/gui/guecstra.hpp index 87e2516..2640fbf 100644 --- a/gui/guecstra.hpp +++ b/gui/guecstra.hpp @@ -14,11 +14,11 @@ namespace guecs { std::shared_ptr sprite = nullptr; DinkyECS::Entity grab(); - void setSprite(guecs::UI& gui, DinkyECS::Entity gui_id); + void setSprite(guecs::UI& gui, guecs::Entity gui_id); void move(sf::Vector2i pos); }; struct DropTarget { - std::function commit; + std::function commit; }; } diff --git a/gui/loot_ui.cpp b/gui/loot_ui.cpp index 77b8275..4afe2f8 100644 --- a/gui/loot_ui.cpp +++ b/gui/loot_ui.cpp @@ -90,12 +90,6 @@ namespace gui { } } - guecs::GrabSource& LootUI::get_grab_source(DinkyECS::Entity gui_id) { - dbc::check($gui.has(gui_id), "invalid GrabSource requested, entity isn't in the GUI."); - - return $gui.get(gui_id); - } - void LootUI::render(sf::RenderWindow& window) { $gui.render(window); } @@ -109,8 +103,4 @@ namespace gui { bool LootUI::mouse(float x, float y, bool hover) { return $gui.mouse(x, y, hover); } - - guecs::DropTarget& LootUI::get_drop_target(DinkyECS::Entity gui_id) { - return $gui.get(gui_id); - } } diff --git a/gui/loot_ui.hpp b/gui/loot_ui.hpp index 76f18da..2dc857d 100644 --- a/gui/loot_ui.hpp +++ b/gui/loot_ui.hpp @@ -21,12 +21,7 @@ namespace gui { void update_level(GameLevel &level); bool mouse(float x, float y, bool hover); - guecs::GrabSource& get_grab_source(DinkyECS::Entity entity); - - std::optional begin_grab(DinkyECS::Entity slot); void remove_slot(DinkyECS::Entity slot_id); - - guecs::DropTarget& get_drop_target(DinkyECS::Entity gui_id); bool place_slot(DinkyECS::Entity gui_id, DinkyECS::Entity world_entity); }; } diff --git a/gui/status_ui.cpp b/gui/status_ui.cpp index 8b848e3..6fa1553 100644 --- a/gui/status_ui.cpp +++ b/gui/status_ui.cpp @@ -101,16 +101,6 @@ namespace gui { } } - guecs::DropTarget& StatusUI::get_drop_target(DinkyECS::Entity gui_id) { - return $gui.get(gui_id); - } - - guecs::GrabSource& StatusUI::get_grab_source(DinkyECS::Entity gui_id) { - dbc::check($gui.has(gui_id), "invalid GrabSource requested, entity isn't in the GUI."); - - return $gui.get(gui_id); - } - void StatusUI::remove_slot(DinkyECS::Entity slot_id) { if(contents.contains(slot_id)) { contents.erase(slot_id); diff --git a/gui/status_ui.hpp b/gui/status_ui.hpp index a7db08b..4537966 100644 --- a/gui/status_ui.hpp +++ b/gui/status_ui.hpp @@ -23,10 +23,7 @@ namespace gui { void update(); bool mouse(float x, float y, bool hover); - guecs::GrabSource& get_grab_source(DinkyECS::Entity entity); void remove_slot(DinkyECS::Entity slot_id); - - guecs::DropTarget& get_drop_target(DinkyECS::Entity gui_id); bool place_slot(DinkyECS::Entity gui_id, DinkyECS::Entity world_entity); }; } diff --git a/gui/uisystems.cpp b/gui/uisystems.cpp new file mode 100644 index 0000000..02283bc --- /dev/null +++ b/gui/uisystems.cpp @@ -0,0 +1,25 @@ +#include "gui/uisystems.hpp" +#include "gui/guecstra.hpp" + +namespace UISystem { + std::optional loot_grab(guecs::UI& gui, guecs::Entity gui_id) { + if(auto source = gui.get_if(gui_id)) { + source->grab(); + return gui_id; + } else { + return std::nullopt; + } + } + + bool loot_drop(guecs::UI& source, guecs::UI& target, guecs::Entity source_id, guecs::Entity target_id) { + auto& drop = target.get(target_id); + auto& grab = source.get(source_id); + + if(drop.commit(grab.world_entity)) { + grab.commit(); + return true; + } else { + return false; + } + } +} diff --git a/gui/uisystems.hpp b/gui/uisystems.hpp new file mode 100644 index 0000000..91a8fc3 --- /dev/null +++ b/gui/uisystems.hpp @@ -0,0 +1,10 @@ +#pragma once +#include +#include + +namespace UISystem { + std::optional loot_grab(guecs::UI& gui, guecs::Entity gui_id); + + + bool loot_drop(guecs::UI& source, guecs::UI& target, guecs::Entity grab_source, guecs::Entity target_id); +} diff --git a/meson.build b/meson.build index c276eb1..183d88c 100644 --- a/meson.build +++ b/meson.build @@ -93,10 +93,10 @@ sources = [ 'dbc.cpp', 'devices.cpp', 'goap.cpp', - 'gui/event_router.cpp', 'gui/boss_fight_ui.cpp', 'gui/combat_ui.cpp', 'gui/debug_ui.cpp', + 'gui/event_router.cpp', 'gui/fsm.cpp', 'gui/guecstra.cpp', 'gui/loot_ui.cpp', @@ -106,6 +106,7 @@ sources = [ 'gui/overlay_ui.cpp', 'gui/ritual_ui.cpp', 'gui/status_ui.cpp', + 'gui/uisystems.cpp', 'levelmanager.cpp', 'lights.cpp', 'map.cpp',