|
|
1.1 root 1:
2: /*
3: ==============================================================================
4:
5: GLADIATOR BOSS
6:
7: ==============================================================================
8: */
9:
10: #include "g_local.h"
11: #include "m_gladiator.h"
12:
13:
14: static int sound_pain1;
15: static int sound_pain2;
16: static int sound_die;
17: static int sound_gun;
18: static int sound_cleaver_swing;
19: static int sound_cleaver_hit;
20: static int sound_cleaver_miss;
21: static int sound_idle;
22: static int sound_search;
23: static int sound_sight;
24:
25:
26: void gladb_idle (edict_t *self)
27: {
28: gi.sound (self, CHAN_VOICE, sound_idle, 1, ATTN_IDLE, 0);
29: }
30:
31: void gladb_sight (edict_t *self, edict_t *other)
32: {
33: gi.sound (self, CHAN_VOICE, sound_sight, 1, ATTN_NORM, 0);
34: }
35:
36: void gladb_search (edict_t *self)
37: {
38: gi.sound (self, CHAN_VOICE, sound_search, 1, ATTN_NORM, 0);
39: }
40:
41: void gladb_cleaver_swing (edict_t *self)
42: {
43: gi.sound (self, CHAN_WEAPON, sound_cleaver_swing, 1, ATTN_NORM, 0);
44: }
45:
46: mframe_t gladb_frames_stand [] =
47: {
48: ai_stand, 0, NULL,
49: ai_stand, 0, NULL,
50: ai_stand, 0, NULL,
51: ai_stand, 0, NULL,
52: ai_stand, 0, NULL,
53: ai_stand, 0, NULL,
54: ai_stand, 0, NULL
55: };
56: mmove_t gladb_move_stand = {FRAME_stand1, FRAME_stand7, gladb_frames_stand, NULL};
57:
58: void gladb_stand (edict_t *self)
59: {
60: self->monsterinfo.currentmove = &gladb_move_stand;
61: }
62:
63:
64: mframe_t gladb_frames_walk [] =
65: {
66: ai_walk, 15, NULL,
67: ai_walk, 7, NULL,
68: ai_walk, 6, NULL,
69: ai_walk, 5, NULL,
70: ai_walk, 2, NULL,
71: ai_walk, 0, NULL,
72: ai_walk, 2, NULL,
73: ai_walk, 8, NULL,
74: ai_walk, 12, NULL,
75: ai_walk, 8, NULL,
76: ai_walk, 5, NULL,
77: ai_walk, 5, NULL,
78: ai_walk, 2, NULL,
79: ai_walk, 2, NULL,
80: ai_walk, 1, NULL,
81: ai_walk, 8, NULL
82: };
83: mmove_t gladb_move_walk = {FRAME_walk1, FRAME_walk16, gladb_frames_walk, NULL};
84:
85: void gladb_walk (edict_t *self)
86: {
87: self->monsterinfo.currentmove = &gladb_move_walk;
88: }
89:
90:
91: mframe_t gladb_frames_run [] =
92: {
93: ai_run, 23, NULL,
94: ai_run, 14, NULL,
95: ai_run, 14, NULL,
96: ai_run, 21, NULL,
97: ai_run, 12, NULL,
98: ai_run, 13, NULL
99: };
100: mmove_t gladb_move_run = {FRAME_run1, FRAME_run6, gladb_frames_run, NULL};
101:
102: void gladb_run (edict_t *self)
103: {
104: if (self->monsterinfo.aiflags & AI_STAND_GROUND)
105: self->monsterinfo.currentmove = &gladb_move_stand;
106: else
107: self->monsterinfo.currentmove = &gladb_move_run;
108: }
109:
110:
111: void GladbMelee (edict_t *self)
112: {
113: vec3_t aim;
114:
115: VectorSet (aim, MELEE_DISTANCE, self->mins[0], -4);
116: if (fire_hit (self, aim, (20 + (rand() %5)), 300))
117: gi.sound (self, CHAN_AUTO, sound_cleaver_hit, 1, ATTN_NORM, 0);
118: else
119: gi.sound (self, CHAN_AUTO, sound_cleaver_miss, 1, ATTN_NORM, 0);
120: }
121:
122: mframe_t gladb_frames_attack_melee [] =
123: {
124: ai_charge, 0, NULL,
125: ai_charge, 0, NULL,
126: ai_charge, 0, NULL,
127: ai_charge, 0, NULL,
128: ai_charge, 0, gladb_cleaver_swing,
129: ai_charge, 0, NULL,
130: ai_charge, 0, GladbMelee,
131: ai_charge, 0, NULL,
132: ai_charge, 0, NULL,
133: ai_charge, 0, NULL,
134: ai_charge, 0, gladb_cleaver_swing,
135: ai_charge, 0, NULL,
136: ai_charge, 0, NULL,
137: ai_charge, 0, GladbMelee,
138: ai_charge, 0, NULL,
139: ai_charge, 0, NULL,
140: ai_charge, 0, NULL
141: };
142: mmove_t gladb_move_attack_melee = {FRAME_melee1, FRAME_melee17, gladb_frames_attack_melee, gladb_run};
143:
144: void gladb_melee(edict_t *self)
145: {
146: self->monsterinfo.currentmove = &gladb_move_attack_melee;
147: }
148:
149:
150: void gladbGun (edict_t *self)
151: {
152: vec3_t start;
153: vec3_t dir;
154: vec3_t forward, right;
155:
156: AngleVectors (self->s.angles, forward, right, NULL);
157: G_ProjectSource (self->s.origin, monster_flash_offset[MZ2_GLADIATOR_RAILGUN_1], forward, right, start);
158:
159: // calc direction to where we targted
160: VectorSubtract (self->pos1, start, dir);
161: VectorNormalize (dir);
162:
163: fire_plasma (self, start, dir, 100, 725, 60, 60);
164: }
165:
166: void gladbGun_check (edict_t *self)
167: {
168: if (skill->value == 3)
169: gladbGun (self);
170: }
171:
172: mframe_t gladb_frames_attack_gun [] =
173: {
174: ai_charge, 0, NULL,
175: ai_charge, 0, NULL,
176: ai_charge, 0, gladbGun,
177: ai_charge, 0, NULL,
178: ai_charge, 0, NULL,
179: ai_charge, 0, gladbGun,
180: ai_charge, 0, NULL,
181: ai_charge, 0, NULL,
182: ai_charge, 0, gladbGun_check
183: };
184: mmove_t gladb_move_attack_gun = {FRAME_attack1, FRAME_attack9, gladb_frames_attack_gun, gladb_run};
185:
186: void gladb_attack(edict_t *self)
187: {
188: float range;
189: vec3_t v;
190:
191: // a small safe zone
192: VectorSubtract (self->s.origin, self->enemy->s.origin, v);
193: range = VectorLength(v);
194: if (range <= (MELEE_DISTANCE + 32))
195: return;
196:
197: // charge up the railgun
198: gi.sound (self, CHAN_WEAPON, sound_gun, 1, ATTN_NORM, 0);
199: VectorCopy (self->enemy->s.origin, self->pos1); //save for aiming the shot
200: self->pos1[2] += self->enemy->viewheight;
201: self->monsterinfo.currentmove = &gladb_move_attack_gun;
202: }
203:
204:
205: mframe_t gladb_frames_pain [] =
206: {
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: };
214: mmove_t gladb_move_pain = {FRAME_pain1, FRAME_pain6, gladb_frames_pain, gladb_run};
215:
216: mframe_t gladb_frames_pain_air [] =
217: {
218: ai_move, 0, NULL,
219: ai_move, 0, NULL,
220: ai_move, 0, NULL,
221: ai_move, 0, NULL,
222: ai_move, 0, NULL,
223: ai_move, 0, NULL,
224: ai_move, 0, NULL
225: };
226: mmove_t gladb_move_pain_air = {FRAME_painup1, FRAME_painup7, gladb_frames_pain_air, gladb_run};
227:
228: void gladb_pain (edict_t *self, edict_t *other, float kick, int damage)
229: {
230:
231: if (self->health < (self->max_health / 2))
232: self->s.skinnum = 1;
233:
234: if (level.time < self->pain_debounce_time)
235: {
236: if ((self->velocity[2] > 100) && (self->monsterinfo.currentmove == &gladb_move_pain))
237: self->monsterinfo.currentmove = &gladb_move_pain_air;
238: return;
239: }
240:
241: self->pain_debounce_time = level.time + 3;
242:
243: if (random() < 0.5)
244: gi.sound (self, CHAN_VOICE, sound_pain1, 1, ATTN_NORM, 0);
245: else
246: gi.sound (self, CHAN_VOICE, sound_pain2, 1, ATTN_NORM, 0);
247:
248: if (self->velocity[2] > 100)
249: self->monsterinfo.currentmove = &gladb_move_pain_air;
250: else
251: self->monsterinfo.currentmove = &gladb_move_pain;
252:
253: }
254:
255:
256: void gladb_dead (edict_t *self)
257: {
258: VectorSet (self->mins, -16, -16, -24);
259: VectorSet (self->maxs, 16, 16, -8);
260: self->movetype = MOVETYPE_TOSS;
261: self->svflags |= SVF_DEADMONSTER;
262: self->nextthink = 0;
263: gi.linkentity (self);
264: }
265:
266: mframe_t gladb_frames_death [] =
267: {
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: ai_move, 0, NULL,
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: ai_move, 0, NULL,
288: ai_move, 0, NULL,
289: ai_move, 0, NULL
290: };
291: mmove_t gladb_move_death = {FRAME_death1, FRAME_death22, gladb_frames_death, gladb_dead};
292:
293: void gladb_die (edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point)
294: {
295: int n;
296:
297: // check for gib
298: if (self->health <= self->gib_health)
299: {
300: gi.sound (self, CHAN_VOICE, gi.soundindex ("misc/udeath.wav"), 1, ATTN_NORM, 0);
301: for (n= 0; n < 2; n++)
302: ThrowGib (self, "models/objects/gibs/bone/tris.md2", damage, GIB_ORGANIC);
303: for (n= 0; n < 4; n++)
304: ThrowGib (self, "models/objects/gibs/sm_meat/tris.md2", damage, GIB_ORGANIC);
305: ThrowHead (self, "models/objects/gibs/head2/tris.md2", damage, GIB_ORGANIC);
306: self->deadflag = DEAD_DEAD;
307: return;
308: }
309:
310: if (self->deadflag == DEAD_DEAD)
311: return;
312:
313: // regular death
314: gi.sound (self, CHAN_VOICE, sound_die, 1, ATTN_NORM, 0);
315: self->deadflag = DEAD_DEAD;
316: self->takedamage = DAMAGE_YES;
317:
318: self->monsterinfo.currentmove = &gladb_move_death;
319: }
320:
321:
322: /*QUAKED monster_gladb (1 .5 0) (-32 -32 -24) (32 32 64) Ambush Trigger_Spawn Sight
323: */
324: void SP_monster_gladb (edict_t *self)
325: {
326: if (deathmatch->value)
327: {
328: G_FreeEdict (self);
329: return;
330: }
331:
332:
333: sound_pain1 = gi.soundindex ("gladiator/pain.wav");
334: sound_pain2 = gi.soundindex ("gladiator/gldpain2.wav");
335: sound_die = gi.soundindex ("gladiator/glddeth2.wav");
336: // note to self
337: // need to change to PHALANX sound
338: sound_gun = gi.soundindex ("weapons/plasshot.wav");
339:
340: sound_cleaver_swing = gi.soundindex ("gladiator/melee1.wav");
341: sound_cleaver_hit = gi.soundindex ("gladiator/melee2.wav");
342: sound_cleaver_miss = gi.soundindex ("gladiator/melee3.wav");
343: sound_idle = gi.soundindex ("gladiator/gldidle1.wav");
344: sound_search = gi.soundindex ("gladiator/gldsrch1.wav");
345: sound_sight = gi.soundindex ("gladiator/sight.wav");
346:
347: self->movetype = MOVETYPE_STEP;
348: self->solid = SOLID_BBOX;
349: self->s.modelindex = gi.modelindex ("models/monsters/gladb/tris.md2");
350: VectorSet (self->mins, -32, -32, -24);
351: VectorSet (self->maxs, 32, 32, 64);
352:
353: self->health = 800;
354: self->gib_health = -175;
355: self->mass = 350;
356:
357: self->pain = gladb_pain;
358: self->die = gladb_die;
359:
360: self->monsterinfo.stand = gladb_stand;
361: self->monsterinfo.walk = gladb_walk;
362: self->monsterinfo.run = gladb_run;
363: self->monsterinfo.dodge = NULL;
364: self->monsterinfo.attack = gladb_attack;
365: self->monsterinfo.melee = gladb_melee;
366: self->monsterinfo.sight = gladb_sight;
367: self->monsterinfo.idle = gladb_idle;
368: self->monsterinfo.search = gladb_search;
369:
370: gi.linkentity (self);
371: self->monsterinfo.currentmove = &gladb_move_stand;
372: self->monsterinfo.scale = MODEL_SCALE;
373:
374: self->monsterinfo.power_armor_type = POWER_ARMOR_SHIELD;
375: self->monsterinfo.power_armor_power = 400;
376:
377:
378: walkmonster_start (self);
379: }
380:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.