|
|
|
@ -33,36 +33,59 @@ namespace gui { |
|
|
|
|
$gui.set<guecs::Clickable>(close, |
|
|
|
|
guecs::make_action(*$level.world, Events::GUI::LOOT_CLOSE)); |
|
|
|
|
|
|
|
|
|
for(int i = 0; i < INV_SLOTS; 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, { |
|
|
|
|
guecs::make_action(*$level.world, Events::GUI::LOOT_SELECT, {i}) |
|
|
|
|
}); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
$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); |
|
|
|
|
std::optional<DinkyECS::Entity> LootUI::select_slot(int slot_id) { |
|
|
|
|
if(size_t(slot_id) < contents.size()) { |
|
|
|
|
return contents.at(slot_id); |
|
|
|
|
} else { |
|
|
|
|
return std::nullopt; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
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"); } |
|
|
|
|
}); |
|
|
|
|
void LootUI::remove_slot(int slot_id) { |
|
|
|
|
dbc::check(size_t(slot_id) < contents.size(), |
|
|
|
|
fmt::format("invalid slot id {} give, contents.size={}", |
|
|
|
|
slot_id, contents.size())); |
|
|
|
|
|
|
|
|
|
contents.erase(contents.begin() + slot_id); |
|
|
|
|
update(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void LootUI::update() { |
|
|
|
|
dbc::check(contents.size() < INV_SLOTS, "too many items in loot contents, must be < 16"); |
|
|
|
|
|
|
|
|
|
auto item = contents.at(item_i); |
|
|
|
|
for(size_t i = 0; i < INV_SLOTS; i++) { |
|
|
|
|
auto id = $gui.entity("item_", int(i)); |
|
|
|
|
|
|
|
|
|
fmt::println("checking for sprite at {}", id); |
|
|
|
|
if($gui.has<guecs::Sprite>(id)) { |
|
|
|
|
fmt::println("REMOVING SPRITE {}", id); |
|
|
|
|
$gui.remove<guecs::Sprite>(id); |
|
|
|
|
} else { |
|
|
|
|
fmt::println("nothing at {}", id); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if(i < contents.size()) { |
|
|
|
|
auto item = contents.at(i); |
|
|
|
|
auto& sprite = $level.world->get<components::Sprite>(item); |
|
|
|
|
fmt::println("NEW SPRITE SPRITE {}", sprite.name); |
|
|
|
|
$gui.set_init<guecs::Sprite>(id, {sprite.name}); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void LootUI::render(sf::RenderWindow& window) { |
|
|
|
|
$gui.render(window); |
|
|
|
|