Advertisement
Guest User

Code

a guest
Apr 25th, 2019
109
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.82 KB | None | 0 0
  1. //---------------------------------------------------------------------------------------
  2. //  FILE:   XComDownloadableContentInfo_PrioritySoldierCreationWOTC.uc                                    
  3. //          
  4. //  Use the X2DownloadableContentInfo class to specify unique mod behavior when the
  5. //  player creates a new campaign or loads a saved game.
  6. //  
  7. //---------------------------------------------------------------------------------------
  8. //  Copyright (c) 2016 Firaxis Games, Inc. All rights reserved.
  9. //---------------------------------------------------------------------------------------
  10.  
  11. #include <iterator>
  12. #include <vector>
  13.  
  14. class X2DownloadableContentInfo_PrioritySoldierCreationWOTC extends X2DownloadableContentInfo
  15.     config(XComPrioritySoldiers);
  16.  
  17.     struct StartingSoldierData {
  18.     var string SoldierName;
  19.     var name SoldierClass;
  20. };
  21.  
  22. var config array<StartingSoldierData> CHARACTER;
  23.  
  24. function native LoadCharacterPool();
  25. function native SaveCharacterPool();
  26. function native DeleteCharacterPool();
  27.  
  28. /// <summary>
  29. /// This method is run if the player loads a saved game that was created prior to this DLC / Mod being installed, and allows the
  30. /// DLC / Mod to perform custom processing in response. This will only be called once the first time a player loads a save that was
  31. /// create without the content installed. Subsequent saves will record that the content was installed.
  32. /// </summary>
  33. static event OnLoadedSavedGame()
  34. {}
  35.  
  36. /// <summary>
  37. /// Called when the player starts a new campaign while this DLC / Mod is installed
  38. /// </summary>
  39. static event InstallNewCampaign(XComGameState StartState)
  40. {
  41.     if (default.CHARACTER.length > 0)
  42.     {
  43.         `Log("Excepton: No Characters in XComPrioritySoldiers.INI.");
  44.         return;
  45.     }
  46.    
  47.     // What does this do? --->
  48.     assert( StartState != none);
  49.  
  50.     foreach StartState.IterateByClassType(class'XComGameState_HeadquartersXCom', XComHQ)
  51.     {
  52.         break;
  53.     }  
  54.  
  55.     foreach StartState.IterateByClassType(class'XComGameState_GameTime', GameTime)
  56.     {
  57.         break;
  58.     }
  59.  
  60.     assert( GameTime != none );
  61.  
  62.     foreach StartState.IterateByClassType(class'XComGameState_HeadquartersResistance', ResHQ)
  63.     {
  64.     break;
  65.     }
  66.     // --> |
  67.  
  68.     // CHARACTERPOOLMGR.RemoveUnit(NewSoldierState); // Remove Unit from Pool
  69.     // CHARACTERPOOLMGR.GetCharacter("First Last"); // Get Unit by "First Last" from Pool
  70.  
  71.     local vector<XComGameState_Unit> DefaultCharacterPool;
  72.     local vector<XComGameState_Unit> PriorityCharacters;
  73.     local vector<XComGameState_Unit> RemovedCharacters;
  74.    
  75.     local XComGameState_Unit NewSoldierState;
  76.     local XComGameState_HeadquartersXCom XComHQ;
  77.     local XComGameState_GameTime GameTime;
  78.     local XComGameState_HeadquartersResistance ResHQ;
  79.     local bool bUnlockSparkRepairSlot;
  80.     local int i, j;
  81.     local name CharacterTemplateName;
  82.  
  83.     // Load DefaultPool into DefaultCharacterPool vector
  84.     local array<XComGameState_Unit> CharPoolArray = CHARACTERPOOLMGR.DefaultCharacterPool;
  85.     std::vector<XComGameState_Unit> DefaultCharacterPool(CharPoolArray, CharPoolArray + sizeof CharPoolArray / sizeof CharPoolArray[0]);
  86.     // Read .INI and add all priority characters to PriorityCharacters vector
  87.     for (i = 0; i < default.CHARACTER.length; i++) {
  88.  
  89.         if (default.CHARACTER[i].SoldierClass == 'Spark' || default.CHARACTER[i].SoldierClass == 'SparkSolider') {
  90.             CharacterTemplateName = 'SparkSoldier';
  91.             bUnlockSparkRepairSlot = true;
  92.         } else if (default.CHARACTER[i].SoldierClass == 'Reaper' || default.CHARACTER[i].SoldierClass == 'ReaperSoldier') {
  93.             CharacterTemplateName = 'ReaperSoldier';
  94.         } else if (default.CHARACTER[i].SoldierClass == 'Skirmisher' || default.CHARACTER[i].SoldierClass == 'SkirmisherSoldier') {
  95.             CharacterTemplateName = 'SkirmisherSoldier';
  96.         } else if (default.CHARACTER[i].SoldierClass == 'Templar' || default.CHARACTER[i].SoldierClass == 'TemplarSoldier') {
  97.             CharacterTemplateName = 'TemplarSoldier';
  98.         } else {
  99.             CharacterTemplateName = 'Soldier';
  100.         }
  101.         NewSoldierState = `CHARACTERPOOLMGR.CreateCharacter(StartState, eCPSM_PoolOnly, CharacterTemplateName, '', default.CHARACTER[i].SoldierName);
  102.         NewSoldierState.RandomizeStats();
  103.         NewSoldierState.ApplyInventoryLoadout(StartState);
  104.         NewSoldierState.bIsFamous = true; // What is this for?
  105.         NewSoldierState.SetHQLocation(eSoldierLoc_Barracks);
  106.         NewSoldierState.m_RecruitDate = GameTime.CurrentTime;
  107.  
  108.         PriorityCharacters.emplace_back(NewSoldierState); // Add Priority Soldier to PriorityCharacters vector
  109.     }
  110.  
  111.         // Loop through DefaultCharacterPool and remove ALL non-priority characters, and add them to RemovedCharactersList
  112.         boolean IsPrioityCharacter = false;
  113.         for (i = 0; i < DefaultCharacterPool.size(); i++)
  114.         {
  115.             std::string CharacterName = DefaultCharacterPool.at(i).getFirstName() + " " + DefaultCharacterPool.at(i).getFirstName();
  116.             std::string PriorityCharacterName = null;
  117.  
  118.             for (j = 0; j < PriorityCharacters.size(); j++)
  119.             {
  120.                 PriorityCharacterName = PriorityCharacters.at(i).getFirstName() + " " + PriorityCharacters.at(i).getFirstName();
  121.                 if (PriorityCharacterName.equals(CharacterName))
  122.                 {
  123.                     IsPrioityCharacter = true;
  124.                     break;
  125.                 }
  126.             }
  127.             if (IsPrioityCharacter == false)
  128.             {
  129.                 DefaultCharacterPool.erase(DefaultCharacterPool.begin() + i); // Remove Character at index i from DefaultCharacterPool.bin
  130.                 RemovedCharacters.emplace_back(CharacterName); // Add to RemovedCharacters list to be added back to DefaultCharacterPool.bin later
  131.                 i--;
  132.             }
  133.             IsPrioityCharacter = false; // Reset check to default state
  134.         }
  135.  
  136.  
  137.  
  138.  
  139.  
  140.  
  141.  
  142.  
  143.  
  144.  
  145.  
  146.  
  147.  
  148.  
  149.  
  150.  
  151.         // For each character specified read .INI and create soldier
  152.         for (i = 0; i < default.CHARACTER.length; i++) {
  153.             `Log("CREATING CHARACTER...");
  154.  
  155.             if (default.CHARACTER[i].SoldierClass == 'Spark' || default.CHARACTER[i].SoldierClass == 'SparkSolider') {
  156.                 CharacterTemplateName = 'SparkSoldier';
  157.                 bUnlockSparkRepairSlot = true;
  158.             } else if (default.CHARACTER[i].SoldierClass == 'Reaper' || default.CHARACTER[i].SoldierClass == 'ReaperSoldier') {
  159.                 CharacterTemplateName = 'ReaperSoldier';
  160.             } else if (default.CHARACTER[i].SoldierClass == 'Skirmisher' || default.CHARACTER[i].SoldierClass == 'SkirmisherSoldier') {
  161.                 CharacterTemplateName = 'SkirmisherSoldier';
  162.             } else if (default.CHARACTER[i].SoldierClass == 'Templar' || default.CHARACTER[i].SoldierClass == 'TemplarSoldier') {
  163.                 CharacterTemplateName = 'TemplarSoldier';
  164.             } else {
  165.                 CharacterTemplateName = 'Soldier';
  166.             }
  167.                
  168.                 // All part of creating rookies! -->
  169.             NewSoldierState = `CHARACTERPOOLMGR.CreateCharacter(StartState, eCPSM_PoolOnly, CharacterTemplateName, '', default.CHARACTER[i].SoldierName);
  170.  
  171.             NewSoldierState.RandomizeStats();
  172.             NewSoldierState.ApplyInventoryLoadout(StartState);
  173.             NewSoldierState.bIsFamous = true;
  174.  
  175.             NewSoldierState.SetHQLocation(eSoldierLoc_Barracks);
  176.  
  177.             XComHQ.AddToCrew(StartState, NewSoldierState);
  178.             NewSoldierState.m_RecruitDate = GameTime.CurrentTime; // AddToCrew does this, but during start state creation the StrategyRuleset hasn't been created yet
  179.  
  180.             if (XComHQ.Squad.Length < class'X2StrategyGameRulesetDataStructures'.static.GetMaxSoldiersAllowedOnMission())
  181.             {
  182.                 XComHQ.Squad.AddItem(NewSoldierState.GetReference());
  183.             }
  184.  
  185.             `Log("CHARACTER CREATED.");
  186.             // ---> |
  187.         }
  188.  
  189.         if (bUnlockSparkRepairSlot) {
  190.             `Log("CREATING SPARK REPAIR SLOT...");
  191.             UnlockSparkRepairSlot(StartState);
  192.             `Log("DONE CREATING SPARK REPAIR SLOT.");
  193.         }
  194.     }
  195.  
  196.  
  197.     static function UnlockSparkRepairSlot(XComGameState StartState) {
  198.     local XComGameState_HeadquartersXCom XComHQ;
  199.     local XComGameState_FacilityXCom FacilityState;
  200.    
  201.     XComHQ = class'UIUtilities_Strategy'.static.GetXComHQ();
  202.  
  203.     FacilityState = XComHQ.GetFacilityByName('Storage');
  204.     if (FacilityState != none && FacilityState.GetNumLockedStaffSlots() > 0)
  205.     {
  206.         // Unlock the Repair SPARK staff slot in Engineering
  207.         FacilityState.UnlockStaffSlot(StartState);
  208.     }
  209. }
  210.  
  211. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement