1 #include "TileDat.h"
2 #include "Types.h"
3 #include "Pits.h"
4 #include "WorldDef.h"
5 #include "WorldMan.h"
6 #include "Simple_Render_Utils.h"
7 #include "World_Items.h"
8 #include "SaveLoadMap.h"
9 #include "Exit_Grids.h"
10 #include "Sys_Globals.h"
11 #include "StrategicMap.h"
12 #include "Isometric_Utils.h"
13 #include "Overhead.h"
14 #include "Sound_Control.h"
15 #include "Animation_Control.h"
16 #include "Strategic.h"
17 #include "Action_Items.h"
18
19
20 //used by editor
21 BOOLEAN gfShowPits = FALSE;
22
23
Add3X3Pit(INT32 iMapIndex)24 void Add3X3Pit( INT32 iMapIndex )
25 {
26 ApplyMapChangesToMapTempFile app(!gfEditMode);
27 EXITGRID ExitGrid;
28 AddObjectToTail( iMapIndex + 159, REGWATERTEXTURE1 );
29 AddObjectToTail( iMapIndex - 1, REGWATERTEXTURE2 );
30 AddObjectToTail( iMapIndex - 161, REGWATERTEXTURE3 );
31 AddObjectToTail( iMapIndex + 160, REGWATERTEXTURE4 );
32 AddObjectToTail( iMapIndex, REGWATERTEXTURE5 );
33 AddObjectToTail( iMapIndex - 160, REGWATERTEXTURE6 );
34 AddObjectToTail( iMapIndex + 161, REGWATERTEXTURE7 );
35 AddObjectToTail( iMapIndex + 1, REGWATERTEXTURE8 );
36 AddObjectToTail( iMapIndex - 159, REGWATERTEXTURE9 );
37 if( !gfEditMode )
38 { //Add the exitgrids associated with the pit.
39 ExitGrid.ubGotoSectorX = (UINT8)gWorldSectorX;
40 ExitGrid.ubGotoSectorY = (UINT8)gWorldSectorY;
41 ExitGrid.ubGotoSectorZ = (UINT8)(gbWorldSectorZ+1);
42 ExitGrid.usGridNo = (UINT16)iMapIndex;
43 AddExitGridToWorld( iMapIndex + 159, &ExitGrid );
44 AddExitGridToWorld( iMapIndex - 1, &ExitGrid );
45 AddExitGridToWorld( iMapIndex - 161, &ExitGrid );
46 AddExitGridToWorld( iMapIndex + 160, &ExitGrid );
47 AddExitGridToWorld( iMapIndex, &ExitGrid );
48 AddExitGridToWorld( iMapIndex - 160, &ExitGrid );
49 AddExitGridToWorld( iMapIndex + 161, &ExitGrid );
50 AddExitGridToWorld( iMapIndex + 1, &ExitGrid );
51 AddExitGridToWorld( iMapIndex - 159, &ExitGrid );
52 RecompileLocalMovementCostsFromRadius( (INT16)iMapIndex, 2 );
53 }
54
55 MarkWorldDirty();
56 }
57
58
Add5X5Pit(INT32 iMapIndex)59 void Add5X5Pit( INT32 iMapIndex )
60 {
61 ApplyMapChangesToMapTempFile app(!gfEditMode);
62 EXITGRID ExitGrid;
63 AddObjectToTail( iMapIndex + 318, REGWATERTEXTURE10 );
64 AddObjectToTail( iMapIndex + 158, REGWATERTEXTURE11 );
65 AddObjectToTail( iMapIndex - 2, REGWATERTEXTURE12 );
66 AddObjectToTail( iMapIndex - 162, REGWATERTEXTURE13 );
67 AddObjectToTail( iMapIndex - 322, REGWATERTEXTURE14 );
68 AddObjectToTail( iMapIndex + 319, REGWATERTEXTURE15 );
69 AddObjectToTail( iMapIndex + 159, REGWATERTEXTURE16 );
70 AddObjectToTail( iMapIndex - 1, REGWATERTEXTURE17 );
71 AddObjectToTail( iMapIndex - 161, REGWATERTEXTURE18 );
72 AddObjectToTail( iMapIndex - 321, REGWATERTEXTURE19 );
73 AddObjectToTail( iMapIndex + 320, REGWATERTEXTURE20 );
74 AddObjectToTail( iMapIndex + 160, REGWATERTEXTURE21 );
75 AddObjectToTail( iMapIndex, REGWATERTEXTURE22 );
76 AddObjectToTail( iMapIndex - 160, REGWATERTEXTURE23 );
77 AddObjectToTail( iMapIndex - 320, REGWATERTEXTURE24 );
78 AddObjectToTail( iMapIndex + 321, REGWATERTEXTURE25 );
79 AddObjectToTail( iMapIndex + 161, REGWATERTEXTURE26 );
80 AddObjectToTail( iMapIndex + 1, REGWATERTEXTURE27 );
81 AddObjectToTail( iMapIndex - 159, REGWATERTEXTURE28 );
82 AddObjectToTail( iMapIndex - 319, REGWATERTEXTURE29 );
83 AddObjectToTail( iMapIndex + 322, REGWATERTEXTURE30 );
84 AddObjectToTail( iMapIndex + 162, REGWATERTEXTURE31 );
85 AddObjectToTail( iMapIndex + 2, REGWATERTEXTURE32 );
86 AddObjectToTail( iMapIndex - 158, REGWATERTEXTURE33 );
87 AddObjectToTail( iMapIndex - 318, REGWATERTEXTURE34 );
88 if( !gfEditMode )
89 { //Add the exitgrids associated with the pit.
90 ExitGrid.ubGotoSectorX = (UINT8)gWorldSectorX;
91 ExitGrid.ubGotoSectorY = (UINT8)gWorldSectorY;
92 ExitGrid.ubGotoSectorZ = (UINT8)(gbWorldSectorZ+1);
93 ExitGrid.usGridNo = (UINT16)iMapIndex;
94 AddExitGridToWorld( iMapIndex + 318, &ExitGrid );
95 AddExitGridToWorld( iMapIndex + 158, &ExitGrid );
96 AddExitGridToWorld( iMapIndex - 2, &ExitGrid );
97 AddExitGridToWorld( iMapIndex - 162, &ExitGrid );
98 AddExitGridToWorld( iMapIndex - 322, &ExitGrid );
99 AddExitGridToWorld( iMapIndex + 319, &ExitGrid );
100 AddExitGridToWorld( iMapIndex + 159, &ExitGrid );
101 AddExitGridToWorld( iMapIndex - 1, &ExitGrid );
102 AddExitGridToWorld( iMapIndex - 161, &ExitGrid );
103 AddExitGridToWorld( iMapIndex - 321, &ExitGrid );
104 AddExitGridToWorld( iMapIndex + 320, &ExitGrid );
105 AddExitGridToWorld( iMapIndex + 160, &ExitGrid );
106 AddExitGridToWorld( iMapIndex, &ExitGrid );
107 AddExitGridToWorld( iMapIndex - 160, &ExitGrid );
108 AddExitGridToWorld( iMapIndex - 320, &ExitGrid );
109 AddExitGridToWorld( iMapIndex + 321, &ExitGrid );
110 AddExitGridToWorld( iMapIndex + 161, &ExitGrid );
111 AddExitGridToWorld( iMapIndex + 1, &ExitGrid );
112 AddExitGridToWorld( iMapIndex - 159, &ExitGrid );
113 AddExitGridToWorld( iMapIndex - 319, &ExitGrid );
114 AddExitGridToWorld( iMapIndex + 322, &ExitGrid );
115 AddExitGridToWorld( iMapIndex + 162, &ExitGrid );
116 AddExitGridToWorld( iMapIndex + 2, &ExitGrid );
117 AddExitGridToWorld( iMapIndex - 158, &ExitGrid );
118 AddExitGridToWorld( iMapIndex - 318, &ExitGrid );
119 RecompileLocalMovementCostsFromRadius( (INT16)iMapIndex, 3 );
120 }
121 MarkWorldDirty();
122 }
123
Remove3X3Pit(INT32 iMapIndex)124 void Remove3X3Pit( INT32 iMapIndex )
125 {
126 RemoveAllObjectsOfTypeRange( iMapIndex + 159, REGWATERTEXTURE, REGWATERTEXTURE );
127 RemoveAllObjectsOfTypeRange( iMapIndex - 1, REGWATERTEXTURE, REGWATERTEXTURE );
128 RemoveAllObjectsOfTypeRange( iMapIndex - 161, REGWATERTEXTURE, REGWATERTEXTURE );
129 RemoveAllObjectsOfTypeRange( iMapIndex + 160, REGWATERTEXTURE, REGWATERTEXTURE );
130 RemoveAllObjectsOfTypeRange( iMapIndex, REGWATERTEXTURE, REGWATERTEXTURE );
131 RemoveAllObjectsOfTypeRange( iMapIndex - 160, REGWATERTEXTURE, REGWATERTEXTURE );
132 RemoveAllObjectsOfTypeRange( iMapIndex + 161, REGWATERTEXTURE, REGWATERTEXTURE );
133 RemoveAllObjectsOfTypeRange( iMapIndex + 1, REGWATERTEXTURE, REGWATERTEXTURE );
134 RemoveAllObjectsOfTypeRange( iMapIndex - 159, REGWATERTEXTURE, REGWATERTEXTURE );
135 MarkWorldDirty();
136 }
137
Remove5X5Pit(INT32 iMapIndex)138 void Remove5X5Pit( INT32 iMapIndex )
139 {
140 RemoveAllObjectsOfTypeRange( iMapIndex + 318, REGWATERTEXTURE, REGWATERTEXTURE );
141 RemoveAllObjectsOfTypeRange( iMapIndex + 158, REGWATERTEXTURE, REGWATERTEXTURE );
142 RemoveAllObjectsOfTypeRange( iMapIndex - 2, REGWATERTEXTURE, REGWATERTEXTURE );
143 RemoveAllObjectsOfTypeRange( iMapIndex - 162, REGWATERTEXTURE, REGWATERTEXTURE );
144 RemoveAllObjectsOfTypeRange( iMapIndex - 322, REGWATERTEXTURE, REGWATERTEXTURE );
145 RemoveAllObjectsOfTypeRange( iMapIndex + 319, REGWATERTEXTURE, REGWATERTEXTURE );
146 RemoveAllObjectsOfTypeRange( iMapIndex + 159, REGWATERTEXTURE, REGWATERTEXTURE );
147 RemoveAllObjectsOfTypeRange( iMapIndex - 1, REGWATERTEXTURE, REGWATERTEXTURE );
148 RemoveAllObjectsOfTypeRange( iMapIndex - 161, REGWATERTEXTURE, REGWATERTEXTURE );
149 RemoveAllObjectsOfTypeRange( iMapIndex - 321, REGWATERTEXTURE, REGWATERTEXTURE );
150 RemoveAllObjectsOfTypeRange( iMapIndex + 320, REGWATERTEXTURE, REGWATERTEXTURE );
151 RemoveAllObjectsOfTypeRange( iMapIndex + 160, REGWATERTEXTURE, REGWATERTEXTURE );
152 RemoveAllObjectsOfTypeRange( iMapIndex, REGWATERTEXTURE, REGWATERTEXTURE );
153 RemoveAllObjectsOfTypeRange( iMapIndex - 160, REGWATERTEXTURE, REGWATERTEXTURE );
154 RemoveAllObjectsOfTypeRange( iMapIndex - 320, REGWATERTEXTURE, REGWATERTEXTURE );
155 RemoveAllObjectsOfTypeRange( iMapIndex + 321, REGWATERTEXTURE, REGWATERTEXTURE );
156 RemoveAllObjectsOfTypeRange( iMapIndex + 161, REGWATERTEXTURE, REGWATERTEXTURE );
157 RemoveAllObjectsOfTypeRange( iMapIndex + 1, REGWATERTEXTURE, REGWATERTEXTURE );
158 RemoveAllObjectsOfTypeRange( iMapIndex - 159, REGWATERTEXTURE, REGWATERTEXTURE );
159 RemoveAllObjectsOfTypeRange( iMapIndex - 319, REGWATERTEXTURE, REGWATERTEXTURE );
160 RemoveAllObjectsOfTypeRange( iMapIndex + 322, REGWATERTEXTURE, REGWATERTEXTURE );
161 RemoveAllObjectsOfTypeRange( iMapIndex + 162, REGWATERTEXTURE, REGWATERTEXTURE );
162 RemoveAllObjectsOfTypeRange( iMapIndex + 2, REGWATERTEXTURE, REGWATERTEXTURE );
163 RemoveAllObjectsOfTypeRange( iMapIndex - 158, REGWATERTEXTURE, REGWATERTEXTURE );
164 RemoveAllObjectsOfTypeRange( iMapIndex - 318, REGWATERTEXTURE, REGWATERTEXTURE );
165 MarkWorldDirty();
166 }
167
AddAllPits()168 void AddAllPits()
169 {
170 for (const WORLDITEM& wi : gWorldItems)
171 {
172 if (wi.o.usItem != ACTION_ITEM) continue;
173
174 switch (wi.o.bActionValue)
175 {
176 case ACTION_ITEM_SMALL_PIT: Add3X3Pit(wi.sGridNo); break;
177 case ACTION_ITEM_LARGE_PIT: Add5X5Pit(wi.sGridNo); break;
178 }
179 }
180 }
181
RemoveAllPits()182 void RemoveAllPits()
183 {
184 for (const WORLDITEM& wi : gWorldItems)
185 {
186 if (wi.o.usItem != ACTION_ITEM) continue;
187
188 switch (wi.o.bActionValue)
189 {
190 case ACTION_ITEM_SMALL_PIT: Remove3X3Pit(wi.sGridNo); break;
191 case ACTION_ITEM_LARGE_PIT: Remove5X5Pit(wi.sGridNo); break;
192 }
193 }
194 }
195
SearchForOtherMembersWithinPitRadiusAndMakeThemFall(INT16 sGridNo,INT16 sRadius)196 void SearchForOtherMembersWithinPitRadiusAndMakeThemFall( INT16 sGridNo, INT16 sRadius )
197 {
198 INT16 x, y, sNewGridNo;
199
200 PlayLocationJA2Sample(sGridNo, CAVE_COLLAPSE, HIGHVOLUME, 1);
201 for( y = -sRadius; y <= sRadius; y++ ) for( x = -sRadius; x <= sRadius; x++ )
202 {
203 sNewGridNo = sGridNo + y * WORLD_COLS + x;
204 //Validate gridno location, and check if there are any mercs here. If there are
205 //any mercs, we want them to fall below. The exitgrid already exists at this location
206 if( GridNoOnVisibleWorldTile( sNewGridNo ) )
207 {
208
209 // Check if buddy exists here.....
210 SOLDIERTYPE* const pSoldier = WhoIsThere2(sNewGridNo, 0);
211 if (pSoldier != NULL)
212 {
213 // OK, make guy fall...
214 // Set data to look for exit grid....
215 pSoldier->uiPendingActionData4 = sNewGridNo;
216
217 EVENT_InitNewSoldierAnim( pSoldier, FALL_INTO_PIT, 0 , FALSE );
218 }
219 }
220 }
221 }
222
223
HandleFallIntoPitFromAnimation(SOLDIERTYPE & s)224 void HandleFallIntoPitFromAnimation(SOLDIERTYPE& s)
225 {
226 GridNo const pit_pos = (GridNo)s.uiPendingActionData4;
227 EXITGRID exit_grid;
228 GetExitGrid(pit_pos, &exit_grid);
229 // Given exit grid, move buddy to next sector
230 s.ubStrategicInsertionCode = INSERTION_CODE_GRIDNO;
231 s.usStrategicInsertionData = exit_grid.usGridNo;
232 s.sSectorX = exit_grid.ubGotoSectorX;
233 s.sSectorY = exit_grid.ubGotoSectorY;
234 s.bSectorZ = exit_grid.ubGotoSectorZ;
235 RemoveSoldierFromTacticalSector(s);
236 HandleSoldierLeavingSectorByThemSelf(&s);
237 SetSoldierHeight(&s, 0);
238 }
239