From cebb4ac06adc340e728909f161c645a35dfa6c01 Mon Sep 17 00:00:00 2001 From: Drew C Date: Sat, 28 Feb 2026 20:17:39 -0600 Subject: [PATCH] GameScoring adjustments --- DATA/SCRIPTS/MISCELLANEOUS/GAMESCORING.LUA | 1013 +++++++++++++------- 1 file changed, 665 insertions(+), 348 deletions(-) diff --git a/DATA/SCRIPTS/MISCELLANEOUS/GAMESCORING.LUA b/DATA/SCRIPTS/MISCELLANEOUS/GAMESCORING.LUA index 09a140a..17741c7 100644 --- a/DATA/SCRIPTS/MISCELLANEOUS/GAMESCORING.LUA +++ b/DATA/SCRIPTS/MISCELLANEOUS/GAMESCORING.LUA @@ -48,95 +48,178 @@ ScriptPoolCount = 0 -- Base_Definitions -- sets up the base variable for this script. -- -- @since 3/15/2005 3:55:03 PM -- BMH --- +-- function Base_Definitions() DebugMessage("%s -- In Base_Definitions", tostring(Script)) Common_Base_Definitions() - ServiceRate = 10 - - frag_index = 1 - death_index = 2 + ServiceRate = 1 + DebugRate = 10 + DebugCounter = 0 + + FragIndex = 1 + DeathIndex = 2 GameStartTime = 0 - - CampaignGame = false - + IsCampaignGame = false + IsTacticalGame = false + IsSkirmishGame = false + IsSpectator = false + Reset_Stats() if Definitions then Definitions() end - - Define_Title_Faction_Table() -end --- --- The player list has been reset underneath us, reset the stats. --- --- @since 5/5/2005 7:43:17 PM -- BMH --- -function Player_List_Reset() - GameScoringMessage("GameScoring -- PlayerList Reset.") - Reset_Stats() + Define_Title_Faction_Table() + + UI_GameTime = "s_select_43" + UI_CreditsT1 = "s_select_41" + UI_CreditsT2 = "s_select_42" end -- -- main script function. Does event pumps and servicing. -- -- @since 3/15/2005 3:55:03 PM -- BMH --- +-- function main() - DebugMessage("GameScoring -- In main.") - + if GameService then while 1 do GameService() PumpEvents() end end - + ScriptExit() end +-- +-- Script service function. Just prints out the current stats. +-- +-- @since 3/15/2005 3:56:43 PM -- BMH +-- +function GameService() + DebugCounter = DebugCounter + 1 + + local game_time = GetCurrentTime.Frame() + + game_time = Dirty_Floor(game_time) + + if DebugCounter == DebugRate then + if IsTacticalGame then + GameScoringMessage("GameScoring -- Tactical Stats dump.") + Print_Stat_Table(TacticalKillStatsTable) + Print_Build_Stats_Table(TacticalBuildStatsTable) + end + + if IsCampaignGame then + GameScoringMessage("GameScoring -- Galactic Stats dump.") + Print_Stat_Table(GalacticKillStatsTable) + Print_Build_Stats_Table(GalacticBuildStatsTable) + end + + if IsSkirmishGame then + GameScoringMessage("GameScoring -- Skirmish Stats dump.") + Print_Credits_History_Table(TacticalCreditsHistoryTable, game_time) + end + + Debug_Print_Score_Vals() + DebugCounter = 0 + end + + if IsTacticalGame then + Update_GUI_Game_Time(game_time) + end + + if IsSkirmishGame then + Update_Credits(game_time) + Update_GUI_Player_Credits() + end +end + +-- ========================= +-- Reset State +-- ========================= + +-- +-- The player list has been reset underneath us, reset the stats. +-- +-- @since 5/5/2005 7:43:17 PM -- BMH +-- +function Player_List_Reset() + GameScoringMessage("GameScoring -- PlayerList Reset.") + Reset_Stats() +end -- -- Reset the Tactical mode game stats. -- -- @since 3/15/2005 3:56:43 PM -- BMH --- +-- function Reset_Tactical_Stats() GameScoringMessage("GameScoring -- Resetting tactical stats.") -- [frag|death][playerid][object_type][build_count, credits_spent, combat_power] - TacticalKillStatsTable = {[frag_index] = {}, [death_index] = {}} - TacticalTeamKillStatsTable = {[frag_index] = {}, [death_index] = {}} - + TacticalKillStatsTable = { [FragIndex] = {}, [DeathIndex] = {} } + TacticalTeamKillStatsTable = { [FragIndex] = {}, [DeathIndex] = {} } + -- [playerid][planetname][object_type][build_count, credits_spent, combat_power] TacticalBuildStatsTable = {} - + + -- [team_id][current_credits, last_credits] + TacticalCreditsTable = {} + + --- table[time]: { + --- table[teamId]: { + --- totalCredits: number, + --- totalIncome: number, + --- players: table[playerId]: { + --- credits: number, + --- income: number + --- } + --- } + --- } + TacticalCreditsHistoryTable = {} + + --- table[teamId]: { + --- faction: string, + --- color: { + --- r: number, + --- g: number, + --- b: number + --- }, + --- tech: number, + --- isSpectator: boolean + --- players: table[playerId] { + --- name: string, + --- isHuman: boolean + --- } + --- } + TacticalTeamTable = {} + -- a dirty hack to reset tactical script registry values ResetTacticalRegistry() end - function GameScoringMessage(...) _ScriptMessage(string.format(unpack(arg))) _OuputDebug(string.format(unpack(arg)) .. "\n") end - -- -- Reset all the stats and player lists. -- -- @since 3/15/2005 3:56:43 PM -- BMH --- +-- function Reset_Stats() GameScoringMessage("GameScoring -- Resetting stats.") - + Reset_Tactical_Stats() -- [frag|death][playerid][object_type][build_count, credits_spent, combat_power] - GalacticKillStatsTable = {[frag_index] = {}, [death_index] = {}} + GalacticKillStatsTable = { [FragIndex] = {}, [DeathIndex] = {} } -- [playerid][planetname][object_type][build_count, credits_spent, combat_power] GalacticBuildStatsTable = {} @@ -146,17 +229,22 @@ function Reset_Stats() -- [playerid][planet_type][sacked_count, lost_count] GalacticConquestTable = {} - + + -- [player_id][PlayerWrapper] PlayerTable = {} + + -- [player_id][PlayerWrapper] PlayerQuitTable = {} end - function ResetTacticalRegistry() DebugMessage("Resetting Allow_AI_Controlled_Fog_Reveal to 1 (allowed)") GlobalValue.Set("Allow_AI_Controlled_Fog_Reveal", 1) end +-- ========================= +-- Update Stat Tables +-- ========================= -- -- Update our GameStats table with build stats @@ -165,60 +253,145 @@ end -- @param planet planet where the object was produced -- @param object_type the object type that was just produced -- @since 3/18/2005 3:48:32 PM -- BMH --- +-- function Update_Build_Stats_Table(stat_table, planet, object_type, owner, build_cost) - Update_Player_Table(owner) if planet then planet_type = planet.Get_Type() planet_name = planet_type.Get_Name() - else + else planet_type = 1 planet_name = "Unknown" end - + combat_power = object_type.Get_Combat_Rating() score_value = object_type.Get_Score_Cost_Credits() owner_id = owner.Get_ID() - GameScoringMessage("GameScoring -- %s produced %s at %s.", PlayerTable[owner_id].Get_Name(), object_type.Get_Name(), planet_name) - + GameScoringMessage("GameScoring -- %s produced %s at %s.", PlayerTable[owner_id].Get_Name(), object_type.Get_Name(), + planet_name) + player_entry = stat_table[owner_id] if player_entry == nil then player_entry = {} end - + planet_entry = player_entry[planet_type] if planet_entry == nil then planet_entry = {} end type_entry = planet_entry[object_type] - if type_entry == nil then - type_entry = {build_count = 1, combat_power = combat_power, build_cost = build_cost, score_value = score_value} + if type_entry == nil then + type_entry = { build_count = 1, combat_power = combat_power, build_cost = build_cost, score_value = score_value } else type_entry.build_count = type_entry.build_count + 1 type_entry.combat_power = type_entry.combat_power + combat_power type_entry.build_cost = type_entry.build_cost + build_cost type_entry.score_value = type_entry.score_value + score_value end - + planet_entry[object_type] = type_entry player_entry[planet_type] = planet_entry stat_table[owner_id] = player_entry - end +-- +-- Updates the table of players for the current game. +-- +-- @param player player object to add to our table of players +-- @since 3/15/2005 3:56:43 PM -- BMH +-- +function Update_Player_Table(player) + if player == nil then return end + + ent = PlayerTable[player.Get_ID()] + if ent == nil then + PlayerTable[player.Get_ID()] = player + end + ent = nil +end + +-- +-- Update our GameStats table with victim, killer info. +-- +-- @param stat_table stat table to update +-- @param object the object that was destroyed +-- @param killer the player that killed this object +-- @since 3/15/2005 4:10:19 PM -- BMH +-- +function Update_Kill_Stats_Table(stat_table, object, killer) + if TestValid(object) == false or TestValid(killer) == false then + return + end + + Update_Player_Table(killer) + Update_Player_Table(object.Get_Owner()) + + object_type = object.Get_Game_Scoring_Type() + score_value = object.Get_Game_Scoring_Type().Get_Score_Cost_Credits() + combat_power = object.Get_Game_Scoring_Type().Get_Combat_Rating() + build_cost = object.Get_Game_Scoring_Type().Get_Build_Cost() + killer_id = killer.Get_ID() + owner_id = object.Get_Owner().Get_ID() + + GameScoringMessage("GameScoring -- Object: %s, was killed by %s.", object_type.Get_Name(), killer.Get_Name()) + + -- Update frags + frag_entry = stat_table[FragIndex] + if frag_entry == nil then frag_entry = {} end + + entry = frag_entry[killer_id] + if entry == nil then entry = {} end + + pe = entry[object_type] + if pe == nil then + pe = { kills = 1, combat_power = combat_power, build_cost = build_cost, score_value = score_value } + else + pe.kills = pe.kills + 1 + pe.combat_power = pe.combat_power + combat_power + pe.build_cost = pe.build_cost + build_cost + pe.score_value = pe.score_value + score_value + end + + entry[object_type] = pe + frag_entry[killer_id] = entry + stat_table[FragIndex] = frag_entry + + -- Update deaths + death_entry = stat_table[DeathIndex] + if death_entry == nil then death_entry = {} end + + entry = death_entry[owner_id] + if entry == nil then entry = {} end + + pe = entry[object_type] + if pe == nil then + pe = { kills = 1, combat_power = combat_power, build_cost = build_cost, score_value = score_value } + else + pe.kills = pe.kills + 1 + pe.combat_power = pe.combat_power + combat_power + pe.build_cost = pe.build_cost + build_cost + pe.score_value = pe.score_value + score_value + end + + entry[object_type] = pe + death_entry[owner_id] = entry + stat_table[DeathIndex] = death_entry +end + +-- ========================= +-- Print Stat Debugs +-- ========================= -- -- Print out the current build statistics for all the players. -- -- @param stat_table stats table to display. -- @since 3/21/2005 10:34:07 AM -- BMH --- +-- function Print_Build_Stats_Table(stat_table) - GameScoringMessage("GameScoring -- Build Stats dump.") - + totals_table = {} - + for owner_id, player_entry in pairs(stat_table) do build_count = 0 cost_count = 0 @@ -233,83 +406,86 @@ function Print_Build_Stats_Table(stat_table) GameScoringMessage("\t\t%20s:", planet_type.Get_Name()) end for object_type, type_entry in pairs(planet_entry) do - GameScoringMessage("\t\t%40s: %d : %d : $%d : %d", object_type.Get_Name(), type_entry.build_count, type_entry.combat_power, type_entry.build_cost, type_entry.score_value) + GameScoringMessage("\t\t%40s: %d : %d : $%d : %d", object_type.Get_Name(), type_entry.build_count, + type_entry.combat_power, type_entry.build_cost, type_entry.score_value) build_count = build_count + type_entry.build_count cost_count = cost_count + type_entry.build_cost power_count = power_count + type_entry.combat_power score_count = score_count + type_entry.score_value end end - - GameScoringMessage("\tTotal Builds: %d : %d : $%d : %d", build_count, power_count, cost_count, score_count) - totals_table[owner_id] = {build_count = build_count, cost_count = cost_count, power_count = power_count, score_count = score_count} - end - --- for k,player in pairs(PlayerTable) do --- dt = death_table[k] --- tt = totals_table[k] --- if tt == nil or tt.build_count == 0 then --- GameScoringMessage("\tPlayer %s, Military Efficiency: 0.0", player.Get_Name()) --- elseif dt == nil or dt.kills == 0 then --- GameScoringMessage("\tPlayer %s, Military Efficiency: %d", player.Get_Name(), tt.build_count) --- else --- GameScoringMessage("\tPlayer %s, Military Efficiency: %f", player.Get_Name(), (tt.build_count - dt.kills) / tt.build_count) --- end --- end -end + GameScoringMessage("\tTotal Builds: %d : %d : $%d : %d", build_count, power_count, cost_count, score_count) + totals_table[owner_id] = { + build_count = build_count, + cost_count = cost_count, + power_count = power_count, + score_count = + score_count + } + end + + -- for k,player in pairs(PlayerTable) do + -- dt = death_table[k] + -- tt = totals_table[k] + -- if tt == nil or tt.build_count == 0 then + -- GameScoringMessage("\tPlayer %s, Military Efficiency: 0.0", player.Get_Name()) + -- elseif dt == nil or dt.kills == 0 then + -- GameScoringMessage("\tPlayer %s, Military Efficiency: %d", player.Get_Name(), tt.build_count) + -- else + -- GameScoringMessage("\tPlayer %s, Military Efficiency: %f", player.Get_Name(), (tt.build_count - dt.kills) / tt.build_count) + -- end + -- end +end -- -- Print out the current statistics for all the players. -- -- @param stat_table stats table to display. -- @since 3/15/2005 5:55:55 PM -- BMH --- +-- function Print_Stat_Table(stat_table) - frag_table = {} GameScoringMessage("Frags:") - for k,v in pairs(stat_table[frag_index]) do - + for k, v in pairs(stat_table[FragIndex]) do tkills = 0 tpower = 0 tscore = 0 - + GameScoringMessage("\tPlayer %s:", PlayerTable[k].Get_Name()) - for kk,vv in pairs(v) do + for kk, vv in pairs(v) do GameScoringMessage("\t%40s: %d : %d : %d", kk.Get_Name(), vv.kills, vv.combat_power, vv.score_value) tkills = tkills + vv.kills tpower = tpower + vv.combat_power tscore = tscore + vv.score_value end - + GameScoringMessage("\tTotal Frags: %d : %d : %d", tkills, tpower, tscore) - frag_table[k] = {kills = tkills, combat_power = tpower, score_value = tscore} + frag_table[k] = { kills = tkills, combat_power = tpower, score_value = tscore } end - + death_table = {} - + GameScoringMessage("Deaths:") - for k,v in pairs(stat_table[death_index]) do - + for k, v in pairs(stat_table[DeathIndex]) do tkills = 0 tpower = 0 tscore = 0 - + GameScoringMessage("\tPlayer %s:", PlayerTable[k].Get_Name()) - for kk,vv in pairs(v) do + for kk, vv in pairs(v) do GameScoringMessage("\t%40s: %d : %d : %d", kk.Get_Name(), vv.kills, vv.combat_power, vv.score_value) tkills = tkills + vv.kills tpower = tpower + vv.combat_power tscore = tscore + vv.score_value end - + GameScoringMessage("\tTotal Deaths: %d : %d : %d", tkills, tpower, tscore) - death_table[k] = {kills = tkills, combat_power = tpower, score_value = tscore} + death_table[k] = { kills = tkills, combat_power = tpower, score_value = tscore } end - for k,player in pairs(PlayerTable) do + for k, player in pairs(PlayerTable) do ft = frag_table[k] dt = death_table[k] if ft == nil or ft.combat_power == 0 then @@ -317,119 +493,48 @@ function Print_Stat_Table(stat_table) elseif dt == nil or dt.combat_power == 0 then GameScoringMessage("\tPlayer %s, Weighted Kill Ratio: %d", player.Get_Name(), ft.combat_power) else - GameScoringMessage("\tPlayer %s, Weighted Kill Ratio: %f", player.Get_Name(), ft.combat_power / dt.combat_power) + GameScoringMessage("\tPlayer %s, Weighted Kill Ratio: %f", player.Get_Name(), + ft.combat_power / dt.combat_power) end end end +function Debug_Print_Score_Vals() + if IsTacticalGame then + for pid, player in pairs(PlayerTable) do + mill_eff, kill_eff = Get_Military_Efficiency(player, TacticalKillStatsTable, TacticalBuildStatsTable) --- --- Script service function. Just prints out the current stats. --- --- @since 3/15/2005 3:56:43 PM -- BMH --- -function GameService() + score = Calc_Score_For_Efficiency(mill_eff) + score = score + Calc_Score_For_Efficiency(kill_eff) - GameScoringMessage("GameScoring -- Tactical Stats dump.") - Print_Stat_Table(TacticalKillStatsTable) - GameScoringMessage("GameScoring -- Galactic Stats dump.") - Print_Stat_Table(GalacticKillStatsTable) + if PlayerQuitTable[pid] == true then + score = 0 + end - Print_Build_Stats_Table(GalacticBuildStatsTable) - Print_Build_Stats_Table(TacticalBuildStatsTable) + GameScoringMessage("Tactical %s:%s, Mill_Eff:%f, Kill_Eff:%f, Score:%f", player.Get_Name(), + player.Get_Faction_Name(), mill_eff, kill_eff, score) + end + end - Debug_Print_Score_Vals() + if IsCampaignGame then + for pid, player in pairs(PlayerTable) do + mill_eff, kill_eff = Get_Military_Efficiency(player, GalacticKillStatsTable, GalacticBuildStatsTable) + conq_eff = Get_Conquest_Efficiency(player) + + score = Calc_Score_For_Efficiency(mill_eff) + score = score + Calc_Score_For_Efficiency(kill_eff) + score = score + Calc_Score_For_Efficiency(Get_Conquest_Efficiency(player)) + + if PlayerQuitTable[pid] == true then + score = 0 + end + + GameScoringMessage("Galactic %s:%s, Mill_Eff:%f, Kill_Eff:%f, Conq_eff:%f, Score:%f", player.Get_Name(), + player.Get_Faction_Name(), mill_eff, kill_eff, conq_eff, score) + end + end end --- --- Updates the table of players for the current game. --- --- @param player player object to add to our table of players --- @since 3/15/2005 3:56:43 PM -- BMH --- -function Update_Player_Table(player) - - if player == nil then return end - - ent = PlayerTable[player.Get_ID()] - if ent == nil then - PlayerTable[player.Get_ID()] = player - end - ent = nil -end - - --- --- Update our GameStats table with victim, killer info. --- --- @param stat_table stat table to update --- @param object the object that was destroyed --- @param killer the player that killed this object --- @since 3/15/2005 4:10:19 PM -- BMH --- -function Update_Kill_Stats_Table(stat_table, object, killer) - - if TestValid(object) == false or TestValid(killer) == false then - return - end - - Update_Player_Table(killer) - Update_Player_Table(object.Get_Owner()) - - object_type = object.Get_Game_Scoring_Type() - score_value = object.Get_Game_Scoring_Type().Get_Score_Cost_Credits() - combat_power = object.Get_Game_Scoring_Type().Get_Combat_Rating() - build_cost = object.Get_Game_Scoring_Type().Get_Build_Cost() - killer_id = killer.Get_ID() - owner_id = object.Get_Owner().Get_ID() - - GameScoringMessage("GameScoring -- Object: %s, was killed by %s.", object_type.Get_Name(), killer.Get_Name()) - - -- Update frags - frag_entry = stat_table[frag_index] - if frag_entry == nil then frag_entry = {} end - - entry = frag_entry[killer_id] - if entry == nil then entry = {} end - - pe = entry[object_type] - if pe == nil then - pe = {kills = 1, combat_power = combat_power, build_cost = build_cost, score_value = score_value} - else - pe.kills = pe.kills + 1 - pe.combat_power = pe.combat_power + combat_power - pe.build_cost = pe.build_cost + build_cost - pe.score_value = pe.score_value + score_value - end - - entry[object_type] = pe - frag_entry[killer_id] = entry - stat_table[frag_index] = frag_entry - - -- Update deaths - death_entry = stat_table[death_index] - if death_entry == nil then death_entry = {} end - - entry = death_entry[owner_id] - if entry == nil then entry = {} end - - pe = entry[object_type] - if pe == nil then - pe = {kills = 1, combat_power = combat_power, build_cost = build_cost, score_value = score_value} - else - pe.kills = pe.kills + 1 - pe.combat_power = pe.combat_power + combat_power - pe.build_cost = pe.build_cost + build_cost - pe.score_value = pe.score_value + score_value - end - - entry[object_type] = pe - death_entry[owner_id] = entry - stat_table[death_index] = death_entry - -end - - ---------------------------------------- -- -- E V E N T H A N D L E R S @@ -442,7 +547,7 @@ end -- -- @param mode_name name of the new mode (ie: Galactic, Land, Space) -- @since 3/15/2005 3:58:59 PM -- BMH --- +-- function Game_Mode_Starting_Event(mode_name, map_name) GameScoringMessage("GameScoring -- Mode %s (%s) now starting.", mode_name, map_name) LastModeName = mode_name @@ -450,91 +555,99 @@ function Game_Mode_Starting_Event(mode_name, map_name) if StringCompare(mode_name, "Galactic") then -- Galactic Campaign - CampaignGame = true + IsCampaignGame = true Reset_Stats() + Reset_Game_Time(false) GameStartTime = GetCurrentTime.Frame() - elseif CampaignGame == false then + elseif IsCampaignGame == false then -- Skirmish tactical Reset_Stats() + Reset_Game_Time(true) GameStartTime = GetCurrentTime.Frame() - elseif CampaignGame == true then + IsSkirmishGame = true + IsTacticalGame = true + Load_Teams() + Load_Local_Spectator() + elseif IsCampaignGame == true then -- Galactic transition to Tactical. Reset_Tactical_Stats() + Reset_Game_Time(false) + IsTacticalGame = true end - LastWasCampaignGame = CampaignGame + LastWasCampaignGame = IsCampaignGame end - -- -- This event is triggered on a game mode end. -- -- @param mode_name name of the old mode (ie: Galactic, Land, Space) -- @since 3/15/2005 3:58:59 PM -- BMH --- +-- function Game_Mode_Ending_Event(mode_name) GameScoringMessage("GameScoring -- Mode %s now ending.", mode_name) - LastWasCampaignGame = CampaignGame - if StringCompare(mode_name, "Galactic") then - CampaignGame = false + if IsSkirmishGame then + Dump_Credits_To_Data_File(TacticalCreditsHistoryTable) end -end + LastWasCampaignGame = IsCampaignGame + if StringCompare(mode_name, "Galactic") then + IsCampaignGame = false + end + + Reset_Game_Time(false) + IsSpectator = false + IsSkirmishGame = false +end -- -- This event is triggered when a player quits the game. -- -- @param player the player that just quit -- @since 8/25/2005 10:00:54 AM -- BMH --- +-- function Player_Quit_Event(player) - Update_Player_Table(player) if player == nil then return end - + PlayerQuitTable[player.Get_ID()] = true end - -- -- This event is triggered when a unit is destroyed in a tactical game mode. -- -- @param object the object that was destroyed -- @param killer the player that killed this object -- @since 3/15/2005 4:10:19 PM -- BMH --- +-- function Tactical_Unit_Destroyed_Event(object, killer) Update_Kill_Stats_Table(TacticalKillStatsTable, object, killer) end - -- -- This event is triggered when a unit is destroyed in the galactic game mode. -- -- @param object the object that was destroyed -- @param killer the player that killed this object -- @since 3/15/2005 4:10:19 PM -- BMH --- +-- function Galactic_Unit_Destroyed_Event(object, killer) Update_Kill_Stats_Table(GalacticKillStatsTable, object, killer) Update_Kill_Stats_Table(TacticalTeamKillStatsTable, object, killer) end - -- -- This event is triggered when production has begun on an item at a given planet -- -- @param planet the planet that will produce this object -- @param object_type the object type scheduled for production -- @since 3/15/2005 4:10:19 PM -- BMH --- +-- function Galactic_Production_Begin_Event(planet, object_type) - ---Track credits spent + --Track credits spent end - -- -- This event is triggered when production has been prematurely canceled -- on an item at a given planet @@ -542,13 +655,11 @@ end -- @param planet the planet that was producing this object -- @param object_type the object type that got canceled -- @since 3/15/2005 4:10:19 PM -- BMH --- +-- function Galactic_Production_Canceled_Event(planet, object_type) - ---Track credits spent + --Track credits spent end - -- -- This event is triggered when production has finished in a tactical mode -- @@ -556,32 +667,31 @@ end -- @param player the player that built the object. -- @param location the location that built the object(could be nil) -- @since 8/22/2005 6:11:07 PM -- BMH --- +-- function Tactical_Production_End_Event(object_type, player, location) - Update_Build_Stats_Table(TacticalBuildStatsTable, location, object_type, player, object_type.Get_Tactical_Build_Cost()) + Update_Build_Stats_Table(TacticalBuildStatsTable, location, object_type, player, + object_type.Get_Tactical_Build_Cost()) end - -- -- This event is triggered when production has finished on an item at a given planet -- -- @param planet the planet that produced this object -- @param object the object that was just created -- @since 3/15/2005 4:10:19 PM -- BMH --- +-- function Galactic_Production_End_Event(planet, object) - if object.Get_Type == nil then - -- object must be a GameObjectTypeWrapper not a GameObjectWrapper if it doesn't + -- object must be a GameObjectTypeWrapper not a GameObjectWrapper if it doesn't -- have a Get_Type function. Update_Build_Stats_Table(GalacticBuildStatsTable, planet, object, planet.Get_Owner(), object.Get_Build_Cost()) else -- object points to the GameObjectWrapper that was just created. - Update_Build_Stats_Table(GalacticBuildStatsTable, planet, object.Get_Game_Scoring_Type(), planet.Get_Owner(), object.Get_Game_Scoring_Type().Get_Build_Cost()) + Update_Build_Stats_Table(GalacticBuildStatsTable, planet, object.Get_Game_Scoring_Type(), planet.Get_Owner(), + object.Get_Game_Scoring_Type().Get_Build_Cost()) end end - function fake_get_owner() return fake_object_player end @@ -601,14 +711,14 @@ end -- @param old_type the old starbase type -- @param new_type the new starbase type -- @since 3/15/2005 4:10:19 PM -- BMH --- +-- function Galactic_Starbase_Level_Change(planet, old_type, new_type) + GameScoringMessage("GameScoring -- %s Starbase changed from %s to %s.", planet.Get_Type().Get_Name(), + tostring(old_type), tostring(new_type)) - GameScoringMessage("GameScoring -- %s Starbase changed from %s to %s.", planet.Get_Type().Get_Name(), tostring(old_type), tostring(new_type)) - if old_type == nil then return end if new_type ~= nil then return end - + fake_object_type = old_type fake_object_player = planet.Get_Owner() fake_object = {} @@ -619,7 +729,6 @@ function Galactic_Starbase_Level_Change(planet, old_type, new_type) Galactic_Unit_Destroyed_Event(fake_object, planet.Get_Final_Blow_Player()) end - -- -- This event is called when a planet changes faction in galactic mode -- @@ -627,41 +736,40 @@ end -- @param newplayer The new owner player of this planet. -- @param oldplayer The old owner player of this planet. -- @since 6/20/2005 8:37:53 PM -- BMH --- +-- function Galactic_Planet_Faction_Change(planet, newplayer, oldplayer) - -- Update the player table. Update_Player_Table(newplayer) Update_Player_Table(oldplayer) - + newid = newplayer.Get_ID() oldid = oldplayer.Get_ID() planet_type = planet.Get_Type() - GameScoringMessage("GameScoring -- %s changed control from %s to %s.", planet_type.Get_Name(), + GameScoringMessage("GameScoring -- %s changed control from %s to %s.", planet_type.Get_Name(), oldplayer.Get_Name(), newplayer.Get_Name()) - -- Update the sacked count for the new owner. + -- Update the sacked count for the new owner. entry = GalacticConquestTable[newid] if entry == nil then entry = {} end pe = entry[planet_type] - if pe == nil then - pe = {sacked_count = 1, lost_count = 0} + if pe == nil then + pe = { sacked_count = 1, lost_count = 0 } else pe.sacked_count = pe.sacked_count + 1 end - + entry[planet_type] = pe GalacticConquestTable[newid] = entry - - -- Update the lost count for the old owner. + + -- Update the lost count for the old owner. entry = GalacticConquestTable[oldid] if entry == nil then entry = {} end pe = entry[planet_type] - if pe == nil then - pe = {sacked_count = 0, lost_count = 1} + if pe == nil then + pe = { sacked_count = 0, lost_count = 1 } else pe.lost_count = pe.lost_count + 1 end @@ -672,16 +780,14 @@ function Galactic_Planet_Faction_Change(planet, newplayer, oldplayer) planet_type = nil end - -- -- This event is called when a hero is neutralized by another hero in galactic mode -- -- @param hero_type The hero that was just neutralized -- @param killer The hero that just neutralized the above hero. -- @since 3/21/2005 1:43:44 PM -- BMH --- +-- function Galactic_Neutralized_Event(hero_type, killer) - Update_Player_Table(killer.Get_Owner()) killer_id = killer.Get_Owner().Get_ID() @@ -690,30 +796,27 @@ function Galactic_Neutralized_Event(hero_type, killer) if entry == nil then entry = {} end pe = entry[hero_type] - if pe == nil then - pe = {neutralized = 1} + if pe == nil then + pe = { neutralized = 1 } else pe.neutralized = pe.neutralized + 1 end - + entry[hero_type] = pe GalacticNeutralizedTable[killer_id] = entry - end - -- -- This function returns the number of frags a given player has for a given object type. -- -- @param object_type the object type we want to know about. -- @param player the player who's frag count we want to query. -- @since 3/21/2005 1:23:21 PM -- BMH --- +-- function Get_Frag_Count_For_Type(object_type, player) - owner_id = player.Get_ID() - - frag_entry = GalacticKillStatsTable[frag_index] + + frag_entry = GalacticKillStatsTable[FragIndex] if frag_entry == nil then return 0 end entry = frag_entry[owner_id] @@ -721,20 +824,18 @@ function Get_Frag_Count_For_Type(object_type, player) pe = entry[object_type] if pe == nil then return 0 end - + return pe.kills end - -- -- This function returns the number of neutralizes a given player has for a given object type. -- -- @param object_type the object type we want to know about. -- @param player the player who's neutralize count we want to query. -- @since 3/21/2005 1:23:21 PM -- BMH --- +-- function Get_Neutralized_Count_For_Type(object_type, player) - owner_id = player.Get_ID() entry = GalacticNeutralizedTable[owner_id] @@ -742,43 +843,41 @@ function Get_Neutralized_Count_For_Type(object_type, player) pe = entry[object_type] if pe == nil then return 0 end - + return pe.neutralized end - function Get_Military_Efficiency(player, kill_stats, build_stats) - pid = player.Get_ID() kill_eff = 0; - kill_table = kill_stats[frag_index][pid] - + kill_table = kill_stats[FragIndex][pid] + tkills = 0 tpower = 0 tscore = 0 if kill_table then - for kk,vv in pairs(kill_table) do + for kk, vv in pairs(kill_table) do tkills = tkills + vv.kills tpower = tpower + vv.combat_power tscore = tscore + vv.score_value end end - - death_table = kill_stats[death_index][pid] - + + death_table = kill_stats[DeathIndex][pid] + tdeaths = 0 tdpower = 0 tdscore = 0 if death_table then - for kk,vv in pairs(death_table) do + for kk, vv in pairs(death_table) do tdeaths = tdeaths + vv.kills tdpower = tdpower + vv.combat_power tdscore = tdscore + vv.score_value end end - + -- build stats build_count = 0 cost_count = 0 @@ -805,8 +904,8 @@ function Get_Military_Efficiency(player, kill_stats, build_stats) end if build_count == 0 then - if tdeaths == 0 then - mill_eff = 0 + if tdeaths == 0 then + mill_eff = 0 else mill_eff = -1 end @@ -820,7 +919,6 @@ function Get_Military_Efficiency(player, kill_stats, build_stats) end function Get_Conquest_Efficiency(player) - pid = player.Get_ID() -- [playerid][planet_type][sacked_count, lost_count] @@ -832,7 +930,7 @@ function Get_Conquest_Efficiency(player) sacked = 0 lost = 0 - for planet_type,pe in pairs(entry) do + for planet_type, pe in pairs(entry) do sacked = sacked + pe.sacked_count lost = lost + pe.lost_count end @@ -887,77 +985,41 @@ function Calc_Score_For_Efficiency(eff_val) end function Define_Title_Faction_Table() - -- rebel at 2, empire at 3 - Title_Faction_Table = { - + Title_Faction_Table = { + { 145000, "TEXT_REBEL_TITLE19", "TEXT_EMPIRE_TITLE19" }, { 125000, "TEXT_REBEL_TITLE18", "TEXT_EMPIRE_TITLE18" }, - { 115000, "TEXT_REBEL_TITLE17", "TEXT_EMPIRE_TITLE17" }, - { 100000, "TEXT_REBEL_TITLE16", "TEXT_EMPIRE_TITLE16" }, - { 90000, "TEXT_REBEL_TITLE15", "TEXT_EMPIRE_TITLE15" }, - { 85000, "TEXT_REBEL_TITLE14", "TEXT_EMPIRE_TITLE14" }, - { 80000, "TEXT_REBEL_TITLE13", "TEXT_EMPIRE_TITLE13" }, - { 75000, "TEXT_REBEL_TITLE12", "TEXT_EMPIRE_TITLE12" }, - { 70000, "TEXT_REBEL_TITLE11", "TEXT_EMPIRE_TITLE11" }, - { 60000, "TEXT_REBEL_TITLE10", "TEXT_EMPIRE_TITLE10" }, - { 55000, "TEXT_REBEL_TITLE9", "TEXT_EMPIRE_TITLE9" }, - { 50000, "TEXT_REBEL_TITLE8", "TEXT_EMPIRE_TITLE8" }, - { 45000, "TEXT_REBEL_TITLE7", "TEXT_EMPIRE_TITLE7" }, - { 40000, "TEXT_REBEL_TITLE6", "TEXT_EMPIRE_TITLE6" }, - { 25000, "TEXT_REBEL_TITLE5", "TEXT_EMPIRE_TITLE5" }, - { 20000, "TEXT_REBEL_TITLE4", "TEXT_EMPIRE_TITLE4" }, - { 15000, "TEXT_REBEL_TITLE3", "TEXT_EMPIRE_TITLE3" }, - { 10000, "TEXT_REBEL_TITLE2", "TEXT_EMPIRE_TITLE2" }, - { 5000, "TEXT_REBEL_TITLE1", "TEXT_EMPIRE_TITLE1" }, - { 0, "TEXT_REBEL_TITLE0", "TEXT_EMPIRE_TITLE0" }, - + { 115000, "TEXT_REBEL_TITLE17", "TEXT_EMPIRE_TITLE17" }, + { 100000, "TEXT_REBEL_TITLE16", "TEXT_EMPIRE_TITLE16" }, + { 90000, "TEXT_REBEL_TITLE15", "TEXT_EMPIRE_TITLE15" }, + { 85000, "TEXT_REBEL_TITLE14", "TEXT_EMPIRE_TITLE14" }, + { 80000, "TEXT_REBEL_TITLE13", "TEXT_EMPIRE_TITLE13" }, + { 75000, "TEXT_REBEL_TITLE12", "TEXT_EMPIRE_TITLE12" }, + { 70000, "TEXT_REBEL_TITLE11", "TEXT_EMPIRE_TITLE11" }, + { 60000, "TEXT_REBEL_TITLE10", "TEXT_EMPIRE_TITLE10" }, + { 55000, "TEXT_REBEL_TITLE9", "TEXT_EMPIRE_TITLE9" }, + { 50000, "TEXT_REBEL_TITLE8", "TEXT_EMPIRE_TITLE8" }, + { 45000, "TEXT_REBEL_TITLE7", "TEXT_EMPIRE_TITLE7" }, + { 40000, "TEXT_REBEL_TITLE6", "TEXT_EMPIRE_TITLE6" }, + { 25000, "TEXT_REBEL_TITLE5", "TEXT_EMPIRE_TITLE5" }, + { 20000, "TEXT_REBEL_TITLE4", "TEXT_EMPIRE_TITLE4" }, + { 15000, "TEXT_REBEL_TITLE3", "TEXT_EMPIRE_TITLE3" }, + { 10000, "TEXT_REBEL_TITLE2", "TEXT_EMPIRE_TITLE2" }, + { 5000, "TEXT_REBEL_TITLE1", "TEXT_EMPIRE_TITLE1" }, + { 0, "TEXT_REBEL_TITLE0", "TEXT_EMPIRE_TITLE0" }, + } end -function Debug_Print_Score_Vals() - - for pid, player in pairs(PlayerTable) do - mill_eff, kill_eff = Get_Military_Efficiency(player, TacticalKillStatsTable, TacticalBuildStatsTable) - - score = Calc_Score_For_Efficiency(mill_eff) - score = score + Calc_Score_For_Efficiency(kill_eff) - - if PlayerQuitTable[pid] == true then - score = 0 - end - - GameScoringMessage("Tactical %s:%s, Mill_Eff:%f, Kill_Eff:%f, Score:%f", player.Get_Name(), - player.Get_Faction_Name(), mill_eff, kill_eff, score) - end - - for pid, player in pairs(PlayerTable) do - mill_eff, kill_eff = Get_Military_Efficiency(player, GalacticKillStatsTable, GalacticBuildStatsTable) - conq_eff = Get_Conquest_Efficiency(player) - - score = Calc_Score_For_Efficiency(mill_eff) - score = score + Calc_Score_For_Efficiency(kill_eff) - score = score + Calc_Score_For_Efficiency(Get_Conquest_Efficiency(player)) - - if PlayerQuitTable[pid] == true then - score = 0 - end - - GameScoringMessage("Galactic %s:%s, Mill_Eff:%f, Kill_Eff:%f, Conq_eff:%f, Score:%f", player.Get_Name(), - player.Get_Faction_Name(), mill_eff, kill_eff, conq_eff, score) - end - -end - -- -- This function returns the a game stat for the given control id. -- -- @param control_id the control id -- @return the game stat -- @since 6/18/2005 4:13:13 PM -- BMH --- +-- function Get_Game_Stat_For_Control_ID(player, control_id, for_tactical) - if for_tactical then mill_eff, kill_eff = Get_Military_Efficiency(player, TacticalKillStatsTable, TacticalBuildStatsTable) else @@ -984,8 +1046,8 @@ function Get_Game_Stat_For_Control_ID(player, control_id, for_tactical) if PlayerQuitTable[player.Get_ID()] == true then score = 0 end - - for ival,pe in ipairs(Title_Faction_Table) do + + for ival, pe in ipairs(Title_Faction_Table) do last = pe[tid] if score > pe[1] then break @@ -995,14 +1057,13 @@ function Get_Game_Stat_For_Control_ID(player, control_id, for_tactical) else MessageBox("Unknown control id %s:%s for Get_Game_Stat_For_Control_ID", type(control_id), tostring(control_id)); end - end -- -- This function updates the table of GameSpy game stats. -- -- @since 3/29/2005 5:14:42 PM -- BMH --- +-- function Update_GameSpy_Game_Stats() GameSpy_Game_Stats = {} @@ -1022,7 +1083,6 @@ function Update_GameSpy_Game_Stats() end GameSpy_Game_Stats.gametime = tonumber(string.format("%d", GetCurrentTime.Frame() - GameStartTime)) - end -- @@ -1031,33 +1091,33 @@ end -- @param stat_table the stat table we should pull stats from -- @param player the player who's stats we need to update. -- @since 3/29/2005 5:14:42 PM -- BMH --- +-- function Update_GameSpy_Kill_Stats(stat_table, build_stats, player) GameSpy_Player_Stats = {} frag_table = {} pid = player.Get_ID() mill_eff, kill_eff = Get_Military_Efficiency(player, stat_table, build_stats) - + score = Calc_Score_For_Efficiency(mill_eff) conq_eff = 0 - + if LastWasCampaignGame then - conq_eff = Get_Conquest_Efficiency(player) + conq_eff = Get_Conquest_Efficiency(player) score = score + Calc_Score_For_Efficiency(conq_eff) end score = score + Calc_Score_For_Efficiency(kill_eff) - + if PlayerQuitTable[pid] == true then score = -1 end - + tid = 3 if player.Get_Faction_Name() == "REBEL" then tid = 2 end - for ival,pe in ipairs(Title_Faction_Table) do + for ival, pe in ipairs(Title_Faction_Table) do last = pe[tid] if score > pe[1] then break @@ -1070,7 +1130,7 @@ function Update_GameSpy_Kill_Stats(stat_table, build_stats, player) end if score == -1 then score = 0 end - + GameSpy_Player_Stats.score = score GameSpy_Player_Stats.mill_eff = Clamp(mill_eff * 100, 0, 100) GameSpy_Player_Stats.kill_eff = Clamp(kill_eff * 100, 0, 100) @@ -1080,10 +1140,11 @@ function Update_GameSpy_Kill_Stats(stat_table, build_stats, player) GameSpy_Player_Stats.faction = player.Get_Faction_Name() GameSpy_Player_Stats.clan_id = player.Get_Clan_ID() GameSpy_Player_Stats.team_index = player.Get_Team() - - GameScoringMessage("%s GameSpy Stats, Score:%d, Mill_Eff:%d, Kill_Eff:%d, Conq_Eff:%d, Title:%s", - PlayerTable[pid].Get_Name(), GameSpy_Player_Stats.score, GameSpy_Player_Stats.mill_eff, GameSpy_Player_Stats.kill_eff, - GameSpy_Player_Stats.conq_eff, GameSpy_Player_Stats.title) + + GameScoringMessage("%s GameSpy Stats, Score:%d, Mill_Eff:%d, Kill_Eff:%d, Conq_Eff:%d, Title:%s", + PlayerTable[pid].Get_Name(), GameSpy_Player_Stats.score, GameSpy_Player_Stats.mill_eff, + GameSpy_Player_Stats.kill_eff, + GameSpy_Player_Stats.conq_eff, GameSpy_Player_Stats.title) end -- @@ -1091,7 +1152,7 @@ end -- -- @param player the player who's stats we need to update. -- @since 3/29/2005 5:14:42 PM -- BMH --- +-- function Update_GameSpy_Player_Stats(player) Update_Player_Table(player) @@ -1102,10 +1163,266 @@ function Update_GameSpy_Player_Stats(player) GameScoringMessage("GameSpy dumping TacticalKillStatsTable") Update_GameSpy_Kill_Stats(TacticalKillStatsTable, TacticalBuildStatsTable, player) end - end function Get_Current_Winner_By_Score() return WinnerID end +---------------------------------------- +-- +-- ADDITIONAL GUI INFO +-- +---------------------------------------- + +-- ========================= +-- Tactical Setup +-- ========================= + +function Load_Teams() + local team_00_markers = Find_All_Objects_Of_Type("Team_00_Spawn_Point_Marker") + local team_01_markers = Find_All_Objects_Of_Type("Team_01_Spawn_Point_Marker") + local team_02_markers = Find_All_Objects_Of_Type("Team_02_Spawn_Point_Marker") + local team_03_markers = Find_All_Objects_Of_Type("Team_03_Spawn_Point_Marker") + + Load_Team_Players(team_00_markers) + Load_Team_Players(team_01_markers) + Load_Team_Players(team_02_markers) + Load_Team_Players(team_03_markers) +end + +function Load_Team_Players(markers) + for k, marker in pairs(markers) do + local player = marker.Get_Owner() + local team_id = player.Get_Team() + local team = TacticalTeamTable[team_id] + + if team == nil then + local faction = player.Get_Faction_Name() + + team = { + faction = faction, + color = Get_Faction_RGB(faction), + tech = player.Get_Tech_Level(), + isSpectator = Is_Spectator(faction), + players = {} + } + TacticalTeamTable[team_id] = team + end + + local player_id = player.Get_ID() + local team_player = team.players[player_id] + + if team_player == nil then + team_player = { + name = player.Get_Name(), + isHuman = player.Is_Human() + } + team.players[player_id] = team_player + end + + if team_player.isHuman then + DebugMessage("GameScoring -- Human Player %s is on Team %d %s", team_player.name, team_id, team.faction) + else + DebugMessage("GameScoring -- AI Player %s is on Team %d %s", team_player.name, team_id, team.faction) + end + + Update_Player_Table(player) + end +end + +function Get_Faction_RGB(faction) + if faction == "Rebel" then + return { + r = 1, + g = 0, + b = 0 + } + elseif faction == "Empire" then + return { + r = 0, + g = 1, + b = 1 + } + elseif faction == "Underworld" then + return { + r = 1, + g = 1, + b = 0 + } + elseif faction == "Hutts" then + return { + r = 1, + g = 0, + b = 1 + } + elseif faction == "Pirates" then + return { + r = 0, + g = 1, + b = 0 + } + else + return { + r = 1, + g = 1, + b = 1 + } + end +end + +function Is_Spectator(faction) + local spectator_marker = Find_First_Object("Spectator_Reveal_Marker") + + if spectator_marker == nil then + return false + end + + local spectator_faction = spectator_marker.Get_Owner().Get_Faction_Name() + + return spectator_faction == faction +end + +function Load_Local_Spectator() + local local_player = Find_Player("local") + + if local_player ~= nil then + IsSpectator = Is_Spectator(local_player.Get_Faction_Name()) + end +end + +function Reset_Game_Time(is_visible) + GUI_Component_Visibility(UI_GameTime, is_visible) +end + +-- ========================= +-- Tactical Functions +-- ========================= + +function Update_Team_Credits(game_time) + local time_entry = TacticalCreditsHistoryTable[game_time] + + if time_entry == nil then + time_entry = {} + end + + -- Build Time History for each team + for team_id, team in pairs(TacticalTeamTable) do + if not team.isSpectator then + local team_entry = time_entry[team_id] + + if team_entry == nil then + team_entry = { + totalCredits = 0, + totalIncome = 0, + players = {} + } + + for player_id, player in pairs(team.players) do + local player_wrapper = PlayerTable[player_id] + + if player_wrapper ~= nil then + local credits = player_wrapper.Get_Credits() + local last_player_entry = Get_Credit_History_Player(game_time - 1, team_id, player_id) + local income = 0 + + if last_player_entry ~= nil then + income = credits - last_player_entry.credits + end + + local player_entry = { + credits = Dirty_Floor(credits), + income = Dirty_Floor(income) + } + + team_entry.totalCredits = team_entry.totalCredits + player_entry.credits + team_entry.totalIncome = team_entry.totalIncome + player_entry.income + team_entry.players[player_id] = player_entry + end + end + + time_entry[team_id] = team_entry + end + end + end + + TacticalCreditsHistoryTable[game_time] = time_entry +end + +function Get_Credit_History_Team(game_time, team_id) + local time_entry = TacticalCreditsHistoryTable[game_time] + + if time_entry == nil then + return nil + end + + return time_entry[team_id] +end + +function Get_Credit_History_Player(game_time, team_id, player_id) + local team_entry = Get_Credit_History_Team(game_time, team_id) + + if team_entry == nil then + return nil + end + + return team_entry.players[player_id] +end + +function Update_GUI_Game_Time(game_time) + local mins = Dirty_Floor(game_time / 60) + local mins_text = tostring(mins) + + if tonumber(mins) < 10 then + mins_text = "0" .. mins_text + end + + local secs = game_time - (mins * 60) + local secs_text = tostring(secs) + + if tonumber(secs) < 10 then + secs_text = "0" .. secs_text + end + + local time_text = "Game Time: " .. mins_text .. ":" .. secs_text + + GUI_Component_Text(UI_GameTime, time_text) +end + +function Update_GUI_Team_Credits(game_time, team_id) + if not IsSpectator then + return + end + + local team = TacticalTeamTable[team_id] + + if team == nil then + return + end + + local team_entry = Get_Credit_History_Team(game_time, team_id) + + if team_entry == nil then + return + end + + local ui_component = "" + + if team_id == 0 then + ui_component = UI_CreditsT1 + elseif team_id == 1 then + ui_component = UI_CreditsT2 + end + + local positive_text = "+" + + if team.totalIncome < 0 then + positive_text = "" + end + + local text = team.faction .. + ": $ " .. tostring(team_entry.totalCredits) .. " (" .. positive_text .. tostring(team_entry.totalIncome) .. ")" + + GUI_Component_Text(ui_component, text) + GUI_Text_Color(ui_component, team.color.r, team.color.g, team.color.b, 1) +end