Inventory system basically works now but is in a alpha hack stage. Time to refactor.

This commit is contained in:
Zed A. Shaw 2025-02-23 22:57:27 -05:00
parent b7f49aa719
commit e0e7a1027c
11 changed files with 92 additions and 33 deletions

View file

@ -31,14 +31,58 @@ namespace gui {
auto button = $gui.entity(name);
$gui.set<Rectangle>(button, {});
$gui.set<Textual>(button, {""});
$gui.set<Clickable>(button,
guecs::make_action(*$level.world, Events::GUI::NOOP));
$gui.set<ActionData>(button, {std::make_any<std::string>(name)});
$gui.set<Clickable>(button, {
[&](auto ent, auto data){ select_slot(ent, data); }
});
}
}
$gui.init();
}
void StatusUI::select_slot(DinkyECS::Entity ent, std::any) {
auto cn = $gui.get<CellName>(ent);
auto world = $level.world;
if(world->has<components::Inventory>($level.player)) {
auto& inventory = world->get<components::Inventory>($level.player);
for(size_t i = 0; i < inventory.count(); i++) {
if($slots[i] == cn.name) {
auto& player_combat = world->get<components::Combat>($level.player);
auto& item = inventory.get(i);
if(item.count == 0) continue;
if(item.data["id"] == "SWORD_RUSTY") {
auto weapon = components::get<components::Weapon>(item.data);
player_combat.damage = weapon.damage;
inventory.decrease(i, 1);
log("You equip a new sword.");
break;
} else if(item.data["id"] == "POTION_HEALING_SMALL") {
auto cure = components::get<components::Curative>(item.data);
int prev_hp = player_combat.hp;
player_combat.hp = std::min(player_combat.hp + cure.hp, player_combat.max_hp);
log(fmt::format("Healed player from {} to {}", prev_hp, player_combat.hp));
inventory.decrease(i, 1);
break;
} else if(item.data["id"] == "TORCH_BAD") {
auto new_light = components::get<components::LightSource>(item.data);
world->set<components::LightSource>($level.player, new_light);
inventory.light = new_light;
inventory.decrease(i, 1);
log("You are using a new torch.");
break;
}
}
}
update();
}
}
/* WARNING: This is really not the greatest way to do this. */
void StatusUI::update() {
if($gui.has<Textual>($log_to)) {
@ -62,11 +106,17 @@ namespace gui {
auto& item = inventory.get(i);
auto comp_sprite = components::get<components::Sprite>(item.data);
$gui.set_init<guecs::Sprite>(slot, {comp_sprite.name});
std::string count_label = item.count > 1 ? fmt::format("{}", item.count): "";
std::string count_label = fmt::format("{}", item.count);
auto& label = $gui.get<Textual>(slot);
label.text->setString(count_label);
auto& sprite = $gui.get<guecs::Sprite>(slot);
if(item.count == 0) {
sprite.sprite->setColor({125, 125, 125});
} else {
sprite.sprite->setColor({255, 255, 255});
}
}
}
}