Major refactor to include tactical combat feed

This commit is contained in:
2026-03-10 23:05:20 -05:00
parent 16b70204a1
commit 1be066c6ed
12 changed files with 490 additions and 374 deletions

View File

@@ -1,10 +1,7 @@
require("PGBase")
require("GameManager/Constants")
require("GameManager/Utilities")
---@class GUIManager
---@field TacticalGame TacticalGameClass|nil The local Tactical Game state.
---@field SkirmishGame SkirmishGameClass|nil The local Skirmish Game state.
---@field ShowTeamId integer The Team ID units to display.
GUIManager = {}
GUIManager.__index = GUIManager
@@ -13,22 +10,15 @@ GUIManager.__index = GUIManager
function GUIManager:New()
local self = setmetatable({}, GUIManager)
self.TacticalGame = nil
self.SkirmishGame = nil
self.ShowTeamId = 0
return self
end
---Initializes the GUI Manager for Skirmish mode.
---@param game SkirmishGameClass The Skirmish Game state.
function GUIManager:InitSkirmish(game)
self.SkirmishGame = game
self.TacticalGame = game.TacticalGame
---@param isSpectator boolean Whether to initialize in spectator mode.
function GUIManager:InitSkirmish(isSpectator)
self:InitTactical()
GUI_Component_Visibility(UI_GameTime, true)
if self.SkirmishGame.IsLocalSpectator then
if isSpectator then
GUI_Component_Visibility(UI_CreditsT1, true)
GUI_Component_Visibility(UI_IconT1, true)
@@ -41,18 +31,12 @@ function GUIManager:InitSkirmish(game)
end
---Initializes the GUI Manager for Tactical mode.
---@param game TacticalGameClass The Tactical Game state.
function GUIManager:InitTactical(game)
self.TacticalGame = game
function GUIManager:InitTactical()
GUI_Component_Visibility(UI_GameTime, true)
end
---Resets the GUI Manager.
function GUIManager:Reset()
self.SkirmishGame = nil
self.TacticalGame = nil
GUI_Component_Text(UI_GameTime, "")
GUI_Text_Color(UI_GameTime, 1, 1, 1, 1)
GUI_Component_Visibility(UI_GameTime, false)
@@ -75,129 +59,43 @@ function GUIManager:Reset()
GUI_Component_Visibility(UI_CreditsTactical, true)
end
---Services the GUI Manager.
function GUIManager:Service()
if not self.TacticalGame then
-- Nothing to service
return
end
ScriptMessage("Servicing GUI Updates...")
ServiceGameTime(self.TacticalGame)
ServiceTeamCredits(self.SkirmishGame)
--ServiceUnitDisplay(self.SkirmishGame, self.ShowTeamId)
ServiceScreenText(self.SkirmishGame)
end
---Services Game Time display.
---@param tacticalGame TacticalGameClass The current Tactical Game state
function ServiceGameTime(tacticalGame)
if not tacticalGame then
return
end
local gameTime = Dirty_Floor(GetCurrentTime()) - tacticalGame.StartTime
local minutes = Dirty_Floor(gameTime / 60)
local minutesText = tostring(minutes)
if tonumber(minutes) < 10 then
minutesText = "0" .. minutesText
end
local seconds = gameTime - (minutes * 60)
local secondsText = tostring(seconds)
if tonumber(seconds) < 10 then
secondsText = "0" .. secondsText
end
local text = string.format("Time: %s:%s", minutesText, secondsText)
---@param gameTime number The current game time.
function GUIManager:DisplayGameTime(gameTime)
local timeText = FormatTime(gameTime)
local text = string.format("Time: %s", timeText)
GUI_Component_Text(UI_GameTime, text)
end
---Services Team Credits display.
---@param skirmishGame SkirmishGameClass The current Skirmish Game state.
function ServiceTeamCredits(skirmishGame)
if not skirmishGame then
---Displays credits for the specified team
---@param team TeamStruct The team.
---@param credits number The team credits.
---@param income number The team income.
function GUIManager:DisplayTeamCredits(team, credits, income)
local uiText, uiIcon = "", ""
if team.Number == 1 then
uiText = UI_CreditsT1
uiIcon = UI_IconT1
elseif team.Number == 2 then
uiText = UI_CreditsT2
uiIcon = UI_IconT2
else
return
end
if not skirmishGame.IsLocalSpectator then
return
local positiveText = "+"
if income < 0 then
positiveText = ""
end
---Displays credits for the specified team
---@param team TeamStruct The team to service.
---@param uiText string The name of the UI Component to display Team credits in.
---@param uiIcon string The name of the UI Component to display the Faction icon in.
local function DisplayTeamCredits(team, uiText, uiIcon)
local teamCredits = skirmishGame:CalculateTeamTotalCredits(team.Id)
local teamIncome = skirmishGame:CalculateTeamTotalIncome(team.Id)
local positiveText = "+"
local text = string.format("Team %d: $%d (%s%d)", team.Number, credits, positiveText, income)
local icon = team.Faction.Icon
local color = team.Faction.Color
if teamIncome < 0 then
positiveText = ""
end
local text = string.format("Team %d: $%d (%s%d)", team.Number, teamCredits, positiveText, teamIncome)
local icon = team.Faction.Icon
local color = team.Faction.Color
GUI_Button_Icon(uiIcon, icon, color.R, color.G, color.B, 1)
GUI_Component_Text(uiText, text)
GUI_Text_Color(uiText, color.R, color.G, color.B, 1)
end
for _, team in pairs(skirmishGame.Teams) do
if team.Number == 1 then
DisplayTeamCredits(team, UI_CreditsT1, UI_IconT1)
elseif team.Number == 2 then
DisplayTeamCredits(team, UI_CreditsT2, UI_IconT2)
end
end
end
---Services Team Units display.
---@param skirmishGame SkirmishGameClass The current Skirmish Game state.
---@param teamId integer The Team ID's units to display.
function ServiceUnitDisplay(skirmishGame, teamId)
if not skirmishGame then
return
end
if not skirmishGame.IsLocalSpectator then
return
end
local localPlayer = Find_Player("local")
if not localPlayer then
return
end
local function DisplayTeamUnit(unit, uiComponent)
end
local players = skirmishGame:GetPlayersOnTeam(teamId)
---@type table<string, integer> Units Table by name with alive count.
local units = {}
for _, player in pairs(players) do
local playerUnits = player:GetAliveUnits()
for _, playerUnit in pairs(playerUnits) do
localPlayer.Select_Object(playerUnit.GameObjectWrapper)
if not units[playerUnit.Name] then
units[playerUnit.Name] = 1
else
units[playerUnit.Name] = units[playerUnit.Name] + 1
end
end
end
end
function ServiceScreenText(skirmishGame)
GUI_Button_Icon(uiIcon, icon, color.R, color.G, color.B, 1)
GUI_Component_Text(uiText, text)
GUI_Text_Color(uiText, color.R, color.G, color.B, 1)
end