// WorldLoaded/WorldUnloaded events 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; // level end stats override void WorldUnloaded( WorldEvent e ) { let ti = ThinkerIterator.Create("SWWMStats",Thinker.STAT_STATIC); SWWMStats s; while ( s = SWWMStats(ti.Next()) ) { if ( !(gameinfo.gametype&GAME_STRIFE) ) { 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; } int csiz = s.clustervisit.Size(); if ( csiz == 0 ) { s.clustervisit.Push(clust); s.secretdone.Push(secret); } else if ( s.clustervisit[csiz-1] != clust ) { s.clustervisit.Push(clust); s.secretdone.Push(secret|s.secretdone[csiz-1]); } } s.AddLevelStats(); s.lastcluster = level.cluster; } ClearAllShaders(players[consoleplayer]); // 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 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