Initial loot UI works to load an item by its world entity ID.

This commit is contained in:
Zed A. Shaw 2025-06-02 23:34:31 -04:00
parent f208ca946e
commit 4b34de2109
6 changed files with 67 additions and 20 deletions

View file

@ -177,10 +177,19 @@ namespace gui {
case TICK:
// do nothing
break;
case LOOT_OPEN:
case LOOT_OPEN: {
dbc::log("IDLE LOOT OPEN!");
Config items("assets/items.json");
auto& data = items["TORCH_BAD"];
auto torch = $level.world->entity();
components::configure_entity(*$level.world, torch, data["components"]);
$loot_ui.contents.push_back(torch);
$loot_ui.update();
$loot_ui.active = true;
state(State::LOOTING);
break;
} break;
default:
dbc::sentinel("unhandled event in IDLE");
}
@ -384,7 +393,7 @@ namespace gui {
System::collision($level);
System::motion($level);
System::lighting($level);
System::death($level, $levels.$components);
System::death($level);
}
bool FSM::active() {

View file

@ -27,20 +27,6 @@ namespace gui {
bg_color.a = 140;
$gui.set<Background>($gui.MAIN, {$gui.$parser, bg_color});
// fill in 4 slots for prototype
for(int i = 0; i < 4; i++) {
auto id = $gui.entity("item_", i);
$gui.set<guecs::Rectangle>(id, {THEME.PADDING,
THEME.TRANSPARENT, THEME.LIGHT_MID });
$gui.set<guecs::Effect>(id, {0.4f, "ui_shader"});
$gui.set<guecs::Clickable>(id, {
[=](auto, auto) { fmt::println("clicked button_{}", i); }
});
$gui.set<guecs::Sprite>(id, {"broken_yoyo"});
}
auto close = $gui.entity("close");
$gui.set<guecs::Rectangle>(close, {});
$gui.set<guecs::Label>(close, {L"CLOSE"});
@ -48,6 +34,34 @@ namespace gui {
guecs::make_action(*$level.world, Events::GUI::LOOT_CLOSE));
$gui.init();
update();
}
void LootUI::update() {
dbc::check(contents.size() < 16, "too many items in loot contents, must be < 16");
for(int i = 0; i < 16; i++) {
auto id = $gui.entity("item_", i);
if($gui.has<guecs::Rectangle>(id)) {
$gui.remove<guecs::Rectangle>(id);
$gui.remove<guecs::Effect>(id);
$gui.remove<guecs::Clickable>(id);
$gui.remove<guecs::Sprite>(id);
}
}
for(size_t item_i = 0; item_i < contents.size(); item_i++) {
auto id = $gui.entity("item_", int(item_i));
$gui.set_init<guecs::Rectangle>(id, {THEME.PADDING,
THEME.TRANSPARENT, THEME.LIGHT_MID });
$gui.set_init<guecs::Effect>(id, {0.4f, "ui_shader"});
$gui.set<guecs::Clickable>(id, {
[=](auto, auto) { fmt::println("clicked button"); }
});
auto item = contents.at(item_i);
auto& sprite = $level.world->get<components::Sprite>(item);
$gui.set_init<guecs::Sprite>(id, {sprite.name});
}
}
void LootUI::render(sf::RenderWindow& window) {

View file

@ -11,10 +11,12 @@ namespace gui {
bool active = false;
guecs::UI $gui;
GameLevel $level;
std::vector<DinkyECS::Entity> contents;
LootUI(GameLevel level);
void init();
void update();
void render(sf::RenderWindow& window);
void update_level(GameLevel &level);
bool mouse(float x, float y, bool hover);