Botpack
Class TournamentScoreBoard

source: e:\games\UnrealTournament\Botpack\Classes\TournamentScoreBoard.uc
Core.Object
   |
   +--Engine.Actor
      |
      +--Engine.Info
         |
         +--Engine.ScoreBoard
            |
            +--Botpack.TournamentScoreBoard
Direct Known Subclasses:LMSScoreBoard, TeamScoreBoard

class TournamentScoreBoard
extends Engine.ScoreBoard

//============================================================================= // TournamentScoreBoard //=============================================================================
Variables
 LossString, FPHString
 string MapTitleQuote
           top allowed score start
 FontInfo MyFonts
           top allowed score start
 PlayerReplicationInfo Ordered[32]
 DeathsString, PingString
 CyanColor, RedColor
 float ScoreStart
           top allowed score start
 FragGoal, TimeLimit
 bool bTimeDown
           top allowed score start


Function Summary
 void Destroyed()
 void DrawCategoryHeaders(Canvas Canvas)
 void DrawHeader(Canvas Canvas)
 void DrawNameAndPing(Canvas Canvas, PlayerReplicationInfo PRI, float XOffset, float YOffset, bool bCompressed)
 void DrawTrailer(Canvas Canvas)
 void DrawVictoryConditions(Canvas Canvas)
 void PostBeginPlay()
 void ShowScores(Canvas Canvas)
 void SortScores(int N)
 string TwoDigitString(int Num)



Source Code


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	}

End Source Code