From 00c28f47eba091936ed7112da46d894917890853 Mon Sep 17 00:00:00 2001 From: "Zed A. Shaw" Date: Thu, 24 Apr 2025 12:27:29 -0400 Subject: [PATCH] Rituals are now being added a belt on the player in a temp function in LevelManager. --- Makefile | 2 +- gui_fsm.cpp | 2 + levelmanager.cpp | 19 ++++++++ levelmanager.hpp | 2 + rituals.cpp | 11 +++++ rituals.hpp | 1 + tests/rituals.cpp | 114 +++++++++++++++++++++++++++------------------- worldbuilder.cpp | 2 + 8 files changed, 106 insertions(+), 47 deletions(-) diff --git a/Makefile b/Makefile index 7401ae4..60f7708 100644 --- a/Makefile +++ b/Makefile @@ -41,7 +41,7 @@ clean: meson compile --clean -C builddir debug_test: build - gdb --nx -x .gdbinit --ex run --args builddir/runtests.exe -e + gdb --nx -x .gdbinit --ex run --args builddir/runtests.exe -e "[rituals-belt]" win_installer: powershell 'start "C:\Program Files (x86)\solicus\InstallForge\bin\ifbuilderenvx86.exe" win_installer.ifp' diff --git a/gui_fsm.cpp b/gui_fsm.cpp index 71e8134..01e26e9 100644 --- a/gui_fsm.cpp +++ b/gui_fsm.cpp @@ -24,6 +24,7 @@ namespace gui { $mini_map($level), $font{FONT_FILE_NAME} { + $levels.temp_create_player_rituals(); } void FSM::event(Event ev) { @@ -41,6 +42,7 @@ namespace gui { } void FSM::START(Event ) { + $main_ui.update_level($level); $level.world->set_the({}); $main_ui.init(); diff --git a/levelmanager.cpp b/levelmanager.cpp index 92f57cc..d4e1a9d 100644 --- a/levelmanager.cpp +++ b/levelmanager.cpp @@ -4,6 +4,7 @@ #include "save.hpp" #include "systems.hpp" #include "components.hpp" +#include "rituals.hpp" using lighting::LightRender; using std::shared_ptr, std::make_shared; @@ -21,6 +22,24 @@ LevelScaling LevelManager::scale_level() { }; } +void LevelManager::temp_create_player_rituals() { + auto& level = current(); + auto player = level.player; + auto& the_belt = level.world->get(player); + + combat::RitualEngine re("assets/rituals.json"); + auto blanket = re.start(); + re.set_state(blanket, "has_magick", true); + re.plan(blanket); + auto ritual = re.finalize(blanket); + the_belt.equip(0, ritual); + + blanket = re.start(); + re.set_state(blanket, "has_spikes", true); + re.plan(blanket); + ritual = re.finalize(blanket); + the_belt.equip(1, ritual); +} inline shared_ptr clone_load_world(shared_ptr prev_world) { diff --git a/levelmanager.hpp b/levelmanager.hpp index a51faff..12f2084 100644 --- a/levelmanager.hpp +++ b/levelmanager.hpp @@ -42,5 +42,7 @@ class LevelManager { GameLevel &get(size_t index); LevelScaling scale_level(); + void temp_create_player_rituals(); + DinkyECS::Entity spawn_enemy(std::string named); }; diff --git a/rituals.cpp b/rituals.cpp index 0676e7b..9caec8f 100644 --- a/rituals.cpp +++ b/rituals.cpp @@ -46,6 +46,10 @@ namespace combat { } void RitualEngine::set_state(RitualAI& ritual, std::string name, bool setting) { + dbc::check($profile.contains(name), + fmt::format("ritual action named {} is not in profile, look in {} config", + name, $config.$src_path)); + ritual.start.set($profile.at(name), setting); } @@ -69,10 +73,17 @@ namespace combat { return result; } + // BUG: maybe this should be called RitualBlanket instead? void RitualAI::dump() { ai::dump_script(script, start, plan.script); } + bool RitualAI::is_combined() { + dbc::check(!plan.script.empty(), "you are attempting to check an empty plan"); + auto& last = plan.script.back(); + return plan.script.size() > 1 && last.name == "combined"; + } + RitualAction RitualEngine::finalize(RitualAI& ritual) { (void)ritual; diff --git a/rituals.hpp b/rituals.hpp index 220e0e5..1a9710e 100644 --- a/rituals.hpp +++ b/rituals.hpp @@ -23,6 +23,7 @@ namespace combat { bool will_do(std::string name); void dump(); ai::Action pop(); + bool is_combined(); }; enum class RitualElement { diff --git a/tests/rituals.cpp b/tests/rituals.cpp index 0a4dd0a..a1f2bdd 100644 --- a/tests/rituals.cpp +++ b/tests/rituals.cpp @@ -3,86 +3,92 @@ #include "rituals.hpp" #include "fsm.hpp" #include "dinkyecs.hpp" +#include "levelmanager.hpp" using namespace combat; TEST_CASE("RitualEngine basic tests", "[rituals]") { RitualEngine re("assets/rituals.json"); - auto ritual = re.start(); + auto blanket = re.start(); - re.set_state(ritual, "has_spikes", true); - re.plan(ritual); + re.set_state(blanket, "has_spikes", true); + re.plan(blanket); fmt::println("\n\n------------ TEST WILL DO PIERCE"); - ritual.dump(); - REQUIRE(ritual.will_do("pierce_type")); + blanket.dump(); + REQUIRE(blanket.will_do("pierce_type")); - REQUIRE(ritual.start != ritual.original); - re.reset(ritual); - REQUIRE(ritual.start == ritual.original); + REQUIRE(blanket.start != blanket.original); + re.reset(blanket); + REQUIRE(blanket.start == blanket.original); - re.set_state(ritual, "has_magick", true); - re.set_state(ritual, "has_spikes", true); - re.plan(ritual); + re.set_state(blanket, "has_magick", true); + re.set_state(blanket, "has_spikes", true); + re.plan(blanket); fmt::println("\n\n------------ TEST WILL DO MAGICK TOO"); - ritual.dump(); - REQUIRE(ritual.will_do("pierce_type")); - - ritual.pop(); - REQUIRE(ritual.will_do("magick_type")); - - re.reset(ritual); - re.set_state(ritual, "has_magick", true); - re.set_state(ritual, "has_spikes", true); - re.set_state(ritual, "shiny_bauble", true); - re.plan(ritual); + blanket.dump(); + REQUIRE(blanket.will_do("pierce_type")); + + blanket.pop(); + REQUIRE(blanket.will_do("magick_type")); + + re.reset(blanket); + re.set_state(blanket, "has_magick", true); + re.set_state(blanket, "has_spikes", true); + re.set_state(blanket, "shiny_bauble", true); + REQUIRE(blanket.is_combined()); + re.plan(blanket); fmt::println("\n\n------------ TEST WILL DO DAMAGE BOOST"); - ritual.dump(); - - re.reset(ritual); - re.set_state(ritual, "has_magick", true); - re.set_state(ritual, "cursed_item", true); - re.set_state(ritual, "shiny_bauble", true); - re.plan(ritual); + blanket.dump(); + + re.reset(blanket); + re.set_state(blanket, "has_magick", true); + re.set_state(blanket, "cursed_item", true); + re.set_state(blanket, "shiny_bauble", true); + REQUIRE(blanket.is_combined()); + re.plan(blanket); fmt::println("\n\n------------ TEST WILL DO LARGE DAMAGE BOOST"); - ritual.dump(); + blanket.dump(); } -TEST_CASE("rituals can be finalized for the end result", "[rituals]") { +TEST_CASE("blanket can be finalized for the end result", "[rituals]") { RitualEngine re("assets/rituals.json"); - auto plan = re.start(); + auto blanket = re.start(); - re.set_state(plan, "has_magick", true); - re.set_state(plan, "cursed_item", true); - re.set_state(plan, "shiny_bauble", true); - re.plan(plan); + re.set_state(blanket, "has_magick", true); + re.set_state(blanket, "cursed_item", true); + re.set_state(blanket, "shiny_bauble", true); + re.plan(blanket); + REQUIRE(blanket.is_combined()); fmt::println("\n\n------------ CYCLES AVOIDED"); - plan.dump(); + blanket.dump(); - auto action = re.finalize(plan); - action.dump(); + auto ritual = re.finalize(blanket); + ritual.dump(); } TEST_CASE("the ritual belt works", "[rituals-belt]") { RitualBelt the_belt; RitualEngine re("assets/rituals.json"); - auto plan = re.start(); + auto blanket = re.start(); - re.set_state(plan, "has_magick", true); - re.plan(plan); + re.set_state(blanket, "has_magick", true); + re.plan(blanket); + REQUIRE(blanket.is_combined()); + blanket.dump(); { - auto action = re.finalize(plan); - the_belt.equip(0, action); + auto ritual = re.finalize(blanket); + the_belt.equip(0, ritual); REQUIRE(the_belt.has(0)); } { - auto action = the_belt.get(0); - action.dump(); + auto ritual = the_belt.get(0); + ritual.dump(); } { @@ -90,3 +96,19 @@ TEST_CASE("the ritual belt works", "[rituals-belt]") { REQUIRE(!the_belt.has(0)); } } + + +TEST_CASE("LevelManager makes a temp belt", "[rituals-belt]") { + LevelManager lm; + lm.temp_create_player_rituals(); + auto& level = lm.current(); + auto& the_belt = level.world->get(level.player); + + REQUIRE(the_belt.has(0)); + auto& ritual = the_belt.get(0); + REQUIRE(ritual.damage > 0); + + REQUIRE(the_belt.has(1)); + ritual = the_belt.get(1); + REQUIRE(ritual.damage > 1); +} diff --git a/worldbuilder.cpp b/worldbuilder.cpp index b461d5f..1a8a6da 100644 --- a/worldbuilder.cpp +++ b/worldbuilder.cpp @@ -4,6 +4,7 @@ #include #include "components.hpp" #include "inventory.hpp" +#include "rituals.hpp" using namespace fmt; using namespace components; @@ -257,6 +258,7 @@ void WorldBuilder::place_entities(DinkyECS::World &world) { // configure player in the world Player player{player_ent}; world.set_the(player); + world.set(player.entity, {}); world.set(player.entity, {5}); world.make_constant(player.entity); }