mirror of
https://git.code.sf.net/p/quake/game-source
synced 2024-11-28 22:52:26 +00:00
126 lines
2.6 KiB
C++
126 lines
2.6 KiB
C++
#include "common.qh"
|
|
#include "misc.qh"
|
|
|
|
#include "weapon.qh"
|
|
#include "damage.qh"
|
|
|
|
#include "effect.qh"
|
|
|
|
void ()
|
|
_w_axe_deathmsg =
|
|
{
|
|
local float r;
|
|
local string att_nname, def_nname;
|
|
|
|
r = random ();
|
|
|
|
def_nname = name (self);
|
|
att_nname = name (self.dmg_attacker);
|
|
|
|
if (r < 0.25)
|
|
bprint (PRINT_DEATH, def_nname, " gets chopped down to size by ",
|
|
att_nname, ".\n");
|
|
else if (r < 0.5)
|
|
bprint (PRINT_DEATH, att_nname, " mames ", def_nname,
|
|
" with a rusty axe.\n");
|
|
else if (r < 0.75)
|
|
bprint (PRINT_DEATH, def_nname, " loses his scalp to ", att_nname,
|
|
".\n");
|
|
else
|
|
bprint (PRINT_DEATH, att_nname, "'s axe penetrates ", def_nname,
|
|
" straight to the bone.\n");
|
|
};
|
|
|
|
void ()
|
|
_w_axe_fire =
|
|
{
|
|
local vector source;
|
|
|
|
source = shootorigin (self);
|
|
|
|
makevectors (self.v_angle);
|
|
traceline (source, source + v_forward * 64, FALSE, self);
|
|
if (trace_fraction == 1.0)
|
|
return;
|
|
|
|
ghost_inflictor.classname = "AXE";
|
|
ghost_inflictor.dmg = 20;
|
|
ghost_inflictor.mass = ghost_inflictor.mass * 8;
|
|
ghost_inflictor.velocity = v_forward * 1000;
|
|
|
|
damage_attack (ghost_inflictor);
|
|
|
|
if (!damage (trace_ent, self, ghost_inflictor, ghost_inflictor.dmg,
|
|
_w_axe_deathmsg)) {
|
|
/* We hit the world. */
|
|
sound (self, CHAN_WEAPON, "player/axhit2.wav", 1, ATTN_NORM);
|
|
effect_gun_spark (trace_endpos, v_forward * 250, 3);
|
|
}
|
|
};
|
|
|
|
void ()
|
|
_w_axe_think_1 =
|
|
{
|
|
self.weaponframe++;
|
|
if (self.weaponframe == 3)
|
|
_w_axe_fire();
|
|
if (self.weaponframe <= 1 || self.weaponframe > 4) {
|
|
self.weaponframe = 0;
|
|
self.w_think = NOTHING_function;
|
|
}
|
|
};
|
|
|
|
void ()
|
|
_w_axe_think_2 =
|
|
{
|
|
self.weaponframe++;
|
|
if (self.weaponframe == 7)
|
|
_w_axe_fire();
|
|
if (self.weaponframe <= 5 || self.weaponframe > 8) {
|
|
self.weaponframe = 0;
|
|
self.w_think = NOTHING_function;
|
|
}
|
|
};
|
|
|
|
/* WEAPON 1 axe */
|
|
float (float action)
|
|
w_axe =
|
|
{
|
|
switch (action) {
|
|
case WEAPON_AMMO:
|
|
return 0;
|
|
case WEAPON_WEIGHT:
|
|
return 1;
|
|
case WEAPON_SELECTABLE:
|
|
return TRUE;
|
|
case WEAPON_FIRE:
|
|
self.attack_finished = time + 0.5;
|
|
sound (self, CHAN_WEAPON, "weapons/ax1.wav", 1, ATTN_NORM);
|
|
|
|
if (random() < 0.5) {
|
|
self.weaponframe = 1;
|
|
self.w_think = _w_axe_think_1;
|
|
} else {
|
|
self.weaponframe = 5;
|
|
self.w_think = _w_axe_think_2;
|
|
}
|
|
self.w_thought = TRUE;
|
|
|
|
self.mdl_func (MDL_FUNC_FIRE, 0);
|
|
break;
|
|
case WEAPON_SELECT:
|
|
self.weaponmodel = "progs/v_axe.mdl";
|
|
self.weaponframe = 0;
|
|
self.mdl_mod = (self.mdl_mod & ~MDL_MOD_WEP_MASK) | MDL_MOD_WEP_AXE;
|
|
weaponprint ("Axe");
|
|
break;
|
|
case WEAPON_INIT:
|
|
precache_model ("progs/v_axe.mdl");
|
|
precache_sound ("player/axhit1.wav");
|
|
precache_sound ("player/axhit2.wav");
|
|
precache_sound ("weapons/ax1.wav");
|
|
break;
|
|
}
|
|
|
|
return 0;
|
|
};
|