Recursively count garrisoned units to avoid overcapacity

This was SVN commit r14074.
This commit is contained in:
sanderd17 2013-11-03 13:13:30 +00:00
parent 72e11a2dea
commit 6dca6910c3
3 changed files with 31 additions and 6 deletions

View File

@ -241,9 +241,9 @@ function getActionInfo(action, target)
data.command = "garrison";
data.target = target;
cursor = "action-garrison";
tooltip = "Current garrison: " + targetState.garrisonHolder.entities.length
tooltip = "Current garrison: " + targetState.garrisonHolder.garrisonedEntitiesCount
+ "/" + targetState.garrisonHolder.capacity;
if (targetState.garrisonHolder.entities.length >= targetState.garrisonHolder.capacity)
if (targetState.garrisonHolder.garrisonedEntitiesCount >= targetState.garrisonHolder.capacity)
tooltip = "[color=\"orange\"]" + tooltip + "[/color]";
}
else if (targetState.resourceSupply)
@ -328,9 +328,12 @@ function getActionInfo(action, target)
case "garrison":
if (hasClass(entState, "Unit") && targetState.garrisonHolder && (playerOwned || mutualAllyOwned))
{
var tooltip = "Current garrison: " + targetState.garrisonHolder.entities.length
var tooltip = "Current garrison: " + targetState.garrisonHolder.garrisonedEntitiesCount
+ "/" + targetState.garrisonHolder.capacity;
if (targetState.garrisonHolder.entities.length >= targetState.garrisonHolder.capacity)
var extraCount = 0;
if (entState.garrisonHolder)
extraCount += entState.garrisonHolder.garrisonedEntitiesCount;
if (targetState.garrisonHolder.garrisonedEntitiesCount + extraCount >= targetState.garrisonHolder.capacity)
tooltip = "[color=\"orange\"]" + tooltip + "[/color]";
var allowedClasses = targetState.garrisonHolder.allowedClasses;
for each (var unitClass in entState.identity.classes)

View File

@ -111,6 +111,22 @@ GarrisonHolder.prototype.IsGarrisoningAllowed = function()
return true;
};
/**
* Return the number of recursively garrisoned units
*/
GarrisonHolder.prototype.GetGarrisonedEntitiesCount = function()
{
var count = 0;
for each (var ent in this.entities)
{
count++
var cmpGarrisonHolder = Engine.QueryInterface(ent, IID_GarrisonHolder)
if (cmpGarrisonHolder)
count += cmpGarrisonHolder.GetGarrisonedEntitiesCount();
}
return count;
};
/**
* Get number of garrisoned units capable of shooting arrows
* Not necessarily archers
@ -164,7 +180,12 @@ GarrisonHolder.prototype.Garrison = function(entity)
if(!this.AllowedToGarrison(entity))
return false;
if (this.entities.length >= this.GetCapacity())
// check the capacity
var extraCount = 0;
var cmpGarrisonHolder = Engine.QueryInterface(entity, IID_GarrisonHolder);
if (cmpGarrisonHolder)
extraCount += cmpGarrisonHolder.GetGarrisonedEntitiesCount();
if (this.GetGarrisonedEntitiesCount() + extraCount >= this.GetCapacity())
return false;
var cmpPosition = Engine.QueryInterface(entity, IID_Position);

View File

@ -330,7 +330,8 @@ GuiInterface.prototype.GetEntityState = function(player, ent)
ret.garrisonHolder = {
"entities": cmpGarrisonHolder.GetEntities(),
"allowedClasses": cmpGarrisonHolder.GetAllowedClassesList(),
"capacity": cmpGarrisonHolder.GetCapacity()
"capacity": cmpGarrisonHolder.GetCapacity(),
"garrisonedEntitiesCount": cmpGarrisonHolder.GetGarrisonedEntitiesCount()
};
}