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 4 days 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();

Loading…
Cancel
Save