Can now drag an item out of inventory and drop it.

master
Zed A. Shaw 17 hours ago
parent 87459d41bb
commit 68e50342e5
  1. 34
      gui/dnd_loot.cpp
  2. 6
      gui/dnd_loot.hpp
  3. 8
      gui/fsm.cpp
  4. 2
      gui/fsm.hpp

@ -21,7 +21,8 @@ namespace gui {
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);
FSM_STATE(DNDState, INV_PICKUP, ev, data);
FSM_STATE(DNDState, END, ev, data);
default:
dbc::log(fmt::format("event received with data but state={} is not handled", int($state)));
}
@ -104,6 +105,22 @@ namespace gui {
}
}
void DNDLoot::INV_PICKUP(Event ev, std::any data) {
using enum Event;
(void)data;
switch(ev) {
case MOUSE_CLICK:
case MOUSE_DROP: {
auto& grab = $status_ui.$gui.get<guecs::GrabSource>(*$grab_source);
grab.commit();
END(Event::CLOSE);
} break;
default:
handle_mouse(ev, $status_ui.$gui);
}
}
void DNDLoot::ITEM_PICKUP(Event ev, std::any data) {
using enum Event;
@ -123,7 +140,7 @@ namespace gui {
}
}
void DNDLoot::END(Event ev) {
void DNDLoot::END(Event ev, std::any data) {
using enum Event;
switch(ev) {
@ -140,6 +157,17 @@ namespace gui {
state(DNDState::ITEM_PICKUP);
}
} break;
case INV_SELECT: {
$grab_source = UISystem::loot_grab($status_ui.$gui, data);
if($grab_source) {
auto& source = $status_ui.$gui.get<guecs::GrabSource>(*$grab_source);
$grab_sprite = source.sprite;
state(DNDState::INV_PICKUP);
} else {
dbc::log("inv slot empty");
}
} break;
case LOOT_OPEN:
open();
state(DNDState::LOOTING);
@ -149,6 +177,8 @@ namespace gui {
close();
state(DNDState::END);
break;
case TICK: // ignored
break;
default:
dbc::sentinel(fmt::format("invalid event: {}", int(ev)));
}

@ -12,7 +12,8 @@ namespace gui {
LOOT_GRAB=102,
INV_GRAB=103,
ITEM_PICKUP=104,
END=105
INV_PICKUP=105,
END=106
};
class DNDLoot : public DeadSimpleFSM<DNDState, Event> {
@ -34,8 +35,9 @@ namespace gui {
void LOOTING(Event ev, std::any data);
void LOOT_GRAB(Event ev, std::any data);
void INV_GRAB(Event ev, std::any data);
void END(Event ev);
void END(Event ev, std::any data={});
void ITEM_PICKUP(Event ev, std::any data);
void INV_PICKUP(Event ev, std::any data);
void handle_mouse(Event ev, guecs::UI& gui);
void mouse_action(bool hover);
void render();

@ -39,7 +39,7 @@ namespace gui {
FSM_STATE(State, MOVING, ev);
FSM_STATE(State, ATTACKING, ev);
FSM_STATE(State, ROTATING, ev);
FSM_STATE(State, IDLE, ev);
FSM_STATE(State, IDLE, ev, data);
FSM_STATE(State, IN_COMBAT, ev);
FSM_STATE(State, COMBAT_ROTATE, ev);
FSM_STATE(State, NEXT_LEVEL, ev);
@ -120,7 +120,7 @@ namespace gui {
}
}
void FSM::IDLE(Event ev) {
void FSM::IDLE(Event ev, std::any data) {
using enum Event;
sound::stop("walk");
@ -176,8 +176,8 @@ namespace gui {
state(State::LOOTING);
break;
case INV_SELECT:
dbc::log("Dropping/grabbing items not yet supported.");
state(State::IDLE);
$dnd_loot.event(Event::INV_SELECT, data);
state(State::LOOTING);
break;
case MOUSE_CLICK:
mouse_action(false);

@ -61,7 +61,7 @@ namespace gui {
void ATTACKING(Event );
void MAPPING(Event);
void ROTATING(Event );
void IDLE(Event ev);
void IDLE(Event ev, std::any data);
void IN_COMBAT(Event ev);
void COMBAT_ROTATE(Event ev);
void NEXT_LEVEL(Event ev);

Loading…
Cancel
Save