Files
quakemapping/mod_xj19/my_progs/client_power.qc
2020-01-01 23:35:17 +01:00

299 lines
10 KiB
Plaintext

/*======================================================================
CheckPowerups
- Check for turning off powerups
======================================================================*/
void(entity targ) ResetPowerInvRing =
{
targ.items = targ.items - (self.items & IT_INVISIBILITY);
targ.invisible_finished = targ.invisible_time = 0;
targ.modelindex = modelindex_player;
targ.frame = 0;
};
//----------------------------------------------------------------------
void(entity targ) ResetPowerEnvSuit =
{
targ.items = targ.items - (targ.items & IT_SUIT);
targ.radsuit_finished = targ.rad_time = 0;
};
//----------------------------------------------------------------------
void(entity targ) ResetPowerPent =
{
targ.items = targ.items - (targ.items & IT_INVULNERABILITY);
targ.invincible_finished = targ.invincible_time = 0;
};
//----------------------------------------------------------------------
void(entity targ) ResetPowerQuad = {
targ.super_damage_finished = targ.super_time = 0;};
void(entity targ) ResetPowerQuadItem = {
targ.items = targ.items - (targ.items & IT_QUAD);};
//----------------------------------------------------------------------
void(entity targ) ResetPowerSharp =
{
targ.moditems = targ.moditems - (targ.moditems & IT_ARTSHARP);
targ.sharpshoot_finished = targ.sharpshoot_time = 0;
};
//----------------------------------------------------------------------
void(entity targ) ResetPowerPiercer =
{
targ.moditems = targ.moditems - (targ.moditems & IT_ARTPIERCE);
targ.nailpiercer_finished = targ.nailpiercer_time = 0;
};
//----------------------------------------------------------------------
void(entity targ) ResetPowerWetSuit =
{
targ.moditems = targ.moditems - (targ.moditems & IT_ARTWETSUIT);
targ.wetsuit_finished = targ.wetsuit_time = 0;
};
//----------------------------------------------------------------------
void(entity targ) ResetPowerSystem =
{
ResetPowerInvRing(targ);
ResetPowerEnvSuit(targ);
ResetPowerPent(targ);
ResetPowerQuad(targ);
ResetPowerQuadItem(targ);
ResetPowerSharp(targ);
ResetPowerPiercer(targ);
ResetPowerWetSuit(targ);
};
//============================================================================
void() ClientPowerups =
{
if (intermission_running > 0) return;
if (self.health < 1) return;
//----------------------------------------------------------------------
// Invisibility (Gold Ring)
// - Flash screen 3s before running out
//----------------------------------------------------------------------
if (self.invisible_finished > 0) {
// sound and screen flash when items starts to run out
if (self.invisible_sound < time) {
sound (self, CHAN_AUTO, SOUND_ARTINV3, 0.5, ATTN_IDLE);
self.invisible_sound = time + ((random() * 3) + 1);
}
if (self.invisible_finished < time + 3) {
if (self.invisible_time == 1) {
sprint (self, "Ring of Shadows magic is fading\n");
stuffcmd (self, "bf\n");
sound (self, CHAN_AUTO, SOUND_ARTINV2, 1, ATTN_NORM);
self.invisible_time = time + 1;
}
if (self.invisible_time < time) {
self.invisible_time = time + 1;
stuffcmd (self, "bf\n");
}
}
// Update inventory and timers
if (self.invisible_finished < time) ResetPowerInvRing(self);
else {
// keep using the eyes
self.modelindex = modelindex_eyes;
self.frame = 0;
}
}
//----------------------------------------------------------------------
// Env Suit
// - Flash screen 3s before running out
// - Give player 12s of air after suit finishes
//----------------------------------------------------------------------
if (self.radsuit_finished > 0) {
self.air_finished = time + WATER_AIR; // don't drown
// sound and screen flash when items starts to run out
if (self.radsuit_finished < time + 3) {
if (self.rad_time == 1) {
sprint (self, "Air supply in Biosuit expiring\n");
stuffcmd (self, "bf\n");
sound (self, CHAN_AUTO, SOUND_ARTSUIT2, 1, ATTN_NORM);
self.rad_time = time + 1;
}
if (self.rad_time < time) {
self.rad_time = time + 1;
stuffcmd (self, "bf\n");
}
}
// Update inventory and timers
if (self.radsuit_finished < time) ResetPowerEnvSuit(self);
}
//----------------------------------------------------------------------
// Wet Suit
// - Flash screen 3s before running out
// - Give player 12s of air after suit finishes
//----------------------------------------------------------------------
if (self.wetsuit_finished > 0) {
self.air_finished = time + 12; // don't drown
// Produce particle bubbles
if (self.waterlevel == 3) {
if (self.wetsuit_bubbles < time) {
self.wetsuit_bubbles = time + 0.5 + random();
particle_debuff(self.origin, 16, rint(10+random()*40), PARTICLE_BURST_BLUE);
}
}
// Check to see if the water level has changed
if (self.wetsuit_level != self.waterlevel) {
// Is the player coming out of the water?
if (self.wetsuit_level > 2 && self.waterlevel < 3)
self.wetsuit_sound = 0;
// Is the player going into the water? (above head)
else if (self.wetsuit_level < 3 && self.waterlevel > 2)
self.wetsuit_sound = 0;
self.wetsuit_level = self.waterlevel;
}
// Play active sound based on water level
if (self.wetsuit_sound < time) {
if (self.waterlevel == 3) {
// Under water sound with bubbbles
self.volume = 0.5 + random() * 0.5;
sound (self, CHAN_ITEM, SOUND_ARTWETS3, self.volume, ATTN_IDLE);
self.wetsuit_sound = time + 4;
}
else {
// Different sound when not in the water (faster)
self.volume = 0.4 + random() * 0.4;
sound (self, CHAN_ITEM, SOUND_ARTWETS3B, self.volume, ATTN_IDLE);
self.wetsuit_sound = time + 3 + random();
}
}
// sound and screen flash when items starts to run out
if (self.wetsuit_finished < time + 3) {
self.wetsuit_sound = time + 4; // Stop breathing sound
if (self.wetsuit_time == 1) {
sprint (self, "Air supply in Wet suit expiring\n");
stuffcmd (self, "bf\n");
sound (self, CHAN_AUTO, SOUND_ARTWETS2, 1, ATTN_NORM);
self.wetsuit_time = time + 1;
}
if (self.wetsuit_time < time) {
self.wetsuit_time = time + 1;
stuffcmd (self, "bf\n");
}
}
// Update inventory and timers
if (self.wetsuit_finished < time) ResetPowerWetSuit(self);
}
//----------------------------------------------------------------------
// Invincibility (Pentagram)
// - Flash screen 3s before running out
//----------------------------------------------------------------------
if (self.invincible_finished > 0) {
// sound and screen flash when items starts to run out
if (self.invincible_finished < time + 3) {
if (self.invincible_time == 1) {
sprint (self, "Protection is almost burned out\n");
stuffcmd (self, "bf\n");
sound (self, CHAN_AUTO, SOUND_ARTPENT2, 1, ATTN_NORM);
self.invincible_time = time + 1;
}
if (self.invincible_time < time) {
self.invincible_time = time + 1;
stuffcmd (self, "bf\n");
}
}
// Update inventory and timers
if (self.invincible_finished < time) ResetPowerPent(self);
}
//----------------------------------------------------------------------
// Super Damage (Quad)
// - Flash screen 3s before running out
//----------------------------------------------------------------------
if (self.super_damage_finished > 0) {
// sound and screen flash when items starts to run out
if (self.super_damage_finished < time + 3) {
if (self.super_time == 1) {
sprint (self, "Quad Damage is wearing off\n");
stuffcmd (self, "bf\n");
sound (self, CHAN_AUTO, SOUND_ARTQUAD2, 1, ATTN_NORM);
self.super_time = time + 1;
}
if (self.super_time < time) {
self.super_time = time + 1;
stuffcmd (self, "bf\n");
}
}
// Update inventory and timers
if (self.super_damage_finished < time) ResetPowerQuad(self);
}
//----------------------------------------------------------------------
// SharpShooter
// - Flash screen 3s before running out
//----------------------------------------------------------------------
if (self.sharpshoot_finished > 0) {
// sound and screen flash when items starts to run out
if (self.sharpshoot_finished < time + 3) {
if (self.sharpshoot_time == 1) {
sprint (self, "Sharpshooter has almost gone\n");
stuffcmd (self, "bf\n");
sound (self, CHAN_AUTO, SOUND_ARTSHARP2, 1, ATTN_NORM);
self.sharpshoot_time = time + 1;
}
if (self.sharpshoot_time < time) {
self.sharpshoot_time = time + 1;
stuffcmd (self, "bf\n");
}
}
// Update inventory and timers
if (self.sharpshoot_finished < time) ResetPowerSharp(self);
}
//----------------------------------------------------------------------
// Nail Piercer
// - Flash screen 3s before running out
//----------------------------------------------------------------------
if (self.nailpiercer_finished > 0) {
// sound and screen flash when items starts to run out
if (self.nailpiercer_finished < time + 3) {
if (self.nailpiercer_time == 1) {
sprint (self, "Nail Piercer is wearing off\n");
stuffcmd (self, "bf\n");
sound (self, CHAN_AUTO, SOUND_ARTNAILP2, 1, ATTN_NORM);
self.nailpiercer_time = time + 1;
}
if (self.nailpiercer_time < time) {
self.nailpiercer_time = time + 1;
stuffcmd (self, "bf\n");
}
}
// Update inventory and timers
if (self.nailpiercer_finished < time) ResetPowerPiercer(self);
}
//------------------------------------------------------------------
// Only remove the quad effect (status bar update)
// if all extra mod artifacts have expired as well
//------------------------------------------------------------------
if (self.super_damage_finished == 0 && self.sharpshoot_finished == 0
&& self.nailpiercer_finished == 0)
ResetPowerQuadItem(self);
//------------------------------------------------------------------
// This check for setting the client effect needs to be separate
// because its setup by several different artifacts!
//------------------------------------------------------------------
if (self.super_damage_finished > 0 || self.invincible_finished > 0 ||
self.sharpshoot_finished > 0 || self.nailpiercer_finished > 0) {
self.effects = self.effects | EF_DIMLIGHT;
}
else self.effects = self.effects - (self.effects & EF_DIMLIGHT);
};