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