From 5beebb83b741b0ef43cb4ef6e65e7d2c24ba4302 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Tue, 29 Nov 2016 13:28:43 +0100 Subject: [PATCH] - scriptified Strife's assault gun and missile launcher. --- src/g_shared/a_pickups.cpp | 1 - src/g_strife/a_strifeweapons.cpp | 109 ----------- wadsrc/static/zscript.txt | 2 + wadsrc/static/zscript/actor.txt | 1 - wadsrc/static/zscript/constants.txt | 9 + wadsrc/static/zscript/shared/inventory.txt | 1 - .../static/zscript/strife/strifefunctions.txt | 19 +- .../static/zscript/strife/strifeweapons.txt | 171 ------------------ .../static/zscript/strife/weaponassault.txt | 94 ++++++++++ .../static/zscript/strife/weaponmissile.txt | 137 ++++++++++++++ 10 files changed, 260 insertions(+), 284 deletions(-) create mode 100644 wadsrc/static/zscript/strife/weaponassault.txt create mode 100644 wadsrc/static/zscript/strife/weaponmissile.txt diff --git a/src/g_shared/a_pickups.cpp b/src/g_shared/a_pickups.cpp index 38d068bd7..ad843667a 100644 --- a/src/g_shared/a_pickups.cpp +++ b/src/g_shared/a_pickups.cpp @@ -1717,7 +1717,6 @@ bool AInventory::CallTryPickup (AActor *toucher, AActor **toucher_return) bool res; if (CanPickup(toucher)) { - bool res; IFVIRTUAL(AInventory, TryPickup) { VMValue params[2] = { (DObject*)this, (void*)&toucher }; diff --git a/src/g_strife/a_strifeweapons.cpp b/src/g_strife/a_strifeweapons.cpp index 67c8c8c17..8492789db 100644 --- a/src/g_strife/a_strifeweapons.cpp +++ b/src/g_strife/a_strifeweapons.cpp @@ -30,117 +30,8 @@ void A_Countdown (AActor *); // Assault Gun -------------------------------------------------------------- -//============================================================================ -// -// P_StrifeGunShot -// -//============================================================================ - -void P_StrifeGunShot (AActor *mo, bool accurate, DAngle pitch) -{ - DAngle angle; - int damage; - - damage = 4*(pr_sgunshot()%3+1); - angle = mo->Angles.Yaw; - - if (mo->player != NULL && !accurate) - { - angle += pr_sgunshot.Random2() * (22.5 / 256) * mo->player->mo->AccuracyFactor(); - } - - P_LineAttack (mo, angle, PLAYERMISSILERANGE, pitch, damage, NAME_Hitscan, NAME_StrifePuff); -} - -//============================================================================ -// -// A_FireAssaultGun -// -//============================================================================ - -DEFINE_ACTION_FUNCTION(AActor, A_FireAssaultGun) -{ - PARAM_ACTION_PROLOGUE(AActor); - - bool accurate; - - S_Sound (self, CHAN_WEAPON, "weapons/assaultgun", 1, ATTN_NORM); - - if (self->player != NULL) - { - AWeapon *weapon = self->player->ReadyWeapon; - if (weapon != NULL) - { - if (!weapon->DepleteAmmo (weapon->bAltFire)) - return 0; - } - self->player->mo->PlayAttacking2 (); - accurate = !self->player->refire; - } - else - { - accurate = true; - } - - P_StrifeGunShot (self, accurate, P_BulletSlope (self)); - return 0; -} - // Mini-Missile Launcher ---------------------------------------------------- -//============================================================================ -// -// A_FireMiniMissile -// -//============================================================================ - -DEFINE_ACTION_FUNCTION(AActor, A_FireMiniMissile) -{ - PARAM_ACTION_PROLOGUE(AActor); - - player_t *player = self->player; - DAngle savedangle; - - if (self->player == NULL) - return 0; - - AWeapon *weapon = self->player->ReadyWeapon; - if (weapon != NULL) - { - if (!weapon->DepleteAmmo (weapon->bAltFire)) - return 0; - } - - savedangle = self->Angles.Yaw; - self->Angles.Yaw += pr_minimissile.Random2() * (11.25 / 256) * player->mo->AccuracyFactor(); - player->mo->PlayAttacking2 (); - P_SpawnPlayerMissile (self, PClass::FindActor("MiniMissile")); - self->Angles.Yaw = savedangle; - return 0; -} - -//============================================================================ -// -// A_RocketInFlight -// -//============================================================================ - -DEFINE_ACTION_FUNCTION(AActor, A_RocketInFlight) -{ - PARAM_SELF_PROLOGUE(AActor); - - AActor *trail; - - S_Sound (self, CHAN_VOICE, "misc/missileinflight", 1, ATTN_NORM); - P_SpawnPuff (self, PClass::FindActor("MiniMissilePuff"), self->Pos(), self->Angles.Yaw - 180, self->Angles.Yaw - 180, 2, PF_HITTHING); - trail = Spawn("RocketTrail", self->Vec3Offset(-self->Vel.X, -self->Vel.Y, 0.), ALLOW_REPLACE); - if (trail != NULL) - { - trail->Vel.Z = 1; - } - return 0; -} - // Flame Thrower ------------------------------------------------------------ //============================================================================ diff --git a/wadsrc/static/zscript.txt b/wadsrc/static/zscript.txt index 4b646be4a..eb6e30dcb 100644 --- a/wadsrc/static/zscript.txt +++ b/wadsrc/static/zscript.txt @@ -191,6 +191,8 @@ zscript/strife/templar.txt zscript/strife/zombie.txt zscript/strife/weapondagger.txt zscript/strife/weaponcrossbow.txt +zscript/strife/weaponassault.txt +zscript/strife/weaponmissile.txt zscript/strife/sigil.txt zscript/chex/chexmonsters.txt diff --git a/wadsrc/static/zscript/actor.txt b/wadsrc/static/zscript/actor.txt index a5e0db153..5279372fd 100644 --- a/wadsrc/static/zscript/actor.txt +++ b/wadsrc/static/zscript/actor.txt @@ -694,7 +694,6 @@ class Actor : Thinker native native void A_ClearLastHeard(); native bool A_SelectWeapon(class whichweapon, int flags = 0); native void A_ClassBossHealth(); - native void A_RocketInFlight(); native void A_SetAngle(double angle = 0, int flags = 0, int ptr = AAPTR_DEFAULT); native void A_SetPitch(double pitch, int flags = 0, int ptr = AAPTR_DEFAULT); native void A_SetRoll(double roll, int flags = 0, int ptr = AAPTR_DEFAULT); diff --git a/wadsrc/static/zscript/constants.txt b/wadsrc/static/zscript/constants.txt index 8180e6710..2ccfb7048 100644 --- a/wadsrc/static/zscript/constants.txt +++ b/wadsrc/static/zscript/constants.txt @@ -1037,3 +1037,12 @@ enum EGameAction ga_togglemap, ga_fullconsole, }; + +enum EPuffFlags +{ + PF_HITTHING = 1, + PF_MELEERANGE = 2, + PF_TEMPORARY = 4, + PF_HITTHINGBLEED = 8, + PF_NORANDOMZ = 16 +}; diff --git a/wadsrc/static/zscript/shared/inventory.txt b/wadsrc/static/zscript/shared/inventory.txt index dbede839f..5192b4c93 100644 --- a/wadsrc/static/zscript/shared/inventory.txt +++ b/wadsrc/static/zscript/shared/inventory.txt @@ -83,7 +83,6 @@ class StateProvider : Inventory native action native void A_ClearReFire(); action native void A_CheckReload(); action native void A_GunFlash(statelabel flash = null, int flags = 0); - action native void A_FireAssaultGun(); action native state A_CheckForReload(int counter, statelabel label, bool dontincrement = false); action native void A_ResetReloadCounter(); } diff --git a/wadsrc/static/zscript/strife/strifefunctions.txt b/wadsrc/static/zscript/strife/strifefunctions.txt index f95ebcfcc..7cfdf3974 100644 --- a/wadsrc/static/zscript/strife/strifefunctions.txt +++ b/wadsrc/static/zscript/strife/strifefunctions.txt @@ -1,4 +1,4 @@ -// common Strife action functions. +// common Strife action functions that are used by multiple different actors extend class Actor { @@ -177,5 +177,22 @@ extend class Actor } } + //============================================================================ + // + // A_RocketInFlight + // + //============================================================================ + + void A_RocketInFlight() + { + A_PlaySound ("misc/missileinflight", CHAN_VOICE); + SpawnPuff ("MiniMissilePuff", Pos, Angle - 180, Angle - 180, 2, PF_HITTHING); + Actor trail = Spawn("RocketTrail", Vec3Offset(-Vel.X, -Vel.Y, 0.), ALLOW_REPLACE); + if (trail != null) + { + trail.Vel.Z = 1; + } + } + } diff --git a/wadsrc/static/zscript/strife/strifeweapons.txt b/wadsrc/static/zscript/strife/strifeweapons.txt index a2475397d..ae0bc1284 100644 --- a/wadsrc/static/zscript/strife/strifeweapons.txt +++ b/wadsrc/static/zscript/strife/strifeweapons.txt @@ -50,177 +50,6 @@ class StrifeSpark : StrifePuff } } -// 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_SetRenderStyle(1, STYLE_Normal); - SMIS A 5 Bright A_Explode(64, 64, alert:true); - SMIS B 5 Bright; - SMIS C 4 Bright; - SMIS DEFG 2 Bright; - Stop; - } -} - // Flame Thrower ------------------------------------------------------------ class FlameThrower : StrifeWeapon diff --git a/wadsrc/static/zscript/strife/weaponassault.txt b/wadsrc/static/zscript/strife/weaponassault.txt new file mode 100644 index 000000000..c382d8e84 --- /dev/null +++ b/wadsrc/static/zscript/strife/weaponassault.txt @@ -0,0 +1,94 @@ +// 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; + } +} + +extend class StateProvider +{ + //============================================================================ + // + // A_FireAssaultGun + // + //============================================================================ + + void A_FireAssaultGun() + { + if (player == null) + { + return; + } + + A_PlaySound ("weapons/assaultgun", CHAN_WEAPON); + + Weapon weapon = player.ReadyWeapon; + if (weapon != null) + { + if (!weapon.DepleteAmmo (weapon.bAltFire)) + return; + } + player.mo.PlayAttacking2 (); + + int damage = 4*(random[StrifeGun]() % 3 + 1); + double ang = angle; + + if (player.refire) + { + ang += Random2[StrifeGun]() * (22.5 / 256) * AccuracyFactor(); + } + LineAttack (ang, PLAYERMISSILERANGE, BulletSlope (), damage, 'Hitscan', "StrifePuff"); + } +} + + +// Standing variant of the assault gun -------------------------------------- + +class AssaultGunStanding : WeaponGiver +{ + Default + { + DropItem "AssaultGun"; + Inventory.PickupMessage "$TXT_ASSAULTGUN"; + } + States + { + Spawn: + RIFL B -1; + Stop; + } +} + + diff --git a/wadsrc/static/zscript/strife/weaponmissile.txt b/wadsrc/static/zscript/strife/weaponmissile.txt new file mode 100644 index 000000000..589f75493 --- /dev/null +++ b/wadsrc/static/zscript/strife/weaponmissile.txt @@ -0,0 +1,137 @@ +// 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"; + } + + 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; + } + + //============================================================================ + // + // A_FireMiniMissile + // + //============================================================================ + + action void A_FireMiniMissile () + { + if (player == null) + { + return; + } + + Weapon weapon = player.ReadyWeapon; + if (weapon != null) + { + if (!weapon.DepleteAmmo (weapon.bAltFire)) + return; + } + + double savedangle = angle; + angle += Random2[MiniMissile]() * (11.25 / 256) * AccuracyFactor(); + player.mo.PlayAttacking2 (); + SpawnPlayerMissile ("MiniMissile"); + angle = savedangle; + } +} + + +// 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_SetRenderStyle(1, STYLE_Normal); + SMIS A 5 Bright A_Explode(64, 64, alert:true); + SMIS B 5 Bright; + SMIS C 4 Bright; + SMIS DEFG 2 Bright; + Stop; + } +} +