1 #ifndef __SOLDIER_INIT_LIST_H 2 #define __SOLDIER_INIT_LIST_H 3 4 #include "Soldier_Create.h" 5 6 struct SOLDIERINITNODE 7 { 8 UINT8 ubNodeID; 9 UINT8 ubSoldierID; 10 BASIC_SOLDIERCREATE_STRUCT *pBasicPlacement; 11 SOLDIERCREATE_STRUCT *pDetailedPlacement; 12 SOLDIERTYPE *pSoldier; 13 SOLDIERINITNODE* prev; 14 SOLDIERINITNODE* next; 15 }; 16 17 extern SOLDIERINITNODE *gSoldierInitHead; 18 extern SOLDIERINITNODE *gSoldierInitTail; 19 20 #define BASE_FOR_EACH_SOLDIERINITNODE(type, iter) \ 21 for (type* iter = gSoldierInitHead; iter != NULL; iter = iter->next) 22 #define FOR_EACH_SOLDIERINITNODE( iter) BASE_FOR_EACH_SOLDIERINITNODE( SOLDIERINITNODE, iter) 23 #define CFOR_EACH_SOLDIERINITNODE(iter) BASE_FOR_EACH_SOLDIERINITNODE(const SOLDIERINITNODE, iter) 24 25 #define FOR_EACH_SOLDIERINITNODE_SAFE(iter) \ 26 for (SOLDIERINITNODE* iter = gSoldierInitHead, * iter##__next; iter; iter = iter##__next) \ 27 if (iter##__next = iter->next, false) {} else \ 28 29 //These serialization functions are assuming the passing of a valid file 30 //pointer to the beginning of the save/load area, at the correct part of the 31 //map file. 32 void LoadSoldiersFromMap(HWFILE, bool stracLinuxFormat); 33 34 BOOLEAN SaveSoldiersToMap( HWFILE fp ); 35 36 //For the purpose of keeping track of which soldier belongs to which placement within the game, 37 //the only way we can do this properly is to save the soldier ID from the list and reconnect the 38 //soldier pointer whenever we load the game. 39 void SaveSoldierInitListLinks(HWFILE); 40 void LoadSoldierInitListLinks(HWFILE); 41 void NewWayOfLoadingEnemySoldierInitListLinks(HWFILE); 42 void NewWayOfLoadingCivilianInitListLinks(HWFILE); 43 44 void InitSoldierInitList(void); 45 void KillSoldierInitList(void); 46 SOLDIERINITNODE* AddBasicPlacementToSoldierInitList(BASIC_SOLDIERCREATE_STRUCT const&); 47 void RemoveSoldierNodeFromInitList( SOLDIERINITNODE *pNode ); 48 SOLDIERINITNODE* FindSoldierInitNodeWithID( UINT16 usID ); 49 SOLDIERINITNODE* FindSoldierInitNodeBySoldier(SOLDIERTYPE const&); 50 51 void AddSoldierInitListTeamToWorld(INT8 team); 52 void AddSoldierInitListEnemyDefenceSoldiers( UINT8 ubTotalAdmin, UINT8 ubTotalTroops, UINT8 ubTotalElite ); 53 void AddSoldierInitListCreatures(BOOLEAN fQueen, UINT8 ubNumLarvae, UINT8 ubNumInfants, 54 UINT8 ubNumYoungMales, UINT8 ubNumYoungFemales, UINT8 ubNumAdultMales, 55 UINT8 ubNumAdultFemales); 56 void AddSoldierInitListMilitia( UINT8 ubNumGreen, UINT8 ubNumReg, UINT8 ubNumElites ); 57 58 void AddSoldierInitListBloodcats(void); 59 60 void UseEditorOriginalList(void); 61 void UseEditorAlternateList(void); 62 63 // Any killed people that used detailed placement information must prevent that 64 // from occurring again in the future. Otherwise, the sniper guy with 99 65 // marksmanship could appear again if the map was loaded again! 66 void EvaluateDeathEffectsToSoldierInitList(SOLDIERTYPE const&); 67 68 void AddProfilesUsingProfileInsertionData(void); 69 void AddProfilesNotUsingProfileInsertionData(void); 70 void StripEnemyDetailedPlacementsIfSectorWasPlayerLiberated(); 71 bool AddPlacementToWorld(SOLDIERINITNODE*); 72 73 #endif 74