// WorldLoaded/WorldUnloaded events Class RampancyLogonDummy : Actor { States { Spawn: TNT1 A 7; TNT1 AAAAAAAAAAAAAAAA 1 { for ( int i=0; i<16; i++ ) A_Log("Remote login failed."); } TNT1 A 7; TNT1 A 1 A_Log("\cgWARNING:\cj 256 failed remote login attempts have been reported in the last second.\c-"); Stop; } } extend Class SWWMHandler { // list contains a sector that belongs to each portal group // used to ease some portal-aware functions Array psectors; // for minimap Array ffsectors; Array > mapkeys; // level end stats override void WorldUnloaded( WorldEvent e ) { let ti = ThinkerIterator.Create("SWWMStats",Thinker.STAT_STATIC); SWWMStats s; while ( s = SWWMStats(ti.Next()) ) { int clust = 0; bool secret = false; if ( SWWMUtility.IsEviternity() ) { // we have to do some heavy lifting here because episodes don't match clusters if ( level.levelnum <= 5 ) clust = 1; else if ( level.levelnum <= 10 ) clust = 2; else if ( level.levelnum <= 15 ) clust = 3; else if ( level.levelnum <= 20 ) clust = 4; else if ( level.levelnum <= 25 ) clust = 5; else if ( level.levelnum <= 30 ) clust = 6; else if ( level.levelnum <= 32 ) { secret = true; if ( level.levelnum <= 31 ) clust = 7; else clust = 8; } } else { if ( (gameinfo.gametype&GAME_DOOM) && ((level.cluster == 9) || (level.cluster == 10)) ) secret = true; clust = level.cluster; } // avoid cluster zero (ignores test maps and such) if ( clust != 0 ) { int csiz = s.clustervisit.Size(); if ( csiz == 0 ) { s.secretdone.Push(secret); } else if ( s.clustervisit[csiz-1] != clust ) { s.secretdone.Push(secret|s.secretdone[csiz-1]); } s.AddLevelStats(); s.lastcluster = level.cluster; } // nazi cleanup let ti = ThinkerIterator.Create("Actor"); Actor a; bool hasnazis = false; bool livenazis = false; while ( a = Actor(ti.Next()) ) { // yes, the dogs don't count (they're just dogs) if ( !(a is 'SWWMGuard') && !(a is 'SWWMSS') && !(a is 'SWWMHans') ) continue; hasnazis = true; if ( a.Health > 0 ) livenazis = true; } if ( hasnazis && !livenazis ) { if ( level.levelnum == 31 ) s.nazicleanup |= 1; else if ( level.levelnum == 32 ) s.nazicleanup |= 2; } if ( s.nazicleanup == 3 ) SWWMUtility.MarkAchievement('swwm_achievement_trash',s.myplayer); } // reset score on dead players (death exitâ„¢) for ( int i=0; i 0) ) continue; let c = SWWMCredits.Find(players[i]); if ( c ) c.credits = c.hcredits = 0; } // end of episode resets if ( level.nextsecretmap.Left(6) == "enDSeQ" ) { for ( int i=0; i 0) && !(level.clusterflags&LevelLocals.CLUSTER_HUB) ) { bool collected = false; for ( int i=0; i 0) || (level.total_items > 0) || (level.total_secrets > 0)) && (level.killed_monsters == 0) && (level.found_items == 0) && (level.found_secrets == 0) ) SWWMUtility.MarkAchievement('swwm_achievement_hurry',players[consoleplayer]); } private void SetupLockdefsCache( SWWMCachedLockInfo cli ) { for ( int i=0; i lines; lines.Clear(); data.Split(lines,"\n"); bool valid = false; for ( int j=0; j spl; spl.Clear(); lines[j].Split(spl," ",TOK_SKIPEMPTY); // check game string (if any) if ( spl.Size() > 2 ) { if ( (spl[2] ~== "DOOM") && !(gameinfo.gametype&GAME_Doom) ) continue; else if ( (spl[2] ~== "HERETIC") && !(gameinfo.gametype&GAME_Heretic) ) continue; else if ( (spl[2] ~== "HEXEN") && !(gameinfo.gametype&GAME_Hexen) ) continue; else if ( (spl[2] ~== "STRIFE") && !(gameinfo.gametype&GAME_Strife) ) continue; else if ( (spl[2] ~== "CHEX") && !(gameinfo.gametype&GAME_Chex) ) continue; } // valid lock, prepare it let li = new("LIEntry"); li.locknumber = spl[1].ToInt(); li.hascolor = false; // see if there's a Mapcolor defined int k = j+1; for ( int k=j+2; k skipme; skipme.Clear(); // find exit lines, and use lines that aren't exits for ( int i=0; i con; con.Clear(); con.Push(l); int found; if ( l.frontsector ) { do { found = 0; for ( int j=0; j 0 ); } if ( l.backsector ) { do { found = 0; for ( int j=0; j 0 ); } Vector3 lpos = (0,0,0); for ( int i=0; i