1 //-------------------------------------------------------------------------
2 /*
3 Copyright (C) 1997, 2005 - 3D Realms Entertainment
4
5 This file is part of Shadow Warrior version 1.2
6
7 Shadow Warrior is free software; you can redistribute it and/or
8 modify it under the terms of the GNU General Public License
9 as published by the Free Software Foundation; either version 2
10 of the License, or (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
15
16 See the GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
21
22 Original Source: 1997 - Frank Maddin and Jim Norwood
23 Prepared for public release: 03/28/2005 - Charlie Wiederhold, 3D Realms
24 */
25 //-------------------------------------------------------------------------
26 #include "build.h"
27
28 #include "keys.h"
29 #include "names2.h"
30 #include "panel.h"
31 #include "game.h"
32 #include "tags.h"
33 #include "ai.h"
34 #include "actor.h"
35 #include "track.h"
36
37 DECISION LavaBattle[] =
38 {
39 {600, InitActorMoveCloser },
40 {700, InitActorAlertNoise },
41 {710, InitActorRunAway },
42 {1024, InitActorAttack }
43 };
44
45 DECISION LavaOffense[] =
46 {
47 {700, InitActorMoveCloser },
48 {800, InitActorAlertNoise },
49 {1024, InitActorAttack }
50 };
51
52 DECISION LavaBroadcast[] =
53 {
54 {21, InitActorAlertNoise },
55 {51, InitActorAmbientNoise },
56 {1024, InitActorDecide }
57 };
58
59 DECISION LavaSurprised[] =
60 {
61 {701, InitActorMoveCloser },
62 {1024, InitActorDecide }
63 };
64
65 DECISION LavaEvasive[] =
66 {
67 {10, InitActorEvade },
68 {1024, NULL }
69 };
70
71 DECISION LavaLostTarget[] =
72 {
73 {900, InitActorFindPlayer },
74 {1024, InitActorWanderAround }
75 };
76
77 DECISION LavaCloseRange[] =
78 {
79 {700, InitActorAttack },
80 {1024, InitActorReposition }
81 };
82
83 PERSONALITY LavaPersonality =
84 {
85 LavaBattle,
86 LavaOffense,
87 LavaBroadcast,
88 LavaSurprised,
89 LavaEvasive,
90 LavaLostTarget,
91 LavaCloseRange,
92 LavaCloseRange
93 };
94
95 ATTRIBUTE LavaAttrib =
96 {
97 {200, 220, 240, 270}, // Speeds
98 {3, 0, -2, -3}, // Tic Adjusts
99 3, // MaxWeapons;
100 {DIGI_LAVABOSSAMBIENT,DIGI_LAVABOSSALERT,DIGI_LAVABOSSMETEOR,
101 DIGI_LAVABOSSPAIN,DIGI_LAVABOSSEXPLODE,DIGI_LAVABOSSSWIM,
102 DIGI_LAVABOSSRISE,DIGI_LAVABOSSFLAME,DIGI_LAVABOSSMETEXP,
103 DIGI_LAVABOSSSIZZLE}
104 };
105
106 ATTRIBUTE LavaPissedAttrib =
107 {
108 {200, 220, 240, 270}, // Speeds
109 {3, 0, -2, -3}, // Tic Adjusts
110 3, // MaxWeapons;
111 {DIGI_LAVABOSSAMBIENT,DIGI_LAVABOSSALERT,DIGI_LAVABOSSMETEOR,
112 DIGI_LAVABOSSPAIN,DIGI_LAVABOSSEXPLODE,DIGI_LAVABOSSSWIM,
113 DIGI_LAVABOSSRISE,DIGI_LAVABOSSFLAME,DIGI_LAVABOSSMETEXP,
114 DIGI_LAVABOSSSIZZLE}
115 };
116
117 //////////////////////
118 //
119 // LAVA STAND
120 //
121 //////////////////////
122
123 #define LAVA_STAND_RATE 12
124 ANIMATOR DoLavaMove,NullLava,DoActorDebris,NullLava;
125
126 STATE s_LavaStand[5][1] =
127 {
128 {
129 {LAVA_RUN_R0 + 0, LAVA_STAND_RATE, DoLavaMove, &s_LavaStand[0][0]},
130 },
131 {
132 {LAVA_RUN_R1 + 0, LAVA_STAND_RATE, DoLavaMove, &s_LavaStand[1][0]},
133 },
134 {
135 {LAVA_RUN_R2 + 0, LAVA_STAND_RATE, DoLavaMove, &s_LavaStand[2][0]},
136 },
137 {
138 {LAVA_RUN_R3 + 0, LAVA_STAND_RATE, DoLavaMove, &s_LavaStand[3][0]},
139 },
140 {
141 {LAVA_RUN_R4 + 0, LAVA_STAND_RATE, DoLavaMove, &s_LavaStand[4][0]},
142 },
143 };
144
145
146 STATEp sg_LavaStand[] =
147 {
148 s_LavaStand[0],
149 s_LavaStand[1],
150 s_LavaStand[2],
151 s_LavaStand[3],
152 s_LavaStand[4]
153 };
154
155
156 //////////////////////
157 //
158 // LAVA RUN
159 //
160 //////////////////////
161
162 #define LAVA_RUN_RATE 24
163
164
165 STATE s_LavaRun[5][4] =
166 {
167 {
168 {LAVA_RUN_R0 + 0, LAVA_RUN_RATE, DoLavaMove, &s_LavaRun[0][1]},
169 {LAVA_RUN_R0 + 0, LAVA_RUN_RATE, DoLavaMove, &s_LavaRun[0][2]},
170 {LAVA_RUN_R0 + 0, LAVA_RUN_RATE, DoLavaMove, &s_LavaRun[0][3]},
171 {LAVA_RUN_R0 + 0, LAVA_RUN_RATE, DoLavaMove, &s_LavaRun[0][0]},
172 },
173 {
174 {LAVA_RUN_R1 + 0, LAVA_RUN_RATE, DoLavaMove, &s_LavaRun[1][1]},
175 {LAVA_RUN_R1 + 0, LAVA_RUN_RATE, DoLavaMove, &s_LavaRun[1][2]},
176 {LAVA_RUN_R1 + 0, LAVA_RUN_RATE, DoLavaMove, &s_LavaRun[1][3]},
177 {LAVA_RUN_R1 + 0, LAVA_RUN_RATE, DoLavaMove, &s_LavaRun[1][0]},
178 },
179 {
180 {LAVA_RUN_R2 + 0, LAVA_RUN_RATE, DoLavaMove, &s_LavaRun[2][1]},
181 {LAVA_RUN_R2 + 0, LAVA_RUN_RATE, DoLavaMove, &s_LavaRun[2][2]},
182 {LAVA_RUN_R2 + 0, LAVA_RUN_RATE, DoLavaMove, &s_LavaRun[2][3]},
183 {LAVA_RUN_R2 + 0, LAVA_RUN_RATE, DoLavaMove, &s_LavaRun[2][0]},
184 },
185 {
186 {LAVA_RUN_R3 + 0, LAVA_RUN_RATE, DoLavaMove, &s_LavaRun[3][1]},
187 {LAVA_RUN_R3 + 0, LAVA_RUN_RATE, DoLavaMove, &s_LavaRun[3][2]},
188 {LAVA_RUN_R3 + 0, LAVA_RUN_RATE, DoLavaMove, &s_LavaRun[3][3]},
189 {LAVA_RUN_R3 + 0, LAVA_RUN_RATE, DoLavaMove, &s_LavaRun[3][0]},
190 },
191 {
192 {LAVA_RUN_R4 + 0, LAVA_RUN_RATE, DoLavaMove, &s_LavaRun[4][1]},
193 {LAVA_RUN_R4 + 0, LAVA_RUN_RATE, DoLavaMove, &s_LavaRun[4][2]},
194 {LAVA_RUN_R4 + 0, LAVA_RUN_RATE, DoLavaMove, &s_LavaRun[4][3]},
195 {LAVA_RUN_R4 + 0, LAVA_RUN_RATE, DoLavaMove, &s_LavaRun[4][0]},
196 }
197 };
198
199
200 STATEp sg_LavaRun[] =
201 {
202 &s_LavaRun[0][0],
203 &s_LavaRun[1][0],
204 &s_LavaRun[2][0],
205 &s_LavaRun[3][0],
206 &s_LavaRun[4][0]
207 };
208
209 //////////////////////
210 //
211 // LAVA THROW
212 //
213 //////////////////////
214
215 #define LAVA_THROW_RATE 9
216 ANIMATOR InitActorDecide;
217 ANIMATOR InitLavaThrow;
218
219 STATE s_LavaThrow[5][10] =
220 {
221 {
222 {LAVA_THROW_R0 + 0, LAVA_THROW_RATE, NullLava, &s_LavaThrow[0][1]},
223 {LAVA_THROW_R0 + 0, LAVA_THROW_RATE, NullLava, &s_LavaThrow[0][2]},
224 {LAVA_THROW_R0 + 0, LAVA_THROW_RATE*2, NullLava, &s_LavaThrow[0][3]},
225 {LAVA_THROW_R0 + 0, LAVA_THROW_RATE, NullLava, &s_LavaThrow[0][4]},
226 {LAVA_THROW_R0 + 0, LAVA_THROW_RATE, NullLava, &s_LavaThrow[0][5]},
227 {LAVA_THROW_R0 + 0, SF_QUICK_CALL, InitLavaThrow, &s_LavaThrow[0][6]},
228 {LAVA_THROW_R0 + 0, LAVA_THROW_RATE, NullLava, &s_LavaThrow[0][7]},
229 {LAVA_THROW_R0 + 0, LAVA_THROW_RATE, NullLava, &s_LavaThrow[0][8]},
230 {LAVA_THROW_R0 + 0, 0|SF_QUICK_CALL, InitActorDecide, &s_LavaThrow[0][9]},
231 {LAVA_THROW_R0 + 0, LAVA_THROW_RATE, DoLavaMove, &s_LavaThrow[0][9]},
232 },
233 {
234 {LAVA_THROW_R1 + 0, LAVA_THROW_RATE, NullLava, &s_LavaThrow[1][1]},
235 {LAVA_THROW_R1 + 0, LAVA_THROW_RATE, NullLava, &s_LavaThrow[1][2]},
236 {LAVA_THROW_R1 + 0, LAVA_THROW_RATE*2, NullLava, &s_LavaThrow[1][3]},
237 {LAVA_THROW_R1 + 0, LAVA_THROW_RATE, NullLava, &s_LavaThrow[1][4]},
238 {LAVA_THROW_R1 + 0, LAVA_THROW_RATE, NullLava, &s_LavaThrow[1][5]},
239 {LAVA_THROW_R1 + 0, SF_QUICK_CALL, InitLavaThrow, &s_LavaThrow[1][6]},
240 {LAVA_THROW_R1 + 0, LAVA_THROW_RATE, NullLava, &s_LavaThrow[1][7]},
241 {LAVA_THROW_R1 + 0, LAVA_THROW_RATE, NullLava, &s_LavaThrow[1][8]},
242 {LAVA_THROW_R1 + 0, 0|SF_QUICK_CALL, InitActorDecide, &s_LavaThrow[1][9]},
243 {LAVA_THROW_R1 + 0, LAVA_THROW_RATE, DoLavaMove, &s_LavaThrow[1][9]},
244 },
245 {
246 {LAVA_THROW_R2 + 0, LAVA_THROW_RATE, NullLava, &s_LavaThrow[2][1]},
247 {LAVA_THROW_R2 + 0, LAVA_THROW_RATE, NullLava, &s_LavaThrow[2][2]},
248 {LAVA_THROW_R2 + 0, LAVA_THROW_RATE*2, NullLava, &s_LavaThrow[2][3]},
249 {LAVA_THROW_R2 + 0, LAVA_THROW_RATE, NullLava, &s_LavaThrow[2][4]},
250 {LAVA_THROW_R2 + 0, LAVA_THROW_RATE, NullLava, &s_LavaThrow[2][5]},
251 {LAVA_THROW_R2 + 0, SF_QUICK_CALL, InitLavaThrow, &s_LavaThrow[2][6]},
252 {LAVA_THROW_R2 + 0, LAVA_THROW_RATE, NullLava, &s_LavaThrow[2][7]},
253 {LAVA_THROW_R2 + 0, LAVA_THROW_RATE, NullLava, &s_LavaThrow[2][8]},
254 {LAVA_THROW_R2 + 0, 0|SF_QUICK_CALL, InitActorDecide, &s_LavaThrow[2][9]},
255 {LAVA_THROW_R2 + 0, LAVA_THROW_RATE, DoLavaMove, &s_LavaThrow[2][9]},
256 },
257 {
258 {LAVA_THROW_R3 + 0, LAVA_THROW_RATE, NullLava, &s_LavaThrow[3][1]},
259 {LAVA_THROW_R3 + 0, LAVA_THROW_RATE, NullLava, &s_LavaThrow[3][2]},
260 {LAVA_THROW_R3 + 0, LAVA_THROW_RATE*2, NullLava, &s_LavaThrow[3][3]},
261 {LAVA_THROW_R3 + 0, LAVA_THROW_RATE, NullLava, &s_LavaThrow[3][4]},
262 {LAVA_THROW_R3 + 0, LAVA_THROW_RATE, NullLava, &s_LavaThrow[3][5]},
263 {LAVA_THROW_R3 + 0, SF_QUICK_CALL, InitLavaThrow, &s_LavaThrow[3][6]},
264 {LAVA_THROW_R3 + 0, LAVA_THROW_RATE, NullLava, &s_LavaThrow[3][7]},
265 {LAVA_THROW_R3 + 0, LAVA_THROW_RATE, NullLava, &s_LavaThrow[3][8]},
266 {LAVA_THROW_R3 + 0, 0|SF_QUICK_CALL, InitActorDecide, &s_LavaThrow[3][9]},
267 {LAVA_THROW_R3 + 0, LAVA_THROW_RATE, DoLavaMove, &s_LavaThrow[3][9]},
268 },
269 {
270 {LAVA_THROW_R4 + 0, LAVA_THROW_RATE, NullLava, &s_LavaThrow[4][1]},
271 {LAVA_THROW_R4 + 0, LAVA_THROW_RATE, NullLava, &s_LavaThrow[4][2]},
272 {LAVA_THROW_R4 + 0, LAVA_THROW_RATE*2, NullLava, &s_LavaThrow[4][3]},
273 {LAVA_THROW_R4 + 0, LAVA_THROW_RATE, NullLava, &s_LavaThrow[4][4]},
274 {LAVA_THROW_R4 + 0, LAVA_THROW_RATE, NullLava, &s_LavaThrow[4][5]},
275 {LAVA_THROW_R4 + 0, SF_QUICK_CALL, InitLavaThrow, &s_LavaThrow[4][6]},
276 {LAVA_THROW_R4 + 0, LAVA_THROW_RATE, NullLava, &s_LavaThrow[4][7]},
277 {LAVA_THROW_R4 + 0, LAVA_THROW_RATE, NullLava, &s_LavaThrow[4][8]},
278 {LAVA_THROW_R4 + 0, 0|SF_QUICK_CALL, InitActorDecide, &s_LavaThrow[4][9]},
279 {LAVA_THROW_R4 + 0, LAVA_THROW_RATE, DoLavaMove, &s_LavaThrow[4][9]},
280 }
281 };
282
283
284 STATEp sg_LavaThrow[] =
285 {
286 &s_LavaThrow[0][0],
287 &s_LavaThrow[1][0],
288 &s_LavaThrow[2][0],
289 &s_LavaThrow[3][0],
290 &s_LavaThrow[4][0]
291 };
292
293
294 //////////////////////
295 //
296 // LAVA FLAME
297 //
298 //////////////////////
299
300 #define LAVA_FLAME_RATE 18
301 ANIMATOR InitLavaFlame;
302
303 STATE s_LavaFlame[5][8] =
304 {
305 {
306 {LAVA_FLAME_R0 + 0, LAVA_FLAME_RATE*2, NullLava, &s_LavaFlame[0][1]},
307 {LAVA_FLAME_R0 + 0, LAVA_FLAME_RATE, NullLava, &s_LavaFlame[0][2]},
308 {LAVA_FLAME_R0 + 0, LAVA_FLAME_RATE*2, NullLava, &s_LavaFlame[0][3]},
309 {LAVA_FLAME_R0 + 0, SF_QUICK_CALL, InitLavaFlame, &s_LavaFlame[0][4]},
310 {LAVA_FLAME_R0 + 0, LAVA_FLAME_RATE, NullLava, &s_LavaFlame[0][5]},
311 {LAVA_FLAME_R0 + 0, LAVA_FLAME_RATE, NullLava, &s_LavaFlame[0][6]},
312 {LAVA_FLAME_R0 + 0, SF_QUICK_CALL, InitActorDecide, &s_LavaFlame[0][7]},
313 {LAVA_FLAME_R0 + 0, LAVA_FLAME_RATE, DoLavaMove, &s_LavaFlame[0][7]},
314 },
315 {
316 {LAVA_FLAME_R1 + 0, LAVA_FLAME_RATE*2, NullLava, &s_LavaFlame[1][1]},
317 {LAVA_FLAME_R1 + 0, LAVA_FLAME_RATE, NullLava, &s_LavaFlame[1][2]},
318 {LAVA_FLAME_R1 + 0, LAVA_FLAME_RATE*2, NullLava, &s_LavaFlame[1][3]},
319 {LAVA_FLAME_R1 + 0, SF_QUICK_CALL, InitLavaFlame, &s_LavaFlame[1][4]},
320 {LAVA_FLAME_R1 + 0, LAVA_FLAME_RATE, NullLava, &s_LavaFlame[1][5]},
321 {LAVA_FLAME_R1 + 0, LAVA_FLAME_RATE, NullLava, &s_LavaFlame[1][6]},
322 {LAVA_FLAME_R1 + 0, SF_QUICK_CALL, InitActorDecide, &s_LavaFlame[1][7]},
323 {LAVA_FLAME_R1 + 0, LAVA_FLAME_RATE, DoLavaMove, &s_LavaFlame[1][7]},
324 },
325 {
326 {LAVA_FLAME_R2 + 0, LAVA_FLAME_RATE*2, NullLava, &s_LavaFlame[2][1]},
327 {LAVA_FLAME_R2 + 0, LAVA_FLAME_RATE, NullLava, &s_LavaFlame[2][2]},
328 {LAVA_FLAME_R2 + 0, LAVA_FLAME_RATE*2, NullLava, &s_LavaFlame[2][3]},
329 {LAVA_FLAME_R2 + 0, SF_QUICK_CALL, InitLavaFlame, &s_LavaFlame[2][4]},
330 {LAVA_FLAME_R2 + 0, LAVA_FLAME_RATE, NullLava, &s_LavaFlame[2][5]},
331 {LAVA_FLAME_R2 + 0, LAVA_FLAME_RATE, NullLava, &s_LavaFlame[2][6]},
332 {LAVA_FLAME_R2 + 0, SF_QUICK_CALL, InitActorDecide, &s_LavaFlame[2][7]},
333 {LAVA_FLAME_R2 + 0, LAVA_FLAME_RATE, DoLavaMove, &s_LavaFlame[2][7]},
334 },
335 {
336 {LAVA_FLAME_R3 + 0, LAVA_FLAME_RATE*2, NullLava, &s_LavaFlame[3][1]},
337 {LAVA_FLAME_R3 + 0, LAVA_FLAME_RATE, NullLava, &s_LavaFlame[3][2]},
338 {LAVA_FLAME_R3 + 0, LAVA_FLAME_RATE*2, NullLava, &s_LavaFlame[3][3]},
339 {LAVA_FLAME_R3 + 0, SF_QUICK_CALL, InitLavaFlame, &s_LavaFlame[3][4]},
340 {LAVA_FLAME_R3 + 0, LAVA_FLAME_RATE, NullLava, &s_LavaFlame[3][5]},
341 {LAVA_FLAME_R3 + 0, LAVA_FLAME_RATE, NullLava, &s_LavaFlame[3][6]},
342 {LAVA_FLAME_R3 + 0, SF_QUICK_CALL, InitActorDecide, &s_LavaFlame[3][7]},
343 {LAVA_FLAME_R3 + 0, LAVA_FLAME_RATE, DoLavaMove, &s_LavaFlame[3][7]},
344 },
345 {
346 {LAVA_FLAME_R4 + 0, LAVA_FLAME_RATE*2, NullLava, &s_LavaFlame[4][1]},
347 {LAVA_FLAME_R4 + 0, LAVA_FLAME_RATE, NullLava, &s_LavaFlame[4][2]},
348 {LAVA_FLAME_R4 + 0, LAVA_FLAME_RATE*2, NullLava, &s_LavaFlame[4][3]},
349 {LAVA_FLAME_R4 + 0, SF_QUICK_CALL, InitLavaFlame, &s_LavaFlame[4][4]},
350 {LAVA_FLAME_R4 + 0, LAVA_FLAME_RATE, NullLava, &s_LavaFlame[4][5]},
351 {LAVA_FLAME_R4 + 0, LAVA_FLAME_RATE, NullLava, &s_LavaFlame[4][6]},
352 {LAVA_FLAME_R4 + 0, SF_QUICK_CALL, InitActorDecide, &s_LavaFlame[4][7]},
353 {LAVA_FLAME_R4 + 0, LAVA_FLAME_RATE, DoLavaMove, &s_LavaFlame[4][7]},
354 }
355 };
356
357
358 STATEp sg_LavaFlame[] =
359 {
360 &s_LavaFlame[0][0],
361 &s_LavaFlame[1][0],
362 &s_LavaFlame[2][0],
363 &s_LavaFlame[3][0],
364 &s_LavaFlame[4][0]
365 };
366
367 //////////////////////
368 //
369 // LAVA DIE
370 //
371 //////////////////////
372
373 #define LAVA_DIE_RATE 20
374
375 STATE s_LavaDie[] =
376 {
377 {LAVA_DIE + 0, LAVA_DIE_RATE, NullLava, &s_LavaDie[1]},
378 {LAVA_DEAD, LAVA_DIE_RATE, DoActorDebris, &s_LavaDie[1]}
379 };
380
381 STATE s_LavaDead[] =
382 {
383 {LAVA_DEAD, LAVA_DIE_RATE, DoActorDebris, &s_LavaDead[0]},
384 };
385
386 STATEp sg_LavaDie[] =
387 {
388 s_LavaDie
389 };
390
391 STATEp sg_LavaDead[] =
392 {
393 s_LavaDead
394 };
395
396 /*
397 STATEp *Stand[MAX_WEAPONS];
398 STATEp *Run;
399 STATEp *Jump;
400 STATEp *Fall;
401 STATEp *Crawl;
402 STATEp *Swim;
403 STATEp *Fly;
404 STATEp *Rise;
405 STATEp *Sit;
406 STATEp *Look;
407 STATEp *Climb;
408 STATEp *Pain;
409 STATEp *Death1;
410 STATEp *Death2;
411 STATEp *Dead;
412 STATEp *DeathJump;
413 STATEp *DeathFall;
414 STATEp *CloseAttack[2];
415 STATEp *Attack[6];
416 STATEp *Special[2];
417 */
418
419
420 ACTOR_ACTION_SET LavaActionSet =
421 {
422 sg_LavaStand,
423 sg_LavaRun,
424 NULL,//sg_LavaJump,
425 NULL,//sg_LavaFall,
426 NULL,//sg_LavaCrawl,
427 NULL,//sg_LavaSwim,
428 NULL,//sg_LavaFly,
429 NULL,//sg_LavaRise,
430 NULL,//sg_LavaSit,
431 NULL,//sg_LavaLook,
432 NULL,//climb
433 NULL,//pain
434 sg_LavaDie,
435 NULL,//sg_LavaHariKari,
436 sg_LavaDead,
437 NULL,//sg_LavaDeathJump,
438 NULL,//sg_LavaDeathFall,
439 {sg_LavaFlame},
440 {1024},
441 {sg_LavaFlame, sg_LavaThrow, sg_LavaThrow, sg_LavaThrow},
442 {256, 512, 768, 1024},
443 {NULL},
444 NULL,
445 NULL
446 };
447
448 int
SetupLava(short SpriteNum)449 SetupLava(short SpriteNum)
450 {
451 SPRITEp sp = &sprite[SpriteNum];
452 USERp u;
453 ANIMATOR DoActorDecide;
454
455 if (TEST(sp->cstat, CSTAT_SPRITE_RESTORE))
456 {
457 u = User[SpriteNum];
458 ASSERT(u);
459 }
460 else
461 {
462 User[SpriteNum] = u = SpawnUser(SpriteNum,LAVA_RUN_R0,s_LavaRun[0]);
463 u->Health = 100;
464 }
465
466 ChangeState(SpriteNum, s_LavaRun[0]);
467 u->Attrib = &LavaAttrib;
468 DoActorSetSpeed(SpriteNum, NORM_SPEED);
469 u->StateEnd = s_LavaDie;
470 u->Rot = sg_LavaRun;
471
472 EnemyDefaults(SpriteNum, &LavaActionSet, &LavaPersonality);
473 sp->xrepeat = sp->yrepeat = 110;
474 sp->clipdist = (512) >> 2;
475 SET(u->Flags, SPR_XFLIP_TOGGLE|SPR_ELECTRO_TOLERANT);
476
477 u->loz = sp->z;
478
479 return(0);
480 }
481
NullLava(short SpriteNum)482 int NullLava(short SpriteNum)
483 {
484 SPRITEp sp = &sprite[SpriteNum];
485 USERp u = User[SpriteNum];
486
487 if (TEST(u->Flags,SPR_SLIDING))
488 DoActorSlide(SpriteNum);
489
490 KeepActorOnFloor(SpriteNum);
491
492 DoActorSectorDamage(SpriteNum);
493 return(0);
494 }
495
DoLavaMove(short SpriteNum)496 int DoLavaMove(short SpriteNum)
497 {
498 SPRITEp sp = &sprite[SpriteNum];
499 USERp u = User[SpriteNum];
500
501 if (TEST(u->Flags,SPR_SLIDING))
502 DoActorSlide(SpriteNum);
503
504 if (u->track >= 0)
505 ActorFollowTrack(SpriteNum, ACTORMOVETICS);
506 else
507 (*u->ActorActionFunc)(SpriteNum);
508
509 KeepActorOnFloor(SpriteNum);
510
511 DoActorSectorDamage(SpriteNum);
512 return(0);
513 }
514
515
516 #include "saveable.h"
517
518 static saveable_code saveable_lava_code[] = {
519 SAVE_CODE(SetupLava),
520 SAVE_CODE(NullLava),
521 SAVE_CODE(DoLavaMove),
522 };
523
524 static saveable_data saveable_lava_data[] = {
525 SAVE_DATA(LavaBattle),
526 SAVE_DATA(LavaOffense),
527 SAVE_DATA(LavaBroadcast),
528 SAVE_DATA(LavaSurprised),
529 SAVE_DATA(LavaEvasive),
530 SAVE_DATA(LavaLostTarget),
531 SAVE_DATA(LavaCloseRange),
532
533 SAVE_DATA(LavaPersonality),
534
535 SAVE_DATA(LavaAttrib),
536 SAVE_DATA(LavaPissedAttrib),
537
538 SAVE_DATA(s_LavaStand),
539 SAVE_DATA(sg_LavaStand),
540 SAVE_DATA(s_LavaRun),
541 SAVE_DATA(sg_LavaRun),
542 SAVE_DATA(s_LavaThrow),
543 SAVE_DATA(sg_LavaThrow),
544 SAVE_DATA(s_LavaFlame),
545 SAVE_DATA(sg_LavaFlame),
546 SAVE_DATA(s_LavaDie),
547 SAVE_DATA(s_LavaDead),
548 SAVE_DATA(sg_LavaDie),
549 SAVE_DATA(sg_LavaDead),
550
551 SAVE_DATA(LavaActionSet),
552 };
553
554 saveable_module saveable_lava = {
555 // code
556 saveable_lava_code,
557 SIZ(saveable_lava_code),
558
559 // data
560 saveable_lava_data,
561 SIZ(saveable_lava_data)
562 };
563