From a342c53b0219c87d77e9899800d0ab2939846508 Mon Sep 17 00:00:00 2001 From: "Zed A. Shaw" Date: Thu, 24 Apr 2025 01:15:49 -0400 Subject: [PATCH] RitualEngine now uses the crafting results to create a description of the ritual's combat in a RitualAction struct. --- Makefile | 2 +- assets/rituals.json | 30 ++++++++++++++++++++++++++++++ rituals.cpp | 20 ++++++++++++++++++++ rituals.hpp | 11 +++++++++++ tests/rituals.cpp | 17 ++++++++++------- 5 files changed, 72 insertions(+), 8 deletions(-) diff --git a/Makefile b/Makefile index 562ac6d..3b482b3 100644 --- a/Makefile +++ b/Makefile @@ -22,7 +22,7 @@ tracy_build: meson compile -j 10 -C builddir test: build - ./builddir/runtests + ./builddir/runtests "[rituals-finalize]" run: build test powershell "cp ./builddir/zedcaster.exe ." diff --git a/assets/rituals.json b/assets/rituals.json index d3ea4d7..f19feb6 100644 --- a/assets/rituals.json +++ b/assets/rituals.json @@ -134,5 +134,35 @@ "boost_damage_large", "combined" ] + }, + "effects": { + "boost_magick": { + "damage": 10, + "probability": 1.0 + }, + "pierce_type": { + "damage": 11, + "probability": 1.1 + }, + "magick_type": { + "damage": 12, + "probability": 1.2 + }, + "heals_user": { + "damage": 13, + "probability": 1.3 + }, + "curses_user": { + "damage": 14, + "probability": 1.4 + }, + "boost_damage_large": { + "damage": 15, + "probability": 1.5 + }, + "combined": { + "damage": 16, + "probability": 1.6 + } } } diff --git a/rituals.cpp b/rituals.cpp index ab58008..e1ce39f 100644 --- a/rituals.cpp +++ b/rituals.cpp @@ -72,4 +72,24 @@ namespace combat { void RitualAI::dump() { ai::dump_script(script, start, plan.script); } + + RitualAction RitualEngine::finalize(RitualAI& ritual) { + (void)ritual; + + RitualAction result; + auto effects = $config["effects"]; + + for(auto action : ritual.plan.script) { + if(effects.contains(action.name)) { + auto& effect = effects[action.name]; + result.damage += int(effect["damage"]); + result.probability += float(effect["probability"]); + + fmt::println("ritual has action {} with damage {}, prob: {}", + action.name, result.damage, result.probability); + } + } + + return result; + } } diff --git a/rituals.hpp b/rituals.hpp index 559e3e7..743f1f6 100644 --- a/rituals.hpp +++ b/rituals.hpp @@ -25,6 +25,16 @@ namespace combat { ai::Action pop(); }; + enum class RitualElement { + FIRE, LIGHTNING, PHYSICAL + }; + + struct RitualAction { + float probability = 1.0f; + int damage = 0; + RitualElement element{RitualElement::FIRE}; + }; + struct RitualEngine { Config $config; ai::AIProfile $profile; @@ -40,5 +50,6 @@ namespace combat { void reset(RitualAI& ritual); void set_state(RitualAI& ritual, std::string name, bool setting); void plan(RitualAI& ritual); + RitualAction finalize(RitualAI& ritual); }; } diff --git a/tests/rituals.cpp b/tests/rituals.cpp index f904f92..f0e02d4 100644 --- a/tests/rituals.cpp +++ b/tests/rituals.cpp @@ -49,15 +49,18 @@ TEST_CASE("RitualEngine basic tests", "[rituals]") { ritual.dump(); } -TEST_CASE("confirm that cycles are avoided/detected", "[rituals]") { +TEST_CASE("rituals can be finalized for the end result", "[rituals-finalize]") { RitualEngine re("assets/rituals.json"); - auto ritual = re.start(); + auto plan = re.start(); - re.set_state(ritual, "has_magick", true); - re.set_state(ritual, "cursed_item", true); - re.set_state(ritual, "shiny_bauble", true); - re.plan(ritual); + re.set_state(plan, "has_magick", true); + re.set_state(plan, "cursed_item", true); + re.set_state(plan, "shiny_bauble", true); + re.plan(plan); fmt::println("\n\n------------ CYCLES AVOIDED"); - ritual.dump(); + plan.dump(); + + auto action = re.finalize(plan); + (void)action; }