|
|
1.1 root 1: /*
2: ==============================================================================
3:
4: floater
5:
6: ==============================================================================
7: */
8:
9: #include "g_local.h"
10: #include "m_float.h"
11:
12:
13: static int sound_attack2;
14: static int sound_attack3;
15: static int sound_death1;
16: static int sound_idle;
17: static int sound_pain1;
18: static int sound_pain2;
19: static int sound_sight;
20:
21:
22: void floater_sight (edict_t *self, edict_t *other)
23: {
24: gi.sound (self, CHAN_VOICE, sound_sight, 1, ATTN_NORM, 0);
25: }
26:
27: void floater_idle (edict_t *self)
28: {
29: gi.sound (self, CHAN_VOICE, sound_idle, 1, ATTN_IDLE, 0);
30: }
31:
32:
33: //void floater_stand1 (edict_t *self);
34: void floater_dead (edict_t *self);
35: void floater_die (edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point);
36: void floater_run (edict_t *self);
37: void floater_wham (edict_t *self);
38: void floater_zap (edict_t *self);
39:
40:
41: void floater_fire_blaster (edict_t *self)
42: {
43: vec3_t start;
44: vec3_t forward, right;
45: vec3_t end;
46: vec3_t dir;
47: int effect;
48:
49: if(!self->enemy || !self->enemy->inuse) //PGM
50: return; //PGM
51:
52: if ((self->s.frame == FRAME_attak104) || (self->s.frame == FRAME_attak107))
53: effect = EF_HYPERBLASTER;
54: else
55: effect = 0;
56: AngleVectors (self->s.angles, forward, right, NULL);
57: G_ProjectSource (self->s.origin, monster_flash_offset[MZ2_FLOAT_BLASTER_1], forward, right, start);
58:
59: VectorCopy (self->enemy->s.origin, end);
60: end[2] += self->enemy->viewheight;
61: VectorSubtract (end, start, dir);
62:
63: monster_fire_blaster (self, start, dir, 1, 1000, MZ2_FLOAT_BLASTER_1, effect);
64: }
65:
66:
67: mframe_t floater_frames_stand1 [] =
68: {
69: ai_stand, 0, NULL,
70: ai_stand, 0, NULL,
71: ai_stand, 0, NULL,
72: ai_stand, 0, NULL,
73: ai_stand, 0, NULL,
74: ai_stand, 0, NULL,
75: ai_stand, 0, NULL,
76: ai_stand, 0, NULL,
77: ai_stand, 0, NULL,
78: ai_stand, 0, NULL,
79: ai_stand, 0, NULL,
80: ai_stand, 0, NULL,
81: ai_stand, 0, NULL,
82: ai_stand, 0, NULL,
83: ai_stand, 0, NULL,
84: ai_stand, 0, NULL,
85: ai_stand, 0, NULL,
86: ai_stand, 0, NULL,
87: ai_stand, 0, NULL,
88: ai_stand, 0, NULL,
89: ai_stand, 0, NULL,
90: ai_stand, 0, NULL,
91: ai_stand, 0, NULL,
92: ai_stand, 0, NULL,
93: ai_stand, 0, NULL,
94: ai_stand, 0, NULL,
95: ai_stand, 0, NULL,
96: ai_stand, 0, NULL,
97: ai_stand, 0, NULL,
98: ai_stand, 0, NULL,
99: ai_stand, 0, NULL,
100: ai_stand, 0, NULL,
101: ai_stand, 0, NULL,
102: ai_stand, 0, NULL,
103: ai_stand, 0, NULL,
104: ai_stand, 0, NULL,
105: ai_stand, 0, NULL,
106: ai_stand, 0, NULL,
107: ai_stand, 0, NULL,
108: ai_stand, 0, NULL,
109: ai_stand, 0, NULL,
110: ai_stand, 0, NULL,
111: ai_stand, 0, NULL,
112: ai_stand, 0, NULL,
113: ai_stand, 0, NULL,
114: ai_stand, 0, NULL,
115: ai_stand, 0, NULL,
116: ai_stand, 0, NULL,
117: ai_stand, 0, NULL,
118: ai_stand, 0, NULL,
119: ai_stand, 0, NULL,
120: ai_stand, 0, NULL
121: };
122: mmove_t floater_move_stand1 = {FRAME_stand101, FRAME_stand152, floater_frames_stand1, NULL};
123:
124: mframe_t floater_frames_stand2 [] =
125: {
126: ai_stand, 0, NULL,
127: ai_stand, 0, NULL,
128: ai_stand, 0, NULL,
129: ai_stand, 0, NULL,
130: ai_stand, 0, NULL,
131: ai_stand, 0, NULL,
132: ai_stand, 0, NULL,
133: ai_stand, 0, NULL,
134: ai_stand, 0, NULL,
135: ai_stand, 0, NULL,
136: ai_stand, 0, NULL,
137: ai_stand, 0, NULL,
138: ai_stand, 0, NULL,
139: ai_stand, 0, NULL,
140: ai_stand, 0, NULL,
141: ai_stand, 0, NULL,
142: ai_stand, 0, NULL,
143: ai_stand, 0, NULL,
144: ai_stand, 0, NULL,
145: ai_stand, 0, NULL,
146: ai_stand, 0, NULL,
147: ai_stand, 0, NULL,
148: ai_stand, 0, NULL,
149: ai_stand, 0, NULL,
150: ai_stand, 0, NULL,
151: ai_stand, 0, NULL,
152: ai_stand, 0, NULL,
153: ai_stand, 0, NULL,
154: ai_stand, 0, NULL,
155: ai_stand, 0, NULL,
156: ai_stand, 0, NULL,
157: ai_stand, 0, NULL,
158: ai_stand, 0, NULL,
159: ai_stand, 0, NULL,
160: ai_stand, 0, NULL,
161: ai_stand, 0, NULL,
162: ai_stand, 0, NULL,
163: ai_stand, 0, NULL,
164: ai_stand, 0, NULL,
165: ai_stand, 0, NULL,
166: ai_stand, 0, NULL,
167: ai_stand, 0, NULL,
168: ai_stand, 0, NULL,
169: ai_stand, 0, NULL,
170: ai_stand, 0, NULL,
171: ai_stand, 0, NULL,
172: ai_stand, 0, NULL,
173: ai_stand, 0, NULL,
174: ai_stand, 0, NULL,
175: ai_stand, 0, NULL,
176: ai_stand, 0, NULL,
177: ai_stand, 0, NULL
178: };
179: mmove_t floater_move_stand2 = {FRAME_stand201, FRAME_stand252, floater_frames_stand2, NULL};
180:
181: void floater_stand (edict_t *self)
182: {
183: if (random() <= 0.5)
184: self->monsterinfo.currentmove = &floater_move_stand1;
185: else
186: self->monsterinfo.currentmove = &floater_move_stand2;
187: }
188:
189: mframe_t floater_frames_activate [] =
190: {
191: ai_move, 0, NULL,
192: ai_move, 0, NULL,
193: ai_move, 0, NULL,
194: ai_move, 0, NULL,
195: ai_move, 0, NULL,
196: ai_move, 0, NULL,
197: ai_move, 0, NULL,
198: ai_move, 0, NULL,
199: ai_move, 0, NULL,
200: ai_move, 0, NULL,
201: ai_move, 0, NULL,
202: ai_move, 0, NULL,
203: ai_move, 0, NULL,
204: ai_move, 0, NULL,
205: ai_move, 0, NULL,
206: ai_move, 0, NULL,
207: ai_move, 0, NULL,
208: ai_move, 0, NULL,
209: ai_move, 0, NULL,
210: ai_move, 0, NULL,
211: ai_move, 0, NULL,
212: ai_move, 0, NULL,
213: ai_move, 0, NULL,
214: ai_move, 0, NULL,
215: ai_move, 0, NULL,
216: ai_move, 0, NULL,
217: ai_move, 0, NULL,
218: ai_move, 0, NULL,
219: ai_move, 0, NULL,
220: ai_move, 0, NULL
221: };
222: mmove_t floater_move_activate = {FRAME_actvat01, FRAME_actvat31, floater_frames_activate, NULL};
223:
224: mframe_t floater_frames_attack1 [] =
225: {
226: ai_charge, 0, NULL, // Blaster attack
227: ai_charge, 0, NULL,
228: ai_charge, 0, NULL,
229: ai_charge, 0, floater_fire_blaster, // BOOM (0, -25.8, 32.5) -- LOOP Starts
230: ai_charge, 0, floater_fire_blaster,
231: ai_charge, 0, floater_fire_blaster,
232: ai_charge, 0, floater_fire_blaster,
233: ai_charge, 0, floater_fire_blaster,
234: ai_charge, 0, floater_fire_blaster,
235: ai_charge, 0, floater_fire_blaster,
236: ai_charge, 0, NULL,
237: ai_charge, 0, NULL,
238: ai_charge, 0, NULL,
239: ai_charge, 0, NULL // -- LOOP Ends
240: };
241: mmove_t floater_move_attack1 = {FRAME_attak101, FRAME_attak114, floater_frames_attack1, floater_run};
242:
243: // PMM - circle strafe frames
244: mframe_t floater_frames_attack1a [] =
245: {
246: ai_charge, 10, NULL, // Blaster attack
247: ai_charge, 10, NULL,
248: ai_charge, 10, NULL,
249: ai_charge, 10, floater_fire_blaster, // BOOM (0, -25.8, 32.5) -- LOOP Starts
250: ai_charge, 10, floater_fire_blaster,
251: ai_charge, 10, floater_fire_blaster,
252: ai_charge, 10, floater_fire_blaster,
253: ai_charge, 10, floater_fire_blaster,
254: ai_charge, 10, floater_fire_blaster,
255: ai_charge, 10, floater_fire_blaster,
256: ai_charge, 10, NULL,
257: ai_charge, 10, NULL,
258: ai_charge, 10, NULL,
259: ai_charge, 10, NULL // -- LOOP Ends
260: };
261: mmove_t floater_move_attack1a = {FRAME_attak101, FRAME_attak114, floater_frames_attack1a, floater_run};
262: //pmm
263: mframe_t floater_frames_attack2 [] =
264: {
265: ai_charge, 0, NULL, // Claws
266: ai_charge, 0, NULL,
267: ai_charge, 0, NULL,
268: ai_charge, 0, NULL,
269: ai_charge, 0, NULL,
270: ai_charge, 0, NULL,
271: ai_charge, 0, NULL,
272: ai_charge, 0, NULL,
273: ai_charge, 0, NULL,
274: ai_charge, 0, NULL,
275: ai_charge, 0, NULL,
276: ai_charge, 0, floater_wham, // WHAM (0, -45, 29.6) -- LOOP Starts
277: ai_charge, 0, NULL,
278: ai_charge, 0, NULL,
279: ai_charge, 0, NULL,
280: ai_charge, 0, NULL,
281: ai_charge, 0, NULL,
282: ai_charge, 0, NULL,
283: ai_charge, 0, NULL, // -- LOOP Ends
284: ai_charge, 0, NULL,
285: ai_charge, 0, NULL,
286: ai_charge, 0, NULL,
287: ai_charge, 0, NULL,
288: ai_charge, 0, NULL,
289: ai_charge, 0, NULL
290: };
291: mmove_t floater_move_attack2 = {FRAME_attak201, FRAME_attak225, floater_frames_attack2, floater_run};
292:
293: mframe_t floater_frames_attack3 [] =
294: {
295: ai_charge, 0, NULL,
296: ai_charge, 0, NULL,
297: ai_charge, 0, NULL,
298: ai_charge, 0, NULL,
299: ai_charge, 0, NULL,
300: ai_charge, 0, NULL,
301: ai_charge, 0, NULL,
302: ai_charge, 0, NULL,
303: ai_charge, 0, floater_zap, // -- LOOP Starts
304: ai_charge, 0, NULL,
305: ai_charge, 0, NULL,
306: ai_charge, 0, NULL,
307: ai_charge, 0, NULL,
308: ai_charge, 0, NULL,
309: ai_charge, 0, NULL,
310: ai_charge, 0, NULL,
311: ai_charge, 0, NULL,
312: ai_charge, 0, NULL,
313: ai_charge, 0, NULL,
314: ai_charge, 0, NULL,
315: ai_charge, 0, NULL,
316: ai_charge, 0, NULL,
317: ai_charge, 0, NULL,
318: ai_charge, 0, NULL,
319: ai_charge, 0, NULL,
320: ai_charge, 0, NULL,
321: ai_charge, 0, NULL,
322: ai_charge, 0, NULL,
323: ai_charge, 0, NULL, // -- LOOP Ends
324: ai_charge, 0, NULL,
325: ai_charge, 0, NULL,
326: ai_charge, 0, NULL,
327: ai_charge, 0, NULL,
328: ai_charge, 0, NULL
329: };
330: mmove_t floater_move_attack3 = {FRAME_attak301, FRAME_attak334, floater_frames_attack3, floater_run};
331:
332: mframe_t floater_frames_death [] =
333: {
334: ai_move, 0, NULL,
335: ai_move, 0, NULL,
336: ai_move, 0, NULL,
337: ai_move, 0, NULL,
338: ai_move, 0, NULL,
339: ai_move, 0, NULL,
340: ai_move, 0, NULL,
341: ai_move, 0, NULL,
342: ai_move, 0, NULL,
343: ai_move, 0, NULL,
344: ai_move, 0, NULL,
345: ai_move, 0, NULL,
346: ai_move, 0, NULL
347: };
348: mmove_t floater_move_death = {FRAME_death01, FRAME_death13, floater_frames_death, floater_dead};
349:
350: mframe_t floater_frames_pain1 [] =
351: {
352: ai_move, 0, NULL,
353: ai_move, 0, NULL,
354: ai_move, 0, NULL,
355: ai_move, 0, NULL,
356: ai_move, 0, NULL,
357: ai_move, 0, NULL,
358: ai_move, 0, NULL
359: };
360: mmove_t floater_move_pain1 = {FRAME_pain101, FRAME_pain107, floater_frames_pain1, floater_run};
361:
362: mframe_t floater_frames_pain2 [] =
363: {
364: ai_move, 0, NULL,
365: ai_move, 0, NULL,
366: ai_move, 0, NULL,
367: ai_move, 0, NULL,
368: ai_move, 0, NULL,
369: ai_move, 0, NULL,
370: ai_move, 0, NULL,
371: ai_move, 0, NULL
372: };
373: mmove_t floater_move_pain2 = {FRAME_pain201, FRAME_pain208, floater_frames_pain2, floater_run};
374:
375: mframe_t floater_frames_pain3 [] =
376: {
377: ai_move, 0, NULL,
378: ai_move, 0, NULL,
379: ai_move, 0, NULL,
380: ai_move, 0, NULL,
381: ai_move, 0, NULL,
382: ai_move, 0, NULL,
383: ai_move, 0, NULL,
384: ai_move, 0, NULL,
385: ai_move, 0, NULL,
386: ai_move, 0, NULL,
387: ai_move, 0, NULL,
388: ai_move, 0, NULL
389: };
390: mmove_t floater_move_pain3 = {FRAME_pain301, FRAME_pain312, floater_frames_pain3, floater_run};
391:
392: mframe_t floater_frames_walk [] =
393: {
394: ai_walk, 5, NULL,
395: ai_walk, 5, NULL,
396: ai_walk, 5, NULL,
397: ai_walk, 5, NULL,
398: ai_walk, 5, NULL,
399: ai_walk, 5, NULL,
400: ai_walk, 5, NULL,
401: ai_walk, 5, NULL,
402: ai_walk, 5, NULL,
403: ai_walk, 5, NULL,
404: ai_walk, 5, NULL,
405: ai_walk, 5, NULL,
406: ai_walk, 5, NULL,
407: ai_walk, 5, NULL,
408: ai_walk, 5, NULL,
409: ai_walk, 5, NULL,
410: ai_walk, 5, NULL,
411: ai_walk, 5, NULL,
412: ai_walk, 5, NULL,
413: ai_walk, 5, NULL,
414: ai_walk, 5, NULL,
415: ai_walk, 5, NULL,
416: ai_walk, 5, NULL,
417: ai_walk, 5, NULL,
418: ai_walk, 5, NULL,
419: ai_walk, 5, NULL,
420: ai_walk, 5, NULL,
421: ai_walk, 5, NULL,
422: ai_walk, 5, NULL,
423: ai_walk, 5, NULL,
424: ai_walk, 5, NULL,
425: ai_walk, 5, NULL,
426: ai_walk, 5, NULL,
427: ai_walk, 5, NULL,
428: ai_walk, 5, NULL,
429: ai_walk, 5, NULL,
430: ai_walk, 5, NULL,
431: ai_walk, 5, NULL,
432: ai_walk, 5, NULL,
433: ai_walk, 5, NULL,
434: ai_walk, 5, NULL,
435: ai_walk, 5, NULL,
436: ai_walk, 5, NULL,
437: ai_walk, 5, NULL,
438: ai_walk, 5, NULL,
439: ai_walk, 5, NULL,
440: ai_walk, 5, NULL,
441: ai_walk, 5, NULL,
442: ai_walk, 5, NULL,
443: ai_walk, 5, NULL,
444: ai_walk, 5, NULL,
445: ai_walk, 5, NULL
446: };
447: mmove_t floater_move_walk = {FRAME_stand101, FRAME_stand152, floater_frames_walk, NULL};
448:
449: mframe_t floater_frames_run [] =
450: {
451: ai_run, 13, NULL,
452: ai_run, 13, NULL,
453: ai_run, 13, NULL,
454: ai_run, 13, NULL,
455: ai_run, 13, NULL,
456: ai_run, 13, NULL,
457: ai_run, 13, NULL,
458: ai_run, 13, NULL,
459: ai_run, 13, NULL,
460: ai_run, 13, NULL,
461: ai_run, 13, NULL,
462: ai_run, 13, NULL,
463: ai_run, 13, NULL,
464: ai_run, 13, NULL,
465: ai_run, 13, NULL,
466: ai_run, 13, NULL,
467: ai_run, 13, NULL,
468: ai_run, 13, NULL,
469: ai_run, 13, NULL,
470: ai_run, 13, NULL,
471: ai_run, 13, NULL,
472: ai_run, 13, NULL,
473: ai_run, 13, NULL,
474: ai_run, 13, NULL,
475: ai_run, 13, NULL,
476: ai_run, 13, NULL,
477: ai_run, 13, NULL,
478: ai_run, 13, NULL,
479: ai_run, 13, NULL,
480: ai_run, 13, NULL,
481: ai_run, 13, NULL,
482: ai_run, 13, NULL,
483: ai_run, 13, NULL,
484: ai_run, 13, NULL,
485: ai_run, 13, NULL,
486: ai_run, 13, NULL,
487: ai_run, 13, NULL,
488: ai_run, 13, NULL,
489: ai_run, 13, NULL,
490: ai_run, 13, NULL,
491: ai_run, 13, NULL,
492: ai_run, 13, NULL,
493: ai_run, 13, NULL,
494: ai_run, 13, NULL,
495: ai_run, 13, NULL,
496: ai_run, 13, NULL,
497: ai_run, 13, NULL,
498: ai_run, 13, NULL,
499: ai_run, 13, NULL,
500: ai_run, 13, NULL,
501: ai_run, 13, NULL,
502: ai_run, 13, NULL
503: };
504: mmove_t floater_move_run = {FRAME_stand101, FRAME_stand152, floater_frames_run, NULL};
505:
506: void floater_run (edict_t *self)
507: {
508: if (self->monsterinfo.aiflags & AI_STAND_GROUND)
509: self->monsterinfo.currentmove = &floater_move_stand1;
510: else
511: self->monsterinfo.currentmove = &floater_move_run;
512: }
513:
514: void floater_walk (edict_t *self)
515: {
516: self->monsterinfo.currentmove = &floater_move_walk;
517: }
518:
519: void floater_wham (edict_t *self)
520: {
521: static vec3_t aim = {MELEE_DISTANCE, 0, 0};
522: gi.sound (self, CHAN_WEAPON, sound_attack3, 1, ATTN_NORM, 0);
523: fire_hit (self, aim, 5 + rand() % 6, -50);
524: }
525:
526: void floater_zap (edict_t *self)
527: {
528: vec3_t forward, right;
529: vec3_t origin;
530: vec3_t dir;
531: vec3_t offset;
532:
533: VectorSubtract (self->enemy->s.origin, self->s.origin, dir);
534:
535: AngleVectors (self->s.angles, forward, right, NULL);
536: //FIXME use a flash and replace these two lines with the commented one
537: VectorSet (offset, 18.5, -0.9, 10);
538: G_ProjectSource (self->s.origin, offset, forward, right, origin);
539: // G_ProjectSource (self->s.origin, monster_flash_offset[flash_number], forward, right, origin);
540:
541: gi.sound (self, CHAN_WEAPON, sound_attack2, 1, ATTN_NORM, 0);
542:
543: //FIXME use the flash, Luke
544: gi.WriteByte (svc_temp_entity);
545: gi.WriteByte (TE_SPLASH);
546: gi.WriteByte (32);
547: gi.WritePosition (origin);
548: gi.WriteDir (dir);
549: gi.WriteByte (1); //sparks
550: gi.multicast (origin, MULTICAST_PVS);
551:
552: T_Damage (self->enemy, self, self, dir, self->enemy->s.origin, vec3_origin, 5 + rand() % 6, -10, DAMAGE_ENERGY, MOD_UNKNOWN);
553: }
554:
555: void floater_attack(edict_t *self)
556: {
557: float chance;
558: /* if (random() <= 0.5)
559: self->monsterinfo.currentmove = &flyer_move_attack1;
560: else */
561: // 0% chance of circle in easy
562: // 50% chance in normal
563: // 75% chance in hard
564: // 86.67% chance in nightmare
565: if (!skill->value)
566: chance = 0;
567: else
568: chance = 1.0 - (0.5/(float)(skill->value));
569:
570: if (random() > chance)
571: {
572: self->monsterinfo.attack_state = AS_STRAIGHT;
573: self->monsterinfo.currentmove = &floater_move_attack1;
574: }
575: else // circle strafe
576: {
577: if (random () <= 0.5) // switch directions
578: self->monsterinfo.lefty = 1 - self->monsterinfo.lefty;
579: self->monsterinfo.attack_state = AS_SLIDING;
580: self->monsterinfo.currentmove = &floater_move_attack1a;
581: }
582: }
583:
584:
585: void floater_melee(edict_t *self)
586: {
587: if (random() < 0.5)
588: self->monsterinfo.currentmove = &floater_move_attack3;
589: else
590: self->monsterinfo.currentmove = &floater_move_attack2;
591: }
592:
593:
594: void floater_pain (edict_t *self, edict_t *other, float kick, int damage)
595: {
596: int n;
597:
598: if (self->health < (self->max_health / 2))
599: self->s.skinnum = 1;
600:
601: if (level.time < self->pain_debounce_time)
602: return;
603:
604: self->pain_debounce_time = level.time + 3;
605: if (skill->value == 3)
606: return; // no pain anims in nightmare
607:
608: n = (rand() + 1) % 3;
609: if (n == 0)
610: {
611: gi.sound (self, CHAN_VOICE, sound_pain1, 1, ATTN_NORM, 0);
612: self->monsterinfo.currentmove = &floater_move_pain1;
613: }
614: else
615: {
616: gi.sound (self, CHAN_VOICE, sound_pain2, 1, ATTN_NORM, 0);
617: self->monsterinfo.currentmove = &floater_move_pain2;
618: }
619: }
620:
621: void floater_dead (edict_t *self)
622: {
623: VectorSet (self->mins, -16, -16, -24);
624: VectorSet (self->maxs, 16, 16, -8);
625: self->movetype = MOVETYPE_TOSS;
626: self->svflags |= SVF_DEADMONSTER;
627: self->nextthink = 0;
628: gi.linkentity (self);
629: }
630:
631: void floater_die (edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point)
632: {
633: gi.sound (self, CHAN_VOICE, sound_death1, 1, ATTN_NORM, 0);
634: BecomeExplosion1(self);
635: }
636:
637: //===========
638: //PGM
639: qboolean floater_blocked (edict_t *self, float dist)
640: {
641: if(blocked_checkshot (self, 0.25 + (0.05 * skill->value) ))
642: return true;
643:
644: return false;
645: }
646: //PGM
647: //===========
648:
649: /*QUAKED monster_floater (1 .5 0) (-16 -16 -24) (16 16 32) Ambush Trigger_Spawn Sight
650: */
651: void SP_monster_floater (edict_t *self)
652: {
653: if (deathmatch->value)
654: {
655: G_FreeEdict (self);
656: return;
657: }
658:
659: sound_attack2 = gi.soundindex ("floater/fltatck2.wav");
660: sound_attack3 = gi.soundindex ("floater/fltatck3.wav");
661: sound_death1 = gi.soundindex ("floater/fltdeth1.wav");
662: sound_idle = gi.soundindex ("floater/fltidle1.wav");
663: sound_pain1 = gi.soundindex ("floater/fltpain1.wav");
664: sound_pain2 = gi.soundindex ("floater/fltpain2.wav");
665: sound_sight = gi.soundindex ("floater/fltsght1.wav");
666:
667: gi.soundindex ("floater/fltatck1.wav");
668:
669: self->s.sound = gi.soundindex ("floater/fltsrch1.wav");
670:
671: self->movetype = MOVETYPE_STEP;
672: self->solid = SOLID_BBOX;
673: self->s.modelindex = gi.modelindex ("models/monsters/float/tris.md2");
674: VectorSet (self->mins, -24, -24, -24);
675: VectorSet (self->maxs, 24, 24, 32);
676:
677: self->health = 200;
678: self->gib_health = -80;
679: self->mass = 300;
680:
681: self->pain = floater_pain;
682: self->die = floater_die;
683:
684: self->monsterinfo.stand = floater_stand;
685: self->monsterinfo.walk = floater_walk;
686: self->monsterinfo.run = floater_run;
687: // self->monsterinfo.dodge = floater_dodge;
688: self->monsterinfo.attack = floater_attack;
689: self->monsterinfo.melee = floater_melee;
690: self->monsterinfo.sight = floater_sight;
691: self->monsterinfo.idle = floater_idle;
692: self->monsterinfo.blocked = floater_blocked; // PGM
693:
694: gi.linkentity (self);
695:
696: if (random() <= 0.5)
697: self->monsterinfo.currentmove = &floater_move_stand1;
698: else
699: self->monsterinfo.currentmove = &floater_move_stand2;
700:
701: self->monsterinfo.scale = MODEL_SCALE;
702:
703: flymonster_start (self);
704: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.