Core.Object | +--Engine.Actor | +--Engine.Info | +--Engine.ScoreBoard | +--Botpack.TournamentScoreBoard
LossString,
FPHString
string
MapTitleQuote
FontInfo
MyFonts
PlayerReplicationInfo
Ordered[32]
DeathsString,
PingString
CyanColor,
RedColor
float
ScoreStart
FragGoal,
TimeLimit
bool
bTimeDown
void
Destroyed()
DrawCategoryHeaders(Canvas Canvas)
DrawHeader(Canvas Canvas)
DrawNameAndPing(Canvas Canvas, PlayerReplicationInfo PRI, float XOffset, float YOffset, bool bCompressed)
DrawTrailer(Canvas Canvas)
DrawVictoryConditions(Canvas Canvas)
PostBeginPlay()
ShowScores(Canvas Canvas)
SortScores(int N)
TwoDigitString(int Num)
00001 //============================================================================= 00002 // TournamentScoreBoard 00003 //============================================================================= 00004 class TournamentScoreBoard extends ScoreBoard; 00005 00006 var localized string MapTitle, Author, Restart, Continue, Ended, ElapsedTime, RemainingTime, FragGoal, TimeLimit; 00007 var localized string PlayerString, FragsString, DeathsString, PingString; 00008 var localized string TimeString, LossString, FPHString; 00009 var color GreenColor, WhiteColor, GoldColor, BlueColor, LightCyanColor, SilverColor, BronzeColor, CyanColor, RedColor; 00010 var PlayerReplicationInfo Ordered[32]; 00011 var float ScoreStart; // top allowed score start 00012 var bool bTimeDown; 00013 var FontInfo MyFonts; 00014 var localized string MapTitleQuote; 00015 00016 function Destroyed() 00017 { 00018 Super.Destroyed(); 00019 if ( MyFonts != None ) 00020 MyFonts.Destroy(); 00021 } 00022 00023 function PostBeginPlay() 00024 { 00025 Super.PostBeginPlay(); 00026 MyFonts = FontInfo(spawn(Class<Actor>(DynamicLoadObject(class'ChallengeHUD'.default.FontInfoClass, class'Class')))); 00027 } 00028 00029 function DrawHeader( canvas Canvas ) 00030 { 00031 local GameReplicationInfo GRI; 00032 local float XL, YL; 00033 local font CanvasFont; 00034 00035 Canvas.DrawColor = WhiteColor; 00036 GRI = PlayerPawn(Owner).GameReplicationInfo; 00037 00038 Canvas.Font = MyFonts.GetHugeFont(Canvas.ClipX); 00039 00040 Canvas.bCenter = True; 00041 Canvas.StrLen("Test", XL, YL); 00042 ScoreStart = 58.0/768.0 * Canvas.ClipY; 00043 CanvasFont = Canvas.Font; 00044 if ( GRI.GameEndedComments != "" ) 00045 { 00046 Canvas.DrawColor = GoldColor; 00047 Canvas.SetPos(0, ScoreStart); 00048 Canvas.DrawText(GRI.GameEndedComments, True); 00049 } 00050 else 00051 { 00052 Canvas.SetPos(0, ScoreStart); 00053 DrawVictoryConditions(Canvas); 00054 } 00055 Canvas.bCenter = False; 00056 Canvas.Font = CanvasFont; 00057 } 00058 00059 function DrawVictoryConditions(Canvas Canvas) 00060 { 00061 local TournamentGameReplicationInfo TGRI; 00062 local float XL, YL; 00063 00064 TGRI = TournamentGameReplicationInfo(PlayerPawn(Owner).GameReplicationInfo); 00065 if ( TGRI == None ) 00066 return; 00067 00068 Canvas.DrawText(TGRI.GameName); 00069 Canvas.StrLen("Test", XL, YL); 00070 Canvas.SetPos(0, Canvas.CurY - YL); 00071 00072 if ( TGRI.FragLimit > 0 ) 00073 { 00074 Canvas.DrawText(FragGoal@TGRI.FragLimit); 00075 Canvas.StrLen("Test", XL, YL); 00076 Canvas.SetPos(0, Canvas.CurY - YL); 00077 } 00078 00079 if ( TGRI.TimeLimit > 0 ) 00080 Canvas.DrawText(TimeLimit@TGRI.TimeLimit$":00"); 00081 } 00082 00083 function string TwoDigitString(int Num) 00084 { 00085 if ( Num < 10 ) 00086 return "0"$Num; 00087 else 00088 return string(Num); 00089 } 00090 00091 function DrawTrailer( canvas Canvas ) 00092 { 00093 local int Hours, Minutes, Seconds; 00094 local float XL, YL; 00095 local PlayerPawn PlayerOwner; 00096 00097 Canvas.bCenter = true; 00098 Canvas.StrLen("Test", XL, YL); 00099 Canvas.DrawColor = WhiteColor; 00100 PlayerOwner = PlayerPawn(Owner); 00101 Canvas.SetPos(0, Canvas.ClipY - 2 * YL); 00102 if ( (Level.NetMode == NM_Standalone) && Level.Game.IsA('DeathMatchPlus') ) 00103 { 00104 if ( DeathMatchPlus(Level.Game).bRatedGame ) 00105 Canvas.DrawText(DeathMatchPlus(Level.Game).RatedGameLadderObj.SkillText@PlayerOwner.GameReplicationInfo.GameName@MapTitle@MapTitleQuote$Level.Title$MapTitleQuote, true); 00106 else if ( DeathMatchPlus(Level.Game).bNoviceMode ) 00107 Canvas.DrawText(class'ChallengeBotInfo'.default.Skills[Level.Game.Difficulty]@PlayerOwner.GameReplicationInfo.GameName@MapTitle@MapTitleQuote$Level.Title$MapTitleQuote, true); 00108 else 00109 Canvas.DrawText(class'ChallengeBotInfo'.default.Skills[Level.Game.Difficulty + 4]@PlayerOwner.GameReplicationInfo.GameName@MapTitle@MapTitleQuote$Level.Title$MapTitleQuote, true); 00110 } 00111 else 00112 Canvas.DrawText(PlayerOwner.GameReplicationInfo.GameName@MapTitle@Level.Title, true); 00113 00114 Canvas.SetPos(0, Canvas.ClipY - YL); 00115 if ( bTimeDown || (PlayerOwner.GameReplicationInfo.RemainingTime > 0) ) 00116 { 00117 bTimeDown = true; 00118 if ( PlayerOwner.GameReplicationInfo.RemainingTime <= 0 ) 00119 Canvas.DrawText(RemainingTime@"00:00", true); 00120 else 00121 { 00122 Minutes = PlayerOwner.GameReplicationInfo.RemainingTime/60; 00123 Seconds = PlayerOwner.GameReplicationInfo.RemainingTime % 60; 00124 Canvas.DrawText(RemainingTime@TwoDigitString(Minutes)$":"$TwoDigitString(Seconds), true); 00125 } 00126 } 00127 else 00128 { 00129 Seconds = PlayerOwner.GameReplicationInfo.ElapsedTime; 00130 Minutes = Seconds / 60; 00131 Hours = Minutes / 60; 00132 Seconds = Seconds - (Minutes * 60); 00133 Minutes = Minutes - (Hours * 60); 00134 Canvas.DrawText(ElapsedTime@TwoDigitString(Hours)$":"$TwoDigitString(Minutes)$":"$TwoDigitString(Seconds), true); 00135 } 00136 00137 if ( PlayerOwner.GameReplicationInfo.GameEndedComments != "" ) 00138 { 00139 Canvas.bCenter = true; 00140 Canvas.StrLen("Test", XL, YL); 00141 Canvas.SetPos(0, Canvas.ClipY - Min(YL*6, Canvas.ClipY * 0.1)); 00142 Canvas.DrawColor = GreenColor; 00143 if ( Level.NetMode == NM_Standalone ) 00144 Canvas.DrawText(Ended@Continue, true); 00145 else 00146 Canvas.DrawText(Ended, true); 00147 } 00148 else if ( (PlayerOwner != None) && (PlayerOwner.Health <= 0) ) 00149 { 00150 Canvas.bCenter = true; 00151 Canvas.StrLen("Test", XL, YL); 00152 Canvas.SetPos(0, Canvas.ClipY - Min(YL*6, Canvas.ClipY * 0.1)); 00153 Canvas.DrawColor = GreenColor; 00154 Canvas.DrawText(Restart, true); 00155 } 00156 Canvas.bCenter = false; 00157 } 00158 00159 function DrawCategoryHeaders(Canvas Canvas) 00160 { 00161 local float Offset, XL, YL; 00162 00163 Offset = Canvas.CurY; 00164 Canvas.DrawColor = WhiteColor; 00165 00166 Canvas.StrLen(PlayerString, XL, YL); 00167 Canvas.SetPos((Canvas.ClipX / 8)*2 - XL/2, Offset); 00168 Canvas.DrawText(PlayerString); 00169 00170 Canvas.StrLen(FragsString, XL, YL); 00171 Canvas.SetPos((Canvas.ClipX / 8)*5 - XL/2, Offset); 00172 Canvas.DrawText(FragsString); 00173 00174 Canvas.StrLen(DeathsString, XL, YL); 00175 Canvas.SetPos((Canvas.ClipX / 8)*6 - XL/2, Offset); 00176 Canvas.DrawText(DeathsString); 00177 } 00178 00179 function DrawNameAndPing(Canvas Canvas, PlayerReplicationInfo PRI, float XOffset, float YOffset, bool bCompressed) 00180 { 00181 local float XL, YL, XL2, YL2, XL3, YL3; 00182 local Font CanvasFont; 00183 local bool bLocalPlayer; 00184 local PlayerPawn PlayerOwner; 00185 local int Time; 00186 00187 PlayerOwner = PlayerPawn(Owner); 00188 00189 bLocalPlayer = (PRI.PlayerName == PlayerOwner.PlayerReplicationInfo.PlayerName); 00190 Canvas.Font = MyFonts.GetBigFont(Canvas.ClipX); 00191 00192 // Draw Name 00193 if ( PRI.bAdmin ) 00194 Canvas.DrawColor = WhiteColor; 00195 else if ( bLocalPlayer ) 00196 Canvas.DrawColor = GoldColor; 00197 else 00198 Canvas.DrawColor = CyanColor; 00199 00200 Canvas.SetPos(Canvas.ClipX * 0.1875, YOffset); 00201 Canvas.DrawText(PRI.PlayerName, False); 00202 00203 Canvas.StrLen( "0000", XL, YL ); 00204 00205 // Draw Score 00206 if ( !bLocalPlayer ) 00207 Canvas.DrawColor = LightCyanColor; 00208 00209 Canvas.StrLen( int(PRI.Score), XL2, YL ); 00210 Canvas.SetPos( Canvas.ClipX * 0.625 + XL * 0.5 - XL2, YOffset ); 00211 Canvas.DrawText( int(PRI.Score), false ); 00212 00213 // Draw Deaths 00214 Canvas.StrLen( int(PRI.Deaths), XL2, YL ); 00215 Canvas.SetPos( Canvas.ClipX * 0.75 + XL * 0.5 - XL2, YOffset ); 00216 Canvas.DrawText( int(PRI.Deaths), false ); 00217 00218 if ( (Canvas.ClipX > 512) && (Level.NetMode != NM_Standalone) ) 00219 { 00220 Canvas.DrawColor = WhiteColor; 00221 Canvas.Font = MyFonts.GetSmallestFont(Canvas.ClipX); 00222 00223 // Draw Time 00224 Time = Max(1, (Level.TimeSeconds + PlayerOwner.PlayerReplicationInfo.StartTime - PRI.StartTime)/60); 00225 Canvas.TextSize( TimeString$": 999", XL3, YL3 ); 00226 Canvas.SetPos( Canvas.ClipX * 0.75 + XL, YOffset ); 00227 Canvas.DrawText( TimeString$":"@Time, false ); 00228 00229 // Draw FPH 00230 Canvas.TextSize( FPHString$": 999", XL2, YL2 ); 00231 Canvas.SetPos( Canvas.ClipX * 0.75 + XL, YOffset + 0.5 * YL ); 00232 Canvas.DrawText( FPHString$": "@int(60 * PRI.Score/Time), false ); 00233 00234 XL3 = FMax(XL3, XL2); 00235 // Draw Ping 00236 Canvas.SetPos( Canvas.ClipX * 0.75 + XL + XL3 + 16, YOffset ); 00237 Canvas.DrawText( PingString$":"@PRI.Ping, false ); 00238 } 00239 } 00240 00241 function SortScores(int N) 00242 { 00243 local int I, J, Max; 00244 local PlayerReplicationInfo TempPRI; 00245 00246 for ( I=0; I<N-1; I++ ) 00247 { 00248 Max = I; 00249 for ( J=I+1; J<N; J++ ) 00250 { 00251 if ( Ordered[J].Score > Ordered[Max].Score ) 00252 Max = J; 00253 else if ((Ordered[J].Score == Ordered[Max].Score) && (Ordered[J].Deaths < Ordered[Max].Deaths)) 00254 Max = J; 00255 else if ((Ordered[J].Score == Ordered[Max].Score) && (Ordered[J].Deaths == Ordered[Max].Deaths) && 00256 (Ordered[J].PlayerID < Ordered[Max].Score)) 00257 Max = J; 00258 } 00259 00260 TempPRI = Ordered[Max]; 00261 Ordered[Max] = Ordered[I]; 00262 Ordered[I] = TempPRI; 00263 } 00264 } 00265 00266 function ShowScores( canvas Canvas ) 00267 { 00268 local PlayerReplicationInfo PRI; 00269 local int PlayerCount, i; 00270 local float XL, YL, Scale; 00271 local float YOffset, YStart; 00272 local font CanvasFont; 00273 00274 Canvas.Style = ERenderStyle.STY_Normal; 00275 00276 // Header 00277 Canvas.SetPos(0, 0); 00278 DrawHeader(Canvas); 00279 00280 // Wipe everything. 00281 for ( i=0; i<ArrayCount(Ordered); i++ ) 00282 Ordered[i] = None; 00283 for ( i=0; i<32; i++ ) 00284 { 00285 if (PlayerPawn(Owner).GameReplicationInfo.PRIArray[i] != None) 00286 { 00287 PRI = PlayerPawn(Owner).GameReplicationInfo.PRIArray[i]; 00288 if ( !PRI.bIsSpectator || PRI.bWaitingPlayer ) 00289 { 00290 Ordered[PlayerCount] = PRI; 00291 PlayerCount++; 00292 if ( PlayerCount == ArrayCount(Ordered) ) 00293 break; 00294 } 00295 } 00296 } 00297 SortScores(PlayerCount); 00298 00299 CanvasFont = Canvas.Font; 00300 Canvas.Font = MyFonts.GetBigFont(Canvas.ClipX); 00301 00302 Canvas.SetPos(0, 160.0/768.0 * Canvas.ClipY); 00303 DrawCategoryHeaders(Canvas); 00304 00305 Canvas.StrLen( "TEST", XL, YL ); 00306 YStart = Canvas.CurY; 00307 YOffset = YStart; 00308 if ( PlayerCount > 15 ) 00309 PlayerCount = FMin(PlayerCount, (Canvas.ClipY - YStart)/YL - 1); 00310 00311 Canvas.SetPos(0, 0); 00312 for ( I=0; I<PlayerCount; I++ ) 00313 { 00314 YOffset = YStart + I * YL; 00315 DrawNameAndPing( Canvas, Ordered[I], 0, YOffset, false ); 00316 } 00317 Canvas.DrawColor = WhiteColor; 00318 Canvas.Font = CanvasFont; 00319 00320 // Trailer 00321 if ( !Level.bLowRes ) 00322 { 00323 Canvas.Font = MyFonts.GetSmallFont( Canvas.ClipX ); 00324 DrawTrailer(Canvas); 00325 } 00326 Canvas.DrawColor = WhiteColor; 00327 Canvas.Font = CanvasFont; 00328 } 00329 00330 defaultproperties 00331 { 00332 MapTitle="in" 00333 Author="by" 00334 Restart="You are dead. Hit [Fire] to respawn!" 00335 Continue=" Hit [Fire] to continue!" 00336 Ended="The match has ended." 00337 ElapsedTime="Elapsed Time: " 00338 RemainingTime="Remaining Time: " 00339 FragGoal="Frag Limit:" 00340 TimeLimit="Time Limit:" 00341 PlayerString="Player" 00342 FragsString="Frags" 00343 DeathsString="Deaths" 00344 PingString="Ping" 00345 TimeString="Time" 00346 LossString="Loss" 00347 FPHString="FPH" 00348 GreenColor=(G=255) 00349 WhiteColor=(R=255,G=255,B=255) 00350 GoldColor=(R=255,G=255) 00351 BlueColor=(B=255) 00352 LightCyanColor=(R=128,G=255,B=255) 00353 SilverColor=(R=138,G=164,B=166) 00354 BronzeColor=(R=203,G=147,B=52) 00355 CyanColor=(G=128,B=255) 00356 RedColor=(R=255) 00357 }