/*====================================================================== 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); };