You can grab stuff off the ground and put in your inventory but it doesn't show the sprite while you do it yet.

master
Zed A. Shaw 11 months ago
parent cd02507023
commit ca74b817e5
  1. 31
      gui/dnd_loot.cpp
  2. 4
      gui/dnd_loot.hpp

@ -1,3 +1,4 @@
#define FSM_DEBUG 1
#include "gui/guecstra.hpp" #include "gui/guecstra.hpp"
#include "gui/dnd_loot.hpp" #include "gui/dnd_loot.hpp"
#include "gui/uisystems.hpp" #include "gui/uisystems.hpp"
@ -19,6 +20,7 @@ namespace gui {
FSM_STATE(DNDState, LOOTING, ev, data); FSM_STATE(DNDState, LOOTING, ev, data);
FSM_STATE(DNDState, LOOT_GRAB, ev, data); FSM_STATE(DNDState, LOOT_GRAB, ev, data);
FSM_STATE(DNDState, INV_GRAB, ev, data); FSM_STATE(DNDState, INV_GRAB, ev, data);
FSM_STATE(DNDState, ITEM_PICKUP, ev, data);
FSM_STATE(DNDState, END, ev); FSM_STATE(DNDState, END, ev);
default: default:
dbc::log(fmt::format("event received with data but state={} is not handled", int($state))); 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; using enum Event;
switch(ev) { 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: case LOOT_ITEM:
$loot_ui.active = true; dbc::log("PUT IT BACK!");
$grab_source = std::nullopt;
state(DNDState::LOOTING);
break; 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: case LOOT_OPEN:
$loot_ui.active = true; $loot_ui.active = true;
$grab_source = std::nullopt; $grab_source = std::nullopt;
@ -144,6 +166,7 @@ namespace gui {
case MOUSE_DRAG: case MOUSE_DRAG:
case MOUSE_MOVE: { case MOUSE_MOVE: {
if($grab_source) { if($grab_source) {
fmt::println("MOVING that thing");
auto& source = gui.get<guecs::GrabSource>(*$grab_source); auto& source = gui.get<guecs::GrabSource>(*$grab_source);
source.move($window.mapPixelToCoords($router.position)); source.move($window.mapPixelToCoords($router.position));
} }

@ -11,7 +11,8 @@ namespace gui {
LOOTING=101, LOOTING=101,
LOOT_GRAB=102, LOOT_GRAB=102,
INV_GRAB=103, INV_GRAB=103,
END=104 ITEM_PICKUP=104,
END=105
}; };
class DNDLoot : public DeadSimpleFSM<DNDState, Event> { class DNDLoot : public DeadSimpleFSM<DNDState, Event> {
@ -33,6 +34,7 @@ namespace gui {
void LOOT_GRAB(Event ev, std::any data); void LOOT_GRAB(Event ev, std::any data);
void INV_GRAB(Event ev, std::any data); void INV_GRAB(Event ev, std::any data);
void END(Event ev); void END(Event ev);
void ITEM_PICKUP(Event ev, std::any data);
void handle_mouse(Event ev, guecs::UI& gui); void handle_mouse(Event ev, guecs::UI& gui);
void mouse_action(bool hover); void mouse_action(bool hover);
sf::Vector2f mouse_position(); sf::Vector2f mouse_position();