diff --git a/zscript/swwm_common.zsc b/zscript/swwm_common.zsc index bcacb1b78..0a93523d4 100644 --- a/zscript/swwm_common.zsc +++ b/zscript/swwm_common.zsc @@ -1175,6 +1175,36 @@ Class LastLine int lineno; } +// Korax instakill handler +Class UglyBoyGetsFuckedUp : Thinker +{ + bool wedone; + + override void Tick() + { + if ( wedone ) return; + if ( level.killed_monsters < level.total_monsters ) + { + // stop portal door + int sidx = level.CreateSectorTagIterator(145).Next(); + if ( sidx == -1 ) return; + Sector door = level.Sectors[sidx]; + let ti = ThinkerIterator.Create("SectorEffect"); + SectorEffect se; + while ( se = SectorEffect(ti.Next()) ) + { + if ( se.GetSector() != door ) continue; + se.Destroy(); + door.StopSoundSequence(CHAN_VOICE); + } + return; + } + wedone = true; + level.ExecuteSpecial(Door_Open,null,null,false,145,8); + Destroy(); + } +} + // Handler responsible for item replacements and whatever else Class SWWMHandler : EventHandler { @@ -1566,6 +1596,14 @@ Class SWWMHandler : EventHandler lastcombat = AddOneliner("fightstart",1,10); } + private bool HexenMap40() + { + if ( level.GetChecksum() ~== "2A6C4235B942467D25FD50D5B313E67A" ) return true; // 1.1 + if ( level.GetChecksum() ~== "1C5DE5A921DEE405E98E7E09D9829387" ) return true; // 1.0 + if ( level.GetChecksum() ~== "EFAFE59092DE5E613562ACF52B86C37F" ) return true; // beta + return false; + } + override void WorldThingDied( WorldEvent e ) { if ( (e.Thing.default.bBOSS && !Random[GoldDrop](0,2)) || (e.Thing.default.bBOSSDEATH && !Random[GoldDrop](0,6)) ) @@ -1575,6 +1613,27 @@ Class SWWMHandler : EventHandler g.vel.xy = (cos(ang),sin(ang))*FRandom[SpareShells](.4,.8); g.vel.z = FRandom[SpareShells](2.,4.); } + // Korax instakill + if ( (e.Thing is 'Korax') && !e.Thing.special2 && HexenMap40() ) + { + e.Thing.special2 = 1; + // terminate the monster closet scripts, open all the + // doors ourselves + level.ExecuteSpecial(ACS_Terminate,e.Thing,null,false,220); + level.ExecuteSpecial(ACS_Terminate,e.Thing,null,false,220); + level.ExecuteSpecial(ACS_Terminate,e.Thing,null,false,221); + level.ExecuteSpecial(ACS_Terminate,e.Thing,null,false,255); + level.ExecuteSpecial(Door_Open,e.Thing,null,false,10,16); + level.ExecuteSpecial(Door_Open,e.Thing,null,false,11,16); + level.ExecuteSpecial(Door_Open,e.Thing,null,false,12,16); + level.ExecuteSpecial(Door_Open,e.Thing,null,false,13,16); + level.ExecuteSpecial(Door_Open,e.Thing,null,false,14,16); + level.ExecuteSpecial(Door_Open,e.Thing,null,false,10,16); + // keep the portal closed, you can't leave unless you + // kill everyone else + let t = new("UglyBoyGetsFuckedUp"); + t.ChangeStatNum(Thinker.STAT_USER); + } } override void WorldThingDamaged( WorldEvent e ) diff --git a/zscript/swwm_hud.zsc b/zscript/swwm_hud.zsc index 74ac6c523..3c236466b 100644 --- a/zscript/swwm_hud.zsc +++ b/zscript/swwm_hud.zsc @@ -44,7 +44,8 @@ Class SWWMStatusBar : BaseStatusBar override void FlushNotify() { - if ( level.maptime <= 1 ) { + if ( level.maptime <= 1 ) + { // flush ALL messages MainQueue.Clear(); PickupQueue.Clear(); @@ -157,7 +158,8 @@ Class SWWMStatusBar : BaseStatusBar private bool CmpInterest( SWWMInterest a, SWWMInterest b ) { - return a.type < b.type; } + return a.type < b.type; + } private bool CmpDist( Vector3 a, Vector3 b ) { @@ -222,13 +224,15 @@ Class SWWMStatusBar : BaseStatusBar targets.Clear(); let ti = ThinkerIterator.Create("SWWMCombatTracker",Thinker.STAT_USER); SWWMCombatTracker ct; + int extratime = 35; + if ( CPlayer.mo.FindInventory("Omnisight") ) extratime += 105; while ( ct = SWWMCombatTracker(ti.Next()) ) { if ( !targetter.GetBool() ) break; // ignore player unless chasecamming if ( (ct.mytarget == players[consoleplayer].mo) && (players[consoleplayer].Camera == players[consoleplayer].mo) && !(players[consoleplayer].cheats&CF_CHASECAM) ) continue; if ( ct.myplayer && deathmatch ) continue; // no players in dm - if ( level.maptime > ct.updated+35 ) continue; + if ( level.maptime > ct.updated+extratime ) continue; targets.Push(ct); } // sort by distance (give priority to players) @@ -353,9 +357,10 @@ Class SWWMStatusBar : BaseStatusBar proj.Reorient(ViewPos,ViewRot); proj.BeginProjection(); Vector3 vdir = (cos(ViewRot.x)*cos(ViewRot.y),sin(ViewRot.x)*cos(ViewRot.y),-sin(ViewRot.y)); + bool thesight = !!CPlayer.mo.FindInventory("Omnisight"); // points of interest String tag; - if ( CPlayer.mo.FindInventory("Omnisight") ) + if ( thesight ) { for ( int i=0; i 0) ) mtime += 105; + double alph = clamp(((targets[i].updated+mtime)-level.maptime)/35.,0.,1.); Vector2 barsiz = TexMan.GetScaledSize(EnemyBTex); barsiz.x *= hs.x; barsiz.y *= hs.y; diff --git a/zscript/swwm_player.zsc b/zscript/swwm_player.zsc index c555ecf24..0ad12a827 100644 --- a/zscript/swwm_player.zsc +++ b/zscript/swwm_player.zsc @@ -340,7 +340,7 @@ Class Demolitionist : PlayerPawn lastground = player.onground; lastvelz = prevvelz; prevvelz = vel.z; - bNOFRICTION = (((waterlevel<2)&&(bFly||bFlyCheat||(player.cheats&CF_NOCLIP2)))||InStateSequence(CurState,FindState("Dash"))); + bNOFRICTION = (((waterlevel<2)&&(bFly||bFlyCheat&&!(player.cheats&CF_NOCLIP2)))||InStateSequence(CurState,FindState("Dash"))); fuelcooldown = max(0,fuelcooldown-1); dashcooldown = max(0,dashcooldown-1); boostcooldown = max(0,boostcooldown-1); @@ -437,7 +437,7 @@ Class Demolitionist : PlayerPawn } override void CheckPitch() { - if ( (waterlevel < 2) && (bFly || bFlyCheat || (player.cheats&CF_NOCLIP2)) ) + if ( (waterlevel < 2) && (bFly || bFlyCheat) && !(player.cheats&CF_NOCLIP2) ) return; // handled in moveplayer Super.CheckPitch(); } @@ -473,7 +473,7 @@ Class Demolitionist : PlayerPawn { if ( InStateSequence(CurState,FindState("Dash")) ) player.cmd.forwardmove = player.cmd.sidemove = 0; - if ( (waterlevel < 2) && (bFly || bFlyCheat) ) + if ( (waterlevel < 2) && (bFly || bFlyCheat) && !(player.cheats&CF_NOCLIP2) ) { player.onground = false; if ( player.turnticks )