rott/kf_sources/XInterface/Classes/ScoreBoardTeamDeathMatch.uc
2026-07-14 20:27:09 +07:00

473 lines
16 KiB
Ucode

class ScoreBoardTeamDeathMatch extends ScoreBoardDeathMatch;
// if _RO_
#exec OBJ LOAD FILE=InterfaceArt_Tex.utx
// else
//#exec OBJ LOAD FILE=MenuEffects.utx
// end if _RO_
var Material TeamBoxMaterial[2];
var Material ScoreBack;
var Material FlagIcon, ScoreboardU;
var Color TeamColors[2];
simulated function UpdatePrecacheMaterials()
{
// if _RO_
//Level.AddPrecacheMaterial(Material'MenuEffects.ScoreboardU');
Level.AddPrecacheMaterial(TeamBoxMaterial[0]);
Level.AddPrecacheMaterial(TeamBoxMaterial[1]);
//Level.AddPrecacheMaterial(Material'MenuEffects.ScoreIcon');
//Level.AddPrecacheMaterial(Material'InterfaceContent.SymbolShader');
super.UpdatePrecacheMaterials();
}
simulated event UpdateScoreBoard(Canvas Canvas)
{
local PlayerReplicationInfo PRI, OwnerPRI;
local int i, FontReduction,HeaderOffsetY,HeadFoot,PlayerBoxSizeY, BoxSpaceY;
local float XL,YL, IconSize, MaxScaling, MessageFoot;
local int BluePlayerCount, RedPlayerCount, RedOwnerOffset, BlueOwnerOffset, MaxPlayerCount;
local PlayerReplicationInfo RedPRI[MAXPLAYERS], BluePRI[MaxPlayers];
local font MainFont;
OwnerPRI = PlayerController(Owner).PlayerReplicationInfo;
RedOwnerOffset = -1;
BlueOwnerOffset = -1;
for (i=0; i<GRI.PRIArray.Length; i++)
{
PRI = GRI.PRIArray[i];
if ( (PRI.Team != None) && (!PRI.bIsSpectator || PRI.bWaitingPlayer) )
{
if ( PRI.Team.TeamIndex == 0 )
{
if ( RedPlayerCount < MAXPLAYERS )
{
RedPRI[RedPlayerCount] = PRI;
if ( PRI == OwnerPRI )
RedOwnerOffset = RedPlayerCount;
RedPlayerCount++;
}
}
else if ( BluePlayerCount < MAXPLAYERS )
{
BluePRI[BluePlayerCount] = PRI;
if ( PRI == OwnerPRI )
BlueOwnerOffset = BluePlayerCount;
BluePlayerCount++;
}
}
}
MaxPlayerCount = Max(RedPlayerCount,BluePlayerCount);
// Select best font size and box size to fit as many players as possible on screen
Canvas.Font = HUDClass.static.GetMediumFontFor(Canvas);
Canvas.StrLen("Test", XL, YL);
IconSize = FMax(2 * YL, 64 * Canvas.ClipX/1024);
BoxSpaceY = 0.25 * YL;
if ( HaveHalfFont(Canvas, FontReduction) )
PlayerBoxSizeY = 2.125 * YL;
else
PlayerBoxSizeY = 1.75 * YL;
HeadFoot = 4*YL + IconSize;
MessageFoot = 1.5 * HeadFoot;
if ( MaxPlayerCount > (Canvas.ClipY - 1.5 * HeadFoot)/(PlayerBoxSizeY + BoxSpaceY) )
{
BoxSpaceY = 0.125 * YL;
if ( MaxPlayerCount > (Canvas.ClipY - 1.5 * HeadFoot)/(PlayerBoxSizeY + BoxSpaceY) )
{
if ( MaxPlayerCount > (Canvas.ClipY - 1.5 * HeadFoot)/(PlayerBoxSizeY + BoxSpaceY) )
{
FontReduction++;
Canvas.Font = GetSmallerFontFor(Canvas,FontReduction);
Canvas.StrLen("Test", XL, YL);
BoxSpaceY = 0.125 * YL;
if ( HaveHalfFont(Canvas, FontReduction) )
PlayerBoxSizeY = 2.125 * YL;
else
PlayerBoxSizeY = 1.75 * YL;
HeadFoot = 4*YL + IconSize;
if ( MaxPlayerCount > (Canvas.ClipY - 1.5 * HeadFoot)/(PlayerBoxSizeY + BoxSpaceY) )
{
FontReduction++;
Canvas.Font = GetSmallerFontFor(Canvas,FontReduction);
Canvas.StrLen("Test", XL, YL);
BoxSpaceY = 0.125 * YL;
if ( HaveHalfFont(Canvas, FontReduction) )
PlayerBoxSizeY = 2.125 * YL;
else
PlayerBoxSizeY = 1.75 * YL;
HeadFoot = 4*YL + IconSize;
if ( (Canvas.ClipY >= 600) && (MaxPlayerCount > (Canvas.ClipY - HeadFoot)/(PlayerBoxSizeY + BoxSpaceY)) )
{
FontReduction++;
Canvas.Font = GetSmallerFontFor(Canvas,FontReduction);
Canvas.StrLen("Test", XL, YL);
BoxSpaceY = 0.125 * YL;
if ( HaveHalfFont(Canvas, FontReduction) )
PlayerBoxSizeY = 2.125 * YL;
else
PlayerBoxSizeY = 1.75 * YL;
HeadFoot = 4*YL + IconSize;
if ( MaxPlayerCount > (Canvas.ClipY - HeadFoot)/(PlayerBoxSizeY + BoxSpaceY) )
{
FontReduction++;
Canvas.Font = GetSmallerFontFor(Canvas,FontReduction);
Canvas.StrLen("Test", XL, YL);
BoxSpaceY = 0.125 * YL;
if ( HaveHalfFont(Canvas, FontReduction) )
PlayerBoxSizeY = 2.125 * YL;
else
PlayerBoxSizeY = 1.75 * YL;
HeadFoot = 4*YL + IconSize;
}
}
}
}
}
}
MaxPlayerCount = Min(MaxPlayerCount, 1+(Canvas.ClipY - HeadFoot)/(PlayerBoxSizeY + BoxSpaceY) );
if ( FontReduction > 2 )
MaxScaling = 3;
else
MaxScaling = 2.125;
PlayerBoxSizeY = FClamp((1+(Canvas.ClipY - 0.67 * MessageFoot))/MaxPlayerCount - BoxSpaceY, PlayerBoxSizeY, MaxScaling * YL);
bDisplayMessages = (MaxPlayerCount < (Canvas.ClipY - MessageFoot)/(PlayerBoxSizeY + BoxSpaceY));
RedPlayerCount = Min(RedPlayerCount,MaxPlayerCount);
BluePlayerCount = Min(BluePlayerCount,MaxPlayerCount);
if ( RedOwnerOffset >= RedPlayerCount )
RedPlayerCount -= 1;
if ( BlueOwnerOffset >= BluePlayerCount )
BluePlayerCount -= 1;
HeaderOffsetY = 1.5*YL + IconSize;
// draw title
Canvas.Style = ERenderStyle.STY_Normal;
DrawTitle(Canvas, HeaderOffsetY, (MaxPlayerCount+1)*(PlayerBoxSizeY + BoxSpaceY), PlayerBoxSizeY);
if ( GRI != None )
{
// draw red team
MainFont = Canvas.Font;
for (i=0; i<32; i++ )
PRIArray[i] = RedPRI[i];
DrawTeam(0,RedPlayerCount,RedOwnerOffset,Canvas, FontReduction,BoxSpaceY,PlayerBoxSizeY,HeaderOffsetY);
// draw blue team
Canvas.Font = MainFont;
for (i=0; i<32; i++ )
PRIArray[i] = BluePRI[i];
DrawTeam(1,BluePlayerCount,BlueOwnerOffset,Canvas, FontReduction,BoxSpaceY,PlayerBoxSizeY,HeaderOffsetY);
}
if ( Level.NetMode != NM_Standalone )
DrawMatchID(Canvas,FontReduction);
}
function DrawTeam(int TeamNum, int PlayerCount, int OwnerOffset, Canvas Canvas, int FontReduction, int BoxSpaceY, int PlayerBoxSizeY, int HeaderOffsetY)
{
local int i, OwnerPos, NetXPos, NameXPos, BoxTextOffsetY, ScoreXPos, ScoreYPos, BoxXPos, BoxWidth, LineCount,NameY;
local float XL,YL,IconScale,ScoreBackScale,ScoreYL,MaxNamePos,LongestNameLength, oXL, oYL;
local string PlayerName[MAXPLAYERS], OrdersText, LongestName;
local font MainFont, ReducedFont;
local bool bHaveHalfFont, bNameFontReduction;
local int SymbolUSize, SymbolVSize, OtherTeam, LastLine;
BoxWidth = 0.47 * Canvas.ClipX;
BoxXPos = 0.5 * (0.5 * Canvas.ClipX - BoxWidth);
BoxWidth = 0.5 * Canvas.ClipX - 2*BoxXPos;
BoxXPos = BoxXPos + TeamNum * 0.5 * Canvas.ClipX;
NameXPos = BoxXPos + 0.05 * BoxWidth;
ScoreXPos = BoxXPos + 0.55 * BoxWidth;
NetXPos = BoxXPos + 0.76 * BoxWidth;
bHaveHalfFont = HaveHalfFont(Canvas, FontReduction);
// draw background box
Canvas.Style = ERenderStyle.STY_Alpha;
Canvas.DrawColor = HUDClass.default.WhiteColor;
Canvas.SetPos(BoxXPos, HeaderOffsetY);
Canvas.DrawTileStretched( TeamBoxMaterial[TeamNum], BoxWidth, PlayerCount * (PlayerBoxSizeY + BoxSpaceY));
// draw team header
IconScale = Canvas.ClipX/4096;
ScoreBackScale = Canvas.ClipX/1024;
if ( GRI.TeamSymbols[TeamNum] != None )
{
SymbolUSize = GRI.TeamSymbols[TeamNum].USize;
SymbolVSize = GRI.TeamSymbols[TeamNum].VSize;
}
else
{
SymbolUSize = 256;
SymbolVSize = 256;
}
ScoreYPos = HeaderOffsetY - SymbolVSize * IconScale - BoxSpaceY;
Canvas.DrawColor = 0.75 * HUDClass.default.WhiteColor;
Canvas.SetPos(BoxXPos, ScoreYPos - BoxSpaceY);
// if _RO_
Canvas.DrawTileStretched( Texture'InterfaceArt_tex.Menu.RODisplay', BoxWidth, HeaderOffsetY + BoxSpaceY - ScoreYPos);
// else
// Canvas.DrawTileStretched( Material'InterfaceContent.ScoreBoxA', BoxWidth, HeaderOffsetY + BoxSpaceY - ScoreYPos);
// end if _RO_
Canvas.Style = ERenderStyle.STY_Normal;
Canvas.DrawColor = TeamColors[TeamNum];
Canvas.SetPos((0.25 + 0.5*TeamNum) * Canvas.ClipX - (SymbolUSize + 32) * IconScale, ScoreYPos);
if ( GRI.TeamSymbols[TeamNum] != None )
Canvas.DrawIcon(GRI.TeamSymbols[TeamNum],IconScale);
MainFont = Canvas.Font;
Canvas.Font = HUDClass.static.LargerFontThan(MainFont);
Canvas.StrLen("TEST",XL,ScoreYL);
if ( ScoreYPos == 0 )
ScoreYPos = HeaderOffsetY - ScoreYL;
else
ScoreYPos = ScoreYPos + 0.5 * SymbolVSize * IconScale - 0.5 * ScoreYL;
Canvas.SetPos((0.25 + 0.5*TeamNum) * Canvas.ClipX + 32*IconScale,ScoreYPos);
Canvas.DrawText(int(GRI.Teams[TeamNum].Score));
Canvas.Font = MainFont;
Canvas.DrawColor = HUDClass.default.WhiteColor;
IconScale = Canvas.ClipX/1024;
if ( PlayerCount <= 0 )
return;
// draw lines between sections
if ( TeamNum == 0 )
Canvas.DrawColor = HUDClass.default.RedColor;
else
Canvas.DrawColor = HUDClass.default.BlueColor;
if ( OwnerOffset >= PlayerCount )
LastLine = PlayerCount+1;
else
LastLine = PlayerCount;
for ( i=1; i<LastLine; i++ )
{
Canvas.SetPos( NameXPos, HeaderOffsetY + (PlayerBoxSizeY + BoxSpaceY)*i - 0.5*BoxSpaceY);
// if _RO_
Canvas.DrawTileStretched( Texture'InterfaceArt_tex.Menu.RODisplay', 0.9*BoxWidth, ScorebackScale*3);
// else
// Canvas.DrawTileStretched( Material'InterfaceContent.ButtonBob', 0.9*BoxWidth, ScorebackScale*3);
// end if _RO_
}
Canvas.DrawColor = HUDClass.default.WhiteColor;
// draw player names
MaxNamePos = 0.95 * (ScoreXPos - NameXPos);
for ( i=0; i<PlayerCount; i++ )
{
playername[i] = GRI.PRIArray[i].PlayerName;
Canvas.StrLen(playername[i], XL, YL);
if ( XL > FMax(LongestNameLength,MaxNamePos) )
{
LongestName = PlayerName[i];
LongestNameLength = XL;
}
}
if ( OwnerOffset >= PlayerCount )
{
playername[OwnerOffset] = GRI.PRIArray[OwnerOffset].PlayerName;
Canvas.StrLen(playername[OwnerOffset], XL, YL);
if ( XL > FMax(LongestNameLength,MaxNamePos) )
{
LongestName = PlayerName[i];
LongestNameLength = XL;
}
}
if ( LongestNameLength > 0 )
{
bNameFontReduction = true;
Canvas.Font = GetSmallerFontFor(Canvas,FontReduction+1);
Canvas.StrLen(LongestName, XL, YL);
if ( XL > MaxNamePos )
{
Canvas.Font = GetSmallerFontFor(Canvas,FontReduction+2);
Canvas.StrLen(LongestName, XL, YL);
if ( XL > MaxNamePos )
Canvas.Font = GetSmallerFontFor(Canvas,FontReduction+3);
}
ReducedFont = Canvas.Font;
}
for ( i=0; i<PlayerCount; i++ )
{
playername[i] = PRIArray[i].PlayerName;
Canvas.StrLen(playername[i], XL, YL);
if ( XL > MaxNamePos )
playername[i] = left(playername[i], MaxNamePos/XL * len(PlayerName[i]));
}
if ( OwnerOffset >= PlayerCount )
{
playername[OwnerOffset] = PRIArray[OwnerOffset].PlayerName;
Canvas.StrLen(playername[OwnerOffset], XL, YL);
if ( XL > MaxNamePos )
playername[OwnerOffset] = left(playername[OwnerOffset], MaxNamePos/XL * len(PlayerName[OwnerOffset]));
}
if ( Canvas.ClipX < 512 )
NameY = 0.5 * YL;
else if ( !bHaveHalfFont )
NameY = 0.125 * YL;
Canvas.Style = ERenderStyle.STY_Normal;
Canvas.DrawColor = HUDClass.default.WhiteColor;
Canvas.SetPos(0.5 * Canvas.ClipX, HeaderOffsetY + 4);
BoxTextOffsetY = HeaderOffsetY + 0.5 * PlayerBoxSizeY - 0.5 * YL;
Canvas.DrawColor = HUDClass.default.WhiteColor;
if ( OwnerOffset == -1 )
{
for ( i=0; i<PlayerCount; i++ )
if ( i != OwnerOffset )
{
Canvas.SetPos(NameXPos, (PlayerBoxSizeY + BoxSpaceY)*i + BoxTextOffsetY);
Canvas.DrawText(playername[i],true);
}
}
else
{
for ( i=0; i<PlayerCount; i++ )
if ( i != OwnerOffset )
{
Canvas.SetPos(NameXPos, (PlayerBoxSizeY + BoxSpaceY)*i + BoxTextOffsetY - 0.5 * YL + NameY);
Canvas.DrawText(playername[i],true);
}
}
if ( bNameFontReduction )
Canvas.Font = GetSmallerFontFor(Canvas,FontReduction);
// draw scores
Canvas.DrawColor = HUDClass.default.WhiteColor;
for ( i=0; i<PlayerCount; i++ )
if ( i != OwnerOffset )
{
Canvas.SetPos(ScoreXPos, (PlayerBoxSizeY + BoxSpaceY)*i + BoxTextOffsetY);
if ( PRIArray[i].bOutOfLives )
Canvas.DrawText(OutText,true);
else
Canvas.DrawText(int(PRIArray[i].Score),true);
}
// draw owner line
if ( OwnerOffset >= 0 )
{
if ( OwnerOffset >= PlayerCount )
{
OwnerPos = (PlayerBoxSizeY + BoxSpaceY)*PlayerCount + BoxTextOffsetY;
// draw extra box
Canvas.Style = ERenderStyle.STY_Alpha;
Canvas.SetPos(BoxXPos, HeaderOffsetY + (PlayerBoxSizeY + BoxSpaceY)*PlayerCount);
Canvas.DrawTileStretched( TeamBoxMaterial[TeamNum], BoxWidth, PlayerBoxSizeY);
Canvas.Style = ERenderStyle.STY_Normal;
if ( PRIArray[OwnerOffset].HasFlag != None )
{
Canvas.DrawColor = HUDClass.default.WhiteColor;
Canvas.SetPos(NameXPos - 48*IconScale, OwnerPos - 16*IconScale);
Canvas.DrawTile( FlagIcon, 64*IconScale, 32*IconScale, 0, 0, 256, 128);
}
}
else
OwnerPos = (PlayerBoxSizeY + BoxSpaceY)*OwnerOffset + BoxTextOffsetY;
Canvas.DrawColor = HUDClass.default.GoldColor;
Canvas.SetPos(NameXPos, OwnerPos-0.5*YL+NameY);
if ( bNameFontReduction )
Canvas.Font = ReducedFont;
Canvas.DrawText(playername[OwnerOffset],true);
if ( bNameFontReduction )
Canvas.Font = GetSmallerFontFor(Canvas,FontReduction);
Canvas.SetPos(ScoreXPos, OwnerPos);
if ( PRIArray[OwnerOffset].bOutOfLives )
Canvas.DrawText(OutText,true);
else
Canvas.DrawText(int(PRIArray[OwnerOffset].Score),true);
}
// draw flag icons
Canvas.DrawColor = HUDClass.default.WhiteColor;
if ( TeamNum == 0 )
OtherTeam = 1;
if ( (GRI.FlagState[OtherTeam] != EFlagState.FLAG_Home) && (GRI.FlagState[OtherTeam] != EFlagState.FLAG_Down) )
{
for ( i=0; i<PlayerCount; i++ )
if ( (PRIArray[i].HasFlag != None) || (PRIArray[i] == GRI.FlagHolder[TeamNum]) )
{
Canvas.SetPos(NameXPos - 48*IconScale, (PlayerBoxSizeY + BoxSpaceY)*i + BoxTextOffsetY - 16*IconScale);
Canvas.DrawTile( FlagIcon, 64*IconScale, 32*IconScale, 0, 0, 256, 128);
}
}
// draw location and/or orders
if ( (OwnerOffset >= 0) && (Canvas.ClipX >= 512) )
{
BoxTextOffsetY = HeaderOffsetY + 0.5*PlayerBoxSizeY + NameY;
Canvas.DrawColor = HUDClass.default.CyanColor;
if ( FontReduction > 3 )
bHaveHalfFont = false;
if ( Canvas.ClipX >= 1280 )
Canvas.Font = GetSmallFontFor(Canvas.ClipX, FontReduction+2);
else
Canvas.Font = GetSmallFontFor(Canvas.ClipX, FontReduction+1);
Canvas.StrLen("Test", XL, YL);
for ( i=0; i<PlayerCount; i++ )
{
LineCount = 0;
if( PRIArray[i].bBot && (TeamPlayerReplicationInfo(PRIArray[i]) != None) && (TeamPlayerReplicationInfo(PRIArray[i]).Squad != None) )
{
LineCount = 1;
Canvas.SetPos(NameXPos, (PlayerBoxSizeY + BoxSpaceY)*i + BoxTextOffsetY);
if ( Canvas.ClipX < 800 )
OrdersText = "("$PRIArray[i].GetCallSign()$") "$TeamPlayerReplicationInfo(PRIArray[i]).Squad.GetShortOrderStringFor(TeamPlayerReplicationInfo(PRIArray[i]));
else
{
OrdersText = TeamPlayerReplicationInfo(PRIArray[i]).Squad.GetOrderStringFor(TeamPlayerReplicationInfo(PRIArray[i]));
OrdersText = "("$PRIArray[i].GetCallSign()$") "$OrdersText;
Canvas.StrLen(OrdersText, oXL, oYL);
if ( oXL >= ScoreXPos - NameXPos )
OrdersText = "("$PRIArray[i].GetCallSign()$") "$TeamPlayerReplicationInfo(PRIArray[i]).Squad.GetShortOrderStringFor(TeamPlayerReplicationInfo(PRIArray[i]));
}
Canvas.DrawText(OrdersText,true);
}
if ( bHaveHalfFont || !PRIArray[i].bBot )
{
Canvas.SetPos(NameXPos, (PlayerBoxSizeY + BoxSpaceY)*i + BoxTextOffsetY + LineCount*YL);
Canvas.DrawText(PRIArray[i].GetLocationName(),true);
}
}
if ( OwnerOffset >= PlayerCount )
{
Canvas.SetPos(NameXPos, (PlayerBoxSizeY + BoxSpaceY)*i + BoxTextOffsetY);
Canvas.DrawText(PRIArray[OwnerOffset].GetLocationName(),true);
}
}
if ( Level.NetMode == NM_Standalone )
return;
Canvas.Font = MainFont;
Canvas.StrLen("Test",XL,YL);
BoxTextOffsetY = HeaderOffsetY + 0.5 * PlayerBoxSizeY - 0.5 * YL;
DrawNetInfo(Canvas,FontReduction,HeaderOffsetY,PlayerBoxSizeY,BoxSpaceY,BoxTextOffsetY,OwnerOffset,PlayerCount,NetXPos);
}
defaultproperties
{
// IF _RO_
ScoreBoardU=none//Material'MenuEffects.ScoreboardU_FB'
FlagIcon=none//Material'MenuEffects.ScoreboardU_FB'
ScoreBack=none//Material'MenuEffects.ScoreIcon_FB'
// if _RO_
TeamBoxMaterial(0)=Texture'InterfaceArt_tex.Menu.RODisplay'
TeamBoxMaterial(1)=Texture'InterfaceArt_tex.Menu.RODisplay'
// else
// TeamBoxMaterial(0)=Material'InterfaceContent.ScoreBoxC'
// TeamBoxMaterial(1)=Material'InterfaceContent.ScoreBoxB'
// end if _RO_
TeamColors(0)=(R=255,G=0,B=0,A=255)
TeamColors(1)=(R=0,G=0,B=255,A=255)
FragLimit="SCORE LIMIT:"
}