1
1
forked from 0ad/0ad

# Automatically gather from new resource after exhausting current one.

Fix error when gather target dies before the order is processed.

This was SVN commit r7827.
This commit is contained in:
Ykkrosh 2010-07-31 21:21:42 +00:00
parent ba591b6d9f
commit 4883ddabc3
2 changed files with 40 additions and 20 deletions

View File

@ -61,15 +61,10 @@ ResourceSupply.prototype.TakeResources = function(rate)
ResourceSupply.prototype.GetType = function()
{
if (this.template.Type.indexOf('.') == -1)
{
return { "generic": this.template.Type };
}
else
{
var [type, subtype] = this.template.Type.split('.');
return { "generic": type, "specific": subtype };
}
// All resources must have both type and subtype
var [type, subtype] = this.template.Type.split('.');
return { "generic": type, "specific": subtype };
};
Engine.RegisterComponentType(IID_ResourceSupply, "ResourceSupply", ResourceSupply);

View File

@ -198,10 +198,6 @@ var UnitFsmSpec = {
"Order.Gather": function(msg) {
var cmpResourceSupply = Engine.QueryInterface(this.order.data.target, IID_ResourceSupply);
var type = cmpResourceSupply.GetType();
this.gatherType = type;
// Try to move within range
if (this.MoveToTargetRange(this.order.data.target, IID_ResourceGatherer))
{
@ -231,7 +227,7 @@ var UnitFsmSpec = {
"GATHERING": {
"enter": function() {
var typename = "gather_" + (this.gatherType.specific || this.gatherType.generic);
var typename = "gather_" + this.order.data.type.specific;
this.SelectAnimation(typename, false, 1.0, typename);
this.StartTimer(1000, 1000);
},
@ -256,10 +252,33 @@ var UnitFsmSpec = {
}
else
{
// Can't reach it, or it doesn't exist any more - give up
this.FinishOrder();
// TODO: see if we can switch to a new nearby target of the same type
// Save the current order's type in case we need it later
var oldType = this.order.data.type;
// Can't reach it, or it doesn't exist any more - give up on this order
if (this.FinishOrder())
return;
// No remaining orders - pick a useful default behaviour
// Try to find a nearby target of the same type
var range = 32; // TODO: what's a sensible number?
var players = [0]; // owned by Gaia (TODO: is this what we want?)
var rangeMan = Engine.QueryInterface(SYSTEM_ENTITY, IID_RangeManager);
var nearby = rangeMan.ExecuteQuery(this.entity, range, players, IID_ResourceSupply);
for each (var ent in nearby)
{
var cmpResourceSupply = Engine.QueryInterface(ent, IID_ResourceSupply);
var type = cmpResourceSupply.GetType();
if (type.specific == oldType.specific)
{
this.Gather(ent, true);
return;
}
}
// Nothing else to gather - just give up
}
}
},
@ -337,7 +356,7 @@ var UnitFsmSpec = {
// if we are capable of doing so
if (this.CanGather(msg.data.newentity))
{
this.PushOrder("Gather", { "target": msg.data.newentity });
this.Gather(msg.data.newentity, true);
}
else
{
@ -689,7 +708,13 @@ UnitAI.prototype.Gather = function(target, queued)
return;
}
this.AddOrder("Gather", { "target": target }, queued);
// Save the resource type now, so if the resource gets destroyed
// before we process the order then we still know what resource
// type to look for more of
var cmpResourceSupply = Engine.QueryInterface(target, IID_ResourceSupply);
var type = cmpResourceSupply.GetType();
this.AddOrder("Gather", { "target": target, "type": type }, queued);
};
UnitAI.prototype.Repair = function(target, queued)