|
|
|
@ -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))); |
|
|
|
|
} |
|
|
|
|