diff --git a/cvarinfo.base b/cvarinfo.base index 7b49cf7a8..d7baee30f 100644 --- a/cvarinfo.base +++ b/cvarinfo.base @@ -15,9 +15,6 @@ nosave int swwm_chatduration = 25; // lifespan of chat messages nosave int swwm_msgduration = 5; // lifespan of other messages nosave int swwm_pickduration = 3; // lifespan of pickup messages server bool swwm_sharekeys = true; // share keys in mp -nosave noarchive String swwm_lasttab = ""; // last selected tab in the menu -nosave noarchive int swwm_lastloretab = 0; // last selected tab in the library submenu -nosave noarchive int swwm_laststattab = 0; // last selected tab in the stats submenu user bool swwm_autousearmor = true; // automatically use armor items when possible user bool swwm_autousehealth = true; // automatically use health items when possible user bool swwm_autouseammo = true; // automatically use ammo fabricators when possible (excl. tier 4) diff --git a/language.version b/language.version index 1da3dd4d7..8d7c07893 100644 --- a/language.version +++ b/language.version @@ -1,3 +1,3 @@ [default] -SWWM_MODVER="\chSWWM \czGZ\c- \cw1.2pre r30 \cu(Sat 16 Oct 09:31:00 CEST 2021)\c-"; -SWWM_SHORTVER="\cw1.2pre r30 \cu(2021-10-16 09:31:00)\c-"; +SWWM_MODVER="\chSWWM \czGZ\c- \cw1.2pre r32 \cu(Sat 16 Oct 12:47:27 CEST 2021)\c-"; +SWWM_SHORTVER="\cw1.2pre r32 \cu(2021-10-16 12:47:27)\c-"; diff --git a/zscript/handler/swwm_handler_process.zsc b/zscript/handler/swwm_handler_process.zsc index e081686c6..828fdc5a3 100644 --- a/zscript/handler/swwm_handler_process.zsc +++ b/zscript/handler/swwm_handler_process.zsc @@ -568,6 +568,11 @@ extend Class SWWMHandler break; } } + else if ( e.Name.Left(17) ~== "swwmstoremessage." ) + { + if ( consoleplayer != e.Args[2] ) return; + SWWMFullHistory.PushMessage(e.Name.Mid(17),e.Args[0],e.Args[1]); + } else if ( e.Name.Left(16) ~== "swwmremoteliner." ) { if ( consoleplayer == e.Args[0] ) return; diff --git a/zscript/hud/swwm_hud.zsc b/zscript/hud/swwm_hud.zsc index 56408e3ff..e383dfe77 100644 --- a/zscript/hud/swwm_hud.zsc +++ b/zscript/hud/swwm_hud.zsc @@ -13,9 +13,7 @@ Class SWWMStatusBar : BaseStatusBar GenericAmmoTex[3], MiniBox, AutoPage; HUDFont mTewiFont, mMiniwiFont, mMPlusFont, mk6x8Font; - // "Full History" contains all messages since session start, nothing is flushed - // this can be accessed from a section of the knowledge base - Array MainQueue, PickupQueue, FullHistory; + Array MainQueue, PickupQueue; // sorted arrays of various elements Array intpoints; @@ -631,7 +629,7 @@ Class SWWMStatusBar : BaseStatusBar m.rep = 1; // append chat messages to full history if ( (printlevel == PRINT_CHAT) || (printlevel == PRINT_TEAMCHAT) ) - FullHistory.Push(m); + EventHandler.SendNetworkEvent("swwmstoremessage."..m.str,m.tic,m.type,consoleplayer); // ignore during intermission if ( gamestate != GS_LEVEL ) return false; if ( (printlevel < PRINT_LOW) || (printlevel > PRINT_TEAMCHAT) ) return true; // we couldn't care less about these diff --git a/zscript/hud/swwm_hudextra.zsc b/zscript/hud/swwm_hudextra.zsc index dc9216cba..48059c812 100644 --- a/zscript/hud/swwm_hudextra.zsc +++ b/zscript/hud/swwm_hudextra.zsc @@ -398,16 +398,7 @@ Class SWWMDirectMessage : HUDMessageBase l = tfnt.BreakLines(txt,220); // append to the player's chat log (if it's valid) if ( (seqnum < 1) || (seqnum > seqcnt) ) return; - let bar = SWWMStatusBar(StatusBar); - if ( bar ) - { - let l = new("MsgLine"); - l.str = chrname..": "..txt; - l.tic = level.totaltime; - l.rep = 1; - l.type = PRINT_CHAT; - bar.FullHistory.Push(l); - } + EventHandler.SendNetworkEvent("swwmstoremessage."..chrname..": "..txt,level.totaltime,PRINT_CHAT,consoleplayer); } private void DrawText() diff --git a/zscript/kbase/swwm_kbase.zsc b/zscript/kbase/swwm_kbase.zsc index 125dfaf84..6d7bef58e 100644 --- a/zscript/kbase/swwm_kbase.zsc +++ b/zscript/kbase/swwm_kbase.zsc @@ -53,6 +53,7 @@ Class DemolitionistMenu : GenericMenu Array checklist; int lasttuid; SWWMHandler hnd; + SWWMStaticHandler shnd; // seeeeecret int kcode; // crimey clock stuff @@ -181,6 +182,7 @@ Class DemolitionistMenu : GenericMenu tmsgtic = gametic+50; lasttuid = Random[TUID](); hnd = SWWMHandler(EventHandler.Find("SWWMHandler")); + shnd = SWWMStaticHandler(StaticEventHandler.Find("SWWMStaticHandler")); SetClock(); static const class deftabs[] = { @@ -206,10 +208,18 @@ Class DemolitionistMenu : GenericMenu } for ( int i=deftabs.Size()-2; i saved = swwm_lasttab; - if ( saved ) curtab = FindTabType(saved); - if ( curtab != -1 ) return; - curtab = GetFirstTab(); + if ( shnd.menustate ) + { + Class saved = shnd.menustate.At("LastTab"); + if ( saved ) curtab = FindTabType(saved); + } + else + { + shnd.menustate = Dictionary.Create(); + curtab = -1; + } + if ( curtab == -1 ) curtab = GetFirstTab(); + tabs[curtab].OnSelect(); } override bool MenuEvent( int mkey, bool fromcontroller ) @@ -239,13 +249,14 @@ Class DemolitionistMenu : GenericMenu case 10: if ( mkey == MKEY_ENTER ) { - MenuSound("misc/secret"); int secret = FindTabType('DemolitionistSecretTab'); if ( curtab != secret ) { + MenuSound("misc/secret"); tabs[curtab].OnDeselect(); curtab = secret; tabs[curtab].OnSelect(); + shnd.menustate.Insert("LastTab",tabs[curtab].GetClassName()); } } @@ -266,7 +277,7 @@ Class DemolitionistMenu : GenericMenu tabs[curtab].OnDeselect(); curtab = next; tabs[curtab].OnSelect(); - CVar.FindCVar('swwm_lasttab').SetString(tabs[curtab].GetClassName()); + shnd.menustate.Insert("LastTab",tabs[curtab].GetClassName()); } return true; case MKEY_PAGEUP: @@ -277,7 +288,7 @@ Class DemolitionistMenu : GenericMenu tabs[curtab].OnDeselect(); curtab = prev; tabs[curtab].OnSelect(); - CVar.FindCVar('swwm_lasttab').SetString(tabs[curtab].GetClassName()); + shnd.menustate.Insert("LastTab",tabs[curtab].GetClassName()); } return true; case MKEY_DOWN: @@ -359,7 +370,7 @@ Class DemolitionistMenu : GenericMenu tabs[curtab].OnDeselect(); curtab = i; tabs[curtab].OnSelect(); - CVar.FindCVar('swwm_lasttab').SetString(tabs[curtab].GetClassName()); + shnd.menustate.Insert("LastTab",tabs[curtab].GetClassName()); break; } xx += len; @@ -394,6 +405,7 @@ Class DemolitionistMenu : GenericMenu tabs[curtab].OnDeselect(); curtab = oldtab; tabs[curtab].OnSelect(); + shnd.menustate.Insert("LastTab",tabs[curtab].GetClassName()); } else { @@ -403,6 +415,7 @@ Class DemolitionistMenu : GenericMenu tabs[curtab].OnDeselect(); curtab = help; tabs[curtab].OnSelect(); + shnd.menustate.Insert("LastTab",tabs[curtab].GetClassName()); } MenuSound("menu/demotab"); return true; diff --git a/zscript/kbase/swwm_kbase_list.zsc b/zscript/kbase/swwm_kbase_list.zsc index 2880168dd..7662faefb 100644 --- a/zscript/kbase/swwm_kbase_list.zsc +++ b/zscript/kbase/swwm_kbase_list.zsc @@ -1,63 +1,222 @@ // Classes for item list elements +// basic list +Class DemolitionistMenuList ui +{ + Array items; + int selected; + + // functions to save time + int GetWidth() + { + int mw = 0; + for ( int i=0; i mw ) mw = cw; + } + return mw; + } + int GetHeight() + { + int th = 0; + for ( int i=0; i inv; + int col; + bool bSell; + + DemolitionistMenuStoreItem Init( DemolitionistMenu master, Class i, bool bSell = false ) + { + Super.Init(master,""); + inv = i; + col = Font.CR_WHITE; + let def = GetDefaultByType(i); + if ( i is 'Weapon' ) col = SWWMUtility.IsVIPItemClass(i)?Font.FindFontColor('VIPGold'):Font.CR_GOLD; + else if ( i is 'MagAmmo' ) col = SWWMUtility.IsVIPItemClass(i)?Font.FindFontColor('VIPTan'):Font.CR_TAN; + else if ( (i is 'BackpackItem') || (i is 'HammerspaceEmbiggener') ) col = Font.CR_DARKBROWN; + else if ( i is 'Ammo' ) col = SWWMUtility.IsVIPItemClass(i)?Font.FindFontColor('VIPBrown'):Font.CR_BROWN; + else if ( (i is 'PowerupGiver') || (i is 'AmmoFabricator') || def.bBIGPOWERUP ) col = SWWMUtility.IsVIPItemClass(i)?Font.FindFontColor('VIPPurple'):Font.CR_PURPLE; + else if ( (i is 'Health') || (i is 'HealthPickup') || (i is 'SWWMHealth') ) col = Font.CR_RED; + else if ( (i is 'Armor') || (i is 'SWWMSpareArmor') ) col = Font.CR_GREEN; + self.bSell = bSell; + return self; + } + + int GetPrice() + { + return 0; + } + + int GetUnits() + { + return 0; + } +} + +// player item +Class DemolitionistMenuPlayerItem : DemolitionistMenuListItem +{ + PlayerInfo p; + + DemolitionistMenuPlayerItem Init( DemolitionistMenu master, PlayerInfo p ) + { + Super.Init(master,p.GetUserName()); + self.p = p; + return self; + } +} + +// chat message item +Class DemolitionistMenuChatItem : DemolitionistMenuListItem +{ + } diff --git a/zscript/kbase/swwm_kbase_textbox.zsc b/zscript/kbase/swwm_kbase_textbox.zsc index 3c134c052..d7de424f2 100644 --- a/zscript/kbase/swwm_kbase_textbox.zsc +++ b/zscript/kbase/swwm_kbase_textbox.zsc @@ -11,7 +11,7 @@ Class DemolitionistMenuTextBox ui int maxofs; // textbox initialization - virtual DemolitionistMenuTextBox Init( DemolitionistMenu master, String txt, int x = 0, int w = 0 ) + DemolitionistMenuTextBox Init( DemolitionistMenu master, String txt, int x = 0, int w = 0 ) { self.master = master; self.x = x; @@ -54,14 +54,14 @@ Class DemolitionistMenuTextBox ui return (ofs != oldofs); } - virtual void Ticker() + void Ticker() { // update smooth scroll smofs = (smofs*.6)+(ofs*.4); if ( abs(smofs-ofs) < (1./master.hs) ) smofs = ofs; } - virtual void Drawer( bool dark = false ) + void Drawer( bool dark = false ) { double xx = x+6; double yy = 17-smofs; diff --git a/zscript/kbase/swwm_kbasetab_chat.zsc b/zscript/kbase/swwm_kbasetab_chat.zsc index 967824e85..d5158b489 100644 --- a/zscript/kbase/swwm_kbasetab_chat.zsc +++ b/zscript/kbase/swwm_kbasetab_chat.zsc @@ -5,8 +5,7 @@ Class DemolitionistChatTab : DemolitionistMenuTab override DemolitionistMenuTab Init( DemolitionistMenu master ) { title = "$SWWM_CHATTAB"; - let bar = SWWMStatusBar(StatusBar); - bHidden = (!bar||(bar.FullHistory.Size()<=0)); + bHidden = !SWWMFullHistory.Get(); return Super.Init(master); } } diff --git a/zscript/kbase/swwm_kbasetab_stats.zsc b/zscript/kbase/swwm_kbasetab_stats.zsc index 8239f5d55..b805036c4 100644 --- a/zscript/kbase/swwm_kbasetab_stats.zsc +++ b/zscript/kbase/swwm_kbasetab_stats.zsc @@ -2,9 +2,7 @@ Class DemolitionistStatsTab : DemolitionistMenuTab { - Array stats, kills; - Array mapstats; - Array achievements; + DemolitionistMenuList stats, kills, mapstats, achievements; int section; override DemolitionistMenuTab Init( DemolitionistMenu master ) diff --git a/zscript/swwm_statichandler.zsc b/zscript/swwm_statichandler.zsc index 440d83dc5..d7f0fd6fb 100644 --- a/zscript/swwm_statichandler.zsc +++ b/zscript/swwm_statichandler.zsc @@ -21,6 +21,7 @@ Class SWWMStaticHandler : StaticEventHandler ui bool mpsent, checked; int maptime; bool unloading; + ui Dictionary menustate; // used by Demolitionist Menu to restore old menu positions override void NewGame() { diff --git a/zscript/swwm_thinkers_hud.zsc b/zscript/swwm_thinkers_hud.zsc index bd78a35c9..573957e12 100644 --- a/zscript/swwm_thinkers_hud.zsc +++ b/zscript/swwm_thinkers_hud.zsc @@ -1,5 +1,33 @@ // thinkers related to the hud +// "Full History" contains all messages since session start, nothing is flushed +// this can be accessed from a section of the knowledge base +Class SWWMFullHistory : Thinker +{ + Array msg; + + static clearscope SWWMFullHistory Get() + { + let fh = SWWMFullHistory(ThinkerIterator.Create("SWWMFullHistory",STAT_STATIC).Next()); + return fh; + } + + static void PushMessage( String str, int tic, int type ) + { + let fh = SWWMFullHistory(ThinkerIterator.Create("SWWMFullHistory",STAT_STATIC).Next()); + if ( !fh ) + { + fh = new("SWWMFullHistory"); + fh.ChangeStatNum(STAT_STATIC); + } + MsgLine m = new("MsgLine"); + m.str = str; + m.tic = tic; + m.type = type; + fh.msg.Push(m); + } +} + Enum EScoreObjType { ST_Score,