180 lines
5.1 KiB
Lua
180 lines
5.1 KiB
Lua
require("PGBase")
|
|
require("GameManager/Constants")
|
|
require("GameManager/TacticalGameClass")
|
|
require("GameManager/SpectatorStruct")
|
|
require("GameManager/TeamStruct")
|
|
|
|
---@class SkirmishGameClass
|
|
---@field TacticalGame TacticalGameClass The underlying Tactical Game context.
|
|
---@field Spectators SpectatorStruct[] The spectator players in this game.
|
|
---@field IsLocalSpectator boolean Whether the local player is a spectator.
|
|
---@field Teams TeamStruct[] The teams in this game.
|
|
SkirmishGameClass = {}
|
|
SkirmishGameClass.__index = SkirmishGameClass
|
|
|
|
---Creates a new Skirmish Game context.
|
|
---@param gameMode string The game mode.
|
|
---@return SkirmishGameClass
|
|
function SkirmishGameClass:New(gameMode)
|
|
ScriptMessage("Initializing Skirmish game...")
|
|
local self = setmetatable({}, SkirmishGameClass)
|
|
|
|
---Finds all spectators in the game.
|
|
---@return SpectatorStruct[]
|
|
local function FindSpectators()
|
|
---@type SpectatorStruct[]
|
|
local spectators = {}
|
|
local spectatorMarker = nil
|
|
|
|
if StringCompare(gameMode, "Space") then
|
|
spectatorMarker = Spectator_Marker_Space
|
|
elseif StringCompare(gameMode, "Land") then
|
|
spectatorMarker = Spectator_Marker_Land
|
|
end
|
|
|
|
if spectatorMarker then
|
|
for k, marker in pairs(Find_All_Objects_Of_Type(spectatorMarker)) do
|
|
local playerWrapper = marker.Get_Owner()
|
|
local playerId = playerWrapper.Get_ID()
|
|
|
|
if not spectators[playerId] then
|
|
local spectator = SpectatorStruct:New(playerWrapper)
|
|
|
|
spectators[playerId] = spectator
|
|
ScriptMessage("Found Spectator: %s", spectator:Debug())
|
|
end
|
|
end
|
|
end
|
|
|
|
return spectators
|
|
end
|
|
|
|
self.TacticalGame = TacticalGameClass:New(gameMode)
|
|
self.Spectators = FindSpectators()
|
|
|
|
---Gets whether the local player is a spectator.
|
|
---@returns boolean
|
|
local function GetLocalSpectator()
|
|
local localPlayer = Find_Player("local")
|
|
|
|
return self:GetSpectator(localPlayer.Get_ID()) ~= nil
|
|
end
|
|
|
|
self.IsLocalSpectator = GetLocalSpectator()
|
|
|
|
---Builds all teams in the game.
|
|
---@return TeamStruct[]
|
|
local function BuildTeams()
|
|
---@type TeamStruct[]
|
|
local teams = {}
|
|
|
|
-- Build combatant player teams
|
|
for playerId, player in pairs(self.TacticalGame.Players) do
|
|
local teamId = player.TeamId
|
|
|
|
if teamId >= 0 then
|
|
if teams[teamId] == nil then
|
|
teams[teamId] = TeamStruct:New(teamId, player.Faction, false)
|
|
end
|
|
end
|
|
end
|
|
|
|
-- Build spectator player teams
|
|
for playerId, spectator in pairs(self.Spectators) do
|
|
local teamId = spectator.TeamId
|
|
|
|
if teamId >= 0 then
|
|
local team = teams[teamId]
|
|
|
|
if team == nil then
|
|
team = TeamStruct:New(teamId, spectator.Faction, true)
|
|
teams[teamId] = team
|
|
ScriptMessage("Found Team: %s", team:Debug())
|
|
else
|
|
team.IsSpectator = true
|
|
end
|
|
end
|
|
end
|
|
|
|
return teams
|
|
end
|
|
|
|
self.Teams = BuildTeams()
|
|
ScriptMessage("Skirmish Game initialized!")
|
|
|
|
return self
|
|
end
|
|
|
|
---Services the Skirmish Game.
|
|
function SkirmishGameClass:Service()
|
|
ScriptMessage("Servicing Skirmish Game...")
|
|
-- Service TacticalGame
|
|
self.TacticalGame:Service()
|
|
end
|
|
|
|
---Gets the Spectator by Player ID.
|
|
---@param id integer Player ID
|
|
---@return SpectatorStruct|nil
|
|
function SkirmishGameClass:GetSpectator(id)
|
|
for playerId, spectator in pairs(self.Spectators) do
|
|
if playerId == id then
|
|
return spectator
|
|
end
|
|
end
|
|
end
|
|
|
|
---Gets the Team by ID.
|
|
---@param id integer Team ID
|
|
---@return TeamStruct|nil
|
|
function SkirmishGameClass:GetTeam(id)
|
|
for teamId, team in pairs(self.Teams) do
|
|
if teamId == id then
|
|
return team
|
|
end
|
|
end
|
|
end
|
|
|
|
---Gets the Players for the Team ID.
|
|
---@param id integer Team ID
|
|
---@return PlayerClass[]
|
|
function SkirmishGameClass:GetPlayersOnTeam(id)
|
|
---@type PlayerClass[]
|
|
local players = {}
|
|
|
|
for playerId, player in pairs(self.TacticalGame.Players) do
|
|
if player.TeamId == id then
|
|
players[playerId] = player
|
|
end
|
|
end
|
|
|
|
return players
|
|
end
|
|
|
|
---Calculates the Team ID's current total credits.
|
|
---@param id integer Team ID.
|
|
---@return integer
|
|
function SkirmishGameClass:CalculateTeamTotalCredits(id)
|
|
local players = self:GetPlayersOnTeam(id)
|
|
local totalCredits = 0
|
|
|
|
for playerId, player in pairs(players) do
|
|
totalCredits = totalCredits + player.Resource.Credits
|
|
end
|
|
|
|
return totalCredits
|
|
end
|
|
|
|
---Calculates the Team ID's current total income.
|
|
---@param id integer Team ID.
|
|
---@return integer
|
|
function SkirmishGameClass:CalculateTeamTotalIncome(id)
|
|
local players = self:GetPlayersOnTeam(id)
|
|
local totalIncome = 0
|
|
|
|
for playerId, player in pairs(players) do
|
|
totalIncome = totalIncome + player.Resource.Income
|
|
end
|
|
|
|
return totalIncome
|
|
end
|