diff --git a/language.version b/language.version index f4b538146..4866d47dd 100644 --- a/language.version +++ b/language.version @@ -1,3 +1,3 @@ [default] -SWWM_MODVER="\cyDEMOLITIONIST \cw1.3pre r179 \cu(Fri 15 Jul 08:05:08 CEST 2022)\c-"; -SWWM_SHORTVER="\cw1.3pre r179 \cu(2022-07-15 08:05:08)\c-"; +SWWM_MODVER="\cyDEMOLITIONIST \cw1.3pre r180 \cu(Fri 15 Jul 09:32:16 CEST 2022)\c-"; +SWWM_SHORTVER="\cw1.3pre r180 \cu(2022-07-15 09:32:16)\c-"; diff --git a/zscript/swwm_handler.zsc b/zscript/swwm_handler.zsc index ee06f0c68..a42e763a0 100644 --- a/zscript/swwm_handler.zsc +++ b/zscript/swwm_handler.zsc @@ -19,7 +19,7 @@ Class SWWMHandler : EventHandler int iwantdie; int indoomvacation; int inultdoom2; - bool funtagsv; + Array funtagsv, mergemonstersv; // for checkreplacement bool hasdrlamonsters; @@ -91,9 +91,14 @@ Class SWWMHandler : EventHandler bludtypes.Push(list[i]); } } - // check if fun tag services actually exist (can reduce overhead severely on map load if they don't, due to combat tracker tag lookups) - if ( ServiceIterator.Find("FunTagService").Next() ) - funtagsv = true; + // cache various services into the handler on register + // this dramatically reduces overhead by not having to use an iterator every time they're needed + // especially noticeable for fun tags, as they're looked up for every monster on map load + let si = ServiceIterator.Find("FunTagService"); + Service sv; + while ( sv = si.Next() ) funtagsv.Push(sv); + si = ServiceIterator.Find("MergeMonsterService"); + while ( sv = si.Next() ) mergemonstersv.Push(sv); // start profiling if ( swwm_profstart <= 0 ) return; bprofiletics = profiletics = swwm_profstart; diff --git a/zscript/swwm_thinkers_player.zsc b/zscript/swwm_thinkers_player.zsc index 44f00703b..1841591ee 100644 --- a/zscript/swwm_thinkers_player.zsc +++ b/zscript/swwm_thinkers_player.zsc @@ -144,6 +144,8 @@ Class SWWMStats : SWWMStaticThinker int silveregg; bool oldcheat; bool gotyorick; + // caching + SWWMHandler hnd; bool GotWeapon( Class which ) { @@ -248,7 +250,8 @@ Class SWWMStats : SWWMStaticThinker { if ( victim ) { - Class mvictim = SWWMUtility.MergeMonster(victim.GetClass()); + if ( !hnd ) hnd = SWWMHandler(EventHandler.Find("SWWMHandler")); + Class mvictim = SWWMUtility.MergeMonster(hnd,victim.GetClass()); bool found = false; for ( int i=0; i MergeMonster( Class a ) + static play Class MergeMonster( SWWMHandler hnd, Class a ) { // see if any services can resolve this first - let si = ServiceIterator.Find("MergeMonsterService"); - Service sv; - String res; - while ( sv = si.Next() ) + for ( int i=0; i rescls = res; return rescls; } - si.Destroy(); // stealth monsters, the worst thing ever invented if ( a == 'StealthArachnotron' ) return 'Arachnotron'; if ( a == 'StealthArchvile' ) return 'Archvile';