From 0e2f213871b5d020d5115b486f1e7911db3cd861 Mon Sep 17 00:00:00 2001 From: "Zed A. Shaw" Date: Mon, 7 Apr 2025 14:02:32 -0400 Subject: [PATCH] Added in a new art for a 'gold savior' and refined the battle engine more but it's not quite what I want. --- assets/ai.json | 4 ++-- assets/config.json | 5 +++++ assets/gold_savior-256.png | Bin 0 -> 49220 bytes battle.cpp | 35 ++++++++++++++++++++++++++++------- battle.hpp | 22 +++++++++++++++++----- systems.cpp | 16 ++++++++++------ tests/battle.cpp | 36 +++++++++++++++++++++++++----------- 7 files changed, 87 insertions(+), 31 deletions(-) create mode 100644 assets/gold_savior-256.png diff --git a/assets/ai.json b/assets/ai.json index 7762e01..c58acb7 100644 --- a/assets/ai.json +++ b/assets/ai.json @@ -79,7 +79,6 @@ ], "states": { "Host::initial_state": { - "tough_personality": true, "enemy_found": false, "enemy_dead": false, "health_good": true, @@ -88,7 +87,8 @@ "in_combat": false, "have_item": false, "have_healing": false, - "detect_enemy": true + "detect_enemy": true, + "tough_personality": true }, "Host::final_state": { "enemy_found": true, diff --git a/assets/config.json b/assets/config.json index 59bf92e..ac5067a 100644 --- a/assets/config.json +++ b/assets/config.json @@ -20,6 +20,11 @@ "ambient_1": "assets/sounds/ambient_1.ogg" }, "sprites": { + "gold_savior": + {"path": "assets/gold_savior-256.png", + "frame_width": 256, + "frame_height": 256 + }, "armored_knight": {"path": "assets/armored_knight_1-256.png", "frame_width": 256, diff --git a/assets/gold_savior-256.png b/assets/gold_savior-256.png new file mode 100644 index 0000000000000000000000000000000000000000..c2da3eb0fb5dd3c1f824f3b3b8ef03f9d59ec5c7 GIT binary patch literal 49220 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 literal 0 HcmV?d00001 diff --git a/battle.cpp b/battle.cpp index 4d46d88..e6066e7 100644 --- a/battle.cpp +++ b/battle.cpp @@ -2,7 +2,7 @@ #include "battle.hpp" namespace combat { - void BattleEngine::add_enemy(BattleAction enemy) { + void BattleEngine::add_enemy(Combatant enemy) { combatants.try_emplace(enemy.entity, enemy); } @@ -10,19 +10,22 @@ namespace combat { int active = 0; for(auto& [entity, enemy] : combatants) { - enemy.ai.set_state("enemy_found", true); - enemy.ai.set_state("in_combat", true); enemy.ai.update(); - active += enemy.ai.active(); - // yes, copy it out of the combatants list - pending_actions.push_back(enemy); + + if(enemy.ai.active()) { + if(enemy.ai.wants_to("kill_enemy")) { + pending_actions.emplace_back(enemy, BattleAction::ATTACK); + } else if(enemy.ai.wants_to("run_away")) { + pending_actions.emplace_back(enemy, BattleAction::ESCAPE); + } + } } return active > 0; } - std::optional BattleEngine::next() { + std::optional BattleEngine::next() { if(pending_actions.size() == 0) return std::nullopt; auto ba = pending_actions.back(); @@ -36,4 +39,22 @@ namespace combat { enemy.ai.dump(); } } + + void BattleEngine::set(DinkyECS::Entity entity, std::string state, bool setting) { + dbc::check(combatants.contains(entity), "invalid combatant given to BattleEngine"); + auto& action = combatants.at(entity); + action.ai.set_state(state, setting); + } + + void BattleEngine::set_all(std::string state, bool setting) { + for(auto& [ent, action] : combatants) { + action.ai.set_state(state, setting); + } + } + + void BattleEngine::queue(DinkyECS::Entity entity, BattleAction action) { + dbc::check(combatants.contains(entity), "invalid combatant given to BattleEngine"); + auto& enemy = combatants.at(entity); + pending_actions.emplace_back(enemy, action); + } } diff --git a/battle.hpp b/battle.hpp index d9ebb64..2aeb6f5 100644 --- a/battle.hpp +++ b/battle.hpp @@ -7,19 +7,31 @@ namespace combat { - struct BattleAction { + struct Combatant { DinkyECS::Entity entity; ai::EntityAI &ai; components::Combat &combat; }; + enum class BattleAction { + ATTACK, BLOCK, ESCAPE + }; + + struct BattleResult { + Combatant &state; + BattleAction action; + }; + struct BattleEngine { - std::unordered_map combatants; - std::vector pending_actions; + std::unordered_map combatants; + std::vector pending_actions; - void add_enemy(BattleAction ba); + void add_enemy(Combatant ba); bool plan(); - std::optional next(); + std::optional next(); void dump(); + void set(DinkyECS::Entity entity, std::string state, bool setting); + void set_all(std::string state, bool setting); + void queue(DinkyECS::Entity entity, BattleAction action); }; } diff --git a/systems.cpp b/systems.cpp index cf92fbf..d06588b 100644 --- a/systems.cpp +++ b/systems.cpp @@ -223,20 +223,24 @@ void System::combat(GameLevel &level) { } } + battle.set_all("enemy_found", true); + battle.set_all("in_combat", true); battle.plan(); } - while(auto enemy = battle.next()) { + while(auto act = battle.next()) { + auto [enemy, action] = *act; + Events::Combat result { - player_combat.attack(enemy->combat), 0 + player_combat.attack(enemy.combat), 0 }; - if(enemy->ai.wants_to("kill_enemy")) { - result.enemy_did = enemy->combat.attack(player_combat); - animate_entity(world, enemy->entity); + if(enemy.ai.wants_to("kill_enemy")) { + result.enemy_did = enemy.combat.attack(player_combat); + animate_entity(world, enemy.entity); } - world.send(Events::GUI::COMBAT, enemy->entity, result); + world.send(Events::GUI::COMBAT, enemy.entity, result); } } diff --git a/tests/battle.cpp b/tests/battle.cpp index 6eb4f4b..c98d25e 100644 --- a/tests/battle.cpp +++ b/tests/battle.cpp @@ -13,31 +13,45 @@ TEST_CASE("battle operations fantasy", "[combat-battle]") { auto ai_start = ai::load_state("Enemy::initial_state"); auto ai_goal = ai::load_state("Enemy::final_state"); + auto host_start = ai::load_state("Host::initial_state"); + auto host_goal = ai::load_state("Host::final_state"); BattleEngine battle; - DinkyECS::Entity axe_ranger = 0; + DinkyECS::Entity player = 0; + ai::EntityAI player_ai("Host::actions", host_start, host_goal); + components::Combat player_combat{100, 100, 20}; + battle.add_enemy({player, player_ai, player_combat}); + + DinkyECS::Entity axe_ranger = 1; ai::EntityAI axe_ai("Enemy::actions", ai_start, ai_goal); - axe_ai.set_state("tough_personality", true); - axe_ai.set_state("health_good", true); components::Combat axe_combat{100, 100, 20}; battle.add_enemy({axe_ranger, axe_ai, axe_combat}); - DinkyECS::Entity rat = 1; + DinkyECS::Entity rat = 2; ai::EntityAI rat_ai("Enemy::actions", ai_start, ai_goal); - rat_ai.set_state("tough_personality", false); - rat_ai.set_state("health_good", true); components::Combat rat_combat{10, 10, 2}; battle.add_enemy({rat, rat_ai, rat_combat}); + battle.set_all("enemy_found", true); + battle.set_all("in_combat", true); + battle.set_all("tough_personality", true); + battle.set_all("health_good", true); + battle.set(rat, "tough_personality", false); + + battle.queue(player, BattleAction::ATTACK); + battle.queue(player, BattleAction::BLOCK); + + battle.queue(player, BattleAction::ESCAPE); + battle.plan(); while(auto act = battle.next()) { - auto& [entity, enemy_ai, combat] = *act; + auto& [enemy, action] = *act; - fmt::println("entity: {} wants to {} and has {} HP and {} damage", - entity, - enemy_ai.wants_to(), - combat.hp, combat.damage); + fmt::println("entity: {} wants to {} action={} and has {} HP and {} damage", + enemy.entity, enemy.ai.wants_to(), + int(action), enemy.combat.hp, + enemy.combat.damage); } REQUIRE(!battle.next());