// 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; double bgfade; bool bFade; 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 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 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 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 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; i0); 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(); drawStats(); break; case ShowNextLoc: case LeavingIntermission: drawShowNextLoc(); break; break; default: drawNoState(); break; } if ( bgfade <= 0. ) return; double alph = bgfade; if ( bFade ) alph = min(1.,bgfade+(3.*smoothratio)/GameTicRate); else alph = max(0.,bgfade-(4.*smoothratio)/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); 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); } 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; } // 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("%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; } override bool OnEvent( InputEvent evt ) { if ( evt.type == InputEvent.Type_KeyDown ) { String cmd = Bindings.GetBinding(evt.KeyScan); if ( (cmd ~== "+attack") || (cmd ~== "+use") || (evt.KeyScan == InputEvent.KEY_ENTER) ) { accelerateStage = 1; return true; } if ( cmd ~== "+altattack" ) { bFade = true; return true; } if ( cmd ~== "+reload" ) { if ( !swwm_nointertips ) PlaySound("menu/demoscroll"); whichtip = 0; return true; } if ( cmd ~== "+zoom" ) { if ( swwm_interart ) PlaySound("menu/demoscroll"); whichart = 0; arttex.SetNull(); return true; } return false; } else if ( (evt.type == InputEvent.Type_KeyUp) && (Bindings.GetBinding(evt.KeyScan) ~== "+altattack") ) { bFade = false; return true; } return false; } } 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 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 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 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= 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= 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 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 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 sorted; GetSortedPlayers(sorted,teamplay); for ( int j=0; j= 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); } }