Better UI for the ritual crafting that almost works, but need to get the selected items to move down. Might need some state machine love soon.

This commit is contained in:
Zed A. Shaw 2025-04-28 13:21:10 -04:00
parent 9d55b2954a
commit 14619558fa
9 changed files with 99 additions and 48 deletions

View file

@ -20,23 +20,39 @@ namespace gui {
"[inv_slot4 | inv_slot5 | inv_slot6| inv_slot7]"
"[inv_slot8 | inv_slot9 | inv_slot10| inv_slot11]"
"[inv_slot12 | inv_slot13 | inv_slot14| inv_slot15]"
"[*%(100,600)circle_area]"
"[_]"
"[_]"
"[_]"
"[_]"
"[_]"
"[reset |*%(200,400)result_text|_]"
"[*%(100,200)result_image|_ |_]"
"[_|_|_]"
"[combine|_|_]"
"[_|craft1|craft2|craft3|craft4|_]"
"[_|craft5|craft6|craft7|craft8|_]"
"[ ritual_ui ]");
}
void RitualUI::init() {
update_items();
auto circle = $gui.entity("circle_area");
$gui.set<Effect>(circle, {0.4f});
$gui.set<Sprite>(circle, {"the_ritual_circle"});
$gui.set<Clickable>(circle, {
[&](auto ent, auto){ ritual_circle_clicked(ent); }
auto combine = $gui.entity("combine");
$gui.set<Effect>(combine, {0.4f});
$gui.set<Sprite>(combine, {"the_ritual_circle"});
$gui.set<Clickable>(combine, {
[&](auto ent, auto){ combine_clicked(ent); }
});
auto result_image = $gui.entity("result_image");
$gui.set<Sprite>(result_image, {"severed_finger-128"});
$gui.set<Rectangle>(result_image, {10, {60, 60, 60, 30}});
auto result_text = $gui.entity("result_text");
$gui.set<Rectangle>(result_text, {15, {60, 60, 60, 30}});
$gui.set<Textual>(result_text, {
L"Celiac migas\nunicorn hexagon.\nBrooklyn williamsburg\ntruffaut pickled\nchillwave raclette\nchurch-key sus.", 16, ColorValue::LIGHT_LIGHT, 10});
auto reset = $gui.entity("reset");
$gui.set<Rectangle>(reset, {});
$gui.set<Label>(reset, L"reset");
$gui.set<Clickable>(reset, {
[&](auto ent, auto){ reset_clicked(ent); }
});
auto open_close_toggle = $gui.entity("ritual_ui");
@ -56,31 +72,27 @@ namespace gui {
return $ritual_state != RitualUIState::CLOSED;
}
void RitualUI::inv_slot_clicked(DinkyECS::Entity ent) {
void RitualUI::inv_slot_clicked(DinkyECS::Entity ent, DinkyECS::Entity item_id) {
if($gui.has<Sprite>(ent)) {
auto& bs = $gui.get<Sprite>(ent);
auto ritual_circle = $gui.entity("circle_area");
auto& ritual_cell = $gui.cell_for(ritual_circle);
dbc::log(fmt::format("inv_slot clicked {}", bs.name));
// auto& bs = $gui.get<Sprite>(ent);
// auto combine = $gui.entity("combine");
int inner_x = ritual_cell.x + ritual_cell.x / 2;
int inner_y = ritual_cell.y + ritual_cell.y / 2;
// do things to the combine button
float x = Random::uniform(inner_x, inner_x + ritual_cell.w / 2);
float y = Random::uniform(inner_y, inner_y + ritual_cell.h / 2);
bs.sprite->setPosition({float(x), float(y)});
auto& blanket = $level.world->get_the<ritual::Blanket>();
auto& junk_item = blanket.get(item_id);
$engine.load_junk($craft_state, junk_item);
}
// BUG: get the actual thing they clicked on
$engine.set_state($craft_state, "has_magick", true);
}
void RitualUI::reset_inv_positions() {
auto ritual_circle = $gui.entity("circle_area");
$craft_state.reset();
auto combine = $gui.entity("combine");
$gui.world().query<lel::Cell, Sprite>(
[&](const auto ent, auto &cell, auto &bs) {
if(ent == ritual_circle) {
if(ent == combine) {
bs.sprite->setColor({255,255,255,255});
bs.sprite->setRotation(sf::degrees(0.0));
} else {
@ -89,11 +101,16 @@ namespace gui {
});
}
void RitualUI::ritual_circle_clicked(DinkyECS::Entity ent) {
auto cell = $gui.cell_for(ent);
void RitualUI::reset_clicked(DinkyECS::Entity ent) {
(void)ent; // make button animate
reset_inv_positions();
}
void RitualUI::combine_clicked(DinkyECS::Entity ent) {
// auto cell = $gui.cell_for(ent);
auto& bs = $gui.get<Sprite>(ent);
bs.sprite->setColor({200, 0, 0});
animation::center(*bs.sprite, {(float)cell.x, (float)cell.y});
// animation::center(*bs.sprite, {(float)cell.x, (float)cell.y});
animation::rotate(*bs.sprite, 20.0);
// finalize here ritual here
@ -102,8 +119,8 @@ namespace gui {
if($craft_state.is_combined()) {
// add it to the belt
auto ritual = $engine.finalize($craft_state);
// remove the items from the blanket now
// remove the items from the blanket now
auto& the_belt = $level.world->get_the<ritual::Belt>();
the_belt.equip(the_belt.next(), ritual);
@ -112,6 +129,7 @@ namespace gui {
reset_inv_positions();
} else {
fmt::println("Failed to combine!");
reset_inv_positions();
sound::play("ui_click");
}
}
@ -124,9 +142,8 @@ namespace gui {
auto& blanket = $level.world->get_the<ritual::Blanket>();
int i = 0;
blanket.contents.query<ritual::JunkItem>([&](const auto, auto& item) {
std::string slot = fmt::format("inv_slot{}", i++);
auto button = $gui.entity(slot);
blanket.contents.query<ritual::JunkItem>([&](const auto item_id, auto& item) {
auto button = $gui.entity("inv_slot", i++);
std::string sprite_name = fmt::format("{}-64", item);
if($gui.has<Clickable>(button)) {
@ -136,7 +153,7 @@ namespace gui {
$gui.set<Effect>(button, {0.4f});
$gui.set<Sound>(button, {"ui_click"});
$gui.set<Clickable>(button, {
[&](auto ent, auto){ inv_slot_clicked(ent); }
[&, item_id](auto ent, auto){ inv_slot_clicked(ent, item_id); }
});
}
});
@ -174,6 +191,9 @@ namespace gui {
}
window.draw(*$ritual_ui.sprite);
if($ritual_state == OPEN) $gui.render(window);
if($ritual_state == OPEN) {
$gui.render(window);
// $gui.debug_layout(window);
}
}
}