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