Rejoice, "hold to reload" is now optional and disabled by default.

This commit is contained in:
Mari the Deer 2025-03-16 20:21:09 +01:00
commit 13ed4dee44
8 changed files with 52 additions and 5 deletions

View file

@ -12,6 +12,12 @@ Class Quadravol : SWWMWeapon
int wastecycle; // for easter egg
override void DoEffect()
{
Super.DoEffect();
CheckStopReload('ReloadHold','LoadOverlay');
}
override bool ReportHUDAmmo()
{
return (chargelevel>0)||(chambered&&!charged)||(clipcount>0)||(Ammo1.Amount > 0);
@ -526,6 +532,7 @@ Class Quadravol : SWWMWeapon
Reload:
XZW2 A 2
{
invoker.stopreload = false;
if ( (invoker.clipcount >= invoker.default.clipcount) || ((invoker.Ammo1.Amount <= 0) && !sv_infiniteammo && !FindInventory('PowerInfiniteAmmo',true)) )
return invoker.onehand?ResolveState('Idle1H'):ResolveState('Idle');
if ( invoker.onehand ) return ResolveState('Reload1H');
@ -551,7 +558,9 @@ Class Quadravol : SWWMWeapon
if ( invoker.fromfire && (player.cmd.buttons&BT_ATTACK) )
return ResolveState('ReloadHold');
invoker.fromfire = false;
if ( player.cmd.buttons&BT_RELOAD ) return ResolveState('ReloadHold');
bool holdreload = CVar.GetCVar('swwm_holdreload',player).GetBool();
if ( (!holdreload && !invoker.stopreload) || (holdreload && (player.cmd.buttons&BT_RELOAD)) )
return ResolveState('ReloadHold');
return A_JumpIf(invoker.onehand,'ReloadEnd1H');
}
XZW6 B 2 A_StartSound("quadshot/twohand",CHAN_WEAPON,CHANF_OVERLAP);

View file

@ -31,6 +31,8 @@ Class SWWMWeapon : Weapon abstract
Vector3 bvdir;
int bvtics, batics;
transient bool stopreload;
bool IsSwapWeapon( Inventory i ) const
{
if ( bNoSwapWeapon || (i.GetClass() == GetClass()) ) return false;
@ -234,6 +236,32 @@ Class SWWMWeapon : Weapon abstract
}
}
// check if the player has tapped any of the weapon buttons (not just reload)
// (used to cancel reloads when not in hold mode)
private bool TapOutReload()
{
if ( !Owner || !Owner.player ) return false;
bool rslt = (Owner.player.cmd.buttons&BT_RELOAD)&&!(Owner.player.oldbuttons&BT_RELOAD);
rslt |= (Owner.player.cmd.buttons&BT_ATTACK)&&!(Owner.player.oldbuttons&BT_ATTACK);
rslt |= (Owner.player.cmd.buttons&BT_ALTATTACK)&&!(Owner.player.oldbuttons&BT_ALTATTACK);
rslt |= (Owner.player.cmd.buttons&BT_ZOOM)&&!(Owner.player.oldbuttons&BT_ZOOM);
rslt |= (Owner.player.cmd.buttons&BT_USER1)&&!(Owner.player.oldbuttons&BT_USER1);
return rslt;
}
// check for the button tap within two specific states
// to be called inside DoEffect()
protected void CheckStopReload( StateLabel first, StateLabel last )
{
if ( !stopreload && Owner && Owner.player && (Owner.player.ReadyWeapon == self) && !(CVar.GetCVar('swwm_holdreload',Owner.player).GetBool()) )
{
let firststate = FindState(first);
let laststate = FindState(last);
let psp = Owner.player.FindPSprite(PSP_WEAPON);
if ( psp && psp.curstate && (firststate.DistanceTo(psp.curstate) > 0) && (laststate.DistanceTo(psp.curstate) < 0) )
stopreload |= TapOutReload();
}
}
// subtracts given ammo from price, drops excess
virtual bool PickupForAmmoSWWM( SWWMWeapon ownedWeapon )
{

View file

@ -11,6 +11,7 @@ Class Wallbuster : SWWMWeapon
override void DoEffect()
{
Super.DoEffect();
CheckStopReload('Detach','EndReload');
// push back selection order if weapon is unloaded
if ( !bInitialized )
{
@ -576,6 +577,7 @@ Class Wallbuster : SWWMWeapon
Detach:
XZW4 W 0
{
invoker.stopreload = false;
int rnum = GetShellsToLoad();
// if it's a full rotation, don't hand-spin
if ( rnum > 20 ) return ResolveState(null);
@ -650,8 +652,10 @@ Class Wallbuster : SWWMWeapon
XZW6 C 2 A_LoadShell();
XZW6 E 0
{
int rnum = (player.cmd.buttons&BT_RELOAD)?GetShellsToLoad():0;
player.SetPSprite(-9999,null);
int rnum = 0;
bool holdreload = CVar.GetCVar('swwm_holdreload',player).GetBool();
if ( (!holdreload && !invoker.stopreload) || (holdreload && (player.cmd.buttons&BT_RELOAD)) )
rnum = GetShellsToLoad();
return A_JumpIf(rnum,'AttachSpin');
}
Goto Attach;