class PowerupGiver : Inventory native { native Class PowerupType; native int EffectTics; // Non-0 to override the powerup's default tics native color BlendColor; // Non-0 to override the powerup's default blend native Name Mode; // Meaning depends on powerup - used for Invulnerability and Invisibility native double Strength; // Meaning depends on powerup - currently used only by Invisibility Default { Inventory.DefMaxAmount; +INVENTORY.INVBAR +INVENTORY.FANCYPICKUPSOUND Inventory.PickupSound "misc/p_pkup"; } } class Powerup : Inventory native { native int EffectTics; native color BlendColor; native Name Mode; // Meaning depends on powerup - used for Invulnerability and Invisibility native double Strength; // Meaning depends on powerup - currently used only by Invisibility // Note, that while this is an inventory flag, it only has meaning on an active powerup. override bool GetNoTeleportFreeze() { return bNoTeleportFreeze; } native virtual void InitEffect(); native virtual void EndEffect(); } class PowerInvulnerable : Powerup native { Default { Powerup.Duration -30; inventory.icon "SPSHLD0"; } } class PowerStrength : Powerup native { Default { Powerup.Duration 1; Powerup.Color "ff 00 00", 0.5; +INVENTORY.HUBPOWER } } class PowerInvisibility : Powerup native { Default { +SHADOW; Powerup.Duration -60; Powerup.Strength 80; Powerup.Mode "Fuzzy"; } } class PowerGhost : PowerInvisibility { Default { +GHOST; Powerup.Duration -60; Powerup.Strength 60; Powerup.Mode "None"; } } class PowerShadow : PowerInvisibility { Default { +INVENTORY.HUBPOWER Powerup.Duration -55; Powerup.Strength 75; Powerup.Mode "Cumulative"; } } class PowerIronFeet : Powerup native { Default { Powerup.Duration -60; Powerup.Color "00 ff 00", 0.125; } } class PowerMask : PowerIronFeet native { Default { Powerup.Duration -80; Powerup.Color "00 00 00", 0; +INVENTORY.HUBPOWER Inventory.Icon "I_MASK"; } } class PowerLightAmp : Powerup native { Default { Powerup.Duration -120; } } class PowerTorch : PowerLightAmp native {} class PowerFlight : Powerup native { Default { Powerup.Duration -60; +INVENTORY.HUBPOWER } } class PowerWeaponLevel2 : Powerup native { Default { Powerup.Duration -40; Inventory.Icon "SPINBK0"; +INVENTORY.NOTELEPORTFREEZE } } class PowerSpeed : Powerup native { native int SpeedFlags; Default { Powerup.Duration -45; Speed 1.5; Inventory.Icon "SPBOOT0"; +INVENTORY.NOTELEPORTFREEZE } override double GetSpeedFactor() { return Speed; } } // Player Speed Trail (used by the Speed Powerup) ---------------------------- class PlayerSpeedTrail : Actor { Default { +NOBLOCKMAP +NOGRAVITY Alpha 0.6; RenderStyle "Translucent"; } override void Tick() { Alpha -= .6 / 8; if (Alpha <= 0) { Destroy (); } } } class PowerMinotaur : Powerup native { Default { Powerup.Duration -25; Inventory.Icon "SPMINO0"; } } class PowerTargeter : Powerup native { Default { Powerup.Duration -160; +INVENTORY.HUBPOWER } States { Targeter: TRGT A -1; Stop; TRGT B -1; Stop; TRGT C -1; Stop; } } class PowerFrightener : Powerup native { Default { Powerup.Duration -60; } } class PowerBuddha : Powerup native { Default { Powerup.Duration -60; } } //=========================================================================== // // Scanner (this is active just by being present) // //=========================================================================== class PowerScanner : Powerup { Default { Powerup.Duration -80; +INVENTORY.HUBPOWER } } class PowerTimeFreezer : Powerup native { Default { Powerup.Duration -12; } } class PowerDamage : Powerup native { Default { Powerup.Duration -25; } } class PowerProtection : Powerup native { Default { Powerup.Duration -25; } } //=========================================================================== // // Drain // //=========================================================================== class PowerDrain : Powerup { Default { Powerup.Duration -60; } override void InitEffect() { Super.InitEffect(); if (Owner!= null && Owner.player != null) { // Give the player the power to drain life from opponents when he damages them. Owner.player.cheats |= CF_DRAIN; } } override void EndEffect() { Super.EndEffect(); // Nothing to do if there's no owner. if (Owner!= null && Owner.player != null) { // Take away the drain power. Owner.player.cheats &= ~CF_DRAIN; } } } //=========================================================================== // // Regeneration // //=========================================================================== class PowerRegeneration : Powerup { Default { Powerup.Duration -120; Powerup.Strength 5; } override void DoEffect() { Super.DoEffect(); if (Owner != null && Owner.health > 0 && (level.time & 31) == 0) { if (Owner.GiveBody(int(Strength))) { Owner.A_PlaySound("*regenerate", CHAN_ITEM); } } } } //=========================================================================== // // HighJump // //=========================================================================== class PowerHighJump : Powerup { override void InitEffect() { Super.InitEffect(); if (Owner!= null && Owner.player != null) { // Give the player the power to jump much higher. Owner.player.cheats |= CF_HIGHJUMP; } } override void EndEffect() { Super.EndEffect(); // Nothing to do if there's no owner. if (Owner!= null && Owner.player != null) { // Take away the high jump power. Owner.player.cheats &= ~CF_HIGHJUMP; } } } //=========================================================================== // // DoubleFiringSpeed // //=========================================================================== class PowerDoubleFiringSpeed : Powerup { override void InitEffect() { Super.InitEffect(); if (Owner!= null && Owner.player != null) { // Give the player the power to shoot twice as fast. Owner.player.cheats |= CF_DOUBLEFIRINGSPEED; } } override void EndEffect() { Super.EndEffect(); // Nothing to do if there's no owner. if (Owner!= null && Owner.player != null) { // Take away the shooting twice as fast power. Owner.player.cheats &= ~CF_DOUBLEFIRINGSPEED; } } } //=========================================================================== // // InfiniteAmmo // //=========================================================================== class PowerInfiniteAmmo : Powerup { Default { Powerup.Duration -30; } override void InitEffect() { Super.InitEffect(); if (Owner!= null && Owner.player != null) { // Give the player infinite ammo Owner.player.cheats |= CF_INFINITEAMMO; } } override void EndEffect() { Super.EndEffect(); // Nothing to do if there's no owner. if (Owner!= null && Owner.player != null) { // Take away the limitless ammo Owner.player.cheats &= ~CF_INFINITEAMMO; } } } //=========================================================================== // // PowerMorph // //=========================================================================== class PowerMorph : Powerup native { native Class PlayerClass; native Class MorphFlash, UnMorphFlash; native int MorphStyle; native PlayerInfo MorphedPlayer; Default { Powerup.Duration -40; } //=========================================================================== // // InitEffect // //=========================================================================== override void InitEffect() { Super.InitEffect(); if (Owner != null && Owner.player != null && PlayerClass != null) { let realplayer = Owner.player; // Remember the identity of the player if (realplayer.MorphPlayer(realplayer, PlayerClass, 0x7fffffff/*INDEFINITELY*/, MorphStyle, MorphFlash, UnMorphFlash)) { Owner = realplayer.mo; // Replace the new owner in our owner; safe because we are not attached to anything yet bCreateCopyMoved = true; // Let the caller know the "real" owner has changed (to the morphed actor) MorphedPlayer = realplayer; // Store the player identity (morphing clears the unmorphed actor's "player" field) } else // morph failed - give the caller an opportunity to fail the pickup completely { bInitEffectFailed = true; // Let the caller know that the activation failed (can fail the pickup if appropriate) } } } //=========================================================================== // // EndEffect // //=========================================================================== override void EndEffect() { Super.EndEffect(); // Abort if owner already destroyed or unmorphed if (Owner == null || MorphedPlayer == null || Owner.alternative == null) { return; } // Abort if owner is dead; their Die() method will // take care of any required unmorphing on death. if (MorphedPlayer.health <= 0) { return; } int savedMorphTics = MorphedPlayer.morphTics; MorphedPlayer.UndoPlayerMorph (MorphedPlayer, 0, !!(MorphedPlayer.MorphStyle & MRF_UNDOALWAYS)); // Abort if unmorph failed; in that case, // set the usual retry timer and return. if (MorphedPlayer != null && MorphedPlayer.morphTics) { // Transfer retry timeout // to the powerup's timer. EffectTics = MorphedPlayer.morphTics; // Reload negative morph tics; // use actual value; it may // be in use for animation. MorphedPlayer.morphTics = savedMorphTics; // Try again some time later return; } // Unmorph suceeded MorphedPlayer = null; } }