Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //---------------------------------------------------------------------------------------
- // FILE: XComDownloadableContentInfo_PrioritySoldierCreationWOTC.uc
- //
- // Use the X2DownloadableContentInfo class to specify unique mod behavior when the
- // player creates a new campaign or loads a saved game.
- //
- //---------------------------------------------------------------------------------------
- // Copyright (c) 2016 Firaxis Games, Inc. All rights reserved.
- //---------------------------------------------------------------------------------------
- #include <iterator>
- #include <vector>
- class X2DownloadableContentInfo_PrioritySoldierCreationWOTC extends X2DownloadableContentInfo
- config(XComPrioritySoldiers);
- struct StartingSoldierData {
- var string SoldierName;
- var name SoldierClass;
- };
- var config array<StartingSoldierData> CHARACTER;
- function native LoadCharacterPool();
- function native SaveCharacterPool();
- function native DeleteCharacterPool();
- /// <summary>
- /// This method is run if the player loads a saved game that was created prior to this DLC / Mod being installed, and allows the
- /// DLC / Mod to perform custom processing in response. This will only be called once the first time a player loads a save that was
- /// create without the content installed. Subsequent saves will record that the content was installed.
- /// </summary>
- static event OnLoadedSavedGame()
- {}
- /// <summary>
- /// Called when the player starts a new campaign while this DLC / Mod is installed
- /// </summary>
- static event InstallNewCampaign(XComGameState StartState)
- {
- if (default.CHARACTER.length > 0)
- {
- `Log("Excepton: No Characters in XComPrioritySoldiers.INI.");
- return;
- }
- // What does this do? --->
- assert( StartState != none);
- foreach StartState.IterateByClassType(class'XComGameState_HeadquartersXCom', XComHQ)
- {
- break;
- }
- foreach StartState.IterateByClassType(class'XComGameState_GameTime', GameTime)
- {
- break;
- }
- assert( GameTime != none );
- foreach StartState.IterateByClassType(class'XComGameState_HeadquartersResistance', ResHQ)
- {
- break;
- }
- // --> |
- // CHARACTERPOOLMGR.RemoveUnit(NewSoldierState); // Remove Unit from Pool
- // CHARACTERPOOLMGR.GetCharacter("First Last"); // Get Unit by "First Last" from Pool
- local vector<XComGameState_Unit> DefaultCharacterPool;
- local vector<XComGameState_Unit> PriorityCharacters;
- local vector<XComGameState_Unit> RemovedCharacters;
- local XComGameState_Unit NewSoldierState;
- local XComGameState_HeadquartersXCom XComHQ;
- local XComGameState_GameTime GameTime;
- local XComGameState_HeadquartersResistance ResHQ;
- local bool bUnlockSparkRepairSlot;
- local int i, j;
- local name CharacterTemplateName;
- // Load DefaultPool into DefaultCharacterPool vector
- local array<XComGameState_Unit> CharPoolArray = CHARACTERPOOLMGR.DefaultCharacterPool;
- std::vector<XComGameState_Unit> DefaultCharacterPool(CharPoolArray, CharPoolArray + sizeof CharPoolArray / sizeof CharPoolArray[0]);
- // Read .INI and add all priority characters to PriorityCharacters vector
- for (i = 0; i < default.CHARACTER.length; i++) {
- if (default.CHARACTER[i].SoldierClass == 'Spark' || default.CHARACTER[i].SoldierClass == 'SparkSolider') {
- CharacterTemplateName = 'SparkSoldier';
- bUnlockSparkRepairSlot = true;
- } else if (default.CHARACTER[i].SoldierClass == 'Reaper' || default.CHARACTER[i].SoldierClass == 'ReaperSoldier') {
- CharacterTemplateName = 'ReaperSoldier';
- } else if (default.CHARACTER[i].SoldierClass == 'Skirmisher' || default.CHARACTER[i].SoldierClass == 'SkirmisherSoldier') {
- CharacterTemplateName = 'SkirmisherSoldier';
- } else if (default.CHARACTER[i].SoldierClass == 'Templar' || default.CHARACTER[i].SoldierClass == 'TemplarSoldier') {
- CharacterTemplateName = 'TemplarSoldier';
- } else {
- CharacterTemplateName = 'Soldier';
- }
- NewSoldierState = `CHARACTERPOOLMGR.CreateCharacter(StartState, eCPSM_PoolOnly, CharacterTemplateName, '', default.CHARACTER[i].SoldierName);
- NewSoldierState.RandomizeStats();
- NewSoldierState.ApplyInventoryLoadout(StartState);
- NewSoldierState.bIsFamous = true; // What is this for?
- NewSoldierState.SetHQLocation(eSoldierLoc_Barracks);
- NewSoldierState.m_RecruitDate = GameTime.CurrentTime;
- PriorityCharacters.emplace_back(NewSoldierState); // Add Priority Soldier to PriorityCharacters vector
- }
- // Loop through DefaultCharacterPool and remove ALL non-priority characters, and add them to RemovedCharactersList
- boolean IsPrioityCharacter = false;
- for (i = 0; i < DefaultCharacterPool.size(); i++)
- {
- std::string CharacterName = DefaultCharacterPool.at(i).getFirstName() + " " + DefaultCharacterPool.at(i).getFirstName();
- std::string PriorityCharacterName = null;
- for (j = 0; j < PriorityCharacters.size(); j++)
- {
- PriorityCharacterName = PriorityCharacters.at(i).getFirstName() + " " + PriorityCharacters.at(i).getFirstName();
- if (PriorityCharacterName.equals(CharacterName))
- {
- IsPrioityCharacter = true;
- break;
- }
- }
- if (IsPrioityCharacter == false)
- {
- DefaultCharacterPool.erase(DefaultCharacterPool.begin() + i); // Remove Character at index i from DefaultCharacterPool.bin
- RemovedCharacters.emplace_back(CharacterName); // Add to RemovedCharacters list to be added back to DefaultCharacterPool.bin later
- i--;
- }
- IsPrioityCharacter = false; // Reset check to default state
- }
- // For each character specified read .INI and create soldier
- for (i = 0; i < default.CHARACTER.length; i++) {
- `Log("CREATING CHARACTER...");
- if (default.CHARACTER[i].SoldierClass == 'Spark' || default.CHARACTER[i].SoldierClass == 'SparkSolider') {
- CharacterTemplateName = 'SparkSoldier';
- bUnlockSparkRepairSlot = true;
- } else if (default.CHARACTER[i].SoldierClass == 'Reaper' || default.CHARACTER[i].SoldierClass == 'ReaperSoldier') {
- CharacterTemplateName = 'ReaperSoldier';
- } else if (default.CHARACTER[i].SoldierClass == 'Skirmisher' || default.CHARACTER[i].SoldierClass == 'SkirmisherSoldier') {
- CharacterTemplateName = 'SkirmisherSoldier';
- } else if (default.CHARACTER[i].SoldierClass == 'Templar' || default.CHARACTER[i].SoldierClass == 'TemplarSoldier') {
- CharacterTemplateName = 'TemplarSoldier';
- } else {
- CharacterTemplateName = 'Soldier';
- }
- // All part of creating rookies! -->
- NewSoldierState = `CHARACTERPOOLMGR.CreateCharacter(StartState, eCPSM_PoolOnly, CharacterTemplateName, '', default.CHARACTER[i].SoldierName);
- NewSoldierState.RandomizeStats();
- NewSoldierState.ApplyInventoryLoadout(StartState);
- NewSoldierState.bIsFamous = true;
- NewSoldierState.SetHQLocation(eSoldierLoc_Barracks);
- XComHQ.AddToCrew(StartState, NewSoldierState);
- NewSoldierState.m_RecruitDate = GameTime.CurrentTime; // AddToCrew does this, but during start state creation the StrategyRuleset hasn't been created yet
- if (XComHQ.Squad.Length < class'X2StrategyGameRulesetDataStructures'.static.GetMaxSoldiersAllowedOnMission())
- {
- XComHQ.Squad.AddItem(NewSoldierState.GetReference());
- }
- `Log("CHARACTER CREATED.");
- // ---> |
- }
- if (bUnlockSparkRepairSlot) {
- `Log("CREATING SPARK REPAIR SLOT...");
- UnlockSparkRepairSlot(StartState);
- `Log("DONE CREATING SPARK REPAIR SLOT.");
- }
- }
- static function UnlockSparkRepairSlot(XComGameState StartState) {
- local XComGameState_HeadquartersXCom XComHQ;
- local XComGameState_FacilityXCom FacilityState;
- XComHQ = class'UIUtilities_Strategy'.static.GetXComHQ();
- FacilityState = XComHQ.GetFacilityByName('Storage');
- if (FacilityState != none && FacilityState.GetNumLockedStaffSlots() > 0)
- {
- // Unlock the Repair SPARK staff slot in Engineering
- FacilityState.UnlockStaffSlot(StartState);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement