From a7069a596002b05ee82867cb4deb841147b5b50b Mon Sep 17 00:00:00 2001 From: Deukhoofd Date: Fri, 29 May 2020 20:05:05 +0200 Subject: [PATCH] Ensure Attack script is deleted when not taken by ExecutingAttack. --- src/Battling/Flow/TurnHandler.cpp | 1 + src/Battling/TurnChoices/AttackTurnChoice.hpp | 9 +++++++++ 2 files changed, 10 insertions(+) diff --git a/src/Battling/Flow/TurnHandler.cpp b/src/Battling/Flow/TurnHandler.cpp index 0e7de56..61dc84b 100644 --- a/src/Battling/Flow/TurnHandler.cpp +++ b/src/Battling/Flow/TurnHandler.cpp @@ -63,6 +63,7 @@ void TurnHandler::ExecuteAttackChoice(AttackTurnChoice* choice) { ArbUt::List targets = {target}; auto attack = ExecutingAttack(targets, 1, choice->GetUser(), choice->GetAttack(), choice->GetAttackScript()); + choice->MarkScriptAsTaken(); bool prevented = false; HOOK_LOCAL(PreventAttack, attack, &attack, &prevented); if (prevented) { diff --git a/src/Battling/TurnChoices/AttackTurnChoice.hpp b/src/Battling/TurnChoices/AttackTurnChoice.hpp index 6deecf4..a14ab37 100644 --- a/src/Battling/TurnChoices/AttackTurnChoice.hpp +++ b/src/Battling/TurnChoices/AttackTurnChoice.hpp @@ -12,6 +12,7 @@ namespace CreatureLib::Battling { LearnedAttack* _attack; CreatureIndex _target; Script* _attackScript = nullptr; + bool _scriptIsTaken = false; void ResolveScript() { if (_attackScript != nullptr) @@ -41,6 +42,12 @@ namespace CreatureLib::Battling { AttackTurnChoice(Creature* user, LearnedAttack* attack, const CreatureIndex& target, Script* script) noexcept : BaseTurnChoice(user), _attack(attack), _target(target), _attackScript(script) {} + ~AttackTurnChoice() { + if (!_scriptIsTaken) { + delete _attackScript; + } + } + inline LearnedAttack* GetAttack() const noexcept { return _attack; } TurnChoiceKind GetKind() const noexcept override { return TurnChoiceKind ::Attack; } @@ -50,6 +57,8 @@ namespace CreatureLib::Battling { return _attack->GetAttack()->GetPriority(); } + void MarkScriptAsTaken() { _scriptIsTaken = true; } + const CreatureIndex& GetTarget() const noexcept { return _target; } Script* GetAttackScript() const noexcept { return _attackScript; }