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 "quake.h"
35 #include "fx_man.h"
36 #include "actor.h"
37 #include "sector.h"
38 #include "sprite.h"
39 
40 
41 ANIMATOR NullToiletGirl;
42 
43 ATTRIBUTE ToiletGirlAttrib =
44     {
45     {0, 0, 0, 0},                     // Speeds
46     {0, 0, 0, 0},                     // Tic Adjusts
47      3,                               // MaxWeapons;
48     {0, 0, DIGI_TOILETGIRLSCREAM,
49      DIGI_TOILETGIRLPAIN, DIGI_TOILETGIRLSCREAM, 0,0,0,0,0}
50     };
51 
52 //////////////////////
53 //
54 // TOILETGIRL STAND
55 //
56 //////////////////////
57 #define TOILETGIRL_RATE 60
58 ANIMATOR NullToiletGirl,DoToiletGirl;
59 
60 STATE s_ToiletGirlStand[2] =
61     {
62     {TOILETGIRL_R0 + 0, TOILETGIRL_RATE, DoToiletGirl, &s_ToiletGirlStand[1]},
63     {TOILETGIRL_R0 + 1, TOILETGIRL_RATE, DoToiletGirl, &s_ToiletGirlStand[0]}
64     };
65 
66 //////////////////////
67 //
68 // TOILETGIRL PAIN
69 //
70 //////////////////////
71 
72 #define TOILETGIRL_PAIN_RATE 32
73 #define TOILETGIRL_PAIN_R0 TOILETGIRL_R0
74 ANIMATOR ToiletGirlPain;
75 
76 STATE s_ToiletGirlPain[2] =
77     {
78     {TOILETGIRL_PAIN_R0 + 0, TOILETGIRL_PAIN_RATE, ToiletGirlPain, &s_ToiletGirlPain[1]},
79     {TOILETGIRL_PAIN_R0 + 0, 0|SF_QUICK_CALL, InitActorDecide, &s_ToiletGirlPain[0]}
80     };
81 
82 //////////////////////
83 //
84 // TOILETGIRL UZI
85 //
86 //////////////////////
87 
88 #define TOILETGIRL_UZI_RATE 8
89 #define TOILETGIRL_FIRE_R0 TOILETGIRL_R0 + 2
90 ANIMATOR InitEnemyUzi,ToiletGirlUzi;
91 
92 STATE s_ToiletGirlUzi[16] =
93     {
94     {TOILETGIRL_FIRE_R0 + 0, TOILETGIRL_UZI_RATE, ToiletGirlUzi, &s_ToiletGirlUzi[1]},
95     {TOILETGIRL_FIRE_R0 + 0, 0 | SF_QUICK_CALL, InitEnemyUzi, &s_ToiletGirlUzi[2]},
96     {TOILETGIRL_FIRE_R0 + 1, TOILETGIRL_UZI_RATE, ToiletGirlUzi, &s_ToiletGirlUzi[3]},
97     {TOILETGIRL_FIRE_R0 + 1, 0 | SF_QUICK_CALL, InitEnemyUzi, &s_ToiletGirlUzi[4]},
98     {TOILETGIRL_FIRE_R0 + 0, TOILETGIRL_UZI_RATE, ToiletGirlUzi, &s_ToiletGirlUzi[5]},
99     {TOILETGIRL_FIRE_R0 + 0, 0 | SF_QUICK_CALL, InitEnemyUzi, &s_ToiletGirlUzi[6]},
100     {TOILETGIRL_FIRE_R0 + 1, TOILETGIRL_UZI_RATE, ToiletGirlUzi, &s_ToiletGirlUzi[7]},
101     {TOILETGIRL_FIRE_R0 + 1, 0 | SF_QUICK_CALL, InitEnemyUzi, &s_ToiletGirlUzi[8]},
102     {TOILETGIRL_FIRE_R0 + 0, TOILETGIRL_UZI_RATE, ToiletGirlUzi, &s_ToiletGirlUzi[9]},
103     {TOILETGIRL_FIRE_R0 + 0, 0 | SF_QUICK_CALL, InitEnemyUzi, &s_ToiletGirlUzi[10]},
104     {TOILETGIRL_FIRE_R0 + 1, TOILETGIRL_UZI_RATE, ToiletGirlUzi, &s_ToiletGirlUzi[11]},
105     {TOILETGIRL_FIRE_R0 + 1, 0 | SF_QUICK_CALL, InitEnemyUzi, &s_ToiletGirlUzi[12]},
106     {TOILETGIRL_FIRE_R0 + 0, TOILETGIRL_UZI_RATE, ToiletGirlUzi, &s_ToiletGirlUzi[13]},
107     {TOILETGIRL_FIRE_R0 + 0, 0 | SF_QUICK_CALL, InitEnemyUzi, &s_ToiletGirlUzi[14]},
108     {TOILETGIRL_FIRE_R0 + 1, TOILETGIRL_UZI_RATE, ToiletGirlUzi, &s_ToiletGirlUzi[15]},
109     {TOILETGIRL_FIRE_R0 + 1, 0 | SF_QUICK_CALL, InitEnemyUzi, &s_ToiletGirlUzi[0]},
110     };
111 
112 int
SetupToiletGirl(short SpriteNum)113 SetupToiletGirl(short SpriteNum)
114 {
115     SPRITEp sp = &sprite[SpriteNum];
116     USERp u;
117     ANIMATOR DoActorDecide;
118 
119     if (TEST(sp->cstat, CSTAT_SPRITE_RESTORE))
120         {
121         u = User[SpriteNum];
122         ASSERT(u);
123         }
124     else
125         {
126         User[SpriteNum] = u = SpawnUser(SpriteNum,TOILETGIRL_R0,s_ToiletGirlStand);
127         u->Health = 60;
128         }
129 
130 
131     EnemyDefaults(SpriteNum, NULL, NULL);
132 
133     ChangeState(SpriteNum,s_ToiletGirlStand);
134     u->Attrib = &ToiletGirlAttrib;
135     u->StateEnd = s_ToiletGirlStand;
136     u->Rot = 0;
137     u->RotNum = 0;
138 
139     sp->xrepeat = 38;
140     sp->yrepeat = 32;
141     sp->xvel = sp->yvel = sp->zvel = 0;
142     sp->lotag = TOILETGIRL_R0;
143     u->FlagOwner = 0;
144     u->ID = TOILETGIRL_R0;
145 
146     RESET(u->Flags, SPR_XFLIP_TOGGLE);
147 
148     return(0);
149 }
150 
DoToiletGirl(short SpriteNum)151 int DoToiletGirl(short SpriteNum)
152 {
153     USERp u = User[SpriteNum];
154     SPRITEp sp = User[SpriteNum]->SpriteP;
155     short rnd_range = 0;
156     static int handle=0;
157     BOOL ICanSee = FALSE;
158 
159     DoActorPickClosePlayer(SpriteNum);
160     ICanSee = FAFcansee(sp->x,sp->y,SPRITEp_MID(sp),sp->sectnum,u->tgt_sp->x,u->tgt_sp->y,SPRITEp_MID(u->tgt_sp),u->tgt_sp->sectnum);
161 
162     if(u->FlagOwner != 1)
163         {
164         if(RANDOM_RANGE(1000) > 980)
165             {
166             static int handle;
167             short choose_snd;
168 
169             choose_snd = RANDOM_P2(1024<<4)>>4;
170 
171             if(!FX_SoundActive(handle))
172                 {
173                 if(choose_snd > 750)
174                     handle = PlaySound(DIGI_TOILETGIRLFART1,&sp->x,&sp->y,&sp->z,v3df_dontpan);
175                 else
176                 if(choose_snd > 350)
177                     handle = PlaySound(DIGI_TOILETGIRLFART2,&sp->x,&sp->y,&sp->z,v3df_dontpan);
178                 else
179                     handle = PlaySound(DIGI_TOILETGIRLFART3,&sp->x,&sp->y,&sp->z,v3df_dontpan);
180                 }
181             }
182         }else
183         if ((u->WaitTics -= ACTORMOVETICS) <= 0 && ICanSee)
184             {
185             static int madhandle;
186 
187             if(!FX_SoundActive(madhandle))
188                 {
189                 if(RANDOM_RANGE(1000<<8)>>8 > 500)
190                     madhandle = PlaySound(DIGI_ANIMEMAD1,&sp->x,&sp->y,&sp->z,v3df_dontpan);
191                 else
192                     madhandle = PlaySound(DIGI_ANIMEMAD2,&sp->x,&sp->y,&sp->z,v3df_dontpan);
193                 }
194             ChangeState(SpriteNum,s_ToiletGirlUzi);
195             u->WaitTics = SEC(1)+SEC(RANDOM_RANGE(3<<8)>>8);
196             u->FlagOwner = 0;
197             }
198 
199     //(*u->ActorActionFunc) (SpriteNum);
200 
201 
202     // stay on floor unless doing certain things
203     if (!TEST(u->Flags, SPR_JUMPING | SPR_FALLING | SPR_CLIMBING))
204         {
205         KeepActorOnFloor(SpriteNum);
206         }
207 
208     // take damage from environment
209     DoActorSectorDamage(SpriteNum);
210     sp->xvel = sp->yvel = sp->zvel = 0;
211 
212     return(0);
213 }
214 
NullToiletGirl(short SpriteNum)215 int NullToiletGirl(short SpriteNum)
216     {
217     USERp u = User[SpriteNum];
218     SPRITEp sp = User[SpriteNum]->SpriteP;
219     BOOL ICanSee = FALSE;
220 
221     DoActorPickClosePlayer(SpriteNum);
222     ICanSee = FAFcansee(sp->x,sp->y,SPRITEp_MID(sp),sp->sectnum,u->tgt_sp->x,u->tgt_sp->y,u->tgt_sp->z,u->tgt_sp->sectnum);
223 
224     if (!TEST(u->Flags,SPR_CLIMBING))
225         KeepActorOnFloor(SpriteNum);
226 
227     if(u->FlagOwner != 1)
228         {
229         }else
230         if ((u->WaitTics -= ACTORMOVETICS) <= 0 && ICanSee)
231             {
232             static int madhandle;
233 
234             if(!FX_SoundActive(madhandle))
235                 {
236                 if(RANDOM_RANGE(1000<<8)>>8 > 500)
237                     madhandle = PlaySound(DIGI_ANIMEMAD1,&sp->x,&sp->y,&sp->z,v3df_dontpan);
238                 else
239                     madhandle = PlaySound(DIGI_ANIMEMAD2,&sp->x,&sp->y,&sp->z,v3df_dontpan);
240                 }
241             ChangeState(SpriteNum,s_ToiletGirlUzi);
242             u->WaitTics = SEC(1)+SEC(RANDOM_RANGE(3<<8)>>8);
243             u->FlagOwner = 0;
244             }
245 
246     return(0);
247     }
248 
ToiletGirlUzi(short SpriteNum)249 int ToiletGirlUzi(short SpriteNum)
250     {
251     USERp u = User[SpriteNum];
252     SPRITEp sp = User[SpriteNum]->SpriteP;
253 
254     if (!TEST(u->Flags,SPR_CLIMBING))
255         KeepActorOnFloor(SpriteNum);
256 
257     if ((u->WaitTics -= ACTORMOVETICS) <= 0)
258         {
259         u->WaitTics = RANDOM_RANGE(240)+120;
260         ChangeState(SpriteNum,s_ToiletGirlStand);
261         u->FlagOwner = 0;
262         }
263 
264     return(0);
265     }
266 
ToiletGirlPain(short SpriteNum)267 int ToiletGirlPain(short SpriteNum)
268     {
269     SPRITEp sp = &sprite[SpriteNum];
270     USERp u = User[SpriteNum];
271 
272     NullToiletGirl(SpriteNum);
273 
274     if ((u->WaitTics -= ACTORMOVETICS) <= 0)
275         ChangeState(SpriteNum,s_ToiletGirlStand);
276 
277     return(0);
278     }
279 
280 //////////////////////////////////////////////////////////////////////////////////////////////
281 
282 ANIMATOR NullWashGirl;
283 
284 ATTRIBUTE WashGirlAttrib =
285     {
286     {0, 0, 0, 0},                     // Speeds
287     {0, 0, 0, 0},                     // Tic Adjusts
288      3,                               // MaxWeapons;
289     {0, 0, DIGI_TOILETGIRLSCREAM,
290      DIGI_TOILETGIRLPAIN, DIGI_TOILETGIRLSCREAM, 0,0,0,0,0}
291     };
292 
293 //////////////////////
294 //
295 // WASHGIRL STAND
296 //
297 //////////////////////
298 #define WASHGIRL_RATE 60
299 ANIMATOR NullWashGirl,DoWashGirl;
300 
301 STATE s_WashGirlStand[2] =
302     {
303     {WASHGIRL_R0 + 0, WASHGIRL_RATE, DoWashGirl, &s_WashGirlStand[1]},
304     {WASHGIRL_R0 + 1, WASHGIRL_RATE, DoWashGirl, &s_WashGirlStand[0]}
305     };
306 
307 #define WASHGIRL_RATE2 20
308 STATE s_WashGirlStandScrub[2] =
309     {
310     {WASHGIRL_R0 + 0, WASHGIRL_RATE2, DoWashGirl, &s_WashGirlStandScrub[1]},
311     {WASHGIRL_R0 + 1, WASHGIRL_RATE2, DoWashGirl, &s_WashGirlStandScrub[0]}
312     };
313 
314 //////////////////////
315 //
316 // WASHGIRL PAIN
317 //
318 //////////////////////
319 
320 #define WASHGIRL_PAIN_RATE 30
321 #define WASHGIRL_PAIN_R0 WASHGIRL_R0
322 ANIMATOR WashGirlPain;
323 
324 STATE s_WashGirlPain[2] =
325     {
326     {WASHGIRL_PAIN_R0 + 0, WASHGIRL_PAIN_RATE, WashGirlPain, &s_WashGirlPain[1]},
327     {WASHGIRL_PAIN_R0 + 0, 0|SF_QUICK_CALL, InitActorDecide, &s_WashGirlPain[0]}
328     };
329 
330 //////////////////////
331 //
332 // WASHGIRL UZI
333 //
334 //////////////////////
335 
336 #define WASHGIRL_UZI_RATE 8
337 #define WASHGIRL_FIRE_R0 WASHGIRL_R0 + 2
338 ANIMATOR InitEnemyUzi,WashGirlUzi;
339 
340 STATE s_WashGirlUzi[16] =
341     {
342     {WASHGIRL_FIRE_R0 + 0, WASHGIRL_UZI_RATE, WashGirlUzi, &s_WashGirlUzi[1]},
343     {WASHGIRL_FIRE_R0 + 0, 0 | SF_QUICK_CALL, InitEnemyUzi, &s_WashGirlUzi[2]},
344     {WASHGIRL_FIRE_R0 + 1, WASHGIRL_UZI_RATE, WashGirlUzi, &s_WashGirlUzi[3]},
345     {WASHGIRL_FIRE_R0 + 1, 0 | SF_QUICK_CALL, InitEnemyUzi, &s_WashGirlUzi[4]},
346     {WASHGIRL_FIRE_R0 + 0, WASHGIRL_UZI_RATE, WashGirlUzi, &s_WashGirlUzi[5]},
347     {WASHGIRL_FIRE_R0 + 0, 0 | SF_QUICK_CALL, InitEnemyUzi, &s_WashGirlUzi[6]},
348     {WASHGIRL_FIRE_R0 + 1, WASHGIRL_UZI_RATE, WashGirlUzi, &s_WashGirlUzi[7]},
349     {WASHGIRL_FIRE_R0 + 1, 0 | SF_QUICK_CALL, InitEnemyUzi, &s_WashGirlUzi[8]},
350     {WASHGIRL_FIRE_R0 + 0, WASHGIRL_UZI_RATE, WashGirlUzi, &s_WashGirlUzi[9]},
351     {WASHGIRL_FIRE_R0 + 0, 0 | SF_QUICK_CALL, InitEnemyUzi, &s_WashGirlUzi[10]},
352     {WASHGIRL_FIRE_R0 + 1, WASHGIRL_UZI_RATE, WashGirlUzi, &s_WashGirlUzi[11]},
353     {WASHGIRL_FIRE_R0 + 1, 0 | SF_QUICK_CALL, InitEnemyUzi, &s_WashGirlUzi[12]},
354     {WASHGIRL_FIRE_R0 + 0, WASHGIRL_UZI_RATE, WashGirlUzi, &s_WashGirlUzi[13]},
355     {WASHGIRL_FIRE_R0 + 0, 0 | SF_QUICK_CALL, InitEnemyUzi, &s_WashGirlUzi[14]},
356     {WASHGIRL_FIRE_R0 + 1, WASHGIRL_UZI_RATE, WashGirlUzi, &s_WashGirlUzi[15]},
357     {WASHGIRL_FIRE_R0 + 1, 0 | SF_QUICK_CALL, InitEnemyUzi, &s_WashGirlUzi[0]},
358     };
359 
360 int
SetupWashGirl(short SpriteNum)361 SetupWashGirl(short SpriteNum)
362 {
363     SPRITEp sp = &sprite[SpriteNum];
364     USERp u;
365     ANIMATOR DoActorDecide;
366 
367     if (TEST(sp->cstat, CSTAT_SPRITE_RESTORE))
368         {
369         u = User[SpriteNum];
370         ASSERT(u);
371         }
372     else
373         {
374         User[SpriteNum] = u = SpawnUser(SpriteNum,WASHGIRL_R0,s_WashGirlStand);
375         u->Health = 60;
376         }
377 
378     EnemyDefaults(SpriteNum, NULL, NULL);
379 
380     ChangeState(SpriteNum,s_WashGirlStand);
381     u->Attrib = &WashGirlAttrib;
382     u->StateEnd = s_WashGirlStand;
383     u->Rot = 0;
384     u->RotNum = 0;
385 
386     sp->xrepeat = 28;
387     sp->yrepeat = 24;
388     sp->xvel = sp->yvel = sp->zvel = 0;
389     sp->lotag = WASHGIRL_R0;
390     u->FlagOwner = 0;
391     u->ID = WASHGIRL_R0;
392 
393     RESET(u->Flags, SPR_XFLIP_TOGGLE);
394 
395     return(0);
396 }
397 
DoWashGirl(short SpriteNum)398 int DoWashGirl(short SpriteNum)
399 {
400     USERp u = User[SpriteNum];
401     SPRITEp sp = User[SpriteNum]->SpriteP;
402     short rnd_range = 0;
403     static int handle=0;
404     BOOL ICanSee = FALSE;
405 
406     DoActorPickClosePlayer(SpriteNum);
407     ICanSee = FAFcansee(sp->x,sp->y,SPRITEp_MID(sp),sp->sectnum,u->tgt_sp->x,u->tgt_sp->y,SPRITEp_MID(u->tgt_sp),u->tgt_sp->sectnum);
408 
409     if(RANDOM_RANGE(1000) > 980 && u->ShellNum <= 0)
410         {
411         static int handle;
412 
413         if(!FX_SoundActive(handle))
414             {
415             if(RANDOM_P2(1024<<4)>>4 > 500)
416                 handle = PlaySound(DIGI_ANIMESING1,&sp->x,&sp->y,&sp->z,v3df_dontpan);
417             else
418                 handle = PlaySound(DIGI_ANIMESING2,&sp->x,&sp->y,&sp->z,v3df_dontpan);
419             }
420 
421         ChangeState(SpriteNum,s_WashGirlStandScrub);
422         u->ShellNum = RANDOM_RANGE(2*120)+240;
423         } else
424         {
425         if(u->ShellNum > 0)
426             {
427             if((u->ShellNum -= ACTORMOVETICS) < 0)
428                 {
429                 ChangeState(SpriteNum,s_WashGirlStand);
430                 u->ShellNum = 0;
431                 }
432             }
433         }
434 
435     if(u->FlagOwner != 1)
436         {
437         }else
438         if ((u->WaitTics -= ACTORMOVETICS) <= 0 && ICanSee)
439             {
440             static int madhandle;
441 
442             if(!FX_SoundActive(madhandle))
443                 {
444                 if(RANDOM_RANGE(1000<<8)>>8 > 500)
445                     madhandle = PlaySound(DIGI_ANIMEMAD1,&sp->x,&sp->y,&sp->z,v3df_dontpan);
446                 else
447                     madhandle = PlaySound(DIGI_ANIMEMAD2,&sp->x,&sp->y,&sp->z,v3df_dontpan);
448                 }
449             ChangeState(SpriteNum,s_WashGirlUzi);
450             u->WaitTics = SEC(1)+SEC(RANDOM_RANGE(3<<8)>>8);
451             u->FlagOwner = 0;
452             }
453 
454     // stay on floor unless doing certain things
455     if (!TEST(u->Flags, SPR_JUMPING | SPR_FALLING | SPR_CLIMBING))
456         {
457         KeepActorOnFloor(SpriteNum);
458         }
459 
460     // take damage from environment
461     DoActorSectorDamage(SpriteNum);
462     sp->xvel = sp->yvel = sp->zvel = 0;
463 
464     return(0);
465 }
466 
NullWashGirl(short SpriteNum)467 int NullWashGirl(short SpriteNum)
468 {
469     USERp u = User[SpriteNum];
470     SPRITEp sp = User[SpriteNum]->SpriteP;
471     BOOL ICanSee = FALSE;
472 
473     DoActorPickClosePlayer(SpriteNum);
474     ICanSee = FAFcansee(sp->x,sp->y,SPRITEp_MID(sp),sp->sectnum,u->tgt_sp->x,u->tgt_sp->y,u->tgt_sp->z,u->tgt_sp->sectnum);
475 
476     if (!TEST(u->Flags,SPR_CLIMBING))
477         KeepActorOnFloor(SpriteNum);
478 
479     if(u->FlagOwner != 1)
480         {
481         }else
482         if ((u->WaitTics -= ACTORMOVETICS) <= 0 && ICanSee)
483             {
484             static int madhandle;
485 
486             if(!FX_SoundActive(madhandle))
487                 {
488                 if(RANDOM_RANGE(1000<<8)>>8 > 500)
489                     madhandle = PlaySound(DIGI_ANIMEMAD1,&sp->x,&sp->y,&sp->z,v3df_dontpan);
490                 else
491                     madhandle = PlaySound(DIGI_ANIMEMAD2,&sp->x,&sp->y,&sp->z,v3df_dontpan);
492                 }
493             ChangeState(SpriteNum,s_WashGirlUzi);
494             u->WaitTics = SEC(1)+SEC(RANDOM_RANGE(3<<8)>>8);
495             u->FlagOwner = 0;
496             }
497 
498     return(0);
499 }
500 
WashGirlUzi(short SpriteNum)501 int WashGirlUzi(short SpriteNum)
502 {
503     USERp u = User[SpriteNum];
504     SPRITEp sp = User[SpriteNum]->SpriteP;
505 
506     if (!TEST(u->Flags,SPR_CLIMBING))
507         KeepActorOnFloor(SpriteNum);
508 
509     if ((u->WaitTics -= ACTORMOVETICS) <= 0)
510         {
511         u->WaitTics = RANDOM_RANGE(240)+120;
512         ChangeState(SpriteNum,s_WashGirlStand);
513         u->FlagOwner = 0;
514         }
515 
516     return(0);
517 }
518 
WashGirlPain(short SpriteNum)519 int WashGirlPain(short SpriteNum)
520 {
521     SPRITEp sp = &sprite[SpriteNum];
522     USERp u = User[SpriteNum];
523 
524     NullWashGirl(SpriteNum);
525 
526     if ((u->WaitTics -= ACTORMOVETICS) <= 0)
527         ChangeState(SpriteNum,s_WashGirlStand);
528 
529     return(0);
530 }
531 
532 
533 //////////////////////////////////////////////////////////////////////////////////////////////
534 
535 ATTRIBUTE TrashCanAttrib =
536     {
537     {0, 0, 0, 0},                     // Speeds
538     {0, 0, 0, 0},                     // Tic Adjusts
539      0,                               // MaxWeapons;
540     {0, 0, DIGI_TRASHLID, DIGI_TRASHLID, 0, 0,0,0,0,0}
541     };
542 
543 //////////////////////
544 //
545 // TRASHCAN STAND
546 //
547 //////////////////////
548 #define TRASHCAN_RATE 120
549 #define TRASHCAN_R0 TRASHCAN
550 ANIMATOR NullTrashCan,DoTrashCan;
551 
552 STATE s_TrashCanStand[1] =
553     {
554     {TRASHCAN_R0 + 0, TRASHCAN_RATE, DoTrashCan, &s_TrashCanStand[0]}
555     };
556 
557 //////////////////////
558 //
559 // TRASHCAN PAIN
560 //
561 //////////////////////
562 
563 #define TRASHCAN_PAIN_RATE 8
564 #define TRASHCAN_PAIN_R0 TRASHCAN
565 ANIMATOR TrashCanPain, TrashCanStand;
566 
567 STATE s_TrashCanPain[7] =
568     {
569     {TRASHCAN_PAIN_R0 + 0, TRASHCAN_PAIN_RATE, TrashCanPain, &s_TrashCanPain[1]},
570     {TRASHCAN_PAIN_R0 + 1, TRASHCAN_PAIN_RATE, TrashCanPain, &s_TrashCanPain[2]},
571     {TRASHCAN_PAIN_R0 + 2, TRASHCAN_PAIN_RATE, TrashCanPain, &s_TrashCanPain[3]},
572     {TRASHCAN_PAIN_R0 + 3, TRASHCAN_PAIN_RATE, TrashCanPain, &s_TrashCanPain[4]},
573     {TRASHCAN_PAIN_R0 + 4, TRASHCAN_PAIN_RATE, TrashCanPain, &s_TrashCanPain[5]},
574     {TRASHCAN_PAIN_R0 + 5, TRASHCAN_PAIN_RATE, TrashCanPain, &s_TrashCanPain[6]},
575     {TRASHCAN_PAIN_R0 + 6, TRASHCAN_PAIN_RATE, TrashCanPain, &s_TrashCanPain[0]}
576     };
577 
578 int
SetupTrashCan(short SpriteNum)579 SetupTrashCan(short SpriteNum)
580 {
581     SPRITEp sp = &sprite[SpriteNum];
582     USERp u;
583     ANIMATOR DoActorDecide;
584 
585     if (TEST(sp->cstat, CSTAT_SPRITE_RESTORE))
586         {
587         u = User[SpriteNum];
588         ASSERT(u);
589         }
590     else
591         {
592         User[SpriteNum] = u = SpawnUser(SpriteNum,TRASHCAN,s_TrashCanStand);
593         u->Health = 60;
594         }
595 
596     EnemyDefaults(SpriteNum, NULL, NULL);
597 
598     ChangeState(SpriteNum,s_TrashCanStand);
599     u->Attrib = &TrashCanAttrib;
600     u->StateEnd = s_TrashCanStand;
601     u->Rot = 0;
602     u->RotNum = 0;
603 
604 
605     sp->xrepeat = 46;
606     sp->yrepeat = 42;
607     sp->xvel = sp->yvel = sp->zvel = 0;
608     u->ID = TRASHCAN;
609 
610     RESET(u->Flags, SPR_XFLIP_TOGGLE);
611     RESET(sp->extra, SPRX_PLAYER_OR_ENEMY);
612 
613     return(0);
614 }
615 
DoTrashCan(short SpriteNum)616 int DoTrashCan(short SpriteNum)
617 {
618     USERp u = User[SpriteNum];
619     SPRITEp sp = User[SpriteNum]->SpriteP;
620     short rnd_range = 0;
621     static int handle=0;
622 
623     //(*u->ActorActionFunc) (SpriteNum);
624 
625     // stay on floor unless doing certain things
626     if (TEST(u->Flags,SPR_SLIDING))
627         DoActorSlide(SpriteNum);
628 
629     if (!TEST(u->Flags, SPR_JUMPING | SPR_FALLING | SPR_CLIMBING))
630         {
631         KeepActorOnFloor(SpriteNum);
632         }
633 
634     sp->xvel = sp->yvel = sp->zvel = 0;
635 
636     return(0);
637 }
638 
TrashCanPain(short SpriteNum)639 int TrashCanPain(short SpriteNum)
640 {
641     USERp u = User[SpriteNum];
642     SPRITEp sp = User[SpriteNum]->SpriteP;
643 
644     if (TEST(u->Flags,SPR_SLIDING))
645         DoActorSlide(SpriteNum);
646 
647     if (!TEST(u->Flags,SPR_CLIMBING))
648         KeepActorOnFloor(SpriteNum);
649 
650     if ((u->WaitTics -= ACTORMOVETICS) <= 0)
651         ChangeState(SpriteNum,s_TrashCanStand);
652 
653     return(0);
654 }
655 
656 
657 //////////////////////////////////////////////////////////////////////////////////////////////
658 
659 ////////////////////////////////////////////////////////////////////
660 // PACHINKO WIN LIGHT
661 ////////////////////////////////////////////////////////////////////
662 ATTRIBUTE PachinkoLightAttrib =
663     {
664     {0, 0, 0, 0},                     // Speeds
665     {0, 0, 0, 0},                     // Tic Adjusts
666      0,                               // MaxWeapons;
667     {0, 0, DIGI_TRASHLID, DIGI_TRASHLID, 0, 0,0,0,0,0}
668     };
669 
670 #define PACHINKOLIGHT_RATE 120
671 #define PACHINKOLIGHT_R0 623
672 
673 STATE s_PachinkoLightStand[] =
674     {
675     {PACHINKOLIGHT_R0 + 0, PACHINKOLIGHT_RATE, NullAnimator, &s_PachinkoLightStand[0]}
676     };
677 
678 ANIMATOR PachinkoLightOperate;
679 STATE s_PachinkoLightOperate[] =
680     {
681     {PACHINKOLIGHT_R0 - 0, 12, PachinkoLightOperate, &s_PachinkoLightOperate[1]},
682     {PACHINKOLIGHT_R0 - 1, 12, PachinkoLightOperate, &s_PachinkoLightOperate[2]},
683     {PACHINKOLIGHT_R0 - 2, 12, PachinkoLightOperate, &s_PachinkoLightOperate[3]},
684     {PACHINKOLIGHT_R0 - 3, 12, PachinkoLightOperate, &s_PachinkoLightOperate[4]},
685     {PACHINKOLIGHT_R0 - 4, 12, PachinkoLightOperate, &s_PachinkoLightOperate[5]},
686     {PACHINKOLIGHT_R0 - 5, 12, PachinkoLightOperate, &s_PachinkoLightOperate[0]},
687     };
688 
689 int
SetupPachinkoLight(short SpriteNum)690 SetupPachinkoLight(short SpriteNum)
691 {
692     SPRITEp sp = &sprite[SpriteNum];
693     USERp u;
694     ANIMATOR DoActorDecide;
695 
696     if (TEST(sp->cstat, CSTAT_SPRITE_RESTORE))
697         {
698         u = User[SpriteNum];
699         ASSERT(u);
700         }
701     else
702         {
703         User[SpriteNum] = u = SpawnUser(SpriteNum,PACHINKOLIGHT_R0,s_PachinkoLightStand);
704         u->Health = 1;
705         }
706 
707     EnemyDefaults(SpriteNum, NULL, NULL);
708 
709     ChangeState(SpriteNum,s_PachinkoLightStand);
710     u->Attrib = &PachinkoLightAttrib;
711     u->StateEnd = s_PachinkoLightStand;
712     u->Rot = 0;
713     u->RotNum = 0;
714     u->ID = PACHINKOLIGHT_R0;
715 
716     sp->xvel = sp->yvel = sp->zvel = 0;
717     sp->lotag = TAG_PACHINKOLIGHT;
718     sp->shade = -2;
719     u->spal = sp->pal;
720 
721     RESET(u->Flags, SPR_XFLIP_TOGGLE);
722     RESET(sp->extra, SPRX_PLAYER_OR_ENEMY);
723 
724     return(0);
725 }
726 
PachinkoLightOperate(short SpriteNum)727 int PachinkoLightOperate(short SpriteNum)
728     {
729     SPRITEp sp = &sprite[SpriteNum];
730     USERp u = User[SpriteNum];
731 
732     if ((u->WaitTics -= ACTORMOVETICS) <= 0)
733         {
734         sp->shade = -2;
735         ChangeState(SpriteNum,s_PachinkoLightStand);
736         }
737     return(0);
738     }
739 
740 ////////////////////////////////////////////////////////////////////
741 // PACHINKO MACHINE #1
742 ////////////////////////////////////////////////////////////////////
743 
744 BOOL Pachinko_Win_Cheat = FALSE;
745 
746 ATTRIBUTE Pachinko1Attrib =
747     {
748     {0, 0, 0, 0},                     // Speeds
749     {0, 0, 0, 0},                     // Tic Adjusts
750      0,                               // MaxWeapons;
751     {0, 0, DIGI_TRASHLID, DIGI_TRASHLID, 0, 0,0,0,0,0}
752     };
753 
754 #define PACHINKO1_RATE 120
755 #define PACHINKO1_R0 PACHINKO1
756 
757 STATE s_Pachinko1Stand[] =
758     {
759     {PACHINKO1_R0 + 0, PACHINKO1_RATE, NullAnimator, &s_Pachinko1Stand[0]}
760     };
761 
762 ANIMATOR Pachinko1Operate,PachinkoCheckWin;
763 STATE s_Pachinko1Operate[] =
764     {
765     {PACHINKO1_R0 + 0, 12, Pachinko1Operate, &s_Pachinko1Operate[1]},
766     {PACHINKO1_R0 + 1, 12, Pachinko1Operate, &s_Pachinko1Operate[2]},
767     {PACHINKO1_R0 + 2, 12, Pachinko1Operate, &s_Pachinko1Operate[3]},
768     {PACHINKO1_R0 + 3, 12, Pachinko1Operate, &s_Pachinko1Operate[4]},
769     {PACHINKO1_R0 + 4, 12, Pachinko1Operate, &s_Pachinko1Operate[5]},
770     {PACHINKO1_R0 + 5, 12, Pachinko1Operate, &s_Pachinko1Operate[6]},
771     {PACHINKO1_R0 + 6, 12, Pachinko1Operate, &s_Pachinko1Operate[7]},
772     {PACHINKO1_R0 + 7, 12, Pachinko1Operate, &s_Pachinko1Operate[8]},
773     {PACHINKO1_R0 + 8, 12, Pachinko1Operate, &s_Pachinko1Operate[9]},
774     {PACHINKO1_R0 + 9, 12, Pachinko1Operate, &s_Pachinko1Operate[10]},
775     {PACHINKO1_R0 + 10, 12, Pachinko1Operate, &s_Pachinko1Operate[11]},
776     {PACHINKO1_R0 + 11, 12, Pachinko1Operate, &s_Pachinko1Operate[12]},
777     {PACHINKO1_R0 + 12, 12, Pachinko1Operate, &s_Pachinko1Operate[13]},
778     {PACHINKO1_R0 + 13, 12, Pachinko1Operate, &s_Pachinko1Operate[14]},
779     {PACHINKO1_R0 + 14, 12, Pachinko1Operate, &s_Pachinko1Operate[15]},
780     {PACHINKO1_R0 + 15, 12, Pachinko1Operate, &s_Pachinko1Operate[16]},
781     {PACHINKO1_R0 + 16, 12, Pachinko1Operate, &s_Pachinko1Operate[17]},
782     {PACHINKO1_R0 + 17, 12, Pachinko1Operate, &s_Pachinko1Operate[18]},
783     {PACHINKO1_R0 + 18, 12, Pachinko1Operate, &s_Pachinko1Operate[19]},
784     {PACHINKO1_R0 + 19, 12, Pachinko1Operate, &s_Pachinko1Operate[20]},
785     {PACHINKO1_R0 + 20, 12, Pachinko1Operate, &s_Pachinko1Operate[21]},
786     {PACHINKO1_R0 + 21, 12, Pachinko1Operate, &s_Pachinko1Operate[22]},
787     {PACHINKO1_R0 + 22, SF_QUICK_CALL, PachinkoCheckWin, &s_Pachinko1Stand[0]}
788     };
789 
790 int
SetupPachinko1(short SpriteNum)791 SetupPachinko1(short SpriteNum)
792 {
793     SPRITEp sp = &sprite[SpriteNum];
794     USERp u;
795     ANIMATOR DoActorDecide;
796 
797     if (TEST(sp->cstat, CSTAT_SPRITE_RESTORE))
798         {
799         u = User[SpriteNum];
800         ASSERT(u);
801         }
802     else
803         {
804         User[SpriteNum] = u = SpawnUser(SpriteNum,PACHINKO1,s_Pachinko1Stand);
805         u->Health = 1;
806         }
807 
808     EnemyDefaults(SpriteNum, NULL, NULL);
809 
810     ChangeState(SpriteNum,s_Pachinko1Stand);
811     u->Attrib = &Pachinko1Attrib;
812     u->StateEnd = s_Pachinko1Stand;
813     u->Rot = 0;
814     u->RotNum = 0;
815     u->ID = PACHINKO1;
816 
817     sp->yvel = sp->zvel = 0;
818     sp->lotag = PACHINKO1;
819 
820     RESET(u->Flags, SPR_XFLIP_TOGGLE);
821     RESET(sp->extra, SPRX_PLAYER_OR_ENEMY);
822 
823     return(0);
824 }
825 
PachinkoCheckWin(short SpriteNum)826 int PachinkoCheckWin(short SpriteNum)
827     {
828     SPRITEp sp = &sprite[SpriteNum];
829     USERp u = User[SpriteNum];
830     short rnd;
831 
832     u->WaitTics = 0;  // Can operate it again now
833 
834     //CON_ConMessage("bool1 = %d",TEST_BOOL1(sp));
835     // You already won, no more from this machine!
836     if(TEST_BOOL1(sp)) return(0);
837 
838     // Well? Did I win????!
839     rnd = RANDOM_RANGE(1000);
840     if(RANDOM_RANGE(1000) > 900 || Pachinko_Win_Cheat)
841         {
842         short i, nexti;
843         SPRITEp tsp;
844         USERp tu;
845 
846         // Do a possible combo switch
847         if (ComboSwitchTest(TAG_COMBO_SWITCH_EVERYTHING, sp->hitag))
848             {
849             DoMatchEverything(Player+myconnectindex, sp->hitag, ON);
850             }
851 
852         ActorCoughItem(SpriteNum); // I WON! I WON!
853         PlaySound(DIGI_PALARM,&sp->x,&sp->y,&sp->z,v3df_none);
854 
855         // Can't win any more now!
856         SET_BOOL1(sp);
857 
858         // Turn on the pachinko lights
859         TRAVERSE_SPRITE_STAT(headspritestat[STAT_ENEMY], i, nexti)
860             {
861             tsp = &sprite[i];
862             tu = User[i];
863 
864             if(tsp->lotag == TAG_PACHINKOLIGHT)
865                 {
866                 if(tsp->hitag == SP_TAG5(sp))
867                     {
868                     tsp->shade = -90; // Full brightness
869                     tu->WaitTics = SEC(3); // Flash
870                     ChangeState(i,s_PachinkoLightOperate);
871                     }
872                 }
873             }
874 
875         }
876 
877         //{
878         //if(rnd > 950)
879         //    PlayerSound(DIGI_SHISEISI,&pp->posx,&pp->posy,&pp->posz,v3df_follow|v3df_dontpan,pp);
880         //else
881         //if(rnd > 900)
882         //    PlayerSound(DIGI_YOULOOKSTUPID,&pp->posx,&pp->posy,&pp->posz,v3df_follow|v3df_dontpan,pp);
883         //else
884         //if(rnd > 850)
885         //    PlayerSound(DIGI_HURTBAD5,&pp->posx,&pp->posy,&pp->posz,v3df_follow|v3df_dontpan,pp);
886         //}
887 
888     return(0);
889     }
890 
Pachinko1Operate(short SpriteNum)891 int Pachinko1Operate(short SpriteNum)
892     {
893     SPRITEp sp = &sprite[SpriteNum];
894     USERp u = User[SpriteNum];
895     short rnd;
896     PLAYERp pp = Player + myconnectindex;
897 
898     rnd = RANDOM_RANGE(1000);
899     if(rnd > 900)
900         {
901         rnd = RANDOM_RANGE(1000);  // TEMP SOUNDS: Need pachinko sounds!
902         if(rnd > 700)
903             PlaySound(DIGI_PROLL1,&sp->x,&sp->y,&sp->z,v3df_none);
904         else
905         if(rnd > 400)
906             PlaySound(DIGI_PROLL2,&sp->x,&sp->y,&sp->z,v3df_none);
907         else
908             PlaySound(DIGI_PROLL3,&sp->x,&sp->y,&sp->z,v3df_none);
909         }
910 
911     return(0);
912     }
913 
914 
915 ////////////////////////////////////////////////////////////////////
916 // PACHINKO MACHINE #2
917 ////////////////////////////////////////////////////////////////////
918 
919 ATTRIBUTE Pachinko2Attrib =
920     {
921     {0, 0, 0, 0},                     // Speeds
922     {0, 0, 0, 0},                     // Tic Adjusts
923      0,                               // MaxWeapons;
924     {0, 0, DIGI_TRASHLID, DIGI_TRASHLID, 0, 0,0,0,0,0}
925     };
926 
927 #define PACHINKO2_RATE 120
928 #define PACHINKO2_R0 PACHINKO2
929 
930 STATE s_Pachinko2Stand[] =
931     {
932     {PACHINKO2_R0 + 0, PACHINKO2_RATE, NullAnimator, &s_Pachinko2Stand[0]}
933     };
934 
935 ANIMATOR Pachinko2Operate;
936 STATE s_Pachinko2Operate[] =
937     {
938     {PACHINKO2_R0 + 0, 12, Pachinko1Operate, &s_Pachinko2Operate[1]},
939     {PACHINKO2_R0 + 1, 12, Pachinko1Operate, &s_Pachinko2Operate[2]},
940     {PACHINKO2_R0 + 2, 12, Pachinko1Operate, &s_Pachinko2Operate[3]},
941     {PACHINKO2_R0 + 3, 12, Pachinko1Operate, &s_Pachinko2Operate[4]},
942     {PACHINKO2_R0 + 4, 12, Pachinko1Operate, &s_Pachinko2Operate[5]},
943     {PACHINKO2_R0 + 5, 12, Pachinko1Operate, &s_Pachinko2Operate[6]},
944     {PACHINKO2_R0 + 6, 12, Pachinko1Operate, &s_Pachinko2Operate[7]},
945     {PACHINKO2_R0 + 7, 12, Pachinko1Operate, &s_Pachinko2Operate[8]},
946     {PACHINKO2_R0 + 8, 12, Pachinko1Operate, &s_Pachinko2Operate[9]},
947     {PACHINKO2_R0 + 9, 12, Pachinko1Operate, &s_Pachinko2Operate[10]},
948     {PACHINKO2_R0 + 10, 12, Pachinko1Operate, &s_Pachinko2Operate[11]},
949     {PACHINKO2_R0 + 11, 12, Pachinko1Operate, &s_Pachinko2Operate[12]},
950     {PACHINKO2_R0 + 12, 12, Pachinko1Operate, &s_Pachinko2Operate[13]},
951     {PACHINKO2_R0 + 13, 12, Pachinko1Operate, &s_Pachinko2Operate[14]},
952     {PACHINKO2_R0 + 14, 12, Pachinko1Operate, &s_Pachinko2Operate[15]},
953     {PACHINKO2_R0 + 15, 12, Pachinko1Operate, &s_Pachinko2Operate[16]},
954     {PACHINKO2_R0 + 16, 12, Pachinko1Operate, &s_Pachinko2Operate[17]},
955     {PACHINKO2_R0 + 17, 12, Pachinko1Operate, &s_Pachinko2Operate[18]},
956     {PACHINKO2_R0 + 18, 12, Pachinko1Operate, &s_Pachinko2Operate[19]},
957     {PACHINKO2_R0 + 19, 12, Pachinko1Operate, &s_Pachinko2Operate[20]},
958     {PACHINKO2_R0 + 20, 12, Pachinko1Operate, &s_Pachinko2Operate[21]},
959     {PACHINKO2_R0 + 21, 12, Pachinko1Operate, &s_Pachinko2Operate[22]},
960     {PACHINKO2_R0 + 22, SF_QUICK_CALL, PachinkoCheckWin, &s_Pachinko2Stand[0]}
961     };
962 
963 int
SetupPachinko2(short SpriteNum)964 SetupPachinko2(short SpriteNum)
965 {
966     SPRITEp sp = &sprite[SpriteNum];
967     USERp u;
968     ANIMATOR DoActorDecide;
969 
970     if (TEST(sp->cstat, CSTAT_SPRITE_RESTORE))
971         {
972         u = User[SpriteNum];
973         ASSERT(u);
974         }
975     else
976         {
977         User[SpriteNum] = u = SpawnUser(SpriteNum,PACHINKO2,s_Pachinko2Stand);
978         u->Health = 1;
979         }
980 
981     EnemyDefaults(SpriteNum, NULL, NULL);
982 
983     ChangeState(SpriteNum,s_Pachinko2Stand);
984     u->Attrib = &Pachinko2Attrib;
985     u->StateEnd = s_Pachinko2Stand;
986     u->Rot = 0;
987     u->RotNum = 0;
988     u->ID = PACHINKO2;
989 
990     sp->yvel = sp->zvel = 0;
991     sp->lotag = PACHINKO2;
992 
993     RESET(u->Flags, SPR_XFLIP_TOGGLE);
994     RESET(sp->extra, SPRX_PLAYER_OR_ENEMY);
995 
996     return(0);
997 }
998 
999 ////////////////////////////////////////////////////////////////////
1000 // PACHINKO MACHINE #3
1001 ////////////////////////////////////////////////////////////////////
1002 
1003 ATTRIBUTE Pachinko3Attrib =
1004     {
1005     {0, 0, 0, 0},                     // Speeds
1006     {0, 0, 0, 0},                     // Tic Adjusts
1007      0,                               // MaxWeapons;
1008     {0, 0, DIGI_TRASHLID, DIGI_TRASHLID, 0, 0,0,0,0,0}
1009     };
1010 
1011 #define PACHINKO3_RATE 120
1012 #define PACHINKO3_R0 PACHINKO3
1013 
1014 STATE s_Pachinko3Stand[] =
1015     {
1016     {PACHINKO3_R0 + 0, PACHINKO3_RATE, NullAnimator, &s_Pachinko3Stand[0]}
1017     };
1018 
1019 ANIMATOR Pachinko3Operate;
1020 STATE s_Pachinko3Operate[] =
1021     {
1022     {PACHINKO3_R0 + 0, 12, Pachinko1Operate, &s_Pachinko3Operate[1]},
1023     {PACHINKO3_R0 + 1, 12, Pachinko1Operate, &s_Pachinko3Operate[2]},
1024     {PACHINKO3_R0 + 2, 12, Pachinko1Operate, &s_Pachinko3Operate[3]},
1025     {PACHINKO3_R0 + 3, 12, Pachinko1Operate, &s_Pachinko3Operate[4]},
1026     {PACHINKO3_R0 + 4, 12, Pachinko1Operate, &s_Pachinko3Operate[5]},
1027     {PACHINKO3_R0 + 5, 12, Pachinko1Operate, &s_Pachinko3Operate[6]},
1028     {PACHINKO3_R0 + 6, 12, Pachinko1Operate, &s_Pachinko3Operate[7]},
1029     {PACHINKO3_R0 + 7, 12, Pachinko1Operate, &s_Pachinko3Operate[8]},
1030     {PACHINKO3_R0 + 8, 12, Pachinko1Operate, &s_Pachinko3Operate[9]},
1031     {PACHINKO3_R0 + 9, 12, Pachinko1Operate, &s_Pachinko3Operate[10]},
1032     {PACHINKO3_R0 + 10, 12, Pachinko1Operate, &s_Pachinko3Operate[11]},
1033     {PACHINKO3_R0 + 11, 12, Pachinko1Operate, &s_Pachinko3Operate[12]},
1034     {PACHINKO3_R0 + 12, 12, Pachinko1Operate, &s_Pachinko3Operate[13]},
1035     {PACHINKO3_R0 + 13, 12, Pachinko1Operate, &s_Pachinko3Operate[14]},
1036     {PACHINKO3_R0 + 14, 12, Pachinko1Operate, &s_Pachinko3Operate[15]},
1037     {PACHINKO3_R0 + 15, 12, Pachinko1Operate, &s_Pachinko3Operate[16]},
1038     {PACHINKO3_R0 + 16, 12, Pachinko1Operate, &s_Pachinko3Operate[17]},
1039     {PACHINKO3_R0 + 17, 12, Pachinko1Operate, &s_Pachinko3Operate[18]},
1040     {PACHINKO3_R0 + 18, 12, Pachinko1Operate, &s_Pachinko3Operate[19]},
1041     {PACHINKO3_R0 + 19, 12, Pachinko1Operate, &s_Pachinko3Operate[20]},
1042     {PACHINKO3_R0 + 20, 12, Pachinko1Operate, &s_Pachinko3Operate[21]},
1043     {PACHINKO3_R0 + 21, 12, Pachinko1Operate, &s_Pachinko3Operate[22]},
1044     {PACHINKO3_R0 + 22, SF_QUICK_CALL, PachinkoCheckWin, &s_Pachinko3Stand[0]}
1045     };
1046 
1047 int
SetupPachinko3(short SpriteNum)1048 SetupPachinko3(short SpriteNum)
1049 {
1050     SPRITEp sp = &sprite[SpriteNum];
1051     USERp u;
1052     ANIMATOR DoActorDecide;
1053 
1054     if (TEST(sp->cstat, CSTAT_SPRITE_RESTORE))
1055         {
1056         u = User[SpriteNum];
1057         ASSERT(u);
1058         }
1059     else
1060         {
1061         User[SpriteNum] = u = SpawnUser(SpriteNum,PACHINKO3,s_Pachinko3Stand);
1062         u->Health = 1;
1063         }
1064 
1065     EnemyDefaults(SpriteNum, NULL, NULL);
1066 
1067     ChangeState(SpriteNum,s_Pachinko3Stand);
1068     u->Attrib = &Pachinko3Attrib;
1069     u->StateEnd = s_Pachinko3Stand;
1070     u->Rot = 0;
1071     u->RotNum = 0;
1072     u->ID = PACHINKO3;
1073 
1074     sp->yvel = sp->zvel = 0;
1075     sp->lotag = PACHINKO3;
1076 
1077     RESET(u->Flags, SPR_XFLIP_TOGGLE);
1078     RESET(sp->extra, SPRX_PLAYER_OR_ENEMY);
1079 
1080     return(0);
1081 }
1082 
1083 
1084 ////////////////////////////////////////////////////////////////////
1085 // PACHINKO MACHINE #4
1086 ////////////////////////////////////////////////////////////////////
1087 
1088 ATTRIBUTE Pachinko4Attrib =
1089     {
1090     {0, 0, 0, 0},                     // Speeds
1091     {0, 0, 0, 0},                     // Tic Adjusts
1092      0,                               // MaxWeapons;
1093     {0, 0, DIGI_TRASHLID, DIGI_TRASHLID, 0, 0,0,0,0,0}
1094     };
1095 
1096 #define PACHINKO4_RATE 120
1097 #define PACHINKO4_R0 PACHINKO4
1098 
1099 STATE s_Pachinko4Stand[] =
1100     {
1101     {PACHINKO4_R0 + 0, PACHINKO4_RATE, NullAnimator, &s_Pachinko4Stand[0]}
1102     };
1103 
1104 ANIMATOR Pachinko4Operate;
1105 STATE s_Pachinko4Operate[] =
1106     {
1107     {PACHINKO4_R0 + 0, 12, Pachinko1Operate, &s_Pachinko4Operate[1]},
1108     {PACHINKO4_R0 + 1, 12, Pachinko1Operate, &s_Pachinko4Operate[2]},
1109     {PACHINKO4_R0 + 2, 12, Pachinko1Operate, &s_Pachinko4Operate[3]},
1110     {PACHINKO4_R0 + 3, 12, Pachinko1Operate, &s_Pachinko4Operate[4]},
1111     {PACHINKO4_R0 + 4, 12, Pachinko1Operate, &s_Pachinko4Operate[5]},
1112     {PACHINKO4_R0 + 5, 12, Pachinko1Operate, &s_Pachinko4Operate[6]},
1113     {PACHINKO4_R0 + 6, 12, Pachinko1Operate, &s_Pachinko4Operate[7]},
1114     {PACHINKO4_R0 + 7, 12, Pachinko1Operate, &s_Pachinko4Operate[8]},
1115     {PACHINKO4_R0 + 8, 12, Pachinko1Operate, &s_Pachinko4Operate[9]},
1116     {PACHINKO4_R0 + 9, 12, Pachinko1Operate, &s_Pachinko4Operate[10]},
1117     {PACHINKO4_R0 + 10, 12, Pachinko1Operate, &s_Pachinko4Operate[11]},
1118     {PACHINKO4_R0 + 11, 12, Pachinko1Operate, &s_Pachinko4Operate[12]},
1119     {PACHINKO4_R0 + 12, 12, Pachinko1Operate, &s_Pachinko4Operate[13]},
1120     {PACHINKO4_R0 + 13, 12, Pachinko1Operate, &s_Pachinko4Operate[14]},
1121     {PACHINKO4_R0 + 14, 12, Pachinko1Operate, &s_Pachinko4Operate[15]},
1122     {PACHINKO4_R0 + 15, 12, Pachinko1Operate, &s_Pachinko4Operate[16]},
1123     {PACHINKO4_R0 + 16, 12, Pachinko1Operate, &s_Pachinko4Operate[17]},
1124     {PACHINKO4_R0 + 17, 12, Pachinko1Operate, &s_Pachinko4Operate[18]},
1125     {PACHINKO4_R0 + 18, 12, Pachinko1Operate, &s_Pachinko4Operate[19]},
1126     {PACHINKO4_R0 + 19, 12, Pachinko1Operate, &s_Pachinko4Operate[20]},
1127     {PACHINKO4_R0 + 20, 12, Pachinko1Operate, &s_Pachinko4Operate[21]},
1128     {PACHINKO4_R0 + 21, 12, Pachinko1Operate, &s_Pachinko4Operate[22]},
1129     {PACHINKO4_R0 + 22, SF_QUICK_CALL, PachinkoCheckWin, &s_Pachinko4Stand[0]}
1130     };
1131 
1132 int
SetupPachinko4(short SpriteNum)1133 SetupPachinko4(short SpriteNum)
1134 {
1135     SPRITEp sp = &sprite[SpriteNum];
1136     USERp u;
1137     ANIMATOR DoActorDecide;
1138 
1139     if (TEST(sp->cstat, CSTAT_SPRITE_RESTORE))
1140         {
1141         u = User[SpriteNum];
1142         ASSERT(u);
1143         }
1144     else
1145         {
1146         User[SpriteNum] = u = SpawnUser(SpriteNum,PACHINKO4,s_Pachinko4Stand);
1147         u->Health = 1;
1148         }
1149 
1150     EnemyDefaults(SpriteNum, NULL, NULL);
1151 
1152     ChangeState(SpriteNum,s_Pachinko4Stand);
1153     u->Attrib = &Pachinko4Attrib;
1154     u->StateEnd = s_Pachinko4Stand;
1155     u->Rot = 0;
1156     u->RotNum = 0;
1157     u->ID = PACHINKO4;
1158 
1159     sp->yvel = sp->zvel = 0;
1160     sp->lotag = PACHINKO4;
1161 
1162     RESET(u->Flags, SPR_XFLIP_TOGGLE);
1163     RESET(sp->extra, SPRX_PLAYER_OR_ENEMY);
1164 
1165     return(0);
1166 }
1167 
1168 
1169 ////////////////////////////////////////////////////////////////////////////////
1170 
1171 
1172 ANIMATOR NullCarGirl;
1173 
1174 ATTRIBUTE CarGirlAttrib =
1175     {
1176     {0, 0, 0, 0},                     // Speeds
1177     {0, 0, 0, 0},                     // Tic Adjusts
1178      3,                               // MaxWeapons;
1179     {0, 0, DIGI_TOILETGIRLSCREAM,
1180      DIGI_TOILETGIRLPAIN, DIGI_TOILETGIRLSCREAM, 0,0,0,0,0}
1181     };
1182 
1183 //////////////////////
1184 //
1185 // CARGIRL STAND
1186 //
1187 //////////////////////
1188 #define CARGIRL_RATE 60
1189 ANIMATOR NullCarGirl,DoCarGirl;
1190 
1191 STATE s_CarGirlStand[2] =
1192     {
1193     {CARGIRL_R0 + 0, CARGIRL_RATE, DoCarGirl, &s_CarGirlStand[1]},
1194     {CARGIRL_R0 + 1, CARGIRL_RATE, DoCarGirl, &s_CarGirlStand[0]}
1195     };
1196 
1197 //////////////////////
1198 //
1199 // CARGIRL PAIN
1200 //
1201 //////////////////////
1202 
1203 #define CARGIRL_PAIN_RATE 32
1204 #define CARGIRL_PAIN_R0 CARGIRL_R0
1205 ANIMATOR CarGirlPain;
1206 
1207 STATE s_CarGirlPain[2] =
1208     {
1209     {CARGIRL_PAIN_R0 + 0, CARGIRL_PAIN_RATE, CarGirlPain, &s_CarGirlPain[1]},
1210     {CARGIRL_PAIN_R0 + 0, 0|SF_QUICK_CALL, InitActorDecide, &s_CarGirlPain[0]}
1211     };
1212 
1213 //////////////////////
1214 //
1215 // CARGIRL UZI
1216 //
1217 //////////////////////
1218 
1219 #define CARGIRL_UZI_RATE 8
1220 #define CARGIRL_FIRE_R0 CARGIRL_R0 + 2
1221 ANIMATOR InitEnemyUzi,CarGirlUzi;
1222 
1223 STATE s_CarGirlUzi[16] =
1224     {
1225     {CARGIRL_FIRE_R0 + 0, 240, CarGirlUzi, &s_CarGirlUzi[1]},
1226     {CARGIRL_FIRE_R0 + 0, 0 | SF_QUICK_CALL, InitEnemyUzi, &s_CarGirlUzi[2]},
1227     {CARGIRL_FIRE_R0 + 1, CARGIRL_UZI_RATE, CarGirlUzi, &s_CarGirlUzi[3]},
1228     {CARGIRL_FIRE_R0 + 1, 0 | SF_QUICK_CALL, InitEnemyUzi, &s_CarGirlUzi[4]},
1229     {CARGIRL_FIRE_R0 + 0, CARGIRL_UZI_RATE, CarGirlUzi, &s_CarGirlUzi[5]},
1230     {CARGIRL_FIRE_R0 + 0, 0 | SF_QUICK_CALL, InitEnemyUzi, &s_CarGirlUzi[6]},
1231     {CARGIRL_FIRE_R0 + 1, CARGIRL_UZI_RATE, CarGirlUzi, &s_CarGirlUzi[7]},
1232     {CARGIRL_FIRE_R0 + 1, 0 | SF_QUICK_CALL, InitEnemyUzi, &s_CarGirlUzi[8]},
1233     {CARGIRL_FIRE_R0 + 0, CARGIRL_UZI_RATE, CarGirlUzi, &s_CarGirlUzi[9]},
1234     {CARGIRL_FIRE_R0 + 0, 0 | SF_QUICK_CALL, InitEnemyUzi, &s_CarGirlUzi[10]},
1235     {CARGIRL_FIRE_R0 + 1, CARGIRL_UZI_RATE, CarGirlUzi, &s_CarGirlUzi[11]},
1236     {CARGIRL_FIRE_R0 + 1, 0 | SF_QUICK_CALL, InitEnemyUzi, &s_CarGirlUzi[12]},
1237     {CARGIRL_FIRE_R0 + 0, CARGIRL_UZI_RATE, CarGirlUzi, &s_CarGirlUzi[13]},
1238     {CARGIRL_FIRE_R0 + 0, 0 | SF_QUICK_CALL, InitEnemyUzi, &s_CarGirlUzi[14]},
1239     {CARGIRL_FIRE_R0 + 1, CARGIRL_UZI_RATE, CarGirlUzi, &s_CarGirlUzi[15]},
1240     {CARGIRL_FIRE_R0 + 1, 0 | SF_QUICK_CALL, InitEnemyUzi, &s_CarGirlUzi[0]},
1241     };
1242 
1243 int
SetupCarGirl(short SpriteNum)1244 SetupCarGirl(short SpriteNum)
1245 {
1246     SPRITEp sp = &sprite[SpriteNum];
1247     USERp u;
1248     ANIMATOR DoActorDecide;
1249 
1250     if (TEST(sp->cstat, CSTAT_SPRITE_RESTORE))
1251         {
1252         u = User[SpriteNum];
1253         ASSERT(u);
1254         }
1255     else
1256         {
1257         User[SpriteNum] = u = SpawnUser(SpriteNum,CARGIRL_R0,s_CarGirlStand);
1258         u->Health = 60;
1259         }
1260 
1261 
1262     EnemyDefaults(SpriteNum, NULL, NULL);
1263 
1264     ChangeState(SpriteNum,s_CarGirlStand);
1265     u->Attrib = &CarGirlAttrib;
1266     u->StateEnd = s_CarGirlStand;
1267     u->Rot = 0;
1268     u->RotNum = 0;
1269 
1270     sp->xrepeat = 29;
1271     sp->yrepeat = 25;
1272     sp->xvel = sp->yvel = sp->zvel = 0;
1273     sp->lotag = CARGIRL_R0;
1274     u->FlagOwner = 0;
1275     u->ID = CARGIRL_R0;
1276 
1277     RESET(u->Flags, SPR_XFLIP_TOGGLE);
1278     SET(sp->cstat, CSTAT_SPRITE_XFLIP);
1279 
1280     return(0);
1281 }
1282 
DoCarGirl(short SpriteNum)1283 int DoCarGirl(short SpriteNum)
1284 {
1285     USERp u = User[SpriteNum];
1286     SPRITEp sp = User[SpriteNum]->SpriteP;
1287     short rnd_range = 0;
1288     static int handle=0;
1289     BOOL ICanSee = FALSE;
1290 
1291     DoActorPickClosePlayer(SpriteNum);
1292     ICanSee = FAFcansee(sp->x,sp->y,SPRITEp_MID(sp),sp->sectnum,u->tgt_sp->x,u->tgt_sp->y,SPRITEp_MID(u->tgt_sp),u->tgt_sp->sectnum);
1293 
1294     if(u->FlagOwner == 1)
1295         {
1296         if ((u->WaitTics -= ACTORMOVETICS) <= 0 && ICanSee)
1297             {
1298             static int madhandle;
1299 
1300             if(!FX_SoundActive(madhandle))
1301                 {
1302                 short choose;
1303                 choose = RANDOM_RANGE(1000);
1304 
1305                 if(choose > 750)
1306                     madhandle = PlaySound(DIGI_LANI049,&sp->x,&sp->y,&sp->z,v3df_dontpan);
1307                 else
1308                 if(choose > 500)
1309                     madhandle = PlaySound(DIGI_LANI051,&sp->x,&sp->y,&sp->z,v3df_dontpan);
1310                 else
1311                 if(choose > 250)
1312                     madhandle = PlaySound(DIGI_LANI052,&sp->x,&sp->y,&sp->z,v3df_dontpan);
1313                 else
1314                     madhandle = PlaySound(DIGI_LANI054,&sp->x,&sp->y,&sp->z,v3df_dontpan);
1315                 }
1316             ChangeState(SpriteNum,s_CarGirlUzi);
1317             u->WaitTics = SEC(3)+SEC(RANDOM_RANGE(2<<8)>>8);
1318             u->FlagOwner = 0;
1319             }
1320         }
1321 
1322     //(*u->ActorActionFunc) (SpriteNum);
1323 
1324 
1325     // stay on floor unless doing certain things
1326     if (!TEST(u->Flags, SPR_JUMPING | SPR_FALLING | SPR_CLIMBING))
1327         {
1328         KeepActorOnFloor(SpriteNum);
1329         }
1330 
1331     // take damage from environment
1332     DoActorSectorDamage(SpriteNum);
1333     sp->xvel = sp->yvel = sp->zvel = 0;
1334 
1335     return(0);
1336 }
1337 
NullCarGirl(short SpriteNum)1338 int NullCarGirl(short SpriteNum)
1339     {
1340     USERp u = User[SpriteNum];
1341     SPRITEp sp = User[SpriteNum]->SpriteP;
1342     BOOL ICanSee = FALSE;
1343 
1344     DoActorPickClosePlayer(SpriteNum);
1345     ICanSee = FAFcansee(sp->x,sp->y,SPRITEp_MID(sp),sp->sectnum,u->tgt_sp->x,u->tgt_sp->y,u->tgt_sp->z,u->tgt_sp->sectnum);
1346 
1347     if (!TEST(u->Flags,SPR_CLIMBING))
1348         KeepActorOnFloor(SpriteNum);
1349 
1350     if(u->FlagOwner != 1)
1351         {
1352         }else
1353         if ((u->WaitTics -= ACTORMOVETICS) <= 0 && ICanSee)
1354             {
1355             static int madhandle;
1356 
1357             if(!FX_SoundActive(madhandle))
1358                 {
1359                 short choose;
1360                 choose = RANDOM_RANGE(1000);
1361 
1362                 if(choose > 750)
1363                     madhandle = PlaySound(DIGI_LANI049,&sp->x,&sp->y,&sp->z,v3df_dontpan);
1364                 else
1365                 if(choose > 500)
1366                     madhandle = PlaySound(DIGI_LANI051,&sp->x,&sp->y,&sp->z,v3df_dontpan);
1367                 else
1368                 if(choose > 250)
1369                     madhandle = PlaySound(DIGI_LANI052,&sp->x,&sp->y,&sp->z,v3df_dontpan);
1370                 else
1371                     madhandle = PlaySound(DIGI_LANI054,&sp->x,&sp->y,&sp->z,v3df_dontpan);
1372                 }
1373             ChangeState(SpriteNum,s_CarGirlUzi);
1374             u->WaitTics = SEC(3)+SEC(RANDOM_RANGE(2<<8)>>8);
1375             u->FlagOwner = 0;
1376             }
1377 
1378     return(0);
1379     }
1380 
CarGirlUzi(short SpriteNum)1381 int CarGirlUzi(short SpriteNum)
1382     {
1383     USERp u = User[SpriteNum];
1384     SPRITEp sp = User[SpriteNum]->SpriteP;
1385 
1386     if (!TEST(u->Flags,SPR_CLIMBING))
1387         KeepActorOnFloor(SpriteNum);
1388 
1389     if ((u->WaitTics -= ACTORMOVETICS) <= 0)
1390         {
1391         u->WaitTics = RANDOM_RANGE(240)+120;
1392         ChangeState(SpriteNum,s_CarGirlStand);
1393         u->FlagOwner = 0;
1394         }
1395 
1396     return(0);
1397     }
1398 
CarGirlPain(short SpriteNum)1399 int CarGirlPain(short SpriteNum)
1400     {
1401     SPRITEp sp = &sprite[SpriteNum];
1402     USERp u = User[SpriteNum];
1403 
1404     NullCarGirl(SpriteNum);
1405 
1406     if ((u->WaitTics -= ACTORMOVETICS) <= 0)
1407         ChangeState(SpriteNum,s_CarGirlStand);
1408 
1409     return(0);
1410     }
1411 
1412 ////////////////////////////////////////////////////////////////////////////////
1413 
1414 
1415 ANIMATOR NullMechanicGirl;
1416 
1417 ATTRIBUTE MechanicGirlAttrib =
1418     {
1419     {0, 0, 0, 0},                     // Speeds
1420     {0, 0, 0, 0},                     // Tic Adjusts
1421      3,                               // MaxWeapons;
1422     {0, 0, DIGI_TOILETGIRLSCREAM,
1423      DIGI_TOILETGIRLPAIN, DIGI_TOILETGIRLSCREAM, 0,0,0,0,0}
1424     };
1425 
1426 //////////////////////
1427 //
1428 // MECHANICGIRL STAND
1429 //
1430 //////////////////////
1431 #define MECHANICGIRL_RATE 60
1432 ANIMATOR NullMechanicGirl,DoMechanicGirl;
1433 
1434 STATE s_MechanicGirlStand[2] =
1435     {
1436     {MECHANICGIRL_R0 + 0, MECHANICGIRL_RATE, DoMechanicGirl, &s_MechanicGirlStand[1]},
1437     {MECHANICGIRL_R0 + 1, MECHANICGIRL_RATE, DoMechanicGirl, &s_MechanicGirlStand[0]}
1438     };
1439 
1440 //////////////////////
1441 //
1442 // MECHANICGIRL PAIN
1443 //
1444 //////////////////////
1445 
1446 #define MECHANICGIRL_PAIN_RATE 32
1447 #define MECHANICGIRL_PAIN_R0 MECHANICGIRL_R0
1448 ANIMATOR MechanicGirlPain;
1449 
1450 STATE s_MechanicGirlPain[2] =
1451     {
1452     {MECHANICGIRL_PAIN_R0 + 0, MECHANICGIRL_PAIN_RATE, MechanicGirlPain, &s_MechanicGirlPain[1]},
1453     {MECHANICGIRL_PAIN_R0 + 0, 0|SF_QUICK_CALL, InitActorDecide, &s_MechanicGirlPain[0]}
1454     };
1455 
1456 //////////////////////
1457 //
1458 // MECHANICGIRL DRILL
1459 //
1460 //////////////////////
1461 
1462 #define MECHANICGIRL_DRILL_RATE 32
1463 #define MECHANICGIRL_DRILL_R0 MECHANICGIRL_R0 + 2
1464 ANIMATOR MechanicGirlDrill;
1465 
1466 STATE s_MechanicGirlDrill[2] =
1467     {
1468     {MECHANICGIRL_DRILL_R0 + 0, MECHANICGIRL_DRILL_RATE, MechanicGirlDrill, &s_MechanicGirlDrill[1]},
1469     {MECHANICGIRL_DRILL_R0 + 1, MECHANICGIRL_DRILL_RATE, MechanicGirlDrill, &s_MechanicGirlDrill[0]},
1470     };
1471 
1472 
1473 int
SetupMechanicGirl(short SpriteNum)1474 SetupMechanicGirl(short SpriteNum)
1475 {
1476     SPRITEp sp = &sprite[SpriteNum];
1477     USERp u;
1478     ANIMATOR DoActorDecide;
1479 
1480     if (TEST(sp->cstat, CSTAT_SPRITE_RESTORE))
1481         {
1482         u = User[SpriteNum];
1483         ASSERT(u);
1484         }
1485     else
1486         {
1487         User[SpriteNum] = u = SpawnUser(SpriteNum,MECHANICGIRL_R0,s_MechanicGirlStand);
1488         u->Health = 60;
1489         }
1490 
1491 
1492     EnemyDefaults(SpriteNum, NULL, NULL);
1493 
1494     ChangeState(SpriteNum,s_MechanicGirlStand);
1495     u->Attrib = &MechanicGirlAttrib;
1496     u->StateEnd = s_MechanicGirlStand;
1497     u->Rot = 0;
1498     u->RotNum = 0;
1499 
1500     sp->xrepeat = 27;
1501     sp->yrepeat = 26;
1502     sp->xvel = sp->yvel = sp->zvel = 0;
1503     sp->lotag = MECHANICGIRL_R0;
1504     u->FlagOwner = 0;
1505     u->ID = MECHANICGIRL_R0;
1506 
1507     RESET(u->Flags, SPR_XFLIP_TOGGLE);
1508 
1509     return(0);
1510 }
1511 
DoMechanicGirl(short SpriteNum)1512 int DoMechanicGirl(short SpriteNum)
1513 {
1514     USERp u = User[SpriteNum];
1515     SPRITEp sp = User[SpriteNum]->SpriteP;
1516     short rnd_range = 0;
1517     static int handle=0;
1518     BOOL ICanSee = FALSE;
1519 
1520     DoActorPickClosePlayer(SpriteNum);
1521     ICanSee = FAFcansee(sp->x,sp->y,SPRITEp_MID(sp),sp->sectnum,u->tgt_sp->x,u->tgt_sp->y,SPRITEp_MID(u->tgt_sp),u->tgt_sp->sectnum);
1522 
1523     if(u->FlagOwner == 1)
1524         {
1525         if ((u->WaitTics -= ACTORMOVETICS) <= 0 && ICanSee)
1526             {
1527             static int madhandle;
1528 
1529             if(!FX_SoundActive(madhandle))
1530                 {
1531                 short choose;
1532                 choose = RANDOM_RANGE(1000);
1533 
1534                 if(choose > 750)
1535                     madhandle = PlaySound(DIGI_LANI073,&sp->x,&sp->y,&sp->z,v3df_dontpan);
1536                 else
1537                 if(choose > 500)
1538                     madhandle = PlaySound(DIGI_LANI075,&sp->x,&sp->y,&sp->z,v3df_dontpan);
1539                 else
1540                 if(choose > 250)
1541                     madhandle = PlaySound(DIGI_LANI077,&sp->x,&sp->y,&sp->z,v3df_dontpan);
1542                 else
1543                     madhandle = PlaySound(DIGI_LANI079,&sp->x,&sp->y,&sp->z,v3df_dontpan);
1544                 }
1545             ChangeState(SpriteNum,s_MechanicGirlDrill);
1546             u->WaitTics = SEC(1)+SEC(RANDOM_RANGE(2<<8)>>8);
1547             u->FlagOwner = 0;
1548             }
1549         }
1550 
1551     //(*u->ActorActionFunc) (SpriteNum);
1552 
1553 
1554     // stay on floor unless doing certain things
1555     if (!TEST(u->Flags, SPR_JUMPING | SPR_FALLING | SPR_CLIMBING))
1556         {
1557         KeepActorOnFloor(SpriteNum);
1558         }
1559 
1560     // take damage from environment
1561     DoActorSectorDamage(SpriteNum);
1562     sp->xvel = sp->yvel = sp->zvel = 0;
1563 
1564     return(0);
1565 }
1566 
NullMechanicGirl(short SpriteNum)1567 int NullMechanicGirl(short SpriteNum)
1568     {
1569     USERp u = User[SpriteNum];
1570     SPRITEp sp = User[SpriteNum]->SpriteP;
1571     BOOL ICanSee = FALSE;
1572 
1573     DoActorPickClosePlayer(SpriteNum);
1574     ICanSee = FAFcansee(sp->x,sp->y,SPRITEp_MID(sp),sp->sectnum,u->tgt_sp->x,u->tgt_sp->y,u->tgt_sp->z,u->tgt_sp->sectnum);
1575 
1576     if (!TEST(u->Flags,SPR_CLIMBING))
1577         KeepActorOnFloor(SpriteNum);
1578 
1579     if(u->FlagOwner != 1)
1580         {
1581         }else
1582         if ((u->WaitTics -= ACTORMOVETICS) <= 0 && ICanSee)
1583             {
1584             static int madhandle;
1585 
1586             if(!FX_SoundActive(madhandle))
1587                 {
1588                 short choose;
1589                 choose = RANDOM_RANGE(1000);
1590 
1591                 if(choose > 750)
1592                     madhandle = PlaySound(DIGI_LANI073,&sp->x,&sp->y,&sp->z,v3df_dontpan);
1593                 else
1594                 if(choose > 500)
1595                     madhandle = PlaySound(DIGI_LANI075,&sp->x,&sp->y,&sp->z,v3df_dontpan);
1596                 else
1597                 if(choose > 250)
1598                     madhandle = PlaySound(DIGI_LANI077,&sp->x,&sp->y,&sp->z,v3df_dontpan);
1599                 else
1600                     madhandle = PlaySound(DIGI_LANI079,&sp->x,&sp->y,&sp->z,v3df_dontpan);
1601                 }
1602             ChangeState(SpriteNum,s_MechanicGirlDrill);
1603             u->WaitTics = SEC(1)+SEC(RANDOM_RANGE(2<<8)>>8);
1604             u->FlagOwner = 0;
1605             }
1606 
1607     return(0);
1608     }
1609 
MechanicGirlDrill(short SpriteNum)1610 int MechanicGirlDrill(short SpriteNum)
1611     {
1612     USERp u = User[SpriteNum];
1613     SPRITEp sp = User[SpriteNum]->SpriteP;
1614 
1615     if (!TEST(u->Flags,SPR_CLIMBING))
1616         KeepActorOnFloor(SpriteNum);
1617 
1618     if ((u->WaitTics -= ACTORMOVETICS) <= 0)
1619         {
1620         u->WaitTics = RANDOM_RANGE(240)+120;
1621         ChangeState(SpriteNum,s_MechanicGirlStand);
1622         u->FlagOwner = 0;
1623         }
1624 
1625     return(0);
1626     }
1627 
MechanicGirlPain(short SpriteNum)1628 int MechanicGirlPain(short SpriteNum)
1629     {
1630     SPRITEp sp = &sprite[SpriteNum];
1631     USERp u = User[SpriteNum];
1632 
1633     NullMechanicGirl(SpriteNum);
1634 
1635     if ((u->WaitTics -= ACTORMOVETICS) <= 0)
1636         ChangeState(SpriteNum,s_MechanicGirlStand);
1637 
1638     return(0);
1639     }
1640 
1641 ////////////////////////////////////////////////////////////////////////////////
1642 
1643 
1644 ANIMATOR NullSailorGirl;
1645 
1646 ATTRIBUTE SailorGirlAttrib =
1647     {
1648     {0, 0, 0, 0},                     // Speeds
1649     {0, 0, 0, 0},                     // Tic Adjusts
1650      3,                               // MaxWeapons;
1651     {0, 0, DIGI_TOILETGIRLSCREAM,
1652      DIGI_TOILETGIRLPAIN, DIGI_TOILETGIRLSCREAM, 0,0,0,0,0}
1653     };
1654 
1655 //////////////////////
1656 //
1657 // SAILORGIRL STAND
1658 //
1659 //////////////////////
1660 #define SAILORGIRL_RATE 60
1661 ANIMATOR NullSailorGirl,DoSailorGirl;
1662 
1663 STATE s_SailorGirlStand[2] =
1664     {
1665     {SAILORGIRL_R0 + 0, SAILORGIRL_RATE, DoSailorGirl, &s_SailorGirlStand[1]},
1666     {SAILORGIRL_R0 + 1, SAILORGIRL_RATE, DoSailorGirl, &s_SailorGirlStand[0]}
1667     };
1668 
1669 //////////////////////
1670 //
1671 // SAILORGIRL PAIN
1672 //
1673 //////////////////////
1674 
1675 #define SAILORGIRL_PAIN_RATE 32
1676 #define SAILORGIRL_PAIN_R0 SAILORGIRL_R0
1677 ANIMATOR SailorGirlPain;
1678 
1679 STATE s_SailorGirlPain[2] =
1680     {
1681     {SAILORGIRL_PAIN_R0 + 0, SAILORGIRL_PAIN_RATE, SailorGirlPain, &s_SailorGirlPain[1]},
1682     {SAILORGIRL_PAIN_R0 + 0, 0|SF_QUICK_CALL, InitActorDecide, &s_SailorGirlPain[0]}
1683     };
1684 
1685 //////////////////////
1686 //
1687 // SAILORGIRL UZI
1688 //
1689 //////////////////////
1690 
1691 #define SAILORGIRL_UZI_RATE 128
1692 #define SAILORGIRL_FIRE_R0 SAILORGIRL_R0 + 2
1693 ANIMATOR InitEnemyUzi,SailorGirlThrow;
1694 
1695 STATE s_SailorGirlThrow[] =
1696     {
1697     {SAILORGIRL_FIRE_R0 + 0, SAILORGIRL_UZI_RATE, SailorGirlThrow, &s_SailorGirlThrow[0]},
1698     };
1699 
1700 short alreadythrew;
1701 
1702 int
SetupSailorGirl(short SpriteNum)1703 SetupSailorGirl(short SpriteNum)
1704 {
1705     SPRITEp sp = &sprite[SpriteNum];
1706     USERp u;
1707     ANIMATOR DoActorDecide;
1708 
1709     if (TEST(sp->cstat, CSTAT_SPRITE_RESTORE))
1710         {
1711         u = User[SpriteNum];
1712         ASSERT(u);
1713         }
1714     else
1715         {
1716         User[SpriteNum] = u = SpawnUser(SpriteNum,SAILORGIRL_R0,s_SailorGirlStand);
1717         u->Health = 60;
1718         }
1719 
1720 
1721     EnemyDefaults(SpriteNum, NULL, NULL);
1722 
1723     ChangeState(SpriteNum,s_SailorGirlStand);
1724     u->Attrib = &SailorGirlAttrib;
1725     u->StateEnd = s_SailorGirlStand;
1726     u->Rot = 0;
1727     u->RotNum = 0;
1728 
1729     sp->xrepeat = 28;
1730     sp->yrepeat = 26;
1731     sp->xvel = sp->yvel = sp->zvel = 0;
1732     sp->lotag = SAILORGIRL_R0;
1733     u->FlagOwner = 0;
1734     u->ID = SAILORGIRL_R0;
1735 
1736     RESET(u->Flags, SPR_XFLIP_TOGGLE);
1737     alreadythrew = 0;
1738 
1739     return(0);
1740 }
1741 
DoSailorGirl(short SpriteNum)1742 int DoSailorGirl(short SpriteNum)
1743 {
1744     USERp u = User[SpriteNum];
1745     SPRITEp sp = User[SpriteNum]->SpriteP;
1746     short rnd_range = 0;
1747     static int handle=0;
1748     BOOL ICanSee = FALSE;
1749 
1750     DoActorPickClosePlayer(SpriteNum);
1751     ICanSee = FAFcansee(sp->x,sp->y,SPRITEp_MID(sp),sp->sectnum,u->tgt_sp->x,u->tgt_sp->y,SPRITEp_MID(u->tgt_sp),u->tgt_sp->sectnum);
1752 
1753     if(u->FlagOwner == 1)
1754         {
1755         if ((u->WaitTics -= ACTORMOVETICS) <= 0 && ICanSee)
1756             {
1757             static int madhandle;
1758 
1759             if(!FX_SoundActive(madhandle))
1760                 {
1761                 short choose;
1762                 choose = RANDOM_RANGE(1000);
1763 
1764                 if(choose > 750 && alreadythrew < 3)
1765                     {
1766                     ActorCoughItem(SpriteNum);
1767                     alreadythrew++;
1768                     madhandle = PlaySound(DIGI_LANI060,&sp->x,&sp->y,&sp->z,v3df_dontpan);
1769                     }
1770                 else
1771                 if(choose > 500)
1772                     madhandle = PlaySound(DIGI_LANI063,&sp->x,&sp->y,&sp->z,v3df_dontpan);
1773                 else
1774                 if(choose > 250)
1775                     madhandle = PlaySound(DIGI_LANI065,&sp->x,&sp->y,&sp->z,v3df_dontpan);
1776                 else
1777                     madhandle = PlaySound(DIGI_LANI066,&sp->x,&sp->y,&sp->z,v3df_dontpan);
1778                 }
1779             ChangeState(SpriteNum,s_SailorGirlThrow);
1780             u->WaitTics = SEC(1)+SEC(RANDOM_RANGE(3<<8)>>8);
1781             u->FlagOwner = 0;
1782             }
1783         }
1784 
1785     //(*u->ActorActionFunc) (SpriteNum);
1786 
1787 
1788     // stay on floor unless doing certain things
1789     if (!TEST(u->Flags, SPR_JUMPING | SPR_FALLING | SPR_CLIMBING))
1790         {
1791         KeepActorOnFloor(SpriteNum);
1792         }
1793 
1794     // take damage from environment
1795     DoActorSectorDamage(SpriteNum);
1796     sp->xvel = sp->yvel = sp->zvel = 0;
1797 
1798     return(0);
1799 }
1800 
NullSailorGirl(short SpriteNum)1801 int NullSailorGirl(short SpriteNum)
1802     {
1803     USERp u = User[SpriteNum];
1804     SPRITEp sp = User[SpriteNum]->SpriteP;
1805     BOOL ICanSee = FALSE;
1806     static short alreadythrew = 0;
1807 
1808     DoActorPickClosePlayer(SpriteNum);
1809     ICanSee = FAFcansee(sp->x,sp->y,SPRITEp_MID(sp),sp->sectnum,u->tgt_sp->x,u->tgt_sp->y,u->tgt_sp->z,u->tgt_sp->sectnum);
1810 
1811     if (!TEST(u->Flags,SPR_CLIMBING))
1812         KeepActorOnFloor(SpriteNum);
1813 
1814     if(u->FlagOwner != 1)
1815         {
1816         }else
1817         if ((u->WaitTics -= ACTORMOVETICS) <= 0 && ICanSee)
1818             {
1819             static int madhandle;
1820 
1821             if(!FX_SoundActive(madhandle))
1822                 {
1823                 short choose;
1824                 choose = RANDOM_RANGE(1000);
1825 
1826                 if(choose > 750 && alreadythrew < 3)
1827                     {
1828                     ActorCoughItem(SpriteNum);
1829                     alreadythrew++;
1830                     madhandle = PlaySound(DIGI_LANI060,&sp->x,&sp->y,&sp->z,v3df_dontpan);
1831                     }
1832                 else
1833                 if(choose > 500)
1834                     madhandle = PlaySound(DIGI_LANI063,&sp->x,&sp->y,&sp->z,v3df_dontpan);
1835                 else
1836                 if(choose > 250)
1837                     madhandle = PlaySound(DIGI_LANI065,&sp->x,&sp->y,&sp->z,v3df_dontpan);
1838                 else
1839                     madhandle = PlaySound(DIGI_LANI066,&sp->x,&sp->y,&sp->z,v3df_dontpan);
1840                 }
1841             ChangeState(SpriteNum,s_SailorGirlThrow);
1842             u->WaitTics = SEC(1)+SEC(RANDOM_RANGE(3<<8)>>8);
1843             u->FlagOwner = 0;
1844             }
1845 
1846     return(0);
1847     }
1848 
SailorGirlThrow(short SpriteNum)1849 int SailorGirlThrow(short SpriteNum)
1850     {
1851     USERp u = User[SpriteNum];
1852     SPRITEp sp = User[SpriteNum]->SpriteP;
1853 
1854     if (!TEST(u->Flags,SPR_CLIMBING))
1855         KeepActorOnFloor(SpriteNum);
1856 
1857     if ((u->WaitTics -= ACTORMOVETICS) <= 0)
1858         {
1859         u->WaitTics = RANDOM_RANGE(240)+120;
1860         ChangeState(SpriteNum,s_SailorGirlStand);
1861         u->FlagOwner = 0;
1862         }
1863 
1864     return(0);
1865     }
1866 
SailorGirlPain(short SpriteNum)1867 int SailorGirlPain(short SpriteNum)
1868     {
1869     SPRITEp sp = &sprite[SpriteNum];
1870     USERp u = User[SpriteNum];
1871 
1872     NullSailorGirl(SpriteNum);
1873 
1874     if ((u->WaitTics -= ACTORMOVETICS) <= 0)
1875         ChangeState(SpriteNum,s_SailorGirlStand);
1876 
1877     return(0);
1878     }
1879 
1880 ////////////////////////////////////////////////////////////////////////////////
1881 
1882 
1883 ANIMATOR NullPruneGirl;
1884 
1885 ATTRIBUTE PruneGirlAttrib =
1886     {
1887     {450, 450, 450, 450},             // Speeds
1888     {0, 0, 0, 0},                     // Tic Adjusts
1889      3,                               // MaxWeapons;
1890     //{DIGI_PRUNECACKLE3, DIGI_PRUNECACKLE, DIGI_TOILETGIRLSCREAM,
1891     {0,0, DIGI_TOILETGIRLSCREAM,
1892      DIGI_TOILETGIRLPAIN, DIGI_TOILETGIRLSCREAM, 0,0,0,0,0}
1893     };
1894 
1895 //////////////////////
1896 //
1897 // PRUNEGIRL STAND
1898 //
1899 //////////////////////
1900 #define PRUNEGIRL_RATE 60
1901 ANIMATOR NullPruneGirl,DoPruneGirl;
1902 
1903 STATE s_PruneGirlStand[2] =
1904     {
1905     {PRUNEGIRL_R0 + 0, PRUNEGIRL_RATE, DoPruneGirl, &s_PruneGirlStand[1]},
1906     {PRUNEGIRL_R0 + 1, PRUNEGIRL_RATE, DoPruneGirl, &s_PruneGirlStand[0]}
1907     };
1908 
1909 //////////////////////
1910 //
1911 // PRUNEGIRL PAIN
1912 //
1913 //////////////////////
1914 
1915 #define PRUNEGIRL_PAIN_RATE 32
1916 #define PRUNEGIRL_PAIN_R0 PRUNEGIRL_R0
1917 ANIMATOR PruneGirlPain;
1918 
1919 STATE s_PruneGirlPain[2] =
1920     {
1921     {PRUNEGIRL_PAIN_R0 + 0, PRUNEGIRL_PAIN_RATE, PruneGirlPain, &s_PruneGirlPain[1]},
1922     {PRUNEGIRL_PAIN_R0 + 0, 0|SF_QUICK_CALL, InitActorDecide, &s_PruneGirlPain[0]}
1923     };
1924 
1925 int
SetupPruneGirl(short SpriteNum)1926 SetupPruneGirl(short SpriteNum)
1927 {
1928     SPRITEp sp = &sprite[SpriteNum];
1929     USERp u;
1930     ANIMATOR DoActorDecide;
1931 
1932     if (TEST(sp->cstat, CSTAT_SPRITE_RESTORE))
1933         {
1934         u = User[SpriteNum];
1935         ASSERT(u);
1936         }
1937     else
1938         {
1939         User[SpriteNum] = u = SpawnUser(SpriteNum,PRUNEGIRL_R0,s_PruneGirlStand);
1940         u->Health = 60;
1941         }
1942 
1943 
1944     EnemyDefaults(SpriteNum, NULL, NULL);
1945 
1946     ChangeState(SpriteNum,s_PruneGirlStand);
1947     u->Attrib = &PruneGirlAttrib;
1948     u->StateEnd = s_PruneGirlStand;
1949     u->Rot = 0;
1950     u->RotNum = 0;
1951 
1952     sp->xrepeat = 33;
1953     sp->yrepeat = 28;
1954     sp->xvel = sp->yvel = sp->zvel = 0;
1955     sp->lotag = PRUNEGIRL_R0;
1956     u->FlagOwner = 0;
1957     u->ID = PRUNEGIRL_R0;
1958 
1959     RESET(u->Flags, SPR_XFLIP_TOGGLE);
1960 
1961     return(0);
1962 }
1963 
DoPruneGirl(short SpriteNum)1964 int DoPruneGirl(short SpriteNum)
1965 {
1966     USERp u = User[SpriteNum];
1967     SPRITEp sp = User[SpriteNum]->SpriteP;
1968     short rnd_range = 0;
1969     static int madhandle=0,coyhandle=0;
1970     BOOL ICanSee = FALSE;
1971 
1972     DoActorPickClosePlayer(SpriteNum);
1973     ICanSee = FAFcansee(sp->x,sp->y,SPRITEp_MID(sp),sp->sectnum,u->tgt_sp->x,u->tgt_sp->y,SPRITEp_MID(u->tgt_sp),u->tgt_sp->sectnum);
1974 
1975     if(u->FlagOwner == 1)
1976         {
1977         if ((u->WaitTics -= ACTORMOVETICS) <= 0 && ICanSee)
1978             {
1979             if(!FX_SoundActive(madhandle))
1980                 {
1981                 short choose;
1982                 choose = STD_RANDOM_RANGE(1000);
1983 
1984                 if(choose > 750)
1985                     madhandle = PlaySound(DIGI_LANI089,&sp->x,&sp->y,&sp->z,v3df_dontpan);
1986                 else
1987                 if(choose > 500)
1988                     madhandle = PlaySound(DIGI_LANI091,&sp->x,&sp->y,&sp->z,v3df_dontpan);
1989                 else
1990                 if(choose > 250)
1991                     madhandle = PlaySound(DIGI_LANI093,&sp->x,&sp->y,&sp->z,v3df_dontpan);
1992                 else
1993                     madhandle = PlaySound(DIGI_LANI095,&sp->x,&sp->y,&sp->z,v3df_dontpan);
1994                 }
1995             u->WaitTics = SEC(1)+SEC(RANDOM_RANGE(3<<8)>>8);
1996             u->FlagOwner = 0;
1997             }
1998         } else
1999         {
2000         if(!FX_SoundActive(coyhandle))
2001             {
2002              short choose;
2003              choose = STD_RANDOM_RANGE(1000);
2004 
2005              if(choose > 990)
2006                  coyhandle = PlaySound(DIGI_PRUNECACKLE,&sp->x,&sp->y,&sp->z,v3df_dontpan);
2007              else
2008              if(choose > 985)
2009                  coyhandle = PlaySound(DIGI_PRUNECACKLE2,&sp->x,&sp->y,&sp->z,v3df_dontpan);
2010              else
2011              if(choose > 980)
2012                  coyhandle = PlaySound(DIGI_PRUNECACKLE3,&sp->x,&sp->y,&sp->z,v3df_dontpan);
2013              else
2014              if(choose > 975)
2015                  coyhandle = PlaySound(DIGI_LANI091,&sp->x,&sp->y,&sp->z,v3df_dontpan);
2016             }
2017         }
2018 
2019     //(*u->ActorActionFunc) (SpriteNum);
2020 
2021 
2022     // stay on floor unless doing certain things
2023     if (!TEST(u->Flags, SPR_JUMPING | SPR_FALLING | SPR_CLIMBING))
2024         {
2025         KeepActorOnFloor(SpriteNum);
2026         }
2027 
2028     // take damage from environment
2029     DoActorSectorDamage(SpriteNum);
2030     sp->xvel = sp->yvel = sp->zvel = 0;
2031 
2032     return(0);
2033 }
2034 
NullPruneGirl(short SpriteNum)2035 int NullPruneGirl(short SpriteNum)
2036     {
2037     USERp u = User[SpriteNum];
2038     SPRITEp sp = User[SpriteNum]->SpriteP;
2039     BOOL ICanSee = FALSE;
2040 
2041     DoActorPickClosePlayer(SpriteNum);
2042     ICanSee = FAFcansee(sp->x,sp->y,SPRITEp_MID(sp),sp->sectnum,u->tgt_sp->x,u->tgt_sp->y,u->tgt_sp->z,u->tgt_sp->sectnum);
2043 
2044     if (!TEST(u->Flags,SPR_CLIMBING))
2045         KeepActorOnFloor(SpriteNum);
2046 
2047     if(u->FlagOwner != 1)
2048         {
2049         }else
2050         if ((u->WaitTics -= ACTORMOVETICS) <= 0 && ICanSee)
2051             {
2052             static int madhandle;
2053 
2054             if(!FX_SoundActive(madhandle))
2055                 {
2056                 short choose;
2057                 choose = RANDOM_RANGE(1000);
2058 
2059                 if(choose > 750)
2060                     madhandle = PlaySound(DIGI_LANI089,&sp->x,&sp->y,&sp->z,v3df_dontpan);
2061                 else
2062                 if(choose > 500)
2063                     madhandle = PlaySound(DIGI_LANI091,&sp->x,&sp->y,&sp->z,v3df_dontpan);
2064                 else
2065                 if(choose > 250)
2066                     madhandle = PlaySound(DIGI_LANI093,&sp->x,&sp->y,&sp->z,v3df_dontpan);
2067                 else
2068                     madhandle = PlaySound(DIGI_LANI095,&sp->x,&sp->y,&sp->z,v3df_dontpan);
2069                 }
2070             u->WaitTics = SEC(1)+SEC(RANDOM_RANGE(3<<8)>>8);
2071             u->FlagOwner = 0;
2072             }
2073 
2074     return(0);
2075     }
2076 
PruneGirlUzi(short SpriteNum)2077 int PruneGirlUzi(short SpriteNum)
2078     {
2079     USERp u = User[SpriteNum];
2080     SPRITEp sp = User[SpriteNum]->SpriteP;
2081 
2082     if (!TEST(u->Flags,SPR_CLIMBING))
2083         KeepActorOnFloor(SpriteNum);
2084 
2085     if ((u->WaitTics -= ACTORMOVETICS) <= 0)
2086         {
2087         u->WaitTics = RANDOM_RANGE(240)+120;
2088         ChangeState(SpriteNum,s_PruneGirlStand);
2089         u->FlagOwner = 0;
2090         }
2091 
2092     return(0);
2093     }
2094 
PruneGirlPain(short SpriteNum)2095 int PruneGirlPain(short SpriteNum)
2096     {
2097     SPRITEp sp = &sprite[SpriteNum];
2098     USERp u = User[SpriteNum];
2099 
2100     NullPruneGirl(SpriteNum);
2101 
2102     if ((u->WaitTics -= ACTORMOVETICS) <= 0)
2103         ChangeState(SpriteNum,s_PruneGirlStand);
2104 
2105     return(0);
2106     }
2107 
2108 
2109 #include "saveable.h"
2110 
2111 static saveable_code saveable_miscactr_code[] = {
2112 	SAVE_CODE(SetupToiletGirl),
2113 	SAVE_CODE(DoToiletGirl),
2114 	SAVE_CODE(NullToiletGirl),
2115 	SAVE_CODE(ToiletGirlUzi),
2116 	SAVE_CODE(ToiletGirlPain),
2117 
2118 	SAVE_CODE(SetupWashGirl),
2119 	SAVE_CODE(DoWashGirl),
2120 	SAVE_CODE(NullWashGirl),
2121 	SAVE_CODE(WashGirlUzi),
2122 	SAVE_CODE(WashGirlPain),
2123 
2124 	SAVE_CODE(SetupTrashCan),
2125 	SAVE_CODE(DoTrashCan),
2126 	SAVE_CODE(TrashCanPain),
2127 
2128 	SAVE_CODE(SetupPachinkoLight),
2129 	SAVE_CODE(PachinkoLightOperate),
2130 
2131 	SAVE_CODE(SetupPachinko1),
2132 	SAVE_CODE(SetupPachinko2),
2133 	SAVE_CODE(SetupPachinko3),
2134 	SAVE_CODE(SetupPachinko4),
2135 	SAVE_CODE(PachinkoCheckWin),
2136 	SAVE_CODE(Pachinko1Operate),
2137 
2138 	SAVE_CODE(SetupCarGirl),
2139 	SAVE_CODE(DoCarGirl),
2140 	SAVE_CODE(NullCarGirl),
2141 	SAVE_CODE(CarGirlUzi),
2142 	SAVE_CODE(CarGirlPain),
2143 
2144 	SAVE_CODE(SetupMechanicGirl),
2145 	SAVE_CODE(DoMechanicGirl),
2146 	SAVE_CODE(NullMechanicGirl),
2147 	SAVE_CODE(MechanicGirlDrill),
2148 	SAVE_CODE(MechanicGirlPain),
2149 
2150 	SAVE_CODE(SetupSailorGirl),
2151 	SAVE_CODE(DoSailorGirl),
2152 	SAVE_CODE(NullSailorGirl),
2153 	SAVE_CODE(SailorGirlThrow),
2154 	SAVE_CODE(SailorGirlPain),
2155 
2156 	SAVE_CODE(SetupPruneGirl),
2157 	SAVE_CODE(DoPruneGirl),
2158 	SAVE_CODE(NullPruneGirl),
2159 	SAVE_CODE(PruneGirlUzi),
2160 	SAVE_CODE(PruneGirlPain),
2161 };
2162 
2163 static saveable_data saveable_miscactr_data[] = {
2164 	SAVE_DATA(ToiletGirlAttrib),
2165 	SAVE_DATA(WashGirlAttrib),
2166 	SAVE_DATA(TrashCanAttrib),
2167 	SAVE_DATA(PachinkoLightAttrib),
2168 	SAVE_DATA(Pachinko1Attrib),
2169 	SAVE_DATA(Pachinko2Attrib),
2170 	SAVE_DATA(Pachinko3Attrib),
2171 	SAVE_DATA(Pachinko4Attrib),
2172 	SAVE_DATA(CarGirlAttrib),
2173 	SAVE_DATA(MechanicGirlAttrib),
2174 	SAVE_DATA(SailorGirlAttrib),
2175 	SAVE_DATA(PruneGirlAttrib),
2176 
2177 	SAVE_DATA(s_ToiletGirlStand),
2178 	SAVE_DATA(s_ToiletGirlPain),
2179 	SAVE_DATA(s_ToiletGirlUzi),
2180 	SAVE_DATA(s_WashGirlStand),
2181 	SAVE_DATA(s_WashGirlStandScrub),
2182 	SAVE_DATA(s_WashGirlPain),
2183 	SAVE_DATA(s_WashGirlUzi),
2184 	SAVE_DATA(s_TrashCanStand),
2185 	SAVE_DATA(s_TrashCanPain),
2186 	SAVE_DATA(s_PachinkoLightStand),
2187 	SAVE_DATA(s_PachinkoLightOperate),
2188 	SAVE_DATA(s_Pachinko1Stand),
2189 	SAVE_DATA(s_Pachinko1Operate),
2190 	SAVE_DATA(s_Pachinko2Stand),
2191 	SAVE_DATA(s_Pachinko2Operate),
2192 	SAVE_DATA(s_Pachinko3Stand),
2193 	SAVE_DATA(s_Pachinko3Operate),
2194 	SAVE_DATA(s_Pachinko4Stand),
2195 	SAVE_DATA(s_Pachinko4Operate),
2196 	SAVE_DATA(s_CarGirlStand),
2197 	SAVE_DATA(s_CarGirlPain),
2198 	SAVE_DATA(s_CarGirlUzi),
2199 	SAVE_DATA(s_MechanicGirlStand),
2200 	SAVE_DATA(s_MechanicGirlPain),
2201 	SAVE_DATA(s_MechanicGirlDrill),
2202 	SAVE_DATA(s_SailorGirlStand),
2203 	SAVE_DATA(s_SailorGirlPain),
2204 	SAVE_DATA(s_SailorGirlThrow),
2205 	SAVE_DATA(s_PruneGirlStand),
2206 	SAVE_DATA(s_PruneGirlPain)
2207 };
2208 
2209 saveable_module saveable_miscactr = {
2210 	// code
2211 	saveable_miscactr_code,
2212 	SIZ(saveable_miscactr_code),
2213 
2214 	// data
2215 	saveable_miscactr_data,
2216 	SIZ(saveable_miscactr_data)
2217 };
2218