mirror of
https://github.com/EasyRPG/Player.git
synced 2026-10-25 15:57:14 +00:00
389 lines
12 KiB
C++
389 lines
12 KiB
C++
#include "test_mock_actor.h"
|
|
#include "attribute.h"
|
|
#include "doctest.h"
|
|
#include "utils.h"
|
|
|
|
static Game_Actor MakeActor(int id) {
|
|
return Game_Actor(id);
|
|
}
|
|
|
|
static lcf::DBBitArray MakeAttributeSet(std::initializer_list<bool> v = {}) {
|
|
auto a = lcf::DBBitArray(lcf::Data::attributes.size());
|
|
int idx = 0;
|
|
for (auto b: v) {
|
|
a[idx++] = b;
|
|
}
|
|
return a;
|
|
}
|
|
|
|
TEST_SUITE_BEGIN("Attribute");
|
|
|
|
TEST_CASE("Rate") {
|
|
const MockActor m;
|
|
|
|
MakeDBAttribute(1, lcf::rpg::Attribute::Type_physical, 1, -2, 3, -4, 5);
|
|
MakeDBAttribute(2, lcf::rpg::Attribute::Type_magical, -6, 7, -8, 9, -10);
|
|
|
|
SUBCASE("phys") {
|
|
REQUIRE_EQ(Attribute::GetAttributeRateModifier(1, 0), 1);
|
|
REQUIRE_EQ(Attribute::GetAttributeRateModifier(1, 1), -2);
|
|
REQUIRE_EQ(Attribute::GetAttributeRateModifier(1, 2), 3);
|
|
REQUIRE_EQ(Attribute::GetAttributeRateModifier(1, 3), -4);
|
|
REQUIRE_EQ(Attribute::GetAttributeRateModifier(1, 4), 5);
|
|
}
|
|
|
|
SUBCASE("mag") {
|
|
REQUIRE_EQ(Attribute::GetAttributeRateModifier(2, 0), -6);
|
|
REQUIRE_EQ(Attribute::GetAttributeRateModifier(2, 1), 7);
|
|
REQUIRE_EQ(Attribute::GetAttributeRateModifier(2, 2), -8);
|
|
REQUIRE_EQ(Attribute::GetAttributeRateModifier(2, 3), 9);
|
|
REQUIRE_EQ(Attribute::GetAttributeRateModifier(2, 4), -10);
|
|
}
|
|
|
|
SUBCASE("badrate") {
|
|
REQUIRE_EQ(Attribute::GetAttributeRateModifier(1, -1), 0);
|
|
REQUIRE_EQ(Attribute::GetAttributeRateModifier(1, 5), 0);
|
|
REQUIRE_EQ(Attribute::GetAttributeRateModifier(2, -1), 0);
|
|
REQUIRE_EQ(Attribute::GetAttributeRateModifier(2, 5), 0);
|
|
}
|
|
|
|
SUBCASE("badid") {
|
|
REQUIRE_EQ(Attribute::GetAttributeRateModifier(-1, 0), 0);
|
|
REQUIRE_EQ(Attribute::GetAttributeRateModifier(0, 0), 0);
|
|
REQUIRE_EQ(Attribute::GetAttributeRateModifier(INT_MAX, 0), 0);
|
|
}
|
|
}
|
|
|
|
template <typename... Args>
|
|
auto MakeAttributeSetArray(const Args*... args) {
|
|
return Utils::MakeArray<const lcf::DBBitArray*>(args...);
|
|
}
|
|
|
|
TEST_CASE("ApplyMultiplerDefault") {
|
|
const MockActor m;
|
|
|
|
const auto& target = MakeActor(1);
|
|
|
|
auto as0 = MakeAttributeSet();
|
|
auto as1 = MakeAttributeSet();
|
|
|
|
SUBCASE("0") {
|
|
REQUIRE_EQ(Attribute::ApplyAttributeMultiplier(100, target, {}), 100);
|
|
}
|
|
|
|
SUBCASE("1") {
|
|
auto sets = MakeAttributeSetArray(&as0);
|
|
REQUIRE_EQ(Attribute::ApplyAttributeMultiplier(100, target, MakeSpan(sets)), 100);
|
|
}
|
|
|
|
SUBCASE("2") {
|
|
auto sets = MakeAttributeSetArray(&as0, &as1);
|
|
REQUIRE_EQ(Attribute::ApplyAttributeMultiplier(100, target, MakeSpan(sets)), 100);
|
|
}
|
|
}
|
|
|
|
void testSingle(int type) {
|
|
MakeDBAttribute(1, type, -100, 200, 100, 50, 0);
|
|
auto as0 = MakeAttributeSet({ true });
|
|
auto sets = MakeAttributeSetArray(&as0);
|
|
|
|
SUBCASE("0") {
|
|
SetDBActorAttribute(1, 1, 0);
|
|
const auto& target = MakeActor(1);
|
|
|
|
REQUIRE_EQ(Attribute::ApplyAttributeMultiplier(100, target, sets), -100);
|
|
}
|
|
|
|
SUBCASE("1") {
|
|
SetDBActorAttribute(1, 1, 1);
|
|
const auto& target = MakeActor(1);
|
|
|
|
REQUIRE_EQ(Attribute::ApplyAttributeMultiplier(100, target, sets), 200);
|
|
}
|
|
|
|
SUBCASE("2") {
|
|
SetDBActorAttribute(1, 1, 2);
|
|
const auto& target = MakeActor(1);
|
|
|
|
REQUIRE_EQ(Attribute::ApplyAttributeMultiplier(100, target, sets), 100);
|
|
}
|
|
|
|
SUBCASE("3") {
|
|
SetDBActorAttribute(1, 1, 3);
|
|
const auto& target = MakeActor(1);
|
|
|
|
REQUIRE_EQ(Attribute::ApplyAttributeMultiplier(100, target, sets), 50);
|
|
}
|
|
|
|
SUBCASE("4") {
|
|
SetDBActorAttribute(1, 1, 4);
|
|
const auto& target = MakeActor(1);
|
|
|
|
REQUIRE_EQ(Attribute::ApplyAttributeMultiplier(100, target, sets), 0);
|
|
}
|
|
}
|
|
|
|
TEST_CASE("ApplyMultiplerSingle") {
|
|
const MockActor m;
|
|
|
|
SUBCASE("phys") {
|
|
testSingle(lcf::rpg::Attribute::Type_physical);
|
|
}
|
|
|
|
SUBCASE("mag") {
|
|
testSingle(lcf::rpg::Attribute::Type_magical);
|
|
}
|
|
}
|
|
|
|
void testMaxMulti(int type) {
|
|
for (int i = 0; i < 5; ++i) {
|
|
MakeDBAttribute(i + 1, type, -100, 200, 100, 50, 0);
|
|
}
|
|
|
|
|
|
SUBCASE("all") {
|
|
SetDBActorAttribute(1, 1, 0);
|
|
SetDBActorAttribute(1, 2, 1);
|
|
SetDBActorAttribute(1, 3, 2);
|
|
SetDBActorAttribute(1, 4, 3);
|
|
SetDBActorAttribute(1, 5, 4);
|
|
|
|
auto as0 = MakeAttributeSet({ true, true, true, true, true });
|
|
auto sets = MakeAttributeSetArray(&as0);
|
|
const auto& target = MakeActor(1);
|
|
|
|
REQUIRE_EQ(Attribute::ApplyAttributeMultiplier(100, target, sets), 200);
|
|
}
|
|
|
|
SUBCASE("0") {
|
|
SetDBActorAttribute(1, 1, 0);
|
|
SetDBActorAttribute(1, 2, 4);
|
|
|
|
auto as0 = MakeAttributeSet({ true, true });
|
|
auto sets = MakeAttributeSetArray(&as0);
|
|
const auto& target = MakeActor(1);
|
|
|
|
REQUIRE_EQ(Attribute::ApplyAttributeMultiplier(100, target, sets), 0);
|
|
}
|
|
|
|
SUBCASE("neg") {
|
|
SetDBActorAttribute(1, 3, 0);
|
|
|
|
auto as0 = MakeAttributeSet({ false, false, true });
|
|
auto sets = MakeAttributeSetArray(&as0);
|
|
const auto& target = MakeActor(1);
|
|
|
|
REQUIRE_EQ(Attribute::ApplyAttributeMultiplier(100, target, sets), -100);
|
|
}
|
|
}
|
|
|
|
TEST_CASE("ApplyMultiplerMaxMulti") {
|
|
const MockActor m;
|
|
|
|
SUBCASE("phys") {
|
|
testMaxMulti(lcf::rpg::Attribute::Type_physical);
|
|
}
|
|
|
|
SUBCASE("mag") {
|
|
testMaxMulti(lcf::rpg::Attribute::Type_magical);
|
|
}
|
|
}
|
|
|
|
TEST_CASE("ApplyComboPos") {
|
|
const MockActor m;
|
|
|
|
MakeDBAttribute(1, lcf::rpg::Attribute::Type_physical, -100, 200, 100, 50, 0);
|
|
MakeDBAttribute(2, lcf::rpg::Attribute::Type_magical, -100, 200, 100, 50, 0);
|
|
|
|
auto as0 = MakeAttributeSet({ true, true });
|
|
auto sets = MakeAttributeSetArray(&as0);
|
|
|
|
SUBCASE("100_100") {
|
|
SetDBActorAttribute(1, 1, 2);
|
|
SetDBActorAttribute(1, 2, 2);
|
|
|
|
const auto& target = MakeActor(1);
|
|
REQUIRE_EQ(Attribute::ApplyAttributeMultiplier(100, target, sets), 100);
|
|
}
|
|
|
|
SUBCASE("200_100") {
|
|
SetDBActorAttribute(1, 1, 1);
|
|
SetDBActorAttribute(1, 2, 2);
|
|
|
|
const auto& target = MakeActor(1);
|
|
REQUIRE_EQ(Attribute::ApplyAttributeMultiplier(100, target, sets), 200);
|
|
}
|
|
|
|
SUBCASE("50_100") {
|
|
SetDBActorAttribute(1, 1, 3);
|
|
SetDBActorAttribute(1, 2, 2);
|
|
|
|
const auto& target = MakeActor(1);
|
|
REQUIRE_EQ(Attribute::ApplyAttributeMultiplier(100, target, sets), 50);
|
|
}
|
|
|
|
SUBCASE("50_0") {
|
|
SetDBActorAttribute(1, 1, 3);
|
|
SetDBActorAttribute(1, 2, 4);
|
|
|
|
const auto& target = MakeActor(1);
|
|
REQUIRE_EQ(Attribute::ApplyAttributeMultiplier(100, target, sets), 0);
|
|
}
|
|
|
|
SUBCASE("200_50") {
|
|
SetDBActorAttribute(1, 1, 1);
|
|
SetDBActorAttribute(1, 2, 3);
|
|
|
|
const auto& target = MakeActor(1);
|
|
REQUIRE_EQ(Attribute::ApplyAttributeMultiplier(100, target, sets), 100);
|
|
}
|
|
}
|
|
|
|
TEST_CASE("ApplyComboNeg2k3") {
|
|
const MockActor m(Player::EngineRpg2k3);
|
|
|
|
MakeDBAttribute(1, lcf::rpg::Attribute::Type_physical, -100, -50, 100, 50, 0);
|
|
MakeDBAttribute(2, lcf::rpg::Attribute::Type_magical, -100, -50, 100, 50, 0);
|
|
|
|
auto as0 = MakeAttributeSet({ true, true });
|
|
auto sets = MakeAttributeSetArray(&as0);
|
|
|
|
SUBCASE("-100_-50") {
|
|
SetDBActorAttribute(1, 1, 0);
|
|
SetDBActorAttribute(1, 2, 1);
|
|
|
|
const auto& target = MakeActor(1);
|
|
REQUIRE_EQ(Attribute::ApplyAttributeMultiplier(100, target, sets), -50);
|
|
}
|
|
|
|
SUBCASE("-100_50") {
|
|
SetDBActorAttribute(1, 1, 0);
|
|
SetDBActorAttribute(1, 2, 3);
|
|
|
|
const auto& target = MakeActor(1);
|
|
REQUIRE_EQ(Attribute::ApplyAttributeMultiplier(100, target, sets), 50);
|
|
}
|
|
|
|
SUBCASE("-100_0") {
|
|
SetDBActorAttribute(1, 1, 0);
|
|
SetDBActorAttribute(1, 2, 4);
|
|
|
|
const auto& target = MakeActor(1);
|
|
REQUIRE_EQ(Attribute::ApplyAttributeMultiplier(100, target, sets), 0);
|
|
}
|
|
}
|
|
|
|
TEST_CASE("ApplyComboNeg2k") {
|
|
const MockActor m(Player::EngineRpg2k);
|
|
|
|
MakeDBAttribute(1, lcf::rpg::Attribute::Type_physical, -100, -50, 100, 50, 0);
|
|
MakeDBAttribute(2, lcf::rpg::Attribute::Type_magical, -100, -50, 100, 50, 0);
|
|
|
|
auto as0 = MakeAttributeSet({ true, true });
|
|
auto sets = MakeAttributeSetArray(&as0);
|
|
|
|
SUBCASE("-100_-50") {
|
|
SetDBActorAttribute(1, 1, 0);
|
|
SetDBActorAttribute(1, 2, 1);
|
|
|
|
const auto& target = MakeActor(1);
|
|
REQUIRE_EQ(Attribute::ApplyAttributeMultiplier(100, target, sets), 100);
|
|
}
|
|
|
|
SUBCASE("-100_50") {
|
|
SetDBActorAttribute(1, 1, 0);
|
|
SetDBActorAttribute(1, 2, 3);
|
|
|
|
const auto& target = MakeActor(1);
|
|
REQUIRE_EQ(Attribute::ApplyAttributeMultiplier(100, target, sets), 50);
|
|
}
|
|
|
|
SUBCASE("-100_0") {
|
|
SetDBActorAttribute(1, 1, 0);
|
|
SetDBActorAttribute(1, 2, 4);
|
|
|
|
const auto& target = MakeActor(1);
|
|
REQUIRE_EQ(Attribute::ApplyAttributeMultiplier(100, target, sets), 0);
|
|
}
|
|
}
|
|
|
|
TEST_CASE("Skill") {
|
|
const MockActor m(Player::EngineRpg2k);
|
|
auto* s0 = MakeDBSkill(1, 100, 1, 0, 0, 0);
|
|
SetDBSkillAttribute(1, 1, true);
|
|
auto* s1 = MakeDBSkill(2, 100, 1, 0, 0, 0);
|
|
|
|
MakeDBAttribute(1, lcf::rpg::Attribute::Type_physical, 300, 300, 300, 300, 300);
|
|
const auto& target = MakeActor(1);
|
|
|
|
SUBCASE("affect") {
|
|
REQUIRE_EQ(Attribute::ApplyAttributeSkillMultiplier(100, target, *s0), 300);
|
|
}
|
|
|
|
SUBCASE("none") {
|
|
REQUIRE_EQ(Attribute::ApplyAttributeSkillMultiplier(100, target, *s1), 100);
|
|
}
|
|
}
|
|
|
|
TEST_CASE("NormalAttack") {
|
|
const MockActor m(Player::EngineRpg2k);
|
|
|
|
MakeDBAttribute(1, lcf::rpg::Attribute::Type_physical, 300, 300, 300, 300, 300);
|
|
MakeDBAttribute(2, lcf::rpg::Attribute::Type_physical, 200, 200, 200, 200, 200);
|
|
|
|
MakeDBEquip(1, lcf::rpg::Item::Type_weapon);
|
|
SetDBItemAttribute(1, 1, true);
|
|
MakeDBEquip(2, lcf::rpg::Item::Type_weapon);
|
|
SetDBItemAttribute(2, 2, true);
|
|
MakeDBEquip(3, lcf::rpg::Item::Type_weapon);
|
|
MakeDBEquip(4, lcf::rpg::Item::Type_shield);
|
|
SetDBItemAttribute(1, 4, true);
|
|
|
|
lcf::Data::actors[1].two_weapon = true;
|
|
auto source = MakeActor(2);
|
|
const auto& target = MakeActor(1);
|
|
|
|
SUBCASE("none") {
|
|
REQUIRE_EQ(Attribute::ApplyAttributeNormalAttackMultiplier(100, source, target, Game_Battler::WeaponAll), 100);
|
|
REQUIRE_EQ(Attribute::ApplyAttributeNormalAttackMultiplier(100, source, target, Game_Battler::WeaponNone), 100);
|
|
REQUIRE_EQ(Attribute::ApplyAttributeNormalAttackMultiplier(100, source, target, Game_Battler::WeaponPrimary), 100);
|
|
REQUIRE_EQ(Attribute::ApplyAttributeNormalAttackMultiplier(100, source, target, Game_Battler::WeaponSecondary), 100);
|
|
}
|
|
|
|
SUBCASE("primary") {
|
|
source.SetEquipment(1, 1);
|
|
REQUIRE_EQ(Attribute::ApplyAttributeNormalAttackMultiplier(100, source, target, Game_Battler::WeaponAll), 300);
|
|
REQUIRE_EQ(Attribute::ApplyAttributeNormalAttackMultiplier(100, source, target, Game_Battler::WeaponNone), 100);
|
|
REQUIRE_EQ(Attribute::ApplyAttributeNormalAttackMultiplier(100, source, target, Game_Battler::WeaponPrimary), 300);
|
|
REQUIRE_EQ(Attribute::ApplyAttributeNormalAttackMultiplier(100, source, target, Game_Battler::WeaponSecondary), 100);
|
|
}
|
|
|
|
SUBCASE("secondary") {
|
|
source.SetEquipment(2, 2);
|
|
REQUIRE_EQ(Attribute::ApplyAttributeNormalAttackMultiplier(100, source, target, Game_Battler::WeaponAll), 200);
|
|
REQUIRE_EQ(Attribute::ApplyAttributeNormalAttackMultiplier(100, source, target, Game_Battler::WeaponNone), 100);
|
|
REQUIRE_EQ(Attribute::ApplyAttributeNormalAttackMultiplier(100, source, target, Game_Battler::WeaponPrimary), 100);
|
|
REQUIRE_EQ(Attribute::ApplyAttributeNormalAttackMultiplier(100, source, target, Game_Battler::WeaponSecondary), 200);
|
|
}
|
|
|
|
SUBCASE("dual") {
|
|
source.SetEquipment(1, 1);
|
|
source.SetEquipment(2, 2);
|
|
REQUIRE_EQ(Attribute::ApplyAttributeNormalAttackMultiplier(100, source, target, Game_Battler::WeaponAll), 300);
|
|
REQUIRE_EQ(Attribute::ApplyAttributeNormalAttackMultiplier(100, source, target, Game_Battler::WeaponNone), 100);
|
|
REQUIRE_EQ(Attribute::ApplyAttributeNormalAttackMultiplier(100, source, target, Game_Battler::WeaponPrimary), 300);
|
|
REQUIRE_EQ(Attribute::ApplyAttributeNormalAttackMultiplier(100, source, target, Game_Battler::WeaponSecondary), 200);
|
|
}
|
|
|
|
SUBCASE("shield") {
|
|
source.SetEquipment(2, 4);
|
|
REQUIRE_EQ(Attribute::ApplyAttributeNormalAttackMultiplier(100, source, target, Game_Battler::WeaponAll), 100);
|
|
REQUIRE_EQ(Attribute::ApplyAttributeNormalAttackMultiplier(100, source, target, Game_Battler::WeaponNone), 100);
|
|
REQUIRE_EQ(Attribute::ApplyAttributeNormalAttackMultiplier(100, source, target, Game_Battler::WeaponPrimary), 100);
|
|
REQUIRE_EQ(Attribute::ApplyAttributeNormalAttackMultiplier(100, source, target, Game_Battler::WeaponSecondary), 100);
|
|
}
|
|
}
|
|
|
|
TEST_SUITE_END();
|
|
|