Various tweaks to menu code.

Add "mission log" thinker for use in custom maps.
This commit is contained in:
Mari the Deer 2022-03-11 18:24:17 +01:00
commit 8769496e36
18 changed files with 150 additions and 27 deletions

View file

@ -351,7 +351,7 @@ Class DemolitionistMenu : GenericMenu
for ( int i=0; i<tabs.Size(); i++ )
{
if ( tabs[i].bHidden ) continue;
str = StringTable.Localize(tabs[i].title);
str = tabs[i].title;
len = smallfont.StringWidth(str)+10;
if ( (mpos.x >= xx) && (mpos.x < xx+len) )
{
@ -524,7 +524,7 @@ Class DemolitionistMenu : GenericMenu
for ( int i=0; i<tabs.Size(); i++ )
{
if ( tabs[i].bHidden ) continue;
str = StringTable.Localize(tabs[i].title);
str = tabs[i].title;
Screen.DrawText(smallfont,(curtab==i)?Font.CR_FIRE:Font.CR_DARKGRAY,origin.x+xx,origin.y+yy,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
xx += smallfont.StringWidth(str)+10;
DrawVSeparator(xx-5,0,14);

View file

@ -344,6 +344,12 @@ Class DemolitionistMenuLoreItem : DemolitionistMenuListItem
return self;
}
override int GetWidth()
{
if ( !ent.read ) smallfont.StringWidth("‼"..label);
return smallfont.StringWidth(label);
}
// marks this entry as read
void MarkRead()
{

View file

@ -5,7 +5,18 @@ extend Class DemolitionistMenu
// initialize the crime clock
private void SetClock()
{
if ( gameinfo.gametype&GAME_Heretic )
// use mission log clock if available
let mlog = SWWMMissionLog.Get();
if ( mlog && mlog.clockset )
{
c_year = mlog.year;
c_month = mlog.month;
c_day = mlog.day;
c_hour = mlog.hour;
c_minute = mlog.minute;
c_tz = mlog.tz;
}
else if ( gameinfo.gametype&GAME_Heretic )
{
// April 10th 2171, 17:34 JST
// Epoch: 6351554040

View file

@ -42,8 +42,10 @@ Class DemolitionistMenuTab ui abstract
virtual void Drawer()
{
// placeholder (so don't call super)
String str = "NOT IMPLEMENTED";
Screen.DrawText(smallfont,Font.CR_RED,int(master.ss.x-smallfont.StringWidth(str))/2,int(master.ss.y-smallfont.GetHeight())/2,str,DTA_VirtualWidthF,master.ss.x,DTA_VirtualHeightF,master.ss.y,DTA_KeepRatio,true);
String str = StringTable.Localize("$SWWM_COMINGSOON");
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);
}
}

View file

@ -47,6 +47,8 @@ Class DemolitionistMenuTextBox ui
if ( l ) l.Destroy();
l = smallfont.BreakLines(self.txt,self.w-12);
int h = l.Count()*13;
scrollbar = false;
maxofs = 0;
if ( h > (master.ws.y-34) )
{
l.Destroy();

View file

@ -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);
}

View file

@ -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];

View file

@ -4,7 +4,7 @@ Class DemolitionistInventoryTab : DemolitionistMenuTab
{
override DemolitionistMenuTab Init( DemolitionistMenu master )
{
title = "$SWWM_INVTAB";
title = StringTable.Localize("$SWWM_INVTAB");
return Super.Init(master);
}
}

View file

@ -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);
}

View file

@ -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);
}
}
}

View file

@ -5,11 +5,21 @@ Class DemolitionistMissionTab : DemolitionistMenuTab
Array<DemolitionistMenuTextBox> 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;

View file

@ -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);
}

View file

@ -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);

View file

@ -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);
}

View file

@ -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<MAXPLAYERS; i++ )
{