From dab0e092e6bcb7f289e01f2ddf58f5a66dcfb415 Mon Sep 17 00:00:00 2001 From: "Zed A. Shaw" Date: Thu, 1 May 2025 23:46:30 -0400 Subject: [PATCH] RitualUI is mostly working, but need to make the consumption of items work in the UI. --- constants.hpp | 2 +- ritual_ui.cpp | 184 +++++++++++++++++++++++++++----------------------- ritual_ui.hpp | 2 + rituals.cpp | 6 ++ rituals.hpp | 1 + 5 files changed, 109 insertions(+), 86 deletions(-) diff --git a/constants.hpp b/constants.hpp index a5db392..7bfa1e1 100644 --- a/constants.hpp +++ b/constants.hpp @@ -4,7 +4,7 @@ #include "color.hpp" #include -constexpr const int INV_SLOTS=24; +constexpr const int INV_SLOTS=20; constexpr const int TEXTURE_WIDTH=256; constexpr const int TEXTURE_HEIGHT=256; constexpr const int RAY_VIEW_WIDTH=900; diff --git a/ritual_ui.cpp b/ritual_ui.cpp index b0d635a..10f21e5 100644 --- a/ritual_ui.cpp +++ b/ritual_ui.cpp @@ -11,6 +11,26 @@ namespace gui { using namespace guecs; using std::any, std::any_cast, std::string, std::make_any; + UI::UI(GameLevel level) : + $level(level), + $blanket($level.world->get_the<::ritual::Blanket>()) + { + $gui.position(STATUS_UI_X, STATUS_UI_Y, STATUS_UI_WIDTH, STATUS_UI_HEIGHT); + $gui.layout( + "[_]" + "[inv_slot0 | inv_slot1 | inv_slot2| inv_slot3]" + "[inv_slot4 | inv_slot5 | inv_slot6| inv_slot7]" + "[inv_slot8 | inv_slot9 | inv_slot10| inv_slot11]" + "[inv_slot12 | inv_slot13 | inv_slot14| inv_slot15]" + "[inv_slot16 | inv_slot17 | inv_slot18| inv_slot19]" + "[reset |*%(200,400)result_text|_]" + "[*%(100,200)result_image|_ |_]" + "[_|_|_]" + "[combine|_|_]" + "[_]" + "[ ritual_ui ]"); + } + void UI::event(Event ev, std::any data) { switch($state) { FSM_STATE(State, START, ev); @@ -41,6 +61,7 @@ namespace gui { [&](auto, auto){ event(Event::COMBINE); } }); + $craft_state = $ritual_engine.start(); $gui.init(); state(State::CLOSED); @@ -52,7 +73,6 @@ namespace gui { state(State::CLOSING); } else if(ev == Event::SELECT) { // do this before transitioning - $craft_state = $ritual_engine.start(); state(State::CRAFTING); UI::CRAFTING(ev, data); } @@ -63,77 +83,15 @@ namespace gui { clear_blanket(); state(State::CLOSING); } else if(ev == Event::COMBINE) { - if($craft_state.is_combined()) { - auto ritual = $ritual_engine.finalize($craft_state); - auto& belt = $level.world->get_the<::ritual::Belt>(); - belt.equip(belt.next(), ritual); - $level.world->send(Events::GUI::NEW_RITUAL, $level.player, {}); - clear_craft_result(); - $blanket.reset(); - // BUG: need a way to clear selections - load_blanket(); - $craft_state.reset(); - state(State::OPENED); - } + complete_combine(); } else if(ev == Event::SELECT) { dbc::check(data.has_value(), "OPENED state given SELECT with no data"); auto pair = std::any_cast(data); select_item(pair); - - if($blanket.no_selections()) { - $craft_state.reset(); - clear_craft_result(); - state(State::OPENED); - } else { - run_crafting_engine(); - - if(!$craft_state.is_combined()) { - show_craft_failure(); - } else { - show_craft_result(); - } - } + update_selection_state(); } } - void UI::run_crafting_engine() { - $craft_state.reset(); - - for(auto [item_id, setting] : $blanket.selected) { - auto& item = $blanket.get(item_id); - $ritual_engine.load_junk($craft_state, item); - } - - $ritual_engine.plan($craft_state); - } - - void UI::show_craft_result() { - using enum ::ritual::Element; - auto ritual = $ritual_engine.finalize($craft_state); - - switch(ritual.element) { - case FIRE: - $gui.show_sprite("result_image", "broken_yoyo-64"); - break; - case LIGHTNING: - $gui.show_sprite("result_image", "pocket_watch-64"); - break; - default: - $gui.show_sprite("result_image", "severed_finger-64"); - } - - $gui.show_label("result_text", L"CRAFTING"); - } - - void UI::clear_craft_result() { - $gui.close