Unfortunately, the ability to switch art and tips on the fly, as well as fading the foreground, have all been lost in the process.
990 lines
34 KiB
Text
990 lines
34 KiB
Text
// Custom intermission screens
|
|
Class SWWMStatScreen : StatusScreen abstract
|
|
{
|
|
transient TextureID bgtex, arttex;
|
|
int whichart, whichtip;
|
|
double hs, hs2;
|
|
Vector2 ss, ss2, origin, origin2;
|
|
Font mSmallFont;
|
|
String tipstr;
|
|
transient BrokenLines tipl;
|
|
|
|
override void Start( wbstartstruct wbstartstruct )
|
|
{
|
|
Super.Start(wbstartstruct);
|
|
mSmallFont = Font.GetFont('TewiFont');
|
|
// support for old author text style
|
|
int iof = lnametexts[0].IndexOf(" - by: ");
|
|
if ( iof != -1 )
|
|
{
|
|
authortexts[0] = lnametexts[0].Mid(iof+7);
|
|
lnametexts[0].Truncate(iof);
|
|
}
|
|
iof = lnametexts[1].IndexOf(" - by: ");
|
|
if ( iof != -1 )
|
|
{
|
|
authortexts[1] = lnametexts[1].Mid(iof+7);
|
|
lnametexts[1].Truncate(iof);
|
|
}
|
|
}
|
|
override void StartMusic()
|
|
{
|
|
if ( swwm_intermusic ) Level.SetInterMusic(wbs.next);
|
|
else S_ChangeMusic("music/DRAGONY.XM");
|
|
}
|
|
private void drawSWWMBg()
|
|
{
|
|
let shnd = SWWMStaticHandler(StaticEventHandler.Find("SWWMStaticHandler"));
|
|
if ( !whichart && swwm_interart )
|
|
{
|
|
int no = StringTable.Localize("$SWWM_NFANART").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++;
|
|
}
|
|
no = rno;
|
|
if ( shnd.lastart.Size() >= no )
|
|
{
|
|
// exclude last one, start over
|
|
int excludeme = shnd.lastart[shnd.lastart.Size()-1];
|
|
ents.Delete(excludeme-1);
|
|
shnd.lastart.Clear();
|
|
}
|
|
else
|
|
{
|
|
for ( int i=0; i<shnd.lastart.Size(); i++ )
|
|
{
|
|
int f = ents.Find(shnd.lastart[i]);
|
|
if ( f != ents.Size() )
|
|
ents.Delete(f);
|
|
}
|
|
}
|
|
whichart = ents[Random[InterArt](0,ents.Size()-1)];
|
|
shnd.lastart.Push(whichart);
|
|
}
|
|
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",TexMan.Type_MiscPatch);
|
|
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);
|
|
}
|
|
// 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)),TexMan.Type_MiscPatch);
|
|
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);
|
|
}
|
|
}
|
|
// intermission tips at the bottom
|
|
if ( !whichtip )
|
|
{
|
|
int maxtip = StringTable.Localize("$SWWM_NINTERTIP").ToInt();
|
|
Array<Int> ents;
|
|
ents.Clear();
|
|
for ( int i=1; i<=maxtip; i++ ) ents.Push(i);
|
|
if ( shnd.lasttip.Size() >= maxtip )
|
|
{
|
|
// exclude last one, start over
|
|
int excludeme = shnd.lasttip[shnd.lasttip.Size()-1];
|
|
ents.Delete(excludeme-1);
|
|
shnd.lasttip.Clear();
|
|
}
|
|
else
|
|
{
|
|
for ( int i=0; i<shnd.lasttip.Size(); i++ )
|
|
{
|
|
int f = ents.Find(shnd.lasttip[i]);
|
|
if ( f != ents.Size() )
|
|
ents.Delete(f);
|
|
}
|
|
}
|
|
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));
|
|
if ( tipl ) tipl.Destroy();
|
|
shnd.lasttip.Push(whichtip);
|
|
}
|
|
if ( swwm_nointertips ) return;
|
|
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);
|
|
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;
|
|
}
|
|
}
|
|
override int DrawLF()
|
|
{
|
|
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( void )
|
|
{
|
|
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();
|
|
drawStats();
|
|
break;
|
|
case ShowNextLoc:
|
|
case LeavingIntermission:
|
|
drawShowNextLoc();
|
|
break;
|
|
break;
|
|
default:
|
|
drawNoState();
|
|
break;
|
|
}
|
|
}
|
|
override void Ticker( void )
|
|
{
|
|
bcnt++;
|
|
if ( bcnt == 1 ) StartMusic();
|
|
switch (CurState)
|
|
{
|
|
case StatCount:
|
|
updateStats();
|
|
break;
|
|
case ShowNextLoc:
|
|
updateShowNextLoc();
|
|
break;
|
|
case NoState:
|
|
updateNoState();
|
|
break;
|
|
case LeavingIntermission:
|
|
// sorry nothing
|
|
break;
|
|
}
|
|
// 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("%d\cu:\c-%02d\cu:\c-%02d",h,m,s);
|
|
if ( m ) return String.Format("%d\cu:\c-%02d",m,s);
|
|
return String.Format("%d",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;
|
|
}
|
|
}
|
|
|
|
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 ( wi_showtotaltime )
|
|
{
|
|
str = StringTable.Localize("$SCORE_TOTAL")..":"; // hey, as long as it works
|
|
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;
|
|
}
|
|
// right strings
|
|
if ( wi_percents )
|
|
{
|
|
str = String.Format("%d%%",GetPct(Plrs[me].skills,wbs.maxkills));
|
|
len = mSmallFont.StringWidth(str);
|
|
maxlenr = len;
|
|
str = String.Format("%d%%",GetPct(Plrs[me].sitems,wbs.maxitems));
|
|
len = mSmallFont.StringWidth(str);
|
|
if ( len > maxlenr ) maxlenr = len;
|
|
str = String.Format("%d%%",GetPct(Plrs[me].ssecret,wbs.maxsecret));
|
|
len = mSmallFont.StringWidth(str);
|
|
if ( len > maxlenr ) maxlenr = len;
|
|
}
|
|
else
|
|
{
|
|
str = String.Format("%d / %d",Plrs[me].skills,wbs.maxkills);
|
|
len = mSmallFont.StringWidth(str);
|
|
maxlenr = len;
|
|
str = String.Format("%d / %d",Plrs[me].sitems,wbs.maxitems);
|
|
len = mSmallFont.StringWidth(str);
|
|
if ( len > maxlenr ) maxlenr = len;
|
|
str = 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 ( wi_showtotaltime )
|
|
{
|
|
str = TimeStr(Thinker.Tics2Seconds(wbs.totaltime));
|
|
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;
|
|
}
|
|
int step = mSmallFont.GetHeight()+1;
|
|
int nl = clamp(sp_state/2,0,4);
|
|
if ( (nl == 4) )
|
|
{
|
|
if ( wi_showtotaltime ) 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 ( wi_showtotaltime )
|
|
{
|
|
if ( 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);
|
|
yy += step;
|
|
}
|
|
if ( wbs.partime && (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);
|
|
xx = int((ss2.x+maxlen)/2);
|
|
yy = int((ss2.y-nl)/2);
|
|
if ( wi_percents )
|
|
{
|
|
if ( cnt_kills[0] >= 0 )
|
|
{
|
|
str = String.Format("%d\cu%%\c-",GetPct(cnt_kills[0],wbs.maxkills));
|
|
len = mSmallFont.StringWidth(str);
|
|
Screen.DrawText(mSmallFont,(!wbs.maxkills||(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 = String.Format("%d\cu%%\c-",GetPct(cnt_items[0],wbs.maxitems));
|
|
len = mSmallFont.StringWidth(str);
|
|
Screen.DrawText(mSmallFont,(!wbs.maxitems||(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 = String.Format("%d\cu%%\c-",GetPct(cnt_secret[0],wbs.maxsecret));
|
|
len = mSmallFont.StringWidth(str);
|
|
Screen.DrawText(mSmallFont,(!wbs.maxsecret||(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 = String.Format("%d \cu/\c- \cj%d\c-",max(cnt_kills[0],0),wbs.maxkills);
|
|
len = mSmallFont.StringWidth(str);
|
|
Screen.DrawText(mSmallFont,(wbs.maxkills&&(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 = String.Format("%d \cu/\c- \cj%d\c-",max(cnt_items[0],0),wbs.maxitems);
|
|
len = mSmallFont.StringWidth(str);
|
|
Screen.DrawText(mSmallFont,(wbs.maxitems&&(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 = String.Format("%d \cu/\c- \cj%d\c-",max(cnt_secret[0],0),wbs.maxsecret);
|
|
len = mSmallFont.StringWidth(str);
|
|
Screen.DrawText(mSmallFont,(wbs.maxsecret&&(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 ( wi_showtotaltime )
|
|
{
|
|
if ( 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);
|
|
}
|
|
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);
|
|
}
|
|
}
|
|
}
|
|
|
|
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);
|
|
}
|
|
}
|
|
|
|
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);
|
|
for ( int j=0; j<sorted.Size(); j++ )
|
|
{
|
|
int i = sorted[j];
|
|
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);
|
|
}
|
|
}
|