diff --git a/src/algo.cpp b/src/algo.cpp index c08b0438a68..023a2506cb0 100644 --- a/src/algo.cpp +++ b/src/algo.cpp @@ -112,8 +112,7 @@ int CalcSkillToHit(const Game_Battler& source, const Game_Battler& target, const // RPG_RT BUG: rm2k3 editor doesn't let you set the failure message for skills, and so you can't make them physical type anymore. // Despite that, RPG_RT still checks the flag and run the below code? - if (skill.failure_message != 3 - || (skill.scope != lcf::rpg::Skill::Scope_enemy && skill.scope != lcf::rpg::Skill::Scope_enemies)) { + if (skill.failure_message != 3 || SkillTargetsAllies(skill)) { return to_hit; } @@ -225,9 +224,7 @@ int CalcSkillEffect(const Game_Battler& source, effect += skill.physical_rate * source.GetAtk() / 20; effect += skill.magical_rate * source.GetSpi() / 40; - if ((skill.scope == lcf::rpg::Skill::Scope_enemy - || skill.scope == lcf::rpg::Skill::Scope_enemies) - && !skill.ignore_defense) { + if (SkillTargetsEnemies(skill) && !skill.ignore_defense) { effect -= skill.physical_rate * target.GetDef() / 40; effect -= skill.magical_rate * target.GetSpi() / 80; } @@ -285,8 +282,7 @@ bool IsSkillUsable(const lcf::rpg::Skill& skill, return true; } - if (skill.scope == lcf::rpg::Skill::Scope_enemy - || skill.scope == lcf::rpg::Skill::Scope_enemies) { + if (SkillTargetsEnemies(skill)) { return false; } diff --git a/src/autobattle.cpp b/src/autobattle.cpp index ddb8804d2b9..75ee8e6eade 100644 --- a/src/autobattle.cpp +++ b/src/autobattle.cpp @@ -88,8 +88,8 @@ static int CalcSkillCostAutoBattle(const Game_Actor& source, const lcf::rpg::Ski } double CalcSkillHealAutoBattleTargetRank(const Game_Actor& source, const Game_Battler& target, const lcf::rpg::Skill& skill, bool apply_variance, bool emulate_bugs) { - assert(skill.type == lcf::rpg::Skill::Type_normal || skill.type >= lcf::rpg::Skill::Type_subskill); - assert(skill.scope == lcf::rpg::Skill::Scope_self || skill.scope == lcf::rpg::Skill::Scope_ally || skill.scope == lcf::rpg::Skill::Scope_party); + assert(Algo::IsNormalOrSubskill(skill)); + assert(Algo::SkillTargetsAllies(skill)); const double src_max_sp = source.GetMaxSp(); const double tgt_max_hp = target.GetMaxHp(); @@ -124,8 +124,8 @@ double CalcSkillHealAutoBattleTargetRank(const Game_Actor& source, const Game_Ba } double CalcSkillDmgAutoBattleTargetRank(const Game_Actor& source, const Game_Battler& target, const lcf::rpg::Skill& skill, bool apply_variance, bool emulate_bugs) { - assert(skill.type == lcf::rpg::Skill::Type_normal || skill.type >= lcf::rpg::Skill::Type_subskill); - assert(skill.scope == lcf::rpg::Skill::Scope_enemy || skill.scope == lcf::rpg::Skill::Scope_enemies); + assert(Algo::IsNormalOrSubskill(skill)); + assert(Algo::SkillTargetsEnemies(skill)); (void)emulate_bugs; if (!(skill.affect_hp && target.Exists())) { @@ -164,7 +164,7 @@ double CalcSkillAutoBattleRank(const Game_Actor& source, const lcf::rpg::Skill& if (!source.IsSkillUsable(skill.ID)) { return 0.0; } - if (skill.type != lcf::rpg::Skill::Type_normal && skill.type < lcf::rpg::Skill::Type_subskill) { + if (!Algo::IsNormalOrSubskill(skill)) { return 0.0; } diff --git a/src/game_battlealgorithm.cpp b/src/game_battlealgorithm.cpp index f5782580e8f..b713af93a26 100644 --- a/src/game_battlealgorithm.cpp +++ b/src/game_battlealgorithm.cpp @@ -1136,10 +1136,7 @@ bool Game_BattleAlgorithm::Skill::Execute() { auto* target = GetTarget(); - this->healing = - skill.scope == lcf::rpg::Skill::Scope_ally || - skill.scope == lcf::rpg::Skill::Scope_party || - skill.scope == lcf::rpg::Skill::Scope_self; + this->healing = Algo::SkillTargetsAllies(skill); this->revived = this->healing && !skill.state_effects.empty() diff --git a/tests/algo.cpp b/tests/algo.cpp index a1f7c8ffe31..00138bb1eba 100644 --- a/tests/algo.cpp +++ b/tests/algo.cpp @@ -1009,4 +1009,55 @@ TEST_CASE("SkillCost") { } } +TEST_CASE("SkillTargets") { + const MockActor m; + + auto* skill = MakeDBSkill(1, 90, 0, 0, 0, 0); + + skill->scope = lcf::rpg::Skill::Scope_enemy; + REQUIRE(Algo::SkillTargetsEnemies(*skill)); + REQUIRE_FALSE(Algo::SkillTargetsAllies(*skill)); + + skill->scope = lcf::rpg::Skill::Scope_enemies; + REQUIRE(Algo::SkillTargetsEnemies(*skill)); + REQUIRE_FALSE(Algo::SkillTargetsAllies(*skill)); + + skill->scope = lcf::rpg::Skill::Scope_self; + REQUIRE_FALSE(Algo::SkillTargetsEnemies(*skill)); + REQUIRE(Algo::SkillTargetsAllies(*skill)); + + skill->scope = lcf::rpg::Skill::Scope_ally; + REQUIRE_FALSE(Algo::SkillTargetsEnemies(*skill)); + REQUIRE(Algo::SkillTargetsAllies(*skill)); + + skill->scope = lcf::rpg::Skill::Scope_party; + REQUIRE_FALSE(Algo::SkillTargetsEnemies(*skill)); + REQUIRE(Algo::SkillTargetsAllies(*skill)); +} + +TEST_CASE("SkillTypes") { + const MockActor m; + + auto* skill = MakeDBSkill(1, 90, 0, 0, 0, 0); + + skill->type = lcf::rpg::Skill::Type_normal; + REQUIRE(Algo::IsNormalOrSubskill(*skill)); + + skill->type = lcf::rpg::Skill::Type_teleport; + REQUIRE_FALSE(Algo::IsNormalOrSubskill(*skill)); + + skill->type = lcf::rpg::Skill::Type_escape; + REQUIRE_FALSE(Algo::IsNormalOrSubskill(*skill)); + + skill->type = lcf::rpg::Skill::Type_switch; + REQUIRE_FALSE(Algo::IsNormalOrSubskill(*skill)); + + skill->type = lcf::rpg::Skill::Type_subskill; + REQUIRE(Algo::IsNormalOrSubskill(*skill)); + + skill->type = lcf::rpg::Skill::Type_subskill + 1; + REQUIRE(Algo::IsNormalOrSubskill(*skill)); + +} + TEST_SUITE_END();