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