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