RitualEngine now uses the crafting results to create a description of the ritual's combat in a RitualAction struct.

master
Zed A. Shaw 3 days ago
parent 43435509f6
commit a342c53b02
  1. 2
      Makefile
  2. 30
      assets/rituals.json
  3. 20
      rituals.cpp
  4. 11
      rituals.hpp
  5. 17
      tests/rituals.cpp

@ -22,7 +22,7 @@ tracy_build:
meson compile -j 10 -C builddir meson compile -j 10 -C builddir
test: build test: build
./builddir/runtests ./builddir/runtests "[rituals-finalize]"
run: build test run: build test
powershell "cp ./builddir/zedcaster.exe ." powershell "cp ./builddir/zedcaster.exe ."

@ -134,5 +134,35 @@
"boost_damage_large", "boost_damage_large",
"combined" "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
}
} }
} }

@ -72,4 +72,24 @@ namespace combat {
void RitualAI::dump() { void RitualAI::dump() {
ai::dump_script(script, start, plan.script); 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;
}
} }

@ -25,6 +25,16 @@ namespace combat {
ai::Action pop(); ai::Action pop();
}; };
enum class RitualElement {
FIRE, LIGHTNING, PHYSICAL
};
struct RitualAction {
float probability = 1.0f;
int damage = 0;
RitualElement element{RitualElement::FIRE};
};
struct RitualEngine { struct RitualEngine {
Config $config; Config $config;
ai::AIProfile $profile; ai::AIProfile $profile;
@ -40,5 +50,6 @@ namespace combat {
void reset(RitualAI& ritual); void reset(RitualAI& ritual);
void set_state(RitualAI& ritual, std::string name, bool setting); void set_state(RitualAI& ritual, std::string name, bool setting);
void plan(RitualAI& ritual); void plan(RitualAI& ritual);
RitualAction finalize(RitualAI& ritual);
}; };
} }

@ -49,15 +49,18 @@ TEST_CASE("RitualEngine basic tests", "[rituals]") {
ritual.dump(); 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"); RitualEngine re("assets/rituals.json");
auto ritual = re.start(); auto plan = re.start();
re.set_state(ritual, "has_magick", true); re.set_state(plan, "has_magick", true);
re.set_state(ritual, "cursed_item", true); re.set_state(plan, "cursed_item", true);
re.set_state(ritual, "shiny_bauble", true); re.set_state(plan, "shiny_bauble", true);
re.plan(ritual); re.plan(plan);
fmt::println("\n\n------------ CYCLES AVOIDED"); fmt::println("\n\n------------ CYCLES AVOIDED");
ritual.dump(); plan.dump();
auto action = re.finalize(plan);
(void)action;
} }

Loading…
Cancel
Save