0ad/binaries/data/mods/public/gui/common/functions_sim_player.js
Ykkrosh f0d9806b3f # Restructured GUI implementation
CGUI now represents a single 'page'. CGUIManager maintains multiple
pages and switches between them.
Split the XML files into pregame, loading, session and messagebox pages.
Added hotloading of GUI pages.
Minor GUI cleanups.
(Merge from hg 81862d33780c)

This was SVN commit r7214.
2009-12-03 20:17:22 +00:00

195 lines
7.4 KiB
JavaScript

/*
DESCRIPTION : Functions for manipulating players and their properties (eg resources).
NOTES :
*/
// ====================================================================
function createResourceCounters()
{
resourceUIArray = new Array();
addResourceCounter(0, "food");
addResourceCounter(1, "wood");
addResourceCounter(2, "stone");
addResourceCounter(3, "metal");
addResourceCounter(4, "population");
refreshResource("Food", 0);
refreshResource("Wood", 1);
refreshResource("Stone", 2);
refreshResource("Metal", 3);
refreshResource("Population", 4);
}
// ====================================================================
function addResourceCounter (index, resourceName)
{
// Creates a resource counter widget.
// Ensure resource name is lower-case.
resourceName = resourceName.toLowerCase();
// We maintain a sorted array of the resource indexes so that the UI counters can be refreshed in centered order.
// (We don't include Housing in the list, though, as it does not have its own resource counter.)
if (resourceName != "housing")
{
// If it's an even index,
if (index % 2 == 0)
// Add it to the end of the UI array.
resourceUIArray.push ( index );
else
// Add it to the beginning of the UI array,
resourceUIArray.unshift ( index );
}
//console.write( "Added " + resourceName /*+ " (" + resourceQty + ")"*/ );
}
// ====================================================================
// HACK: Keep track of old resource values so we only update resource counters as necessary.
// We should really find a *much* faster way to render those counters, since resource values are bound to change quite quickly in a real game.
var oldResources = new Object();
function refreshResources ()
{
// Refreshes all resource counters after update.
var resourcePool = localPlayer.resources;
var shouldRefresh = false;
for (var currResource in resourcePool)
{
if( oldResources[currResource] != localPlayer.resources[currResource] )
{
oldResources[currResource] = localPlayer.resources[currResource].valueOf();
shouldRefresh = true;
}
}
if( shouldRefresh )
{
for( var i=0; i<2; i++ ) // 2 refreshes seem to be necessary for proper alignment
{
var resourceCount = 0;
for (var currResource in resourcePool)
{
if(currResource != "housing")
{
// Pass the array index of the resource as the second parameter (as we'll need that to determine the centered screen position of each counter).
refreshResource (toTitleCase(currResource), resourceUIArray[resourceCount]);
resourceCount++;
}
}
}
}
}
// ====================================================================
function refreshResource (resourceName, resourceIndex)
{
// Refresh the onscreen counter for a given resource (called to recalculate the size of the coordinates, as these dynamically adjust depending on character length).
// Ensure resource name is title-case.
resourceName = toTitleCase (resourceName);
// Ignore the "Housing" resource ... It doesn't work like normal resources and doesn't have a counter to resize.
if (resourceName == "Housing")
return;
// Get resource readout object.
var resourceObject = getGUIObjectByName ("snResourceCounter_" + (resourceIndex + 1));
// Get resource icon object.
var resourceIconObject = getGUIObjectByName ("snResourceCounterIcon_" + (resourceIndex + 1));
// Update counter caption (since we need to have up-to-date text to determine the length of the counter).
var caption = parseInt( localPlayer.resources[resourceName.toLowerCase()] );
// The Population counter also lists the amount of available housing.
if (resourceName == "Population")
caption += "/" + localPlayer.resources["housing"];
resourceObject.caption = caption;
// Update counter tooltip.
resourceObject.tooltip = resourceName + ": " + resourceObject.caption;
// Set resource icon.
resourceIconObject.cell_id = cellGroup["Resource"][resourceName.toLowerCase()].id;
// Get the index of the resource readout to be resized.
var crdResult = getCrd (resourceObject.name, true);
// Get the index of the resource icon.
var crdIconResult = getCrd (resourceIconObject.name, true);
// For each coordinate group stored for this control,
for (var coordGroup in Crd[crdResult].coord)
{
// Set width of readout based on length of caption.
Crd[crdResult].coord[coordGroup].width = snConst.MiniIcon.Width+5 + resourceObject.caption.length * 10;
// Set X and Y position and height so that resources always are immediately besides each other. (Except for the first resource (usually Food), which has the initial starting position)
// Determine starting position for the first resource (so that the resources wind up being centered across the screen).
if (resourceIndex == 0)
{
// The first coordinate is in the exact centre of the screen.
Crd[crdResult].coord[coordGroup].x = Math.round (-(Crd[crdResult].coord[coordGroup].width/2) - 5);
}
else
{ // Resources other than the first one get stacked in sequence to the sides of it.
// If we're dealing with an "even" resource index,
if (resourceIndex % 2 == 0)
{
// Put the counter to the right of the previous odd counter.
Crd[crdResult].coord[coordGroup].x
= Crd[crdResult-2].coord[coordGroup].x + Crd[crdResult-2].coord[coordGroup].width + 5;
}
else // We're dealing with an "odd" resource index.
{
// Put the counter to the left of the previous odd counter.
if (resourceIndex == 1)
Crd[crdResult].coord[coordGroup].x
= Crd[crdResult-1].coord[coordGroup].x - Crd[crdResult].coord[coordGroup].width - 5;
else
Crd[crdResult].coord[coordGroup].x
= Crd[crdResult-2].coord[coordGroup].x - Crd[crdResult].coord[coordGroup].width - 5;
}
// Set Y position to the same as the previous counter.
Crd[crdResult].coord[coordGroup].y
= Crd[crdResult-1].coord[coordGroup].y;
// Set height of readout to the same as the previous counter.
Crd[crdResult].coord[coordGroup].height
= Crd[crdResult-1].coord[coordGroup].height;
}
// Transfer to icon coordinates.
Crd[crdIconResult].coord[coordGroup].width = 32;
Crd[crdIconResult].coord[coordGroup].height = 32;
Crd[crdIconResult].coord[coordGroup].x = Crd[crdResult].coord[coordGroup].x;
Crd[crdIconResult].coord[coordGroup].y = Crd[crdResult].coord[coordGroup].y;
// Recalculate readout's size coordinates.
Crd[crdResult].size[coordGroup] = calcCrdArray (Crd[crdResult].coord[coordGroup].rx, Crd[crdResult].coord[coordGroup].ry, Crd[crdResult].coord[coordGroup].x, Crd[crdResult].coord[coordGroup].y, Crd[crdResult].coord[coordGroup].width, Crd[crdResult].coord[coordGroup].height, Crd[crdResult].coord[coordGroup].rx2, Crd[crdResult].coord[coordGroup].ry2);
// Recalculate icon's size coordinates.
Crd[crdIconResult].size[coordGroup] = calcCrdArray (Crd[crdIconResult].coord[coordGroup].rx, Crd[crdIconResult].coord[coordGroup].ry, Crd[crdIconResult].coord[coordGroup].x, Crd[crdIconResult].coord[coordGroup].y, Crd[crdIconResult].coord[coordGroup].width, Crd[crdIconResult].coord[coordGroup].height, Crd[crdIconResult].coord[coordGroup].rx2, Crd[crdIconResult].coord[coordGroup].ry2);
// If this coordinate is part of the currently active set, update the control onscreen too.
if (coordGroup == GUIType)
{
// Update counter size.
resourceObject.size = Crd[crdResult].size[GUIType];
resourceIconObject.size = Crd[crdIconResult].size[GUIType];
}
}
}
// ====================================================================