Basic loot UI mostly working. Each time you open there's a torch and you can place it visually on any slot on your character.

This commit is contained in:
Zed A. Shaw 2025-06-03 13:43:16 -04:00
parent 4b34de2109
commit 5c47a0151c
13 changed files with 123 additions and 46 deletions

View file

@ -38,8 +38,16 @@ namespace gui {
FSM_STATE(State, IN_COMBAT, ev);
FSM_STATE(State, COMBAT_ROTATE, ev);
FSM_STATE(State, NEXT_LEVEL, ev);
FSM_STATE(State, LOOTING, ev);
FSM_STATE(State, END, ev);
FSM_STATE(State, LOOTING, ev, std::make_any<bool>(true));
}
}
void FSM::event(Event ev, std::any data) {
switch($state) {
FSM_STATE(State, LOOTING, ev, data);
default:
dbc::log(fmt::format("event given with data but event={} is not handled", int(ev)));
}
}
@ -110,7 +118,7 @@ namespace gui {
}
}
void FSM::LOOTING(Event ev) {
void FSM::LOOTING(Event ev, std::any data) {
using enum Event;
switch(ev) {
@ -118,6 +126,19 @@ namespace gui {
$loot_ui.active = false;
state(State::IDLE);
break;
case LOOT_SELECT: {
int slot_id = std::any_cast<int>(data);
if(auto entity = $loot_ui.select_slot(slot_id)) {
fmt::println("LOOT SELECT slot={} has entity={}", slot_id, entity.value());
$status_ui.select_slot(slot_id, entity.value());
}
} break;
case LOOT_PLACE: {
std::string slot_name = std::any_cast<std::string>(data);
int slot_id = $status_ui.place_slot(slot_name);
$loot_ui.remove_slot(slot_id);
} break;
case TICK:
// do nothing
break;
@ -190,6 +211,9 @@ namespace gui {
state(State::LOOTING);
} break;
case LOOT_PLACE:
// ignored
break;
default:
dbc::sentinel("unhandled event in IDLE");
}
@ -439,6 +463,12 @@ namespace gui {
// BUG: need to resolve GUI events vs. FSM events better
event(Event::LOOT_OPEN);
break;
case eGUI::LOOT_SELECT:
event(Event::LOOT_SELECT, data);
break;
case eGUI::LOOT_PLACE:
event(Event::LOOT_PLACE, data);
break;
case eGUI::LOOT: {
$map_ui.log(L"You picked up an item.");
} break;