From 3096a43dd5ab7871d0b07a035b937301a6768f9b Mon Sep 17 00:00:00 2001
From: furudee <furudee@protonmail.com>
Date: Thu, 14 Nov 2024 20:08:08 +0200
Subject: [PATCH] Issue X2CommunityCore#1408 - Add validation of targets for
 ArcWave targeting method

---
 .../Classes/X2TargetingMethod_ArcWave.uc      | 26 +++++++++++++++++++
 1 file changed, 26 insertions(+)

diff --git a/X2WOTCCommunityHighlander/Src/XComGame/Classes/X2TargetingMethod_ArcWave.uc b/X2WOTCCommunityHighlander/Src/XComGame/Classes/X2TargetingMethod_ArcWave.uc
index cfe0dd491..cc99a0da6 100644
--- a/X2WOTCCommunityHighlander/Src/XComGame/Classes/X2TargetingMethod_ArcWave.uc
+++ b/X2WOTCCommunityHighlander/Src/XComGame/Classes/X2TargetingMethod_ArcWave.uc
@@ -116,6 +116,7 @@ function bool GetAdditionalTargets(out AvailableTarget AdditionalTargets)
 	local name AvailableCode;
 	local XComGameStateHistory History;
 	local XComGameState_BaseObject StateObject;
+	local array<StateObjectReference> ValidationTargets;
 
 	TargetedActor = GetTargetedActor();
 	TargetedPawn = XGUnit(TargetedActor);
@@ -136,23 +137,48 @@ function bool GetAdditionalTargets(out AvailableTarget AdditionalTargets)
 			History = `XCOMHISTORY;
 			for (i = 0; i < CurrentlyMarkedTargets.Length; ++i)
 			{
+
 				CurrentTargetUnit = XGUnit(CurrentlyMarkedTargets[i]);
 				if (CurrentTargetUnit != none)
 				{
 					StateObject = History.GetGameStateForObjectID(CurrentTargetUnit.ObjectID);
 					AvailableCode = ArcWaveTemplate.CheckMultiTargetConditions(Ability, UnitState, StateObject);	
+
 					if (AvailableCode == 'AA_Success' && StateObject.ObjectID != AdditionalTargets.PrimaryTarget.ObjectID)
 					{
 						if (AdditionalTargets.AdditionalTargets.Find('ObjectID', StateObject.ObjectID) == INDEX_NONE)
+						{
 							AdditionalTargets.AdditionalTargets.AddItem(StateObject.GetReference());
+						}
+
+						ValidationTargets.AddItem(StateObject.GetReference());
 					}
 				}
 			}
+			// Start Issue #1408
+			/// HL-Docs ref:Bugfixes; issue:1408
+			/// Validates targets that were given as function parameter
+			for (i = AdditionalTargets.AdditionalTargets.Length - 1; i >= 0; --i)
+			{
+				// not a target that the ability actually hits
+				if( ValidationTargets.Find('ObjectID', AdditionalTargets.AdditionalTargets[i].ObjectID) == INDEX_NONE )
+				{
+					AdditionalTargets.AdditionalTargets.Remove(i, 1);
+				}
+			}
+			// End Issue #1408
 
 			return true;
 		}
 	}
 
+	// Start Issue #1408
+	/// HL-Docs ref:Bugfixes; issue:1408
+	/// Empty the AdditionalTargets array if the ability didn't hit any other tiles than primary target
+	/// or ability has no target
+	AdditionalTargets.AdditionalTargets.Length = 0;
+	// End Issue #1408
+
 	return false;
 }