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