qzdoom/wadsrc/static/zscript/actors/strife/weaponmauler.zs
Christoph Oelckers a638cfbd6e - fixed: player_t::GetPSprite cannot guarantee success
As a consequence it must return null in the failure case instead of asserting and all calls to this function must check for the failure case.
2020-03-11 00:56:29 +01:00

292 lines
5.4 KiB
Text

// Mauler -------------------------------------------------------------------
// The scatter version
class Mauler : StrifeWeapon
{
Default
{
+FLOORCLIP
Weapon.SelectionOrder 300;
Weapon.AmmoUse1 20;
Weapon.AmmoGive1 40;
Weapon.AmmoType1 "EnergyPod";
Weapon.SisterWeapon "Mauler2";
Inventory.Icon "TRPDA0";
Tag "$TAG_MAULER1";
Inventory.PickupMessage "$TXT_MAULER";
Obituary "$OB_MPMAULER1";
}
States
{
Ready:
MAUL FGHA 6 A_WeaponReady;
Loop;
Deselect:
MAUL A 1 A_Lower;
Loop;
Select:
MAUL A 1 A_Raise;
Loop;
Fire:
BLSF A 5 Bright A_FireMauler1;
MAUL B 3 Bright A_Light1;
MAUL C 2 A_Light2;
MAUL DE 2;
MAUL A 7 A_Light0;
MAUL H 7;
MAUL G 7 A_CheckReload;
Goto Ready;
Spawn:
TRPD A -1;
Stop;
}
//============================================================================
//
// A_FireMauler1
//
// Hey! This is exactly the same as a super shotgun except for the sound
// and the bullet puffs and the disintegration death.
//
//============================================================================
action void A_FireMauler1()
{
if (player == null)
{
return;
}
A_StartSound ("weapons/mauler1", CHAN_WEAPON);
Weapon weap = player.ReadyWeapon;
if (weap != null)
{
if (!weap.DepleteAmmo (weap.bAltFire, true, 2))
return;
}
player.mo.PlayAttacking2 ();
double pitch = BulletSlope ();
for (int i = 0 ; i < 20 ; i++)
{
int damage = 5 * random[Mauler1](1, 3);
double ang = angle + Random2[Mauler1]() * (11.25 / 256);
// Strife used a range of 2112 units for the mauler to signal that
// it should use a different puff. ZDoom's default range is longer
// than this, so let's not handicap it by being too faithful to the
// original.
LineAttack (ang, PLAYERMISSILERANGE, pitch + Random2[Mauler1]() * (7.097 / 256), damage, 'Hitscan', "MaulerPuff");
}
}
}
// Mauler Torpedo version ---------------------------------------------------
class Mauler2 : Mauler
{
Default
{
Weapon.SelectionOrder 3300;
Weapon.AmmoUse1 30;
Weapon.AmmoGive1 0;
Weapon.AmmoType1 "EnergyPod";
Weapon.SisterWeapon "Mauler";
Tag "$TAG_MAULER2";
}
States
{
Ready:
MAUL IJKL 7 A_WeaponReady;
Loop;
Deselect:
MAUL I 1 A_Lower;
Loop;
Select:
MAUL I 1 A_Raise;
Loop;
Fire:
MAUL I 20 A_FireMauler2Pre;
MAUL J 10 A_Light1;
BLSF A 10 Bright A_FireMauler2;
MAUL B 10 Bright A_Light2;
MAUL C 2;
MAUL D 2 A_Light0;
MAUL E 2 A_ReFire;
Goto Ready;
}
//============================================================================
//
// A_FireMauler2Pre
//
// Makes some noise and moves the psprite.
//
//============================================================================
action void A_FireMauler2Pre ()
{
A_StartSound ("weapons/mauler2charge", CHAN_WEAPON);
if (player != null)
{
PSprite psp = player.GetPSprite(PSP_WEAPON);
if (psp)
{
psp.x += Random2[Mauler2]() / 64.;
psp.y += Random2[Mauler2]() / 64.;
}
}
}
//============================================================================
//
// A_FireMauler2Pre
//
// Fires the torpedo.
//
//============================================================================
action void A_FireMauler2 ()
{
if (player == null)
{
return;
}
Weapon weapon = player.ReadyWeapon;
if (weapon != null)
{
if (!weapon.DepleteAmmo (weapon.bAltFire))
return;
}
player.mo.PlayAttacking2 ();
SpawnPlayerMissile ("MaulerTorpedo");
DamageMobj (self, null, 20, 'Disintegrate');
Thrust(7.8125, Angle+180.);
}
}
// Mauler "Bullet" Puff -----------------------------------------------------
class MaulerPuff : Actor
{
Default
{
+NOBLOCKMAP
+NOGRAVITY
+PUFFONACTORS
+ZDOOMTRANS
RenderStyle "Add";
DamageType "Disintegrate";
}
States
{
Spawn:
MPUF AB 5;
POW1 ABCDE 4;
Stop;
}
}
// The Mauler's Torpedo -----------------------------------------------------
class MaulerTorpedo : Actor
{
Default
{
Speed 20;
Height 8;
Radius 13;
Damage 1;
DamageType "Disintegrate";
Projectile;
+STRIFEDAMAGE
+ZDOOMTRANS
MaxStepHeight 4;
RenderStyle "Add";
SeeSound "weapons/mauler2fire";
DeathSound "weapons/mauler2hit";
Obituary "$OB_MPMAULER";
}
States
{
Spawn:
TORP ABCD 4 Bright;
Loop;
Death:
THIT AB 8 Bright;
THIT C 8 Bright A_MaulerTorpedoWave;
THIT DE 8 Bright;
Stop;
}
//============================================================================
//
// A_MaulerTorpedoWave
//
// Launches lots of balls when the torpedo hits something.
//
//============================================================================
action void A_MaulerTorpedoWave()
{
readonly<Actor> wavedef = GetDefaultByType("MaulerTorpedoWave");
double savedz = pos.z;
angle += 180.;
// If the torpedo hit the ceiling, it should still spawn the wave
if (wavedef && ceilingz < pos.z + wavedef.Height)
{
SetZ(ceilingz - wavedef.Height);
}
for (int i = 0; i < 80; ++i)
{
Angle += 4.5;
SpawnSubMissile ("MaulerTorpedoWave", target);
}
SetZ(savedz);
}
}
// The mini torpedoes shot by the big torpedo --------------------------------
class MaulerTorpedoWave : Actor
{
Default
{
Speed 35;
Radius 13;
Height 13;
Damage 10;
DamageType "Disintegrate";
Projectile;
+STRIFEDAMAGE
+ZDOOMTRANS
MaxStepHeight 4;
RenderStyle "Add";
Obituary "$OB_MPMAULER";
}
States
{
Spawn:
TWAV AB 9 Bright;
Death:
TWAV C 9 Bright;
Stop;
}
}