Index: binaries/data/mods/public/gui/session/unit_actions.js
===================================================================
--- binaries/data/mods/public/gui/session/unit_actions.js
+++ binaries/data/mods/public/gui/session/unit_actions.js
@@ -635,15 +635,15 @@
return false;
let tooltip = sprintf(translate("Current garrison: %(garrisoned)s/%(capacity)s"), {
- "garrisoned": targetState.garrisonHolder.garrisonedEntitiesCount,
+ "garrisoned": targetState.garrisonHolder.garrisonedSlots,
"capacity": targetState.garrisonHolder.capacity
});
- let extraCount = 0;
+ let extraCount = entState.canGarrison.slots;
if (entState.garrisonHolder)
- extraCount += entState.garrisonHolder.garrisonedEntitiesCount;
+ extraCount += entState.garrisonHolder.garrisonedSlots;
- if (targetState.garrisonHolder.garrisonedEntitiesCount + extraCount >= targetState.garrisonHolder.capacity)
+ if (targetState.garrisonHolder.garrisonedSlots + extraCount > targetState.garrisonHolder.capacity)
tooltip = coloredText(tooltip, "orange");
if (!MatchesClassList(entState.identity.classes, targetState.garrisonHolder.allowedClasses))
@@ -850,11 +850,11 @@
cursor = "action-garrison";
tooltip = sprintf(translate("Current garrison: %(garrisoned)s/%(capacity)s"), {
- "garrisoned": targetState.garrisonHolder.garrisonedEntitiesCount,
+ "garrisoned": targetState.garrisonHolder.garrisonedSlots,
"capacity": targetState.garrisonHolder.capacity
});
- if (targetState.garrisonHolder.garrisonedEntitiesCount >=
+ if (targetState.garrisonHolder.garrisonedSlots >=
targetState.garrisonHolder.capacity)
tooltip = coloredText(tooltip, "orange");
}
Index: binaries/data/mods/public/simulation/ai/common-api/entity.js
===================================================================
--- binaries/data/mods/public/simulation/ai/common-api/entity.js
+++ binaries/data/mods/public/simulation/ai/common-api/entity.js
@@ -398,6 +398,8 @@
"garrisonMax": function() { return this.get("GarrisonHolder/Max"); },
+ "garrisonSlots": function() { return this.get("Garrisonable/Slots"); },
+
"garrisonEjectHealth": function() { return +this.get("GarrisonHolder/EjectHealth"); },
"getDefaultArrow": function() { return +this.get("BuildingAI/DefaultArrowCount"); },
@@ -720,7 +722,20 @@
},
"garrisoned": function() { return this._entity.garrisoned; },
- "canGarrisonInside": function() { return this._entity.garrisoned.length < this.garrisonMax(); },
+
+ "garrisonedSlots": function() {
+ let count = 0;
+warn(uneval(this._entity.garrisoned));
+ if (this._entity.garrisoned)
+ for (let ent of this._entity.garrisoned)
+{warn(uneval(ent));
+warn(uneval(ent.garrisonSlots()) );
+// count += ent.garrisonSlots;
+}warn(uneval(count));
+ return count;
+ },
+
+ "canGarrisonInside": function() { return this.garrisonedSlots() < this.garrisonMax(); },
/**
* returns true if the entity can attack (including capture) the given class.
Index: binaries/data/mods/public/simulation/ai/petra/garrisonManager.js
===================================================================
--- binaries/data/mods/public/simulation/ai/petra/garrisonManager.js
+++ binaries/data/mods/public/simulation/ai/petra/garrisonManager.js
@@ -205,9 +205,9 @@
m.GarrisonManager.prototype.numberOfGarrisonedUnits = function(holder)
{
if (!this.holders.has(holder.id()))
- return holder.garrisoned().length;
+ return holder.garrisonedSlots();
- return holder.garrisoned().length + this.holders.get(holder.id()).list.length;
+ return holder.garrisonedSlots() + this.holders.get(holder.id()).list.length;
};
m.GarrisonManager.prototype.allowMelee = function(holder)
Index: binaries/data/mods/public/simulation/components/AlertRaiser.js
===================================================================
--- binaries/data/mods/public/simulation/components/AlertRaiser.js
+++ binaries/data/mods/public/simulation/components/AlertRaiser.js
@@ -63,7 +63,7 @@
let cmpGarrisonHolder = Engine.QueryInterface(ent, IID_GarrisonHolder);
if (!reserved.has(ent))
- reserved.set(ent, cmpGarrisonHolder.GetCapacity() - cmpGarrisonHolder.GetGarrisonedEntitiesCount());
+ reserved.set(ent, cmpGarrisonHolder.GetCapacity() - cmpGarrisonHolder.GetGarrisonedSlots());
return cmpGarrisonHolder.IsAllowedToGarrison(unit) && reserved.get(ent);
});
Index: binaries/data/mods/public/simulation/components/GarrisonHolder.js
===================================================================
--- binaries/data/mods/public/simulation/components/GarrisonHolder.js
+++ binaries/data/mods/public/simulation/components/GarrisonHolder.js
@@ -121,7 +121,7 @@
GarrisonHolder.prototype.IsFull = function()
{
- return this.GetGarrisonedEntitiesCount() >= this.GetCapacity();
+ return this.GetGarrisonedSlots() >= this.GetCapacity();
};
GarrisonHolder.prototype.GetHealRate = function()
@@ -162,6 +162,21 @@
return count;
};
+GarrisonHolder.prototype.GetGarrisonedSlots = function()
+{
+ let count = 0;
+ for (let ent of this.entities)
+ {
+ let cmpGarrisonable = Engine.QueryInterface(ent, IID_Garrisonable);
+ if (cmpGarrisonable)
+ count += cmpGarrisonable.GetSlots();
+ let cmpGarrisonHolder = Engine.QueryInterface(ent, IID_GarrisonHolder);
+ if (cmpGarrisonHolder)
+ count += cmpGarrisonHolder.GetGarrisonedSlots();
+ }
+ return count;
+};
+
GarrisonHolder.prototype.IsAllowedToGarrison = function(ent)
{
if (!this.IsGarrisoningAllowed())
@@ -244,11 +259,13 @@
return false;
// Check the capacity
- let extraCount = 0;
+ let cmpGarrisonable = Engine.QueryInterface(entity, IID_Garrisonable);
+ let extraCount = cmpGarrisonable.GetSlots();
+
let cmpGarrisonHolder = Engine.QueryInterface(entity, IID_GarrisonHolder);
if (cmpGarrisonHolder)
- extraCount += cmpGarrisonHolder.GetGarrisonedEntitiesCount();
- if (this.GetGarrisonedEntitiesCount() + extraCount >= this.GetCapacity())
+ extraCount += cmpGarrisonHolder.GetGarrisonedSlots();
+ if (this.GetGarrisonedSlots() + extraCount > this.GetCapacity())
return false;
if (!this.timer && this.GetHealRate() > 0)
Index: binaries/data/mods/public/simulation/components/Garrisonable.js
===================================================================
--- binaries/data/mods/public/simulation/components/Garrisonable.js
+++ binaries/data/mods/public/simulation/components/Garrisonable.js
@@ -1,6 +1,15 @@
function Garrisonable() {}
-Garrisonable.prototype.Schema = "";
+Garrisonable.prototype.Schema =
+ "Controls the garrisonability of an entity." +
+ "" +
+ "10" +
+ "" +
+ "" +
+ "" +
+ "" +
+ "" +
+ "";
Garrisonable.prototype.Init = function()
{
@@ -8,4 +17,9 @@
Garrisonable.prototype.Serialize = null;
+Garrisonable.prototype.GetSlots = function()
+{
+ return ApplyValueModificationsToEntity("Garrisonable/Slots", +this.template.Slots, this.entity);
+};
+
Engine.RegisterComponentType(IID_Garrisonable, "Garrisonable", Garrisonable);
Index: binaries/data/mods/public/simulation/components/GuiInterface.js
===================================================================
--- binaries/data/mods/public/simulation/components/GuiInterface.js
+++ binaries/data/mods/public/simulation/components/GuiInterface.js
@@ -335,10 +335,14 @@
"buffHeal": cmpGarrisonHolder.GetHealRate(),
"allowedClasses": cmpGarrisonHolder.GetAllowedClasses(),
"capacity": cmpGarrisonHolder.GetCapacity(),
- "garrisonedEntitiesCount": cmpGarrisonHolder.GetGarrisonedEntitiesCount()
+ "garrisonedSlots": cmpGarrisonHolder.GetGarrisonedSlots()
};
- ret.canGarrison = !!Engine.QueryInterface(ent, IID_Garrisonable);
+ let cmpGarrisonable = Engine.QueryInterface(ent, IID_Garrisonable);
+ if (cmpGarrisonable)
+ ret.canGarrison = {
+ "slots": cmpGarrisonable.GetSlots()
+ }
let cmpUnitAI = Engine.QueryInterface(ent, IID_UnitAI);
if (cmpUnitAI)
Index: binaries/data/mods/public/simulation/components/tests/test_GarrisonHolder.js
===================================================================
--- binaries/data/mods/public/simulation/components/tests/test_GarrisonHolder.js
+++ binaries/data/mods/public/simulation/components/tests/test_GarrisonHolder.js
@@ -73,7 +73,9 @@
"GetOwner": () => friendlyPlayer
});
- AddMock(i, IID_Garrisonable, {});
+ AddMock(i, IID_Garrisonable, {
+ "GetSlots": () => 1
+ });
AddMock(i, IID_Position, {
"GetHeightOffset": () => 0,
Index: binaries/data/mods/public/simulation/components/tests/test_GuiInterface.js
===================================================================
--- binaries/data/mods/public/simulation/components/tests/test_GuiInterface.js
+++ binaries/data/mods/public/simulation/components/tests/test_GuiInterface.js
@@ -580,7 +580,6 @@
"needsRepair": false,
"needsHeal": true,
"builder": true,
- "canGarrison": false,
"visibility": "visible",
"isBarterMarket":true,
"resourceTrickle": {
Index: binaries/data/mods/public/simulation/templates/template_unit.xml
===================================================================
--- binaries/data/mods/public/simulation/templates/template_unit.xml
+++ binaries/data/mods/public/simulation/templates/template_unit.xml
@@ -28,7 +28,9 @@
2.5
-
+
+ 1
+
corpse