diff --git a/src/p_pspr.cpp b/src/p_pspr.cpp index 725744d37..c443ca7da 100644 --- a/src/p_pspr.cpp +++ b/src/p_pspr.cpp @@ -36,7 +36,6 @@ // MACROS ------------------------------------------------------------------ #define LOWERSPEED 6. -#define RAISESPEED 6. // TYPES ------------------------------------------------------------------- @@ -507,6 +506,13 @@ void P_BringUpWeapon (player_t *player) } } +DEFINE_ACTION_FUNCTION(_PlayerInfo, BringUpWeapon) +{ + PARAM_SELF_STRUCT_PROLOGUE(player_t); + P_BringUpWeapon(self); + return 0; +} + //--------------------------------------------------------------------------- // // PROC P_FireWeapon @@ -603,6 +609,12 @@ void P_DropWeapon (player_t *player) } } +DEFINE_ACTION_FUNCTION(_PlayerInfo, DropWeapon) +{ + PARAM_SELF_STRUCT_PROLOGUE(player_t); + P_DropWeapon(self); + return 0; +} //============================================================================ // // P_BobWeapon @@ -999,40 +1011,6 @@ void A_ReFire(AActor *self, FState *state) } } -DEFINE_ACTION_FUNCTION(AStateProvider, A_ClearReFire) -{ - PARAM_ACTION_PROLOGUE(AStateProvider); - player_t *player = self->player; - - if (NULL != player) - { - player->refire = 0; - } - return 0; -} - -//--------------------------------------------------------------------------- -// -// PROC A_CheckReload -// -// Present in Doom, but unused. Also present in Strife, and actually used. -// This and what I call A_XBowReFire are actually the same thing in Strife, -// not two separate functions as I have them here. -// -//--------------------------------------------------------------------------- - -DEFINE_ACTION_FUNCTION(AStateProvider, A_CheckReload) -{ - PARAM_ACTION_PROLOGUE(AStateProvider); - - if (self->player != NULL) - { - self->player->ReadyWeapon->CheckAmmo ( - self->player->ReadyWeapon->bAltFire ? AWeapon::AltFire - : AWeapon::PrimaryFire, true); - } - return 0; -} //--------------------------------------------------------------------------- // @@ -1206,95 +1184,6 @@ DEFINE_ACTION_FUNCTION(AActor, OverlayID) -//--------------------------------------------------------------------------- -// -// PROC A_Lower -// -//--------------------------------------------------------------------------- - -DEFINE_ACTION_FUNCTION(AStateProvider, A_Lower) -{ - PARAM_ACTION_PROLOGUE(AStateProvider); - - player_t *player = self->player; - DPSprite *psp; - - if (nullptr == player) - { - return 0; - } - if (nullptr == player->ReadyWeapon) - { - P_BringUpWeapon(player); - return 0; - } - psp = player->GetPSprite(PSP_WEAPON); - if (player->morphTics || player->cheats & CF_INSTANTWEAPSWITCH) - { - psp->y = WEAPONBOTTOM; - } - else - { - psp->y += LOWERSPEED; - } - if (psp->y < WEAPONBOTTOM) - { // Not lowered all the way yet - return 0; - } - if (player->playerstate == PST_DEAD) - { // Player is dead, so don't bring up a pending weapon - // Player is dead, so keep the weapon off screen - P_SetPsprite(player, PSP_FLASH, nullptr); - psp->SetState(player->ReadyWeapon->FindState(NAME_DeadLowered)); - return 0; - } - // [RH] Clear the flash state. Only needed for Strife. - P_SetPsprite(player, PSP_FLASH, nullptr); - P_BringUpWeapon (player); - return 0; -} - -//--------------------------------------------------------------------------- -// -// PROC A_Raise -// -//--------------------------------------------------------------------------- - -DEFINE_ACTION_FUNCTION(AStateProvider, A_Raise) -{ - PARAM_ACTION_PROLOGUE(AStateProvider); - - if (self == nullptr) - { - return 0; - } - player_t *player = self->player; - DPSprite *psp; - - if (nullptr == player) - { - return 0; - } - if (player->PendingWeapon != WP_NOCHANGE) - { - P_DropWeapon(player); - return 0; - } - if (player->ReadyWeapon == nullptr) - { - return 0; - } - psp = player->GetPSprite(PSP_WEAPON); - psp->y -= RAISESPEED; - if (psp->y > WEAPONTOP) - { // Not raised all the way yet - return 0; - } - psp->y = WEAPONTOP; - psp->SetState(player->ReadyWeapon->GetReadyState()); - return 0; -} - //--------------------------------------------------------------------------- // // PROC A_Overlay @@ -1364,47 +1253,6 @@ DEFINE_ACTION_FUNCTION(AActor, A_ClearOverlays) ACTION_RETURN_INT(count); } -// -// A_GunFlash -// -enum GF_Flags -{ - GFF_NOEXTCHANGE = 1, -}; - -DEFINE_ACTION_FUNCTION(AStateProvider, A_GunFlash) -{ - PARAM_ACTION_PROLOGUE(AStateProvider); - PARAM_STATE_ACTION_DEF(flash); - PARAM_INT_DEF(flags); - - player_t *player = self->player; - - if (nullptr == player) - { - return 0; - } - if (!(flags & GFF_NOEXTCHANGE)) - { - player->mo->PlayAttacking2 (); - } - if (flash == nullptr) - { - if (player->ReadyWeapon->bAltFire) - { - flash = player->ReadyWeapon->FindState(NAME_AltFlash); - } - if (flash == nullptr) - { - flash = player->ReadyWeapon->FindState(NAME_Flash); - } - } - P_SetPsprite(player, PSP_FLASH, flash); - return 0; -} - - - // // WEAPON ATTACKS // @@ -1450,20 +1298,6 @@ DEFINE_ACTION_FUNCTION(AActor, BulletSlope) ACTION_RETURN_FLOAT(P_BulletSlope(self, t, aimflags).Degrees); } - -AActor *P_AimTarget(AActor *mo) -{ - FTranslatedLineTarget t; - P_BulletSlope(mo, &t, ALF_PORTALRESTRICT); - return t.linetarget; -} - -DEFINE_ACTION_FUNCTION(AActor, AimTarget) -{ - PARAM_SELF_PROLOGUE(AActor); - ACTION_RETURN_OBJECT(P_AimTarget(self)); -} - //------------------------------------------------------------------------ // // PROC P_SetupPsprites diff --git a/wadsrc/static/zscript.txt b/wadsrc/static/zscript.txt index 6f0e3a516..7cd9722bc 100644 --- a/wadsrc/static/zscript.txt +++ b/wadsrc/static/zscript.txt @@ -8,6 +8,7 @@ #include "zscript/inventory/inventory.txt" #include "zscript/inventory/inv_misc.txt" +#include "zscript/inventory/stateprovider.txt" #include "zscript/inventory/weapons.txt" #include "zscript/inventory/weaponpiece.txt" #include "zscript/inventory/armor.txt" diff --git a/wadsrc/static/zscript/actor.txt b/wadsrc/static/zscript/actor.txt index a5087345b..9ae0126eb 100644 --- a/wadsrc/static/zscript/actor.txt +++ b/wadsrc/static/zscript/actor.txt @@ -373,7 +373,7 @@ class Actor : Thinker native native void SetXYZ(vector3 newpos); native Actor GetPointer(int aaptr); native double BulletSlope(out FTranslatedLineTarget pLineTarget = null, int aimflags = 0); - native Actor AimTarget(); + native bool CheckMissileSpawn(double maxdist); native bool CheckPosition(Vector2 pos, bool actorsonly = false, FCheckPosition tm = null); native bool TestMobjLocation(); @@ -692,6 +692,12 @@ class Actor : Thinker native return true; } + Actor AimTarget() + { + FTranslatedLineTarget t; + BulletSlope(t, ALF_PORTALRESTRICT); + return t.linetarget; + } native void A_Face(Actor faceto, double max_turn = 0, double max_pitch = 270, double ang_offset = 0, double pitch_offset = 0, int flags = 0, double z_ofs = 0); diff --git a/wadsrc/static/zscript/inventory/inventory.txt b/wadsrc/static/zscript/inventory/inventory.txt index 2b0d6d0c7..ea76ab1d9 100644 --- a/wadsrc/static/zscript/inventory/inventory.txt +++ b/wadsrc/static/zscript/inventory/inventory.txt @@ -194,25 +194,6 @@ class Inventory : Actor native } -class StateProvider : Inventory native -{ - action native state A_JumpIfNoAmmo(statelabel label); - action native void A_CustomPunch(int damage, bool norandom = false, int flags = CPF_USEAMMO, class pufftype = "BulletPuff", double range = 0, double lifesteal = 0, int lifestealmax = 0, class armorbonustype = "ArmorBonus", sound MeleeSound = 0, sound MissSound = ""); - action native void A_FireBullets(double spread_xy, double spread_z, int numbullets, int damageperbullet, class pufftype = "BulletPuff", int flags = 1, double range = 0, class missile = null, double Spawnheight = 32, double Spawnofs_xy = 0); - action native void A_FireProjectile(class missiletype, double angle = 0, bool useammo = true, double spawnofs_xy = 0, double spawnheight = 0, int flags = 0, double pitch = 0); - action native void A_RailAttack(int damage, int spawnofs_xy = 0, bool useammo = true, color color1 = 0, color color2 = 0, int flags = 0, double maxdiff = 0, class pufftype = "BulletPuff", double spread_xy = 0, double spread_z = 0, double range = 0, int duration = 0, double sparsity = 1.0, double driftspeed = 1.0, class spawnclass = "none", double spawnofs_z = 0, int spiraloffset = 270, int limit = 0); - action native void A_WeaponReady(int flags = 0); - action native void A_Lower(); - action native void A_Raise(); - - action native void A_ReFire(statelabel flash = null); - action native void A_ClearReFire(); - action native void A_CheckReload(); - action native void A_GunFlash(statelabel flash = null, int flags = 0); - action native state A_CheckForReload(int counter, statelabel label, bool dontincrement = false); - action native void A_ResetReloadCounter(); -} - class DehackedPickup : Inventory native { } @@ -221,11 +202,3 @@ class FakeInventory : Inventory native { native bool Respawnable; } - -class CustomInventory : StateProvider native -{ - Default - { - DefaultStateUsage SUF_ACTOR|SUF_OVERLAY|SUF_ITEM; - } -} diff --git a/wadsrc/static/zscript/inventory/stateprovider.txt b/wadsrc/static/zscript/inventory/stateprovider.txt new file mode 100644 index 000000000..fe5d39bac --- /dev/null +++ b/wadsrc/static/zscript/inventory/stateprovider.txt @@ -0,0 +1,39 @@ + +class StateProvider : Inventory native +{ + action native state A_JumpIfNoAmmo(statelabel label); + action native void A_CustomPunch(int damage, bool norandom = false, int flags = CPF_USEAMMO, class pufftype = "BulletPuff", double range = 0, double lifesteal = 0, int lifestealmax = 0, class armorbonustype = "ArmorBonus", sound MeleeSound = 0, sound MissSound = ""); + action native void A_FireBullets(double spread_xy, double spread_z, int numbullets, int damageperbullet, class pufftype = "BulletPuff", int flags = 1, double range = 0, class missile = null, double Spawnheight = 32, double Spawnofs_xy = 0); + action native void A_FireProjectile(class missiletype, double angle = 0, bool useammo = true, double spawnofs_xy = 0, double spawnheight = 0, int flags = 0, double pitch = 0); + action native void A_RailAttack(int damage, int spawnofs_xy = 0, bool useammo = true, color color1 = 0, color color2 = 0, int flags = 0, double maxdiff = 0, class pufftype = "BulletPuff", double spread_xy = 0, double spread_z = 0, double range = 0, int duration = 0, double sparsity = 1.0, double driftspeed = 1.0, class spawnclass = "none", double spawnofs_z = 0, int spiraloffset = 270, int limit = 0); + action native void A_WeaponReady(int flags = 0); + + action native void A_ReFire(statelabel flash = null); + action native state A_CheckForReload(int counter, statelabel label, bool dontincrement = false); + action native void A_ResetReloadCounter(); +} + +class CustomInventory : StateProvider native +{ + Default + { + DefaultStateUsage SUF_ACTOR|SUF_OVERLAY|SUF_ITEM; + } + + //--------------------------------------------------------------------------- + // + // + //--------------------------------------------------------------------------- + + action void A_ClearReFire() + { + if (NULL != player) player.refire = 0; + } + + + // This is only here, because these functions were originally exported on Inventory, despite only working for weapons, so this is here to satisfy some potential old mods having called it through CustomInventory. + deprecated action void A_GunFlash(statelabel flash = null, int flags = 0) {} + deprecated action void A_Lower() {} + deprecated action void A_Raise() {} + deprecated action void A_CheckReload() {} +} diff --git a/wadsrc/static/zscript/inventory/weapons.txt b/wadsrc/static/zscript/inventory/weapons.txt index 303dc6aa9..bf514b70a 100644 --- a/wadsrc/static/zscript/inventory/weapons.txt +++ b/wadsrc/static/zscript/inventory/weapons.txt @@ -85,6 +85,129 @@ class Weapon : StateProvider native return s; } + action void A_GunFlash(statelabel flashlabel = null, int flags = 0) + { + let player = player; + + if (null == player || player.ReadyWeapon == null) + { + return; + } + if (!(flags & GFF_NOEXTCHANGE)) + { + player.mo.PlayAttacking2 (); + } + if (flashlabel == null) + { + if (player.ReadyWeapon.bAltFire) + { + flashlabel = 'AltFlash'; + } + if (flashlabel == null) + { + flashlabel = 'Flash'; + } + } + player.SetPsprite(PSP_FLASH, player.ReadyWeapon.FindState(flashlabel)); + } + + //--------------------------------------------------------------------------- + // + // PROC A_Lower + // + //--------------------------------------------------------------------------- + + action void A_Lower(int lowerspeed = 6) + { + let player = player; + + if (null == player) + { + return; + } + if (null == player.ReadyWeapon) + { + player.BringUpWeapon(); + return; + } + let psp = player.GetPSprite(PSP_WEAPON); + if (player.morphTics || player.cheats & CF_INSTANTWEAPSWITCH) + { + psp.y = WEAPONBOTTOM; + } + else + { + psp.y += lowerspeed; + } + if (psp.y < WEAPONBOTTOM) + { // Not lowered all the way yet + return; + } + if (player.playerstate == PST_DEAD) + { // Player is dead, so don't bring up a pending weapon + // Player is dead, so keep the weapon off screen + player.SetPsprite(PSP_FLASH, null); + psp.SetState(player.ReadyWeapon.FindState('DeadLowered')); + return; + } + // [RH] Clear the flash state. Only needed for Strife. + player.SetPsprite(PSP_FLASH, null); + player.BringUpWeapon (); + return; + } + + //--------------------------------------------------------------------------- + // + // PROC A_Raise + // + //--------------------------------------------------------------------------- + + action void A_Raise(int raisespeed = 6) + { + let player = player; + + if (null == player) + { + return; + } + if (player.PendingWeapon != WP_NOCHANGE) + { + player.DropWeapon(); + return; + } + if (player.ReadyWeapon == null) + { + return; + } + let psp = player.GetPSprite(PSP_WEAPON); + psp.y -= raisespeed; + if (psp.y > WEAPONTOP) + { // Not raised all the way yet + return; + } + psp.y = WEAPONTOP; + psp.SetState(player.ReadyWeapon.GetReadyState()); + return; + } + + //--------------------------------------------------------------------------- + // + // PROC A_CheckReload + // + // Present in Doom, but unused. Also present in Strife, and actually used. + // + //--------------------------------------------------------------------------- + + action void A_CheckReload() + { + let player = self.player; + if (player != NULL) + { + player.ReadyWeapon.CheckAmmo (player.ReadyWeapon.bAltFire ? Weapon.AltFire : Weapon.PrimaryFire, true); + } + } + + native action void A_ZoomFactor(double scale = 1, int flags = 0); native action void A_SetCrosshair(int xhair); const ZOOM_INSTANT = 1; diff --git a/wadsrc/static/zscript/shared/player.txt b/wadsrc/static/zscript/shared/player.txt index 25261c53e..b9feb6cd0 100644 --- a/wadsrc/static/zscript/shared/player.txt +++ b/wadsrc/static/zscript/shared/player.txt @@ -308,5 +308,7 @@ userinfo_t userinfo; native void SetLogNumber (int text); native void SetLogText (String text); native String GetUserName(); + native void DropWeapon(); + native void BringUpWeapon(); }