From dbf802165ec9375c9851ffe7a41461f271c4dd6f Mon Sep 17 00:00:00 2001 From: Marisa Kirisame Date: Sun, 8 Aug 2021 20:14:09 +0200 Subject: [PATCH] Explodium Gun starts unchambered (otherwise a certain animation will never be seen). Gross hackery regarding pistol starts. --- language.version | 4 +-- zscript/handler/swwm_handler_playerevents.zsc | 10 +++++- zscript/swwm_player.zsc | 3 +- zscript/weapons/swwm_baseweapon.zsc | 17 ++++++++++ zscript/weapons/swwm_splode.zsc | 34 +++++++++++++++++-- 5 files changed, 60 insertions(+), 8 deletions(-) diff --git a/language.version b/language.version index da6006876..e1e974f58 100644 --- a/language.version +++ b/language.version @@ -1,3 +1,3 @@ [default] -SWWM_MODVER="\chSWWM \czGZ\c- \cw0.9.11b-pre r588 \cu(Sun 8 Aug 19:32:39 CEST 2021)\c-"; -SWWM_SHORTVER="\cw0.9.11b-pre r588 \cu(2021-08-08 19:32:39)\c-"; +SWWM_MODVER="\chSWWM \czGZ\c- \cw0.9.11b-pre r588 \cu(Sun 8 Aug 20:14:09 CEST 2021)\c-"; +SWWM_SHORTVER="\cw0.9.11b-pre r588 \cu(2021-08-08 20:14:09)\c-"; diff --git a/zscript/handler/swwm_handler_playerevents.zsc b/zscript/handler/swwm_handler_playerevents.zsc index ca3599252..4c5ab6f78 100644 --- a/zscript/handler/swwm_handler_playerevents.zsc +++ b/zscript/handler/swwm_handler_playerevents.zsc @@ -121,9 +121,17 @@ extend Class SWWMHandler c.Destroy(); } // reset inventory (including unclearables) on forced pistol starts (must have visited at least one map, though) - // known bug: the previous weapon will play its select sound regardless, this is ENTIRELY IMPOSSIBLE to fix if ( p.mo.FindInventory("InventoryWipeToken") || (swwm_pistolstart && (s.lstats.Size() > 0) && ((s.lastcluster != level.cluster) || !(level.clusterflags&LevelLocals.CLUSTER_HUB))) ) SWWMUtility.WipeInventory(p.mo,swwm_resetscore); + // play the select sound of the current weapon if we travelled + if ( (p.ReadyWeapon is 'SWWMWeapon') && SWWMWeapon(p.ReadyWeapon).hastravelled ) + SWWMWeapon(p.ReadyWeapon).autoupsnd = level.maptime+1; + // reset the travelled flag for all weapons + for ( Inventory i=p.mo.inv; i; i=i.inv ) + { + if ( !SWWMWeapon(i) ) continue; + SWWMWeapon(i).hastravelled = false; + } } override void PlayerRespawned( PlayerEvent e ) diff --git a/zscript/swwm_player.zsc b/zscript/swwm_player.zsc index 189c4f1fc..bb3b43cf6 100644 --- a/zscript/swwm_player.zsc +++ b/zscript/swwm_player.zsc @@ -414,8 +414,7 @@ Class Demolitionist : PlayerPawn dp.AttachToOwner(self); let eg = ExplodiumGun(Spawn('ExplodiumGun')); eg.AttachToOwner(self); - eg.chambered = true; - DualExplodiumGun(eg.SisterWeapon).chambered = true; + eg.firstselect = true; player.ReadyWeapon = player.PendingWeapon = eg; // in hexdd, we start with the chaos sphere in our grasp if ( SWWMUtility.IsDeathkings() && SWWMUtility.CheckMD5List("vanillahexen.list") ) diff --git a/zscript/weapons/swwm_baseweapon.zsc b/zscript/weapons/swwm_baseweapon.zsc index d7831fa4b..ca3472904 100644 --- a/zscript/weapons/swwm_baseweapon.zsc +++ b/zscript/weapons/swwm_baseweapon.zsc @@ -6,6 +6,8 @@ Class SWWMWeapon : Weapon abstract bool wasused; bool bUsePickup; + transient bool hastravelled; + transient int autoupsnd; private int SWeaponFlags; Class dropammotype; @@ -333,8 +335,23 @@ Class SWWMWeapon : Weapon abstract } override void PlayUpSound( Actor origin ) { + if ( hastravelled ) return; if ( UpSound ) origin.A_StartSound(UpSound,CHAN_WEAPON,CHANF_OVERLAP); } + override void Travelled() + { + Super.Travelled(); + hastravelled = true; + } + override void Tick() + { + Super.Tick(); + if ( Owner && autoupsnd && (level.maptime >= autoupsnd) ) + { + autoupsnd = 0; + PlayUpSound(Owner); + } + } action void A_SWWMFlash( StateLabel flashlabel = null ) { if ( !player || !player.ReadyWeapon ) diff --git a/zscript/weapons/swwm_splode.zsc b/zscript/weapons/swwm_splode.zsc index 17abab12c..381468279 100644 --- a/zscript/weapons/swwm_splode.zsc +++ b/zscript/weapons/swwm_splode.zsc @@ -6,6 +6,7 @@ Class ExplodiumGun : SWWMWeapon int clipcount; bool chambered; bool preinit; + bool firstselect; double casex, casey; transient ui TextureID WeaponBox; transient ui Font TewiFont; @@ -302,6 +303,12 @@ Class ExplodiumGun : SWWMWeapon MarkSound("explodium/throwmag"); } + override void PlayUpSound( Actor origin ) + { + if ( firstselect ) return; + Super.PlayUpSound(origin); + } + Default { //$Title Explodium Gun @@ -329,13 +336,29 @@ Class ExplodiumGun : SWWMWeapon XZW1 A -1; Stop; Select: - XZW2 B 2 A_FullRaise(); + XZW2 B 2 + { + A_FullRaise(); + return A_JumpIf(invoker.firstselect,"FirstSelect"); + } XZW2 CDEFGH 2; Goto Ready; + FirstSelect: + XZW2 B 1 A_JumpIf(level.maptime>8,1); + Wait; + XZW2 B 2 + { + invoker.firstselect = false; + invoker.PlayUpSound(self); + } + XZW2 CDEFGH 2; + XZW2 A 2; + Goto Slide; Ready: XZW2 A 1 { - if ( (invoker.clipcount > 0) && !invoker.chambered ) player.SetPSprite(PSP_WEAPON,ResolveState("Slide")); + if ( invoker.firstselect ) player.SetPSprite(PSP_WEAPON,ResolveState("FirstSelect")); + else if ( (invoker.clipcount > 0) && !invoker.chambered ) player.SetPSprite(PSP_WEAPON,ResolveState("Slide")); else A_WeaponReady(WRF_ALLOWZOOM|WRF_ALLOWUSER1|WRF_ALLOWRELOAD); } Wait; @@ -763,7 +786,11 @@ Class DualExplodiumGun : SWWMWeapon States { Select: - XZW2 B 2 A_FullRaise(); + XZW2 B 2 + { + A_FullRaise(); + ExplodiumGun(invoker.SisterWeapon).firstselect = false; + } XZW2 C 2; XZW2 D 2 { player.SetPSprite(PSP_WEAPON+1,ResolveState("LeftSelect")); } XZW2 EFGHAA 2; @@ -774,6 +801,7 @@ Class DualExplodiumGun : SWWMWeapon Ready: XZW2 A 1 { + ExplodiumGun(invoker.SisterWeapon).firstselect = false; let sis = player.FindPSprite(PSP_WEAPON+1); if ( !sis ) {