Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -2106,6 +2106,9 @@ static function CleanUpUnitReward(XComGameState NewGameState, XComGameState_Rewa
// First remove the units items
UnitState.BlastLoadout(NewGameState);

// Single line for Issue #1457 - Remove the reward unit from the bond data arrays of all remaining XCom units
class'XComGameStateContext_HeadquartersOrder'.static.RemoveDisposedSoldierFromBondData(UnitState.GetReference());

// Then remove the actual unit
NewGameState.RemoveStateObject(UnitState.ObjectID);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -317,6 +317,8 @@ private function FireUnit(XComGameState AddToGameState, StateObjectReference Uni
History = `XCOMHISTORY;
XComHQ = XComGameState_HeadquartersXCom(History.GetSingleGameStateObjectForClass(class'XComGameState_HeadquartersXCom'));
XComHQ = XComGameState_HeadquartersXCom(AddToGameState.ModifyStateObject(class'XComGameState_HeadquartersXCom', XComHQ.ObjectID));
// Single line for Issue #1457 - Remove the dismissed soldier from the AllSoldierBonds array of every other soldier.
RemoveDisposedSoldierFromBondData(UnitReference);
XComHQ.RemoveFromCrew(UnitReference);

for(idx = 0; idx < XComHQ.Squad.Length; idx++)
Expand All @@ -329,7 +331,8 @@ private function FireUnit(XComGameState AddToGameState, StateObjectReference Uni
}

UnitState = XComGameState_Unit(AddToGameState.ModifyStateObject(class'XComGameState_Unit', UnitReference.ObjectID));
class'X2StrategyGameRulesetDataStructures'.static.ResetAllBonds(AddToGameState, UnitState);
// Single line for Issue# 1457 - ResetAllBonds is redunant on dismissal as this data is now removed from each soldier above.
// class'X2StrategyGameRulesetDataStructures'.static.ResetAllBonds(AddToGameState, UnitState);
// REMOVE FIRED UNIT?
AddToGameState.RemoveStateObject(UnitReference.ObjectID);

Expand All @@ -350,6 +353,40 @@ private function FireUnit(XComGameState AddToGameState, StateObjectReference Uni
`XEVENTMGR.TriggerEvent('HeadquartersUnitFired',, UnitState, AddToGameState);
}

// Issue #1457
/// HL-Docs: ref:Bugfixes; issue:1457
/// This helper function forcibly removes disposed (dismissed / captured & ignored) soldiers from
/// the AllSoldierBonds arrays of the remaining soldiers. This prevents redscreens from occurring
/// when creating bonds after units have been dismissed or otherwise removed from the game.
static function RemoveDisposedSoldierFromBondData(StateObjectReference UnitReference)
{
local XComGameStateHistory History;
local XComGameState_Unit BondUnitState, CrewUnitState, DismissedUnitState;
local SoldierBond BondData;

local int i;

History = `XCOMHISTORY;
DismissedUnitState = XComGameState_Unit(History.GetGameStateForObjectID(UnitReference.ObjectID));

foreach History.IterateByClassType(class'XComGameState_Unit', CrewUnitState)
{
if(CrewUnitState != none && CrewUnitState.IsSoldier())
{
for(i = CrewUnitState.AllSoldierBonds.Length - i; i >= 0; i--)
{
BondData = CrewUnitState.AllSoldierBonds[i];
BondUnitState = XComGameState_Unit(History.GetGameStateForObjectID(BondData.Bondmate.ObjectID));

if(BondUnitState == DismissedUnitState)
{
CrewUnitState.AllSoldierBonds.Remove(i, 1);
}
}
}
}
}

private function CompleteResearch(XComGameState AddToGameState, StateObjectReference TechReference)
{
local XComGameStateHistory History;
Expand Down