From 78e174af7d85e8a00e4d2b9525bf95d727fc60f7 Mon Sep 17 00:00:00 2001 From: Ykkrosh Date: Thu, 10 Feb 2011 19:50:08 +0000 Subject: [PATCH] Fix auto-gathering after constructing fields. Fix building on top of animal corpses. Fix builders getting in the way of their own building. This was SVN commit r8900. --- .../data/mods/public/gui/session/input.js | 2 +- .../public/simulation/components/AnimalAI.js | 8 ++++++ .../public/simulation/components/UnitAI.js | 28 +++++++++++++++---- .../public/simulation/helpers/Commands.js | 3 +- 4 files changed, 34 insertions(+), 7 deletions(-) diff --git a/binaries/data/mods/public/gui/session/input.js b/binaries/data/mods/public/gui/session/input.js index 21579bc75f..0257cba804 100644 --- a/binaries/data/mods/public/gui/session/input.js +++ b/binaries/data/mods/public/gui/session/input.js @@ -822,7 +822,7 @@ function doAction(action, ev) case "build": // (same command as repair) case "repair": - Engine.PostNetworkCommand({"type": "repair", "entities": selection, "target": action.target, "queued": queued}); + Engine.PostNetworkCommand({"type": "repair", "entities": selection, "target": action.target, "autocontinue": true, "queued": queued}); Engine.GuiInterfaceCall("PlaySound", { "name": "order_repair", "entity": selection[0] }); return true; diff --git a/binaries/data/mods/public/simulation/components/AnimalAI.js b/binaries/data/mods/public/simulation/components/AnimalAI.js index 24c1778130..ed4fae0eff 100644 --- a/binaries/data/mods/public/simulation/components/AnimalAI.js +++ b/binaries/data/mods/public/simulation/components/AnimalAI.js @@ -56,6 +56,14 @@ var AnimalFsmSpec = { "Attacked": function(msg) { // Do nothing, because we're dead already }, + + "LeaveFoundation": function(msg) { + // We can't walk away from the foundation (since we're dead), + // but we mustn't block its construction (since the builders would get stuck), + // and we don't want to trick gatherers into trying to reach us when + // we're stuck in the middle of a building, so just delete our corpse. + Engine.DestroyEntity(this.entity); + }, }, "SKITTISH": { diff --git a/binaries/data/mods/public/simulation/components/UnitAI.js b/binaries/data/mods/public/simulation/components/UnitAI.js index b6001c95f9..94d3733312 100644 --- a/binaries/data/mods/public/simulation/components/UnitAI.js +++ b/binaries/data/mods/public/simulation/components/UnitAI.js @@ -373,7 +373,7 @@ var UnitFsmSpec = { "Order.LeaveFoundation": function(msg) { // Move a tile outside the building var range = 4; - var ok = this.MoveToTargetRangeExplicit(this.order.data.target, range, range); + var ok = this.MoveToTargetRangeExplicit(msg.data.target, range, range); if (ok) { // We've started walking to the given point @@ -785,6 +785,25 @@ var UnitFsmSpec = { // TODO: look for a nearby foundation to help with }, + + // Override the LeaveFoundation order since we don't want to be + // accidentally blocking our own building + "Order.LeaveFoundation": function(msg) { + // Move a tile outside the building + var range = 4; + var ok = this.MoveToTargetRangeExplicit(msg.data.target, range, range); + if (ok) + { + // We've started walking to the given point + this.SetNextState("INDIVIDUAL.WALKING"); + } + else + { + // We are already at the target, or can't move at all + this.FinishOrder(); + } + }, + }, "GARRISON": { @@ -1416,8 +1435,7 @@ UnitAI.prototype.LeaveFoundation = function(target) // TODO: we should verify this is a friendly foundation, otherwise // there's no reason we should let them build here - var queued = true; - this.AddOrder("LeaveFoundation", { "target": target }, queued); + this.PushOrderFront("LeaveFoundation", { "target": target }); }; UnitAI.prototype.Attack = function(target, queued) @@ -1478,7 +1496,7 @@ UnitAI.prototype.ReturnResource = function(target, queued) this.AddOrder("ReturnResource", { "target": target }, queued); }; -UnitAI.prototype.Repair = function(target, queued) +UnitAI.prototype.Repair = function(target, autocontinue, queued) { if (!this.CanRepair(target)) { @@ -1486,7 +1504,7 @@ UnitAI.prototype.Repair = function(target, queued) return; } - this.AddOrder("Repair", { "target": target }, queued); + this.AddOrder("Repair", { "target": target, "autocontinue": autocontinue }, queued); }; UnitAI.prototype.SetStance = function(stance) diff --git a/binaries/data/mods/public/simulation/helpers/Commands.js b/binaries/data/mods/public/simulation/helpers/Commands.js index d3c69e9d2d..2c15eb51cd 100644 --- a/binaries/data/mods/public/simulation/helpers/Commands.js +++ b/binaries/data/mods/public/simulation/helpers/Commands.js @@ -37,7 +37,7 @@ function ProcessCommand(player, cmd) // This covers both repairing damaged buildings, and constructing unfinished foundations var cmpUnitAI = GetFormationUnitAI(cmd.entities); if (cmpUnitAI) - cmpUnitAI.Repair(cmd.target, cmd.queued); + cmpUnitAI.Repair(cmd.target, cmd.autocontinue, cmd.queued); break; case "gather": @@ -162,6 +162,7 @@ function ProcessCommand(player, cmd) "type": "repair", "entities": cmd.entities, "target": ent, + "autocontinue": cmd.autocontinue, "queued": cmd.queued }); }