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

master
Zed A. Shaw 23 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, 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, ITEM_PICKUP, ev, data);
FSM_STATE(DNDState, END, ev); FSM_STATE(DNDState, INV_PICKUP, ev, data);
FSM_STATE(DNDState, END, ev, data);
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)));
} }
@ -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) { void DNDLoot::ITEM_PICKUP(Event ev, std::any data) {
using enum Event; 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; using enum Event;
switch(ev) { switch(ev) {
@ -140,6 +157,17 @@ namespace gui {
state(DNDState::ITEM_PICKUP); state(DNDState::ITEM_PICKUP);
} }
} break; } 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: case LOOT_OPEN:
open(); open();
state(DNDState::LOOTING); state(DNDState::LOOTING);
@ -149,6 +177,8 @@ namespace gui {
close(); close();
state(DNDState::END); state(DNDState::END);
break; break;
case TICK: // ignored
break;
default: default:
dbc::sentinel(fmt::format("invalid event: {}", int(ev))); dbc::sentinel(fmt::format("invalid event: {}", int(ev)));
} }

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

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

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

Loading…
Cancel
Save