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