From 13ed4dee44764d67a48530deaf13bbe73d3dff57 Mon Sep 17 00:00:00 2001 From: Marisa the Magician Date: Sun, 16 Mar 2025 20:21:09 +0100 Subject: [PATCH] Rejoice, "hold to reload" is now optional and disabled by default. --- cvarinfo.base | 1 + language.def_menu | 2 ++ language.es_menu | 2 ++ language.version | 4 ++-- menudef.txt | 1 + zscript/dlc/swwm_notashotgun.zsc | 11 ++++++++++- zscript/weapons/swwm_baseweapon.zsc | 28 ++++++++++++++++++++++++++++ zscript/weapons/swwm_cbt.zsc | 8 ++++++-- 8 files changed, 52 insertions(+), 5 deletions(-) diff --git a/cvarinfo.base b/cvarinfo.base index 47841c7df..c4d55002f 100644 --- a/cvarinfo.base +++ b/cvarinfo.base @@ -83,6 +83,7 @@ nosave int swwm_hudscale1 = 0; // force the "one minus" scale of the HUD (used nosave int swwm_hudscale2 = 0; // force the "two minus" scale of the HUD (used by interest points) server bool swwm_altclear = false; // use an alternate, less graphically demanding "All Clear" effect user bool swwm_analogmove = false; // for gamepad users, player movement is adapted for analog sticks +user bool swwm_holdreload = false; // hold the reload key to top up hand-loaded weapons, otherwise tap to start then tap again to stop // minimap settings nosave bool swwm_mm_enable = true; // show a minimap on the top right corner of the hud diff --git a/language.def_menu b/language.def_menu index eccb567ef..ae3fd26cd 100644 --- a/language.def_menu +++ b/language.def_menu @@ -193,6 +193,7 @@ SWWM_HS_AUTOL = "Auto Loose"; SWWM_HS_AUTOT = "Auto Tight"; SWWM_ALTCLEAR = "Alternate 100% FX"; SWWM_ANALOGMOVE = "Analog Movement"; +SWWM_HOLDRELOAD = "Hold To Reload"; SWWM_MM_ENABLE = "Show Minimap"; SWWM_MM_MISSILES = "Projectiles In Minimap"; SWWM_MM_USECANVAS = "Fixed Scale Minimap"; @@ -285,6 +286,7 @@ TOOLTIP_SWWM_HUDSCALE1 = "If higher than zero, manually set the scale of Healthb TOOLTIP_SWWM_HUDSCALE2 = "If higher than zero, manually set the scale of Interest Points. Usually, this is two less than the primary HUD scale."; TOOLTIP_SWWM_ALTCLEAR = "Use an alternate, less visually intense effect for getting 100% completion on a level."; TOOLTIP_SWWM_ANALOGMOVE = "For gamepad users, this is a must. For keyboard and mouse users, this should be disabled."; +TOOLTIP_SWWM_HOLDRELOAD = "If enabled, you must keep the reload button held load multiple rounds in the Wallbuster, Quadravol and Sparkster Rifle. Some people actually like it that way."; TOOLTIP_SWWMACHIEVEMENTMENU = "View your achievements."; TOOLTIP_SWWM_MM_ENABLE = "Displays a minimap on the top right corner of the screen."; TOOLTIP_SWWM_MM_MISSILES = "Displays projectiles in the minimap. Can be toggled if this clutters too much."; diff --git a/language.es_menu b/language.es_menu index a98178777..59d1cf9bd 100644 --- a/language.es_menu +++ b/language.es_menu @@ -187,6 +187,7 @@ SWWM_HS_AUTOL = "Auto. Holgado"; SWWM_HS_AUTOT = "Auto. Ceñido"; SWWM_ALTCLEAR = "Efecto Alternativo de 100%"; SWWM_ANALOGMOVE = "Movimiento Analógico"; +SWWM_HOLDRELOAD = "Mantener Para Recarga"; SWWM_MM_ENABLE = "Mostrar Minimapa"; SWWM_MM_MISSILES = "Proyectiles en Minimapa"; SWWM_MM_USECANVAS = "Minimapa a Escala Fija"; @@ -280,6 +281,7 @@ TOOLTIP_SWWM_HUDSCALE1 = "Si es mayor que cero, especifica manualmente la escala TOOLTIP_SWWM_HUDSCALE2 = "Si es mayor que cero, especifica manualmente la escala de los Puntos de Interés. Normalmente, es igual a tres menos que la escala primaria del HUD."; TOOLTIP_SWWM_ALTCLEAR = "Usa un efecto alternativo de menor intensidad visual al completar un nivel al 100%."; TOOLTIP_SWWM_ANALOGMOVE = "Para usuarios de mando, esto es esencial. Para usuarios de teclado y ratón, esto debería estar desactivado."; +TOOLTIP_SWWM_HOLDRELOAD = "Al activar, debes mantener el boton de recarga para cargar múltiples cartuchos en la Wallbuster, Quadravol o el Rifle Sparkster. Algunas personas lo prefieren así."; TOOLTIP_SWWMACHIEVEMENTMENU = "Revisa tus logros."; TOOLTIP_SWWM_MM_ENABLE = "Muestra un minimapa en la esquina superior derecha de la pantalla."; TOOLTIP_SWWM_MM_MISSILES = "Muestra proyectiles en el minimapa. Puede ser desactivado si causa problemas de visibilidad."; diff --git a/language.version b/language.version index 147c15c5e..f4d5e2caf 100644 --- a/language.version +++ b/language.version @@ -1,3 +1,3 @@ [default] -SWWM_MODVER="\cyDEMOLITIONIST \cw1.3pre r1203 \cu(dom 16 mar 2025 16:14:34 CET)\c-"; -SWWM_SHORTVER="\cw1.3pre r1203 \cu(2025-03-16 16:14:34)\c-"; +SWWM_MODVER="\cyDEMOLITIONIST \cw1.3pre r1204 \cu(dom 16 mar 2025 20:21:10 CET)\c-"; +SWWM_SHORTVER="\cw1.3pre r1204 \cu(2025-03-16 20:21:10)\c-"; diff --git a/menudef.txt b/menudef.txt index 2da4323ec..45f384ee9 100644 --- a/menudef.txt +++ b/menudef.txt @@ -205,6 +205,7 @@ OptionMenu "SWWMOptionMenu" Option "$SWWM_USEWEAPONBAR", "swwm_useweaponbar", "YesNo" Option "$SWWM_USETOPICKUP", "swwm_usetopickup", "YesNo" Option "$SWWM_SINGLEFIRST", "swwm_singlefirst", "YesNo" + Option "$SWWM_HOLDRELOAD", "swwm_holdreload", "YesNo" Option "$SWWM_COLLECTANIM", "swwm_collectanim", "YesNo" Option "$SWWM_WEAPONTOOLTIPS", "swwm_weapontooltips", "YesNo" SafeCommand "$SWWM_RESETTOOLTIPS", "event swwmresettooltips" diff --git a/zscript/dlc/swwm_notashotgun.zsc b/zscript/dlc/swwm_notashotgun.zsc index 07d60e0f9..da5cb1404 100644 --- a/zscript/dlc/swwm_notashotgun.zsc +++ b/zscript/dlc/swwm_notashotgun.zsc @@ -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); diff --git a/zscript/weapons/swwm_baseweapon.zsc b/zscript/weapons/swwm_baseweapon.zsc index f5c412576..17eaa45a4 100644 --- a/zscript/weapons/swwm_baseweapon.zsc +++ b/zscript/weapons/swwm_baseweapon.zsc @@ -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 ) { diff --git a/zscript/weapons/swwm_cbt.zsc b/zscript/weapons/swwm_cbt.zsc index eaac11234..5727b9e24 100644 --- a/zscript/weapons/swwm_cbt.zsc +++ b/zscript/weapons/swwm_cbt.zsc @@ -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;