Files
SoaFE/DATA/SCRIPTS/GAMEOBJECT/DISPLAY_SPECTATORCREDITS.LUA
2026-02-28 14:00:45 -06:00

168 lines
5.6 KiB
Lua

-- This script is attached to the reveal marker present for team 3 of [Tournament] maps
-- Created by Lany#9464 and Galyana#3315 on Discord
require("PGStateMachine")
require("PGBase")
function Definitions()
DebugMessage("%s -- In Definitions", tostring(Script))
ServiceRate = 1.0
Define_State("State_Init", State_Init);
human_spectator_players = {}
spectator_is_present = false
end
function State_Init(message)
if message == OnEnter then
Object.Suspend_Locomotor(true)
Sleep(2) -- generous sleep to allow for spawning of starting units
primary_spectator_player = Object.Get_Owner()
if TestValid(primary_spectator_player) then
if primary_spectator_player.Is_Human() then
spectator_is_present = true
addToSet(human_spectator_players, primary_spectator_player)
-- TODO for a later stage: Figure out how to find multiple spectator players
else
DebugMessage("-- Info: Marker Owner Spectator Player is not human, exiting.")
ScriptExit()
end
else
DebugMessage("-- ERROR: Marker Owner Spectator Player is not valid! Exiting.")
ScriptExit()
end
team_one_players = Get_All_Players_Of_Team(0)
team_two_players = Get_All_Players_Of_Team(1)
DebugMessage("-- INFO: team_one_players contains %s entries", tostring(setSize(team_one_players)))
DebugMessage("-- INFO: team_two_players contains %s entries", tostring(setSize(team_two_players)))
end
if message == OnUpdate then
Update_Credits_Display() -- Sync version
end
end
-- Gets all player objects of 'faction' via cycling the Space starting units of it and collecting the owners
-- returns a set (!) of player objects or nil if the faction is unknown
function Get_All_Players(faction)
DebugMessage("%s -- Entering Get_All_Players", tostring(Script))
local players = {}
local space_starting_unit_name = nil
if faction == "Rebel" then
space_starting_unit_name = "Rebel_X-Wing_Squadron" -- Squadron works if no specified container
elseif faction == "Empire" then
space_starting_unit_name = "TIE_Interceptor_Squadron_Container"
elseif faction == "Underworld" then
space_starting_unit_name = "StarViper_Team"
elseif faction == "Hutts" then
space_starting_unit_name = "V_Wing_Squadron_Container"
elseif faction == "Pirates" then
space_starting_unit_name = "Pirate_Fighter_Squadron"
end
if space_starting_unit_name ~= nil then -- TODO this could be made more elegant with getting the match setting
for i, unit in pairs(Find_All_Objects_Of_Type(space_starting_unit_name)) do -- space starting unit
addToSet(players, unit.Get_Owner())
end
else
DebugMessage("-- WARNING: Called Get_All_Players with an unknown faction parameter: %s", tostring(faction))
return nil
end
return players
end
-- Gets all players of a Team, by using Get_All_Players to find all players in the game and then filter for the queried team
-- team_id is a number
function Get_All_Players_Of_Team(team_id)
DebugMessage("%s -- Entering Get_All_Players_Of_Team for team %s", tostring(Script), tostring(team_id))
found_players = {} -- set
factions = {"Rebel", "Empire", "Underworld", "Hutts", "Pirates"}
faction_detected = false -- All players of a team will have the same faction, we can exit early
for key, faction in pairs(factions) do
-- early exit if the faction was already detected
if faction_detected then
return found_players
end
-- query the faction for it's starting units and then the owners for their team id
players = Get_All_Players(faction)
if players ~= nil then
for player, val in players do
if TestValid(player) then
DebugMessage("-- Found player %s of team %s", tostring(player), tostring(player.Get_Team()))
if player.Get_Team() == team_id then
DebugMessage("-- Adding player to list for team %s", tostring(team_id))
addToSet(found_players, player)
end
else
DebugMessage("-- ERROR: player not valid")
end
end
end
end
return found_players
end
-- Update the spectator player's credit display to show the rebel and empire player's respective funds
-- TODO modify to work for all spectator players
function Update_Credits_Display()
if spectator_is_present then
local team_1_credits = 0
local team_2_credits = 0
for player,x in team_one_players do
team_1_credits = team_1_credits + player.Get_Credits()
end
for player,x in team_two_players do
team_2_credits = team_2_credits + player.Get_Credits()
end
-- format team 1 credits (cut Ones)
local team_1_credits = tonumber(Dirty_Floor(team_1_credits / 10))
local team_1_credits = Clamp(team_1_credits, 0, 999)
-- format team 2 credits (cut Ones)
local team_2_credits = tonumber(Dirty_Floor(team_2_credits / 10))
local team_2_credits = Clamp(team_2_credits, 0, 999)
-- update spectator credits display ([Team]111,[Team]222)
local new_spectator_credits = team_1_credits * 1000
local new_spectator_credits = new_spectator_credits + team_2_credits
for player,x in human_spectator_players do
local old_credits = player.Get_Credits()
player.Give_Money(-old_credits) -- at 0 credits now
player.Give_Money(new_spectator_credits)
end
end
end
-- Set data type utility functions
-- a Set is a special use of a table where arbitrary keys always have the vale nil or true
-- loop usage: for key,unused in set do
function addToSet(set, key)
set[key] = true
end
function removeFromSet(set, key)
set[key] = nil
end
function setContains(set, key)
return set[key] ~= nil
end
function setSize(set)
local i = 0
for key, value in pairs(set) do
i = i + 1
end
return i
end