diff --git a/binaries/data/mods/official/entities/template_entity_script.js b/binaries/data/mods/official/entities/template_entity_script.js index 31361f7514..395629e1dc 100644 --- a/binaries/data/mods/official/entities/template_entity_script.js +++ b/binaries/data/mods/official/entities/template_entity_script.js @@ -167,6 +167,17 @@ function entityInit() { this.traits.id = new Object(); } + + // If the entity either costs population or adds to it, + if (this.traits.population) + { + // If the entity increases the population limit (provides Housing), + if (this.traits.population.add) + getGUIGlobal().giveResources ("Housing", this.traits.population.add); + // If the entity occupies population slots (occupies Housing), + if (this.traits.population.rem) + getGUIGlobal().giveResources ("Population", this.traits.population.rem); + } /* // Generate entity's personal name (if it needs one). @@ -773,7 +784,7 @@ function entityCheckQueueReq( entity, template ) { case "POPULATION": // If the item costs more of this resource type than we have, - if (resources[resource] > (localPlayer.resource["HOUSING"]-localPlayer.resource[resourceU])) + if (template.traits.population.rem > (localPlayer.resource["HOUSING"]-localPlayer.resource[resourceU])) { // Return an error. return ("Insufficient Housing; " + (resources[resource]-localPlayer.resource["HOUSING"]-localPlayer.resource.valueOf()[resourceU].toString()) + " required."); diff --git a/binaries/data/mods/official/gui/test/functions_page_pregame_load.js b/binaries/data/mods/official/gui/test/functions_page_pregame_load.js index c59942d94d..44bf289049 100644 --- a/binaries/data/mods/official/gui/test/functions_page_pregame_load.js +++ b/binaries/data/mods/official/gui/test/functions_page_pregame_load.js @@ -39,6 +39,11 @@ function startMap (mapName, losSetting, openWindow) btCode = new Array(""); messageBox(400, 200, "The game could not be started with the given parameters. You probably have entered an invalid map name.", "Error", 0, btCaptions, btCode); } + + // Initialise Resource Pools by attaching them to the Player object. + // (CPlayer code takes care of giving a copy to each player.) + createResources(); + } // ==================================================================== @@ -109,12 +114,6 @@ function setupSession () // Do essentials that can only be done when the session has been loaded ... // For example, create the resource types, scores, etc, for each player. - // Initialise Resource Pools by attaching them to the Player object. - // (CPlayer code takes care of giving a copy to each player.) - createResources(); - - - /* if (sessionType == "Skirmish") { diff --git a/binaries/data/mods/official/gui/test/functions_sim_entity.js b/binaries/data/mods/official/gui/test/functions_sim_entity.js index 3f5e73f4f1..79311ecd9c 100644 --- a/binaries/data/mods/official/gui/test/functions_sim_entity.js +++ b/binaries/data/mods/official/gui/test/functions_sim_entity.js @@ -56,12 +56,13 @@ function worldClickHandler(event) args[1]=event.y; break; // entity target commands - case NMT_AttackMelee: - case NMT_Gather: - case NMT_Heal: - args[0]=event.entity; - args[1]=null; - break; + // I'm guessing we no longer require these now that they have become generic events? +// case NMT_AttackMelee: +// case NMT_Gather: +// case NMT_Heal: +// args[0]=event.entity; +// args[1]=null; +// break; case NMT_Generic: args[0]=event.entity; args[1]=event.action; diff --git a/binaries/data/mods/official/gui/test/functions_sim_player.js b/binaries/data/mods/official/gui/test/functions_sim_player.js index 9828188253..3afe015b02 100644 --- a/binaries/data/mods/official/gui/test/functions_sim_player.js +++ b/binaries/data/mods/official/gui/test/functions_sim_player.js @@ -56,9 +56,9 @@ function addResource (resourceName, resourceQty) // Store resource's name and starting value. localPlayer.resource.valueOf()[resourceNameU] = resourceQty; - // Update GUI resource counter. - if (resourceName != "Housing") - getGUIObjectByName ("snResourceCounter_" + resourceName).caption = resourceQty; + + // Dynamically adjust width of resource counter based on caption length. + refreshResource (resourceName); console.write( "Added " + resourceName + " (" + resourceQty + ")" ); } @@ -74,20 +74,21 @@ function setResources (resourceName, resourceQty) // Create uppercase name. resourceNameU = resourceName.toUpperCase(); - if ( localPlayer.resource.valueOf()[resourceNameU] ) - { +// if ( localPlayer.resource.valueOf()[resourceNameU] ) +// { // Set resource value. localPlayer.resource.valueOf()[resourceNameU] = resourceQty; - // Update GUI resource counter. - getGUIObjectByName ("snResourceCounter_" + resourceName).caption = localPlayer.resource.valueOf()[resourceNameU]; + + // Dynamically adjust width of resource counter based on caption length. + refreshResource (resourceName); console.write ("Resource set to " + resourceQty + " " + resourceName + "."); return ( true ); - } +// } // If the resource wasn't in the list, report an error. - console.write ("Failed to set resource " + resourceName + " to " + resourceQty); - return ( false ) ; +// console.write ("Failed to set resource " + resourceName + " to " + resourceQty); +// return ( false ) ; } // ==================================================================== @@ -100,21 +101,22 @@ function giveResources (resourceName, resourceQty) resourceName = toTitleCase (resourceName); // Create uppercase name. resourceNameU = resourceName.toUpperCase(); - - if ( localPlayer.resource.valueOf()[resourceNameU] ) - { +console.write (localPlayer.resource.valueOf()[resourceNameU]); +// if ( localPlayer.resource.valueOf()[resourceNameU] ) +// { // Set resource value. localPlayer.resource.valueOf()[resourceNameU] += resourceQty; - // Update GUI resource counter. - getGUIObjectByName ("snResourceCounter_" + resourceName).caption = localPlayer.resource.valueOf()[resourceNameU]; + + // Dynamically adjust width of resource counter based on caption length. + refreshResource (resourceName); console.write ("Earned " + resourceQty + " " + resourceName + "."); return ( true ); - } +// } - // If the resource wasn't in the list, report an error. - console.write ("Failed to add " + resourceQty + " to resource " + resourceName); - return ( false ); +// // If the resource wasn't in the list, report an error. +// console.write ("Failed to add " + resourceQty + " to resource " + resourceName); +// return ( false ); } // ==================================================================== @@ -128,20 +130,56 @@ function deductResources (resourceName, resourceQty) // Create uppercase name. resourceNameU = resourceName.toUpperCase(); - if( localPlayer.resource.valueOf()[resourceNameU] ) - { +// if( localPlayer.resource.valueOf()[resourceNameU] ) +// { // Set resource value. localPlayer.resource.valueOf()[resourceNameU] -= resourceQty; - // Update GUI resource counter. - getGUIObjectByName ("snResourceCounter_" + resourceName).caption = localPlayer.resource.valueOf()[resourceNameU]; + + // Dynamically adjust width of resource counter based on caption length. + refreshResource (resourceName); console.write("Deducted " + resourceQty + " " + resourceName + "."); return( true ); - } +// } - // If the resource wasn't in the list, report an error. - console.write ("Failed to deduct " + resourceQty + " from resource " + resourceName); - return false; +// // If the resource wasn't in the list, report an error. +// console.write ("Failed to deduct " + resourceQty + " from resource " + resourceName); +// return false; +} + +// ==================================================================== + +function refreshResource (resourceName) +{ + // Ignore the "Housing" resource ... It doesn't work like normal resources and doesn't have a counter to resize. + if (resourceName == "Housing") + resourceName = "Population"; + + // Update GUI resource counter caption. + if (resourceName != "Population") + getGUIObjectByName ("snResourceCounter_" + resourceName).caption = localPlayer.resource.valueOf()[resourceNameU]; + else + getGUIObjectByName ("snResourceCounter_Population").caption = localPlayer.resource.valueOf()["POPULATION"] + "/" + localPlayer.resource.valueOf()["HOUSING"]; + + // Get the index of the resource readout to be resized. + crdResult = getCrd ("snResourceCounter_" + resourceName, true); + // Get resource readout object. + resourceObject = getGUIObjectByName ("snResourceCounter_" + resourceName); + + // For each coordinate group stored for this control, + for (coordGroup in Crd[crdResult].coord) + { + // Set X position so that resources always are immediately next to each other. (Except for Food, which is always the leftmost resource.) + if (resourceName != "Food") + Crd[crdResult].coord[coordGroup].x + = Crd[crdResult-1].coord[coordGroup].x + Crd[crdResult-1].coord[coordGroup].width + 5; + + // Set width of readout based on length of caption. + Crd[crdResult].coord[coordGroup].width = snConst.MiniIcon.Width+5 + resourceObject.caption.length * 10; + + // 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); + } } // ==================================================================== diff --git a/binaries/data/mods/official/gui/test/functions_utility_coord.js b/binaries/data/mods/official/gui/test/functions_utility_coord.js index 6474b012af..0fe6a46266 100644 --- a/binaries/data/mods/official/gui/test/functions_utility_coord.js +++ b/binaries/data/mods/official/gui/test/functions_utility_coord.js @@ -58,15 +58,25 @@ function addCrd (name, group, rx, ry, x, y, width, height, rx2, ry2) // ==================================================================== // Return coordinate object with a given name. -function getCrd (name) +// Optionally can choose to return the index to the coordinate, rather than the coordinate itself. +function getCrd (name, byIndex) { for (getCrdLoop = 0; getCrdLoop <= Crd.last; getCrdLoop++) { if (Crd[getCrdLoop].name == name) - return Crd[getCrdLoop]; + { + // If only index requested, just return index. + if (byIndex) + return getCrdLoop; + else + // Otherwise return the whole coordinate array for this object. + return Crd[getCrdLoop]; + } } console.write ("Coordinate " + name + " not found in call to getCrd()."); + // Return -1 to indicate failure. + return -1; } // ==================================================================== @@ -157,3 +167,22 @@ function calcCrdArray (rx, ry, x, y, width, height, rx2, ry2) } // ==================================================================== + +// Set an existing coord of a given name to a new value. +function setCrd (name, newCrd) +{ + // Get the index to the given coordinate. + crdResult = getCrd (name, true); + if (crdResult != -1) + { + // Set new value of this coordinate. + Crd[crdResult] = newCrd; + } + else + { + console.write ("Failed to setCrd() + " + name); + return -1; + } +} + +// ====================================================================