// 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 = 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 ( 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 = 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 ( 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); } } }