1
0
forked from 0ad/0ad

# Completed the new unit production system and tied it in with the GUI.

This was SVN commit r3831.
This commit is contained in:
Matei 2006-04-30 20:34:39 +00:00
parent f94ee87cc5
commit b512733787
4 changed files with 144 additions and 18 deletions

View File

@ -7,7 +7,7 @@
<Traits>
<!-- Temporary creation properties until cost/time for each unit is locked down. -->
<Creation>
<Time>20</Time>
<Time>5</Time>
<Resource>
<Food>2</Food>
<Wood>1</Wood>

View File

@ -22,6 +22,9 @@ const ACTION_HEAL = 3;
const ACTION_ATTACK_RANGED = 4;
const ACTION_BUILD = 5;
const PRODUCTION_TRAIN = 1;
const PRODUCTION_RESEARCH = 2;
// ====================================================================
function entityInit()
@ -539,11 +542,16 @@ function performBuild( evt )
if( bp.curr >= bp.max )
{
// We've finished building this object; convert the foundation to a building
if( t.building != "" ) // Might be false if another unit finished building the thing during our last anim cycle
{
t.template = getEntityTemplate( t.building );
t.building = "";
t.attachAuras();
if (t.traits.population && t.traits.population.add)
getGUIGlobal().giveResources ("Housing", t.traits.population.add);
}
evt.preventDefault(); // Stop performing this action
}
@ -929,18 +937,113 @@ function entityEventPrepareOrder( evt )
function entityStartProduction( evt )
{
console.write("StartProduction: " + evt.productionType + " " + evt.name);
// Set the amount of time it will take to complete production of the production object.
evt.time = getTemplate(evt.name).traits.creation.time;
}
if(evt.productionType == PRODUCTION_TRAIN)
{
var template = getEntityTemplate( evt.name );
var result = entityCheckQueueReq( this, template );
function entityFinishProduction( evt )
{
console.write("FinishProduction: " + evt.productionType + " " + evt.name);
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 ( getGUIGlobal().toTitleCase(resource.toString()) )
{
case "Population":
case "Housing":
break;
default:
// Deduct the given quantity of resources.
getGUIGlobal().deductResources (resource.toString(), parseInt(pool[resource]));
console.write ("Spent " + pool[resource] + " " + resource + " to purchase " +
template.traits.id.generic);
break;
}
}
// Set the amount of time it will take to complete production of the production object.
evt.time = getEntityTemplate(evt.name).traits.creation.time;
}
else
{
// If not, output the error message.
console.write(result);
evt.preventDefault();
}
}
else
{
evt.preventDefault();
}
}
function entityCancelProduction( evt )
{
console.write("CancelProduction: " + evt.productionType + " " + evt.name);
if(evt.productionType == PRODUCTION_TRAIN)
{
// Give back all the resources spent on this entry.
var template = getEntityTemplate( evt.name );
var pool = template.traits.creation.resource;
for ( resource in pool )
{
switch ( getGUIGlobal().toTitleCase(resource.toString()) )
{
case "Population":
case "Housing":
break;
default:
// Deduct the given quantity of resources.
getGUIGlobal().addResources (resource.toString(), parseInt(pool[resource]));
console.write ("Got back " + pool[resource] + " " + resource + " from cancelling " +
template.traits.id.generic);
break;
}
}
}
}
function entityFinishProduction( evt )
{
console.write("FinishProduction: " + evt.productionType + " " + evt.name);
if(evt.productionType == PRODUCTION_TRAIN)
{
var template = getEntityTemplate(evt.name);
// Code to find a free space around an object is tedious and slow, so
// I wrote it in C. Takes the template object so it can determine how
// much space it needs to leave.
var position = this.getSpawnPoint( template );
// The above function returns null if it couldn't find a large enough space.
if( !position )
{
console.write( "Couldn't train unit - not enough space" );
// Oh well. The player's just lost all the resources and time they put into
// construction - serves them right for not paying attention to the land
// around their barracks, doesn't it?
}
else
{
var created = new Entity( template, position );
// 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;
}
}
}
}
// ====================================================================
@ -1085,33 +1188,43 @@ function entityCheckQueueReq( entity, template )
// A return value of 0 equals success -- entry meets requirements for production.
// Cycle through all resources that this item costs, and check the player can afford the cost.
resources = template.traits.creation.resource;
var resources = template.traits.creation.resource;
for( resource in resources )
{
switch( getGUIGlobal().toTitleCase(resource.toString()) )
{
case "Population":
// If the item costs more of this resource type than we have,
if (template.traits.population.rem > (localPlayer.resource["Housing"]-localPlayer.resource[resource]))
{
// Return an error.
return ("Insufficient Housing; " + (resources[resource]-localPlayer.resource["Housing"]-localPlayer.resource.valueOf()[resource].toString()) + " required.");
}
break;
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,
if (resources[resource] > localPlayer.resource[resource])
var cur = getGUIGlobal().getResources(resource);
var req = parseInt(resources[resource]);
if (req > cur)
{
// Return an error.
return ("Insufficient " + resource + "; " + (localPlayer.resource[resource]-resources[resource])*-1 + " required.");
return ("Insufficient " + resource + "; " + (req-cur) + " more required.");
}
else
console.write("Player has at least " + resources[resource] + " " + resource + ".");
console.write("Player has at least " + req + " " + resource + ".");
break;
}
}
// Check if we have enough population space for the entity
if(template.traits.population && template.traits.population.rem)
{
var req = parseInt(template.traits.population.rem);
var space = getGUIGlobal().getResources("Housing") - getGUIGlobal().getResources("Population");
// If the item costs more of this resource type than we have,
if (req > space)
{
// Return an error.
return ("Insufficient Housing; " + (req - space) + " more required.");
}
}
// Check if another entity must first exist.

View File

@ -430,6 +430,8 @@ function updateTab (tab, type, cellSheet, attribute, attribute2, arrayCells)
switch (tab)
{
case "train":
// TODO: Remove this item from the production queue if right-clicked.
issueCommand(selection, NMT_Produce, PRODUCTION_TRAIN, ""+(Crd[getCrd (this.name, true)].entity));
case "research":
// Add this item to the production queue if left-clicked.
// Remove this item from the production queue if right-clicked.

View File

@ -109,6 +109,17 @@ function setResources (resourceName, resourceQty)
// ====================================================================
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.