From 8769496e360fbcc6d7e2d25e61d95680ff945127 Mon Sep 17 00:00:00 2001 From: Marisa Kirisame Date: Fri, 11 Mar 2022 18:24:17 +0100 Subject: [PATCH] Various tweaks to menu code. Add "mission log" thinker for use in custom maps. --- language.version | 4 +- zmapinfo.txt | 2 +- zscript/kbase/swwm_kbase.zsc | 4 +- zscript/kbase/swwm_kbase_list.zsc | 6 +++ zscript/kbase/swwm_kbase_priv.zsc | 13 +++++- zscript/kbase/swwm_kbase_tab.zsc | 6 ++- zscript/kbase/swwm_kbase_textbox.zsc | 2 + zscript/kbase/swwm_kbasetab_chat.zsc | 2 +- zscript/kbase/swwm_kbasetab_help.zsc | 2 +- zscript/kbase/swwm_kbasetab_inventory.zsc | 2 +- zscript/kbase/swwm_kbasetab_keychain.zsc | 2 +- zscript/kbase/swwm_kbasetab_library.zsc | 10 +++- zscript/kbase/swwm_kbasetab_mission.zsc | 57 +++++++++++++++++++---- zscript/kbase/swwm_kbasetab_secret.zsc | 2 +- zscript/kbase/swwm_kbasetab_stats.zsc | 12 ++++- zscript/kbase/swwm_kbasetab_store.zsc | 2 +- zscript/kbase/swwm_kbasetab_trading.zsc | 2 +- zscript/swwm_thinkers_player.zsc | 47 ++++++++++++++++++- 18 files changed, 150 insertions(+), 27 deletions(-) diff --git a/language.version b/language.version index 628acf75b..72b8b3b01 100644 --- a/language.version +++ b/language.version @@ -1,3 +1,3 @@ [default] -SWWM_MODVER="\cyDEMOLITIONIST \cw1.2pre r188 \cu(Fri 11 Mar 16:56:54 CET 2022)\c-"; -SWWM_SHORTVER="\cw1.2pre r188 \cu(2022-03-11 16:56:54)\c-"; +SWWM_MODVER="\cyDEMOLITIONIST \cw1.2pre r189 \cu(Fri 11 Mar 18:24:17 CET 2022)\c-"; +SWWM_SHORTVER="\cw1.2pre r189 \cu(2022-03-11 18:24:17)\c-"; diff --git a/zmapinfo.txt b/zmapinfo.txt index 578a36f3d..4011c9b0e 100644 --- a/zmapinfo.txt +++ b/zmapinfo.txt @@ -205,7 +205,7 @@ Skill lunatic MustConfirm = "$SWWM_SKLUNATICCONFIRM" } -Map TITLEMAP "DEMOLITIONIST Title Map" +Map TITLEMAP "Title Map" { Music = "" EventHandlers = "SWWMTitleStuff" diff --git a/zscript/kbase/swwm_kbase.zsc b/zscript/kbase/swwm_kbase.zsc index 3030848f5..13b5e1ed1 100644 --- a/zscript/kbase/swwm_kbase.zsc +++ b/zscript/kbase/swwm_kbase.zsc @@ -351,7 +351,7 @@ Class DemolitionistMenu : GenericMenu for ( int i=0; i= xx) && (mpos.x < xx+len) ) { @@ -524,7 +524,7 @@ Class DemolitionistMenu : GenericMenu for ( int i=0; i (master.ws.y-34) ) { l.Destroy(); diff --git a/zscript/kbase/swwm_kbasetab_chat.zsc b/zscript/kbase/swwm_kbasetab_chat.zsc index d5158b489..b593718f6 100644 --- a/zscript/kbase/swwm_kbasetab_chat.zsc +++ b/zscript/kbase/swwm_kbasetab_chat.zsc @@ -4,7 +4,7 @@ Class DemolitionistChatTab : DemolitionistMenuTab { override DemolitionistMenuTab Init( DemolitionistMenu master ) { - title = "$SWWM_CHATTAB"; + title = StringTable.Localize("$SWWM_CHATTAB"); bHidden = !SWWMFullHistory.Get(); return Super.Init(master); } diff --git a/zscript/kbase/swwm_kbasetab_help.zsc b/zscript/kbase/swwm_kbasetab_help.zsc index 0aacc947b..a343eff38 100644 --- a/zscript/kbase/swwm_kbasetab_help.zsc +++ b/zscript/kbase/swwm_kbasetab_help.zsc @@ -7,7 +7,7 @@ Class DemolitionistHelpTab : DemolitionistMenuTab override DemolitionistMenuTab Init( DemolitionistMenu master ) { - title = "$SWWM_HELPTAB"; + title = StringTable.Localize("$SWWM_HELPTAB"); bHidden = true; String kstr; if ( master.mkey[1] != "" ) kstr = master.mkey[0].."/"..master.mkey[1]; diff --git a/zscript/kbase/swwm_kbasetab_inventory.zsc b/zscript/kbase/swwm_kbasetab_inventory.zsc index d905a5c15..2086169b5 100644 --- a/zscript/kbase/swwm_kbasetab_inventory.zsc +++ b/zscript/kbase/swwm_kbasetab_inventory.zsc @@ -4,7 +4,7 @@ Class DemolitionistInventoryTab : DemolitionistMenuTab { override DemolitionistMenuTab Init( DemolitionistMenu master ) { - title = "$SWWM_INVTAB"; + title = StringTable.Localize("$SWWM_INVTAB"); return Super.Init(master); } } diff --git a/zscript/kbase/swwm_kbasetab_keychain.zsc b/zscript/kbase/swwm_kbasetab_keychain.zsc index 7df7919f4..c3b296636 100644 --- a/zscript/kbase/swwm_kbasetab_keychain.zsc +++ b/zscript/kbase/swwm_kbasetab_keychain.zsc @@ -4,7 +4,7 @@ Class DemolitionistKeychainTab : DemolitionistMenuTab { override DemolitionistMenuTab Init( DemolitionistMenu master ) { - title = "$SWWM_KEYTAB"; + title = StringTable.Localize("$SWWM_KEYTAB"); bHidden = deathmatch; return Super.Init(master); } diff --git a/zscript/kbase/swwm_kbasetab_library.zsc b/zscript/kbase/swwm_kbasetab_library.zsc index ec86b35e2..4b1c9d627 100644 --- a/zscript/kbase/swwm_kbasetab_library.zsc +++ b/zscript/kbase/swwm_kbasetab_library.zsc @@ -45,7 +45,7 @@ Class DemolitionistLibraryTab : DemolitionistMenuTab override DemolitionistMenuTab Init( DemolitionistMenu master ) { - title = "$SWWM_KBASETAB"; + title = StringTable.Localize("$SWWM_KBASETAB"); lore = SWWMLoreLibrary.Find(players[consoleplayer]); section = 0; lwidth = 0; @@ -409,5 +409,13 @@ Class DemolitionistLibraryTab : DemolitionistMenuTab Screen.DrawText(smallfont,Font.CR_FIRE,master.origin.x+xx,master.origin.y+yy,"▮",DTA_VirtualWidthF,master.ss.x,DTA_VirtualHeightF,master.ss.y,DTA_KeepRatio,true); } if ( clore && ltext ) ltext.Drawer(); + else + { + str = StringTable.Localize("$SWWM_LOREUNSEL"); + int lwx = lwidth+((maxofs[section]>0)?8:0); + xx = lwx+int((master.ws.x-lwx)-smallfont.StringWidth(str))/2; + yy = int(master.ws.y-smallfont.GetHeight())/2; + Screen.DrawText(smallfont,Font.CR_FIRE,master.origin.x+xx,master.origin.y+yy,str,DTA_VirtualWidthF,master.ss.x,DTA_VirtualHeightF,master.ss.y,DTA_KeepRatio,true); + } } } diff --git a/zscript/kbase/swwm_kbasetab_mission.zsc b/zscript/kbase/swwm_kbasetab_mission.zsc index 3c76e4da3..a14819dfc 100644 --- a/zscript/kbase/swwm_kbasetab_mission.zsc +++ b/zscript/kbase/swwm_kbasetab_mission.zsc @@ -5,11 +5,21 @@ Class DemolitionistMissionTab : DemolitionistMenuTab Array mtext; int sel; bool drag; + SWWMMissionLog mlog; override DemolitionistMenuTab Init( DemolitionistMenu master ) { - title = "$SWWM_MISSTAB"; + title = StringTable.Localize("$SWWM_MISSTAB"); sel = 0; + mlog = SWWMMissionLog.Get(); + // simplified initialization if we have a dedicated mission log + // note: mission log can't exist without one entry, so no fallback checks needed + if ( mlog ) + { + for ( int i=(mlog.entries.Size()-1); i>=0; i-- ) + mtext.Push(new("DemolitionistMenuTextBox").Init(master,mlog.entries[i])); + return Super.Init(master); + } // saves time bool nrftl = false; bool eviternity = false; @@ -120,12 +130,6 @@ Class DemolitionistMissionTab : DemolitionistMenuTab mtext.Push(new("DemolitionistMenuTextBox").Init(master,xstr)); } } - else - { - // no missions, hide ourselves - mtext.Push(new("DemolitionistMenuTextBox").Init(master,"$SWWM_MISSION_NONE")); - bHidden = true; - } return Super.Init(master); } override void OnDestroy() @@ -136,6 +140,7 @@ Class DemolitionistMissionTab : DemolitionistMenuTab override void MenuInput( int key ) { + if ( mtext.Size() == 0 ) return; switch ( key ) { case MK_DOWN: @@ -171,6 +176,7 @@ Class DemolitionistMissionTab : DemolitionistMenuTab override void MouseInput( Vector2 pos, int btn ) { + if ( mtext.Size() == 0 ) return; switch ( btn ) { case MB_LEFT: @@ -221,22 +227,57 @@ Class DemolitionistMissionTab : DemolitionistMenuTab // stop smooth scrolling for current textbox override void OnSelect() { + if ( mtext.Size() == 0 ) return; mtext[sel].smofs = mtext[sel].ofs; } override void OnDeselect() { + if ( mtext.Size() == 0 ) return; mtext[sel].smofs = mtext[sel].ofs; } override void Ticker() { + // dedicated mission log can update in real time, so append new entries to the start of the array when needed and push the selector forward + if ( mlog && (mlog.entries.Size() > mtext.Size()) ) + { + bool newent = false; + if ( mtext.Size() == 0 ) + { + for ( int i=(mlog.entries.Size()-1); i>=0; i-- ) + mtext.Push(new("DemolitionistMenuTextBox").Init(master,mlog.entries[i])); + sel = 0; + newent = true; + } + else for ( int i=(mlog.entries.Size()-1); i>=mtext.Size(); i-- ) + { + mtext.Insert(0,new("DemolitionistMenuTextBox").Init(master,mlog.entries[i])); + sel++; + newent = true; + } + // notification for mission log updated + if ( newent ) + { + master.tmsg = StringTable.Localize("$SWWM_NEWMISSION"); + master.tmsgtic = gametic+70; + } + } // just tick the current textbox + if ( mtext.Size() == 0 ) return; mtext[sel].Ticker(); } override void Drawer() { - mtext[sel].Drawer(!!sel); + if ( mtext.Size() > 0 ) mtext[sel].Drawer(!!sel); + else + { + String str = StringTable.Localize("$SWWM_MISSION_NONE"); + double xx = int(master.ws.x-smallfont.StringWidth(str))/2; + double yy = int(master.ws.y-smallfont.GetHeight())/2; + Screen.DrawText(smallfont,Font.CR_FIRE,master.origin.x+xx,master.origin.y+yy,str,DTA_VirtualWidthF,master.ss.x,DTA_VirtualHeightF,master.ss.y,DTA_KeepRatio,true); + return; + } if ( mtext.Size() <= 1 ) return; double xx = master.ws.x-(mtext[sel].scrollbar?11:3); double yy = master.ws.y-25; diff --git a/zscript/kbase/swwm_kbasetab_secret.zsc b/zscript/kbase/swwm_kbasetab_secret.zsc index 83714c419..48a08f342 100644 --- a/zscript/kbase/swwm_kbasetab_secret.zsc +++ b/zscript/kbase/swwm_kbasetab_secret.zsc @@ -4,7 +4,7 @@ Class DemolitionistSecretTab : DemolitionistMenuTab { override DemolitionistMenuTab Init( DemolitionistMenu master ) { - title = "$SWWM_SECRETTAB"; + title = StringTable.Localize("$SWWM_SECRETTAB"); bHidden = true; return Super.Init(master); } diff --git a/zscript/kbase/swwm_kbasetab_stats.zsc b/zscript/kbase/swwm_kbasetab_stats.zsc index b91f69d6c..c25873e22 100644 --- a/zscript/kbase/swwm_kbasetab_stats.zsc +++ b/zscript/kbase/swwm_kbasetab_stats.zsc @@ -14,7 +14,7 @@ Class DemolitionistStatsTab : DemolitionistMenuTab override DemolitionistMenuTab Init( DemolitionistMenu master ) { - title = "$SWWM_STATTAB"; + title = StringTable.Localize("$SWWM_STATTAB"); section = 0; lwidth = 0; for ( int i=0; i<4; i++ ) @@ -542,9 +542,17 @@ Class DemolitionistStatsTab : DemolitionistMenuTab yy += 16; } master.DrawVSeparator(lwidth,14,master.ws.y-28); - // achievement drawer has different margins + if ( lists[section].items.Size() == 0 ) + { + String str = StringTable.Localize("$SWWM_NOSTAT"); + xx = lwidth+int((master.ws.x-lwidth)-smallfont.StringWidth(str))/2; + yy = int(master.ws.y-smallfont.GetHeight())/2; + Screen.DrawText(smallfont,Font.CR_FIRE,master.origin.x+xx,master.origin.y+yy,str,DTA_VirtualWidthF,master.ss.x,DTA_VirtualHeightF,master.ss.y,DTA_KeepRatio,true); + return; + } if ( section == 3 ) { + // achievement drawer has different margins xx = lwidth+12; yy = 26; int cliptop = int((master.origin.y+26)*master.hs); diff --git a/zscript/kbase/swwm_kbasetab_store.zsc b/zscript/kbase/swwm_kbasetab_store.zsc index 2da98eb68..5dffb6dd6 100644 --- a/zscript/kbase/swwm_kbasetab_store.zsc +++ b/zscript/kbase/swwm_kbasetab_store.zsc @@ -4,7 +4,7 @@ Class DemolitionistStoreTab : DemolitionistMenuTab { override DemolitionistMenuTab Init( DemolitionistMenu master ) { - title = "$SWWM_STORETAB"; + title = StringTable.Localize("$SWWM_STORETAB"); bHidden = (deathmatch||(G_SkillPropertyInt(SKILLP_ACSReturn)>=4)); return Super.Init(master); } diff --git a/zscript/kbase/swwm_kbasetab_trading.zsc b/zscript/kbase/swwm_kbasetab_trading.zsc index 5bde2c9c7..79d17b1c7 100644 --- a/zscript/kbase/swwm_kbasetab_trading.zsc +++ b/zscript/kbase/swwm_kbasetab_trading.zsc @@ -4,7 +4,7 @@ Class DemolitionistTradeTab : DemolitionistMenuTab { override DemolitionistMenuTab Init( DemolitionistMenu master ) { - title = "$SWWM_TRADETAB"; + title = StringTable.Localize("$SWWM_TRADETAB"); bHidden = true; for ( int i=0; i entries; + bool clockset; + int year, month, day, hour, minute; + String tz; + + static clearscope SWWMMissionLog Get() + { + let ml = SWWMMissionLog(ThinkerIterator.Create("SWWMMissionLog",STAT_STATIC).Next()); + return ml; + } + + static play void AddLog( String str ) + { + let ml = SWWMMissionLog(ThinkerIterator.Create("SWWMMissionLog",STAT_STATIC).Next()); + if ( !ml ) + { + ml = new("SWWMMissionLog"); + ml.ChangeStatNum(STAT_STATIC); + } + if ( ml.entries.Find(str) < ml.entries.Size() ) return; + ml.entries.Push(str); + Console.Printf(StringTable.Localize("$SWWM_NEWMISSION")); + } + + static play void SetClock( int year, int month, int day, int hour, int minute, String tz = "JST" ) + { + let ml = SWWMMissionLog(ThinkerIterator.Create("SWWMMissionLog",STAT_STATIC).Next()); + if ( !ml ) + { + ml = new("SWWMMissionLog"); + ml.ChangeStatNum(STAT_STATIC); + } + ml.clockset = true; + ml.year = year; + ml.month = month; + ml.day = day; + ml.hour = hour; + ml.minute = minute; + ml.tz = tz; + } +} + // Stats Class WeaponUsage {