From d735ce20bff77bf1703c9933a023ace9947bccec Mon Sep 17 00:00:00 2001 From: Marisa Kirisame Date: Thu, 21 Oct 2021 17:52:14 +0200 Subject: [PATCH] Implement 4.7.1 features. --- language.version | 4 +- menudef.txt | 4 +- sprites/EIXTA0.png | Bin 0 -> 926 bytes sprites/EIXTB0.png | Bin 0 -> 925 bytes zmapinfo.txt | 2 + zscript.txt | 2 +- zscript/handler/swwm_handler_playerevents.zsc | 12 -- zscript/handler/swwm_handler_worldload.zsc | 8 +- zscript/hud/swwm_hud.zsc | 28 +++- zscript/items/swwm_powerups.zsc | 139 +++++++++++------- zscript/swwm_player.zsc | 25 +++- zscript/swwm_statichandler.zsc | 18 --- zscript/swwm_thinkers_hud.zsc | 46 +++++- zscript/weapons/swwm_baseweapon.zsc | 22 --- zscript/weapons/swwm_blazeit.zsc | 17 ++- zscript/weapons/swwm_deathlydeathcannon.zsc | 1 - zscript/weapons/swwm_jackhammer.zsc | 4 +- zscript/weapons/swwm_sparkyboi.zsc | 1 - 18 files changed, 202 insertions(+), 131 deletions(-) create mode 100644 sprites/EIXTA0.png create mode 100644 sprites/EIXTB0.png diff --git a/language.version b/language.version index 715584cd9..0e9f9de79 100644 --- a/language.version +++ b/language.version @@ -1,3 +1,3 @@ [default] -SWWM_MODVER="\chSWWM \czGZ\c- \cw1.1.29 \cu(Sat 16 Oct 22:33:07 CEST 2021)\c-"; -SWWM_SHORTVER="\cw1.1.29 \cu(2021-10-16 22:33:07)\c-"; +SWWM_MODVER="\chSWWM \czGZ\c- \cw1.1.30 \cu(Thu 21 Oct 17:52:36 CEST 2021)\c-"; +SWWM_SHORTVER="\cw1.1.30 \cu(2021-10-21 17:52:36)\c-"; diff --git a/menudef.txt b/menudef.txt index 5867bc251..b42ee3faf 100644 --- a/menudef.txt +++ b/menudef.txt @@ -283,7 +283,7 @@ ListMenu "MainMenu" SWWMTextItemM "$MNU_NEWGAME", "n", "PlayerclassMenu" SWWMTextItemM "$MNU_OPTIONS", "o", "OptionsMenu" SWWMTextItemM "$MNU_GAMEFILES", "g", "GameFilesMenu" - SWWMTextItemM "$MNU_INFO", "i", "SWWMHelpMenu" + SWWMTextItemM "$MNU_INFO", "i", "ReadThisMenu" SWWMTextItemM "$MNU_QUITGAME", "q", "QuitMenu" } ListMenu "MainMenuTextOnly" @@ -298,7 +298,7 @@ ListMenu "MainMenuTextOnly" SWWMTextItemM "$MNU_NEWGAME", "n", "PlayerclassMenu" SWWMTextItemM "$MNU_OPTIONS", "o", "OptionsMenu" SWWMTextItemM "$MNU_GAMEFILES", "g", "GameFilesMenu" - SWWMTextItemM "$MNU_INFO", "i", "SWWMHelpMenu" + SWWMTextItemM "$MNU_INFO", "i", "ReadThisMenu" SWWMTextItemM "$MNU_QUITGAME", "q", "QuitMenu" } ListMenu "GameFilesMenu" diff --git a/sprites/EIXTA0.png b/sprites/EIXTA0.png new file mode 100644 index 0000000000000000000000000000000000000000..0f42a7dee6f0f4539818abadb6a22796a6a8e060 GIT binary patch literal 926 zcmeAS@N?(olHy`uVBq!ia0y~yU=RUe4mJh`hTcwDUIqpRj`SkOBnAcskRmRPn{#e5 zFfa#tx;TbdobC=in>bZN_c<-P4|5nYE6HnT(U|0M6`1Nt2 zaiQ4(W(EcVs*^n>+77PEj5?d#y{IGBt5bnPp{3#d??1Oc+dTPP+0)ybnO0w4Z(?E5 zQDW8WqQrRF*Seo1`yo7xhzlSNbI zUeErd1N(iC*GIQ#_n&+8=Wgv~d{lr}#c;%nRExMQCn7xVFJU*^n(Whi-*g~Nta+{hC zHf&7r6boX^T4F5uab{}7k1v0lf30`BvG zYJ!Z#L?NA-0{ituy!o!_-R)Yq@%DxZ4*B8oPR2*XQ!FR)C|}c@taPBltTR!9BX8B) ze+O=#$-egB$r+1nYj3qSuXQi{`p|Vv#yhv{#)6Hb2F2^B;g^q@=e3e%?to+`y(8JLAmY7o@{~xZm(^91S-dX%S zz9fL*uPx7&7nxb7R|tyOg{scv3HMYzp51Xw^GnCdHq|iO_yvjmjJ5Zj_s(mIDyXT~ zvu{7JxRkCz(EoPD78 z`Spt10+&~uny?|OVY9H=J^s|fhaYEVyhlfXgjW^SJ)R{u7nJ)LJYD@<);T3K0RT_arL_P6 literal 0 HcmV?d00001 diff --git a/sprites/EIXTB0.png b/sprites/EIXTB0.png new file mode 100644 index 0000000000000000000000000000000000000000..4e2c1567d2a56df6a247431830880b037af38ea8 GIT binary patch literal 925 zcmeAS@N?(olHy`uVBq!ia0y~yU=RUe4mJh`hTcwDUIqpRj`SkOBnAcskRmRPn{#e5 zFfa#rx;Tbd^wx%+&K52d`1ft%ktBkci9gY$Qw&jLsiB374D$?y5F|GCE$HE``N8}&d0k8Y}xPIolSmoP~=n|=fmX->eh6!UE8~x`{mo%uXb*G7f(tE z&tVFmAu(IzK)r8%!}SXs!rS$24xSDEo>;3NV7#TRkXO=enN4f|`t%Jy)^=>$s{6w- z+EI0VfaZ<=XCs9^{QaO}XLDY0-<=~j{%XFly4M?Wyy)fntqG=QA~!wR-oNQaaT5ES zrv5{7x);8Fe__j}%#~BLob#;8RXCW7>K2D~%Iw`G&K<9l;$FXCpT^8Ro%OWX1f4|~(=GMnedomoc? zZmzBO?UM2NUu_rqFso$g?*mIu*(e_7S^6Y{_oId7K4#}&50j%R4eho}B{Je4MNE%0 z9C=><es$}#KG83ePW_m3 z_Tj@`!JB4hLas^}g~=9dn{c#yree>WdM$-L$8PNCUSod6ErC7}(nCuAMM-qTlkT!UBvg*Z 0) && ((s.lastcluster != level.cluster) || ((swwm_pistolstart == 1) && !(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; - } // cap health to 200 if ( p.Health > 200 ) p.Health = p.mo.Health = 200; } diff --git a/zscript/handler/swwm_handler_worldload.zsc b/zscript/handler/swwm_handler_worldload.zsc index d837b4e5d..e167dbae0 100644 --- a/zscript/handler/swwm_handler_worldload.zsc +++ b/zscript/handler/swwm_handler_worldload.zsc @@ -104,13 +104,17 @@ extend Class SWWMHandler let c = SWWMCredits.Find(players[i]); if ( c ) c.credits = c.hcredits = 0; } - // end of episode resets - if ( level.nextsecretmap.Left(6) == "enDSeQ" ) + // end of episode resets and enforced pistol starts + LevelInfo nextlv = LevelInfo.FindLevelInfo(e.NextMap); + if ( (level.nextsecretmap.Left(6) == "enDSeQ") + || (swwm_pistolstart && nextlv && (level.cluster != nextlv.cluster)) + || ((swwm_pistolstart == 1) && !(level.clusterflags&LevelLocals.CLUSTER_HUB)) ) { for ( int i=0; i 250) || !CheckSight(lamp,SF_IGNOREVISIBILITY|SF_IGNOREWATERBOUNDARY) ) return false; + if ( target && (target.Health > 0) && CheckSight(target) ) return false; return true; } void A_SmoothWander() @@ -1551,7 +1560,8 @@ Class LampMoth : Actor override void Tick() { Super.Tick(); - if ( isFrozen() || isEntranced() ) + if ( isFrozen() ) return; + if ( isEntranced() ) { lifespan = 100; return; @@ -1955,6 +1965,11 @@ Class SWWMLamp : Inventory if ( deathmatch ) return false; return Super.ShouldSpawn(); } + override void PreTravelled() + { + // remove the lamp + if ( thelamp ) thelamp.Destroy(); + } override void DoEffect() { Super.DoEffect(); @@ -2187,16 +2202,18 @@ Class EBarrier : Inventory SWWMUtility.AchievementProgressInc('swwm_progress_barrier',1,Owner.player); return true; } + override void PreTravelled() + { + if ( tracer ) tracer.Destroy(); + } override void Travelled() { Super.Travelled(); - if ( !tracer ) - { - tracer = Spawn("EBarrierX",pos); - tracer.angle = angle; - tracer.target = self; - tracer.FloatBobPhase = FloatBobPhase; - } + if ( tracer ) return; + tracer = Spawn("EBarrierX",pos); + tracer.angle = angle; + tracer.target = self; + tracer.FloatBobPhase = FloatBobPhase; } override void PostBeginPlay() { @@ -2891,6 +2908,15 @@ Class Mykradvo : Inventory return Super.CanPickup(toucher); } + override void PreTravelled() + { + if ( tracer ) tracer.Destroy(); + for ( int i=0; i<2; i++ ) + { + if ( !ringa[i] ) continue; + ringa[i].Destroy(); + } + } override void Travelled() { Super.Travelled(); @@ -3330,16 +3356,18 @@ Class AngerySigil : Inventory else Owner.GiveInventory("AngeryPower",1); return true; } + override void PreTravelled() + { + if ( tracer ) tracer.Destroy(); + } override void Travelled() { Super.Travelled(); - if ( !tracer ) - { - tracer = Spawn("AngerySigilX",pos); - tracer.angle = angle; - tracer.target = self; - tracer.FloatBobPhase = FloatBobPhase; - } + if ( tracer ) return; + tracer = Spawn("AngerySigilX",pos); + tracer.angle = angle; + tracer.target = self; + tracer.FloatBobPhase = FloatBobPhase; } override void PostBeginPlay() { @@ -3602,16 +3630,17 @@ Class DivineSprite : Inventory SWWMUtility.AchievementProgressInc('swwm_progress_divine',1,Owner.player); return true; } + override void PreTravelled() + { + if ( tracer ) tracer.Destroy(); + } override void Travelled() { - Super.Travelled(); - if ( !tracer ) - { - tracer = Spawn("DivineSpriteX",pos); - tracer.angle = angle; - tracer.target = self; - tracer.FloatBobPhase = FloatBobPhase; - } + if ( tracer ) return; + tracer = Spawn("DivineSpriteX",pos); + tracer.angle = angle; + tracer.target = self; + tracer.FloatBobPhase = FloatBobPhase; } override void PostBeginPlay() { diff --git a/zscript/swwm_player.zsc b/zscript/swwm_player.zsc index 725303e09..cb5f8537d 100644 --- a/zscript/swwm_player.zsc +++ b/zscript/swwm_player.zsc @@ -512,6 +512,7 @@ Class Demolitionist : PlayerPawn if ( !thesight && !CheckSight(i,SF_IGNOREVISIBILITY|SF_IGNOREWATERBOUNDARY) ) continue; SWWMItemSense.Spawn(self,i); } + bt.Destroy(); } void CheckDefaceTexture() { @@ -935,6 +936,7 @@ Class Demolitionist : PlayerPawn t.A_SpawnParticle(pcol,SPF_FULLBRIGHT,30,2.,0,ppos.x,ppos.y,ppos.z,dir.x*.2,dir.y*.2,dir.z*.2,0,0,.05,alph,-1,-2./30.); } } + bt.Destroy(); } override void CheckPoison() { @@ -2710,6 +2712,17 @@ Class Demolitionist : PlayerPawn mystats.secrets++; return true; } + override void RemoveInventory( Inventory item ) + { + // stop any looping sounds our current weapon had + if ( (item is 'SWWMWeapon') && player && (SWWMWeapon(item) == player.ReadyWeapon) ) + { + A_StopSound(CHAN_WEAPONEXTRA); + A_StopSound(CHAN_WEAPONEXTRA2); + A_StopSound(CHAN_WEAPONEXTRA3); + } + Super.RemoveInventory(item); + } override void AddInventory( Inventory item ) { // hackaround for replaced keys @@ -2916,6 +2929,14 @@ Class Demolitionist : PlayerPawn // we need the crouch button state to be preserved for other functions if ( wascrouching ) player.cmd.buttons |= BT_CROUCH; } + override void PreTravelled() + { + // clean up attached actors + if ( selflight ) selflight.Destroy(); + // inventory wipes + if ( FindInventory("InventoryWipeToken") ) + SWWMUtility.WipeInventory(self,swwm_resetscore); + } override void Travelled() { // reinitialize @@ -2943,7 +2964,8 @@ Class Demolitionist : PlayerPawn } // re-add ourselves to the "suckable list" (otherwise the Ynykron Singularity won't hurt us) let hnd = SWWMHandler(EventHandler.Find("SWWMHandler")); - if ( hnd ) hnd.SuckableActors.Push(self); + if ( hnd && (hnd.SuckableActors.Find(self) >= hnd.SuckableActors.Size()) ) + hnd.SuckableActors.Push(self); // re-attach shadow if ( swwm_shadows <= 0 ) return; let ti = ThinkerIterator.Create("SWWMShadow"); @@ -2954,6 +2976,7 @@ Class Demolitionist : PlayerPawn return; // shadow already attached } SWWMShadow.Track(self); + ti.Destroy(); } override bool PreTeleport( Vector3 destpos, double destangle, int flags ) { diff --git a/zscript/swwm_statichandler.zsc b/zscript/swwm_statichandler.zsc index 992f519d1..44f158058 100644 --- a/zscript/swwm_statichandler.zsc +++ b/zscript/swwm_statichandler.zsc @@ -353,24 +353,6 @@ Class SWWMStaticHandler : StaticEventHandler override void UiTick() { - // HACK! Graf, please let us change this in a cleaner way - if ( menuDelegate.GetClass() == 'DoomMenuDelegate' ) - { - menuDelegate.Destroy(); - menuDelegate = new("SWWMMenuDelegate"); - } - // Hey Graf how about you let us replace the class used for the - // "Read This!" menu in mapinfo/gameinfo or something so I - // don't have to do this hack here? - Menu cur = Menu.GetCurrentMenu(); - if ( cur is 'ReadThisMenu' ) - { - Menu oldpt = cur.mParentMenu; - cur.Close(); - Menu.SetMenu('SWWMHelpMenu'); - cur = Menu.GetCurrentMenu(); - if ( cur ) cur.mParentMenu = oldpt; - } // Fancy crash effect if ( (gamestate == GS_LEVEL) || (gamestate == GS_TITLELEVEL) ) { diff --git a/zscript/swwm_thinkers_hud.zsc b/zscript/swwm_thinkers_hud.zsc index bd78a35c9..fa3a7cc4e 100644 --- a/zscript/swwm_thinkers_hud.zsc +++ b/zscript/swwm_thinkers_hud.zsc @@ -117,11 +117,28 @@ enum EInterestType INT_Exit }; +Class SWWMInterestMarker : MapMarker +{ + Default + { + Scale 2.; + Args 0, 0, 1; + +DORMANT; + } + States + { + Spawn: + EIXT AB -1; + Stop; + } +} + Class SWWMInterest : Thinker { int type; Key trackedkey; Line trackedline; + Actor marker; Vector3 pos; SWWMInterest prev, next; String keytag; @@ -139,8 +156,23 @@ Class SWWMInterest : Thinker { i.type = INT_Key; i.keytag = thekey.GetTag(); + i.marker = Actor.Spawn("SWWMInterestMarker",thekey.pos); + if ( thekey is 'SWWMKey' ) + { + Class k = thekey.species; + let def = GetDefaultByType(k); + i.marker.picnum = def.SpawnState.GetSpriteTexture(0); + } + else i.marker.picnum = thekey.SpawnState.GetSpriteTexture(0); + i.marker.target = thekey; + } + else if ( theline ) + { + i.type = INT_Exit; + i.marker = Actor.Spawn("SWWMInterestMarker",pos); + if ( theline.special == Exit_Secret ) + i.marker.SetState(i.marker.SpawnState+1); } - else if ( theline ) i.type = INT_Exit; else { i.Destroy(); @@ -177,8 +209,16 @@ Class SWWMInterest : Thinker override void Tick() { // update - if ( (type == INT_Key) && (!trackedkey || trackedkey.Owner) ) Destroy(); - else if ( trackedkey ) pos = trackedkey.Vec3Offset(0,0,trackedkey.height/2); + if ( (type == INT_Key) && (!trackedkey || trackedkey.Owner) ) + { + marker.Destroy(); + Destroy(); + } + else if ( trackedkey ) + { + pos = trackedkey.Vec3Offset(0,0,trackedkey.height/2); + marker.SetOrigin(pos,true); + } } } diff --git a/zscript/weapons/swwm_baseweapon.zsc b/zscript/weapons/swwm_baseweapon.zsc index ef599f066..a74d0e7ca 100644 --- a/zscript/weapons/swwm_baseweapon.zsc +++ b/zscript/weapons/swwm_baseweapon.zsc @@ -6,8 +6,6 @@ Class SWWMWeapon : Weapon abstract bool wasused; bool bUsePickup; - transient bool hastravelled; - transient int autoupsnd; private int SWeaponFlags; String tooltip; bool tooltipsent; @@ -243,19 +241,10 @@ Class SWWMWeapon : Weapon abstract } GivenAsMorphWeapon = false; } - override void DetachFromOwner() - { - Owner.A_StopSound(CHAN_WEAPON); - Owner.A_StopSound(CHAN_WEAPONEXTRA); - Owner.A_StopSound(CHAN_WEAPONEXTRA2); - Owner.A_StopSound(CHAN_WEAPONEXTRA3); - Super.DetachFromOwner(); - } override void OwnerDied() { if ( Owner.player && (Owner.player.ReadyWeapon == self) ) { - Owner.A_StopSound(CHAN_WEAPON); Owner.A_StopSound(CHAN_WEAPONEXTRA); Owner.A_StopSound(CHAN_WEAPONEXTRA2); Owner.A_StopSound(CHAN_WEAPONEXTRA3); @@ -340,23 +329,12 @@ 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 ) return; - if ( autoupsnd && (level.maptime >= autoupsnd) ) - { - autoupsnd = 0; - PlayUpSound(Owner); - } if ( !Owner.player || (Owner.player.ReadyWeapon != self) || !(Owner.player.WeaponState&WF_WEAPONSWITCHOK) || (Owner.player.WeaponState&WF_DISABLESWITCH) ) { tooltipsent = false; diff --git a/zscript/weapons/swwm_blazeit.zsc b/zscript/weapons/swwm_blazeit.zsc index 102d34dd2..c00a2d9e5 100644 --- a/zscript/weapons/swwm_blazeit.zsc +++ b/zscript/weapons/swwm_blazeit.zsc @@ -584,16 +584,17 @@ Class Hellblazer : SWWMWeapon } } + override void PreTravelled() + { + if ( tracer ) tracer.Destroy(); + } override void Travelled() { - Super.Travelled(); - if ( !tracer ) - { - tracer = Spawn("HellblazerX",pos); - tracer.angle = angle; - tracer.target = self; - tracer.FloatBobPhase = FloatBobPhase; - } + if ( tracer ) return; + tracer = Spawn("HellblazerX",pos); + tracer.angle = angle; + tracer.target = self; + tracer.FloatBobPhase = FloatBobPhase; } override void PostBeginPlay() { diff --git a/zscript/weapons/swwm_deathlydeathcannon.zsc b/zscript/weapons/swwm_deathlydeathcannon.zsc index 3874afc27..a2173e5f3 100644 --- a/zscript/weapons/swwm_deathlydeathcannon.zsc +++ b/zscript/weapons/swwm_deathlydeathcannon.zsc @@ -76,7 +76,6 @@ Class Ynykron : SWWMWeapon override void Travelled() { - Super.Travelled(); if ( Owner.player && (Owner.player.Readyweapon == self) ) { Owner.A_StartSound("ynykron/idle",CHAN_WEAPONEXTRA,CHANF_LOOP,.3,4.); diff --git a/zscript/weapons/swwm_jackhammer.zsc b/zscript/weapons/swwm_jackhammer.zsc index 5d18234d8..044902c39 100644 --- a/zscript/weapons/swwm_jackhammer.zsc +++ b/zscript/weapons/swwm_jackhammer.zsc @@ -292,7 +292,7 @@ Class PusherWeapon : SWWMWeapon A_StartSound("pusher/motor",CHAN_WEAPONEXTRA,CHANF_LOOP,pitch:1.5); } XZW2 M 2; - XZW2 N 0 A_StartSound("pusher/drill",CHAN_WEAPON,CHANF_LOOP); + XZW2 N 0 A_StartSound("pusher/drill",CHAN_WEAPONEXTRA2,CHANF_LOOP); Hold: XZW2 N 1 { @@ -320,7 +320,7 @@ Class PusherWeapon : SWWMWeapon A_Recoil(.5*cos(pitch)); A_ClearRefire(); A_WeaponOffset(0,32); - A_StopSound(CHAN_WEAPON); + A_StopSound(CHAN_WEAPONEXTRA2); A_StartSound("pusher/stop",CHAN_WEAPON,CHANF_OVERLAP); A_StartSound("pusher/motorend",CHAN_WEAPONEXTRA,CHANF_DEFAULT,pitch:1.5); return ResolveState(null); diff --git a/zscript/weapons/swwm_sparkyboi.zsc b/zscript/weapons/swwm_sparkyboi.zsc index 8edbd7ff7..7540a3e3c 100644 --- a/zscript/weapons/swwm_sparkyboi.zsc +++ b/zscript/weapons/swwm_sparkyboi.zsc @@ -177,7 +177,6 @@ Class Sparkster : SWWMWeapon override void Travelled() { - Super.Travelled(); if ( Owner.player && (Owner.player.Readyweapon == self) ) { Owner.A_StartSound("biospark/idle",CHAN_WEAPONEXTRA,CHANF_LOOP,doublestacc?.6:.4,4.);