diff --git a/gui/dnd_loot.cpp b/gui/dnd_loot.cpp index 1451b83..fda4cee 100644 --- a/gui/dnd_loot.cpp +++ b/gui/dnd_loot.cpp @@ -1,3 +1,4 @@ +#define FSM_DEBUG 1 #include "gui/guecstra.hpp" #include "gui/dnd_loot.hpp" #include "gui/uisystems.hpp" @@ -19,6 +20,7 @@ namespace gui { FSM_STATE(DNDState, LOOTING, ev, data); FSM_STATE(DNDState, LOOT_GRAB, ev, data); FSM_STATE(DNDState, INV_GRAB, ev, data); + FSM_STATE(DNDState, ITEM_PICKUP, ev, data); FSM_STATE(DNDState, END, ev); default: dbc::log(fmt::format("event received with data but state={} is not handled", int($state))); @@ -105,15 +107,35 @@ namespace gui { } } - void DNDLoot::END(Event ev) { + void DNDLoot::ITEM_PICKUP(Event ev, std::any data) { using enum Event; switch(ev) { + case INV_SELECT: + if(UISystem::loot_drop($loot_ui.$gui, + $status_ui.$gui, $grab_source, data)) + { + state(DNDState::END); + } + break; case LOOT_ITEM: - $loot_ui.active = true; - $grab_source = std::nullopt; - state(DNDState::LOOTING); + dbc::log("PUT IT BACK!"); break; + default: + handle_mouse(ev, $loot_ui.$gui); + } + } + + void DNDLoot::END(Event ev) { + using enum Event; + + switch(ev) { + case LOOT_ITEM: { + // NOTE: if > 1 items, go to LOOT_OPEN instead + auto gui_id = $loot_ui.$gui.entity("item_0"); + $grab_source = UISystem::loot_grab($loot_ui.$gui, gui_id); + if($grab_source) state(DNDState::ITEM_PICKUP); + } break; case LOOT_OPEN: $loot_ui.active = true; $grab_source = std::nullopt; @@ -144,6 +166,7 @@ namespace gui { case MOUSE_DRAG: case MOUSE_MOVE: { if($grab_source) { + fmt::println("MOVING that thing"); auto& source = gui.get(*$grab_source); source.move($window.mapPixelToCoords($router.position)); } diff --git a/gui/dnd_loot.hpp b/gui/dnd_loot.hpp index f44f0f5..c2fa590 100644 --- a/gui/dnd_loot.hpp +++ b/gui/dnd_loot.hpp @@ -11,7 +11,8 @@ namespace gui { LOOTING=101, LOOT_GRAB=102, INV_GRAB=103, - END=104 + ITEM_PICKUP=104, + END=105 }; class DNDLoot : public DeadSimpleFSM { @@ -33,6 +34,7 @@ namespace gui { void LOOT_GRAB(Event ev, std::any data); void INV_GRAB(Event ev, std::any data); void END(Event ev); + void ITEM_PICKUP(Event ev, std::any data); void handle_mouse(Event ev, guecs::UI& gui); void mouse_action(bool hover); sf::Vector2f mouse_position();