Matei
acea9cc2a3
#- Modified female citizen gather rates and aura effects. #- Units automatically go gather nearby resources when done building a dropsite. #- Ore renamed to metal. This was SVN commit r4594.
194 lines
7.6 KiB
JavaScript
194 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];
|
|
}
|
|
}
|
|
}
|
|
|
|
// ====================================================================
|
|
|