|
|
1.1 root 1: /*
2: ==============================================================================
3:
4: FLIPPER
5:
6: ==============================================================================
7: */
8:
9: #include "g_local.h"
10: #include "m_flipper.h"
11:
12:
13: static int sound_chomp;
14: static int sound_attack;
15: static int sound_pain1;
16: static int sound_pain2;
17: static int sound_death;
18: static int sound_idle;
19: static int sound_search;
20: static int sound_sight;
21:
22:
23: void flipper_stand (edict_t *self);
24:
25: mframe_t flipper_frames_stand [] =
26: {
27: ai_stand, 0, NULL
28: };
29:
30: mmove_t flipper_move_stand = {FRAME_flphor01, FRAME_flphor01, flipper_frames_stand, NULL};
31:
32: void flipper_stand (edict_t *self)
33: {
34: self->monsterinfo.currentmove = &flipper_move_stand;
35: }
36:
37: #define FLIPPER_RUN_SPEED 24
38:
39: mframe_t flipper_frames_run [] =
40: {
41: ai_run, FLIPPER_RUN_SPEED, NULL, // 6
42: ai_run, FLIPPER_RUN_SPEED, NULL,
43: ai_run, FLIPPER_RUN_SPEED, NULL,
44: ai_run, FLIPPER_RUN_SPEED, NULL,
45: ai_run, FLIPPER_RUN_SPEED, NULL, // 10
46:
47: ai_run, FLIPPER_RUN_SPEED, NULL,
48: ai_run, FLIPPER_RUN_SPEED, NULL,
49: ai_run, FLIPPER_RUN_SPEED, NULL,
50: ai_run, FLIPPER_RUN_SPEED, NULL,
51: ai_run, FLIPPER_RUN_SPEED, NULL,
52: ai_run, FLIPPER_RUN_SPEED, NULL,
53: ai_run, FLIPPER_RUN_SPEED, NULL,
54: ai_run, FLIPPER_RUN_SPEED, NULL,
55: ai_run, FLIPPER_RUN_SPEED, NULL,
56: ai_run, FLIPPER_RUN_SPEED, NULL, // 20
57:
58: ai_run, FLIPPER_RUN_SPEED, NULL,
59: ai_run, FLIPPER_RUN_SPEED, NULL,
60: ai_run, FLIPPER_RUN_SPEED, NULL,
61: ai_run, FLIPPER_RUN_SPEED, NULL,
62: ai_run, FLIPPER_RUN_SPEED, NULL,
63: ai_run, FLIPPER_RUN_SPEED, NULL,
64: ai_run, FLIPPER_RUN_SPEED, NULL,
65: ai_run, FLIPPER_RUN_SPEED, NULL,
66: ai_run, FLIPPER_RUN_SPEED, NULL // 29
67: };
68: mmove_t flipper_move_run_loop = {FRAME_flpver06, FRAME_flpver29, flipper_frames_run, NULL};
69:
70: void flipper_run_loop (edict_t *self)
71: {
72: self->monsterinfo.currentmove = &flipper_move_run_loop;
73: }
74:
75: mframe_t flipper_frames_run_start [] =
76: {
77: ai_run, 8, NULL,
78: ai_run, 8, NULL,
79: ai_run, 8, NULL,
80: ai_run, 8, NULL,
81: ai_run, 8, NULL,
82: ai_run, 8, NULL
83: };
84: mmove_t flipper_move_run_start = {FRAME_flpver01, FRAME_flpver06, flipper_frames_run_start, flipper_run_loop};
85:
86: void flipper_run (edict_t *self)
87: {
88: self->monsterinfo.currentmove = &flipper_move_run_start;
89: }
90:
91: /* Standard Swimming */
92: mframe_t flipper_frames_walk [] =
93: {
94: ai_walk, 4, NULL,
95: ai_walk, 4, NULL,
96: ai_walk, 4, NULL,
97: ai_walk, 4, NULL,
98: ai_walk, 4, NULL,
99: ai_walk, 4, NULL,
100: ai_walk, 4, NULL,
101: ai_walk, 4, NULL,
102: ai_walk, 4, NULL,
103: ai_walk, 4, NULL,
104: ai_walk, 4, NULL,
105: ai_walk, 4, NULL,
106: ai_walk, 4, NULL,
107: ai_walk, 4, NULL,
108: ai_walk, 4, NULL,
109: ai_walk, 4, NULL,
110: ai_walk, 4, NULL,
111: ai_walk, 4, NULL,
112: ai_walk, 4, NULL,
113: ai_walk, 4, NULL,
114: ai_walk, 4, NULL,
115: ai_walk, 4, NULL,
116: ai_walk, 4, NULL,
117: ai_walk, 4, NULL
118: };
119: mmove_t flipper_move_walk = {FRAME_flphor01, FRAME_flphor24, flipper_frames_walk, NULL};
120:
121: void flipper_walk (edict_t *self)
122: {
123: self->monsterinfo.currentmove = &flipper_move_walk;
124: }
125:
126: mframe_t flipper_frames_start_run [] =
127: {
128: ai_run, 8, NULL,
129: ai_run, 8, NULL,
130: ai_run, 8, NULL,
131: ai_run, 8, NULL,
132: ai_run, 8, flipper_run
133: };
134: mmove_t flipper_move_start_run = {FRAME_flphor01, FRAME_flphor05, flipper_frames_start_run, NULL};
135:
136: void flipper_start_run (edict_t *self)
137: {
138: self->monsterinfo.currentmove = &flipper_move_start_run;
139: }
140:
141: mframe_t flipper_frames_pain2 [] =
142: {
143: ai_move, 0, NULL,
144: ai_move, 0, NULL,
145: ai_move, 0, NULL,
146: ai_move, 0, NULL,
147: ai_move, 0, NULL
148: };
149: mmove_t flipper_move_pain2 = {FRAME_flppn101, FRAME_flppn105, flipper_frames_pain2, flipper_run};
150:
151: mframe_t flipper_frames_pain1 [] =
152: {
153: ai_move, 0, NULL,
154: ai_move, 0, NULL,
155: ai_move, 0, NULL,
156: ai_move, 0, NULL,
157: ai_move, 0, NULL
158: };
159: mmove_t flipper_move_pain1 = {FRAME_flppn201, FRAME_flppn205, flipper_frames_pain1, flipper_run};
160:
161: void flipper_bite (edict_t *self)
162: {
163: vec3_t aim;
164:
165: VectorSet (aim, MELEE_DISTANCE, 0, 0);
166: fire_hit (self, aim, 5, 0);
167: }
168:
169: void flipper_preattack (edict_t *self)
170: {
171: gi.sound (self, CHAN_WEAPON, sound_chomp, 1, ATTN_NORM, 0);
172: }
173:
174: mframe_t flipper_frames_attack [] =
175: {
176: ai_charge, 0, flipper_preattack,
177: ai_charge, 0, NULL,
178: ai_charge, 0, NULL,
179: ai_charge, 0, NULL,
180: ai_charge, 0, NULL,
181: ai_charge, 0, NULL,
182: ai_charge, 0, NULL,
183: ai_charge, 0, NULL,
184: ai_charge, 0, NULL,
185: ai_charge, 0, NULL,
186: ai_charge, 0, NULL,
187: ai_charge, 0, NULL,
188: ai_charge, 0, NULL,
189: ai_charge, 0, flipper_bite,
190: ai_charge, 0, NULL,
191: ai_charge, 0, NULL,
192: ai_charge, 0, NULL,
193: ai_charge, 0, NULL,
194: ai_charge, 0, flipper_bite,
195: ai_charge, 0, NULL
196: };
197: mmove_t flipper_move_attack = {FRAME_flpbit01, FRAME_flpbit20, flipper_frames_attack, flipper_run};
198:
199: void flipper_melee(edict_t *self)
200: {
201: self->monsterinfo.currentmove = &flipper_move_attack;
202: }
203:
204: void flipper_pain (edict_t *self, edict_t *other, float kick, int damage)
205: {
206: int n;
207:
208: if (self->health < (self->max_health / 2))
209: self->s.skinnum = 1;
210:
211: if (level.time < self->pain_debounce_time)
212: return;
213:
214: self->pain_debounce_time = level.time + 3;
215:
216: if (skill->value == 3)
217: return; // no pain anims in nightmare
218:
219: n = (rand() + 1) % 2;
220: if (n == 0)
221: {
222: gi.sound (self, CHAN_VOICE, sound_pain1, 1, ATTN_NORM, 0);
223: self->monsterinfo.currentmove = &flipper_move_pain1;
224: }
225: else
226: {
227: gi.sound (self, CHAN_VOICE, sound_pain2, 1, ATTN_NORM, 0);
228: self->monsterinfo.currentmove = &flipper_move_pain2;
229: }
230: }
231:
232: void flipper_dead (edict_t *self)
233: {
234: VectorSet (self->mins, -16, -16, -24);
235: VectorSet (self->maxs, 16, 16, -8);
236: self->movetype = MOVETYPE_TOSS;
237: self->svflags |= SVF_DEADMONSTER;
238: self->nextthink = 0;
239: gi.linkentity (self);
240: }
241:
242: mframe_t flipper_frames_death [] =
243: {
244: ai_move, 0, NULL,
245: ai_move, 0, NULL,
246: ai_move, 0, NULL,
247: ai_move, 0, NULL,
248: ai_move, 0, NULL,
249: ai_move, 0, NULL,
250: ai_move, 0, NULL,
251: ai_move, 0, NULL,
252: ai_move, 0, NULL,
253: ai_move, 0, NULL,
254:
255: ai_move, 0, NULL,
256: ai_move, 0, NULL,
257: ai_move, 0, NULL,
258: ai_move, 0, NULL,
259: ai_move, 0, NULL,
260: ai_move, 0, NULL,
261: ai_move, 0, NULL,
262: ai_move, 0, NULL,
263: ai_move, 0, NULL,
264: ai_move, 0, NULL,
265:
266: ai_move, 0, NULL,
267: ai_move, 0, NULL,
268: ai_move, 0, NULL,
269: ai_move, 0, NULL,
270: ai_move, 0, NULL,
271: ai_move, 0, NULL,
272: ai_move, 0, NULL,
273: ai_move, 0, NULL,
274: ai_move, 0, NULL,
275: ai_move, 0, NULL,
276:
277: ai_move, 0, NULL,
278: ai_move, 0, NULL,
279: ai_move, 0, NULL,
280: ai_move, 0, NULL,
281: ai_move, 0, NULL,
282: ai_move, 0, NULL,
283: ai_move, 0, NULL,
284: ai_move, 0, NULL,
285: ai_move, 0, NULL,
286: ai_move, 0, NULL,
287:
288: ai_move, 0, NULL,
289: ai_move, 0, NULL,
290: ai_move, 0, NULL,
291: ai_move, 0, NULL,
292: ai_move, 0, NULL,
293: ai_move, 0, NULL,
294: ai_move, 0, NULL,
295: ai_move, 0, NULL,
296: ai_move, 0, NULL,
297: ai_move, 0, NULL,
298:
299: ai_move, 0, NULL,
300: ai_move, 0, NULL,
301: ai_move, 0, NULL,
302: ai_move, 0, NULL,
303: ai_move, 0, NULL,
304: ai_move, 0, NULL
305: };
306: mmove_t flipper_move_death = {FRAME_flpdth01, FRAME_flpdth56, flipper_frames_death, flipper_dead};
307:
308: void flipper_sight (edict_t *self, edict_t *other)
309: {
310: gi.sound (self, CHAN_VOICE, sound_sight, 1, ATTN_NORM, 0);
311: }
312:
313: void flipper_die (edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point)
314: {
315: int n;
316:
317: // check for gib
318: if (self->health <= self->gib_health)
319: {
320: gi.sound (self, CHAN_VOICE, gi.soundindex ("misc/udeath.wav"), 1, ATTN_NORM, 0);
321: for (n= 0; n < 2; n++)
322: ThrowGib (self, "models/objects/gibs/bone/tris.md2", damage, GIB_ORGANIC);
323: for (n= 0; n < 2; n++)
324: ThrowGib (self, "models/objects/gibs/sm_meat/tris.md2", damage, GIB_ORGANIC);
325: ThrowHead (self, "models/objects/gibs/sm_meat/tris.md2", damage, GIB_ORGANIC);
326: self->deadflag = DEAD_DEAD;
327: return;
328: }
329:
330: if (self->deadflag == DEAD_DEAD)
331: return;
332:
333: // regular death
334: gi.sound (self, CHAN_VOICE, sound_death, 1, ATTN_NORM, 0);
335: self->deadflag = DEAD_DEAD;
336: self->takedamage = DAMAGE_YES;
337: self->monsterinfo.currentmove = &flipper_move_death;
338: }
339:
340: /*QUAKED monster_flipper (1 .5 0) (-16 -16 -24) (16 16 32) Ambush Trigger_Spawn Sight
341: */
342: void SP_monster_flipper (edict_t *self)
343: {
344: if (deathmatch->value)
345: {
346: G_FreeEdict (self);
347: return;
348: }
349:
350: sound_pain1 = gi.soundindex ("flipper/flppain1.wav");
351: sound_pain2 = gi.soundindex ("flipper/flppain2.wav");
352: sound_death = gi.soundindex ("flipper/flpdeth1.wav");
353: sound_chomp = gi.soundindex ("flipper/flpatck1.wav");
354: sound_attack = gi.soundindex ("flipper/flpatck2.wav");
355: sound_idle = gi.soundindex ("flipper/flpidle1.wav");
356: sound_search = gi.soundindex ("flipper/flpsrch1.wav");
357: sound_sight = gi.soundindex ("flipper/flpsght1.wav");
358:
359: self->movetype = MOVETYPE_STEP;
360: self->solid = SOLID_BBOX;
361: self->s.modelindex = gi.modelindex ("models/monsters/flipper/tris.md2");
362: VectorSet (self->mins, -16, -16, 0);
363: VectorSet (self->maxs, 16, 16, 32);
364:
365: self->health = 50;
366: self->gib_health = -30;
367: self->mass = 100;
368:
369: self->pain = flipper_pain;
370: self->die = flipper_die;
371:
372: self->monsterinfo.stand = flipper_stand;
373: self->monsterinfo.walk = flipper_walk;
374: self->monsterinfo.run = flipper_start_run;
375: self->monsterinfo.melee = flipper_melee;
376: self->monsterinfo.sight = flipper_sight;
377:
378: gi.linkentity (self);
379:
380: self->monsterinfo.currentmove = &flipper_move_stand;
381: self->monsterinfo.scale = MODEL_SCALE;
382:
383: swimmonster_start (self);
384: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.