mirror of
https://github.com/id-Software/quake-rerelease-qc.git
synced 2025-02-17 09:11:04 +00:00
362 lines
12 KiB
C++
362 lines
12 KiB
C++
/* Copyright (C) 1996-2022 id Software LLC
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 2 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program; if not, write to the Free Software
|
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
|
|
See file, 'COPYING', for details.
|
|
*/
|
|
|
|
// wrath.qc
|
|
|
|
$skin wrthskin
|
|
|
|
$frame wrthfrme
|
|
|
|
$frame wrthwk01 wrthwk02 wrthwk03 wrthwk04 wrthwk05 wrthwk06
|
|
$frame wrthwk07 wrthwk08 wrthwk09 wrthwk10 wrthwk11 wrthwk12
|
|
|
|
$frame wrthaa01 wrthaa02 wrthaa03 wrthaa04 wrthaa05 wrthaa06 wrthaa07
|
|
$frame wrthaa08 wrthaa09 wrthaa10 wrthaa11 wrthaa12 wrthaa13 wrthaa14
|
|
|
|
$frame wrthab01 wrthab02 wrthab03 wrthab04 wrthab05 wrthab06 wrthab07
|
|
$frame wrthab08 wrthab09 wrthab10 wrthab11 wrthab12 wrthab13
|
|
|
|
$frame wrthac01 wrthac02 wrthac03 wrthac04 wrthac05
|
|
$frame wrthac06 wrthac07 wrthac08 wrthac09 wrthac10
|
|
$frame wrthac11 wrthac12 wrthac13 wrthac14 wrthac15
|
|
|
|
$frame wrthpa01 wrthpa02 wrthpa03 wrthpa04 wrthpa05 wrthpa06
|
|
|
|
$frame wrthpb01 wrthpb02 wrthpb03 wrthpb04 wrthpb05 wrthpb06
|
|
$frame wrthpb07 wrthpb08 wrthpb09 wrthpb10 wrthpb11
|
|
|
|
$frame wrthdt01 wrthdt02 wrthdt03 wrthdt04 wrthdt05
|
|
$frame wrthdt06 wrthdt07 wrthdt08 wrthdt09 wrthdt10
|
|
$frame wrthdt11 wrthdt12 wrthdt13 wrthdt14 wrthdt15
|
|
|
|
void() WrathMissileTouch;
|
|
void() WrathHome;
|
|
void(float AttackNumber) WrathMissile;
|
|
|
|
void() wrath_stand1 =[ $wrthwk01, wrath_stand1 ] { ai_stand();};
|
|
|
|
void() wrath_walk01 =[ $wrthwk01, wrath_walk02 ] { ai_walk(8); };
|
|
void() wrath_walk02 =[ $wrthwk02, wrath_walk03 ] { ai_walk(8); };
|
|
void() wrath_walk03 =[ $wrthwk03, wrath_walk04 ] { ai_walk(8); };
|
|
void() wrath_walk04 =[ $wrthwk04, wrath_walk05 ] { ai_walk(8); };
|
|
void() wrath_walk05 =[ $wrthwk05, wrath_walk06 ] { ai_walk(8); };
|
|
void() wrath_walk06 =[ $wrthwk06, wrath_walk07 ] { ai_walk(8); };
|
|
void() wrath_walk07 =[ $wrthwk07, wrath_walk08 ] { ai_walk(8); };
|
|
void() wrath_walk08 =[ $wrthwk08, wrath_walk09 ] { ai_walk(8); };
|
|
void() wrath_walk09 =[ $wrthwk09, wrath_walk10 ] { ai_walk(8); };
|
|
void() wrath_walk10 =[ $wrthwk10, wrath_walk11 ] { ai_walk(8); };
|
|
void() wrath_walk11 =[ $wrthwk11, wrath_walk12 ] { ai_walk(8); };
|
|
void() wrath_walk12 =[ $wrthwk12, wrath_walk01 ] { ai_walk(8); };
|
|
|
|
void() wrath_run01 =[ $wrthwk01, wrath_run02 ] { ai_run(12); };
|
|
void() wrath_run02 =[ $wrthwk02, wrath_run03 ] { ai_run(12); };
|
|
void() wrath_run03 =[ $wrthwk03, wrath_run04 ] { ai_run(12); };
|
|
void() wrath_run04 =[ $wrthwk04, wrath_run05 ] { ai_run(12); };
|
|
void() wrath_run05 =[ $wrthwk05, wrath_run06 ] { ai_run(12); };
|
|
void() wrath_run06 =[ $wrthwk06, wrath_run07 ] { ai_run(12); };
|
|
void() wrath_run07 =[ $wrthwk07, wrath_run08 ] { ai_run(12); };
|
|
void() wrath_run08 =[ $wrthwk08, wrath_run09 ] { ai_run(12); };
|
|
void() wrath_run09 =[ $wrthwk09, wrath_run10 ] { ai_run(12); };
|
|
void() wrath_run10 =[ $wrthwk10, wrath_run11 ] { ai_run(12); };
|
|
void() wrath_run11 =[ $wrthwk11, wrath_run12 ] { ai_run(12); };
|
|
void() wrath_run12 =[ $wrthwk12, wrath_run01 ] { ai_run(12); };
|
|
|
|
void() wrath_at_a01 =[ $wrthaa01, wrath_at_a02 ] {ai_charge(12);};
|
|
void() wrath_at_a02 =[ $wrthaa02, wrath_at_a03 ] {ai_charge(12);};
|
|
void() wrath_at_a03 =[ $wrthaa03, wrath_at_a04 ] {ai_charge(12);};
|
|
void() wrath_at_a04 =[ $wrthaa04, wrath_at_a05 ] {ai_charge(12);};
|
|
void() wrath_at_a05 =[ $wrthaa05, wrath_at_a06 ] {ai_charge(12);};
|
|
void() wrath_at_a06 =[ $wrthaa06, wrath_at_a07 ] {ai_charge(12);};
|
|
void() wrath_at_a07 =[ $wrthaa07, wrath_at_a08 ] {ai_charge(12);};
|
|
void() wrath_at_a08 =[ $wrthaa08, wrath_at_a09 ] {ai_charge(12);};
|
|
void() wrath_at_a09 =[ $wrthaa09, wrath_at_a10 ] {ai_charge(12);};
|
|
void() wrath_at_a10 =[ $wrthaa10, wrath_at_a11 ] {ai_charge(12);};
|
|
void() wrath_at_a11 =[ $wrthaa11, wrath_at_a12 ] {WrathMissile(1);};
|
|
void() wrath_at_a12 =[ $wrthaa12, wrath_at_a13 ] {ai_charge(12);};
|
|
void() wrath_at_a13 =[ $wrthaa13, wrath_at_a14 ] {ai_charge(12);};
|
|
void() wrath_at_a14 =[ $wrthaa14, wrath_run01 ] {ai_charge(12);};
|
|
|
|
void() wrath_at_b01 =[ $wrthab01, wrath_at_b02 ] {ai_charge(12);};
|
|
void() wrath_at_b02 =[ $wrthab02, wrath_at_b03 ] {ai_charge(12);};
|
|
void() wrath_at_b03 =[ $wrthab03, wrath_at_b04 ] {ai_charge(12);};
|
|
void() wrath_at_b04 =[ $wrthab04, wrath_at_b05 ] {ai_charge(12);};
|
|
void() wrath_at_b05 =[ $wrthab05, wrath_at_b06 ] {ai_charge(12);};
|
|
void() wrath_at_b06 =[ $wrthab06, wrath_at_b07 ] {WrathMissile(2);};
|
|
void() wrath_at_b07 =[ $wrthab07, wrath_at_b08 ] {ai_charge(12);};
|
|
void() wrath_at_b08 =[ $wrthab08, wrath_at_b09 ] {ai_charge(12);};
|
|
void() wrath_at_b09 =[ $wrthab09, wrath_at_b10 ] {ai_charge(12);};
|
|
void() wrath_at_b10 =[ $wrthab10, wrath_at_b11 ] {ai_charge(12);};
|
|
void() wrath_at_b11 =[ $wrthab11, wrath_at_b12 ] {ai_charge(12);};
|
|
void() wrath_at_b12 =[ $wrthab12, wrath_at_b13 ] {ai_charge(12);};
|
|
void() wrath_at_b13 =[ $wrthab13, wrath_run01 ] {ai_charge(12);};
|
|
|
|
void() wrath_at_c01 =[ $wrthac01, wrath_at_c02 ] {ai_charge(12);};
|
|
void() wrath_at_c02 =[ $wrthac02, wrath_at_c03 ] {ai_charge(12);};
|
|
void() wrath_at_c03 =[ $wrthac03, wrath_at_c04 ] {ai_charge(12);};
|
|
void() wrath_at_c04 =[ $wrthac04, wrath_at_c05 ] {ai_charge(12);};
|
|
void() wrath_at_c05 =[ $wrthac05, wrath_at_c06 ] {ai_charge(12);};
|
|
void() wrath_at_c06 =[ $wrthac06, wrath_at_c07 ] {ai_charge(12);};
|
|
void() wrath_at_c07 =[ $wrthac07, wrath_at_c08 ] {WrathMissile(3);};
|
|
void() wrath_at_c08 =[ $wrthac08, wrath_at_c09 ] {ai_charge(12);};
|
|
void() wrath_at_c09 =[ $wrthac09, wrath_at_c10 ] {ai_charge(12);};
|
|
void() wrath_at_c10 =[ $wrthac10, wrath_at_c11 ] {ai_charge(12);};
|
|
void() wrath_at_c11 =[ $wrthac11, wrath_at_c12 ] {ai_charge(12);};
|
|
void() wrath_at_c12 =[ $wrthac12, wrath_at_c13 ] {ai_charge(12);};
|
|
void() wrath_at_c13 =[ $wrthac13, wrath_at_c14 ] {ai_charge(12);};
|
|
void() wrath_at_c14 =[ $wrthac14, wrath_at_c15 ] {ai_charge(12);};
|
|
void() wrath_at_c15 =[ $wrthac15, wrath_run01 ] {ai_charge(12);};
|
|
|
|
void() wrath_attack =
|
|
{
|
|
local float r;
|
|
|
|
r = random();
|
|
|
|
if (r < 0.25)
|
|
{
|
|
wrath_at_a01 ();
|
|
}
|
|
else if (r < 0.65)
|
|
{
|
|
wrath_at_b01 ();
|
|
}
|
|
else
|
|
{
|
|
wrath_at_c01 ();
|
|
}
|
|
sound (self, CHAN_VOICE, "wrath/watt.wav", 1, ATTN_NORM);
|
|
};
|
|
|
|
void() wrath_pn_a01 =[ $wrthpa01, wrath_pn_a02 ] {};
|
|
void() wrath_pn_a02 =[ $wrthpa02, wrath_pn_a03 ] {};
|
|
void() wrath_pn_a03 =[ $wrthpa03, wrath_pn_a04 ] {};
|
|
void() wrath_pn_a04 =[ $wrthpa04, wrath_pn_a05 ] {};
|
|
void() wrath_pn_a05 =[ $wrthpa05, wrath_pn_a06 ] {};
|
|
void() wrath_pn_a06 =[ $wrthpa06, wrath_run01 ] {};
|
|
|
|
void() wrath_pn_b01 =[ $wrthpb01, wrath_pn_b02 ] {};
|
|
void() wrath_pn_b02 =[ $wrthpb02, wrath_pn_b03 ] {};
|
|
void() wrath_pn_b03 =[ $wrthpb03, wrath_pn_b04 ] {};
|
|
void() wrath_pn_b04 =[ $wrthpb04, wrath_pn_b05 ] {};
|
|
void() wrath_pn_b05 =[ $wrthpb05, wrath_pn_b06 ] {};
|
|
void() wrath_pn_b06 =[ $wrthpb06, wrath_pn_b07 ] {};
|
|
void() wrath_pn_b07 =[ $wrthpb07, wrath_pn_b08 ] {};
|
|
void() wrath_pn_b08 =[ $wrthpb08, wrath_pn_b09 ] {};
|
|
void() wrath_pn_b09 =[ $wrthpb09, wrath_pn_b10 ] {};
|
|
void() wrath_pn_b10 =[ $wrthpb10, wrath_pn_b11 ] {};
|
|
void() wrath_pn_b11 =[ $wrthpb11, wrath_run01 ] {};
|
|
|
|
|
|
void() wrath_pain =
|
|
{
|
|
local float r;
|
|
|
|
if (self.pain_finished > time)
|
|
return;
|
|
|
|
r = random();
|
|
|
|
if (r > 0.1)
|
|
{
|
|
self.pain_finished = time + 0.5;
|
|
return;
|
|
}
|
|
|
|
if (r < 0.07)
|
|
wrath_pn_a01 ();
|
|
else
|
|
wrath_pn_b01 ();
|
|
|
|
self.pain_finished = time + 3;
|
|
sound (self, CHAN_VOICE, "wrath/wpain.wav", 1, ATTN_NORM);
|
|
};
|
|
|
|
void() wrath_die02 =[ $wrthdt02, wrath_die03 ]
|
|
{ sound (self, CHAN_VOICE, "wrath/wdthc.wav", 1, ATTN_NORM); };
|
|
void() wrath_die03 =[ $wrthdt03, wrath_die04 ] {};
|
|
void() wrath_die04 =[ $wrthdt04, wrath_die05 ] {};
|
|
void() wrath_die05 =[ $wrthdt05, wrath_die07 ] {};
|
|
void() wrath_die07 =[ $wrthdt07, wrath_die09 ] {};
|
|
void() wrath_die09 =[ $wrthdt09, wrath_die11 ] {};
|
|
void() wrath_die11 =[ $wrthdt11, wrath_die13 ] {};
|
|
void() wrath_die13 =[ $wrthdt13, wrath_die15 ] {};
|
|
void() wrath_die15 =[ $wrthdt15, wrath_die15 ]
|
|
{
|
|
ThrowGib ("progs/wrthgib1.mdl", self.health);
|
|
ThrowGib ("progs/wrthgib2.mdl", self.health);
|
|
ThrowGib ("progs/wrthgib3.mdl", self.health);
|
|
T_RadiusDamage (self, self, 80, world);
|
|
|
|
self.origin = self.origin + '0 0 24';
|
|
|
|
WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
|
|
WriteByte (MSG_BROADCAST, TE_EXPLOSION2);
|
|
WriteCoord (MSG_BROADCAST, self.origin_x);
|
|
WriteCoord (MSG_BROADCAST, self.origin_y);
|
|
WriteCoord (MSG_BROADCAST, self.origin_z);
|
|
WriteByte (MSG_BROADCAST, 0);
|
|
WriteByte (MSG_BROADCAST, 4);
|
|
|
|
remove (self);
|
|
};
|
|
|
|
/*QUAKED monster_wrath (1 0 0) (-16 -16 -24) (16 16 32) Ambush
|
|
*/
|
|
void() monster_wrath =
|
|
{
|
|
if (deathmatch)
|
|
{
|
|
remove(self);
|
|
return;
|
|
}
|
|
precache_model ("progs/wrath.mdl");
|
|
precache_model ("progs/w_ball.mdl");
|
|
precache_model ("progs/wrthgib1.mdl");
|
|
precache_model ("progs/wrthgib2.mdl");
|
|
precache_model ("progs/wrthgib3.mdl");
|
|
|
|
precache_sound ("wrath/wsee.wav");
|
|
precache_sound ("wrath/watt.wav");
|
|
precache_sound ("wrath/wpain.wav");
|
|
precache_sound ("wrath/wdthc.wav");
|
|
|
|
self.solid = SOLID_SLIDEBOX;
|
|
self.movetype = MOVETYPE_STEP;
|
|
|
|
setmodel (self, "progs/wrath.mdl");
|
|
|
|
setsize (self, VEC_HULL_MIN, VEC_HULL_MAX);
|
|
|
|
self.health = 400;
|
|
self.yaw_speed = 35;
|
|
|
|
self.th_stand = wrath_stand1;
|
|
self.th_walk = wrath_walk01;
|
|
self.th_run = wrath_run01;
|
|
self.th_missile = wrath_attack;
|
|
self.th_pain = wrath_pain;
|
|
self.th_die = wrath_die02;
|
|
|
|
flymonster_start ();
|
|
};
|
|
|
|
/*
|
|
================
|
|
WrathMissile
|
|
================
|
|
*/
|
|
void(float AttackNumber) WrathMissile =
|
|
{
|
|
local entity missile;
|
|
local vector dir, org;
|
|
local float dist, flytime;
|
|
|
|
dir = normalize((self.enemy.origin + '0 0 10') - self.origin);
|
|
dist = vlen (self.enemy.origin - self.origin);
|
|
flytime = dist * 0.002;
|
|
if (flytime < 0.1)
|
|
flytime = 0.1;
|
|
|
|
self.effects = self.effects | EF_MUZZLEFLASH;
|
|
|
|
makevectors (self.angles);
|
|
|
|
missile = spawn ();
|
|
missile.owner = self;
|
|
missile.solid = SOLID_BBOX;
|
|
missile.movetype = MOVETYPE_FLYMISSILE;
|
|
setmodel (missile, "progs/w_ball.mdl");
|
|
|
|
setsize (missile, '0 0 0', '0 0 0');
|
|
|
|
if ( AttackNumber == 1)
|
|
{
|
|
org = self.origin + v_forward*20 + v_up*12; // 20 // 44;
|
|
}
|
|
else if ( AttackNumber == 2)
|
|
{
|
|
org = self.origin + v_forward*18 + v_up*10; // 18 // 42;
|
|
}
|
|
else if ( AttackNumber == 3)
|
|
{
|
|
org = self.origin + v_forward*12 + v_up*12 + v_right*20;
|
|
// up20
|
|
}
|
|
else if ( AttackNumber == 4)
|
|
{
|
|
org = self.origin + v_forward*20 + v_up*16;
|
|
}
|
|
|
|
setorigin ( missile, org );
|
|
missile.velocity = dir * 400;
|
|
missile.avelocity = '300 300 300';
|
|
missile.enemy = self.enemy;
|
|
missile.touch = WrathMissileTouch;
|
|
missile.nextthink = time + 0.1;
|
|
missile.think = WrathHome;
|
|
|
|
self.attack_finished = time + 2;
|
|
};
|
|
|
|
void() WrathHome =
|
|
{
|
|
if (self.enemy.health < 1)
|
|
{
|
|
remove(self);
|
|
return;
|
|
}
|
|
|
|
if (skill == 3)
|
|
ai_track (self.enemy, 550);
|
|
else
|
|
ai_track (self.enemy, 400);
|
|
|
|
self.nextthink = time + 0.1;
|
|
self.think = WrathHome;
|
|
};
|
|
|
|
void() WrathMissileTouch =
|
|
{
|
|
if (other == self.owner ||
|
|
other.classname == "monster_wrath" ||
|
|
other.classname == "monster_super_wrath")
|
|
{
|
|
remove(self);
|
|
return; // don't explode on any wraths
|
|
|
|
}
|
|
|
|
if (other.classname == "monster_zombie")
|
|
T_Damage (other, self, self, 110);
|
|
|
|
T_RadiusDamage (self, self.owner, 20, world);
|
|
sound (self, CHAN_WEAPON, "weapons/r_exp3.wav", 1, ATTN_NORM);
|
|
|
|
WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
|
|
WriteByte (MSG_BROADCAST, TE_EXPLOSION);
|
|
WriteCoord (MSG_BROADCAST, self.origin_x);
|
|
WriteCoord (MSG_BROADCAST, self.origin_y);
|
|
WriteCoord (MSG_BROADCAST, self.origin_z);
|
|
|
|
self.velocity = '0 0 0';
|
|
self.touch = SUB_Null;
|
|
setmodel (self, "progs/s_explod.spr");
|
|
self.solid = SOLID_NOT;
|
|
s_explode1 ();
|
|
};
|