From 94d9d4f3d264a66660d06fdd30216197e9b635ce Mon Sep 17 00:00:00 2001 From: Deukhoofd Date: Sat, 25 Apr 2020 20:20:30 +0200 Subject: [PATCH] Performance improvement for running turns by reducing the number of lookups for the hitdata. --- src/Battling/Flow/TurnHandler.cpp | 3 ++- src/Battling/Models/ExecutingAttack.hpp | 9 +++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/Battling/Flow/TurnHandler.cpp b/src/Battling/Flow/TurnHandler.cpp index 701ea88..c28d610 100644 --- a/src/Battling/Flow/TurnHandler.cpp +++ b/src/Battling/Flow/TurnHandler.cpp @@ -130,6 +130,7 @@ void TurnHandler::HandleAttackForTarget(ExecutingAttack* attack, Creature* targe auto library = user->GetBattle()->GetLibrary(); AssertNotNull(library) auto dmgLibrary = library->GetDamageLibrary(); + auto hitIterator = attack->GetTargetIteratorBegin(target); for (uint8_t hitIndex = 0; hitIndex < numberOfHits; hitIndex++) { if (user->IsFainted()) { break; @@ -137,7 +138,7 @@ void TurnHandler::HandleAttackForTarget(ExecutingAttack* attack, Creature* targe if (target->IsFainted()) { break; } - auto& hit = attack->GetHitData(target, hitIndex); + auto& hit = *(hitIterator++); auto hitType = hit.GetType(); HOOK(ChangeAttackType, targetSource, attack, target, hitIndex, &hitType); auto effectiveness = library->GetTypeLibrary()->GetEffectiveness(hitType, target->GetTypes()); diff --git a/src/Battling/Models/ExecutingAttack.hpp b/src/Battling/Models/ExecutingAttack.hpp index c65e795..d7ff3b7 100644 --- a/src/Battling/Models/ExecutingAttack.hpp +++ b/src/Battling/Models/ExecutingAttack.hpp @@ -69,6 +69,15 @@ namespace CreatureLib::Battling { throw CreatureException("Invalid target requested."); } + std::vector::iterator GetTargetIteratorBegin(Creature* creature) { + for (size_t i = 0; i < _targets.Count(); i++) { + if (_targets[i] == creature) { + return _hits.begin() + (i * _numberHits); + } + } + throw CreatureException("Invalid target requested."); + } + bool IsCreatureTarget(Creature* creature) noexcept { return _targets.IndexOf(creature) != (size_t)-1; } const List& GetTargets() noexcept { return _targets; } uint8_t GetNumberOfHits() const noexcept { return _numberHits; }