-- $Id: //depot/Projects/StarWars_Steam/FOC/Run/Data/Scripts/Miscellaneous/GameScoring.lua#1 $ --///////////////////////////////////////////////////////////////////////////////////////////////// -- -- (C) Petroglyph Games, Inc. -- -- -- ***** ** * * -- * ** * * * -- * * * * * -- * * * * * * * * -- * * *** ****** * ** **** *** * * * ***** * *** -- * ** * * * ** * ** ** * * * * ** ** ** * -- *** ***** * * * * * * * * ** * * * * -- * * * * * * * * * * * * * * * -- * * * * * * * * * * ** * * * * -- * ** * * ** * ** * * ** * * * * -- ** **** ** * **** ***** * ** *** * * -- * * * -- * * * -- * * * -- * * * * -- **** * * -- --///////////////////////////////////////////////////////////////////////////////////////////////// -- C O N F I D E N T I A L S O U R C E C O D E -- D O N O T D I S T R I B U T E --///////////////////////////////////////////////////////////////////////////////////////////////// -- -- $File: //depot/Projects/StarWars_Steam/FOC/Run/Data/Scripts/Miscellaneous/GameScoring.lua $ -- -- Original Author: Brian Hayes -- -- $Author: Brian_Hayes $ -- -- $Change: 637819 $ -- -- $DateTime: 2017/03/22 10:16:16 $ -- -- $Revision: #1 $ -- --///////////////////////////////////////////////////////////////////////////////////////////////// require("pgcommands") -- Don't pool... 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 = 1 DebugRate = 10 DebugCounter = 0 FragIndex = 1 DeathIndex = 2 GameStartTime = 0 IsCampaignGame = false IsTacticalGame = false IsSkirmishGame = false IsSpectator = false Reset_Stats() if Definitions then Definitions() end 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 = { [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 = { [FragIndex] = {}, [DeathIndex] = {} } -- [playerid][planetname][object_type][build_count, credits_spent, combat_power] GalacticBuildStatsTable = {} -- [playerid][object_type][neutralized_count] GalacticNeutralizedTable = {} -- [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 -- -- @param stat_table stat table to update -- @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 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) 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 } 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 power_count = 0 score_count = 0 GameScoringMessage("\tPlayer %s:", PlayerTable[owner_id].Get_Name()) for planet_type, planet_entry in pairs(player_entry) do if planet_type == 1 then GameScoringMessage("\t\t%20s:", "Tactical") else 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) 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 -- -- 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[FragIndex]) do tkills = 0 tpower = 0 tscore = 0 GameScoringMessage("\tPlayer %s:", PlayerTable[k].Get_Name()) 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 } end death_table = {} GameScoringMessage("Deaths:") 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 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 } end for k, player in pairs(PlayerTable) do ft = frag_table[k] dt = death_table[k] if ft == nil or ft.combat_power == 0 then GameScoringMessage("\tPlayer %s, Weighted Kill Ratio: 0.0", player.Get_Name()) 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) 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) 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 end 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 ---------------------------------------- -- -- E V E N T H A N D L E R S -- ---------------------------------------- -- -- This event is triggered on a game mode start. -- -- @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 LastMapName = map_name if StringCompare(mode_name, "Galactic") then -- Galactic Campaign IsCampaignGame = true Reset_Stats() Reset_Game_Time(false) GameStartTime = GetCurrentTime.Frame() elseif IsCampaignGame == false then -- Skirmish tactical Reset_Stats() Reset_Game_Time(true) GameStartTime = GetCurrentTime.Frame() 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 = 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) if IsSkirmishGame then Dump_Credits_To_Data_File(TacticalCreditsHistoryTable) 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 end -- -- This event is triggered when production has been prematurely canceled -- on an item at a given planet -- -- @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 end -- -- This event is triggered when production has finished in a tactical mode -- -- @param object_type the object type that was just built -- @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()) 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 -- 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()) end end function fake_get_owner() return fake_object_player end function fake_get_type() return fake_object_type end function fake_is_valid() return true end -- -- This event is triggered when the level of a starbase changes -- -- @param planet the planet where the starbase is located -- @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)) 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 = {} fake_object.Get_Owner = fake_get_owner fake_object.Get_Type = fake_get_type fake_object.Get_Game_Scoring_Type = fake_get_type fake_object.Is_Valid = fake_is_valid Galactic_Unit_Destroyed_Event(fake_object, planet.Get_Final_Blow_Player()) end -- -- This event is called when a planet changes faction in galactic mode -- -- @param planet The planet object -- @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(), oldplayer.Get_Name(), newplayer.Get_Name()) -- 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 } else pe.sacked_count = pe.sacked_count + 1 end entry[planet_type] = pe GalacticConquestTable[newid] = entry -- 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 } else pe.lost_count = pe.lost_count + 1 end entry[planet_type] = pe GalacticConquestTable[oldid] = entry 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() entry = GalacticNeutralizedTable[killer_id] if entry == nil then entry = {} end pe = entry[hero_type] 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[FragIndex] if frag_entry == nil then return 0 end entry = frag_entry[owner_id] if entry == nil then return 0 end 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] if entry == nil then return 0 end 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[FragIndex][pid] tkills = 0 tpower = 0 tscore = 0 if kill_table then 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[DeathIndex][pid] tdeaths = 0 tdpower = 0 tdscore = 0 if death_table then 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 power_count = 0 score_count = 0 if build_stats[pid] then for planet_type, planet_entry in pairs(build_stats[pid]) do for object_type, type_entry in pairs(planet_entry) do 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 end if tpower == 0 then kill_eff = 0 elseif tdpower == 0 then kill_eff = tpower else kill_eff = tpower / tdpower end if build_count == 0 then if tdeaths == 0 then mill_eff = 0 else mill_eff = -1 end elseif tdeaths > build_count then mill_eff = -((tdeaths - build_count) / build_count) else mill_eff = (build_count - tdeaths) / build_count end return mill_eff, kill_eff end function Get_Conquest_Efficiency(player) pid = player.Get_ID() -- [playerid][planet_type][sacked_count, lost_count] entry = GalacticConquestTable[pid] if entry == nil then return 0 end sacked = 0 lost = 0 for planet_type, pe in pairs(entry) do sacked = sacked + pe.sacked_count lost = lost + pe.lost_count end if sacked == 0 then conq_eff = 0 elseif lost == 0 then conq_eff = sacked else conq_eff = sacked / lost end return conq_eff end function Calc_Score_For_Efficiency(eff_val) if eff_val > 1.0 then return 40000 elseif eff_val > 0.98 then return 30000 elseif eff_val > 0.94 then return 25000 elseif eff_val > 0.91 then return 20000 elseif eff_val > 0.88 then return 10000 elseif eff_val > 0.84 then return 9000 elseif eff_val > 0.80 then return 8000 elseif eff_val > 0.78 then return 4000 elseif eff_val > 0.74 then return 3000 elseif eff_val > 0.70 then return 2000 elseif eff_val > 0.60 then return 1000 elseif eff_val > 0.50 then return 500 elseif eff_val > 0.40 then return 400 elseif eff_val > 0.30 then return 300 elseif eff_val > 0.20 then return 200 elseif eff_val > 0.10 then return 100 else return 0 end end function Define_Title_Faction_Table() -- rebel at 2, empire at 3 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" }, } 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 mill_eff, kill_eff = Get_Military_Efficiency(player, GalacticKillStatsTable, GalacticBuildStatsTable) end if control_id == "IDC_MILITARY_EFFICIENCY_STATIC" then return mill_eff elseif control_id == "IDC_CONQUEST_EFFICIENCY_STATIC" then return Get_Conquest_Efficiency(player) elseif control_id == "IDC_KILL_EFFICIENCY_STATIC" then return kill_eff elseif control_id == "IDC_YOUR_LOSS_VAL_STATIC" or control_id == "IDC_ENEMY_LOSS_VAL_STATIC" then return Calc_Score_For_Efficiency(mill_eff) + Calc_Score_For_Efficiency(kill_eff) elseif control_id == "IDC_TITLE_STATIC" then 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)) tid = 3 if player.Get_Faction_Name() == "REBEL" then tid = 2 end if PlayerQuitTable[player.Get_ID()] == true then score = 0 end for ival, pe in ipairs(Title_Faction_Table) do last = pe[tid] if score > pe[1] then break end end return last 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 = {} WinnerScore = -1 WinnerID = -1 if LastWasCampaignGame == true then GameSpy_Game_Stats.gametype = "Campaign" GameSpy_Game_Stats.battlemode = "Galactic" else GameSpy_Game_Stats.gametype = "Skirmish" GameSpy_Game_Stats.battlemode = LastModeName end if LastMapName then GameSpy_Game_Stats.mapname = LastMapName end GameSpy_Game_Stats.gametime = tonumber(string.format("%d", GetCurrentTime.Frame() - GameStartTime)) end -- -- This function updates the table of GameSpy player kill stats. -- -- @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) 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 last = pe[tid] if score > pe[1] then break end end if score > WinnerScore then WinnerScore = score WinnerID = pid 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) GameSpy_Player_Stats.conq_eff = Clamp(conq_eff * 100, 0, 100) GameSpy_Player_Stats.title = last; GameSpy_Player_Stats.kpower = score; 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) end -- -- This function updates the table of GameSpy player stats. -- -- @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) if LastWasCampaignGame == true then GameScoringMessage("GameSpy dumping GalacticKillStatsTable") Update_GameSpy_Kill_Stats(GalacticKillStatsTable, GalacticBuildStatsTable, player) else 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