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

1112 lines
32 KiB
Lua

-- $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 = 10
frag_index = 1
death_index = 2
GameStartTime = 0
CampaignGame = 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()
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
--
-- 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] = {}}
-- [playerid][planetname][object_type][build_count, credits_spent, combat_power]
TacticalBuildStatsTable = {}
-- 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] = {}}
-- [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 = {}
PlayerTable = {}
PlayerQuitTable = {}
end
function ResetTacticalRegistry()
DebugMessage("Resetting Allow_AI_Controlled_Fog_Reveal to 1 (allowed)")
GlobalValue.Set("Allow_AI_Controlled_Fog_Reveal", 1)
end
--
-- 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
--
-- 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[frag_index]) 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[death_index]) 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
--
-- Script service function. Just prints out the current stats.
--
-- @since 3/15/2005 3:56:43 PM -- BMH
--
function GameService()
GameScoringMessage("GameScoring -- Tactical Stats dump.")
Print_Stat_Table(TacticalKillStatsTable)
GameScoringMessage("GameScoring -- Galactic Stats dump.")
Print_Stat_Table(GalacticKillStatsTable)
Print_Build_Stats_Table(GalacticBuildStatsTable)
Print_Build_Stats_Table(TacticalBuildStatsTable)
Debug_Print_Score_Vals()
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
--
----------------------------------------
--
-- 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
CampaignGame = true
Reset_Stats()
GameStartTime = GetCurrentTime.Frame()
elseif CampaignGame == false then
-- Skirmish tactical
Reset_Stats()
GameStartTime = GetCurrentTime.Frame()
elseif CampaignGame == true then
-- Galactic transition to Tactical.
Reset_Tactical_Stats()
end
LastWasCampaignGame = CampaignGame
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
end
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[frag_index]
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[frag_index][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[death_index][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
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
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