1
0
forked from 0ad/0ad
0ad/binaries/data/mods/public/gui/test/functions_sim_player.js
2008-09-18 04:38:42 +00:00

195 lines
7.6 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];
}
}
}
// ====================================================================