forked from 0ad/0ad
343 lines
10 KiB
JavaScript
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;
|
||
|
}
|
||
|
}
|
||
|
}
|