diff --git a/CInterface/Library/AttackData.cpp b/CInterface/Library/AttackData.cpp index 02d1e21..de39ad6 100644 --- a/CInterface/Library/AttackData.cpp +++ b/CInterface/Library/AttackData.cpp @@ -19,7 +19,7 @@ export uint8_t CreatureLib_AttackData_Construct(AttackData*& out, const char* na } auto effect = - SecondaryEffect(effectChance, Arbutils::CaseInsensitiveConstString(effectName), effectParameterList); + new SecondaryEffect(effectChance, Arbutils::CaseInsensitiveConstString(effectName), effectParameterList); out = new AttackData(ConstString(name), type, category, power, accuracy, baseUsage, target, priority, effect, conversedFlags); @@ -43,11 +43,11 @@ SIMPLE_GET_FUNC(AttackData, GetPriority, int8_t); export bool CreatureLib_AttackData_HasSecondaryEffect(const AttackData* p) { return p->HasSecondaryEffect(); } export float CreatureLib_AttackData_GetSecondaryEffectChance(const AttackData* p) { - return p->GetSecondaryEffect().GetChance(); + return p->GetSecondaryEffect()->GetChance(); } export const char* CreatureLib_AttackData_GetSecondaryEffectName(const AttackData* p) { - return p->GetSecondaryEffect().GetEffectName().c_str(); + return p->GetSecondaryEffect()->GetEffectName().c_str(); } export bool CreatureLib_AttackData_HasFlag(const AttackData* p, const char* key) { diff --git a/src/Battling/Flow/TurnHandler.cpp b/src/Battling/Flow/TurnHandler.cpp index 6133450..ef423ad 100644 --- a/src/Battling/Flow/TurnHandler.cpp +++ b/src/Battling/Flow/TurnHandler.cpp @@ -172,11 +172,11 @@ void TurnHandler::HandleAttackForTarget(ExecutingAttack* attack, Creature* targe if (!preventSecondary) { auto effect = attackData->GetSecondaryEffect(); bool hasSecondaryEffect; - if (effect.GetChance() == -1) { + if (effect->GetChance() == -1) { hasSecondaryEffect = true; } else { hasSecondaryEffect = - user->GetBattle()->GetRandom()->EffectChance(effect.GetChance(), attack, target); + user->GetBattle()->GetRandom()->EffectChance(effect->GetChance(), attack, target); } if (hasSecondaryEffect) { HOOK(OnSecondaryEffect, userSource, attack, target, hitIndex); diff --git a/src/Battling/Library/MiscLibrary.cpp b/src/Battling/Library/MiscLibrary.cpp index 15db0f2..bb191e1 100644 --- a/src/Battling/Library/MiscLibrary.cpp +++ b/src/Battling/Library/MiscLibrary.cpp @@ -17,7 +17,7 @@ static CreatureLib::Library::AttackData* GetReplacementAttackData() { if (_replacementAttackData == nullptr) { _replacementAttackData = new CreatureLib::Library::AttackData( "replacement"_cnc, 0, CreatureLib::Library::AttackCategory::Physical, 30, 255, 255, - CreatureLib::Library::AttackTarget::Any, 0, CreatureLib::Library::SecondaryEffect(), {}); + CreatureLib::Library::AttackTarget::Any, 0, new CreatureLib::Library::SecondaryEffect(), {}); } return _replacementAttackData; } diff --git a/src/Battling/TurnChoices/AttackTurnChoice.hpp b/src/Battling/TurnChoices/AttackTurnChoice.hpp index dec018c..92be87c 100644 --- a/src/Battling/TurnChoices/AttackTurnChoice.hpp +++ b/src/Battling/TurnChoices/AttackTurnChoice.hpp @@ -23,10 +23,10 @@ namespace CreatureLib::Battling { if (battle != nullptr) { if (_attack->GetAttack()->HasSecondaryEffect()) { auto library = battle->GetLibrary(); - auto& effect = _attack->GetAttack()->GetSecondaryEffect(); - _attackScript = library->LoadScript(ScriptCategory::Attack, effect.GetEffectName()); + auto effect = _attack->GetAttack()->GetSecondaryEffect(); + _attackScript = library->LoadScript(ScriptCategory::Attack, effect->GetEffectName()); if (_attackScript != nullptr) { - _attackScript->OnInitialize(effect.GetParameters()); + _attackScript->OnInitialize(effect->GetParameters()); } } } diff --git a/src/Library/Attacks/AttackData.cpp b/src/Library/Attacks/AttackData.cpp index 5e1ac15..3760515 100644 --- a/src/Library/Attacks/AttackData.cpp +++ b/src/Library/Attacks/AttackData.cpp @@ -5,7 +5,7 @@ CreatureLib::Library::AttackData::AttackData(const ConstString& name, uint8_t ty CreatureLib::Library::AttackCategory category, uint8_t power, uint8_t accuracy, uint8_t baseUsage, CreatureLib::Library::AttackTarget target, int8_t priority, - SecondaryEffect effect, std::unordered_set flags) + const SecondaryEffect* effect, std::unordered_set flags) : _name(std::move(name)), _type(type), _category(category), _basePower(power), _accuracy(accuracy), _baseUsages(baseUsage), _target(target), _priority(priority), _effect(effect), _flags(std::move(flags)) {} diff --git a/src/Library/Attacks/AttackData.hpp b/src/Library/Attacks/AttackData.hpp index 22159ef..c8289ac 100644 --- a/src/Library/Attacks/AttackData.hpp +++ b/src/Library/Attacks/AttackData.hpp @@ -21,14 +21,14 @@ namespace CreatureLib::Library { uint8_t _baseUsages; AttackTarget _target; int8_t _priority; - SecondaryEffect _effect; + const SecondaryEffect* _effect; std::unordered_set _flags; public: AttackData(const ConstString& name, uint8_t type, AttackCategory category, uint8_t power, uint8_t accuracy, - uint8_t baseUsage, AttackTarget target, int8_t priority, SecondaryEffect effect, + uint8_t baseUsage, AttackTarget target, int8_t priority, const SecondaryEffect* effect, std::unordered_set flags); - virtual ~AttackData() = default; + virtual ~AttackData() { delete _effect; }; inline const ConstString& GetName() const noexcept { return _name; } inline const uint8_t GetType() const noexcept { return _type; } @@ -39,9 +39,9 @@ namespace CreatureLib::Library { inline AttackTarget GetTarget() const noexcept { return _target; } inline int8_t GetPriority() const noexcept { return _priority; } inline bool HasSecondaryEffect() const noexcept { - return _effect.GetChance() != 0 && _effect.GetEffectName() != ""_cnc; + return _effect->GetChance() != 0 && _effect->GetEffectName() != ""_cnc; } - inline const SecondaryEffect& GetSecondaryEffect() const noexcept { return _effect; } + inline const SecondaryEffect* GetSecondaryEffect() const noexcept { return _effect; } bool HasFlag(const ConstString& key) const noexcept; bool HasFlag(uint32_t keyHash) const noexcept; diff --git a/src/Library/Attacks/SecondaryEffect.hpp b/src/Library/Attacks/SecondaryEffect.hpp index 55f8732..ba64755 100644 --- a/src/Library/Attacks/SecondaryEffect.hpp +++ b/src/Library/Attacks/SecondaryEffect.hpp @@ -26,9 +26,11 @@ namespace CreatureLib::Library { } } - constexpr float GetChance() const noexcept { return _chance; } - constexpr const Arbutils::CaseInsensitiveConstString& GetEffectName() const noexcept { return _effectName; } - const List& GetParameters() const noexcept { return _parameters; } + constexpr inline float GetChance() const noexcept { return _chance; } + constexpr inline const Arbutils::CaseInsensitiveConstString& GetEffectName() const noexcept { + return _effectName; + } + const inline List& GetParameters() const noexcept { return _parameters; } }; } diff --git a/tests/TestLibrary/TestLibrary.cpp b/tests/TestLibrary/TestLibrary.cpp index e442d1b..53b8feb 100644 --- a/tests/TestLibrary/TestLibrary.cpp +++ b/tests/TestLibrary/TestLibrary.cpp @@ -33,14 +33,16 @@ SpeciesLibrary* TestLibrary::BuildSpeciesLibrary() { AttackLibrary* TestLibrary::BuildAttackLibrary() { auto l = new AttackLibrary(); l->Insert("standard"_cnc.GetHash(), new AttackData("standard"_cnc, 0, AttackCategory::Physical, 20, 100, 30, - AttackTarget::AdjacentOpponent, 0, SecondaryEffect(), {})); - l->Insert("highPriority"_cnc.GetHash(), new AttackData("highPriority"_cnc, 0, AttackCategory::Physical, 20, 100, 30, - AttackTarget::AdjacentOpponent, 1, SecondaryEffect(), {})); + AttackTarget::AdjacentOpponent, 0, new SecondaryEffect(), {})); + l->Insert("highPriority"_cnc.GetHash(), + new AttackData("highPriority"_cnc, 0, AttackCategory::Physical, 20, 100, 30, + AttackTarget::AdjacentOpponent, 1, new SecondaryEffect(), {})); l->Insert("higherPriority"_cnc.GetHash(), new AttackData("higherPriority"_cnc, 0, AttackCategory::Physical, 20, 100, 30, - AttackTarget::AdjacentOpponent, 2, SecondaryEffect(), {})); - l->Insert("lowPriority"_cnc.GetHash(), new AttackData("lowPriority"_cnc, 0, AttackCategory::Physical, 20, 100, 30, - AttackTarget::AdjacentOpponent, -1, SecondaryEffect(), {})); + AttackTarget::AdjacentOpponent, 2, new SecondaryEffect(), {})); + l->Insert("lowPriority"_cnc.GetHash(), + new AttackData("lowPriority"_cnc, 0, AttackCategory::Physical, 20, 100, 30, + AttackTarget::AdjacentOpponent, -1, new SecondaryEffect(), {})); return l; }