168 lines
5.6 KiB
Lua
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 |