Render FFA scoreboard as one 18-player list

This commit is contained in:
dr3murr 2026-07-31 21:31:58 -04:00
parent 61ad7af076
commit 3375c0cd37
3 changed files with 44 additions and 9 deletions

View file

@ -828,9 +828,16 @@ function ServerCallback_AnnounceWinner( teamIndex, subStringIndex, winnerDetermi
if ( subStringIndex )
subString = GetStringFromID( subStringIndex )
local isFFAWinner = player == GetWinningPlayer()
local winningPlayer = null
if ( IsFFABased() )
{
local players = GetSortedPlayers( GetScoreboardCompareFunc(), null )
if ( players.len() )
winningPlayer = players[0]
}
local isFFAWinner = player == winningPlayer
if ( !level.nv.winningTeam && !GetWinningPlayer() )
if ( !level.nv.winningTeam && !winningPlayer )
{
local outcomeAnnouncement = CAnnouncement( "#GAMEMODE_DRAW" )
outcomeAnnouncement.SetSubText( subString )
@ -1090,4 +1097,4 @@ function ToggleDebugDrawFrontline()
{
local player = GetLocalViewPlayer()
player.s.debugDrawFrontline = !player.s.debugDrawFrontline
}
}

View file

@ -46,7 +46,10 @@ function UpdateFFAScoreBars()
if ( !player )
return
local winningPlayer = GetWinningPlayer()
local winningPlayer = null
local players = GetSortedPlayers( GetScoreboardCompareFunc(), null )
if ( players.len() )
winningPlayer = players[0]
local cockpit = player.GetCockpit()
if ( !cockpit )

View file

@ -383,10 +383,23 @@ function InitScoreboard_Think()
file.header.gametypeAndMap.Show()
file.header.gametypeDesc.Show()
file.teamElems[myTeam].logo.Show()
file.teamElems[myTeam].score.Show()
file.teamElems[enemyTeam].logo.Show()
file.teamElems[enemyTeam].score.Show()
if ( IsFFABased() )
{
// FFA uses both nine-row HUD groups as one continuous 18-player list.
// Team branding and scores would make the second group look like an
// opposing team even though every entry is an individual competitor.
file.teamElems[myTeam].logo.Hide()
file.teamElems[myTeam].score.Hide()
file.teamElems[enemyTeam].logo.Hide()
file.teamElems[enemyTeam].score.Hide()
}
else
{
file.teamElems[myTeam].logo.Show()
file.teamElems[myTeam].score.Show()
file.teamElems[enemyTeam].logo.Show()
file.teamElems[enemyTeam].score.Show()
}
foreach( elem in file.columnIconBackgrounds )
elem.Show()
@ -447,7 +460,8 @@ function ShowScoreboard()
local playerSeperatorHeight = (SCOREBOARD_PLAYER_SEPARATOR_HEIGHT * resMultiplier).tointeger()
local playerHeight = (playerHeightUnits * resMultiplier).tointeger()
local teamSeparatorHeight = (8 * resMultiplier).tointeger()
local losingTeamYOffset = ((((playerHeightUnits + SCOREBOARD_PLAYER_SEPARATOR_HEIGHT) * numTeamPlayers) + 5) * resMultiplier).tointeger()
local teamGroupGap = IsFFABased() ? 0 : 5
local losingTeamYOffset = ((((playerHeightUnits + SCOREBOARD_PLAYER_SEPARATOR_HEIGHT) * numTeamPlayers) + teamGroupGap) * resMultiplier).tointeger()
file.background.Show()
file.header.background.Show()
@ -488,6 +502,15 @@ function ShowScoreboard()
playerSlotEmpty[myTeam] <- SCOREBOARD_MATERIAL_FRIENDLY_SLOT
playerSlotEmpty[enemyTeam] <- SCOREBOARD_MATERIAL_ENEMY_SLOT
if ( IsFFABased() )
{
// The second HUD group is rows 10-18 in FFA, not an enemy team.
teamColors[enemyTeam] = teamColors[myTeam]
playerSlotFilledEven[enemyTeam] = playerSlotFilledEven[myTeam]
playerSlotFilledOdd[enemyTeam] = playerSlotFilledOdd[myTeam]
playerSlotEmpty[enemyTeam] = playerSlotEmpty[myTeam]
}
local teamScore = {}
teamScore[myTeam] <- []
teamScore[enemyTeam] <- []
@ -509,6 +532,8 @@ function ShowScoreboard()
local data_highlight_bg_color = {}
data_highlight_bg_color[myTeam] <- [0, 138, 166]
data_highlight_bg_color[enemyTeam] <- [156, 71, 6]
if ( IsFFABased() )
data_highlight_bg_color[enemyTeam] = data_highlight_bg_color[myTeam]
if ( IsFFABased() )
{