forked from 0ad/0ad
historic_bruno
b1c4e29ac8
NOTE: requires update-workspaces and may require correction of some modded actors/scenarios This was SVN commit r16438.
203 lines
6.6 KiB
JavaScript
203 lines
6.6 KiB
JavaScript
// Max player slots for any map (TODO: should read from config)
|
|
const MAX_SLOTS = 8;
|
|
const MAX_TEAMS = 4;
|
|
const MAX_HEADINGTITLE = 8;
|
|
|
|
// const for filtering long collective headings
|
|
const LONG_HEADING_WIDTH = 250;
|
|
// vertical size of player box
|
|
const PLAYER_BOX_Y_SIZE = 30;
|
|
// gap between players boxes
|
|
const PLAYER_BOX_GAP = 2;
|
|
// alpha for player box
|
|
const PLAYER_BOX_ALPHA = " 32";
|
|
// alpha for player color box
|
|
const PLAYER_COLOR_BOX_ALPHA = " 255";
|
|
// yStart value for spacing teams boxes (and noTeamsBox)
|
|
const TEAMS_BOX_Y_START = 65;
|
|
// colors used for units and buildings
|
|
const TRAINED_COLOR = '[color="201 255 200"]';
|
|
const LOST_COLOR = '[color="255 213 213"]';
|
|
const KILLED_COLOR = '[color="196 198 255"]';
|
|
|
|
const BUILDINGS_TYPES = [ "total", "House", "Economic", "Outpost", "Military", "Fortress", "CivCentre", "Wonder" ];
|
|
const UNITS_TYPES = [ "total", "Infantry", "Worker", "Cavalry", "Champion", "Hero", "Ship" ];
|
|
const RESOURCES_TYPES = [ "food", "wood", "stone", "metal" ];
|
|
|
|
// colors used for gathered and traded resources
|
|
const INCOME_COLOR = '[color="201 255 200"]';
|
|
const OUTCOME_COLOR = '[color="255 213 213"]';
|
|
|
|
const DEFAULT_DECIMAL = "0.00";
|
|
const INFINITE_SYMBOL = "\u221E";
|
|
// Load data
|
|
var g_CivData = loadCivData();
|
|
var g_Teams = [ ];
|
|
// TODO set g_MaxPlayers as playerCounters.length
|
|
var g_MaxPlayers = 0;
|
|
// Count players without team (or all if teams are not displayed)
|
|
var g_WithoutTeam = 0;
|
|
var g_GameData;
|
|
|
|
/**
|
|
* Select active panel
|
|
* @param panelNumber Number of panel, which should get active state (integer)
|
|
*/
|
|
function selectPanel(panelNumber)
|
|
{
|
|
var panelNames = [ 'scorePanel', 'buildingsPanel', 'unitsPanel', 'resourcesPanel', 'marketPanel', 'miscPanel'];
|
|
|
|
function adjustTabDividers(tabSize)
|
|
{
|
|
var leftSpacer = Engine.GetGUIObjectByName("tabDividerLeft");
|
|
var rightSpacer = Engine.GetGUIObjectByName("tabDividerRight");
|
|
leftSpacer.size = "20 " + leftSpacer.size.top + " " + (tabSize.left + 2) + " " + leftSpacer.size.bottom;
|
|
rightSpacer.size = (tabSize.right - 2) + " " + rightSpacer.size.top + " 100%-20 " + rightSpacer.size.bottom;
|
|
}
|
|
|
|
for (var i = 0; i < panelNames.length; ++i)
|
|
{
|
|
Engine.GetGUIObjectByName(panelNames[i] + 'Button').sprite = "BackgroundTab";
|
|
}
|
|
|
|
Engine.GetGUIObjectByName(panelNames[panelNumber] + 'Button').sprite = "ForegroundTab";
|
|
adjustTabDividers(Engine.GetGUIObjectByName(panelNames[panelNumber] + 'Button').size);
|
|
|
|
updatePanelData(panelsData[panelNumber]);
|
|
}
|
|
|
|
function updatePanelData(panelInfo)
|
|
{
|
|
resetGeneralPanel();
|
|
resetDataHelpers();
|
|
updateGeneralPanelHeadings(panelInfo.headings);
|
|
updateGeneralPanelTitles(panelInfo.titleHeadings);
|
|
var rowPlayerObjectWidth = updateGeneralPanelCounter(panelInfo.counters);
|
|
updateGeneralPanelTeams();
|
|
|
|
var playerBoxesCounts = [ ];
|
|
for (var i = 0; i < g_MaxPlayers; ++i)
|
|
{
|
|
var playerState = g_GameData.playerStates[i+1];
|
|
|
|
if (!playerBoxesCounts[playerState.team+1])
|
|
playerBoxesCounts[playerState.team+1] = 1;
|
|
else
|
|
playerBoxesCounts[playerState.team+1] += 1;
|
|
|
|
var positionObject = playerBoxesCounts[playerState.team+1] - 1;
|
|
var rowPlayer = "playerBox[" + positionObject + "]";
|
|
var playerNameColumn = "playerName[" + positionObject + "]";
|
|
var playerColorBoxColumn = "playerColorBox[" + positionObject + "]";
|
|
var playerCivicBoxColumn = "civIcon[" + positionObject + "]";
|
|
var playerCounterValue = "valueData[" + positionObject + "]";
|
|
if (playerState.team != -1)
|
|
{
|
|
rowPlayer = "playerBoxt[" + playerState.team + "][" + positionObject + "]";
|
|
playerNameColumn = "playerNamet[" + playerState.team + "][" + positionObject + "]";
|
|
playerColorBoxColumn = "playerColorBoxt[" + playerState.team + "][" + positionObject + "]";
|
|
playerCivicBoxColumn = "civIcont[" + playerState.team + "][" + positionObject + "]";
|
|
playerCounterValue = "valueDataTeam[" + playerState.team + "][" + positionObject + "]";
|
|
}
|
|
|
|
var colorString = "color: "
|
|
+ Math.floor(playerState.color.r * 255) + " "
|
|
+ Math.floor(playerState.color.g * 255) + " "
|
|
+ Math.floor(playerState.color.b * 255);
|
|
|
|
var rowPlayerObject = Engine.GetGUIObjectByName(rowPlayer);
|
|
rowPlayerObject.hidden = false;
|
|
rowPlayerObject.sprite = colorString + PLAYER_BOX_ALPHA;
|
|
var boxSize = rowPlayerObject.size;
|
|
boxSize.right = rowPlayerObjectWidth;
|
|
rowPlayerObject.size = boxSize;
|
|
|
|
var playerColorBox = Engine.GetGUIObjectByName(playerColorBoxColumn);
|
|
playerColorBox.sprite = colorString + PLAYER_COLOR_BOX_ALPHA;
|
|
|
|
Engine.GetGUIObjectByName(playerNameColumn).caption = g_GameData.players[i+1].name;
|
|
|
|
var civIcon = Engine.GetGUIObjectByName(playerCivicBoxColumn);
|
|
civIcon.sprite = "stretched:"+g_CivData[playerState.civ].Emblem;
|
|
civIcon.tooltip = g_CivData[playerState.civ].Name;
|
|
|
|
// update counters
|
|
updateCountersPlayer(playerState, panelInfo.counters, playerCounterValue);
|
|
}
|
|
// update team counters
|
|
var teamCounterFn = panelInfo.teamCounterFn
|
|
if (g_Teams && teamCounterFn)
|
|
teamCounterFn(panelInfo.counters);
|
|
}
|
|
|
|
function init(data)
|
|
{
|
|
updateObjectPlayerPosition();
|
|
g_GameData = data;
|
|
|
|
// Map
|
|
var mapDisplayType = translate("Scenario");
|
|
|
|
Engine.GetGUIObjectByName("timeElapsed").caption = sprintf(translate("Time elapsed: %(time)s"), { time: timeToString(data.timeElapsed) });
|
|
|
|
Engine.GetGUIObjectByName("summaryText").caption = data.gameResult;
|
|
|
|
// This is only defined for random maps
|
|
if (data.mapSettings.Size)
|
|
{
|
|
// load the map sizes from the JSON file
|
|
var mapSizes = initMapSizes();
|
|
|
|
// retrieve the index of the map size
|
|
for (var mapSizeIndex in mapSizes.tiles)
|
|
{
|
|
if (mapSizes.tiles[mapSizeIndex] == data.mapSettings.Size)
|
|
{
|
|
mapDisplayType = mapSizes.names[mapSizeIndex];
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
Engine.GetGUIObjectByName("mapName").caption = sprintf(translate("%(mapName)s - %(mapType)s"), { mapName: translate(data.mapSettings.Name), mapType: mapDisplayType});
|
|
|
|
// Panels
|
|
g_MaxPlayers = data.playerStates.length - 1;
|
|
|
|
if (data.mapSettings.LockTeams) // teams ARE locked
|
|
{
|
|
// count teams
|
|
for(var t = 0; t < g_MaxPlayers; ++t)
|
|
{
|
|
if (!g_Teams[data.playerStates[t+1].team])
|
|
{
|
|
g_Teams[data.playerStates[t+1].team] = 1;
|
|
continue;
|
|
}
|
|
g_Teams[data.playerStates[t+1].team]++;
|
|
}
|
|
|
|
if (g_Teams.length == g_MaxPlayers)
|
|
g_Teams = false; // Each player has his own team. Displaying teams makes no sense.
|
|
}
|
|
else // teams are NOT locked
|
|
g_Teams = false;
|
|
|
|
// Erase teams data if teams are not displayed
|
|
if (!g_Teams)
|
|
{
|
|
for(var p = 0; p < g_MaxPlayers; ++p)
|
|
data.playerStates[p+1].team = -1;
|
|
}
|
|
|
|
g_WithoutTeam = g_MaxPlayers;
|
|
if (g_Teams)
|
|
{
|
|
// count players without team (or all if teams are not displayed)
|
|
for (var i = 0; i < g_Teams.length; ++i)
|
|
g_WithoutTeam -= g_Teams[i];
|
|
}
|
|
|
|
selectPanel(0);
|
|
}
|