Index: binaries/data/mods/public/simulation/components/ResourceSupply.js =================================================================== --- binaries/data/mods/public/simulation/components/ResourceSupply.js +++ binaries/data/mods/public/simulation/components/ResourceSupply.js @@ -3,18 +3,47 @@ ResourceSupply.prototype.Schema = "Provides a supply of one particular type of resource." + "" + - "1000" + + "1000" + + "1000" + "food.meat" + "false" + "25" + "0.8" + + "" + + "" + + "2" + + "1000" + + "" + + "" + + "alive" + + "2" + + "1000" + + "500" + + "" + + "" + + "dead notGathered" + + "-2" + + "1000" + + "" + + "" + + "dead" + + "-1" + + "1000" + + "500" + + "" + + "" + "" + "" + "" + "" + - "" + + "" + "Infinity" + "" + + "" + + "" + + "Infinity" + + "" + + "" + "" + Resources.BuildChoicesSchema(true, true) + "" + @@ -25,26 +54,79 @@ "" + "" + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "alive" + + "dead" + + "gathered" + + "notGathered" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + ""; ResourceSupply.prototype.Init = function() { - // Current resource amount (non-negative) - this.amount = this.GetMaxAmount(); + // Current resource amount (non-negative). + this.maxAmount = +this.template.Max; + this.amount = +(this.template.Initial || this.GetMaxAmount()); // List of IDs for each player this.gatherers = []; + this.activeGatherers = []; let numPlayers = Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager).GetNumPlayers(); for (let i = 0; i < numPlayers; ++i) + { this.gatherers.push([]); + this.activeGatherers.push([]); + } let [type, subtype] = this.template.Type.split('.'); this.cachedType = { "generic": type, "specific": subtype }; + + if (this.template.Change) + { + this.timers = {}; + this.cachedChanges = {}; + this.RecalculateValues(); + } }; ResourceSupply.prototype.IsInfinite = function() { - return !isFinite(+this.template.Amount); + return !isFinite(+this.template.Max); }; ResourceSupply.prototype.GetKillBeforeGather = function() @@ -54,7 +136,7 @@ ResourceSupply.prototype.GetMaxAmount = function() { - return +this.template.Amount; + return this.maxAmount; }; ResourceSupply.prototype.GetCurrentAmount = function() @@ -73,6 +155,14 @@ }; /** + * @return {int} - The number of currently active gatherers. + */ +ResourceSupply.prototype.GetNumActiveGatherers = function() +{ + return this.activeGatherers.reduce((a, b) => a + b.length, 0); +}; + +/** * @return {{ "generic": string, "specific": string }} An object containing the subtype and the generic type. All resources must have both. */ ResourceSupply.prototype.GetType = function() @@ -116,25 +206,57 @@ */ ResourceSupply.prototype.TakeResources = function(amount) { + if (this.IsInfinite()) + return { "amount": amount, "exhausted": false }; + + let oldAmount = this.GetCurrentAmount(); + this.Change(-amount); + + return { + "amount": oldAmount - this.GetCurrentAmount(), + "exhausted": this.amount == 0 + }; +}; + +/** + * Changes the amount of resources; posts messages when necessary and checks timers. + * + * @param {number} change - The amount to change the resources with (can be negative). + * @return {number} - The change in resourceSupply. + */ +ResourceSupply.prototype.Change = function(change) +{ // Before changing the amount, activate Fogging if necessary to hide changes let cmpFogging = Engine.QueryInterface(this.entity, IID_Fogging); if (cmpFogging) cmpFogging.Activate(); - if (this.IsInfinite()) - return { "amount": amount, "exhausted": false }; + let oldAmount = this.amount; + this.amount = Math.min(Math.max(oldAmount + change, 0), this.GetMaxAmount()); - let oldAmount = this.GetCurrentAmount(); - this.amount = Math.max(0, oldAmount - amount); - - let isExhausted = this.GetCurrentAmount() == 0; - // Remove entities that have been exhausted - if (isExhausted) + // Remove entities that have been exhausted. + if (this.amount == 0) Engine.DestroyEntity(this.entity); - Engine.PostMessage(this.entity, MT_ResourceSupplyChanged, { "from": oldAmount, "to": this.GetCurrentAmount() }); + // Do not send a message if the resource amount didn't change. + let actualChange = this.amount - oldAmount; + if (actualChange != 0) + Engine.PostMessage(this.entity, MT_ResourceSupplyChanged, { + "from": oldAmount, + "to": this.amount + }); + this.CheckTimers(); + return actualChange; +}; - return { "amount": oldAmount - this.GetCurrentAmount(), "exhausted": isExhausted }; +/** + * Sets the amount of resources to the new value. + * + * @param {number} newValue - The value to set. + */ +ResourceSupply.prototype.SetAmount = function(newValue) +{ + this.Change(newValue - this.amount); }; /** @@ -158,12 +280,41 @@ }; /** + * Declares this gatherer to be actively gathering. I.e. in the UnitAI-state of gathering. + * + * @param {number} player - The playerID owning the gatherer. + * @param {number} entity - The entityID gathering. + * + * @return {boolean} - Whether the gatherer was successfully added to the gatherers list. + */ +ResourceSupply.prototype.AddActiveGatherer = function(player, entity) +{ + if (!this.AddGatherer(player, entity)) + return false; + + if (this.activeGatherers[player].indexOf(entity) == -1) + this.activeGatherers[player].push(entity); +/* +warn("Add Active Gatherer:"); +warn(uneval(this.activeGatherers)); +warn(uneval(this.gatherers)); +*/ + this.CheckTimers(); + return true; +}; + +/** * @param {number} gathererID - The gatherer's entity id. * @param {number} player - The gatherer's player id. * @todo: Should this return false if the gatherer didn't gather from said resource? */ ResourceSupply.prototype.RemoveGatherer = function(gathererID, player) { +/* +warn(uneval("Remove Gatherer:")); +warn(uneval(this.activeGatherers)); +warn(uneval(this.gatherers)); +*/ // This can happen if the unit is dead if (player == undefined || player == INVALID_PLAYER) { @@ -174,12 +325,189 @@ } let index = this.gatherers[player].indexOf(gathererID); + if (index != -1) + { + this.gatherers[player].splice(index, 1); + // Broadcast message, mainly useful for the AIs. + Engine.PostMessage(this.entity, MT_ResourceSupplyNumGatherersChanged, { "to": this.GetNumGatherers() }); + } + + index = this.activeGatherers[player].indexOf(gathererID); if (index == -1) return; - this.gatherers[player].splice(index, 1); - // Broadcast message, mainly useful for the AIs. - Engine.PostMessage(this.entity, MT_ResourceSupplyNumGatherersChanged, { "to": this.GetNumGatherers() }); + this.activeGatherers[player].splice(index, 1); + this.CheckTimers(); +}; + +/** + * Checks whether a timer ought to be added or removed. + */ +ResourceSupply.prototype.CheckTimers = function() +{ + if (!this.timers || this.IsInfinite()) + return; +/* +warn(uneval("Check Timers:")); +warn(uneval(this.activeGatherers)); +warn(uneval(this.gatherers)); +*/ + for (let changeKey in this.template.Change) + { + if (!this.CheckState(changeKey)) + { + this.StopTimer(changeKey); + continue; + } + let template = this.template.Change[changeKey]; + if (this.amount < +(template.LowerLimit || -1) || + this.amount > +(template.UpperLimit || this.GetMaxAmount())) + { + this.StopTimer(changeKey); + continue; + } + + if (this.cachedChanges[changeKey] == 0) + { + this.StopTimer(changeKey) + continue; + } + + // We need a timer, add one if not present yet. + // If there is a change of 0, the timer will stop after the first run. + if (!this.timers[changeKey]) + this.AddTimer(changeKey); + } + +}; + +/** + * This verifies whether the current state of the supply matches the ones needed + * for the specific timer to run. + * + * @param {string} changeKey - The name of the Change to verify the state for. + * @return {boolean} - Whether the timer may run. + */ +ResourceSupply.prototype.CheckState = function(changeKey) +{ + let template = this.template.Change[changeKey]; + if (!template.State) + return true; + + let states = template.State.split(" "); + + let cmpHealth = Engine.QueryInterface(this.entity, IID_Health); + if (states.indexOf("alive") != -1 && !cmpHealth && states.indexOf("dead") == -1 || + states.indexOf("dead") != -1 && cmpHealth && states.indexOf("alive") == -1) + return false; + + let activeGatherers = this.GetNumActiveGatherers(); + if (states.indexOf("gathered") != -1 && activeGatherers == 0 && states.indexOf("notGathered") == -1 || + states.indexOf("notGathered") != -1 && activeGatherers > 0 && states.indexOf("gathered") == -1) + return false; + + return true; +}; + +/** + * @param {string} changeKey - The name of the Change to apply to the entity. + */ +ResourceSupply.prototype.AddTimer = function(changeKey) +{ + if (this.timers[changeKey]) + return; + + let cmpTimer = Engine.QueryInterface(SYSTEM_ENTITY, IID_Timer); + let interval = ApplyValueModificationsToEntity("ResourceSupply/Change/" + changeKey + "/Interval", +(this.template.Change[changeKey].Interval || 1000), this.entity); + this.timers[changeKey] = cmpTimer.SetInterval(this.entity, IID_ResourceSupply, "TimerTick", interval, interval, changeKey); +}; + +/** + * @param {string} changeKey - The name of the change to stop the timer for. + */ +ResourceSupply.prototype.StopTimer = function(changeKey) +{ + if (!this.timers[changeKey]) + return; + + let cmpTimer = Engine.QueryInterface(SYSTEM_ENTITY, IID_Timer); + cmpTimer.CancelTimer(this.timers[changeKey]); + delete this.timers[changeKey]; +}; + +/** + * @param {string} changeKey - The name of the change to apply to the entity. + */ +ResourceSupply.prototype.TimerTick = function(changeKey) +{ + let template = this.template.Change[changeKey]; + if (!template) + { + this.StopTimer(changeKey); + return; + } + + if (this.Change(this.cachedChanges[changeKey]) == 0) + this.StopTimer(changeKey); +}; + +/** + * Since the supposed changes can be affected by modifications, and applying those + * are slow, do not calculate them every timer tick. + */ +ResourceSupply.prototype.RecalculateValues = function() +{ + this.maxAmount = ApplyValueModificationsToEntity("ResourceSupply/Max", +this.template.Max, this.entity); + // Can't change when infinite. + if (!this.timers || this.IsInfinite()) + return; + + for (let changeKey in this.template.Change) + this.cachedChanges[changeKey] = ApplyValueModificationsToEntity("ResourceSupply/Change/" + changeKey + "/Value", +this.template.Change[changeKey].Value, this.entity); + + this.CheckTimers(); +}; + +/** + * @param {{ "component": string, "valueNames": string[] }} msg - Message containing a list of values that were changed. + */ +ResourceSupply.prototype.OnValueModification = function(msg) +{ + if (msg.component != "ResourceSupply") + return; + + if (!this.timers || this.IsInfinite()) + return; + + this.RecalculateValues(); +}; + +/** + * @param {{ "from": int, "to": int }} msg - Message containing the old new owner. + */ +ResourceSupply.prototype.OnOwnershipChanged = function(msg) +{ + if (msg.to == INVALID_PLAYER) + { + let cmpTimer = Engine.QueryInterface(SYSTEM_ENTITY, IID_Timer); + for (let changeKey in this.timers) + cmpTimer.CancelTimer(this.timers[changeKey]); + } + + if (!this.timers || this.IsInfinite()) + return; + + this.RecalculateValues(); +}; + +/** + * @param {{ "entity": int, "newentity": int }} msg - Message to what the entity has been renamed. + */ +ResourceSupply.prototype.OnEntityRenamed = function(msg) +{ + let cmpResourceSupplyNew = Engine.QueryInterface(msg.newentity, IID_ResourceSupply); + if (cmpResourceSupplyNew) + cmpResourceSupplyNew.SetAmount(this.GetCurrentAmount()); }; Engine.RegisterComponentType(IID_ResourceSupply, "ResourceSupply", ResourceSupply); Index: binaries/data/mods/public/simulation/components/UnitAI.js =================================================================== --- binaries/data/mods/public/simulation/components/UnitAI.js +++ binaries/data/mods/public/simulation/components/UnitAI.js @@ -2236,7 +2236,7 @@ let cmpSupply; if (cmpOwnership) cmpSupply = Engine.QueryInterface(this.gatheringTarget, IID_ResourceSupply); - if (!cmpSupply || !cmpSupply.AddGatherer(cmpOwnership.GetOwner(), this.entity)) + if (!cmpSupply || !cmpSupply.AddActiveGatherer(cmpOwnership.GetOwner(), this.entity)) { this.SetNextState("FINDINGNEWTARGET"); return true; Index: binaries/data/mods/public/simulation/components/tests/test_ResourceSupply.js =================================================================== --- binaries/data/mods/public/simulation/components/tests/test_ResourceSupply.js +++ binaries/data/mods/public/simulation/components/tests/test_ResourceSupply.js @@ -11,10 +11,15 @@ } }; +Engine.LoadHelperScript("ValueModification.js"); +Engine.LoadComponentScript("interfaces/Health.js"); +Engine.LoadComponentScript("interfaces/ModifiersManager.js"); Engine.LoadComponentScript("interfaces/ResourceSupply.js"); +Engine.LoadComponentScript("interfaces/Timer.js"); Engine.LoadComponentScript("ResourceSupply.js"); +Engine.LoadComponentScript("Timer.js"); -const entity = 60; +let entity = 60; AddMock(SYSTEM_ENTITY, IID_PlayerManager, { "GetNumPlayers": () => 3 @@ -25,7 +30,8 @@ }); let template = { - "Amount": 1000, + "Max": 1001, + "Initial": 1000, "Type": "food.meat", "KillBeforeGather": false, "MaxGatherers": 2 @@ -37,7 +43,7 @@ TS_ASSERT(!cmpResourceSupply.GetKillBeforeGather()); -TS_ASSERT_EQUALS(cmpResourceSupply.GetMaxAmount(), 1000); +TS_ASSERT_EQUALS(cmpResourceSupply.GetMaxAmount(), 1001); TS_ASSERT_EQUALS(cmpResourceSupply.GetMaxGatherers(), 2); @@ -63,6 +69,12 @@ cmpResourceSupply.RemoveGatherer(70, 1); TS_ASSERT_EQUALS(cmpResourceSupply.GetNumGatherers(), 1); +TS_ASSERT(cmpResourceSupply.AddActiveGatherer(1, 70)); +TS_ASSERT_EQUALS(cmpResourceSupply.GetNumGatherers(), 2); + +cmpResourceSupply.RemoveGatherer(70, 1); +TS_ASSERT_EQUALS(cmpResourceSupply.GetNumGatherers(), 1); + TS_ASSERT_UNEVAL_EQUALS(cmpResourceSupply.GetCurrentAmount(), 1000); TS_ASSERT_UNEVAL_EQUALS(cmpResourceSupply.TakeResources(300), { "amount": 300, "exhausted": false }); TS_ASSERT_EQUALS(cmpResourceSupply.GetCurrentAmount(), 700); @@ -72,3 +84,664 @@ TS_ASSERT_EQUALS(cmpResourceSupply.GetCurrentAmount(), 0); // The resource is not available when exhausted TS_ASSERT(!cmpResourceSupply.IsAvailable(1, 70)); +cmpResourceSupply.RemoveGatherer(71, 1); +TS_ASSERT_EQUALS(cmpResourceSupply.GetNumGatherers(), 0); + + +// Test Change // + +let cmpTimer; +let resourceSupply; +function reset(template) +{ + cmpTimer = ConstructComponent(SYSTEM_ENTITY, "Timer"); + resourceSupply = ConstructComponent(entity, "ResourceSupply", template); +} + +// Decay. +template = { + "Max": 1000, + "Type": "food.meat", + "KillBeforeGather": false, + "Change": { + "Rotting": { + "Value": -1, + "Interval": 1000 + } + }, + "MaxGatherers": 2 +}; +reset(template); +TS_ASSERT_EQUALS(resourceSupply.GetCurrentAmount(), 1000); +cmpTimer.OnUpdate({ "turnLength": 1 }); +TS_ASSERT_EQUALS(resourceSupply.GetCurrentAmount(), 999); +cmpTimer.OnUpdate({ "turnLength": 5 }); +TS_ASSERT_EQUALS(resourceSupply.GetCurrentAmount(), 994); + +// Decay with minimum. +template = { + "Max": 1000, + "Type": "food.meat", + "KillBeforeGather": false, + "Change": { + "Rotting": { + "Value": -1, + "Interval": 1000, + "LowerLimit": 997 + } + }, + "MaxGatherers": 2 +}; +reset(template); +TS_ASSERT_EQUALS(resourceSupply.GetCurrentAmount(), 1000); +cmpTimer.OnUpdate({ "turnLength": 3 }); +TS_ASSERT_EQUALS(resourceSupply.GetCurrentAmount(), 997); +cmpTimer.OnUpdate({ "turnLength": 1 }); +TS_ASSERT_EQUALS(resourceSupply.GetCurrentAmount(), 996); +cmpTimer.OnUpdate({ "turnLength": 1 }); +TS_ASSERT_EQUALS(resourceSupply.GetCurrentAmount(), 996); + +// Decay with maximum. +template = { + "Max": 1000, + "Type": "food.meat", + "KillBeforeGather": false, + "Change": { + "Rotting": { + "Value": -1, + "Interval": 1000, + "UpperLimit": 995 + } + }, + "MaxGatherers": 2 +}; +reset(template); +TS_ASSERT_EQUALS(resourceSupply.GetCurrentAmount(), 1000); +cmpTimer.OnUpdate({ "turnLength": 1 }); +TS_ASSERT_EQUALS(resourceSupply.GetCurrentAmount(), 1000); + +// Decay with minimum and maximum. +template = { + "Max": 1000, + "Type": "food.meat", + "KillBeforeGather": false, + "Change": { + "Rotting": { + "Value": -1, + "Interval": 1000, + "UpperLimit": 995, + "LowerLimit": 990 + } + }, + "MaxGatherers": 2 +}; +reset(template); +TS_ASSERT_EQUALS(resourceSupply.GetCurrentAmount(), 1000); +cmpTimer.OnUpdate({ "turnLength": 1 }); +TS_ASSERT_EQUALS(resourceSupply.GetCurrentAmount(), 1000); +resourceSupply.TakeResources(6); +TS_ASSERT_EQUALS(resourceSupply.GetCurrentAmount(), 994); +cmpTimer.OnUpdate({ "turnLength": 10 }); +TS_ASSERT_EQUALS(resourceSupply.GetCurrentAmount(), 989); + +// Growth. +template = { + "Initial": 995, + "Max": 1000, + "Type": "food.meat", + "KillBeforeGather": false, + "Change": { + "Growth": { + "Value": 1, + "Interval": 1000 + } + }, + "MaxGatherers": 2 +}; +reset(template); +TS_ASSERT_EQUALS(resourceSupply.GetCurrentAmount(), 995); +cmpTimer.OnUpdate({ "turnLength": 1 }); +TS_ASSERT_EQUALS(resourceSupply.GetCurrentAmount(), 996); +cmpTimer.OnUpdate({ "turnLength": 5 }); +TS_ASSERT_EQUALS(resourceSupply.GetCurrentAmount(), 1000); + +// Growth with minimum. +template = { + "Initial": 995, + "Max": 1000, + "Type": "food.meat", + "KillBeforeGather": false, + "Change": { + "Growth": { + "Value": 1, + "Interval": 1000, + "LowerLimit": 997 + } + }, + "MaxGatherers": 2 +}; +reset(template); +TS_ASSERT_EQUALS(resourceSupply.GetCurrentAmount(), 995); +cmpTimer.OnUpdate({ "turnLength": 1 }); +TS_ASSERT_EQUALS(resourceSupply.GetCurrentAmount(), 995); + +// Growth with maximum. +template = { + "Initial": 994, + "Max": 1000, + "Type": "food.meat", + "KillBeforeGather": false, + "Change": { + "Growth": { + "Value": 1, + "Interval": 1000, + "UpperLimit": 995 + } + }, + "MaxGatherers": 2 +}; +reset(template); +TS_ASSERT_EQUALS(resourceSupply.GetCurrentAmount(), 994); +cmpTimer.OnUpdate({ "turnLength": 1 }); +TS_ASSERT_EQUALS(resourceSupply.GetCurrentAmount(), 995); +cmpTimer.OnUpdate({ "turnLength": 1 }); +TS_ASSERT_EQUALS(resourceSupply.GetCurrentAmount(), 996); +cmpTimer.OnUpdate({ "turnLength": 1 }); +TS_ASSERT_EQUALS(resourceSupply.GetCurrentAmount(), 996); + +// Growth with minimum and maximum. +template = { + "Initial": 990, + "Max": 1000, + "Type": "food.meat", + "KillBeforeGather": false, + "Change": { + "Growth": { + "Value": 1, + "Interval": 1000, + "UpperLimit": 995, + "LowerLimit": 990 + } + }, + "MaxGatherers": 2 +}; +reset(template); +TS_ASSERT_EQUALS(resourceSupply.GetCurrentAmount(), 990); +cmpTimer.OnUpdate({ "turnLength": 1 }); +TS_ASSERT_EQUALS(resourceSupply.GetCurrentAmount(), 991); +cmpTimer.OnUpdate({ "turnLength": 8 }); +TS_ASSERT_EQUALS(resourceSupply.GetCurrentAmount(), 996); + +// Growth when resources are taken again. +template = { + "Initial": 995, + "Max": 1000, + "Type": "food.meat", + "KillBeforeGather": false, + "Change": { + "Growth": { + "Value": 1, + "Interval": 1000 + } + }, + "MaxGatherers": 2 +}; +reset(template); +TS_ASSERT_EQUALS(resourceSupply.GetCurrentAmount(), 995); +cmpTimer.OnUpdate({ "turnLength": 1 }); +TS_ASSERT_EQUALS(resourceSupply.GetCurrentAmount(), 996); +resourceSupply.TakeResources(6); +TS_ASSERT_EQUALS(resourceSupply.GetCurrentAmount(), 990); +cmpTimer.OnUpdate({ "turnLength": 5 }); +TS_ASSERT_EQUALS(resourceSupply.GetCurrentAmount(), 995); + +// Decay when dead. +template = { + "Max": 10, + "Type": "food.meat", + "KillBeforeGather": false, + "Change": { + "Rotting": { + "Value": -1, + "Interval": 1000, + "State": "dead" + } + }, + "MaxGatherers": 2 +}; +reset(template); +TS_ASSERT_EQUALS(resourceSupply.GetCurrentAmount(), 10); +cmpTimer.OnUpdate({ "turnLength": 1 }); +TS_ASSERT_EQUALS(resourceSupply.GetCurrentAmount(), 9); + +// No growth when dead. +template = { + "Max": 10, + "Initial": 5, + "Type": "food.meat", + "KillBeforeGather": false, + "Change": { + "Growth": { + "Value": 1, + "Interval": 1000, + "State": "alive" + } + }, + "MaxGatherers": 2 +}; +reset(template); + +TS_ASSERT_EQUALS(resourceSupply.GetCurrentAmount(), 5); +cmpTimer.OnUpdate({ "turnLength": 1 }); +TS_ASSERT_EQUALS(resourceSupply.GetCurrentAmount(), 5); + +// Decay when dead or alive. +template = { + "Max": 10, + "Type": "food.meat", + "KillBeforeGather": false, + "Change": { + "Rotting": { + "Value": -1, + "Interval": 1000, + "State": "dead alive" + } + }, + "MaxGatherers": 2 +}; +reset(template); +TS_ASSERT_EQUALS(resourceSupply.GetCurrentAmount(), 10); +cmpTimer.OnUpdate({ "turnLength": 1 }); +TS_ASSERT_EQUALS(resourceSupply.GetCurrentAmount(), 9); + +AddMock(entity, IID_Health, { }); // Bring the entity to life. + +cmpTimer.OnUpdate({ "turnLength": 1 }); +TS_ASSERT_EQUALS(resourceSupply.GetCurrentAmount(), 8); + +// No decay when alive. +template = { + "Max": 10, + "Type": "food.meat", + "KillBeforeGather": false, + "Change": { + "Rotting": { + "Value": -1, + "Interval": 1000, + "State": "dead" + } + }, + "MaxGatherers": 2 +}; +reset(template); + +TS_ASSERT_EQUALS(resourceSupply.GetCurrentAmount(), 10); +cmpTimer.OnUpdate({ "turnLength": 1 }); +TS_ASSERT_EQUALS(resourceSupply.GetCurrentAmount(), 10); + +// Growth when alive. +template = { + "Max": 10, + "Initial": 5, + "Type": "food.meat", + "KillBeforeGather": false, + "Change": { + "Growth": { + "Value": 1, + "Interval": 1000, + "State": "alive" + } + }, + "MaxGatherers": 2 +}; +reset(template); + +TS_ASSERT_EQUALS(resourceSupply.GetCurrentAmount(), 5); +cmpTimer.OnUpdate({ "turnLength": 1 }); +TS_ASSERT_EQUALS(resourceSupply.GetCurrentAmount(), 6); + +// Growth when dead or alive. +template = { + "Max": 10, + "Initial": 5, + "Type": "food.meat", + "KillBeforeGather": false, + "Change": { + "Growth": { + "Value": 1, + "Interval": 1000, + "State": "dead alive" + } + }, + "MaxGatherers": 2 +}; +reset(template); +TS_ASSERT_EQUALS(resourceSupply.GetCurrentAmount(), 5); +cmpTimer.OnUpdate({ "turnLength": 1 }); +TS_ASSERT_EQUALS(resourceSupply.GetCurrentAmount(), 6); + +DeleteMock(entity, IID_Health); // "Kill" the entity. + +cmpTimer.OnUpdate({ "turnLength": 1 }); +TS_ASSERT_EQUALS(resourceSupply.GetCurrentAmount(), 7); + +// Decay *and* growth. +template = { + "Max": 1000, + "Type": "food.meat", + "KillBeforeGather": false, + "Change": { + "Rotting": { + "Value": -1, + "Interval": 1000 + }, + "Growth": { + "Value": 1, + "Interval": 1000 + } + }, + "MaxGatherers": 2 +}; +reset(template); +TS_ASSERT_EQUALS(resourceSupply.GetCurrentAmount(), 1000); +cmpTimer.OnUpdate({ "turnLength": 1 }); +TS_ASSERT_EQUALS(resourceSupply.GetCurrentAmount(), 1000); + +// Decay *and* growth with different health states. +template = { + "Max": 10, + "Initial": 5, + "Type": "food.meat", + "KillBeforeGather": false, + "Change": { + "Rotting": { + "Value": -1, + "Interval": 1000, + "State": "dead" + }, + "Growth": { + "Value": 1, + "Interval": 1000, + "State": "alive" + } + }, + "MaxGatherers": 2 +}; +AddMock(entity, IID_Health, { }); // Bring the entity to life. +reset(template); +TS_ASSERT_EQUALS(resourceSupply.GetCurrentAmount(), 5); +cmpTimer.OnUpdate({ "turnLength": 1 }); +TS_ASSERT_EQUALS(resourceSupply.GetCurrentAmount(), 6); +DeleteMock(entity, IID_Health); // "Kill" the entity. +// We overshoot one due to lateness. +cmpTimer.OnUpdate({ "turnLength": 1 }); +TS_ASSERT_EQUALS(resourceSupply.GetCurrentAmount(), 7); + +cmpTimer.OnUpdate({ "turnLength": 1 }); +TS_ASSERT_EQUALS(resourceSupply.GetCurrentAmount(), 6); +cmpTimer.OnUpdate({ "turnLength": 1 }); +TS_ASSERT_EQUALS(resourceSupply.GetCurrentAmount(), 5); + +// Two effects with different limits. +template = { + "Max": 20, + "Initial": 5, + "Type": "food.meat", + "KillBeforeGather": false, + "Change": { + "SuperGrowth": { + "Value": 2, + "Interval": 1000, + "UpperLimit": 8 + }, + "Growth": { + "Value": 1, + "Interval": 1000, + "UpperLimit": 12 + } + }, + "MaxGatherers": 2 +}; +reset(template); +TS_ASSERT_EQUALS(resourceSupply.GetCurrentAmount(), 5); +cmpTimer.OnUpdate({ "turnLength": 1 }); +TS_ASSERT_EQUALS(resourceSupply.GetCurrentAmount(), 8); +cmpTimer.OnUpdate({ "turnLength": 1 }); +TS_ASSERT_EQUALS(resourceSupply.GetCurrentAmount(), 11); +cmpTimer.OnUpdate({ "turnLength": 1 }); +TS_ASSERT_EQUALS(resourceSupply.GetCurrentAmount(), 12); +cmpTimer.OnUpdate({ "turnLength": 1 }); +TS_ASSERT_EQUALS(resourceSupply.GetCurrentAmount(), 13); +cmpTimer.OnUpdate({ "turnLength": 1 }); +TS_ASSERT_EQUALS(resourceSupply.GetCurrentAmount(), 13); + +// Two effects with different limits. +// This in an interesting case, where the order of the changes matters. +template = { + "Max": 20, + "Initial": 5, + "Type": "food.meat", + "KillBeforeGather": false, + "Change": { + "Growth": { + "Value": 1, + "Interval": 1000, + "UpperLimit": 12 + }, + "SuperGrowth": { + "Value": 2, + "Interval": 1000, + "UpperLimit": 8 + } + }, + "MaxGatherers": 2 +}; +reset(template); +TS_ASSERT_EQUALS(resourceSupply.GetCurrentAmount(), 5); +cmpTimer.OnUpdate({ "turnLength": 1 }); +TS_ASSERT_EQUALS(resourceSupply.GetCurrentAmount(), 8); +cmpTimer.OnUpdate({ "turnLength": 1 }); +TS_ASSERT_EQUALS(resourceSupply.GetCurrentAmount(), 9); +cmpTimer.OnUpdate({ "turnLength": 5 }); +TS_ASSERT_EQUALS(resourceSupply.GetCurrentAmount(), 13); + +// Infinity with growth. +template = { + "Max": Infinity, + "Type": "food.meat", + "KillBeforeGather": false, + "Change": { + "Growth": { + "Value": 1, + "Interval": 1000 + } + }, + "MaxGatherers": 2 +}; +reset(template); +TS_ASSERT_EQUALS(resourceSupply.GetCurrentAmount(), Infinity); +cmpTimer.OnUpdate({ "turnLength": 1 }); +TS_ASSERT_EQUALS(resourceSupply.GetCurrentAmount(), Infinity); + +// Infinity with decay. +template = { + "Max": Infinity, + "Type": "food.meat", + "KillBeforeGather": false, + "Change": { + "Decay": { + "Value": -1, + "Interval": 1000 + } + }, + "MaxGatherers": 2 +}; +reset(template); +TS_ASSERT_EQUALS(resourceSupply.GetCurrentAmount(), Infinity); +cmpTimer.OnUpdate({ "turnLength": 1 }); +TS_ASSERT_EQUALS(resourceSupply.GetCurrentAmount(), Infinity); + +// Decay when not gathered. +template = { + "Max": 10, + "Type": "food.meat", + "KillBeforeGather": false, + "Change": { + "ttt": { + "Value": -1, + "Interval": 1000, + "State": "notGathered" + } + }, + "MaxGatherers": 2 +}; + warn("Before init"); +reset(template); + warn("After init"); +TS_ASSERT_EQUALS(resourceSupply.GetCurrentAmount(), 10); +cmpTimer.OnUpdate({ "turnLength": 1 }); +TS_ASSERT_EQUALS(resourceSupply.GetCurrentAmount(), 9); + warn("before added gatherer"); +TS_ASSERT(resourceSupply.AddActiveGatherer(1, 70)); + warn("After added gatherer"); +cmpTimer.OnUpdate({ "turnLength": 1 }); + warn("after one turn length"); +TS_ASSERT_EQUALS(resourceSupply.GetCurrentAmount(), 9); + warn("before removing gatherer"); +cmpResourceSupply.RemoveGatherer(70, 1); + warn("after removing gatherer"); +cmpTimer.OnUpdate({ "turnLength": 1 }); +TS_ASSERT_EQUALS(resourceSupply.GetCurrentAmount(), 8); +cmpTimer.OnUpdate({ "turnLength": 1 }); +TS_ASSERT_EQUALS(resourceSupply.GetCurrentAmount(), 8); + +// Grow when gathered. +template = { + "Max": 10, + "Initial": 5, + "Type": "food.meat", + "KillBeforeGather": false, + "Change": { + "Growth": { + "Value": 1, + "Interval": 1000, + "State": "gathered" + } + }, + "MaxGatherers": 2 +}; +reset(template); +TS_ASSERT_EQUALS(resourceSupply.GetCurrentAmount(), 5); +cmpTimer.OnUpdate({ "turnLength": 1 }); +TS_ASSERT_EQUALS(resourceSupply.GetCurrentAmount(), 5); +TS_ASSERT(resourceSupply.AddActiveGatherer(1, 70)); +cmpTimer.OnUpdate({ "turnLength": 1 }); +TS_ASSERT_EQUALS(resourceSupply.GetCurrentAmount(), 6); +cmpTimer.OnUpdate({ "turnLength": 1 }); +TS_ASSERT_EQUALS(resourceSupply.GetCurrentAmount(), 7); +cmpResourceSupply.RemoveGatherer(70, 1); +cmpTimer.OnUpdate({ "turnLength": 1 }); +TS_ASSERT_EQUALS(resourceSupply.GetCurrentAmount(), 7); +cmpTimer.OnUpdate({ "turnLength": 1 }); +TS_ASSERT_EQUALS(resourceSupply.GetCurrentAmount(), 7); + +// Grow when gathered or not. +template = { + "Max": 10, + "Initial": 5, + "Type": "food.meat", + "KillBeforeGather": false, + "Change": { + "Growth": { + "Value": 1, + "Interval": 1000, + "State": "notGathered gathered" + } + }, + "MaxGatherers": 2 +}; +reset(template); +TS_ASSERT_EQUALS(resourceSupply.GetCurrentAmount(), 5); +cmpTimer.OnUpdate({ "turnLength": 1 }); +TS_ASSERT_EQUALS(resourceSupply.GetCurrentAmount(), 6); +TS_ASSERT(resourceSupply.AddActiveGatherer(1, 70)); +cmpTimer.OnUpdate({ "turnLength": 1 }); +TS_ASSERT_EQUALS(resourceSupply.GetCurrentAmount(), 7); +cmpTimer.OnUpdate({ "turnLength": 1 }); +TS_ASSERT_EQUALS(resourceSupply.GetCurrentAmount(), 8); +cmpResourceSupply.RemoveGatherer(70, 1); +cmpTimer.OnUpdate({ "turnLength": 1 }); +TS_ASSERT_EQUALS(resourceSupply.GetCurrentAmount(), 9); + +// Grow when gathered and alive. +template = { + "Max": 10, + "Initial": 5, + "Type": "food.meat", + "KillBeforeGather": false, + "Change": { + "Growth": { + "Value": 1, + "Interval": 1000, + "State": "alive gathered" + } + }, + "MaxGatherers": 2 +}; +reset(template); +TS_ASSERT_EQUALS(resourceSupply.GetCurrentAmount(), 5); +cmpTimer.OnUpdate({ "turnLength": 1 }); +TS_ASSERT_EQUALS(resourceSupply.GetCurrentAmount(), 5); +TS_ASSERT(resourceSupply.AddActiveGatherer(1, 70)); +cmpTimer.OnUpdate({ "turnLength": 1 }); +TS_ASSERT_EQUALS(resourceSupply.GetCurrentAmount(), 5); +AddMock(entity, IID_Health, { }); // Bring the entity to life. +resourceSupply.CheckTimers(); // No other way to tell we've come to life. +cmpTimer.OnUpdate({ "turnLength": 1 }); +TS_ASSERT_EQUALS(resourceSupply.GetCurrentAmount(), 6); +cmpTimer.OnUpdate({ "turnLength": 1 }); +TS_ASSERT_EQUALS(resourceSupply.GetCurrentAmount(), 7); +cmpResourceSupply.RemoveGatherer(70, 1); +cmpTimer.OnUpdate({ "turnLength": 1 }); +TS_ASSERT_EQUALS(resourceSupply.GetCurrentAmount(), 7); +DeleteMock(entity, IID_Health); // "Kill" the entity. +cmpTimer.OnUpdate({ "turnLength": 1 }); +TS_ASSERT_EQUALS(resourceSupply.GetCurrentAmount(), 7); + +// Decay when dead and not gathered. +template = { + "Max": 10, + "Initial": 5, + "Type": "food.meat", + "KillBeforeGather": false, + "Change": { + "Decay": { + "Value": -1, + "Interval": 1000, + "State": "dead notGathered" + } + }, + "MaxGatherers": 2 +}; +reset(template); +TS_ASSERT_EQUALS(resourceSupply.GetCurrentAmount(), 5); +cmpTimer.OnUpdate({ "turnLength": 1 }); +TS_ASSERT_EQUALS(resourceSupply.GetCurrentAmount(), 4); +TS_ASSERT(resourceSupply.AddActiveGatherer(1, 70)); +cmpTimer.OnUpdate({ "turnLength": 1 }); +TS_ASSERT_EQUALS(resourceSupply.GetCurrentAmount(), 4); +AddMock(entity, IID_Health, { }); // Bring the entity to life. +resourceSupply.CheckTimers(); // No other way to tell we've come to life. +cmpTimer.OnUpdate({ "turnLength": 1 }); +TS_ASSERT_EQUALS(resourceSupply.GetCurrentAmount(), 4); +cmpTimer.OnUpdate({ "turnLength": 1 }); +TS_ASSERT_EQUALS(resourceSupply.GetCurrentAmount(), 4); +cmpResourceSupply.RemoveGatherer(70, 1); +cmpTimer.OnUpdate({ "turnLength": 1 }); +TS_ASSERT_EQUALS(resourceSupply.GetCurrentAmount(), 4); +DeleteMock(entity, IID_Health); // "Kill" the entity. +resourceSupply.CheckTimers(); // No other way to tell we've died. +cmpTimer.OnUpdate({ "turnLength": 1 }); +TS_ASSERT_EQUALS(resourceSupply.GetCurrentAmount(), 3); +cmpTimer.OnUpdate({ "turnLength": 1 }); +TS_ASSERT_EQUALS(resourceSupply.GetCurrentAmount(), 3); Index: binaries/data/mods/public/simulation/data/auras/structures/corral.json =================================================================== --- /dev/null +++ binaries/data/mods/public/simulation/data/auras/structures/corral.json @@ -0,0 +1,11 @@ +{ + "type": "range", + "radius": 20, + "affects": ["Unit"], + "modifications": [ + { "value": "ResourceSupply/Change/Fatten/Value", "multiply": 2 } + ], + "auraDescription" : "Herdables +100% growth rate.", + "auraName": "Growing bonus", + "overlayIcon": "art/textures/ui/session/auras/farming.png" +} Index: binaries/data/mods/public/simulation/templates/gaia/fauna_bear.xml =================================================================== --- binaries/data/mods/public/simulation/templates/gaia/fauna_bear.xml +++ binaries/data/mods/public/simulation/templates/gaia/fauna_bear.xml @@ -24,7 +24,7 @@ pitch - 300 + 300 food.meat Index: binaries/data/mods/public/simulation/templates/gaia/fauna_boar.xml =================================================================== --- binaries/data/mods/public/simulation/templates/gaia/fauna_boar.xml +++ binaries/data/mods/public/simulation/templates/gaia/fauna_boar.xml @@ -24,7 +24,7 @@ pitch - 150 + 150 food.meat Index: binaries/data/mods/public/simulation/templates/gaia/fauna_camel.xml =================================================================== --- binaries/data/mods/public/simulation/templates/gaia/fauna_camel.xml +++ binaries/data/mods/public/simulation/templates/gaia/fauna_camel.xml @@ -13,7 +13,7 @@ pitch - 200 + 200 Index: binaries/data/mods/public/simulation/templates/gaia/fauna_chicken.xml =================================================================== --- binaries/data/mods/public/simulation/templates/gaia/fauna_chicken.xml +++ binaries/data/mods/public/simulation/templates/gaia/fauna_chicken.xml @@ -16,9 +16,22 @@ false - 40 + 800 + 400 food.meat 5 + + + 1 + 1000 + alive + + + -10 + 1000 + dead notGathered + + Index: binaries/data/mods/public/simulation/templates/gaia/fauna_elephant_african_bush.xml =================================================================== --- binaries/data/mods/public/simulation/templates/gaia/fauna_elephant_african_bush.xml +++ binaries/data/mods/public/simulation/templates/gaia/fauna_elephant_african_bush.xml @@ -16,7 +16,7 @@ 75 - 800 + 800 food.meat Index: binaries/data/mods/public/simulation/templates/gaia/fauna_elephant_asian.xml =================================================================== --- binaries/data/mods/public/simulation/templates/gaia/fauna_elephant_asian.xml +++ binaries/data/mods/public/simulation/templates/gaia/fauna_elephant_asian.xml @@ -16,7 +16,7 @@ 60 - 650 + 650 food.meat Index: binaries/data/mods/public/simulation/templates/gaia/fauna_elephant_north_african.xml =================================================================== --- binaries/data/mods/public/simulation/templates/gaia/fauna_elephant_north_african.xml +++ binaries/data/mods/public/simulation/templates/gaia/fauna_elephant_north_african.xml @@ -16,7 +16,7 @@ 50 - 500 + 500 food.meat Index: binaries/data/mods/public/simulation/templates/gaia/fauna_giraffe.xml =================================================================== --- binaries/data/mods/public/simulation/templates/gaia/fauna_giraffe.xml +++ binaries/data/mods/public/simulation/templates/gaia/fauna_giraffe.xml @@ -16,7 +16,7 @@ pitch - 350 + 350 food.meat Index: binaries/data/mods/public/simulation/templates/gaia/fauna_giraffe_infant.xml =================================================================== --- binaries/data/mods/public/simulation/templates/gaia/fauna_giraffe_infant.xml +++ binaries/data/mods/public/simulation/templates/gaia/fauna_giraffe_infant.xml @@ -13,7 +13,7 @@ pitch - 150 + 150 food.meat Index: binaries/data/mods/public/simulation/templates/gaia/fauna_goat.xml =================================================================== --- binaries/data/mods/public/simulation/templates/gaia/fauna_goat.xml +++ binaries/data/mods/public/simulation/templates/gaia/fauna_goat.xml @@ -13,7 +13,7 @@ pitch - 100 + 100 food.meat 6 Index: binaries/data/mods/public/simulation/templates/gaia/fauna_horse.xml =================================================================== --- binaries/data/mods/public/simulation/templates/gaia/fauna_horse.xml +++ binaries/data/mods/public/simulation/templates/gaia/fauna_horse.xml @@ -13,7 +13,7 @@ pitch - 200 + 200 Index: binaries/data/mods/public/simulation/templates/gaia/fauna_muskox.xml =================================================================== --- binaries/data/mods/public/simulation/templates/gaia/fauna_muskox.xml +++ binaries/data/mods/public/simulation/templates/gaia/fauna_muskox.xml @@ -13,7 +13,7 @@ pitch - 200 + 200 food.meat Index: binaries/data/mods/public/simulation/templates/gaia/fauna_peacock.xml =================================================================== --- binaries/data/mods/public/simulation/templates/gaia/fauna_peacock.xml +++ binaries/data/mods/public/simulation/templates/gaia/fauna_peacock.xml @@ -9,7 +9,7 @@ gaia/fauna_peacock.png - 50 + 50 food.meat 5 Index: binaries/data/mods/public/simulation/templates/gaia/fauna_piglet.xml =================================================================== --- binaries/data/mods/public/simulation/templates/gaia/fauna_piglet.xml +++ binaries/data/mods/public/simulation/templates/gaia/fauna_piglet.xml @@ -9,7 +9,7 @@ true - 10 + 10 food.meat 1 Index: binaries/data/mods/public/simulation/templates/gaia/fauna_rabbit.xml =================================================================== --- binaries/data/mods/public/simulation/templates/gaia/fauna_rabbit.xml +++ binaries/data/mods/public/simulation/templates/gaia/fauna_rabbit.xml @@ -19,7 +19,7 @@ pitch - 50 + 50 food.meat Index: binaries/data/mods/public/simulation/templates/gaia/fauna_rhino.xml =================================================================== --- binaries/data/mods/public/simulation/templates/gaia/fauna_rhino.xml +++ binaries/data/mods/public/simulation/templates/gaia/fauna_rhino.xml @@ -24,7 +24,7 @@ pitch - 300 + 300 food.meat Index: binaries/data/mods/public/simulation/templates/gaia/fauna_walrus.xml =================================================================== --- binaries/data/mods/public/simulation/templates/gaia/fauna_walrus.xml +++ binaries/data/mods/public/simulation/templates/gaia/fauna_walrus.xml @@ -31,7 +31,7 @@ pitch - 300 + 300 food.meat Index: binaries/data/mods/public/simulation/templates/gaia/fauna_wildebeest.xml =================================================================== --- binaries/data/mods/public/simulation/templates/gaia/fauna_wildebeest.xml +++ binaries/data/mods/public/simulation/templates/gaia/fauna_wildebeest.xml @@ -13,7 +13,7 @@ pitch - 150 + 150 food.meat Index: binaries/data/mods/public/simulation/templates/gaia/fauna_zebra.xml =================================================================== --- binaries/data/mods/public/simulation/templates/gaia/fauna_zebra.xml +++ binaries/data/mods/public/simulation/templates/gaia/fauna_zebra.xml @@ -13,7 +13,7 @@ pitch - 150 + 150 food.meat Index: binaries/data/mods/public/simulation/templates/gaia/flora_bush_badlands.xml =================================================================== --- binaries/data/mods/public/simulation/templates/gaia/flora_bush_badlands.xml +++ binaries/data/mods/public/simulation/templates/gaia/flora_bush_badlands.xml @@ -4,7 +4,7 @@ Hardy Bush - 75 + 75 props/flora/bush_tempe_a.xml Index: binaries/data/mods/public/simulation/templates/gaia/flora_bush_temperate.xml =================================================================== --- binaries/data/mods/public/simulation/templates/gaia/flora_bush_temperate.xml +++ binaries/data/mods/public/simulation/templates/gaia/flora_bush_temperate.xml @@ -4,7 +4,7 @@ Bush - 50 + 50 flora/trees/temperate_bush_biome.xml Index: binaries/data/mods/public/simulation/templates/gaia/flora_bush_temperate_winter.xml =================================================================== --- binaries/data/mods/public/simulation/templates/gaia/flora_bush_temperate_winter.xml +++ binaries/data/mods/public/simulation/templates/gaia/flora_bush_temperate_winter.xml @@ -4,7 +4,7 @@ Bush - 50 + 50 flora/trees/temperate_bush_biome_winter.xml Index: binaries/data/mods/public/simulation/templates/gaia/flora_bush_tropic.xml =================================================================== --- binaries/data/mods/public/simulation/templates/gaia/flora_bush_tropic.xml +++ binaries/data/mods/public/simulation/templates/gaia/flora_bush_tropic.xml @@ -4,7 +4,7 @@ Bush - 50 + 50 flora/trees/tropic_bush_biome.xml Index: binaries/data/mods/public/simulation/templates/gaia/flora_tree_bamboo_dragon.xml =================================================================== --- binaries/data/mods/public/simulation/templates/gaia/flora_tree_bamboo_dragon.xml +++ binaries/data/mods/public/simulation/templates/gaia/flora_tree_bamboo_dragon.xml @@ -11,7 +11,7 @@ - 1000 + 1000 12 Index: binaries/data/mods/public/simulation/templates/gaia/flora_tree_bamboo_single.xml =================================================================== --- binaries/data/mods/public/simulation/templates/gaia/flora_tree_bamboo_single.xml +++ binaries/data/mods/public/simulation/templates/gaia/flora_tree_bamboo_single.xml @@ -4,7 +4,7 @@ Bamboo - 100 + 100 1 Index: binaries/data/mods/public/simulation/templates/gaia/flora_tree_banyan.xml =================================================================== --- binaries/data/mods/public/simulation/templates/gaia/flora_tree_banyan.xml +++ binaries/data/mods/public/simulation/templates/gaia/flora_tree_banyan.xml @@ -11,7 +11,7 @@ - 600 + 600 12 Index: binaries/data/mods/public/simulation/templates/gaia/flora_tree_baobab.xml =================================================================== --- binaries/data/mods/public/simulation/templates/gaia/flora_tree_baobab.xml +++ binaries/data/mods/public/simulation/templates/gaia/flora_tree_baobab.xml @@ -11,7 +11,7 @@ - 400 + 400 9 Index: binaries/data/mods/public/simulation/templates/gaia/flora_tree_baobab_1_sapling.xml =================================================================== --- binaries/data/mods/public/simulation/templates/gaia/flora_tree_baobab_1_sapling.xml +++ binaries/data/mods/public/simulation/templates/gaia/flora_tree_baobab_1_sapling.xml @@ -4,7 +4,7 @@ Baobab Sapling - 50 + 50 2 Index: binaries/data/mods/public/simulation/templates/gaia/flora_tree_baobab_3_mature.xml =================================================================== --- binaries/data/mods/public/simulation/templates/gaia/flora_tree_baobab_3_mature.xml +++ binaries/data/mods/public/simulation/templates/gaia/flora_tree_baobab_3_mature.xml @@ -11,7 +11,7 @@ - 600 + 600 12 Index: binaries/data/mods/public/simulation/templates/gaia/flora_tree_baobab_4_dead.xml =================================================================== --- binaries/data/mods/public/simulation/templates/gaia/flora_tree_baobab_4_dead.xml +++ binaries/data/mods/public/simulation/templates/gaia/flora_tree_baobab_4_dead.xml @@ -11,7 +11,7 @@ - 550 + 550 12 Index: binaries/data/mods/public/simulation/templates/gaia/flora_tree_cedar_atlas_1_sapling.xml =================================================================== --- binaries/data/mods/public/simulation/templates/gaia/flora_tree_cedar_atlas_1_sapling.xml +++ binaries/data/mods/public/simulation/templates/gaia/flora_tree_cedar_atlas_1_sapling.xml @@ -4,7 +4,7 @@ Atlas Cedar Sapling - 50 + 50 flora/trees/cedar_atlas_sapling.xml Index: binaries/data/mods/public/simulation/templates/gaia/flora_tree_cedar_atlas_3_mature.xml =================================================================== --- binaries/data/mods/public/simulation/templates/gaia/flora_tree_cedar_atlas_3_mature.xml +++ binaries/data/mods/public/simulation/templates/gaia/flora_tree_cedar_atlas_3_mature.xml @@ -4,7 +4,7 @@ Atlas Cedar - 350 + 350 flora/trees/cedar_atlas.xml Index: binaries/data/mods/public/simulation/templates/gaia/flora_tree_cedar_atlas_4_dead.xml =================================================================== --- binaries/data/mods/public/simulation/templates/gaia/flora_tree_cedar_atlas_4_dead.xml +++ binaries/data/mods/public/simulation/templates/gaia/flora_tree_cedar_atlas_4_dead.xml @@ -4,7 +4,7 @@ Dead Atlas Cedar - 300 + 300 flora/trees/cedar_atlas_dead.xml Index: binaries/data/mods/public/simulation/templates/gaia/flora_tree_cretan_date_palm_patch.xml =================================================================== --- binaries/data/mods/public/simulation/templates/gaia/flora_tree_cretan_date_palm_patch.xml +++ binaries/data/mods/public/simulation/templates/gaia/flora_tree_cretan_date_palm_patch.xml @@ -11,7 +11,7 @@ - 300 + 300 12 Index: binaries/data/mods/public/simulation/templates/gaia/flora_tree_cretan_date_palm_short.xml =================================================================== --- binaries/data/mods/public/simulation/templates/gaia/flora_tree_cretan_date_palm_short.xml +++ binaries/data/mods/public/simulation/templates/gaia/flora_tree_cretan_date_palm_short.xml @@ -4,7 +4,7 @@ Cretan Date Palm - 100 + 100 flora/trees/palm_cretan_date_short.xml Index: binaries/data/mods/public/simulation/templates/gaia/flora_tree_dead.xml =================================================================== --- binaries/data/mods/public/simulation/templates/gaia/flora_tree_dead.xml +++ binaries/data/mods/public/simulation/templates/gaia/flora_tree_dead.xml @@ -4,7 +4,7 @@ Dead Deciduous Tree - 200 + 200 flora/trees/temperate_dead_forest.xml Index: binaries/data/mods/public/simulation/templates/gaia/flora_tree_elm.xml =================================================================== --- binaries/data/mods/public/simulation/templates/gaia/flora_tree_elm.xml +++ binaries/data/mods/public/simulation/templates/gaia/flora_tree_elm.xml @@ -4,7 +4,7 @@ Elm Tree - 200 + 200 flora/trees/elm.xml Index: binaries/data/mods/public/simulation/templates/gaia/flora_tree_elm_dead.xml =================================================================== --- binaries/data/mods/public/simulation/templates/gaia/flora_tree_elm_dead.xml +++ binaries/data/mods/public/simulation/templates/gaia/flora_tree_elm_dead.xml @@ -4,7 +4,7 @@ Elm Tree - 200 + 200 flora/trees/elm_dead.xml Index: binaries/data/mods/public/simulation/templates/gaia/flora_tree_euro_birch.xml =================================================================== --- binaries/data/mods/public/simulation/templates/gaia/flora_tree_euro_birch.xml +++ binaries/data/mods/public/simulation/templates/gaia/flora_tree_euro_birch.xml @@ -4,7 +4,7 @@ Silver Birch - 300 + 300 flora/trees/euro_birch_tree.xml Index: binaries/data/mods/public/simulation/templates/gaia/flora_tree_fig.xml =================================================================== --- binaries/data/mods/public/simulation/templates/gaia/flora_tree_fig.xml +++ binaries/data/mods/public/simulation/templates/gaia/flora_tree_fig.xml @@ -10,7 +10,7 @@ - 500 + 500 Index: binaries/data/mods/public/simulation/templates/gaia/flora_tree_fir.xml =================================================================== --- binaries/data/mods/public/simulation/templates/gaia/flora_tree_fir.xml +++ binaries/data/mods/public/simulation/templates/gaia/flora_tree_fir.xml @@ -4,7 +4,7 @@ Fir Tree - 200 + 200 flora/trees/fir_tree.xml Index: binaries/data/mods/public/simulation/templates/gaia/flora_tree_fir_sapling.xml =================================================================== --- binaries/data/mods/public/simulation/templates/gaia/flora_tree_fir_sapling.xml +++ binaries/data/mods/public/simulation/templates/gaia/flora_tree_fir_sapling.xml @@ -4,7 +4,7 @@ Fir Sapling - 50 + 50 flora/trees/fir_sapling.xml Index: binaries/data/mods/public/simulation/templates/gaia/flora_tree_fir_winter.xml =================================================================== --- binaries/data/mods/public/simulation/templates/gaia/flora_tree_fir_winter.xml +++ binaries/data/mods/public/simulation/templates/gaia/flora_tree_fir_winter.xml @@ -4,7 +4,7 @@ Fir Tree - 200 + 200 flora/trees/fir_tree_winter.xml Index: binaries/data/mods/public/simulation/templates/gaia/flora_tree_maple.xml =================================================================== --- binaries/data/mods/public/simulation/templates/gaia/flora_tree_maple.xml +++ binaries/data/mods/public/simulation/templates/gaia/flora_tree_maple.xml @@ -4,7 +4,7 @@ Maple - 300 + 300 flora/trees/temperate_maple_trees.xml Index: binaries/data/mods/public/simulation/templates/gaia/flora_tree_oak_large.xml =================================================================== --- binaries/data/mods/public/simulation/templates/gaia/flora_tree_oak_large.xml +++ binaries/data/mods/public/simulation/templates/gaia/flora_tree_oak_large.xml @@ -4,7 +4,7 @@ Large Oak Tree - 300 + 300 flora/trees/oak_large.xml Index: binaries/data/mods/public/simulation/templates/gaia/flora_tree_poplar_dead.xml =================================================================== --- binaries/data/mods/public/simulation/templates/gaia/flora_tree_poplar_dead.xml +++ binaries/data/mods/public/simulation/templates/gaia/flora_tree_poplar_dead.xml @@ -4,7 +4,7 @@ Dead Poplar - 200 + 200 flora/trees/poplar_dead.xml Index: binaries/data/mods/public/simulation/templates/gaia/flora_tree_poplar_lombardy_autumn.xml =================================================================== --- binaries/data/mods/public/simulation/templates/gaia/flora_tree_poplar_lombardy_autumn.xml +++ binaries/data/mods/public/simulation/templates/gaia/flora_tree_poplar_lombardy_autumn.xml @@ -4,7 +4,7 @@ Poplar - 200 + 200 flora/trees/poplar_autumn.xml Index: binaries/data/mods/public/simulation/templates/gaia/flora_tree_strangler.xml =================================================================== --- binaries/data/mods/public/simulation/templates/gaia/flora_tree_strangler.xml +++ binaries/data/mods/public/simulation/templates/gaia/flora_tree_strangler.xml @@ -11,7 +11,7 @@ - 500 + 500 10 Index: binaries/data/mods/public/simulation/templates/gaia/flora_tree_teak.xml =================================================================== --- binaries/data/mods/public/simulation/templates/gaia/flora_tree_teak.xml +++ binaries/data/mods/public/simulation/templates/gaia/flora_tree_teak.xml @@ -11,7 +11,7 @@ - 500 + 500 Index: binaries/data/mods/public/simulation/templates/gaia/flora_tree_temperate.xml =================================================================== --- binaries/data/mods/public/simulation/templates/gaia/flora_tree_temperate.xml +++ binaries/data/mods/public/simulation/templates/gaia/flora_tree_temperate.xml @@ -4,7 +4,7 @@ Deciduous Tree - 200 + 200 flora/trees/temperate_forest_biome_tree.xml Index: binaries/data/mods/public/simulation/templates/gaia/flora_tree_temperate_autumn.xml =================================================================== --- binaries/data/mods/public/simulation/templates/gaia/flora_tree_temperate_autumn.xml +++ binaries/data/mods/public/simulation/templates/gaia/flora_tree_temperate_autumn.xml @@ -4,7 +4,7 @@ Deciduous Tree - 200 + 200 flora/trees/temperate_forest_biome_tree_autumn.xml Index: binaries/data/mods/public/simulation/templates/gaia/flora_tree_temperate_winter.xml =================================================================== --- binaries/data/mods/public/simulation/templates/gaia/flora_tree_temperate_winter.xml +++ binaries/data/mods/public/simulation/templates/gaia/flora_tree_temperate_winter.xml @@ -4,7 +4,7 @@ Deciduous Tree - 200 + 200 flora/trees/temperate_forest_biome_tree_winter.xml Index: binaries/data/mods/public/simulation/templates/gaia/flora_tree_tropic_rainforest.xml =================================================================== --- binaries/data/mods/public/simulation/templates/gaia/flora_tree_tropic_rainforest.xml +++ binaries/data/mods/public/simulation/templates/gaia/flora_tree_tropic_rainforest.xml @@ -4,7 +4,7 @@ Rainforest Tree - 200 + 200 flora/trees/tropic_forest_biome_tree.xml Index: binaries/data/mods/public/simulation/templates/gaia/ruins/column_doric.xml =================================================================== --- binaries/data/mods/public/simulation/templates/gaia/ruins/column_doric.xml +++ binaries/data/mods/public/simulation/templates/gaia/ruins/column_doric.xml @@ -9,7 +9,7 @@ gaia/special_fence.png - 500 + 500 props/special/eyecandy/column_doric_fallen.xml Index: binaries/data/mods/public/simulation/templates/gaia/ruins/pyramid_great.xml =================================================================== --- binaries/data/mods/public/simulation/templates/gaia/ruins/pyramid_great.xml +++ binaries/data/mods/public/simulation/templates/gaia/ruins/pyramid_great.xml @@ -15,7 +15,7 @@ -2.0 - 10000 + 10000 120 Index: binaries/data/mods/public/simulation/templates/gaia/ruins/pyramid_minor.xml =================================================================== --- binaries/data/mods/public/simulation/templates/gaia/ruins/pyramid_minor.xml +++ binaries/data/mods/public/simulation/templates/gaia/ruins/pyramid_minor.xml @@ -12,7 +12,7 @@ - 5000 + 5000 90 Index: binaries/data/mods/public/simulation/templates/gaia/ruins/standing_stone.xml =================================================================== --- binaries/data/mods/public/simulation/templates/gaia/ruins/standing_stone.xml +++ binaries/data/mods/public/simulation/templates/gaia/ruins/standing_stone.xml @@ -12,7 +12,7 @@ - 300 + 300 props/special/eyecandy/standing_stones.xml Index: binaries/data/mods/public/simulation/templates/gaia/ruins/stone_statues_egyptian.xml =================================================================== --- binaries/data/mods/public/simulation/templates/gaia/ruins/stone_statues_egyptian.xml +++ binaries/data/mods/public/simulation/templates/gaia/ruins/stone_statues_egyptian.xml @@ -12,7 +12,7 @@ - 300 + 300 Index: binaries/data/mods/public/simulation/templates/gaia/ruins/stone_statues_kushite.xml =================================================================== --- binaries/data/mods/public/simulation/templates/gaia/ruins/stone_statues_kushite.xml +++ binaries/data/mods/public/simulation/templates/gaia/ruins/stone_statues_kushite.xml @@ -12,7 +12,7 @@ - 300 + 300 Index: binaries/data/mods/public/simulation/templates/gaia/ruins/stone_statues_roman.xml =================================================================== --- binaries/data/mods/public/simulation/templates/gaia/ruins/stone_statues_roman.xml +++ binaries/data/mods/public/simulation/templates/gaia/ruins/stone_statues_roman.xml @@ -12,7 +12,7 @@ - 300 + 300 Index: binaries/data/mods/public/simulation/templates/gaia/ruins/unfinished_greek_temple.xml =================================================================== --- binaries/data/mods/public/simulation/templates/gaia/ruins/unfinished_greek_temple.xml +++ binaries/data/mods/public/simulation/templates/gaia/ruins/unfinished_greek_temple.xml @@ -12,7 +12,7 @@ - 2000 + 2000 30 Index: binaries/data/mods/public/simulation/templates/gaia/treasure/food_barrel.xml =================================================================== --- binaries/data/mods/public/simulation/templates/gaia/treasure/food_barrel.xml +++ binaries/data/mods/public/simulation/templates/gaia/treasure/food_barrel.xml @@ -9,7 +9,7 @@ gaia/special_treasure_food.png - 100 + 100 treasure.food Index: binaries/data/mods/public/simulation/templates/gaia/treasure/food_barrels_buried.xml =================================================================== --- binaries/data/mods/public/simulation/templates/gaia/treasure/food_barrels_buried.xml +++ binaries/data/mods/public/simulation/templates/gaia/treasure/food_barrels_buried.xml @@ -16,7 +16,7 @@ 0.0 - 200 + 200 treasure.food Index: binaries/data/mods/public/simulation/templates/gaia/treasure/food_bin.xml =================================================================== --- binaries/data/mods/public/simulation/templates/gaia/treasure/food_bin.xml +++ binaries/data/mods/public/simulation/templates/gaia/treasure/food_bin.xml @@ -12,7 +12,7 @@ - 300 + 300 treasure.food Index: binaries/data/mods/public/simulation/templates/gaia/treasure/food_crate.xml =================================================================== --- binaries/data/mods/public/simulation/templates/gaia/treasure/food_crate.xml +++ binaries/data/mods/public/simulation/templates/gaia/treasure/food_crate.xml @@ -12,7 +12,7 @@ - 200 + 200 treasure.food Index: binaries/data/mods/public/simulation/templates/gaia/treasure/food_jars.xml =================================================================== --- binaries/data/mods/public/simulation/templates/gaia/treasure/food_jars.xml +++ binaries/data/mods/public/simulation/templates/gaia/treasure/food_jars.xml @@ -12,7 +12,7 @@ - 300 + 300 treasure.food Index: binaries/data/mods/public/simulation/templates/gaia/treasure/food_persian_big.xml =================================================================== --- binaries/data/mods/public/simulation/templates/gaia/treasure/food_persian_big.xml +++ binaries/data/mods/public/simulation/templates/gaia/treasure/food_persian_big.xml @@ -12,7 +12,7 @@ - 600 + 600 treasure.food Index: binaries/data/mods/public/simulation/templates/gaia/treasure/food_persian_small.xml =================================================================== --- binaries/data/mods/public/simulation/templates/gaia/treasure/food_persian_small.xml +++ binaries/data/mods/public/simulation/templates/gaia/treasure/food_persian_small.xml @@ -12,7 +12,7 @@ - 400 + 400 treasure.food Index: binaries/data/mods/public/simulation/templates/gaia/treasure/golden_fleece.xml =================================================================== --- binaries/data/mods/public/simulation/templates/gaia/treasure/golden_fleece.xml +++ binaries/data/mods/public/simulation/templates/gaia/treasure/golden_fleece.xml @@ -8,7 +8,7 @@ Golden Fleece - 1000 + 1000 treasure.metal Index: binaries/data/mods/public/simulation/templates/gaia/treasure/metal.xml =================================================================== --- binaries/data/mods/public/simulation/templates/gaia/treasure/metal.xml +++ binaries/data/mods/public/simulation/templates/gaia/treasure/metal.xml @@ -8,7 +8,7 @@ Secret Box - 300 + 300 treasure.metal Index: binaries/data/mods/public/simulation/templates/gaia/treasure/metal_persian_big.xml =================================================================== --- binaries/data/mods/public/simulation/templates/gaia/treasure/metal_persian_big.xml +++ binaries/data/mods/public/simulation/templates/gaia/treasure/metal_persian_big.xml @@ -11,7 +11,7 @@ - 500 + 500 treasure.metal Index: binaries/data/mods/public/simulation/templates/gaia/treasure/metal_persian_small.xml =================================================================== --- binaries/data/mods/public/simulation/templates/gaia/treasure/metal_persian_small.xml +++ binaries/data/mods/public/simulation/templates/gaia/treasure/metal_persian_small.xml @@ -11,7 +11,7 @@ - 300 + 300 treasure.metal Index: binaries/data/mods/public/simulation/templates/gaia/treasure/pegasus.xml =================================================================== --- binaries/data/mods/public/simulation/templates/gaia/treasure/pegasus.xml +++ binaries/data/mods/public/simulation/templates/gaia/treasure/pegasus.xml @@ -8,7 +8,7 @@ Pegasus - 1000 + 1000 treasure.metal Index: binaries/data/mods/public/simulation/templates/gaia/treasure/shipwreck.xml =================================================================== --- binaries/data/mods/public/simulation/templates/gaia/treasure/shipwreck.xml +++ binaries/data/mods/public/simulation/templates/gaia/treasure/shipwreck.xml @@ -15,7 +15,7 @@ 0.0 - 500 + 500 treasure.wood Index: binaries/data/mods/public/simulation/templates/gaia/treasure/shipwreck_debris.xml =================================================================== --- binaries/data/mods/public/simulation/templates/gaia/treasure/shipwreck_debris.xml +++ binaries/data/mods/public/simulation/templates/gaia/treasure/shipwreck_debris.xml @@ -18,7 +18,7 @@ 0.0 - 200 + 200 treasure.food Index: binaries/data/mods/public/simulation/templates/gaia/treasure/shipwreck_ram_bow.xml =================================================================== --- binaries/data/mods/public/simulation/templates/gaia/treasure/shipwreck_ram_bow.xml +++ binaries/data/mods/public/simulation/templates/gaia/treasure/shipwreck_ram_bow.xml @@ -15,7 +15,7 @@ 0.0 - 550 + 550 treasure.wood Index: binaries/data/mods/public/simulation/templates/gaia/treasure/shipwreck_sail_boat.xml =================================================================== --- binaries/data/mods/public/simulation/templates/gaia/treasure/shipwreck_sail_boat.xml +++ binaries/data/mods/public/simulation/templates/gaia/treasure/shipwreck_sail_boat.xml @@ -15,7 +15,7 @@ 0.0 - 400 + 400 treasure.wood Index: binaries/data/mods/public/simulation/templates/gaia/treasure/shipwreck_sail_boat_cut.xml =================================================================== --- binaries/data/mods/public/simulation/templates/gaia/treasure/shipwreck_sail_boat_cut.xml +++ binaries/data/mods/public/simulation/templates/gaia/treasure/shipwreck_sail_boat_cut.xml @@ -15,7 +15,7 @@ 0.0 - 450 + 450 treasure.wood Index: binaries/data/mods/public/simulation/templates/gaia/treasure/standing_stone.xml =================================================================== --- binaries/data/mods/public/simulation/templates/gaia/treasure/standing_stone.xml +++ binaries/data/mods/public/simulation/templates/gaia/treasure/standing_stone.xml @@ -11,7 +11,7 @@ - 300 + 300 treasure.stone Index: binaries/data/mods/public/simulation/templates/gaia/treasure/stone.xml =================================================================== --- binaries/data/mods/public/simulation/templates/gaia/treasure/stone.xml +++ binaries/data/mods/public/simulation/templates/gaia/treasure/stone.xml @@ -11,7 +11,7 @@ - 300 + 300 treasure.stone Index: binaries/data/mods/public/simulation/templates/gaia/treasure/wood.xml =================================================================== --- binaries/data/mods/public/simulation/templates/gaia/treasure/wood.xml +++ binaries/data/mods/public/simulation/templates/gaia/treasure/wood.xml @@ -11,7 +11,7 @@ - 300 + 300 treasure.wood Index: binaries/data/mods/public/simulation/templates/template_gaia_fish.xml =================================================================== --- binaries/data/mods/public/simulation/templates/template_gaia_fish.xml +++ binaries/data/mods/public/simulation/templates/template_gaia_fish.xml @@ -26,7 +26,7 @@ false - 1000 + 1000 food.fish 4 Index: binaries/data/mods/public/simulation/templates/template_gaia_flora.xml =================================================================== --- binaries/data/mods/public/simulation/templates/template_gaia_flora.xml +++ binaries/data/mods/public/simulation/templates/template_gaia_flora.xml @@ -16,7 +16,7 @@ false - 200 + 200 wood.tree 8 Index: binaries/data/mods/public/simulation/templates/template_gaia_flora_bush_berry.xml =================================================================== --- binaries/data/mods/public/simulation/templates/template_gaia_flora_bush_berry.xml +++ binaries/data/mods/public/simulation/templates/template_gaia_flora_bush_berry.xml @@ -13,7 +13,7 @@ false - 200 + 200 food.fruit Index: binaries/data/mods/public/simulation/templates/template_gaia_flora_tree_fruit.xml =================================================================== --- binaries/data/mods/public/simulation/templates/template_gaia_flora_tree_fruit.xml +++ binaries/data/mods/public/simulation/templates/template_gaia_flora_tree_fruit.xml @@ -15,7 +15,7 @@ - 400 + 400 food.fruit Index: binaries/data/mods/public/simulation/templates/template_gaia_geo_mineral.xml =================================================================== --- binaries/data/mods/public/simulation/templates/template_gaia_geo_mineral.xml +++ binaries/data/mods/public/simulation/templates/template_gaia_geo_mineral.xml @@ -11,7 +11,7 @@ false - 1000 + 1000 metal.ore 12 Index: binaries/data/mods/public/simulation/templates/template_gaia_geo_mineral_slabs.xml =================================================================== --- binaries/data/mods/public/simulation/templates/template_gaia_geo_mineral_slabs.xml +++ binaries/data/mods/public/simulation/templates/template_gaia_geo_mineral_slabs.xml @@ -8,7 +8,7 @@ - 5000 + 5000 24 Index: binaries/data/mods/public/simulation/templates/template_gaia_geo_rock.xml =================================================================== --- binaries/data/mods/public/simulation/templates/template_gaia_geo_rock.xml +++ binaries/data/mods/public/simulation/templates/template_gaia_geo_rock.xml @@ -11,7 +11,7 @@ false - 1000 + 1000 stone.rock 12 Index: binaries/data/mods/public/simulation/templates/template_gaia_geo_rock_slabs.xml =================================================================== --- binaries/data/mods/public/simulation/templates/template_gaia_geo_rock_slabs.xml +++ binaries/data/mods/public/simulation/templates/template_gaia_geo_rock_slabs.xml @@ -8,7 +8,7 @@ - 5000 + 5000 24 Index: binaries/data/mods/public/simulation/templates/template_gaia_ruins.xml =================================================================== --- binaries/data/mods/public/simulation/templates/template_gaia_ruins.xml +++ binaries/data/mods/public/simulation/templates/template_gaia_ruins.xml @@ -18,7 +18,7 @@ false - 500 + 500 stone.ruins 1 Index: binaries/data/mods/public/simulation/templates/template_gaia_treasure.xml =================================================================== --- binaries/data/mods/public/simulation/templates/template_gaia_treasure.xml +++ binaries/data/mods/public/simulation/templates/template_gaia_treasure.xml @@ -18,7 +18,7 @@ false - 300 + 300 1 Index: binaries/data/mods/public/simulation/templates/template_structure_resource_corral.xml =================================================================== --- binaries/data/mods/public/simulation/templates/template_structure_resource_corral.xml +++ binaries/data/mods/public/simulation/templates/template_structure_resource_corral.xml @@ -1,5 +1,8 @@ + + structures/corral + 50 Index: binaries/data/mods/public/simulation/templates/template_structure_resource_field.xml =================================================================== --- binaries/data/mods/public/simulation/templates/template_structure_resource_field.xml +++ binaries/data/mods/public/simulation/templates/template_structure_resource_field.xml @@ -44,7 +44,7 @@ false - Infinity + Infinity food.grain 5 0.90 Index: binaries/data/mods/public/simulation/templates/template_unit_fauna_herd.xml =================================================================== --- binaries/data/mods/public/simulation/templates/template_unit_fauna_herd.xml +++ binaries/data/mods/public/simulation/templates/template_unit_fauna_herd.xml @@ -8,7 +8,7 @@ true - 100 + 100 food.meat 8 Index: binaries/data/mods/public/simulation/templates/template_unit_fauna_hunt.xml =================================================================== --- binaries/data/mods/public/simulation/templates/template_unit_fauna_hunt.xml +++ binaries/data/mods/public/simulation/templates/template_unit_fauna_hunt.xml @@ -12,7 +12,7 @@ true - 100 + 100 food.meat 8 Index: binaries/data/mods/public/simulation/templates/template_unit_fauna_hunt_skittish_elephant_infant.xml =================================================================== --- binaries/data/mods/public/simulation/templates/template_unit_fauna_hunt_skittish_elephant_infant.xml +++ binaries/data/mods/public/simulation/templates/template_unit_fauna_hunt_skittish_elephant_infant.xml @@ -16,7 +16,7 @@ pitch - 100 + 100 food.meat Index: binaries/data/mods/public/simulation/templates/template_unit_fauna_hunt_whale.xml =================================================================== --- binaries/data/mods/public/simulation/templates/template_unit_fauna_hunt_whale.xml +++ binaries/data/mods/public/simulation/templates/template_unit_fauna_hunt_whale.xml @@ -21,7 +21,7 @@ true - 2000 + 2000 food.fish 5