Add A_CanBob() function to weapons to force-enable bobbing within a state.

Use it sparingly in places where it should have been needed (Hellblazer and
Biospark pre/post fire, Hammer alt charge, MR overpressure charge).
Also, replace all instances of A_WeaponReady(WRF_NOFIRE|WRF_NOSWITCH) with it,
since that was basically the same thing but with extra steps (and with the side
effect of potentially resetting psprite offsets).
This commit is contained in:
Mari the Deer 2024-01-24 13:32:24 +01:00
commit aaa65af795
8 changed files with 75 additions and 44 deletions

View file

@ -125,6 +125,7 @@ Class ItamexHammer : SWWMWeapon
action void A_AltCharge()
{
A_CanBob();
invoker.charge = min(100.,invoker.charge+SWWMUtility.Lerp(4.,.5,(invoker.charge/100.)**.25));
double vibe = (invoker.charge/100.)**2.;
A_WeaponOffset(FRandom[Hammer](-.5,.5)*vibe,32+FRandom[Hammer](-.5,.5)*vibe,WOF_INTERPOLATE);
@ -132,6 +133,7 @@ Class ItamexHammer : SWWMWeapon
action State A_AltHold()
{
A_CanBob();
invoker.charge = min(100.,invoker.charge+SWWMUtility.Lerp(4.,.5,(invoker.charge/100.)**.25));
double vibe = (invoker.charge/100.)**2.;
A_WeaponOffset(FRandom[Hammer](-.5,.5)*vibe,32+FRandom[Hammer](-.5,.5)*vibe,WOF_INTERPOLATE);

View file

@ -655,6 +655,7 @@ Class MisterRifle : SWWMWeapon
action void A_MisterStartRail()
{
// pre-heat our ovens
A_CanBob();
A_StartSound("mister/chargeover",CHAN_WEAPON,CHANF_OVERLAP);
A_StartSound("mister/holdover",CHAN_WEAPONEXTRA,CHANF_LOOPING,.01,4.,.5);
invoker.prefirecnt = 0;
@ -662,6 +663,7 @@ Class MisterRifle : SWWMWeapon
action State A_MisterHoldRail()
{
A_CanBob();
if ( (invoker.prefirecnt < 100) && !(player.cmd.buttons&BT_ATTACK) )
{
invoker.prefirecnt = 0;
@ -1305,7 +1307,7 @@ Class MisterRifle : SWWMWeapon
Goto AutoCycle;
FireOverpressure:
XZW2 A 2 A_MisterStartRail();
XZW4 DEF 5;
XZW4 DEF 5 A_CanBob();
XZW4 F 1 A_MisterHoldRail();
Wait;
FireOverpressureRelease:

View file

@ -613,6 +613,14 @@ Class SWWMWeapon : Weapon abstract
player.SetPSprite(PSP_FLASH,null);
player.mo.BringUpWeapon();
}
// quick 'n dirty function to enable bobbing for the current state
// cleaner than using A_WeaponReady(WRF_NOFIRE|WRF_NOSWITCH), at least
action void A_CanBob( bool toggle = true )
{
if ( !player ) return;
if ( toggle ) player.weaponstate |= WF_WEAPONBOBBING;
else player.weaponstate &= ~WF_WEAPONBOBBING;
}
override void PlayUpSound( Actor origin )
{
if ( UpSound ) origin.A_StartSound(UpSound,CHAN_WEAPON,CHANF_OVERLAP);

View file

@ -393,6 +393,7 @@ Class Hellblazer : SWWMWeapon
return A_JumpX("Unload","Unload_G");
if ( player.cmd.buttons&BT_ATTACK )
{
A_CanBob();
invoker.preloadcnt++;
if ( (player.cmd.buttons&BT_ALTATTACK) || ((invoker.clipcount < 2) && (invoker.preloadcnt >= 10)) )
{
@ -440,6 +441,7 @@ Class Hellblazer : SWWMWeapon
return A_JumpX("Unload","Unload_G");
if ( player.cmd.buttons&BT_ALTATTACK )
{
A_CanBob();
invoker.preloadcnt++;
if ( (player.cmd.buttons&BT_ATTACK) || ((invoker.clipcount < 2) && (invoker.preloadcnt >= 10)) )
{
@ -478,19 +480,25 @@ Class Hellblazer : SWWMWeapon
XZW8 ABCD 2;
Goto Ready_G; // state jump to cycling is done elsewhere
PreLoad:
XZW2 A 10 A_StartSound("hellblazer/preload",CHAN_WEAPON,CHANF_OVERLAP);
XZW2 A 10
{
A_StartSound("hellblazer/preload",CHAN_WEAPON,CHANF_OVERLAP);
A_CanBob();
}
XZW2 A 2
{
invoker.magpos = (invoker.magpos+1)%6;
invoker.preload++;
A_GlassOverlay("Cycle_G");
A_CanBob();
}
XZW3 E 2;
XZW3 FGHI 2;
XZW3 I 0;
XZW3 FE 2;
XZW3 E 2 A_CanBob();
XZW3 FGHI 2 A_CanBob();
XZW3 I 0 A_CanBob();
XZW3 FE 2 A_CanBob();
XZW2 A 1
{
A_CanBob();
if ( !(player.cmd.buttons&BT_ATTACK) )
return A_JumpX("DoFire","DoFire_G");
if ( (player.cmd.buttons&BT_ALTATTACK) || (invoker.preload >= min(invoker.clipcount-1,2)) )
@ -499,19 +507,25 @@ Class Hellblazer : SWWMWeapon
}
Wait;
PreAltLoad:
XZW2 A 10 A_StartSound("hellblazer/preload",CHAN_WEAPON,CHANF_OVERLAP);
XZW2 A 10
{
A_StartSound("hellblazer/preload",CHAN_WEAPON,CHANF_OVERLAP);
A_CanBob();
}
XZW2 A 2
{
invoker.magpos = (invoker.magpos+1)%6;
invoker.preload++;
A_GlassOverlay("Cycle_G");
A_CanBob();
}
XZW3 E 2;
XZW3 FGHI 2;
XZW3 I 0;
XZW3 FE 2;
XZW3 E 2 A_CanBob();
XZW3 FGHI 2 A_CanBob();
XZW3 I 0 A_CanBob();
XZW3 FE 2 A_CanBob();
XZW2 A 1
{
A_CanBob();
if ( !(player.cmd.buttons&BT_ALTATTACK) )
return A_JumpX("DoAltFire","DoAltFire_G");
if ( (player.cmd.buttons&BT_ATTACK) || (invoker.preload >= min(invoker.clipcount-1,2)) )
@ -529,7 +543,7 @@ Class Hellblazer : SWWMWeapon
{
if ( !(player.cmd.buttons&BT_ATTACK) )
return A_JumpX("DoFire","DoFire_G");
A_WeaponReady(WRF_NOFIRE|WRF_NOSWITCH);
A_CanBob();
if ( (player.cmd.buttons&BT_ZOOM) && !(player.oldbuttons&BT_ZOOM) )
A_CheckLockOn();
if ( (player.cmd.buttons&BT_RELOAD) && !(player.oldbuttons&BT_RELOAD) )
@ -551,7 +565,7 @@ Class Hellblazer : SWWMWeapon
{
if ( !(player.cmd.buttons&BT_ALTATTACK) )
return A_JumpX("DoAltFire","DoAltFire_G");
A_WeaponReady(WRF_NOFIRE|WRF_NOSWITCH);
A_CanBob();
if ( (player.cmd.buttons&BT_ZOOM) && !(player.oldbuttons&BT_ZOOM) )
A_CheckLockOn();
if ( (player.cmd.buttons&BT_RELOAD) && !(player.oldbuttons&BT_RELOAD) )
@ -566,14 +580,15 @@ Class Hellblazer : SWWMWeapon
Cycle:
XZW2 A 2
{
A_CanBob();
invoker.spinskipped--;
invoker.magpos = (invoker.magpos+1)%6;
A_GlassOverlay("Cycle_G");
}
XZW3 E 2;
XZW3 FGHI 2;
XZW3 I 0;
XZW3 FE 2;
XZW3 E 2 A_CanBob();
XZW3 FGHI 2 A_CanBob();
XZW3 I 0 A_CanBob();
XZW3 FE 2 A_CanBob();
Goto Ready;
Cycle_G:
XZW7 A 2 A_StartSound("hellblazer/shift",CHAN_WEAPON,CHANF_OVERLAP);

View file

@ -274,20 +274,20 @@ Class Ynykron : SWWMWeapon
A_StartSound("ynykron/ventopen",CHAN_WEAPON,CHANF_OVERLAP);
A_BumpFOV(.995);
A_QuakeEx(1.2,1.2,1.2,6,0,15,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.2);
A_WeaponReady(WRF_NOFIRE|WRF_NOSWITCH);
A_CanBob();
}
XZWA ABCDEF 2 A_WeaponReady(WRF_NOFIRE|WRF_NOSWITCH);
XZWA ABCDEF 2 A_CanBob();
XZWA G 2
{
A_StartSound("ynykron/ventclose",CHAN_WEAPON,CHANF_OVERLAP);
A_WeaponReady(WRF_NOFIRE|WRF_NOSWITCH);
A_CanBob();
}
XZWA H 2 A_WeaponReady(WRF_NOFIRE|WRF_NOSWITCH);
XZWA H 2 A_CanBob();
XZWA I 2
{
A_BumpFOV(.99);
A_QuakeEx(1.4,1.4,1.4,6,0,15,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.3);
A_WeaponReady(WRF_NOFIRE|WRF_NOSWITCH);
A_CanBob();
}
Goto Ready;
ReadyVentSmoke:
@ -441,36 +441,36 @@ Class Ynykron : SWWMWeapon
A_OverlayFlags(PSP_WEAPON+1,PSPF_RENDERSTYLE|PSPF_ALPHA|PSPF_FORCESTYLE|PSPF_FORCEALPHA,true);
A_OverlayRenderStyle(PSP_WEAPON+1,STYLE_Add);
A_OverlayAlpha(PSP_WEAPON+1,0.);
A_WeaponReady(WRF_NOFIRE|WRF_NOSWITCH);
A_CanBob();
A_StartSound("ynykron/ventopen",CHAN_WEAPON,CHANF_OVERLAP);
}
XZW7 R 2 A_WeaponReady(WRF_NOFIRE|WRF_NOSWITCH);
XZW7 R 2 A_CanBob();
XZW7 S 2
{
A_BumpFOV(.995);
A_QuakeEx(1.2,1.2,1.2,6,0,15,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.2);
A_WeaponReady(WRF_NOFIRE|WRF_NOSWITCH);
A_CanBob();
}
XZW7 TUV 2 A_WeaponReady(WRF_NOFIRE|WRF_NOSWITCH);
XZW7 TUV 2 A_CanBob();
Discharging:
XZW7 W 2
{
A_WeaponReady(WRF_NOFIRE|WRF_NOSWITCH);
A_CanBob();
return A_JumpIf(invoker.chargestate==CS_IDLE,1);
}
Wait;
XZW7 W 3 A_WeaponReady(WRF_NOFIRE|WRF_NOSWITCH);
XZW7 W 3 A_CanBob();
XZW7 X 2
{
A_WeaponReady(WRF_NOFIRE|WRF_NOSWITCH);
A_CanBob();
A_StartSound("ynykron/ventclose",CHAN_WEAPON,CHANF_OVERLAP);
}
XZW7 Y 2 A_WeaponReady(WRF_NOFIRE|WRF_NOSWITCH);
XZW7 Y 2 A_CanBob();
XZW7 Z 2
{
A_BumpFOV(.99);
A_QuakeEx(1.4,1.4,1.4,6,0,15,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.3);
A_WeaponReady(WRF_NOFIRE|WRF_NOSWITCH);
A_CanBob();
}
Goto Ready;
DischargeSmoke:

View file

@ -297,13 +297,13 @@ Class Sparkster : SWWMWeapon
A_StartSound("biospark/prefire",CHAN_WEAPON,CHANF_OVERLAP);
return A_JumpIf(invoker.doublestacc,"DoubleFire");
}
XZW4 Y 12;
XZW4 Y 12 A_CanBob();
XZW4 Y 1 A_FireSpark(0);
XZW2 NOPQ 2;
Goto PreVent;
DoubleFire:
XZW5 Z 1;
XZW8 L 12;
XZW8 L 12 A_CanBob();
XZW8 L 1 A_FireSpark(0);
XZW7 EFGH 2;
Goto DoublePreVent;
@ -314,19 +314,20 @@ Class Sparkster : SWWMWeapon
A_StartSound("biospark/prefire",CHAN_WEAPON,CHANF_OVERLAP);
return A_JumpIf(invoker.doublestacc,"DoubleAltFire");
}
XZW4 Z 12;
XZW4 Z 12 A_CanBob();
XZW4 Z 1 A_FireSpark(1);
XZW2 RSTU 2;
Goto PreVent;
DoubleAltFire:
XZW5 Z 1;
XZW8 M 12;
XZW8 M 12 A_CanBob();
XZW8 M 1 A_FireSpark(1);
XZW7 IJKL 2;
Goto DoublePreVent;
PreVent:
XZW2 AAAAAAAA 1
{
A_CanBob();
if ( invoker.ClipCount > 0 )
{
if ( player.cmd.buttons&BT_ATTACK )
@ -340,6 +341,7 @@ Class Sparkster : SWWMWeapon
DoublePreVent:
XZW5 ZZZZZZZZ 1
{
A_CanBob();
if ( (invoker.ClipCount > 0) && (invoker.ClipCount%4) )
{
if ( player.cmd.buttons&BT_ATTACK )
@ -369,6 +371,7 @@ Class Sparkster : SWWMWeapon
Vent:
XZW2 A 8
{
A_CanBob();
A_Overlay(PSP_WEAPON+2,"VentFlash");
A_OverlayFlags(PSP_WEAPON+2,PSPF_RENDERSTYLE|PSPF_FORCESTYLE,true);
A_OverlayRenderStyle(PSP_WEAPON+2,STYLE_Add);
@ -378,6 +381,7 @@ Class Sparkster : SWWMWeapon
DoubleVent:
XZW5 Z 8
{
A_CanBob();
A_Overlay(PSP_WEAPON+2,"VentFlash");
A_OverlayFlags(PSP_WEAPON+2,PSPF_RENDERSTYLE|PSPF_FORCESTYLE,true);
A_OverlayRenderStyle(PSP_WEAPON+2,STYLE_Add);
@ -392,28 +396,28 @@ Class Sparkster : SWWMWeapon
XZW2 A 0 A_JumpIf(invoker.doublestacc,"DoubleZoom");
XZW2 A 0 A_JumpIf(invoker.ClipCount<2,"NoZoom");
XZW2 A 1 A_StartSound("biospark/prethird",CHAN_WEAPON,CHANF_OVERLAP);
XZW5 A 12;
XZW5 A 12 A_CanBob();
XZW5 A 1 A_FireSpark(2);
XZW2 VWXYZ 2;
Goto Ready;
DoubleZoom:
XZW5 Z 0 A_JumpIf((invoker.ClipCount<2)||((invoker.ClipCount>4)&&(invoker.ClipCount<6)),"DoubleNoZoom");
XZW5 Z 1 A_StartSound("biospark/prethird",CHAN_WEAPON,CHANF_OVERLAP);
XZW8 N 12;
XZW8 N 12 A_CanBob();
XZW8 N 1 A_FireSpark(2);
XZW7 MNOPQ 2;
Goto DoubleReady;
NoZoom:
XZW2 A 1 A_StartSound("biospark/prethird",CHAN_WEAPON,CHANF_OVERLAP);
XZW5 A 12;
XZW5 A 12 A_CanBob();
XZW5 A 8 A_FailZoom();
XZW2 A 20;
XZW2 A 20 A_CanBob();
Goto Ready;
DoubleNoZoom:
XZW5 Z 1 A_StartSound("biospark/prethird",CHAN_WEAPON,CHANF_OVERLAP);
XZW8 N 12;
XZW8 N 12 A_CanBob();
XZW8 N 8 A_FailZoom();
XZW5 Z 20;
XZW5 Z 20 A_CanBob();
Goto DoubleReady;
Reload:
XZW2 A 0

View file

@ -884,7 +884,7 @@ Class DualExplodiumGun : SWWMWeapon
player.SetPSprite(PSP_WEAPON+1,ResolveState("LeftFire"));
// allow bobbing while the right weapon reloads
if ( !sis.CurState.InStateSequence(ResolveState("Fire")) && !sis.CurState.InStateSequence(ResolveState("FireLast")) )
A_WeaponReady(WRF_NOFIRE|WRF_NOSWITCH);
A_CanBob();
}
Wait;
Fire: