0ad/binaries/data/mods/public/gui/summary/counters.js

343 lines
10 KiB
JavaScript

// FUNCTIONS FOR CALCULATING SCORES
var teamMiscHelperData = [];
function resetDataHelpers()
{
teamMiscHelperData = [];
}
function updateCountersPlayer(playerState, counters, idGUI)
{
for (var w in counters)
{
var fn = counters[w].fn;
Engine.GetGUIObjectByName(idGUI + "[" + w + "]").caption = fn && fn(playerState, w);
}
}
function calculateEconomyScore(playerState, position)
{
let total = 0;
for each (var res in playerState.statistics.resourcesGathered)
total += res;
return Math.round(total / 10);
}
function calculateMilitaryScore(playerState, position)
{
return Math.round((playerState.statistics.enemyUnitsKilledValue +
playerState.statistics.enemyBuildingsDestroyedValue) / 10);
}
function calculateExplorationScore(playerState, position)
{
return playerState.statistics.percentMapExplored * 10;
}
function calculateScoreTotal(playerState, position)
{
return calculateEconomyScore(playerState) +
calculateMilitaryScore(playerState) +
calculateExplorationScore(playerState);
}
function calculateScoreTeam(counters)
{
for (var t in g_Teams)
{
if (t == -1)
continue;
for (var w in counters)
{
var total = 0;
for (var p = 0; p < g_Teams[t]; ++p)
total += (+Engine.GetGUIObjectByName("valueDataTeam[" + t + "][" + p + "][" + w + "]").caption);
Engine.GetGUIObjectByName("valueDataTeam[" + t + "][" + w + "]").caption = total;
}
}
}
function calculateBuildings(playerState, position)
{
var type = BUILDINGS_TYPES[position];
return TRAINED_COLOR + playerState.statistics.buildingsConstructed[type] + '[/color] / ' +
LOST_COLOR + playerState.statistics.buildingsLost[type] + '[/color] / ' +
KILLED_COLOR + playerState.statistics.enemyBuildingsDestroyed[type] + '[/color]';
}
function calculateColorsTeam(counters)
{
for (var t in g_Teams)
{
if (t == -1)
continue;
for (var w in counters)
{
var total = {
c : 0,
l : 0,
d : 0
};
for (var p = 0; p < g_Teams[t]; ++p)
{
var caption = Engine.GetGUIObjectByName("valueDataTeam[" + t + "][" + p + "][" + w + "]").caption;
// clean [Color=""], [/Color] and white space for make the sum more easy
caption = caption.replace(/\[([\w\' \\\"\/\=]*)\]|\s/g, "");
var splitCaption = caption.split("/");
total.c += (+splitCaption[0]);
total.l += (+splitCaption[1]);
total.d += (+splitCaption[2]);
}
var teamTotal = TRAINED_COLOR + total.c + '[/color] / ' +
LOST_COLOR + total.l + '[/color] / ' + KILLED_COLOR + total.d + '[/color]';
Engine.GetGUIObjectByName("valueDataTeam[" + t + "][" + w + "]").caption = teamTotal;
}
}
}
function calculateUnits(playerState, position)
{
var type = UNITS_TYPES[position];
return TRAINED_COLOR + playerState.statistics.unitsTrained[type] + '[/color] / ' +
LOST_COLOR + playerState.statistics.unitsLost[type] + '[/color] / ' +
KILLED_COLOR + playerState.statistics.enemyUnitsKilled[type] + '[/color]';
}
function calculateResources(playerState, position)
{
var type = RESOURCES_TYPES[position];
return INCOME_COLOR + playerState.statistics.resourcesGathered[type] + '[/color] / ' +
OUTCOME_COLOR + (playerState.statistics.resourcesUsed[type] - playerState.statistics.resourcesSold[type]) + '[/color]';
}
function calculateTotalResources(playerState, position)
{
var totalGathered = 0;
var totalUsed = 0;
for each (var type in RESOURCES_TYPES)
{
totalGathered += playerState.statistics.resourcesGathered[type];
totalUsed += playerState.statistics.resourcesUsed[type] - playerState.statistics.resourcesSold[type];
}
return INCOME_COLOR + totalGathered + '[/color] / ' + OUTCOME_COLOR + totalUsed + '[/color]';
}
function calculateTreasureCollected(playerState, position)
{
return playerState.statistics.treasuresCollected;
}
function calculateTributeSent(playerState, position)
{
return INCOME_COLOR + playerState.statistics.tributesSent + "[/color] / " + OUTCOME_COLOR + playerState.statistics.tributesReceived + "[/color]";
}
function calculateResourcesTeam(counters)
{
for (var t in g_Teams)
{
if (t == -1)
continue;
for (var w in counters)
{
var teamTotal = "undefined";
var total = {
i : 0,
o : 0
};
for (var p = 0; p < g_Teams[t]; ++p)
{
var caption = Engine.GetGUIObjectByName("valueDataTeam[" + t + "][" + p + "][" + w + "]").caption;
// clean [Color=""], [/Color] and white space for make the sum more easy
caption = caption.replace(/\[([\w\' \\\"\/\=]*)\]|\s/g, "");
if (w == 5)
total.i += (+caption);
else
{
var splitCaption = caption.split("/");
total.i += (+splitCaption[0]);
total.o += (+splitCaption[1]);
}
}
if (w == 5)
teamTotal = total.i;
else
teamTotal = INCOME_COLOR + total.i + "[/color] / " + OUTCOME_COLOR + total.o + "[/color]";
Engine.GetGUIObjectByName("valueDataTeam[" + t + "][" + w + "]").caption = teamTotal;
}
}
}
function calculateResourceExchanged(playerState, position)
{
var type = RESOURCES_TYPES[position];
return INCOME_COLOR + '+' + playerState.statistics.resourcesBought[type] + '[/color] ' +
OUTCOME_COLOR + '-' + playerState.statistics.resourcesSold[type] + '[/color]';
}
function calculateBatteryEfficiency(playerState, position)
{
var totalBought = 0;
for each (var boughtAmount in playerState.statistics.resourcesBought)
totalBought += boughtAmount;
var totalSold = 0;
for each (var soldAmount in playerState.statistics.resourcesSold)
totalSold += soldAmount;
return Math.floor(totalSold > 0 ? (totalBought / totalSold) * 100 : 0) + "%";
}
function calculateTradeIncome(playerState, position)
{
return playerState.statistics.tradeIncome;
}
function calculateMarketTeam(counters)
{
for (var t in g_Teams)
{
if (t == -1)
continue;
for (var w in counters)
{
var teamTotal = "undefined";
var total = {
i : 0,
o : 0
};
for (var p = 0; p < g_Teams[t]; ++p)
{
var caption = Engine.GetGUIObjectByName("valueDataTeam[" + t + "][" + p + "][" + w + "]").caption;
// clean [Color=""], [/Color], white space, + and % for make the sum more easy
caption = caption.replace(/\[([\w\' \\\"\/\=]*)\]|\s|\+|\%/g, "");
if (w >= 4)
total.i += (+caption);
else
{
var splitCaption = caption.split("-");
total.i += (+splitCaption[0]);
total.o += (+splitCaption[1]);
}
}
if (w >= 4)
teamTotal = total.i +(w == 4 ? "%" : "");
else
teamTotal = INCOME_COLOR + '+' + total.i + '[/color] ' + OUTCOME_COLOR + '-' + total.o + '[/color]';
Engine.GetGUIObjectByName("valueDataTeam[" + t + "][" + w + "]").caption = teamTotal;
}
}
}
function calculateVegetarianRatio(playerState, position)
{
if (!teamMiscHelperData[playerState.team])
teamMiscHelperData[playerState.team] = [];
if (!teamMiscHelperData[playerState.team][position])
teamMiscHelperData[playerState.team][position] = {"food": 0, "vegetarianFood": 0};
if (playerState.statistics.resourcesGathered.vegetarianFood && playerState.statistics.resourcesGathered.food)
{
teamMiscHelperData[playerState.team][position].food += playerState.statistics.resourcesGathered.food;
teamMiscHelperData[playerState.team][position].vegetarianFood += playerState.statistics.resourcesGathered.vegetarianFood;
return Math.floor((playerState.statistics.resourcesGathered.vegetarianFood / playerState.statistics.resourcesGathered.food) * 100) + "%";
}
else
return 0 + "%";
}
function calculateFeminisation(playerState, position)
{
if (!teamMiscHelperData[playerState.team])
teamMiscHelperData[playerState.team] = [];
if (!teamMiscHelperData[playerState.team][position])
teamMiscHelperData[playerState.team][position] = {"Female": 0, "Worker": 0};
if (playerState.statistics.unitsTrained.Worker && playerState.statistics.unitsTrained.Female)
{
teamMiscHelperData[playerState.team][position].Female = playerState.statistics.unitsTrained.Female;
teamMiscHelperData[playerState.team][position].Worker = playerState.statistics.unitsTrained.Worker;
return Math.floor((playerState.statistics.unitsTrained.Female / playerState.statistics.unitsTrained.Worker) * 100) + "%";
}
else
return 0 + "%";
}
function calculateKillDeathRatio(playerState, position)
{
if (!teamMiscHelperData[playerState.team])
teamMiscHelperData[playerState.team] = [];
if (!teamMiscHelperData[playerState.team][position])
teamMiscHelperData[playerState.team][position] = {"enemyUnitsKilled": 0, "unitsLost": 0};
teamMiscHelperData[playerState.team][position].enemyUnitsKilled = playerState.statistics.enemyUnitsKilled.total;
teamMiscHelperData[playerState.team][position].unitsLost = playerState.statistics.unitsLost.total;
if (!playerState.statistics.enemyUnitsKilled.total)
return DEFAULT_DECIMAL;
if (!playerState.statistics.unitsLost.total) // and enemyUnitsKilled.total > 0
return INFINITE_SYMBOL; // infinity symbol
return Math.round((playerState.statistics.enemyUnitsKilled.total / playerState.statistics.unitsLost.total)*100)/100;
}
function calculateMapExploration(playerState, position)
{
if (!teamMiscHelperData[playerState.team])
teamMiscHelperData[playerState.team] = [];
teamMiscHelperData[playerState.team][position] = playerState.statistics.teamPercentMapExplored;
return playerState.statistics.percentMapExplored + "%";
}
function calculateMiscellaneous(counters)
{
for (var t in g_Teams)
{
if (t == -1)
continue;
for (var w in counters)
{
var teamTotal = "undefined";
if (w == 0)
teamTotal = (teamMiscHelperData[t][w].food == 0 ? "0" : Math.floor((teamMiscHelperData[t][w].vegetarianFood / teamMiscHelperData[t][w].food) * 100)) + "%";
else if (w == 1)
teamTotal = (teamMiscHelperData[t][w].Worker == 0 ? "0" : Math.floor((teamMiscHelperData[t][w].Female / teamMiscHelperData[t][w].Worker) * 100)) + "%";
else if (w == 2)
{
if (!teamMiscHelperData[t][w].enemyUnitsKilled)
teamTotal = DEFAULT_DECIMAL;
else if (!teamMiscHelperData[t][w].unitsLost) // and enemyUnitsKilled.total > 0
teamTotal = INFINITE_SYMBOL; // infinity symbol
else
teamTotal = Math.round((teamMiscHelperData[t][w].enemyUnitsKilled / teamMiscHelperData[t][w].unitsLost)*100)/100;
}
else if (w == 3)
teamTotal = teamMiscHelperData[t][w] + "%";
Engine.GetGUIObjectByName("valueDataTeam[" + t + "][" + w + "]").caption = teamTotal;
}
}
}