# Various gameplay updates.
- Added per-player resource pool and modified the GUI and entity scripts to work with it. - Modified unit creation functions so the unit is always assigned a player before firing its initialize event, so that this event can deduct population, etc from the right player. - Fixed various small bugs, like a unit not cancelling all of its queued items when it dies, or buildings not costing anything. This was SVN commit r3998.
This commit is contained in:
parent
8d06d8601b
commit
77c59070c1
@ -23,5 +23,6 @@
|
||||
<Event On="Formation" Function="entityEventFormation" />
|
||||
<Event On="Idle" Function="entityEventIdle" />
|
||||
<Event On="Movement" Function="entityEventMovement" />
|
||||
<Event On="Death" Function="entityDestroyed" />
|
||||
|
||||
</Entity>
|
@ -44,10 +44,6 @@ function startMap (mapName, losSetting, openWindow)
|
||||
|
||||
// Set starting UI layout.
|
||||
GUIType=rb;
|
||||
|
||||
// Initialise Resource Pools by attaching them to the Player object.
|
||||
// (CPlayer code takes care of giving a copy to each player.)
|
||||
createResources();
|
||||
|
||||
// Set session UI sprites to match the skin for the player's civilisation.
|
||||
// (We don't have skins for all civs yet, so we're using the standard menu skin. But it should be settable from here later.)
|
||||
@ -137,6 +133,9 @@ function setupSession ()
|
||||
// Fade out main theme and fade in session theme.
|
||||
crossFade(curr_music, curr_session_playlist_1); // , g_ConfigDB.system["sound.mastergain"]);
|
||||
|
||||
// Create the resouce counters
|
||||
createResourceCounters();
|
||||
|
||||
// Start refreshing the session controls.
|
||||
setInterval( snRefresh, 1, 100 );
|
||||
}
|
||||
|
@ -357,6 +357,9 @@ function snRefresh()
|
||||
// Update manual if it's open.
|
||||
refreshManual();
|
||||
}
|
||||
|
||||
// Always refresh resources
|
||||
refreshResources();
|
||||
}
|
||||
|
||||
// ====================================================================
|
@ -443,7 +443,7 @@ function updateTab (tab, type, cellSheet, attribute, attribute2, arrayCells)
|
||||
case "structciv":
|
||||
case "structmil":
|
||||
// Select building placement cursor.
|
||||
startPlacing (Crd[getCrd (this.name, true)].entity);
|
||||
tryConstruction( Crd[getCrd (this.name, true)].entity );
|
||||
break;
|
||||
case "garrison":
|
||||
// Remove this item from the entity's garrison inventory.
|
||||
@ -529,6 +529,26 @@ function updateTab (tab, type, cellSheet, attribute, attribute2, arrayCells)
|
||||
|
||||
// ====================================================================
|
||||
|
||||
function tryConstruction( name )
|
||||
{
|
||||
// Start the building placement cursor for the given template, if we have enough resources
|
||||
|
||||
var result = checkEntityReqs( localPlayer, getEntityTemplate( name ) );
|
||||
|
||||
if (result == true) // If the entry meets requirements to be built (i.e. resources)
|
||||
{
|
||||
// Show the building placement cursor
|
||||
startPlacing( name );
|
||||
}
|
||||
else
|
||||
{
|
||||
// If not, output the error message.
|
||||
console.write( result );
|
||||
}
|
||||
}
|
||||
|
||||
// ====================================================================
|
||||
|
||||
function refreshCommandButtons()
|
||||
{
|
||||
// Reset button counter.
|
||||
|
@ -5,171 +5,41 @@
|
||||
|
||||
// ====================================================================
|
||||
|
||||
function createResources()
|
||||
function createResourceCounters()
|
||||
{
|
||||
// Defines all resource types for future use.
|
||||
// Assigns the value of game setup resource values as starting values.
|
||||
|
||||
// Numbers for resource modes Low/Normal/High - tweak as needed for balancing
|
||||
var resLowValue = Array(100,50,0,0);
|
||||
var resNormalValue = Array(200,200,100,100);
|
||||
var resHighValue = Array(1000,1000,1000,1000);
|
||||
resourceUIArray = new Array();
|
||||
|
||||
if (getCurrItemValue ("pgSessionSetupResources") == "Low") {
|
||||
// Give low resources
|
||||
var resValue = resLowValue;
|
||||
} else if (getCurrItemValue("pgSessionSetupResources") == "Normal") {
|
||||
// Give normal resources
|
||||
var resValue = resNormalValue;
|
||||
} else if (getCurrItemValue ("pgSessionSetupResources") == "High") {
|
||||
// Give high resources
|
||||
var resValue = resHighValue;
|
||||
} else {
|
||||
// Do not give any resources
|
||||
var resValue = Array(0,0,0,0);
|
||||
}
|
||||
|
||||
addResource ("Food", Number(resValue[0]));
|
||||
addResource ("Wood", Number(resValue[1]));
|
||||
addResource ("Stone", Number(resValue[2]));
|
||||
addResource ("Ore", Number(resValue[3]));
|
||||
addResource ("Population", 0);
|
||||
addResource ("Housing", 0);
|
||||
addResourceCounter(0, "food");
|
||||
addResourceCounter(1, "wood");
|
||||
addResourceCounter(2, "stone");
|
||||
addResourceCounter(3, "ore");
|
||||
addResourceCounter(4, "population");
|
||||
addResourceCounter(5, "housing");
|
||||
}
|
||||
|
||||
// ====================================================================
|
||||
|
||||
function addResource (resourceName, resourceQty)
|
||||
function addResourceCounter (index, resourceName)
|
||||
{
|
||||
// Creates a resource type.
|
||||
// Creates a resource counter widget.
|
||||
|
||||
// Ensure resource name is title-case.
|
||||
resourceName = toTitleCase (resourceName);
|
||||
|
||||
if (!localPlayer.resource)
|
||||
{
|
||||
// Define the base resource group if it does not exist.
|
||||
localPlayer.resource = new Array();
|
||||
// Set the length of the array.
|
||||
localPlayer.resource.length = 0;
|
||||
// Create the UI resource array container if it does not exist.
|
||||
resourceUIArray = new Array;
|
||||
}
|
||||
|
||||
// Store resource's name and starting value.
|
||||
localPlayer.resource.valueOf()[resourceName] = resourceQty;
|
||||
|
||||
// The array is now one index longer.
|
||||
localPlayer.resource.length++;
|
||||
// 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 (resourceName != "housing")
|
||||
{
|
||||
// If it's an even index,
|
||||
if ((localPlayer.resource.length-1) % 2 == 0)
|
||||
if (index % 2 == 0)
|
||||
// Add it to the end of the UI array.
|
||||
resourceUIArray.push ((localPlayer.resource.length-1));
|
||||
resourceUIArray.push ( index );
|
||||
else
|
||||
// Add it to the beginning of the UI array,
|
||||
resourceUIArray.unshift ((localPlayer.resource.length-1));
|
||||
resourceUIArray.unshift ( index );
|
||||
}
|
||||
|
||||
// Dynamically adjust width of resource counter based on caption length.
|
||||
refreshResources();
|
||||
|
||||
console.write( "Added " + resourceName + " (" + resourceQty + ")" );
|
||||
}
|
||||
|
||||
// ====================================================================
|
||||
|
||||
function setResources (resourceName, resourceQty)
|
||||
{
|
||||
// Generic function to set the value of a resource in the player's pool.
|
||||
|
||||
// Ensure resource name is title-case.
|
||||
resourceName = toTitleCase (resourceName);
|
||||
|
||||
// if ( localPlayer.resource.valueOf()[resourceName] )
|
||||
// {
|
||||
// Set resource value.
|
||||
localPlayer.resource.valueOf()[resourceName] = resourceQty;
|
||||
|
||||
// Dynamically adjust width of resource counter based on caption length.
|
||||
refreshResources();
|
||||
|
||||
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 ) ;
|
||||
}
|
||||
|
||||
// ====================================================================
|
||||
|
||||
function getResources (resourceName)
|
||||
{
|
||||
// Generic function to get the value of a resource in the player's pool.
|
||||
|
||||
// Ensure resource name is title-case.
|
||||
resourceName = toTitleCase (resourceName);
|
||||
|
||||
return parseInt(localPlayer.resource.valueOf()[resourceName]);
|
||||
}
|
||||
// ====================================================================
|
||||
|
||||
function giveResources (resourceName, resourceQty)
|
||||
{
|
||||
// Generic function to add resources to the player's Pool.
|
||||
|
||||
// Ensure resource name is title-case.
|
||||
resourceName = toTitleCase (resourceName);
|
||||
|
||||
// if ( localPlayer.resource.valueOf()[resourceName] )
|
||||
// {
|
||||
// Set resource value.
|
||||
localPlayer.resource.valueOf()[resourceName] += resourceQty;
|
||||
|
||||
// Dynamically adjust width of resource counter based on caption length.
|
||||
refreshResources();
|
||||
|
||||
if (resourceName != "Housing" && resourceName != "Population")
|
||||
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 );
|
||||
}
|
||||
|
||||
// ====================================================================
|
||||
|
||||
function deductResources (resourceName, resourceQty)
|
||||
{
|
||||
// Generic function to remove resources from the player's Pool.
|
||||
|
||||
// Ensure resource name is title-case.
|
||||
resourceName = toTitleCase (resourceName);
|
||||
|
||||
// if( localPlayer.resource.valueOf()[resourceName] )
|
||||
// {
|
||||
// Set resource value.
|
||||
localPlayer.resource.valueOf()[resourceName] -= resourceQty;
|
||||
|
||||
// Dynamically adjust width of resource counter based on caption length.
|
||||
refreshResources();
|
||||
|
||||
if (resourceName != "Housing" && resourceName != "Population")
|
||||
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;
|
||||
console.write( "Added " + resourceName /*+ " (" + resourceQty + ")"*/ );
|
||||
}
|
||||
|
||||
// ====================================================================
|
||||
@ -178,13 +48,16 @@ function refreshResources ()
|
||||
{
|
||||
// Refreshes all resource counters after update.
|
||||
|
||||
var resourcePool = localPlayer.resource;
|
||||
var resourcePool = localPlayer.resources;
|
||||
var resourceCount = 0;
|
||||
for (var currResource in resourcePool)
|
||||
for (var currResource in resourcePool)
|
||||
{
|
||||
// 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++;
|
||||
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++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -207,10 +80,10 @@ function refreshResource (resourceName, resourceIndex)
|
||||
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 = localPlayer.resource.valueOf()[resourceName];
|
||||
var caption = localPlayer.resources[resourceName.toLowerCase()];
|
||||
// The Population counter also lists the amount of available housing.
|
||||
if (resourceName == "Population")
|
||||
caption += "/" + localPlayer.resource.valueOf()["Housing"];
|
||||
caption += "/" + localPlayer.resources["housing"];
|
||||
resourceObject.caption = caption;
|
||||
|
||||
// Update counter tooltip.
|
||||
|
@ -32,7 +32,40 @@ function entityInit()
|
||||
{
|
||||
// Initialise an entity when it is first spawned (generate starting hitpoints, etc).
|
||||
|
||||
this.addCreateQueue = entityAddCreateQueue;
|
||||
// If the entity is a foundation, we must deduct resource costs here
|
||||
if( this.building )
|
||||
{
|
||||
var template = getEntityTemplate( this.building, this.player );
|
||||
var result = checkEntityReqs( this.player, template );
|
||||
|
||||
if (result == true) // If the entry meets requirements to be added to the queue (eg sufficient resources)
|
||||
{
|
||||
// Cycle through all costs of this entry.
|
||||
var pool = template.traits.creation.resource;
|
||||
for ( resource in pool )
|
||||
{
|
||||
switch ( resource.toString() )
|
||||
{
|
||||
case "population":
|
||||
case "housing":
|
||||
break;
|
||||
default:
|
||||
// Deduct the given quantity of resources.
|
||||
this.player.resources[resource.toString()] -= parseInt(pool[resource]);
|
||||
|
||||
console.write ("Spent " + pool[resource] + " " + resource + " to build " +
|
||||
template.traits.id.generic);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// Might happen if the player clicks to place 2 buildings really fast
|
||||
console.write( "Could not begin construction: " + result );
|
||||
evt.preventDefault();
|
||||
}
|
||||
}
|
||||
|
||||
// If this is a foundation, initialize traits from the building we're converting into
|
||||
if( this.building && this.building != "" )
|
||||
@ -217,12 +250,15 @@ function entityInit()
|
||||
// If the entity either costs population or adds to it,
|
||||
if (this.traits.population)
|
||||
{
|
||||
console.write("Here: " + this.traits.population.add + " " + this.traits.population.rem
|
||||
+ " " + this.player.resources.population + " " + this.player);
|
||||
|
||||
// If the entity increases the population limit (provides Housing),
|
||||
if (this.traits.population.add)
|
||||
getGUIGlobal().giveResources ("Housing", this.traits.population.add);
|
||||
this.player.resources.housing += parseInt(this.traits.population.add);
|
||||
// If the entity occupies population slots (occupies Housing),
|
||||
if (this.traits.population.rem)
|
||||
getGUIGlobal().giveResources ("Population", this.traits.population.rem);
|
||||
this.player.resources.population += parseInt(this.traits.population.rem);
|
||||
}
|
||||
|
||||
// Build Unit AI Stance list, and set default stance.
|
||||
@ -331,6 +367,22 @@ function attachAuras()
|
||||
|
||||
// ====================================================================
|
||||
|
||||
function entityDestroyed( evt )
|
||||
{
|
||||
// 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)
|
||||
this.player.resources.housing -= parseInt(this.traits.population.add);
|
||||
// If the entity occupies population slots (occupies Housing),
|
||||
if (this.traits.population.rem)
|
||||
this.player.resources.population -= parseInt(this.traits.population.rem);
|
||||
}
|
||||
}
|
||||
|
||||
// ====================================================================
|
||||
|
||||
function foundationDestroyed( evt )
|
||||
{
|
||||
if( this.building != "" ) // Check that we're *really* a foundation since the event handler is kept when we change templates (probably a bug)
|
||||
@ -344,7 +396,7 @@ function foundationDestroyed( evt )
|
||||
for( r in resources )
|
||||
{
|
||||
amount = parseInt( fractionToReturn * parseInt(resources[r]) );
|
||||
getGUIGlobal().giveResources( r.toString(), amount );
|
||||
this.player.resources[r.toString()] += amount;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -510,7 +562,7 @@ function performGather( evt )
|
||||
// Remove amount from target.
|
||||
s.curr -= gather_amt;
|
||||
// Add extracted resources to player's resource pool.
|
||||
getGUIGlobal().giveResources(s.type.toString(), parseInt(gather_amt));
|
||||
this.player.resources[s.type.toString()] += gather_amt;
|
||||
|
||||
// Kill the target if it's now out of resources
|
||||
if( s.curr == 0 )
|
||||
@ -531,12 +583,12 @@ function performHeal( evt )
|
||||
}
|
||||
|
||||
// Cycle through all resources.
|
||||
pool = this.player.resource;
|
||||
pool = this.player.resources;
|
||||
for( resource in pool )
|
||||
{
|
||||
switch( resource.toString() )
|
||||
{
|
||||
case "Population" || "Housing":
|
||||
case "population" || "housing":
|
||||
break;
|
||||
default:
|
||||
// Make sure we have enough resources.
|
||||
@ -558,17 +610,17 @@ function performHeal( evt )
|
||||
}
|
||||
|
||||
// Cycle through all resources.
|
||||
pool = this.player.resource;
|
||||
pool = this.player.resources;
|
||||
for( resource in pool )
|
||||
{
|
||||
switch( resource.toString() )
|
||||
{
|
||||
case "Population":
|
||||
case "Housing":
|
||||
case "population":
|
||||
case "housing":
|
||||
break;
|
||||
default:
|
||||
// Deduct resources to pay for healing.
|
||||
getGUIGlobal().deductResources(toTitleCase (resource.toString()), parseInt(evt.target.actions.heal.cost * evt.target.traits.creation.cost[resource]));
|
||||
this.player.resources[resource.toString()] -= parseInt(evt.target.actions.heal.cost * evt.target.traits.creation.cost[resource]);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -604,7 +656,7 @@ function performBuild( evt )
|
||||
t.attachAuras();
|
||||
|
||||
if (t.traits.population && t.traits.population.add)
|
||||
getGUIGlobal().giveResources ("Housing", t.traits.population.add);
|
||||
this.player.resources.housing += parseInt(t.traits.population.add);
|
||||
}
|
||||
evt.preventDefault(); // Stop performing this action
|
||||
}
|
||||
@ -637,7 +689,7 @@ function performRepair( evt )
|
||||
for( r in resources )
|
||||
{
|
||||
amount = parseInt( fraction * parseInt(resources[r]) );
|
||||
getGUIGlobal().deductResources( r.toString(), amount );
|
||||
this.player.resources[r.toString()] -= parseInt(amount);
|
||||
}
|
||||
|
||||
// Heal the building
|
||||
@ -648,7 +700,7 @@ function performRepair( evt )
|
||||
for( r in resources )
|
||||
{
|
||||
amount = parseInt( fraction * parseInt(resources[r]) );
|
||||
getGUIGlobal().deductResources( r.toString(), amount );
|
||||
this.player.resources[r.toString()] -= parseInt(amount);
|
||||
}
|
||||
}
|
||||
|
||||
@ -728,7 +780,7 @@ function damage( dmg, inflictor )
|
||||
// Notify player.
|
||||
console.write ("Spoils of war! " + this.traits.loot[loot] + " " + loot.toString() + "!");
|
||||
// Give the inflictor his resources.
|
||||
getGUIGlobal().giveResources( loot.toString(), parseInt(this.traits.loot[loot]) );
|
||||
this.player.resources[loot.toString()] -= parseInt(this.traits.loot[loot]);
|
||||
}
|
||||
break;
|
||||
}
|
||||
@ -1124,7 +1176,7 @@ function entityStartProduction( evt )
|
||||
if(evt.productionType == PRODUCTION_TRAIN)
|
||||
{
|
||||
var template = getEntityTemplate( evt.name, this.player );
|
||||
var result = entityCheckQueueReq( this, template );
|
||||
var result = checkEntityReqs( this.player, template );
|
||||
|
||||
if (result == true) // If the entry meets requirements to be added to the queue (eg sufficient resources)
|
||||
{
|
||||
@ -1132,14 +1184,14 @@ function entityStartProduction( evt )
|
||||
var pool = template.traits.creation.resource;
|
||||
for ( resource in pool )
|
||||
{
|
||||
switch ( getGUIGlobal().toTitleCase(resource.toString()) )
|
||||
switch ( resource.toString() )
|
||||
{
|
||||
case "Population":
|
||||
case "Housing":
|
||||
case "population":
|
||||
case "housing":
|
||||
break;
|
||||
default:
|
||||
// Deduct the given quantity of resources.
|
||||
getGUIGlobal().deductResources (resource.toString(), parseInt(pool[resource]));
|
||||
this.player.resources[resource.toString()] -= parseInt(pool[resource]);
|
||||
|
||||
console.write ("Spent " + pool[resource] + " " + resource + " to purchase " +
|
||||
template.traits.id.generic);
|
||||
@ -1174,14 +1226,14 @@ function entityCancelProduction( evt )
|
||||
var pool = template.traits.creation.resource;
|
||||
for ( resource in pool )
|
||||
{
|
||||
switch ( getGUIGlobal().toTitleCase(resource.toString()) )
|
||||
switch ( resource.toString() )
|
||||
{
|
||||
case "Population":
|
||||
case "Housing":
|
||||
case "population":
|
||||
case "housing":
|
||||
break;
|
||||
default:
|
||||
// Deduct the given quantity of resources.
|
||||
getGUIGlobal().addResources (resource.toString(), parseInt(pool[resource]));
|
||||
// Refund the given quantity of resources.
|
||||
this.player.resources[resource.toString()] += parseInt(pool[resource]);
|
||||
|
||||
console.write ("Got back " + pool[resource] + " " + resource + " from cancelling " +
|
||||
template.traits.id.generic);
|
||||
@ -1214,23 +1266,21 @@ function entityFinishProduction( evt )
|
||||
}
|
||||
else
|
||||
{
|
||||
var created = new Entity( template, position );
|
||||
var created = new Entity( template, position, 0, this.player );
|
||||
|
||||
// Above shouldn't ever fail, but just in case...
|
||||
if( created )
|
||||
{
|
||||
console.write( "Created: ", template.tag );
|
||||
|
||||
// Entities start under Gaia control - make the controller
|
||||
// the same as our controller
|
||||
created.player = this.player;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ====================================================================
|
||||
// Old training queue system
|
||||
|
||||
// ====================================================================
|
||||
/*
|
||||
function entityAddCreateQueue( template, tab, list )
|
||||
{
|
||||
// Make sure we have a queue to put things in...
|
||||
@ -1326,7 +1376,7 @@ function entityCreateComplete()
|
||||
function attemptAddToBuildQueue( entity, create_tag, tab, list )
|
||||
{
|
||||
template = getEntityTemplate( create_tag, entity.player );
|
||||
result = entityCheckQueueReq( entity, template );
|
||||
result = checkEntityReqs( entity, template );
|
||||
|
||||
if (result == true) // If the entry meets requirements to be added to the queue (eg sufficient resources)
|
||||
{
|
||||
@ -1334,14 +1384,14 @@ function attemptAddToBuildQueue( entity, create_tag, tab, list )
|
||||
pool = template.traits.creation.resource;
|
||||
for ( resource in pool )
|
||||
{
|
||||
switch ( getGUIGlobal().toTitleCase(resource.toString()) )
|
||||
switch ( resource.toString() )
|
||||
{
|
||||
case "Population":
|
||||
case "Housing":
|
||||
case "population":
|
||||
case "housing":
|
||||
break;
|
||||
default:
|
||||
// Deduct the given quantity of resources.
|
||||
getGUIGlobal().deductResources (resource.toString(), parseInt(pool[resource]));
|
||||
this.player.resources[resource.toString()] -= parseInt(pool[resource]);
|
||||
|
||||
console.write ("Spent " + pool[resource] + " " + resource + " to purchase " +
|
||||
template.traits.id.generic);
|
||||
@ -1361,10 +1411,10 @@ function attemptAddToBuildQueue( entity, create_tag, tab, list )
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
*/
|
||||
// ====================================================================
|
||||
|
||||
function entityCheckQueueReq( entity, template )
|
||||
function checkEntityReqs( player, template )
|
||||
{
|
||||
// Determines if the given entity meets requirements for production by the player, and returns an appropriate
|
||||
// error string.
|
||||
@ -1374,14 +1424,14 @@ function entityCheckQueueReq( entity, template )
|
||||
var resources = template.traits.creation.resource;
|
||||
for( resource in resources )
|
||||
{
|
||||
switch( getGUIGlobal().toTitleCase(resource.toString()) )
|
||||
switch( resource.toString() )
|
||||
{
|
||||
case "Population":
|
||||
case "Housing": // Ignore housing. It's handled in combination with population.
|
||||
case "population":
|
||||
case "housing": // Ignore housing. It's handled in combination with population.
|
||||
break
|
||||
default:
|
||||
// If the item costs more of this resource type than we have,
|
||||
var cur = getGUIGlobal().getResources(resource);
|
||||
var cur = player.resources[resource];
|
||||
var req = parseInt(resources[resource]);
|
||||
if (req > cur)
|
||||
{
|
||||
@ -1399,7 +1449,7 @@ function entityCheckQueueReq( entity, template )
|
||||
if(template.traits.population && template.traits.population.rem)
|
||||
{
|
||||
var req = parseInt(template.traits.population.rem);
|
||||
var space = getGUIGlobal().getResources("Housing") - getGUIGlobal().getResources("Population");
|
||||
var space = player.resources.housing - player.resources.population;
|
||||
|
||||
// If the item costs more of this resource type than we have,
|
||||
if (req > space)
|
||||
|
@ -3,4 +3,42 @@
|
||||
NOTES :
|
||||
*/
|
||||
|
||||
// Assign the players resources
|
||||
|
||||
for(var i=0; i<players.length; i++)
|
||||
{
|
||||
var p = players[i];
|
||||
p.resources = new Object();
|
||||
|
||||
switch( g_GameAttributes.resourceLevel.toLowerCase() )
|
||||
{
|
||||
case "high":
|
||||
p.resources.food = 1000;
|
||||
p.resources.wood = 1000;
|
||||
p.resources.ore = 500;
|
||||
p.resources.stone = 500;
|
||||
break;
|
||||
default:
|
||||
p.resources.food = 200;
|
||||
p.resources.wood = 200;
|
||||
p.resources.ore = 100;
|
||||
p.resources.stone = 100;
|
||||
break;
|
||||
}
|
||||
|
||||
p.resources.population = 0;
|
||||
p.resources.housing = 0;
|
||||
}
|
||||
|
||||
// Give the players their civ techs (which will set up their civ bonuses)
|
||||
for(var i=0; i<players.length; i++)
|
||||
{
|
||||
var tech = getTechnology( "civ_" + players[i].civilization.toLowerCase() );
|
||||
if( tech != null )
|
||||
{
|
||||
tech.applyEffects( i, false, false );
|
||||
}
|
||||
}
|
||||
|
||||
console.write( "Game startup script done." );
|
||||
|
||||
|
@ -93,10 +93,6 @@ PSRETURN CGame::ReallyStartGame()
|
||||
}
|
||||
#endif
|
||||
|
||||
// Call the game startup script
|
||||
// TODO: Maybe don't do this if we're in Atlas
|
||||
g_ScriptingHost.RunScript( "scripts/game_startup.js" );
|
||||
|
||||
debug_printf("GAME STARTED, ALL INIT COMPLETE\n");
|
||||
m_GameStarted=true;
|
||||
|
||||
|
@ -343,11 +343,9 @@ JSBool getTechnology( JSContext* cx, JSObject* UNUSED(obj), uint argc, jsval* ar
|
||||
if ( tech )
|
||||
*rval = ToJSVal( tech );
|
||||
else
|
||||
JS_ReportError(cx, "Invalid tech template name \"%ls\" passed for getTechnology()", name.c_str() );
|
||||
g_Console->InsertMessage( L"Warning: Invalid tech template name \"%ls\" passed for getTechnology()", name.c_str() );
|
||||
|
||||
if ( rval )
|
||||
return JS_TRUE;
|
||||
return JS_FALSE;
|
||||
return JS_TRUE;
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
@ -164,8 +164,6 @@ CEntity::CEntity( CBaseEntity* base, CVector3D position, float orientation, cons
|
||||
m_building = building;
|
||||
|
||||
m_player = g_Game->GetPlayer( 0 );
|
||||
|
||||
Initialize();
|
||||
}
|
||||
|
||||
CEntity::~CEntity()
|
||||
@ -771,10 +769,15 @@ void UpdateAuras_Normal( SAura& aura, CEntity* e )
|
||||
|
||||
#endif
|
||||
|
||||
void CEntity::Initialize()
|
||||
bool CEntity::Initialize()
|
||||
{
|
||||
CEventInitialize evt;
|
||||
DispatchEvent( &evt );
|
||||
if( !DispatchEvent( &evt ) )
|
||||
{
|
||||
kill();
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
void CEntity::Tick()
|
||||
@ -1468,6 +1471,8 @@ JSBool CEntity::Construct( JSContext* cx, JSObject* UNUSED(obj), uint argc, jsva
|
||||
JSObject* jsBaseEntity = JSVAL_TO_OBJECT( argv[0] );
|
||||
CStrW templateName;
|
||||
|
||||
CPlayer* player = g_Game->GetPlayer( 0 );
|
||||
|
||||
CBaseEntity* baseEntity = NULL;
|
||||
if( JSVAL_IS_OBJECT( argv[0] ) ) // only set baseEntity if jsBaseEntity is a valid object
|
||||
baseEntity = ToNative<CBaseEntity>( cx, jsBaseEntity );
|
||||
@ -1516,8 +1521,22 @@ JSBool CEntity::Construct( JSContext* cx, JSObject* UNUSED(obj), uint argc, jsva
|
||||
}
|
||||
}
|
||||
|
||||
if( argc >= 4 )
|
||||
{
|
||||
try
|
||||
{
|
||||
player = ToPrimitive<CPlayer*>( argv[3] );
|
||||
}
|
||||
catch( PSERROR_Scripting_ConversionFailed )
|
||||
{
|
||||
player = g_Game->GetPlayer( 0 );
|
||||
}
|
||||
}
|
||||
|
||||
std::set<CStrW> selections; // TODO: let scripts specify selections?
|
||||
HEntity handle = g_EntityManager.create( baseEntity, position, orientation, selections );
|
||||
handle->SetPlayer( player );
|
||||
handle->Initialize();
|
||||
|
||||
*rval = ToJSVal<CEntity>( *handle );
|
||||
return( JS_TRUE );
|
||||
|
@ -267,7 +267,7 @@ public:
|
||||
void kill();
|
||||
|
||||
// Process initialization
|
||||
void Initialize();
|
||||
bool Initialize();
|
||||
|
||||
// Process tick.
|
||||
void Tick();
|
||||
|
@ -93,6 +93,18 @@ HEntity CEntityManager::create( CBaseEntity* base, CVector3D position, float ori
|
||||
return( HEntity( m_nextalloc++ ) );
|
||||
}
|
||||
|
||||
HEntity CEntityManager::create( CStrW templateName, CPlayer* player, CVector3D position, float orientation )
|
||||
{
|
||||
CBaseEntity* base = g_EntityTemplateCollection.getTemplate( templateName, player );
|
||||
debug_assert( base );
|
||||
if( !base )
|
||||
return HEntity();
|
||||
|
||||
std::set<CStrW> selections;
|
||||
|
||||
return create( base, position, orientation, selections );
|
||||
}
|
||||
|
||||
HEntity CEntityManager::createFoundation( CStrW templateName, CPlayer* player, CVector3D position, float orientation )
|
||||
{
|
||||
CBaseEntity* base = g_EntityTemplateCollection.getTemplate( templateName, player );
|
||||
|
@ -53,9 +53,14 @@ public:
|
||||
CEntityManager();
|
||||
~CEntityManager();
|
||||
|
||||
HEntity create( CBaseEntity* base, CVector3D position, float orientation, const std::set<CStrW>& actorSelections );
|
||||
HEntity create( CBaseEntity* base, CVector3D position, float orientation,
|
||||
const std::set<CStrW>& actorSelections );
|
||||
|
||||
HEntity createFoundation( CStrW templateName, CPlayer* player, CVector3D position, float orientation );
|
||||
HEntity create( CStrW templateName, CPlayer* player, CVector3D position,
|
||||
float orientation );
|
||||
|
||||
HEntity createFoundation( CStrW templateName, CPlayer* player, CVector3D position,
|
||||
float orientation );
|
||||
|
||||
HEntity* getByHandle( u16 index );
|
||||
CHandle *getHandle( int index );
|
||||
|
@ -654,11 +654,9 @@ bool CEntity::processProduce( CEntityOrder* order )
|
||||
{
|
||||
int type = order->m_data[1].data;
|
||||
CStrW name = order->m_data[0].string;
|
||||
debug_printf("Trying to produce %d %ls\n", type, name.c_str() );
|
||||
CEventStartProduction evt( type, name );
|
||||
if( DispatchEvent( &evt ) && evt.GetTime() >= 0 )
|
||||
{
|
||||
debug_printf("Production started, time is %f\n", evt.GetTime());
|
||||
m_productionQueue->AddItem( type, name, evt.GetTime() );
|
||||
}
|
||||
return( false );
|
||||
|
@ -61,6 +61,12 @@ CProductionQueue::~CProductionQueue()
|
||||
{
|
||||
for( size_t i=0; i < m_items.size(); ++i )
|
||||
{
|
||||
// Cancel production of the item
|
||||
CProductionItem* item = m_items[i];
|
||||
CEventCancelProduction evt( item->m_type, item->m_name );
|
||||
m_owner->DispatchEvent( &evt );
|
||||
|
||||
// Free its memory
|
||||
delete m_items[i];
|
||||
}
|
||||
}
|
||||
@ -78,7 +84,6 @@ void CProductionQueue::Update( size_t timestep )
|
||||
front->Update( timestep );
|
||||
if( front->IsComplete() )
|
||||
{
|
||||
debug_printf("Production complete!\n");
|
||||
CEventFinishProduction evt( front->m_type, front->m_name );
|
||||
m_owner->DispatchEvent( &evt );
|
||||
m_items.erase( m_items.begin() );
|
||||
|
@ -49,6 +49,10 @@ int CSimulation::Initialize(CGameAttributes* pAttribs)
|
||||
{
|
||||
m_pTurnManager->Initialize(m_pGame->GetNumPlayers());
|
||||
|
||||
// Call the game startup script
|
||||
// TODO: Maybe don't do this if we're in Atlas
|
||||
g_ScriptingHost.RunScript( "scripts/game_startup.js" );
|
||||
|
||||
g_EntityManager.InitializeAll();
|
||||
|
||||
// 2006-03-04: ~33ms
|
||||
@ -348,11 +352,13 @@ uint CSimulation::TranslateMessage(CNetMessage* pMsg, uint clientMask, void* UNU
|
||||
CVector3D pos(msg->m_X/1000.0f, msg->m_Y/1000.0f, msg->m_Z/1000.0f);
|
||||
HEntity newObj = g_EntityManager.createFoundation( msg->m_Template, player, pos, msg->m_Angle/1000.0f );
|
||||
newObj->SetPlayer(player);
|
||||
|
||||
// Order all the selected units to work on the new object using the given action
|
||||
order.m_type = CEntityOrder::ORDER_START_CONSTRUCTION;
|
||||
order.m_data[0].entity = newObj;
|
||||
QueueOrder(order, msg->m_Entities, false);
|
||||
if( newObj->Initialize() )
|
||||
{
|
||||
// Order all the selected units to work on the new object using the given action
|
||||
order.m_type = CEntityOrder::ORDER_START_CONSTRUCTION;
|
||||
order.m_data[0].entity = newObj;
|
||||
QueueOrder(order, msg->m_Entities, false);
|
||||
}
|
||||
} while(0)
|
||||
break;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user