A new idea how to select which extra soldiers to bring on a mission.
We know that the extra soldiers are the "topmost" available soldiers in the barracks...
So I looked around in XComStrategyGame.upk to see how soldiers are arranged and found XGFacility_Barracks.OrderedHigher
function bool OrderedHigher(XGStrategySoldier kSoldier1, XGStrategySoldier kSoldier2) { // End:0x3A if(kSoldier1.m_kSoldier.iPsiRank == 4) { return true; } // End:0x74 if(kSoldier2.m_kSoldier.iPsiRank == 4) { return false; } // End:0xC1 if(kSoldier1.IsInjured() && !kSoldier2.IsInjured()) { return false; } // End:0x10B else { // End:0x10B if(kSoldier2.IsInjured() && !kSoldier1.IsInjured()) { return true; } } // End:0x158 if(kSoldier1.IsInPsiTraining() && !kSoldier2.IsInPsiTraining()) { return false; } // End:0x1A2 else { // End:0x1A2 if(kSoldier2.IsInPsiTraining() && !kSoldier1.IsInPsiTraining()) { return true; } } // End:0x1EA if(kSoldier1.GetRank() > kSoldier2.GetRank()) { return true; } // End:0x22F else { // End:0x22F if(kSoldier2.GetRank() > kSoldier1.GetRank()) { return false; } } // End:0x274 if(kSoldier1.GetNumMissions() > kSoldier2.GetNumMissions()) { return true; } // End:0x2B9 if(kSoldier1.GetNumKills() > kSoldier2.GetNumKills()) { return true; } // End:0x322 if(kSoldier1.m_kSoldier.iID < kSoldier2.m_kSoldier.iID) { return true; } return false; //return ReturnValue; }
Who cares if the chosen one is on top of the list by default?
Who cares if wounded soldiers are put on bottom of the list?
Who cares if the PSI-trainees are in the bottom of the list?
I think it would actually be more intuitive if they remained sorted by rank, missions and kills regardless of current status.
Instead the below code could be inserted (or any critera which can be checked in the code and modified by the player):
function bool OrderedHigher(XGStrategySoldier kSoldier1, XGStrategySoldier kSoldier2) { // End:0x3A if(kSoldier1.GetFirstName() == "*" && kSoldier2.GetFirstName() != "*") { return true; } // End:0x1EA if(kSoldier1.GetRank() > kSoldier2.GetRank()) { return true; } // End:0x22F else { // End:0x22F if(kSoldier2.GetRank() > kSoldier1.GetRank()) { return false; } } // End:0x274 if(kSoldier1.GetNumMissions() > kSoldier2.GetNumMissions()) { return true; } // End:0x2B9 if(kSoldier1.GetNumKills() > kSoldier2.GetNumKills()) { return true; } // End:0x322 if(kSoldier1.m_kSoldier.iID < kSoldier2.m_kSoldier.iID) { return true; } return false; //return ReturnValue; }
The player would simply change first name to * for the soldiers he/she wants to bring along in addition to the ones already visible in the loadout-screen.
If the player wants to bring less than maximum number of soldiers, he just removes the unwanted ones from the loadout screen before pressing launch.