game-source/klik/weapons/w_nailgun.qc
Bill Currie 88c055ea3c <zinx> taniwha: FWIW, the code is officially donated to quakeforge :)
<taniwha> zinx: thanks :)

zinx' klik mod :)
2003-10-24 21:43:32 +00:00

187 lines
4.5 KiB
C++

#include "common.qh"
#include "weapon.qh"
#include "equip.qh"
#include "damage.qh"
#include "misc.qh"
#define STR_EQUIPID_NAILGUN "Nailgun"
void() _deathmsg_nailgun = {
local string def_nname, att_nname;
local float r;
def_nname = name(self);
att_nname = name(self.dmg_attacker);
if (self.dmg_attacker == self) {
bprint(PRINT_DEATH, def_nname, " enjoys the pain.\n");
} else {
r = random()*2;
if (r < 1) bprint(PRINT_DEATH, def_nname, " was nailed by ", att_nname, ".\n");
else bprint(PRINT_DEATH, att_nname, " nailed ", def_nname, ".\n");
}
};
void() _spike_touch =
{
if (pointcontents(self.origin) == CONTENT_SKY) {
remove(self);
return;
}
if (!damage(other, self.goalentity, self, self.dmg, _deathmsg_nailgun))
effect_nail_spark(self.origin, self.velocity);
safe_remove(self);
};
void(float ox, float damg, string mod) _nailgun_fire_spike =
{
local vector dir;
local entity missile;
makevectors (self.v_angle);
dir = aim(self, 1000);
missile = spawn_missile("NAIL", mod, shootorigin(self) + v_right*ox, dir, 1000);
missile.dmg = damg;
missile.mass = missile.dmg * 8;
missile.touch = _spike_touch;
damage_attack(missile);
effect_muzzleflash();
effect_smallkick(self);
};
//============================================================================
void() _w_nailgun_think = {
self.weaponframe++;
if (self.weaponframe == 9)
self.weaponframe = 1;
/* FIXME: Use short circuit logic here when compiler supports */
if (!self.button0 || self.weaponframe < 1 || self.weaponframe > 8) {
self.weaponframe = 0;
self.w_think = NOTHING_function;
self.mdl_func(MDL_FUNC_IDLE, 0);
return;
}
if (!util_weapon_use_ammo(ammo_nails, 1)) {
self.weaponframe = 0;
self.w_think = NOTHING_function;
self.mdl_func(MDL_FUNC_IDLE, 0);
return;
}
sound(self, CHAN_WEAPON, "weapons/rocket1i.wav", 1, ATTN_NORM);
if (self.weaponframe & 1) _nailgun_fire_spike(4, 9, "progs/spike.mdl");
else _nailgun_fire_spike(-4, 9, "progs/spike.mdl");
self.attack_finished = time + 0.2;
};
/* WEAPON 4 nailgun */
float(float action)
w_nailgun = {
if (action == WEAPON_AMMO) {
self.items |= IT_NAILS;
return self.ammo_nails;
} else if (action == WEAPON_WEIGHT) {
return 30;
} else if (action == WEAPON_SELECTABLE) {
if (!equip_query(self, EQUIPID_NAILGUN))
return 0;
if (self.ammo_nails >= 1)
return 1;
return -1;
} else if (action == WEAPON_SELECT) {
self.weaponmodel = "progs/v_nail.mdl";
self.weaponframe = 0;
self.mdl_mod = (self.mdl_mod & ~MDL_MOD_WEP_MASK) | MDL_MOD_WEP_NAILGUN;
weaponprint(STR_EQUIPID_NAILGUN);
} else if (action == WEAPON_FIRE) {
self.mdl_func(MDL_FUNC_FIRE, 0);
self.w_think = _w_nailgun_think;
self.w_think();
self.w_thought = TRUE;
} else if (action == WEAPON_INIT) {
precache_model("progs/v_nail.mdl");
precache_model("progs/spike.mdl");
precache_sound("weapons/rocket1i.wav");
}
return 0;
};
//============================================================================
#define STR_EQUIPID_SUPER_NAILGUN "Super Nailgun"
void() _w_super_nailgun_think = {
self.weaponframe++;
if (self.weaponframe == 9)
self.weaponframe = 1;
/* FIXME: Use short circuit logic here when compiler supports */
if (!self.button0 || self.weaponframe < 1 || self.weaponframe > 8) {
self.weaponframe = 0;
self.w_think = NOTHING_function;
self.mdl_func(MDL_FUNC_IDLE, 0);
return;
}
if (!util_weapon_use_ammo(ammo_nails, 2)) {
self.weaponframe = 0;
self.w_think = NOTHING_function;
self.mdl_func(MDL_FUNC_IDLE, 0);
return;
}
sound(self, CHAN_WEAPON, "weapons/spike2.wav", 1, ATTN_NORM);
_nailgun_fire_spike(0, 18, "progs/s_spike.mdl");
self.attack_finished = time + 0.2;
};
/* WEAPON 5 super_nailgun */
float(float action)
w_super_nailgun = {
if (action == WEAPON_AMMO) {
self.items |= IT_NAILS;
return self.ammo_nails;
} else if (action == WEAPON_WEIGHT) {
return 45;
} else if (action == WEAPON_SELECTABLE) {
if (!equip_query(self, EQUIPID_SUPER_NAILGUN))
return 0;
if (self.ammo_nails >= 2)
return 1;
return -1;
} else if (action == WEAPON_SELECT) {
self.weaponmodel = "progs/v_nail2.mdl";
self.weaponframe = 0;
self.mdl_mod = (self.mdl_mod & ~MDL_MOD_WEP_MASK) + MDL_MOD_WEP_SUPER_NAILGUN;
weaponprint(STR_EQUIPID_SUPER_NAILGUN);
} else if (action == WEAPON_FIRE) {
self.mdl_func(MDL_FUNC_FIRE, 0);
self.w_think = _w_super_nailgun_think;
self.w_think();
self.w_thought = TRUE;
} else if (action == WEAPON_INIT) {
precache_model("progs/v_nail2.mdl");
precache_model("progs/s_spike.mdl");
precache_sound("weapons/spike2.wav");
}
return 0;
};