// Static handler responsible for some special stuff // save version holder Class SWWMSaveVerData : SWWMStaticThinker { String ver; } Class SWWMStaticHandler : StaticEventHandler { // crash handler ui bool wasinmap; ui int timer, msgpick; // versioning bool tainted; String taintver; int checktic; int maptime; bool unloading; ui Dictionary menustate; // used by Demolitionist Menu to restore old menu positions // title stuff ui bool titlefirst; // warnings bool mpwarned; // checks ThinkerIterator sti; // for intermissions, to prevent repetition ui Array lasttip, lastart; // stupid dumb thing ui int aprcheck; ui Font aprfnt; override void NewGame() { // set save version every new session let svd = new("SWWMSaveVerData"); svd.ChangeStatNum(Thinker.STAT_STATIC); svd.ver = StringTable.Localize("$SWWM_SHORTVER"); } override void WorldUnloaded( WorldEvent e ) { SWWMHandler.ClearAllShaders(); unloading = true; } override void WorldTick() { maptime++; // in case we start late? if ( multiplayer && !mpwarned ) { mpwarned = true; Console.Printf("\cgWARNING:\c- Multiplayer is no longer officially supported, desyncs and other issues may potentially happen. You are on your own."); S_StartSound("compat/warn",CHAN_YOUDONEFUCKEDUP,CHANF_UI|CHANF_NOPAUSE|CHANF_OVERLAP,1,ATTN_NONE); } // sanity check Array stinkers; if ( !sti ) sti = ThinkerIterator.Create("SWWMStaticThinker"); else sti.Reinit(); Thinker t; while ( t = sti.Next() ) stinkers.Push(t); if ( stinkers.Size() > 0 ) { for ( int i=0; i= 2.) ) mmz = 2.; else if ( mmz >= 1. ) mmz = 1.; else mmz = .5; CVar.FindCVar('swwm_mm_zoom').SetFloat(mmz); if ( !e.IsSaveGame ) return; // save version checker tainted = false; taintver = ""; checktic = gametic+5; let ti = ThinkerIterator.Create("SWWMSaveVerData",Thinker.STAT_STATIC); let svd = SWWMSaveVerData(ti.Next()); if ( !svd ) { tainted = true; taintver = "\cg(no version info)\c-"; return; } String cver = StringTable.Localize("$SWWM_SHORTVER"); if ( svd.ver != cver ) { tainted = true; taintver = svd.ver; } } override void OnUnregister() { // save achievements on exit SaveAchievements(); } override void OnRegister() { // fix voice type cvar int lmp; Array types; for ( lmp = Wads.FindLump("swwmvoicepack.txt"); lmp > 0; lmp = Wads.FindLump("swwmvoicepack.txt",lmp+1) ) { Array lst; lst.Clear(); String dat = Wads.ReadLump(lmp); dat.Split(lst,"\n",0); for ( int i=0; i= types.Size() ) cv.SetString("default"); // load up the achievements if ( swwm_achievementstate == "" ) MigrateAchievements(); else LoadAchievements(); // warn: mp no longer officially maintained if ( multiplayer ) { mpwarned = true; Console.Printf("\cgWARNING:\c- Multiplayer is no longer officially supported, desyncs and other issues may potentially happen. You are on your own."); S_StartSound("compat/warn",CHAN_YOUDONEFUCKEDUP,CHANF_UI|CHANF_NOPAUSE|CHANF_OVERLAP,1,ATTN_NONE); } // warning for unsupported if ( Wads.FindLump("swwmgamesupported.txt") != -1 ) return; Console.Printf( "\cx┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\c-\n" "\cx┃ \cr[\cgWARNING\cr] \cx┃\c-\n" "\cx┃ \chSWWM \czGZ \cjis \cfNOT\cj compatible with the loaded IWAD. \cx┃\c-\n" "\cx┃ \cjOnly \cfDoom\cj, \cfHeretic\cj and \cfHexen\cj are supported. \cx┃\c-\n" "\cx┃ \cjIssues \cfCAN\cj and \cfWILL\cj happen. \cx┃\c-\n" "\cx┃ \cr[\cgYOU ARE ON YOUR OWN\cr] \cx┃\c-\n" "\cx┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\c-"); S_StartSound("compat/warn",CHAN_YOUDONEFUCKEDUP,CHANF_UI|CHANF_NOPAUSE|CHANF_OVERLAP,1,ATTN_NONE); } override void RenderOverlay( RenderEvent e ) { // warn on use of incorrect render settings // make sure to find the cvars, rather than use them directly // just in case anything changes in the future and we end up // breaking shit (not the first time a mod does that) int yy = 8; let backend = CVar.FindCVar('vid_preferbackend'); let rmode = CVar.FindCVar('vid_rendermode'); if ( backend && (backend.GetInt() > 1) ) { String str = "UNSUPPORTED VIDEO BACKEND - PLEASE SWITCH TO OPENGL OR VULKAN"; Screen.DrawText(newsmallfont,Font.CR_RED,(Screen.GetWidth()-newsmallfont.StringWidth(str)*CleanXFac_1)/2,yy,str,DTA_CleanNoMove_1,true); yy += 16*CleanYFac_1; } if ( rmode && (rmode.GetInt() != 4) ) { String str = "UNSUPPORTED RENDER MODE - PLEASE SWITCH TO HARDWARE RENDERING"; Screen.DrawText(newsmallfont,Font.CR_RED,(Screen.GetWidth()-newsmallfont.StringWidth(str)*CleanXFac_1)/2,yy,str,DTA_CleanNoMove_1,true); } if ( (aprcheck == 2) && (gamestate == GS_LEVEL) ) { String str = "Unregistered Ultracam"; Screen.DrawText(aprfnt,Font.CR_WHITE,(Screen.GetWidth()-aprfnt.StringWidth(str)*CleanXFac_1)/2,2*CleanYFac_1,str,DTA_CleanNoMove_1,true); } } override void ConsoleProcess( ConsoleEvent e ) { if ( e.Name ~== "swwmresetmmcolors" ) { Array cvarlist; SWWMUtility.GetCVars(cvarlist); for ( int i=0; i cvarlist; SWWMUtility.GetCVars(cvarlist); for ( int i=0; i cvarlist; SWWMUtility.GetCVars(cvarlist); for ( int i=0; i 0) && !(gametic%GameTicRate) ) { let pt = CVar.FindCVar('swwm_playtime'); int ct = pt.GetInt(); pt.SetInt(ct+1); } if ( gamestate != GS_LEVEL ) return; CheckAllAchievements(); if ( gametic != checktic ) return; String cver = StringTable.Localize("$SWWM_SHORTVER"); if ( tainted ) { let ti = ThinkerIterator.Create("SWWMSaveVerData",Thinker.STAT_STATIC); let svd = SWWMSaveVerData(ti.Next()); if ( !svd ) Console.Printf("\cgWARNING:\n \cjSave contains no version data. Issues may happen.\c-"); else { Console.Printf("\cgWARNING:\n \cjVersion mismatch with save data. Issues may happen.\c-"); Console.Printf("\cgSaved:\n \cj"..svd.ver.."\c-"); Console.Printf("\cgCurrent:\n \cj"..cver.."\c-"); } } } override void UiTick() { // Fancy crash effect if ( (gamestate == GS_LEVEL) || (gamestate == GS_TITLELEVEL) ) { wasinmap = true; timer = 0; } else if ( (gamestate == GS_FULLCONSOLE) && ((wasinmap && !players[consoleplayer].viewheight) || (timer > 0)) ) { wasinmap = false; if ( timer == 1 ) { msgpick = Random[UIStuff](1,8); Console.Printf("\cf%s\c-",StringTable.Localize("$CRASHMSG"..msgpick.."A")); let hnd = SWWMBrutalHandler(StaticEventHandler.Find("SWWMBrutalHandler")); if ( hnd && hnd.detected ) { S_StartSound("crash/glass",CHAN_YOUDONEFUCKEDUP,CHANF_UI|CHANF_NOPAUSE|CHANF_OVERLAP,1,ATTN_NONE); S_StartSound("crash/glass",CHAN_YOUDONEFUCKEDUP,CHANF_UI|CHANF_NOPAUSE|CHANF_OVERLAP,1,ATTN_NONE); } else S_StartSound("crash/crash",CHAN_YOUDONEFUCKEDUP,CHANF_UI|CHANF_NOPAUSE|CHANF_OVERLAP,1,ATTN_NONE); } else if ( timer == 70 ) { Console.Printf("\cf%s\c-",StringTable.Localize("$CRASHMSG"..msgpick.."B")); S_StartSound("crash/curb",CHAN_YOUDONEFUCKEDUP,CHANF_UI|CHANF_NOPAUSE|CHANF_OVERLAP,1,ATTN_NONE); } else if ( timer == 140 ) { let hnd = SWWMBrutalHandler(StaticEventHandler.Find("SWWMBrutalHandler")); if ( hnd && hnd.detected ) Console.Printf("\cfYou shouldn't have tried running this with "..hnd.which..".\c-"); else Console.Printf("\cfYou should probably screenshot this error and show it to Marisa.\c-"); Console.Printf("\cfLoaded Version:\n \cj%s\c-",StringTable.Localize("$SWWM_SHORTVER")); if ( tainted ) Console.Printf("\cfSavegame Version:\n \cj%s\c-",taintver); } timer++; } } }