1 #ifndef __STRATMAP_H
2 #define __STRATMAP_H
3 // this file is for manipulation of the strategic map structure
4 
5 #include "JA2Types.h"
6 #include "SAM_Sites.h"
7 
8 #include <string_theory/string>
9 
10 
11 //The maximum size for any team strategically speaking.  For example, we can't have more than 20 enemies, militia, or creatures at a time.
12 #define MAX_STRATEGIC_TEAM_SIZE	20
13 
14 // Codes for jumoing into adjacent sectors..
15 enum
16 {
17 	JUMP_ALL_LOAD_NEW,
18 	JUMP_ALL_NO_LOAD,
19 	JUMP_SINGLE_LOAD_NEW,
20 	JUMP_SINGLE_NO_LOAD
21 };
22 
23 
24 enum{
25 	CONTROLLED=0,
26 	UNCONTROLLED,
27 };
28 
29 // For speed, etc lets make these globals, forget the functions if you want
30 extern INT16 gWorldSectorX;
31 extern INT16 gWorldSectorY;
32 extern INT8  gbWorldSectorZ;
33 
34 #define NO_SECTOR ((UINT)-1)
35 
36 UINT GetWorldSector();
37 
SetWorldSectorInvalid()38 static inline void SetWorldSectorInvalid()
39 {
40 	gWorldSectorX  =  0;
41 	gWorldSectorY  =  0;
42 	gbWorldSectorZ = -1;
43 }
44 
45 extern	BOOLEAN		gfUseAlternateMap;
46 
47 // This is called after loading map and before setting it up (e.g. placing soldiers)
48 extern Observable<> BeforePrepareSector;
49 
50 // FUNCTIONS FOR DERTERMINING GOOD SECTOR EXIT DATA
51 #define CHECK_DIR_X_DELTA			( WORLD_TILE_X * 4 )
52 #define CHECK_DIR_Y_DELTA			( WORLD_TILE_Y * 10 )
53 
54 #define MAP_WORLD_X				18
55 #define MAP_WORLD_Y				18
56 
57 // get index into aray
58 #define CALCULATE_STRATEGIC_INDEX( x, y )	( x + ( y * MAP_WORLD_X ) )
59 #define GET_X_FROM_STRATEGIC_INDEX( i )		( i % MAP_WORLD_X )
60 #define GET_Y_FROM_STRATEGIC_INDEX( i )		( i / MAP_WORLD_X )
61 
62 // macros to convert between the 2 different sector numbering systems
63 #define SECTOR_INFO_TO_STRATEGIC_INDEX( i )	( CALCULATE_STRATEGIC_INDEX ( SECTORX( i ), SECTORY( i ) ) )
64 #define STRATEGIC_INDEX_TO_SECTOR_INFO( i )	( SECTOR(  GET_X_FROM_STRATEGIC_INDEX( i ), GET_Y_FROM_STRATEGIC_INDEX( i ) ) )
65 
66 
67 // grab the town id value
68 UINT8 GetTownIdForSector(UINT8 sector);
69 
70 void SetCurrentWorldSector(INT16 x, INT16 y, INT8 z);
71 
72 void UpdateMercsInSector();
73 void UpdateMercInSector(SOLDIERTYPE&, INT16 sSectorX, INT16 sSectorY, INT8 bSectorZ);
74 
75 // get short sector name without town name
76 ST::string GetShortSectorString(INT16 sMapX, INT16 sMapY);
77 
78 // Return a string like 'A9: Omerta'
79 ST::string GetSectorIDString(INT16 x, INT16 y, INT8 z, BOOLEAN detailed);
80 
81 // Returns a sector description string based on the sector land type
82 ST::string GetSectorLandTypeString(UINT8 ubSectorID, UINT8 ubSectorZ, bool fDetailed);
83 
84 void GetMapFileName(INT16 x, INT16 y, INT8 z, char* buf, BOOLEAN add_alternate_map_letter);
85 
86 // Called from within tactical.....
87 void JumpIntoAdjacentSector( UINT8 ubDirection, UINT8 ubJumpCode, INT16 sAdditionalData );
88 
89 
90 bool CanGoToTacticalInSector(INT16 x, INT16 y, UINT8 z);
91 
92 // Number of sectors this town takes up
93 UINT8 GetTownSectorSize(INT8 town_id);
94 
95 // Number of sectors under player control for this town
96 UINT8 GetTownSectorsUnderControl(INT8 town_id);
97 
98 
99 BOOLEAN OKForSectorExit(INT8 bExitDirection, UINT16 usAdditionalData, UINT32* puiTraverseTimeInMinutes = 0);
100 void SetupNewStrategicGame();
101 
102 void LoadStrategicInfoFromSavedFile(HWFILE);
103 void SaveStrategicInfoToSavedFile(HWFILE);
104 
105 void AllMercsHaveWalkedOffSector(void);
106 
107 void AdjustSoldierPathToGoOffEdge( SOLDIERTYPE *pSoldier, INT16 sEndGridNo, UINT8 ubTacticalDirection );
108 
109 void AllMercsWalkedToExitGrid(void);
110 
111 void PrepareLoadedSector(void);
112 
113 // handle for slay...no better place to really put this stuff
114 void HandleSlayDailyEvent( void );
115 
116 
117 void HandleQuestCodeOnSectorEntry( INT16 sNewSectorX, INT16 sNewSectorY, INT8 bNewSectorZ );
118 
119 // handle a soldier leaving thier squad behind, this sets them up for mvt and potential rejoining of group
120 void HandleSoldierLeavingSectorByThemSelf( SOLDIERTYPE *pSoldier );
121 
122 BOOLEAN CheckAndHandleUnloadingOfCurrentWorld(void);
123 
124 bool IsSectorDesert(INT16 x, INT16 y);
125 
126 void SetupProfileInsertionDataForSoldier(const SOLDIERTYPE* s);
127 
128 BOOLEAN HandlePotentialBringUpAutoresolveToFinishBattle(void);
129 
130 void BeginLoadScreen(void);
131 
132 void RemoveMercsInSector(void);
133 
134 void InitStrategicEngine(void);
135 
136 //Used for determining the type of error message that comes up when you can't traverse to
137 //an adjacent sector.  THESE VALUES DO NOT NEED TO BE SAVED!
138 extern BOOLEAN	gfInvalidTraversal;
139 extern BOOLEAN	gfLoneEPCAttemptingTraversal;
140 extern BOOLEAN	gfRobotWithoutControllerAttemptingTraversal;
141 extern UINT8		gubLoneMercAttemptingToAbandonEPCs;
142 extern const SOLDIERTYPE* gPotentiallyAbandonedEPC;
143 
144 extern INT8 gbGreenToElitePromotions;
145 extern INT8 gbGreenToRegPromotions;
146 extern INT8 gbRegToElitePromotions;
147 extern INT8 gbMilitiaPromotions;
148 
149 extern BOOLEAN gfGettingNameFromSaveLoadScreen;
150 
151 struct StrategicMapElement
152 {
153 	INT8    bNameId;
154 	BOOLEAN fEnemyControlled;   // enemy controlled or not
155 	BOOLEAN fEnemyAirControlled;
156 	INT8    bSAMCondition; // SAM Condition .. 0 - 100, just like an item's status
157 };
158 
159 extern StrategicMapElement StrategicMap[MAP_WORLD_X * MAP_WORLD_Y];
160 
161 #endif
162