qzdoom-gpl/wadsrc/static/zscript/strife/strifeweapons.txt
Christoph Oelckers ac86a535e7 - fixed: State labels were resolved in the calling function's context instead of the called function one's.
This could cause problems with functions that take states as parameters but use them to set them internally instead of passing them through the A_Jump interface back to the caller, like A_Chase or A_LookEx.
This required some quite significant refactoring because the entire state resolution logic had been baked into the compiler which turned out to be a major maintenance problem.
Fixed this by adding a new builtin type 'statelabel'. This is an opaque identifier representing a state, with the actual data either directly encoded into the number for single label state or an index into a state information table.
The state resolution is now the task of the called function as it should always have remained. Note, that this required giving back the 'action' qualifier to most state jumping functions.

- refactored most A_Jump checkers to a two stage setup with a pure checker that returns a boolean and a scripted A_Jump wrapper, for some simpler checks the checker function was entirely omitted and calculated inline in the A_Jump function. It is strongly recommended to use the boolean checkers unless using an inline function invocation in a state as they lead to vastly clearer code and offer more flexibility.

- let Min() and Max() use the OP_MIN and OP_MAX opcodes. Although these were present, these function were implemented using some grossly inefficient branching tests.
- the DECORATE 'state' cast kludge will now actually call ResolveState because a state label is not a state and needs conversion.
2016-11-14 14:12:27 +01:00

891 lines
14 KiB
Text

class StrifeWeapon : Weapon
{
Default
{
Weapon.Kickback 100;
}
}
// Same as the bullet puff for Doom -----------------------------------------
class StrifePuff : Actor
{
Default
{
+NOBLOCKMAP
+NOGRAVITY
+ALLOWPARTICLES
RenderStyle "Translucent";
Alpha 0.25;
}
States
{
Spawn:
POW3 ABCDEFGH 3;
Stop;
Crash:
PUFY A 4 Bright;
PUFY BCD 4;
Stop;
}
}
// A spark when you hit something that doesn't bleed ------------------------
// Only used by the dagger.
class StrifeSpark : StrifePuff
{
Default
{
RenderStyle "Add";
}
States
{
Crash:
POW2 ABCD 4;
Stop;
}
}
// Punch Dagger -------------------------------------------------------------
class PunchDagger : StrifeWeapon
{
Default
{
Weapon.SelectionOrder 3900;
+WEAPON.NOALERT
Obituary "$OB_MPPUNCHDAGGER";
Tag "$TAG_PUNCHDAGGER";
}
action native void A_JabDagger ();
States
{
Ready:
PNCH A 1 A_WeaponReady;
Loop;
Deselect:
PNCH A 1 A_Lower;
Loop;
Select:
PNCH A 1 A_Raise;
Loop;
Fire:
PNCH B 4;
PNCH C 4 A_JabDagger;
PNCH D 5;
PNCH C 4;
PNCH B 5 A_ReFire;
Goto Ready;
}
}
// The base for Strife projectiles that die with ZAP1 -----------------------
class StrifeZap1 : Actor
{
Default
{
+NOBLOCKMAP
+NOGRAVITY
+DROPOFF
}
States
{
Spawn:
Death:
ZAP1 A 3 A_AlertMonsters;
ZAP1 BCDEFE 3;
ZAP1 DCB 2;
ZAP1 A 1;
Stop;
}
}
// Electric Bolt ------------------------------------------------------------
class ElectricBolt : StrifeZap1
{
Default
{
Speed 30;
Radius 10;
Height 10;
Damage 10;
Projectile;
+STRIFEDAMAGE
MaxStepHeight 4;
SeeSound "misc/swish";
ActiveSound "misc/swish";
DeathSound "weapons/xbowhit";
Obituary "$OB_MPELECTRICBOLT";
}
States
{
Spawn:
AROW A 10 A_LoopActiveSound;
Loop;
}
}
// Poison Bolt --------------------------------------------------------------
class PoisonBolt : Actor native
{
Default
{
Speed 30;
Radius 10;
Height 10;
Damage 500;
Projectile;
+STRIFEDAMAGE
MaxStepHeight 4;
SeeSound "misc/swish";
ActiveSound "misc/swish";
Obituary "$OB_MPPOISONBOLT";
}
States
{
Spawn:
ARWP A 10 A_LoopActiveSound;
Loop;
Death:
AROW A 1;
Stop;
}
}
// Strife's Crossbow --------------------------------------------------------
class StrifeCrossbow : StrifeWeapon
{
Default
{
+FLOORCLIP
Weapon.SelectionOrder 1200;
+WEAPON.NOALERT
Weapon.AmmoUse1 1;
Weapon.AmmoGive1 8;
Weapon.AmmoType1 "ElectricBolts";
Weapon.SisterWeapon "StrifeCrossbow2";
Inventory.PickupMessage "$TXT_STRIFECROSSBOW";
Tag "$TAG_STRIFECROSSBOW1";
Inventory.Icon "CBOWA0";
}
action native void A_ClearFlash ();
action native void A_ShowElectricFlash ();
action native void A_FireArrow (class<Actor> proj);
States
{
Spawn:
CBOW A -1;
Stop;
Ready:
XBOW A 0 A_ShowElectricFlash;
XBOW A 1 A_WeaponReady;
Wait;
Deselect:
XBOW A 1 A_Lower;
Loop;
Select:
XBOW A 1 A_Raise;
Loop;
Fire:
XBOW A 3 A_ClearFlash;
XBOW B 6 A_FireArrow("ElectricBolt");
XBOW C 4;
XBOW D 6;
XBOW E 3;
XBOW F 5;
XBOW G 0 A_ShowElectricFlash;
XBOW G 5 A_CheckReload;
Goto Ready+1;
Flash:
XBOW KLM 5;
Loop;
}
}
class StrifeCrossbow2 : StrifeCrossbow
{
Default
{
Weapon.SelectionOrder 2700;
Weapon.AmmoUse1 1;
Weapon.AmmoGive1 0;
Weapon.AmmoType1 "PoisonBolts";
Weapon.SisterWeapon "StrifeCrossbow";
Tag "$TAG_STRIFECROSSBOW2";
}
States
{
Ready:
XBOW H 1 A_WeaponReady;
Loop;
Deselect:
XBOW H 1 A_Lower;
Loop;
Select:
XBOW H 1 A_Raise;
Loop;
Fire:
XBOW H 3;
XBOW B 6 A_FireArrow("PoisonBolt");
XBOW C 4;
XBOW D 6;
XBOW E 3;
XBOW I 5;
XBOW J 5 A_CheckReload;
Goto Ready;
Flash:
Stop;
}
}
// Assault Gun --------------------------------------------------------------
class AssaultGun : StrifeWeapon
{
Default
{
+FLOORCLIP
Weapon.SelectionOrder 600;
Weapon.AmmoUse1 1;
Weapon.AmmoGive1 20;
Weapon.AmmoType1 "ClipOfBullets";
Inventory.Icon "RIFLA0";
Tag "$TAG_ASSAULTGUN";
Inventory.PickupMessage "$TXT_ASSAULTGUN";
Obituary "$OB_MPASSAULTGUN";
}
States
{
Spawn:
RIFL A -1;
Stop;
Ready:
RIFG A 1 A_WeaponReady;
Loop;
Deselect:
RIFG B 1 A_Lower;
Loop;
Select:
RIFG A 1 A_Raise;
Loop;
Fire:
RIFF AB 3 A_FireAssaultGun;
RIFG D 3 A_FireAssaultGun;
RIFG C 0 A_ReFire;
RIFG B 2 A_Light0;
Goto Ready;
}
}
// Standing variant of the assault gun --------------------------------------
class AssaultGunStanding : WeaponGiver
{
Default
{
DropItem "AssaultGun";
Inventory.PickupMessage "$TXT_ASSAULTGUN";
}
States
{
Spawn:
RIFL B -1;
Stop;
}
}
// Mini-Missile Launcher ----------------------------------------------------
class MiniMissileLauncher : StrifeWeapon
{
Default
{
+FLOORCLIP
Weapon.SelectionOrder 1800;
Weapon.AmmoUse1 1;
Weapon.AmmoGive1 8;
Weapon.AmmoType1 "MiniMissiles";
Inventory.Icon "MMSLA0";
Tag "$TAG_MMLAUNCHER";
Inventory.PickupMessage "$TXT_MMLAUNCHER";
}
action native void A_FireMiniMissile ();
States
{
Spawn:
MMSL A -1;
Stop;
Ready:
MMIS A 1 A_WeaponReady;
Loop;
Deselect:
MMIS A 1 A_Lower;
Loop;
Select:
MMIS A 1 A_Raise;
Loop;
Fire:
MMIS A 4 A_FireMiniMissile;
MMIS B 4 A_Light1;
MMIS C 5 Bright;
MMIS D 2 Bright A_Light2;
MMIS E 2 Bright;
MMIS F 2 Bright A_Light0;
MMIS F 0 A_ReFire;
Goto Ready;
}
}
// Rocket Trail -------------------------------------------------------------
class RocketTrail : Actor
{
Default
{
+NOBLOCKMAP
+NOGRAVITY
RenderStyle "Translucent";
Alpha 0.25;
SeeSound "misc/missileinflight";
}
States
{
Spawn:
PUFY BCBCD 4;
Stop;
}
}
// Rocket Puff --------------------------------------------------------------
class MiniMissilePuff : StrifePuff
{
Default
{
-ALLOWPARTICLES
}
States
{
Spawn:
Goto Crash;
}
}
// Mini Missile -------------------------------------------------------------
class MiniMissile : Actor
{
Default
{
Speed 20;
Radius 10;
Height 14;
Damage 10;
Projectile;
+STRIFEDAMAGE
MaxStepHeight 4;
SeeSound "weapons/minimissile";
DeathSound "weapons/minimissilehit";
Obituary "$OB_MPMINIMISSILELAUNCHER";
}
States
{
Spawn:
MICR A 6 Bright A_RocketInFlight;
Loop;
Death:
SMIS A 0 Bright A_SetTranslucent(1,1);
SMIS A 5 Bright A_Explode(64,64,1,1);
SMIS B 5 Bright;
SMIS C 4 Bright;
SMIS DEFG 2 Bright;
Stop;
}
}
// Flame Thrower ------------------------------------------------------------
class FlameThrower : StrifeWeapon
{
Default
{
+FLOORCLIP
Weapon.SelectionOrder 2100;
Weapon.Kickback 0;
Weapon.AmmoUse1 1;
Weapon.AmmoGive1 100;
Weapon.UpSound "weapons/flameidle";
Weapon.ReadySound "weapons/flameidle";
Weapon.AmmoType1 "EnergyPod";
Inventory.Icon "FLAMA0";
Tag "$TAG_FLAMER";
Inventory.PickupMessage "$TXT_FLAMER";
}
action native void A_FireFlamer ();
States
{
Spawn:
FLAM A -1;
Stop;
Ready:
FLMT AB 3 A_WeaponReady;
Loop;
Deselect:
FLMT A 1 A_Lower;
Loop;
Select:
FLMT A 1 A_Raise;
Loop;
Fire:
FLMF A 2 A_FireFlamer;
FLMF B 3 A_ReFire;
Goto Ready;
}
}
// Flame Thrower Projectile -------------------------------------------------
class FlameMissile : Actor
{
Default
{
Speed 15;
Height 11;
Radius 8;
Mass 10;
Damage 4;
DamageType "Fire";
ReactionTime 8;
Projectile;
-NOGRAVITY
+STRIFEDAMAGE
MaxStepHeight 4;
RenderStyle "Add";
SeeSound "weapons/flamethrower";
Obituary "$OB_MPFLAMETHROWER";
}
native void A_FlameDie ();
States
{
Spawn:
FRBL AB 3 Bright;
FRBL C 3 Bright A_Countdown;
Loop;
Death:
FRBL D 5 Bright A_FlameDie;
FRBL EFGHI 5 Bright;
Stop;
}
}
// 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";
}
action native void A_FireMauler1 ();
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;
}
}
// 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";
}
action native void A_FireMauler2Pre ();
action native void A_FireMauler2 ();
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;
}
}
// Mauler "Bullet" Puff -----------------------------------------------------
class MaulerPuff : Actor
{
Default
{
+NOBLOCKMAP
+NOGRAVITY
+PUFFONACTORS
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
MaxStepHeight 4;
RenderStyle "Add";
SeeSound "weapons/mauler2fire";
DeathSound "weapons/mauler2hit";
Obituary "$OB_MPMAULER";
}
native void A_MaulerTorpedoWave ();
States
{
Spawn:
TORP ABCD 4 Bright;
Loop;
Death:
THIT AB 8 Bright;
THIT C 8 Bright A_MaulerTorpedoWave;
THIT DE 8 Bright;
Stop;
}
}
// The mini torpedoes shot by the big torpedo --------------------------------
class MaulerTorpedoWave : Actor
{
Default
{
Speed 35;
Radius 13;
Height 13;
Damage 10;
DamageType "Disintegrate";
Projectile;
+STRIFEDAMAGE
MaxStepHeight 4;
RenderStyle "Add";
Obituary "$OB_MPMAULER";
}
States
{
Spawn:
TWAV AB 9 Bright;
Death:
TWAV C 9 Bright;
Stop;
}
}
// High-Explosive Grenade ---------------------------------------------------
class HEGrenade : Actor
{
Default
{
Speed 15;
Radius 13;
Height 13;
Mass 20;
Damage 1;
Reactiontime 30;
Projectile;
-NOGRAVITY
+STRIFEDAMAGE
+BOUNCEONACTORS
+EXPLODEONWATER
MaxStepHeight 4;
BounceType "Doom";
BounceFactor 0.5;
BounceCount 2;
SeeSound "weapons/hegrenadeshoot";
DeathSound "weapons/hegrenadebang";
Obituary "$OB_MPSTRIFEGRENADE";
}
States
{
Spawn:
GRAP AB 3 A_Countdown;
Loop;
Death:
BNG4 A 0 Bright A_NoGravity;
BNG4 A 0 Bright A_SetTranslucent(1,1);
BNG4 A 2 Bright A_Explode(192,192,1,1);
BNG4 BCDEFGHIJKLMN 3 Bright;
Stop;
}
}
// White Phosphorous Grenade ------------------------------------------------
class PhosphorousGrenade : Actor
{
Default
{
Speed 15;
Radius 13;
Height 13;
Mass 20;
Damage 1;
Reactiontime 40;
Projectile;
-NOGRAVITY
+STRIFEDAMAGE
+BOUNCEONACTORS
+EXPLODEONWATER
BounceType "Doom";
MaxStepHeight 4;
BounceFactor 0.5;
BounceCount 2;
SeeSound "weapons/phgrenadeshoot";
DeathSound "weapons/phgrenadebang";
Obituary "$OB_MPPHOSPHOROUSGRENADE";
}
States
{
Spawn:
GRIN AB 3 A_Countdown;
Loop;
Death:
BNG3 A 2 A_SpawnItemEx("PhosphorousFire");
Stop;
}
}
// Fire from the Phoshorous Grenade -----------------------------------------
class PhosphorousFire : Actor native
{
Default
{
Reactiontime 120;
DamageType "Fire";
+NOBLOCKMAP
+FLOORCLIP
+NOTELEPORT
+NODAMAGETHRUST
+DONTSPLASH
RenderStyle "Add";
Obituary "$OB_MPPHOSPHOROUSGRENADE";
}
native void A_Burnarea ();
native void A_Burnination ();
States
{
Spawn:
BNG3 B 2 Bright A_Burnarea;
BNG3 C 2 Bright A_Countdown;
FLBE A 2 Bright A_Burnination;
FLBE B 2 Bright A_Countdown;
FLBE C 2 Bright A_Burnarea;
FLBE D 3 Bright A_Countdown;
FLBE E 3 Bright A_Burnarea;
FLBE F 3 Bright A_Countdown;
FLBE G 3 Bright A_Burnination;
Goto Spawn+5;
Death:
FLBE H 2 Bright;
FLBE I 2 Bright A_Burnination;
FLBE JK 2 Bright;
Stop;
}
}
// High-Explosive Grenade Launcher ------------------------------------------
class StrifeGrenadeLauncher : StrifeWeapon
{
Default
{
+FLOORCLIP
Weapon.SelectionOrder 2400;
Weapon.AmmoUse1 1;
Weapon.AmmoGive1 12;
Weapon.AmmoType1 "HEGrenadeRounds";
Weapon.SisterWeapon "StrifeGrenadeLauncher2";
Inventory.Icon "GRNDA0";
Tag "$TAG_GLAUNCHER1";
Inventory.PickupMessage "$TXT_GLAUNCHER";
}
action native void A_FireGrenade (class<Actor> grenadetype, float angleofs, statelabel flash);
States
{
Spawn:
GRND A -1;
Stop;
Ready:
GREN A 1 A_WeaponReady;
Loop;
Deselect:
GREN A 1 A_Lower;
Loop;
Select:
GREN A 1 A_Raise;
Loop;
Fire:
GREN A 5 A_FireGrenade("HEGrenade", -90, "Flash");
GREN B 10;
GREN A 5 A_FireGrenade("HEGrenade", 90, "Flash2");
GREN C 10;
GREN A 0 A_ReFire;
Goto Ready;
Flash:
GREF A 5 Bright A_Light1;
Goto LightDone;
Flash2:
GREF B 5 Bright A_Light2;
Goto LightDone;
}
}
// White Phosphorous Grenade Launcher ---------------------------------------
class StrifeGrenadeLauncher2 : StrifeGrenadeLauncher
{
Default
{
Weapon.SelectionOrder 3200;
Weapon.AmmoUse1 1;
Weapon.AmmoGive1 0;
Weapon.AmmoType1 "PhosphorusGrenadeRounds";
Weapon.SisterWeapon "StrifeGrenadeLauncher";
Tag "$TAG_GLAUNCHER2";
}
States
{
Ready:
GREN D 1 A_WeaponReady;
Loop;
Deselect:
GREN D 1 A_Lower;
Loop;
Select:
GREN D 1 A_Raise;
Loop;
Fire:
GREN D 5 A_FireGrenade("PhosphorousGrenade", -90, "Flash");
GREN E 10;
GREN D 5 A_FireGrenade("PhosphorousGrenade", 90, "Flash2");
GREN F 10;
GREN A 0 A_ReFire;
Goto Ready;
Flash:
GREF C 5 Bright A_Light1;
Goto LightDone;
Flash2:
GREF D 5 Bright A_Light2;
Goto LightDone;
}
}