mirror of
https://github.com/ZDoom/gzdoom-gles.git
synced 2025-02-27 05:30:56 +00:00
- made some changes to PowerMorph to better deal with recursive calls from UndoPlayerMorph. The flag hackery was only needed because the 'alternative' pointers were cleared far too late.
511 lines
9.5 KiB
Text
511 lines
9.5 KiB
Text
class PowerupGiver : Inventory native
|
|
{
|
|
|
|
native Class<Actor> 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<PlayerPawn> PlayerClass;
|
|
native Class<Actor> 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;
|
|
}
|
|
|
|
|
|
}
|
|
|