Overhaul stat screen, remove fanart.

This commit is contained in:
Mari the Deer 2023-09-09 14:47:30 +02:00
commit bb8478af4a
43 changed files with 463 additions and 1012 deletions

View file

@ -100,8 +100,8 @@ Class SWWMCreditsMenu : GenericMenu
TextureID bgtex;
TextureID logo;
String stitle, stitle2;
String sdev, sassets, smusic, svoice, sfanart, slocal, spatrons, sthanks;
Array<SWWMCreditsEntry> cdev, cassets, cmusic, cvoice, cfanart, clocal, cpatrons, cthanks;
String sdev, sassets, smusic, svoice, slocal, spatrons, sthanks;
Array<SWWMCreditsEntry> cdev, cassets, cmusic, cvoice, clocal, cpatrons, cthanks;
String oldlang;
Vector2 ss;
double hs;
@ -144,7 +144,6 @@ Class SWWMCreditsMenu : GenericMenu
sassets = StringTable.Localize("$SWWM_CASSETS");
smusic = StringTable.Localize("$SWWM_CMUSIC");
svoice = StringTable.Localize("$SWWM_CVOICE");
sfanart = StringTable.Localize("$SWWM_CFANART");
slocal = StringTable.Localize("$SWWM_CLOCAL");
spatrons = StringTable.Localize("$SWWM_CPATRON");
sthanks = StringTable.Localize("$SWWM_CTHANK");
@ -161,10 +160,6 @@ Class SWWMCreditsMenu : GenericMenu
cmusic.Push(new("SWWMCreditsEntry").Init("Teque","Traumatic State\nDragony\nHidden Tune #242\nHypercardish 1.1"));
cmusic.Push(new("SWWMCreditsEntry").Init("BouncyTEM","Solitary Apprehension"));
cvoice.Push(new("SWWMCreditsEntry").Init("Vyolette","$T_DEMOLITIONIST"));
cfanart.Push(new("SWWMCreditsEntry").Init("Substance20 (@S20TBL)"));
cfanart.Push(new("SWWMCreditsEntry").Init("Sgt. Shivers (@Sgt_Shivers_)"));
cfanart.Push(new("SWWMCreditsEntry").Init("Moa Dixøn / Endie (@MoaDixon)"));
cfanart.Push(new("SWWMCreditsEntry").Init("Monsoon-Soft (@MonsoonSoft)"));
clocal.Push(new("SWWMCreditsEntry").Init("Marisa the Magician","$SWWM_LOCES"));
cpatrons.Push(new("SWWMCreditsEntry").Init("Snacks"));
cpatrons.Push(new("SWWMCreditsEntry").Init("john"));
@ -215,11 +210,6 @@ Class SWWMCreditsMenu : GenericMenu
theight += ENTRY_PAD;
theight += c.height;
}
foreach ( c:cfanart )
{
theight += ENTRY_PAD;
theight += c.height;
}
foreach ( c:clocal )
{
theight += ENTRY_PAD;
@ -312,14 +302,6 @@ Class SWWMCreditsMenu : GenericMenu
yy += ENTRY_PAD;
yy += c.Draw(ss,xx,yy);
}
// fanart
yy += SECTION_PAD;
yy += DrawSection(xx,yy,sfanart);
foreach ( c:cfanart )
{
yy += ENTRY_PAD;
yy += c.Draw(ss,xx,yy);
}
// localization
yy += SECTION_PAD;
yy += DrawSection(xx,yy,slocal);

View file

@ -1,20 +1,41 @@
// Custom intermission screens
Class SWWMStatScreen : StatusScreen abstract
Class SWWMStatScreen : StatusScreen
{
transient TextureID bgtex, arttex;
TextureID gradtex, arttex, bgtex;
int glarestr, sndcnt;
int whichart, whichtip;
int tipalphastate;
double tipalpha;
String tipstr;
transient BrokenLines tipl;
Font TewiFont, TewiFontOutline, MiniwiFont;
double FracTic; // for smooth animations
bool bNoDrawNextLoc;
int tipflash; // for switching
// customizable colors
int lnamecolor, lauthcolor; // name / author text
int lsubcolor; // finished / entering text
int statbasecolor, statcolor0, // stat label / color for numbers
statcolor1, statcolor2; // color for 100% / color for SUCKS
int tipcolor0, tipcolor1; // tip header / tip text
Color glarecolor; // for the eye glare when advancing
int flashcolor, tipflashcolor;
double hs, hs2;
Vector2 ss, ss2, origin, origin2;
Font mSmallFont;
String tipstr;
transient BrokenLines tipl;
double bgfade;
bool bFade;
SWWMStaticHandler shnd;
override void Start( wbstartstruct wbstartstruct )
{
Super.Start(wbstartstruct);
mSmallFont = Font.GetFont('TewiFont');
TewiFont = Font.GetFont('TewiFont');
TewiFontOutline = Font.GetFont('TewiFontOutline');
MiniwiFont = Font.GetFont('MiniwiFont');
// support for old author text style
int iof;
for ( int i=0; i<=1; i++ )
@ -37,27 +58,182 @@ Class SWWMStatScreen : StatusScreen abstract
// level name may contain trailing whitespace due to DEHACKED nonsense, so strip it
lnametexts[i].StripRight();
}
tipalpha = -1.;
// defaults
lnamecolor = Font.CR_WHITE;
lauthcolor = Font.CR_DARKGRAY;
lsubcolor = Font.CR_SAPPHIRE;
statbasecolor = Font.CR_SAPPHIRE;
statcolor0 = Font.CR_WHITE;
statcolor1 = Font.CR_GOLD;
statcolor2 = Font.CR_RED;
tipcolor0 = Font.CR_SAPPHIRE;
tipcolor1 = Font.CR_WHITE;
flashcolor = Font.FindFontColor('MiniFlash');
tipflashcolor = Font.FindFontColor('MiniWhiteFlash');
glarecolor = 0xFF4080FF;
}
override void StartMusic()
{
if ( swwm_intermusic ) Level.SetInterMusic(wbs.next);
else S_ChangeMusic("music/DRAGONY.XM");
S_ChangeMusic("music/DRAGONY.XM");
}
private String StatCnt( int a, int b )
{
if ( b <= 0 ) return "N/A";
return String.Format("%s \cu/\c- %s \cu(\c-%3d%%\cu)",SWWMUtility.ThousandsNum(max(a,0)),SWWMUtility.ThousandsNum(b),GetPct(a,b));
}
private String TimeStr( int secs )
{
secs = max(secs,0);
int h = secs/3600;
int m = (secs/60)%60;
int s = secs%60;
if ( h ) return String.Format("%02d\cu:\c-%02d\cu:\c-%02d",h,m,s);
return String.Format("%02d\cu:\c-%02d",m,s);
}
private int GetPct( int a, int b )
{
if ( a < 0 ) return 0;
if ( b <= 0 ) return 100; // for "missed" percentage
return (a*100)/b;
}
override int DrawLF()
{
if ( sp_state < 1 ) return 0;
double GameSecs = (bcnt+FracTic)/double(GameTicRate);
int th = (TewiFont.GetHeight()*(8+(!!wbs.partime)+(wbs.totaltime!=Plrs[me].stime))+32)*CleanYFac_1; // height of the stats box + margin
int bh = ((authortexts[0]!="")?(MiniwiFont.GetHeight()+TewiFont.GetHeight()*2+TewiFontOutline.GetHeight()*2):(TewiFont.GetHeight()*2+TewiFontOutline.GetHeight()*2))*CleanYFac_1; // height of the "level finished" box
double xx = Screen.GetWidth()/2;
double yy = (Screen.GetHeight()-th)/2;
if ( (Screen.GetHeight()/CleanYFac_1) < 480 )
{
// upshift to fit tips
int fct = int(clamp(480-(Screen.GetHeight()/CleanYFac_1),0,80)*.75);
yy -= fct;
}
yy -= bh;
if ( !gradtex ) gradtex = TexMan.CheckForTexture("graphics/M_GRAD.png");
Screen.DrawTexture(gradtex,false,xx,yy+bh/2,DTA_DestWidth,150*CleanXFac_1,DTA_DestHeight,bh+4*CleanYFac_1,DTA_Rotate,90,DTA_LegacyRenderStyle,STYLE_Shaded,DTA_FillColor,Color(0,0,0),DTA_Alpha,.8,DTA_TopOffset,256,DTA_LeftOffset,128);
Screen.DrawTexture(gradtex,false,xx,yy+bh/2,DTA_DestWidth,150*CleanXFac_1,DTA_DestHeight,bh+4*CleanYFac_1,DTA_Rotate,270,DTA_LegacyRenderStyle,STYLE_Shaded,DTA_FillColor,Color(0,0,0),DTA_Alpha,.8,DTA_TopOffset,256,DTA_LeftOffset,128);
Screen.DrawText(TewiFont,lnamecolor,xx-TewiFont.StringWidth(lnametexts[0])*CleanXFac_1,yy,lnametexts[0],DTA_ScaleX,CleanXFac_1*2,DTA_ScaleY,CleanYFac_1*2);
yy += TewiFont.GetHeight()*2*CleanYFac_1;
if ( authortexts[0] != "" )
{
Screen.DrawText(MiniwiFont,lauthcolor,xx-MiniwiFont.StringWidth(authortexts[0])*CleanXFac_1/2,yy,authortexts[0],DTA_ScaleX,CleanXFac_1,DTA_ScaleY,CleanYFac_1);
yy += MiniwiFont.GetHeight()*CleanYFac_1;
}
String str = StringTable.Localize("$SWWM_INTERDONE");
Screen.DrawText(TewiFontOutline,lsubcolor,xx-TewiFontOutline.StringWidth(str)*CleanXFac_1,yy,str,DTA_ScaleX,CleanXFac_1*2,DTA_ScaleY,CleanYFac_1*2);
if ( (glarestr > 0) && (sp_state < 2) )
{
double alf = clamp((glarestr-FracTic)/20.,0.,1.)**2;
Screen.DrawText(TewiFontOutline,flashcolor,xx-TewiFontOutline.StringWidth(str)*CleanXFac_1,yy,str,DTA_ScaleX,CleanXFac_1*2,DTA_ScaleY,CleanYFac_1*2,DTA_LegacyRenderStyle,STYLE_Add,DTA_Alpha,alf);
}
return 0;
}
override void DrawEL()
{
int th = (TewiFont.GetHeight()*(8+(!!wbs.partime)+(wbs.totaltime!=Plrs[me].stime))+32)*CleanYFac_1; // height of the stats box + margin
int bh = ((authortexts[1]!="")?(MiniwiFont.GetHeight()+TewiFont.GetHeight()*2+TewiFontOutline.GetHeight()*2):(TewiFont.GetHeight()*2+TewiFontOutline.GetHeight()*2))*CleanYFac_1; // height of the "level finished" box
double xx = Screen.GetWidth()/2;
double yy = (Screen.GetHeight()+th)/2;
if ( (Screen.GetHeight()/CleanYFac_1) < 480 )
{
// upshift to fit tips
int fct = int(clamp(480-(Screen.GetHeight()/CleanYFac_1),0,80)*.75);
yy -= fct;
}
if ( !gradtex ) gradtex = TexMan.CheckForTexture("graphics/M_GRAD.png");
Screen.DrawTexture(gradtex,false,xx,yy+bh/2,DTA_DestWidth,150*CleanXFac_1,DTA_DestHeight,bh+4*CleanYFac_1,DTA_Rotate,90,DTA_LegacyRenderStyle,STYLE_Shaded,DTA_FillColor,Color(0,0,0),DTA_Alpha,.8,DTA_TopOffset,256,DTA_LeftOffset,128);
Screen.DrawTexture(gradtex,false,xx,yy+bh/2,DTA_DestWidth,150*CleanXFac_1,DTA_DestHeight,bh+4*CleanYFac_1,DTA_Rotate,270,DTA_LegacyRenderStyle,STYLE_Shaded,DTA_FillColor,Color(0,0,0),DTA_Alpha,.8,DTA_TopOffset,256,DTA_LeftOffset,128);
String str = StringTable.Localize("$SWWM_INTERNEXT");
Screen.DrawText(TewiFontOutline,lsubcolor,xx-TewiFontOutline.StringWidth(str)*CleanXFac_1,yy,str,DTA_ScaleX,CleanXFac_1*2,DTA_ScaleY,CleanYFac_1*2);
if ( (glarestr > 0) && (sp_state >= 10) )
{
double alf = clamp((glarestr-FracTic)/20.,0.,1.)**2;
Screen.DrawText(TewiFontOutline,flashcolor,xx-TewiFontOutline.StringWidth(str)*CleanXFac_1,yy,str,DTA_ScaleX,CleanXFac_1*2,DTA_ScaleY,CleanYFac_1*2,DTA_LegacyRenderStyle,STYLE_Add,DTA_Alpha,alf);
}
yy += TewiFontOutline.GetHeight()*2*CleanYFac_1;
Screen.DrawText(TewiFont,lnamecolor,xx-TewiFont.StringWidth(lnametexts[1])*CleanXFac_1,yy,lnametexts[1],DTA_ScaleX,CleanXFac_1*2,DTA_ScaleY,CleanXFac_1*2);
yy += TewiFont.GetHeight()*2*CleanYFac_1;
if ( authortexts[0] == "" ) return;
Screen.DrawText(MiniwiFont,lauthcolor,xx-MiniwiFont.StringWidth(authortexts[1])*CleanXFac_1/2,yy,authortexts[1],DTA_ScaleX,CleanXFac_1,DTA_ScaleY,CleanYFac_1);
}
override void drawStats( void )
{
if ( sp_state < 2 ) return;
int ne = (sp_state>=8)?(8+(!!wbs.partime)+(wbs.totaltime!=Plrs[me].stime)):(sp_state>=6)?6:(sp_state>=4)?4:2;
int th = (TewiFont.GetHeight()*ne)*CleanYFac_1; // height of the stats box
double xx = Screen.GetWidth()/2;
double yy = (Screen.GetHeight()-th)/2;
if ( (Screen.GetHeight()/CleanYFac_1) < 480 )
{
// upshift to fit tips
int fct = int(clamp(480-(Screen.GetHeight()/CleanYFac_1),0,80)*.75);
yy -= fct;
}
if ( !gradtex ) gradtex = TexMan.CheckForTexture("graphics/M_GRAD.png");
Screen.DrawTexture(gradtex,false,xx,yy+th/2,DTA_DestWidth,150*CleanXFac_1,DTA_DestHeight,th+4*CleanYFac_1,DTA_Rotate,90,DTA_LegacyRenderStyle,STYLE_Shaded,DTA_FillColor,Color(0,0,0),DTA_Alpha,.8,DTA_TopOffset,256,DTA_LeftOffset,128);
Screen.DrawTexture(gradtex,false,xx,yy+th/2,DTA_DestWidth,150*CleanXFac_1,DTA_DestHeight,th+4*CleanYFac_1,DTA_Rotate,270,DTA_LegacyRenderStyle,STYLE_Shaded,DTA_FillColor,Color(0,0,0),DTA_Alpha,.8,DTA_TopOffset,256,DTA_LeftOffset,128);
String str = StringTable.Localize("$SWWM_INTERKILLS");
Screen.DrawText(TewiFont,statbasecolor,xx-80*CleanXFac_1,yy,str,DTA_ScaleX,CleanXFac_1,DTA_ScaleY,CleanYFac_1);
yy += TewiFont.GetHeight()*CleanYFac_1;
str = StatCnt(cnt_kills[0],wbs.maxkills);
Screen.DrawText(TewiFont,((wbs.maxkills>0)&&(cnt_kills[0]>=wbs.maxkills))?statcolor1:statcolor0,xx+80*CleanXFac_1-TewiFont.StringWidth(str)*CleanXFac_1,yy,str,DTA_ScaleX,CleanXFac_1,DTA_ScaleY,CleanYFac_1);
if ( sp_state < 4 ) return;
yy += TewiFont.GetHeight()*CleanYFac_1;
str = StringTable.Localize("$SWWM_INTERITEMS");
Screen.DrawText(TewiFont,statbasecolor,xx-80*CleanXFac_1,yy,str,DTA_ScaleX,CleanXFac_1,DTA_ScaleY,CleanYFac_1);
yy += TewiFont.GetHeight()*CleanYFac_1;
str = StatCnt(cnt_items[0],wbs.maxitems);
Screen.DrawText(TewiFont,((wbs.maxitems>0)&&(cnt_items[0]>=wbs.maxitems))?statcolor1:statcolor0,xx+80*CleanXFac_1-TewiFont.StringWidth(str)*CleanXFac_1,yy,str,DTA_ScaleX,CleanXFac_1,DTA_ScaleY,CleanYFac_1);
if ( sp_state < 6 ) return;
yy += TewiFont.GetHeight()*CleanYFac_1;
str = StringTable.Localize("$SWWM_INTERSECRETS");
Screen.DrawText(TewiFont,statbasecolor,xx-80*CleanXFac_1,yy,str,DTA_ScaleX,CleanXFac_1,DTA_ScaleY,CleanYFac_1);
yy += TewiFont.GetHeight()*CleanYFac_1;
str = StatCnt(cnt_secret[0],wbs.maxsecret);
Screen.DrawText(TewiFont,((wbs.maxsecret>0)&&(cnt_secret[0]>=wbs.maxsecret))?statcolor1:statcolor0,xx+80*CleanXFac_1-TewiFont.StringWidth(str)*CleanXFac_1,yy,str,DTA_ScaleX,CleanXFac_1,DTA_ScaleY,CleanYFac_1);
if ( sp_state < 8 ) return;
yy += TewiFont.GetHeight()*CleanYFac_1;
str = "┈┈┄┄╌╌────╌╌┄┄┈┈";
Screen.DrawText(TewiFont,statbasecolor,xx-TewiFont.StringWidth(str)*CleanXFac_1/2,yy,str,DTA_ScaleX,CleanXFac_1,DTA_ScaleY,CleanYFac_1);
yy += TewiFont.GetHeight()*CleanYFac_1;
str = StringTable.Localize("$SWWM_INTERTIME");
Screen.DrawText(TewiFont,statbasecolor,xx-80*CleanXFac_1,yy,str,DTA_ScaleX,CleanXFac_1,DTA_ScaleY,CleanYFac_1);
str = TimeStr(max(cnt_time,0));
Screen.DrawText(TewiFont,(wbs.partime&&(cnt_time<=(wbs.partime/GameTicRate)))?statcolor1:((wbs.sucktime>0)&&(cnt_time>(wbs.sucktime*3600)))?statcolor2:statcolor0,xx+80*CleanXFac_1-TewiFont.StringWidth(str)*CleanXFac_1,yy,str,DTA_ScaleX,CleanXFac_1,DTA_ScaleY,CleanYFac_1);
if ( wbs.partime )
{
yy += TewiFont.GetHeight()*CleanYFac_1;
str = StringTable.Localize("$SWWM_INTERPAR");
Screen.DrawText(TewiFont,statbasecolor,xx-80*CleanXFac_1,yy,str,DTA_ScaleX,CleanXFac_1,DTA_ScaleY,CleanYFac_1);
str = TimeStr(max(cnt_par,0));
Screen.DrawText(TewiFont,statcolor0,xx+80*CleanXFac_1-TewiFont.StringWidth(str)*CleanXFac_1,yy,str,DTA_ScaleX,CleanXFac_1,DTA_ScaleY,CleanYFac_1);
}
if ( wbs.totaltime == Plrs[me].stime ) return;
yy += TewiFont.GetHeight()*CleanYFac_1;
str = StringTable.Localize("$SWWM_INTERTOTAL");
Screen.DrawText(TewiFont,statbasecolor,xx-80*CleanXFac_1,yy,str,DTA_ScaleX,CleanXFac_1,DTA_ScaleY,CleanYFac_1);
str = TimeStr(max(cnt_total_time,0));
Screen.DrawText(TewiFont,statcolor0,xx+80*CleanXFac_1-TewiFont.StringWidth(str)*CleanXFac_1,yy,str,DTA_ScaleX,CleanXFac_1,DTA_ScaleY,CleanYFac_1);
}
private void drawSWWMBg()
{
let shnd = SWWMStaticHandler(StaticEventHandler.Find("SWWMStaticHandler"));
if ( !whichart && swwm_interart )
if ( !shnd ) shnd = SWWMStaticHandler(StaticEventHandler.Find("SWWMStaticHandler"));
if ( !whichart )
{
int no = StringTable.Localize("$SWWM_NFANART").ToInt();
int no = StringTable.Localize("$SWWM_NRENDER").ToInt();
Array<Int> ents;
ents.Clear();
int rno = 0;
for ( int i=1; i<=no; i++ )
{
if ( (swwm_interart == 2) && (StringTable.Localize("$SWWM_FANART"..i).Left(6) == "Marisa") )
continue;
else if ( (swwm_interart == 3) && (StringTable.Localize("$SWWM_FANART"..i).Left(6) != "Marisa") )
continue;
ents.Push(i);
rno++;
}
@ -83,38 +259,24 @@ Class SWWMStatScreen : StatusScreen abstract
}
double ar = Screen.GetAspectRatio(), sar;
Vector2 tsize, vsize;
if ( whichart ) Screen.Clear(0,0,Screen.GetWidth(),Screen.GetHeight(),"Black");
else
{
if ( !bgtex ) bgtex = TexMan.CheckForTexture("graphics/InterBG.png");
tsize = TexMan.GetScaledSize(bgtex);
sar = tsize.x/tsize.y;
if ( sar > ar ) vsize = (tsize.y*ar,tsize.y);
else if ( sar < ar ) vsize = (tsize.x,tsize.x/ar);
else vsize = tsize;
Screen.DrawTexture(bgtex,false,(vsize.x-tsize.x)/2,(vsize.y-tsize.y)/2,DTA_VirtualWidthF,vsize.x,DTA_VirtualHeightF,vsize.y,DTA_KeepRatio,true);
}
Screen.Clear(0,0,Screen.GetWidth(),Screen.GetHeight(),"Black");
// background pics
if ( whichart )
{
String artstr = StringTable.Localize(String.Format("$SWWM_FANART%d",whichart));
int semic = artstr.IndexOf(";");
if ( !arttex ) arttex = TexMan.CheckForTexture(String.Format("graphics/Fanart/%s",(semic==-1)?artstr:artstr.Left(semic)));
String artstr = StringTable.Localize(String.Format("$SWWM_RENDER%d",whichart));
if ( !arttex ) arttex = TexMan.CheckForTexture("graphics/Renders/"..artstr);
tsize = TexMan.GetScaledSize(arttex);
sar = tsize.x/tsize.y;
if ( sar > ar ) vsize = (tsize.y*ar,tsize.y);
else if ( sar < ar ) vsize = (tsize.x,tsize.x/ar);
else vsize = tsize;
Screen.DrawTexture(arttex,false,(vsize.x-tsize.x)/2,(vsize.y-tsize.y)/2,DTA_VirtualWidthF,vsize.x,DTA_VirtualHeightF,vsize.y,DTA_KeepRatio,true);
if ( semic != -1 )
{
String bstr = String.Format("\cx%s\c- %s",StringTable.Localize("$SWWM_FANART"),artstr.Mid(semic+1));
int len = mSmallFont.StringWidth(bstr);
int bw = int((len+8)*hs), bh = int((mSmallFont.GetHeight()+4)*hs);
Screen.Dim("Black",.8,Screen.GetWidth()-bw,Screen.GetHeight()-bh,bw,bh);
Screen.DrawText(mSmallFont,Font.CR_GOLD,ss.x-(len+4),ss.y-(mSmallFont.GetHeight()+2),bstr,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
}
}
Screen.Dim("Black",.25,0,0,Screen.GetWidth(),Screen.GetHeight());
}
private void drawSWWMFg()
{
if ( !shnd ) shnd = SWWMStaticHandler(StaticEventHandler.Find("SWWMStaticHandler"));
// intermission tips at the bottom
if ( !whichtip )
{
@ -139,136 +301,101 @@ Class SWWMStatScreen : StatusScreen abstract
}
}
whichtip = ents[Random[InterArt](0,ents.Size()-1)];
tipstr = "\cd"..String.Format(StringTable.Localize("$SWWM_INTERTIP"),whichtip).."\c-\n"..StringTable.Localize(String.Format("$SWWM_INTERTIP%d",whichtip));
tipstr = String.Format(StringTable.Localize("$SWWM_INTERTIP"),whichtip).."\n"..StringTable.Localize(String.Format("$SWWM_INTERTIP%d",whichtip));
if ( tipl ) tipl.Destroy();
shnd.lasttip.Push(whichtip);
}
if ( swwm_nointertips ) return;
if ( tipalpha <= 0. ) return;
double alf = clamp(tipalpha+(tipalphastate*fractic)/GameTicRate,0.,1.);
if ( !tipl ) tipl = TewiFontOutline.BreakLines(tipstr,400);
int lw = 0;
if ( !tipl ) tipl = mSmallFont.BreakLines(tipstr,400);
for ( int i=0; i<tipl.Count(); i++ )
if ( tipl.StringWidth(i) > lw )
lw = tipl.StringWidth(i);
int bw = int((lw+12)*hs), bh = int((mSmallFont.GetHeight()*tipl.Count()+8)*hs);
double xx = 8, yy = (ss.y-8)-(mSmallFont.GetHeight()*tipl.Count());
Screen.Dim("Black",.8,int((xx-4)*hs),int((yy-4)*hs),bw,bh);
double xx = (Screen.GetWidth()-lw*CleanXFac_1)/2;
double yy = Screen.GetHeight()-60*CleanYFac_1;
if ( (Screen.GetHeight()/CleanYFac_1) < 480 )
{
// downshift to fit tips
int fct = clamp(480-(Screen.GetHeight()/CleanYFac_1),0,80)/3;
yy += fct;
}
yy -= (tipl.Count()-1)*TewiFontOutline.GetHeight();
if ( !gradtex ) gradtex = TexMan.CheckForTexture("graphics/M_GRAD.png");
Screen.DrawTexture(gradtex,false,Screen.GetWidth()/2,yy+TewiFontOutline.GetHeight()*tipl.Count()*CleanYFac_1/2.,DTA_DestWidth,350*CleanXFac_1,DTA_DestHeight,(TewiFontOutline.GetHeight()*tipl.Count()+8)*CleanYFac_1,DTA_Rotate,90,DTA_LegacyRenderStyle,STYLE_Shaded,DTA_FillColor,Color(0,0,0),DTA_Alpha,.8*alf,DTA_TopOffset,256,DTA_LeftOffset,128);
Screen.DrawTexture(gradtex,false,Screen.GetWidth()/2,yy+TewiFontOutline.GetHeight()*tipl.Count()*CleanYFac_1/2.,DTA_DestWidth,350*CleanXFac_1,DTA_DestHeight,(TewiFontOutline.GetHeight()*tipl.Count()+8)*CleanYFac_1,DTA_Rotate,270,DTA_LegacyRenderStyle,STYLE_Shaded,DTA_FillColor,Color(0,0,0),DTA_Alpha,.8*alf,DTA_TopOffset,256,DTA_LeftOffset,128);
double alph;
if ( tipflash && (gametic < tipflash) ) alph = max((tipflash-(gametic+fractic))/25.,0.)**1.5;
xx -= 8*CleanXFac_1;
for ( int i=0; i<tipl.Count(); i++ )
{
Screen.DrawText(mSmallFont,Font.CR_WHITE,xx,yy,tipl.StringAt(i),DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
yy += mSmallFont.GetHeight();
xx = 12;
Screen.DrawText(TewiFontOutline,(i==0)?tipcolor0:tipcolor1,xx,yy,tipl.StringAt(i),DTA_ScaleX,CleanXFac_1,DTA_ScaleY,CleanYFac_1,DTA_Alpha,alf);
if ( tipflash && (gametic < tipflash) )
Screen.DrawText(TewiFontOutline,tipflashcolor,xx,yy,tipl.StringAt(i),DTA_ScaleX,CleanXFac_1,DTA_ScaleY,CleanYFac_1,DTA_LegacyRenderStyle,STYLE_Add,DTA_Alpha,alf*alph);
yy += TewiFontOutline.GetHeight()*CleanYFac_1;
if ( i == 0 ) xx += 16*CleanXFac_1;
}
}
override int DrawLF()
override void Drawer( void )
{
int len[2];
len[0] = mSmallFont.StringWidth(lnametexts[0]);
len[1] = mSmallFont.StringWidth(authortexts[0]);
int dimlen = max(int((len[0]+8)*hs2),int((len[1]+8)*hs));
bool auth = (authortexts[0].Length()>0);
Screen.Dim("Black",.8,int((Screen.GetWidth()-dimlen)/2.),int(4*hs2),dimlen,int((mSmallFont.GetHeight()+(auth?2:4))*hs2));
Screen.DrawText(mSmallFont,Font.CR_GREEN,int((ss2.x-len[0])/2.),6,lnametexts[0],DTA_VirtualWidthF,ss2.x,DTA_VirtualHeightF,ss2.y,DTA_KeepRatio,true);
double foy = mSmallFont.GetHeight()+(auth?6:8);
if ( auth )
{
double oy = foy*(hs2/hs);
Screen.Dim("Black",.8,int((Screen.GetWidth()-dimlen)/2.),int(oy*hs),dimlen,int((mSmallFont.GetHeight()+2)*hs));
Screen.DrawText(mSmallFont,Font.CR_WHITE,int((ss.x-len[1])/2.),oy,authortexts[0],DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
foy += (mSmallFont.GetHeight()+2)*(hs/hs2);
}
foy += 4.;
String str = StringTable.Localize("$WI_FINISHED");
len[0] = mSmallFont.StringWidth(str);
Screen.Dim("Black",.8,int((ss2.x-len[0]-8)/2*hs2),int(foy*hs2),int((len[0]+8)*hs2),int((mSmallFont.GetHeight()+4)*hs2));
Screen.DrawText(mSmallFont,Font.CR_FIRE,int((ss2.x-len[0])/2.),foy+2,str,DTA_VirtualWidthF,ss2.x,DTA_VirtualHeightF,ss2.y,DTA_KeepRatio,true);
// return not used
return 0;
}
override void DrawEL()
{
String str = StringTable.Localize("$WI_ENTERING");
// remove trailing colon (usually appearing on Heretic)
if ( str.RightIndexOf(":") == (str.length()-1) ) str.Truncate(str.length()-1);
int len[2];
len[0] = mSmallFont.StringWidth(str);
Screen.Dim("Black",.8,int((ss2.x-len[0]-8)/2*hs2),int(4*hs2),int((len[0]+8)*hs2),int((mSmallFont.GetHeight()+4)*hs2));
Screen.DrawText(mSmallFont,Font.CR_FIRE,int((ss2.x-len[0])/2.),6,str,DTA_VirtualWidthF,ss2.x,DTA_VirtualHeightF,ss2.y,DTA_KeepRatio,true);
double foy = mSmallFont.GetHeight()+12;
len[0] = mSmallFont.StringWidth(lnametexts[1]);
len[1] = mSmallFont.StringWidth(authortexts[1]);
int dimlen = max(int((len[0]+8)*hs2),int((len[1]+8)*hs));
bool auth = (authortexts[1].Length()>0);
Screen.Dim("Black",.8,int((Screen.GetWidth()-dimlen)/2.),int(foy*hs2),dimlen,int((mSmallFont.GetHeight()+(auth?2:4))*hs2));
Screen.DrawText(mSmallFont,Font.CR_GREEN,int((ss2.x-len[0])/2.),foy+2,lnametexts[1],DTA_VirtualWidthF,ss2.x,DTA_VirtualHeightF,ss2.y,DTA_KeepRatio,true);
if ( auth )
{
double oy = (foy+mSmallFont.GetHeight()+2)*(hs2/hs);
Screen.Dim("Black",.8,int((Screen.GetWidth()-dimlen)/2.),int(oy*hs),dimlen,int((mSmallFont.GetHeight()+2)*hs));
Screen.DrawText(mSmallFont,Font.CR_WHITE,int((ss.x-len[1])/2.),oy,authortexts[1],DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
}
}
override void drawShowNextLoc( void )
{
drawSWWMBg();
drawEL();
}
override void Drawer()
{
// nothing here
}
override void Draw( double smoothratio )
{
hs = max(min(floor(Screen.GetWidth()/640.),floor(Screen.GetHeight()/400.)),1.);
hs2 = max(min(floor(Screen.GetWidth()/320.),floor(Screen.GetHeight()/200.)),1.);
ss = (Screen.GetWidth(),Screen.GetHeight())/hs;
ss2 = (Screen.GetWidth(),Screen.GetHeight())/hs2;
origin = (ss.x-640,ss.y-400)/2.;
origin2 = (ss2.x-320,ss2.y-200)/2.;
switch ( CurState )
{
case StatCount:
drawSWWMBg();
drawLF();
drawStats();
drawSWWMFg();
break;
case ShowNextLoc:
case NoState:
case LeavingIntermission:
drawShowNextLoc();
break;
break;
default:
drawNoState();
drawSWWMBg();
drawLF();
drawStats();
if ( !bNoDrawNextLoc ) drawEL();
drawSWWMFg();
break;
}
if ( bgfade <= 0. ) return;
if ( (bgfade <= 0.) || !arttex ) return;
double alph = bgfade;
if ( bFade ) alph = min(1.,bgfade+(3.*smoothratio)/GameTicRate);
else alph = max(0.,bgfade-(4.*smoothratio)/GameTicRate);
if ( bFade ) alph = min(1.,bgfade+(3.*FracTic)/GameTicRate);
else alph = max(0.,bgfade-(4.*FracTic)/GameTicRate);
// redraw BG on top, hiding the rest of the ui
TextureID tx;
if ( whichart ) tx = arttex;
else tx = bgtex;
double ar = Screen.GetAspectRatio();
Vector2 tsize = TexMan.GetScaledSize(tx);
Vector2 tsize = TexMan.GetScaledSize(arttex);
double sar = tsize.x/tsize.y;
Vector2 vsize;
if ( sar > ar ) vsize = (tsize.y*ar,tsize.y);
else if ( sar < ar ) vsize = (tsize.x,tsize.x/ar);
else vsize = tsize;
Screen.DrawTexture(tx,false,(vsize.x-tsize.x)/2,(vsize.y-tsize.y)/2,DTA_VirtualWidthF,vsize.x,DTA_VirtualHeightF,vsize.y,DTA_KeepRatio,true,DTA_Alpha,alph);
Screen.DrawTexture(arttex,false,(vsize.x-tsize.x)/2,(vsize.y-tsize.y)/2,DTA_VirtualWidthF,vsize.x,DTA_VirtualHeightF,vsize.y,DTA_KeepRatio,true,DTA_Alpha,alph);
}
override void Draw( double smoothratio )
{
FracTic = smoothratio;
Drawer();
if ( glarestr > 0 )
Screen.Dim(glarecolor,(clamp((glarestr-fractic)/20.,0.,1.)**2)*.3,0,0,Screen.GetWidth(),Screen.GetHeight());
}
override void Ticker( void )
{
bcnt++;
if ( bcnt == 1 ) StartMusic();
glarestr = max(glarestr-1,0);
tipalpha = min(tipalpha+tipalphastate/double(GameTicRate),2.);
switch (CurState)
{
case StatCount:
tipalphastate = 1;
updateStats();
break;
case ShowNextLoc:
updateShowNextLoc();
break;
case NoState:
tipalphastate = -2;
updateNoState();
break;
case LeavingIntermission:
@ -278,29 +405,7 @@ Class SWWMStatScreen : StatusScreen abstract
// check fade
if ( bFade ) bgfade = min(1.,bgfade+3./GameTicRate);
else bgfade = max(0.,bgfade-4./GameTicRate);
// force toggle
if ( !swwm_interart && (whichart != 0) )
{
whichart = 0;
arttex.SetNull();
}
}
protected String TimeStr( int secs )
{
secs = max(secs,0);
int h = secs/3600;
int m = (secs/60)%60;
int s = secs%60;
if ( h ) return String.Format("%02d\cu:\c-%02d\cu:\c-%02d",h,m,s);
return String.Format("%02d\cu:\c-%02d",m,s);
}
protected int GetPct( int a, int b, bool inv = false )
{
if ( a < 0 ) return 0;
if ( b <= 0 ) return inv?0:100; // for "missed" percentage
return (a*100)/b;
}
override bool OnEvent( InputEvent evt )
{
if ( evt.type == InputEvent.Type_KeyDown )
@ -318,13 +423,14 @@ Class SWWMStatScreen : StatusScreen abstract
}
if ( cmd ~== "+reload" )
{
if ( !swwm_nointertips ) PlaySound("menu/demoscroll");
PlaySound("misc/chat");
whichtip = 0;
tipflash = gametic+25;
return true;
}
if ( cmd ~== "+zoom" )
{
if ( swwm_interart ) PlaySound("menu/demoscroll");
PlaySound("misc/chat");
whichart = 0;
arttex.SetNull();
return true;
@ -339,4 +445,155 @@ Class SWWMStatScreen : StatusScreen abstract
}
return false;
}
override void updateNoState()
{
// make sure tip alpha is zero, so this transition is less jarring
if ( tipalpha > 0. ) return;
Super.updateNoState();
}
override void initShowNextLoc()
{
if ( wbs.next == "" )
{
// the base statscreen skips directly here, which looks
// very jarring with this one, so just skip to NoState
bNoDrawNextLoc = true;
initNoState();
return;
}
CurState = ShowNextLoc;
acceleratestage = 0;
cnt = SHOWNEXTLOCDELAY*GameTicRate;
noautostartmap = false;
}
override void initStats()
{
CurState = StatCount;
acceleratestage = 0;
sp_state = 0;
cnt_kills[0] = cnt_items[0] = cnt_secret[0] = -1;
cnt_time = cnt_par = -1;
cnt_pause = GameTicRate*2;
cnt_total_time = -1;
}
override void updateStats()
{
if ( sp_state == 0 )
{
if ( bcnt > GameTicRate )
{
S_StartSound("misc/interstart",CHAN_WEAPON,CHANF_OVERLAP|CHANF_UI,1.,0.);
acceleratestage = 0;
glarestr = 20;
sp_state++;
}
return;
}
if ( acceleratestage && (sp_state != 10) )
{
acceleratestage = 0;
sp_state = 10;
S_StartSound("misc/intercntdone",CHAN_VOICE,CHANF_OVERLAP|CHANF_UI,1.,0.);
glarestr = 10;
cnt_kills[0] = Plrs[me].skills;
cnt_items[0] = Plrs[me].sitems;
cnt_secret[0] = Plrs[me].ssecret;
cnt_time = Thinker.Tics2Seconds(Plrs[me].stime);
cnt_par = wbs.partime/GameTicRate;
cnt_total_time = Thinker.Tics2Seconds(wbs.totaltime);
}
if ( sp_state == 2 )
{
cnt_kills[0] += max((Plrs[me].skills-cnt_kills[0])/GameTicRate,1);
if ( !((sndcnt++)%2) )
{
S_StartSound("misc/intercnt",CHAN_VOICE,CHANF_OVERLAP|CHANF_UI,1.,0.);
glarestr = 5;
}
if ( cnt_kills[0] >= Plrs[me].skills )
{
S_StartSound("misc/intercntdone",CHAN_VOICE,CHANF_OVERLAP|CHANF_UI,1.,0.);
cnt_kills[0] = Plrs[me].skills;
glarestr = 10;
sp_state++;
}
}
else if ( sp_state == 4 )
{
cnt_items[0] += max((Plrs[me].sitems-cnt_items[0])/GameTicRate,1);
if ( !((sndcnt++)%2) )
{
S_StartSound("misc/intercnt",CHAN_VOICE,CHANF_OVERLAP|CHANF_UI,1.,0.);
glarestr = 5;
}
if ( cnt_items[0] >= Plrs[me].sitems )
{
S_StartSound("misc/intercntdone",CHAN_VOICE,CHANF_OVERLAP|CHANF_UI,1.,0.);
cnt_items[0] = Plrs[me].sitems;
glarestr = 10;
sp_state++;
}
}
else if ( sp_state == 6 )
{
cnt_secret[0] += max((Plrs[me].ssecret-cnt_secret[0])/GameTicRate,1);
if ( !((sndcnt++)%2) )
{
S_StartSound("misc/intercnt",CHAN_VOICE,CHANF_OVERLAP|CHANF_UI,1.,0.);
glarestr = 5;
}
if ( cnt_secret[0] >= Plrs[me].ssecret )
{
S_StartSound("misc/intercntdone",CHAN_VOICE,CHANF_OVERLAP|CHANF_UI,1.,0.);
cnt_secret[0] = Plrs[me].ssecret;
glarestr = 10;
sp_state++;
}
}
else if ( sp_state == 8 )
{
int sec = Thinker.Tics2Seconds(Plrs[me].stime);
int tsec = Thinker.Tics2Seconds(wbs.totaltime);
int psec = wbs.partime/GameTicRate;
if ( !((sndcnt++)%2) )
{
S_StartSound("misc/intercnt",CHAN_VOICE,CHANF_OVERLAP|CHANF_UI,1.,0.);
glarestr = 5;
}
cnt_time += max((sec-cnt_time)/GameTicRate,1);
cnt_par += max((psec-cnt_par)/GameTicRate,1);
cnt_total_time += max((tsec-cnt_total_time)/GameTicRate,1);
if ( cnt_time >= sec ) cnt_time = sec;
if ( cnt_total_time >= tsec ) cnt_total_time = tsec;
if ( cnt_par >= psec )
{
cnt_par = psec;
if ( cnt_time >= sec )
{
S_StartSound("misc/intercntdone",CHAN_VOICE,CHANF_OVERLAP|CHANF_UI,1.,0.);
cnt_total_time = tsec;
glarestr = 10;
sp_state++;
}
}
}
else if ( sp_state == 10 )
{
if ( acceleratestage )
{
S_StartSound("misc/interdone",CHAN_WEAPON,CHANF_OVERLAP|CHANF_UI,1.,0.);
glarestr = 20;
initShowNextLoc();
}
}
else if ( sp_state&1 )
{
if ( !--cnt_pause )
{
sp_state++;
cnt_pause = GameTicRate;
sndcnt = 0;
}
}
}
}

View file

@ -1,249 +0,0 @@
// Cooperative stats
Class SWWMStatScreen_Coop : SWWMStatScreen
{
override void initStats()
{
CurState = StatCount;
acceleratestage = 0;
ng_state = 1;
cnt_pause = GameTicRate;
for ( int i=0; i<MAXPLAYERS; i++ )
{
playerready[i] = false;
cnt_kills[i] = cnt_items[i] = cnt_secret[i] = cnt_frags[i] = 0;
if ( !playeringame[i] ) continue;
dofrags += fragSum(i);
}
dofrags = !!dofrags;
}
override void updateStats()
{
int fsum;
bool stillticking;
bool autoskip = autoSkip();
if ( (acceleratestage || autoskip) && (ng_state != 10) )
{
acceleratestage = 0;
for ( int i=0; i<MAXPLAYERS; i++ )
{
if ( !playeringame[i] ) continue;
cnt_kills[i] = Plrs[i].skills;
cnt_items[i] = Plrs[i].sitems;
cnt_secret[i] = Plrs[i].ssecret;
if ( dofrags ) cnt_frags[i] = fragSum(i);
}
PlaySound("menu/buyinv");
ng_state = 10;
}
if ( ng_state == 2 )
{
if ( !(bcnt&2) ) PlaySound("menu/demoscroll");
stillticking = false;
for ( int i=0; i<MAXPLAYERS; i++ )
{
if ( !playeringame[i] ) continue;
cnt_kills[i] += max((Plrs[i].skills-cnt_kills[i])/10,2);
if ( cnt_kills[i] > Plrs[i].skills ) cnt_kills[i] = Plrs[i].skills;
else stillticking = true;
}
if ( !stillticking )
{
PlaySound("menu/buyinv");
ng_state++;
}
}
else if ( ng_state == 4 )
{
if ( !(bcnt&2) ) PlaySound("menu/demoscroll");
stillticking = false;
for ( int i=0; i<MAXPLAYERS; i++ )
{
if ( !playeringame[i] ) continue;
cnt_items[i] += max((Plrs[i].sitems-cnt_items[i])/10,2);
if ( cnt_items[i] > Plrs[i].sitems ) cnt_items[i] = Plrs[i].sitems;
else stillticking = true;
}
if ( !stillticking )
{
PlaySound("menu/buyinv");
ng_state++;
}
}
else if ( ng_state == 6 )
{
if ( !(bcnt&2) ) PlaySound("menu/demoscroll");
stillticking = false;
for ( int i=0; i<MAXPLAYERS; i++ )
{
if ( !playeringame[i] ) continue;
cnt_secret[i] += max((Plrs[i].ssecret-cnt_secret[i])/10,2);
if ( cnt_secret[i] > Plrs[i].ssecret ) cnt_secret[i] = Plrs[i].ssecret;
else stillticking = true;
}
if ( !stillticking )
{
PlaySound("menu/buyinv");
ng_state += 1+2*!dofrags;
}
}
else if ( ng_state == 8 )
{
if ( !(bcnt&2) ) PlaySound("menu/demoscroll");
stillticking = false;
for ( int i=0; i<MAXPLAYERS; i++ )
{
if ( !playeringame[i] ) continue;
fsum = fragSum(i);
cnt_frags[i] += max((fsum-cnt_frags[i])/10,1);
if ( cnt_frags[i] >= fsum ) cnt_frags[i] = fsum;
else stillticking = true;
}
if ( !stillticking )
{
PlaySound("menu/buyinv");
ng_state++;
}
}
else if ( ng_state == 10 )
{
int i;
for ( i=0; i<MAXPLAYERS; i++ )
{
// If the player is in the game and not ready, stop checking
if ( playeringame[i] && !players[i].Bot && !playerready[i] )
break;
}
// All players are ready; proceed.
if ( ((i == MAXPLAYERS) && acceleratestage) || autoskip )
{
PlaySound("misc/w_pkup");
initShowNextLoc();
}
}
else if ( ng_state&1 )
{
if ( !--cnt_pause )
{
ng_state++;
cnt_pause = GameTicRate;
}
}
}
override void drawStats( void )
{
drawLF();
int checkmark = 0x2714; // "✔"
String namestr = StringTable.Localize("$SCORE_NAME");
String itemsstr = StringTable.Localize((gameinfo.gametype&GAME_Raven)?"$SCORE_BONUS":"$SCORE_ITEMS");
String secretstr = StringTable.Localize("$SCORE_SECRET");
String killsstr = StringTable.Localize("$SCORE_KILLS");
String missedstr = StringTable.Localize("$SCORE_MISSED");
String totalstr = StringTable.Localize("$SCORE_TOTAL");
int namelen = max(max(mSmallFont.StringWidth(namestr),mSmallFont.StringWidth("XXXXXXXXXX")),max(mSmallFont.StringWidth(missedstr),mSmallFont.StringWidth(totalstr)));
int nplayers = 0;
for ( int i=0; i<MAXPLAYERS; i++ )
{
if ( !playeringame[i] ) continue;
namelen = max(namelen,mSmallFont.StringWidth(players[i].GetUserName()));
nplayers++;
}
int misseditems = wbs.maxitems;
int missedsecret = wbs.maxsecret;
int missedkills = wbs.maxkills;
String itemstotal = String.Format("%d",misseditems);
String secrettotal = String.Format("%d",missedsecret);
String killstotal = String.Format("%d",missedkills);
int itemslen = max(mSmallFont.StringWidth("100%"),max(mSmallFont.StringWidth(itemstotal),mSmallFont.StringWidth(itemsstr)));
int secretlen = max(mSmallFont.StringWidth("100%"),max(mSmallFont.StringWidth(secrettotal),mSmallFont.StringWidth(secretstr)));
int killslen = max(mSmallFont.StringWidth("100%"),max(mSmallFont.StringWidth(killstotal),mSmallFont.StringWidth(killsstr)));
int pad = 2;
int spc = 12;
int hspc = 6;
int lspc = 2;
int rwidth = mSmallFont.GetCharWidth(checkmark)+4;
int linew = pad+rwidth+namelen+spc+itemslen+spc+secretlen+spc+killslen+pad;
int boxwidth = pad+linew+pad;
int lineh = mSmallFont.GetHeight();
int boxheight = pad+lineh+hspc+(lineh+lspc)*nplayers+hspc+lineh+lspc+lineh+pad;
Screen.Dim("Black",.8,int((ss.x-boxwidth)*hs)/2,int((ss.y-boxheight)*hs)/2,int(boxwidth*hs),int(boxheight*hs));
// header
int xx = int((ss.x-boxwidth)/2+pad+pad+rwidth);
int yy = int((ss.y-boxheight)/2+pad);
Screen.DrawText(mSmallFont,Font.CR_GREEN,xx,yy,namestr,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
xx += namelen+spc;
Screen.DrawText(mSmallFont,Font.CR_GREEN,xx,yy,itemsstr,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
xx += itemslen+spc;
Screen.DrawText(mSmallFont,Font.CR_GREEN,xx,yy,secretstr,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
xx += secretlen+spc;
Screen.DrawText(mSmallFont,Font.CR_GREEN,xx,yy,killsstr,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
yy += lineh+hspc;
String str;
for ( int i=0; i<MAXPLAYERS; i++ )
{
if ( !playeringame[i] ) continue;
xx = int((ss.x-boxwidth)/2.+pad);
Screen.Dim(players[i].GetDisplayColor(),.4,int(xx*hs),int(yy*hs),int(linew*hs),int(lineh*hs));
xx += pad;
if ( playerready[i] || players[i].Bot ) Screen.DrawChar(mSmallFont,Font.CR_GREEN,xx,yy,checkmark,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
xx += rwidth;
Screen.DrawText(mSmallFont,GetRowColor(players[i],i==me),xx,yy,players[i].GetUserName(),DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
xx += namelen+spc;
if ( ng_state >= 4 )
{
str = String.Format("%3d\cu%%\c-",GetPct(cnt_items[i],wbs.maxitems));
Screen.DrawText(mSmallFont,(!wbs.maxitems||(cnt_items[i]>=wbs.maxitems))?Font.CR_GOLD:Font.CR_WHITE,xx+itemslen-mSmallFont.StringWidth(str),yy,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
misseditems -= cnt_items[i];
}
xx += itemslen+spc;
if ( ng_state >= 6 )
{
str = String.Format("%3d\cu%%\c-",GetPct(cnt_secret[i],wbs.maxsecret));
Screen.DrawText(mSmallFont,(!wbs.maxsecret||(cnt_secret[i]>=wbs.maxsecret))?Font.CR_GOLD:Font.CR_WHITE,xx+secretlen-mSmallFont.StringWidth(str),yy,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
missedsecret -= cnt_secret[i];
}
xx += secretlen+spc;
str = String.Format("%3d\cu%%\c-",GetPct(cnt_kills[i],wbs.maxkills));
Screen.DrawText(mSmallFont,(!wbs.maxkills||(cnt_kills[i]>=wbs.maxkills))?Font.CR_GOLD:Font.CR_WHITE,xx+killslen-mSmallFont.StringWidth(str),yy,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
missedkills -= cnt_kills[i];
yy += lineh+lspc;
}
xx = int((ss.x-boxwidth)/2+pad+pad+rwidth);
yy += hspc;
Screen.DrawText(mSmallFont,Font.CR_GREEN,xx,yy,missedstr,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
xx += namelen+spc;
if ( ng_state >= 4 )
{
str = String.Format("%3d\cu%%\c-",GetPct(misseditems,wbs.maxitems,true));
Screen.DrawText(mSmallFont,(wbs.maxitems&&(misseditems>0))?Font.CR_WHITE:Font.CR_GOLD,xx+itemslen-mSmallFont.StringWidth(str),yy,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
}
xx += itemslen+spc;
if ( ng_state >= 6 )
{
str = String.Format("%3d\cu%%\c-",GetPct(missedsecret,wbs.maxsecret,true));
Screen.DrawText(mSmallFont,(wbs.maxsecret&&(missedsecret>0))?Font.CR_WHITE:Font.CR_GOLD,xx+secretlen-mSmallFont.StringWidth(str),yy,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
}
xx += secretlen+spc;
str = String.Format("%3d\cu%%\c-",GetPct(missedkills,wbs.maxkills,true));
Screen.DrawText(mSmallFont,(wbs.maxkills&&(missedkills>0))?Font.CR_WHITE:Font.CR_GOLD,xx+killslen-mSmallFont.StringWidth(str),yy,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
yy += lineh+lspc;
xx = int((ss.x-boxwidth)/2+pad+pad+rwidth);
Screen.DrawText(mSmallFont,Font.CR_GREEN,xx,yy,totalstr,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
xx += namelen+spc;
if ( ng_state >= 4 )
{
str = String.Format("%d",wbs.maxitems);
Screen.DrawText(mSmallFont,Font.CR_WHITE,xx+itemslen-mSmallFont.StringWidth(str),yy,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
}
xx += itemslen+spc;
if ( ng_state >= 6 )
{
str = String.Format("%d",wbs.maxsecret);
Screen.DrawText(mSmallFont,Font.CR_WHITE,xx+secretlen-mSmallFont.StringWidth(str),yy,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
}
xx += secretlen+spc;
str = String.Format("%d",wbs.maxkills);
Screen.DrawText(mSmallFont,Font.CR_WHITE,xx+killslen-mSmallFont.StringWidth(str),yy,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
}
}

View file

@ -1,181 +0,0 @@
// Deathmatch stats
Class SWWMStatScreen_DM : SWWMStatScreen
{
override void initStats()
{
CurState = StatCount;
acceleratestage = 0;
for( int i=0; i<MAXPLAYERS; i++ )
{
playerready[i] = false;
cnt_frags[i] = cnt_deaths[i] = player_deaths[i] = 0;
}
total_frags = 0;
total_deaths = 0;
ng_state = 1;
cnt_pause = GameTicRate;
for ( int i=0; i<MAXPLAYERS; i++ )
{
if ( !playeringame[i] ) continue;
for ( int j=0; j<MAXPLAYERS; j++ )
{
if ( !playeringame[j] ) continue;
player_deaths[i] += Plrs[j].frags[i];
}
total_deaths += player_deaths[i];
total_frags += Plrs[i].fragcount;
}
}
override void updateStats()
{
bool stillticking;
bool doautoskip = autoSkip();
if ( (acceleratestage || doautoskip) && (ng_state != 6) )
{
acceleratestage = 0;
for ( int i=0; i<MAXPLAYERS; i++ )
{
if ( !playeringame[i] ) continue;
cnt_frags[i] = Plrs[i].fragcount;
cnt_deaths[i] = player_deaths[i];
}
PlaySound("menu/buyinv");
ng_state = 6;
}
if ( ng_state == 2 )
{
if ( !(bcnt&2) ) PlaySound("menu/demoscroll");
stillticking = false;
for ( int i=0; i<MAXPLAYERS; i++ )
{
if ( !playeringame[i] ) continue;
cnt_frags[i] += max((Plrs[i].fragcount-cnt_frags[i])/10,2);
if ( cnt_frags[i] > Plrs[i].fragcount ) cnt_frags[i] = Plrs[i].fragcount;
else stillticking = true;
}
if ( !stillticking )
{
PlaySound("menu/buyinv");
ng_state++;
}
}
else if ( ng_state == 4 )
{
if ( !(bcnt&2) ) PlaySound("menu/demoscroll");
stillticking = false;
for ( int i=0; i<MAXPLAYERS; i++ )
{
if ( !playeringame[i] ) continue;
cnt_deaths[i] += max((player_deaths[i]-cnt_deaths[i])/10,2);
if ( cnt_deaths[i] > player_deaths[i] ) cnt_deaths[i] = player_deaths[i];
else stillticking = true;
}
if ( !stillticking )
{
PlaySound("menu/buyinv");
ng_state++;
}
}
else if ( ng_state == 6 )
{
int i;
for ( i=0; i<MAXPLAYERS; i++ )
{
// If the player is in the game and not ready, stop checking
if ( playeringame[i] && !players[i].Bot && !playerready[i] )
break;
}
// All players are ready; proceed.
if ( ((i == MAXPLAYERS) && acceleratestage) || doautoskip )
{
PlaySound("misc/w_pkup");
initShowNextLoc();
}
}
else if ( ng_state&1 )
{
if ( !--cnt_pause )
{
ng_state++;
cnt_pause = GameTicRate;
}
}
}
override void drawStats( void )
{
drawLF();
int checkmark = 0x2714; // "✔"
String namestr = StringTable.Localize("$SCORE_NAME");
String deathsstr = StringTable.Localize("$SCORE_DEATHS");
String fragsstr = StringTable.Localize("$SCORE_FRAGS");
String totalstr = StringTable.Localize("$SCORE_TOTAL");
int namelen = max(max(mSmallFont.StringWidth(namestr),mSmallFont.StringWidth("XXXXXXXXXX")),mSmallFont.StringWidth(totalstr));
int nplayers = 0;
for ( int i=0; i<MAXPLAYERS; i++ )
{
if ( !playeringame[i] ) continue;
namelen = max(namelen,mSmallFont.StringWidth(players[i].GetUserName()));
nplayers++;
}
String deathstotal = String.Format("%d",total_deaths);
String fragstotal = String.Format("%d",total_frags);
int deathslen = max(mSmallFont.StringWidth(deathstotal),mSmallFont.StringWidth(deathsstr));
int fragslen = max(mSmallFont.StringWidth(fragstotal),mSmallFont.StringWidth(fragsstr));
int pad = 2;
int spc = 12;
int hspc = 6;
int lspc = 2;
int rwidth = mSmallFont.GetCharWidth(checkmark)+4;
int linew = pad+rwidth+namelen+spc+deathslen+spc+fragslen+pad;
int boxwidth = pad+linew+pad;
int lineh = mSmallFont.GetHeight();
int boxheight = pad+lineh+hspc+(lineh+lspc)*nplayers+hspc+lineh+pad;
Screen.Dim("Black",.8,int((ss.x-boxwidth)*hs)/2,int((ss.y-boxheight)*hs)/2,int(boxwidth*hs),int(boxheight*hs));
// header
int xx = int((ss.x-boxwidth)/2+pad+pad+rwidth);
int yy = int((ss.y-boxheight)/2+pad);
Screen.DrawText(mSmallFont,Font.CR_GREEN,xx,yy,namestr,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
xx += namelen+spc;
Screen.DrawText(mSmallFont,Font.CR_GREEN,xx,yy,deathsstr,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
xx += deathslen+spc;
Screen.DrawText(mSmallFont,Font.CR_GREEN,xx,yy,fragsstr,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
yy += lineh+hspc;
String str;
Array<Int> sorted;
GetSortedPlayers(sorted,teamplay);
foreach ( i:sorted )
{
if ( !playeringame[i] ) continue;
xx = int((ss.x-boxwidth)/2+pad);
Screen.Dim(players[i].GetDisplayColor(),.4,int(xx*hs),int(yy*hs),int(linew*hs),int(lineh*hs));
xx += pad;
if ( playerready[i] || players[i].Bot ) Screen.DrawChar(mSmallFont,Font.CR_GREEN,xx,yy,checkmark,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
xx += rwidth;
Screen.DrawText(mSmallFont,GetRowColor(players[i],i==me),xx,yy,players[i].GetUserName(),DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
xx += namelen+spc;
if ( ng_state >= 2 )
{
str = String.Format("%d",cnt_deaths[i]);
Screen.DrawText(mSmallFont,Font.CR_WHITE,xx+deathslen-mSmallFont.StringWidth(str),yy,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
}
xx += deathslen+spc;
str = String.Format("%d",cnt_frags[i]);
Screen.DrawText(mSmallFont,Font.CR_WHITE,xx+fragslen-mSmallFont.StringWidth(str),yy,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
yy += lineh+lspc;
}
xx = int((ss.x-boxwidth)/2+pad+pad+rwidth);
yy += hspc;
Screen.DrawText(mSmallFont,Font.CR_GREEN,xx,yy,totalstr,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
xx += namelen+spc;
if ( ng_state >= 4 )
{
str = String.Format("%d",total_deaths);
Screen.DrawText(mSmallFont,Font.CR_WHITE,xx+deathslen-mSmallFont.StringWidth(str),yy,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
}
xx += deathslen+spc;
str = String.Format("%d",total_frags);
Screen.DrawText(mSmallFont,Font.CR_WHITE,xx+fragslen-mSmallFont.StringWidth(str),yy,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
}
}

View file

@ -1,287 +0,0 @@
// Single-player stats
Class SWWMStatScreen_SP : SWWMStatScreen
{
int intermissioncounter;
override void initStats()
{
intermissioncounter = gameinfo.intermissioncounter;
CurState = StatCount;
acceleratestage = 0;
sp_state = 1;
cnt_kills[0] = cnt_items[0] = cnt_secret[0] = -1;
cnt_time = cnt_par = -1;
cnt_pause = GameTicRate;
cnt_total_time = -1;
}
override void updateStats()
{
if ( acceleratestage && (sp_state != 10) )
{
acceleratestage = 0;
sp_state = 10;
PlaySound("menu/buyinv");
cnt_kills[0] = Plrs[me].skills;
cnt_items[0] = Plrs[me].sitems;
cnt_secret[0] = Plrs[me].ssecret;
cnt_time = Thinker.Tics2Seconds(Plrs[me].stime);
cnt_par = wbs.partime/GameTicRate;
cnt_total_time = Thinker.Tics2Seconds(wbs.totaltime);
}
if ( sp_state == 2 )
{
if ( intermissioncounter )
{
cnt_kills[0] += max((Plrs[me].skills-cnt_kills[0])/10,2);
if ( !(bcnt%2) ) PlaySound("menu/demoscroll");
}
if ( !intermissioncounter || (cnt_kills[0] >= Plrs[me].skills) )
{
cnt_kills[0] = Plrs[me].skills;
PlaySound("menu/buyinv");
sp_state++;
}
}
else if ( sp_state == 4 )
{
if ( intermissioncounter )
{
cnt_items[0] += max((Plrs[me].sitems-cnt_items[0])/10,2);
if ( !(bcnt%2) ) PlaySound("menu/demoscroll");
}
if ( !intermissioncounter || (cnt_items[0] >= Plrs[me].sitems) )
{
cnt_items[0] = Plrs[me].sitems;
PlaySound("menu/buyinv");
sp_state++;
}
}
else if ( sp_state == 6 )
{
if ( intermissioncounter )
{
cnt_secret[0] += max((Plrs[me].ssecret-cnt_secret[0])/10,2);
if ( !(bcnt%2) ) PlaySound("menu/demoscroll");
}
if ( !intermissioncounter || (cnt_secret[0] >= Plrs[me].ssecret) )
{
cnt_secret[0] = Plrs[me].ssecret;
PlaySound("menu/buyinv");
sp_state++;
}
}
else if ( sp_state == 8 )
{
int sec = Thinker.Tics2Seconds(Plrs[me].stime);
int tsec = Thinker.Tics2Seconds(wbs.totaltime);
int psec = wbs.partime/GameTicRate;
if ( intermissioncounter )
{
if ( !(bcnt%2) ) PlaySound("menu/demoscroll");
cnt_time += max((sec-cnt_time)/10,3);
cnt_par += max((psec-cnt_par)/10,3);
cnt_total_time += max((tsec-cnt_total_time)/10,3);
}
if ( !intermissioncounter || (cnt_time >= sec) )
cnt_time = sec;
if ( !intermissioncounter || (cnt_total_time >= tsec) )
cnt_total_time = tsec;
if ( !intermissioncounter || (cnt_par >= psec) )
{
cnt_par = psec;
if ( cnt_time >= sec )
{
cnt_total_time = tsec;
PlaySound("menu/buyinv");
sp_state++;
}
}
}
else if ( sp_state == 10 )
{
if ( acceleratestage )
{
PlaySound("misc/w_pkup");
initShowNextLoc();
}
}
else if ( sp_state&1 )
{
if ( !--cnt_pause )
{
sp_state++;
cnt_pause = GameTicRate;
}
}
}
override void drawStats( void )
{
drawLF();
// estimate max width of the whole stat counter
int maxlen, maxlenl = 0, maxlenr = 0;
// left strings
String str = StringTable.Localize("$TXT_IMKILLS")..":";
int len = mSmallFont.StringWidth(str);
maxlenl = len;
str = StringTable.Localize("$TXT_IMITEMS")..":";
len = mSmallFont.StringWidth(str);
if ( len > maxlenl ) maxlenl = len;
str = StringTable.Localize("$TXT_IMSECRETS")..":";
len = mSmallFont.StringWidth(str);
if ( len > maxlenl ) maxlenl = len;
str = StringTable.Localize("$TXT_IMTIME")..":";
len = mSmallFont.StringWidth(str);
if ( len > maxlenl ) maxlenl = len;
if ( wbs.partime )
{
str = StringTable.Localize("$TXT_IMPAR")..":";
len = mSmallFont.StringWidth(str);
if ( len > maxlenl ) maxlenl = len;
}
if ( wi_showtotaltime && (Plrs[me].stime != wbs.totaltime) )
{
str = StringTable.Localize("$SCORE_TOTAL")..":"; // hey, as long as it works
len = mSmallFont.StringWidth(str);
if ( len > maxlenl ) maxlenl = len;
}
// right strings
if ( wi_percents )
{
str = (!wbs.maxkills)?"N/A":String.Format("%d%%",GetPct(Plrs[me].skills,wbs.maxkills));
len = mSmallFont.StringWidth(str);
maxlenr = len;
str = (!wbs.maxitems)?"N/A":String.Format("%d%%",GetPct(Plrs[me].sitems,wbs.maxitems));
len = mSmallFont.StringWidth(str);
if ( len > maxlenr ) maxlenr = len;
str = (!wbs.maxsecret)?"N/A":String.Format("%d%%",GetPct(Plrs[me].ssecret,wbs.maxsecret));
len = mSmallFont.StringWidth(str);
if ( len > maxlenr ) maxlenr = len;
}
else
{
str = (!wbs.maxkills)?"N/A":String.Format("%d / %d",Plrs[me].skills,wbs.maxkills);
len = mSmallFont.StringWidth(str);
maxlenr = len;
str = (!wbs.maxitems)?"N/A":String.Format("%d / %d",Plrs[me].sitems,wbs.maxitems);
len = mSmallFont.StringWidth(str);
if ( len > maxlenr ) maxlenr = len;
str = (!wbs.maxsecret)?"N/A":String.Format("%d / %d",Plrs[me].ssecret,wbs.maxsecret);
len = mSmallFont.StringWidth(str);
if ( len > maxlenr ) maxlenr = len;
}
str = TimeStr(Thinker.Tics2Seconds(Plrs[me].stime));
len = mSmallFont.StringWidth(str);
if ( len > maxlenr ) maxlenr = len;
if ( wbs.partime )
{
str = TimeStr(wbs.partime/GameTicRate);
len = mSmallFont.StringWidth(str);
if ( len > maxlenr ) maxlenr = len;
}
if ( wi_showtotaltime && (Plrs[me].stime != wbs.totaltime) )
{
str = TimeStr(Thinker.Tics2Seconds(wbs.totaltime));
len = mSmallFont.StringWidth(str);
if ( len > maxlenr ) maxlenr = len;
}
int step = mSmallFont.GetHeight()+1;
int nl = clamp(sp_state/2,0,4);
if ( (nl == 4) )
{
if ( wi_showtotaltime && (Plrs[me].stime != wbs.totaltime) ) nl++;
if ( wbs.partime ) nl++;
}
nl *= step;
maxlen = maxlenl+max(100,maxlenr);
// draw the whole damn thing
if ( sp_state >= 2 ) Screen.Dim("Black",.8,int((ss2.x-maxlen-8)*.5*hs2),int((ss2.y-nl-8)*.5*hs2),int((maxlen+8)*hs2),int((nl+8)*hs2));
int xx = int((ss2.x-maxlen)/2), yy = int((ss2.y-nl)/2);
if ( sp_state >= 2 ) Screen.DrawText(mSmallFont,Font.CR_GREEN,xx,yy,StringTable.Localize("$TXT_IMKILLS")..":",DTA_VirtualWidthF,ss2.x,DTA_VirtualHeightF,ss2.y,DTA_KeepRatio,true);
yy += step;
if ( sp_state >= 4 ) Screen.DrawText(mSmallFont,Font.CR_GREEN,xx,yy,StringTable.Localize("$TXT_IMITEMS")..":",DTA_VirtualWidthF,ss2.x,DTA_VirtualHeightF,ss2.y,DTA_KeepRatio,true);
yy += step;
if ( sp_state >= 6 ) Screen.DrawText(mSmallFont,Font.CR_GREEN,xx,yy,StringTable.Localize("$TXT_IMSECRETS")..":",DTA_VirtualWidthF,ss2.x,DTA_VirtualHeightF,ss2.y,DTA_KeepRatio,true);
yy += step;
if ( sp_state >= 8 ) Screen.DrawText(mSmallFont,Font.CR_GREEN,xx,yy,StringTable.Localize("$TXT_IMTIME")..":",DTA_VirtualWidthF,ss2.x,DTA_VirtualHeightF,ss2.y,DTA_KeepRatio,true);
yy += step;
if ( wbs.partime )
{
if ( sp_state >= 8 ) Screen.DrawText(mSmallFont,Font.CR_GREEN,xx,yy,StringTable.Localize("$TXT_IMPAR")..":",DTA_VirtualWidthF,ss2.x,DTA_VirtualHeightF,ss2.y,DTA_KeepRatio,true);
yy += step;
}
if ( wi_showtotaltime && (Plrs[me].stime != wbs.totaltime) && (sp_state >= 8) )
Screen.DrawText(mSmallFont,Font.CR_GREEN,xx,yy,StringTable.Localize("$SCORE_TOTAL")..":",DTA_VirtualWidthF,ss2.x,DTA_VirtualHeightF,ss2.y,DTA_KeepRatio,true);
xx = int((ss2.x+maxlen)/2);
yy = int((ss2.y-nl)/2);
if ( wi_percents )
{
if ( cnt_kills[0] >= 0 )
{
str = (!wbs.maxkills)?"\cuN/A\c-":String.Format("%d\cu%%\c-",GetPct(cnt_kills[0],wbs.maxkills));
len = mSmallFont.StringWidth(str);
Screen.DrawText(mSmallFont,(cnt_kills[0]>=wbs.maxkills)?Font.CR_GOLD:Font.CR_WHITE,xx-len,yy,str,DTA_VirtualWidthF,ss2.x,DTA_VirtualHeightF,ss2.y,DTA_KeepRatio,true);
}
yy += step;
if ( cnt_items[0] >= 0 )
{
str = (!wbs.maxitems)?"\cuN/A\c-":String.Format("%d\cu%%\c-",GetPct(cnt_items[0],wbs.maxitems));
len = mSmallFont.StringWidth(str);
Screen.DrawText(mSmallFont,(cnt_items[0]>=wbs.maxitems)?Font.CR_GOLD:Font.CR_WHITE,xx-len,yy,str,DTA_VirtualWidthF,ss2.x,DTA_VirtualHeightF,ss2.y,DTA_KeepRatio,true);
}
yy += step;
if ( cnt_secret[0] >= 0 )
{
str = (!wbs.maxsecret)?"\cuN/A\c-":String.Format("%d\cu%%\c-",GetPct(cnt_secret[0],wbs.maxsecret));
len = mSmallFont.StringWidth(str);
Screen.DrawText(mSmallFont,(cnt_secret[0]>=wbs.maxsecret)?Font.CR_GOLD:Font.CR_WHITE,xx-len,yy,str,DTA_VirtualWidthF,ss2.x,DTA_VirtualHeightF,ss2.y,DTA_KeepRatio,true);
}
yy += step;
}
else
{
if ( cnt_kills[0] >= 0 )
{
str = (!wbs.maxkills)?"\cuN/A\c-":String.Format("%d \cu/\c- \cj%d\c-",max(cnt_kills[0],0),wbs.maxkills);
len = mSmallFont.StringWidth(str);
Screen.DrawText(mSmallFont,(cnt_kills[0]>=wbs.maxkills)?Font.CR_GOLD:Font.CR_WHITE,xx-len,yy,str,DTA_VirtualWidthF,ss2.x,DTA_VirtualHeightF,ss2.y,DTA_KeepRatio,true);
}
yy += step;
if ( cnt_items[0] >= 0 )
{
str = (!wbs.maxitems)?"\cuN/A\c-":String.Format("%d \cu/\c- \cj%d\c-",max(cnt_items[0],0),wbs.maxitems);
len = mSmallFont.StringWidth(str);
Screen.DrawText(mSmallFont,(cnt_items[0]>=wbs.maxitems)?Font.CR_GOLD:Font.CR_WHITE,xx-len,yy,str,DTA_VirtualWidthF,ss2.x,DTA_VirtualHeightF,ss2.y,DTA_KeepRatio,true);
}
yy += step;
if ( cnt_secret[0] >= 0 )
{
str = (!wbs.maxsecret)?"\cuN/A\c-":String.Format("%d \cu/\c- \cj%d\c-",max(cnt_secret[0],0),wbs.maxsecret);
len = mSmallFont.StringWidth(str);
Screen.DrawText(mSmallFont,(cnt_secret[0]>=wbs.maxsecret)?Font.CR_GOLD:Font.CR_WHITE,xx-len,yy,str,DTA_VirtualWidthF,ss2.x,DTA_VirtualHeightF,ss2.y,DTA_KeepRatio,true);
}
yy += step;
}
if ( cnt_time >= 0 )
{
str = TimeStr(cnt_time);
len = mSmallFont.StringWidth(str);
Screen.DrawText(mSmallFont,(wbs.partime&&(cnt_time<=(wbs.partime/GameTicRate)))?Font.CR_GOLD:((wbs.sucktime>0)&&(cnt_time>(wbs.sucktime*3600)))?Font.CR_RED:Font.CR_WHITE,xx-len,yy,str,DTA_VirtualWidthF,ss2.x,DTA_VirtualHeightF,ss2.y,DTA_KeepRatio,true);
}
yy += step;
if ( wbs.partime && (cnt_par >= 0) )
{
str = TimeStr(cnt_par);
len = mSmallFont.StringWidth(str);
Screen.DrawText(mSmallFont,Font.CR_WHITE,xx-len,yy,str,DTA_VirtualWidthF,ss2.x,DTA_VirtualHeightF,ss2.y,DTA_KeepRatio,true);
yy += step;
}
if ( wi_showtotaltime && (Plrs[me].stime != wbs.totaltime) && (cnt_total_time >= 0) )
{
str = TimeStr(cnt_total_time);
len = mSmallFont.StringWidth(str);
Screen.DrawText(mSmallFont,Font.CR_WHITE,xx-len,yy,str,DTA_VirtualWidthF,ss2.x,DTA_VirtualHeightF,ss2.y,DTA_KeepRatio,true);
}
}
}