diff --git a/binaries/data/mods/public/gui/session/unit_actions.js b/binaries/data/mods/public/gui/session/unit_actions.js
index af2b5cd5e0..bbcd478281 100644
--- a/binaries/data/mods/public/gui/session/unit_actions.js
+++ b/binaries/data/mods/public/gui/session/unit_actions.js
@@ -232,11 +232,14 @@ var unitActions =
},
"getActionInfo": function(entState, targetState)
{
+ if (!entState.unitAI || !entState.unitAI.canPatrol)
+ return false;
+
return { "possible": true };
},
"hotkeyActionCheck": function(target, selection)
{
- if (!someUnitAI(selection) ||
+ if (!someCanPatrol(selection) ||
!Engine.HotkeyIsPressed("session.patrol") ||
!getActionInfo("patrol", target).possible)
return false;
@@ -1273,8 +1276,9 @@ var g_EntityCommands =
"patrol": {
"getInfo": function(entState)
{
- if (g_Selection.toList().every(ent => !GetEntityState(ent).unitAI))
+ if (!someCanPatrol(g_Selection.toList()))
return false;
+
return {
"tooltip": colorizeHotkey("%(hotkey)s" + " ", "session.patrol") +
translate("Patrol") + "\n" +
@@ -1431,6 +1435,14 @@ function someGuarding(entities)
});
}
+function someCanPatrol(entities)
+{
+ return entities.some(ent => {
+ let entState = GetEntityState(ent);
+ return entState && entState.unitAI && entState.unitAI.canPatrol;
+ });
+}
+
/**
* Keep in sync with Commands.js.
*/
diff --git a/binaries/data/mods/public/simulation/components/GuiInterface.js b/binaries/data/mods/public/simulation/components/GuiInterface.js
index 92c27b45f7..ba8c3d1e2f 100644
--- a/binaries/data/mods/public/simulation/components/GuiInterface.js
+++ b/binaries/data/mods/public/simulation/components/GuiInterface.js
@@ -382,6 +382,7 @@ GuiInterface.prototype.GetEntityState = function(player, ent)
"hasWorkOrders": cmpUnitAI.HasWorkOrders(),
"canGuard": cmpUnitAI.CanGuard(),
"isGuarding": cmpUnitAI.IsGuardOf(),
+ "canPatrol": cmpUnitAI.CanPatrol(),
"possibleStances": cmpUnitAI.GetPossibleStances(),
"isIdle":cmpUnitAI.IsIdle(),
};
diff --git a/binaries/data/mods/public/simulation/components/UnitAI.js b/binaries/data/mods/public/simulation/components/UnitAI.js
index 18ddbaced1..33c1ea387a 100644
--- a/binaries/data/mods/public/simulation/components/UnitAI.js
+++ b/binaries/data/mods/public/simulation/components/UnitAI.js
@@ -24,6 +24,9 @@ UnitAI.prototype.Schema =
"" +
"" +
"" +
+ "" +
+ "" +
+ "" +
"" +
"" +
"" +
@@ -5042,7 +5045,14 @@ UnitAI.prototype.CanGuard = function()
if (cmpGuard && cmpGuard.GetEntities().length)
return false;
- return (this.template.CanGuard == "true");
+ return this.template.CanGuard == "true";
+};
+
+UnitAI.prototype.CanPatrol = function()
+{
+ // Formation controllers should always respond to commands
+ // (then the individual units can make up their own minds)
+ return this.IsFormationController() || this.template.CanPatrol == "true";
};
/**
@@ -5093,6 +5103,12 @@ UnitAI.prototype.WalkAndFight = function(x, z, targetClasses, queued)
UnitAI.prototype.Patrol = function(x, z, targetClasses, queued)
{
+ if (!this.CanPatrol())
+ {
+ this.Walk(x, z, queued);
+ return;
+ }
+
this.AddOrder("Patrol", { "x": x, "z": z, "targetClasses": targetClasses, "force": true }, queued);
};
diff --git a/binaries/data/mods/public/simulation/templates/template_formation.xml b/binaries/data/mods/public/simulation/templates/template_formation.xml
index 7e673c8890..0d16fe0a13 100644
--- a/binaries/data/mods/public/simulation/templates/template_formation.xml
+++ b/binaries/data/mods/public/simulation/templates/template_formation.xml
@@ -37,6 +37,7 @@
12.0
true
true
+ true
true
diff --git a/binaries/data/mods/public/simulation/templates/template_unit.xml b/binaries/data/mods/public/simulation/templates/template_unit.xml
index b9b685a09c..281af58b18 100644
--- a/binaries/data/mods/public/simulation/templates/template_unit.xml
+++ b/binaries/data/mods/public/simulation/templates/template_unit.xml
@@ -102,6 +102,7 @@
12.0
false
true
+ true
false
diff --git a/binaries/data/mods/public/simulation/templates/template_unit_fauna.xml b/binaries/data/mods/public/simulation/templates/template_unit_fauna.xml
index e55d7d3a8a..cf5af2b8c2 100644
--- a/binaries/data/mods/public/simulation/templates/template_unit_fauna.xml
+++ b/binaries/data/mods/public/simulation/templates/template_unit_fauna.xml
@@ -23,6 +23,7 @@
99
false
+ false
8.0
24.0
2000
diff --git a/binaries/data/mods/public/simulation/templates/template_unit_fauna_decorative.xml b/binaries/data/mods/public/simulation/templates/template_unit_fauna_decorative.xml
index 9ede54309d..06d7086098 100644
--- a/binaries/data/mods/public/simulation/templates/template_unit_fauna_decorative.xml
+++ b/binaries/data/mods/public/simulation/templates/template_unit_fauna_decorative.xml
@@ -25,6 +25,7 @@
passive
false
false
+ false
20
10.0
10000
diff --git a/binaries/data/mods/public/simulation/templates/template_unit_mechanical_ship_fishing.xml b/binaries/data/mods/public/simulation/templates/template_unit_mechanical_ship_fishing.xml
index 7abc6a7942..e2a93bb011 100644
--- a/binaries/data/mods/public/simulation/templates/template_unit_mechanical_ship_fishing.xml
+++ b/binaries/data/mods/public/simulation/templates/template_unit_mechanical_ship_fishing.xml
@@ -57,6 +57,7 @@
passive
false
+ false
ship-small
diff --git a/binaries/data/mods/public/simulation/templates/template_unit_mechanical_ship_merchant.xml b/binaries/data/mods/public/simulation/templates/template_unit_mechanical_ship_merchant.xml
index 894da1dc31..4e556631f1 100644
--- a/binaries/data/mods/public/simulation/templates/template_unit_mechanical_ship_merchant.xml
+++ b/binaries/data/mods/public/simulation/templates/template_unit_mechanical_ship_merchant.xml
@@ -55,6 +55,7 @@
passive
false
+ false
ship-small
diff --git a/binaries/data/mods/public/simulation/templates/template_unit_support_female_citizen.xml b/binaries/data/mods/public/simulation/templates/template_unit_support_female_citizen.xml
index c6d41b65d2..4ec274579f 100644
--- a/binaries/data/mods/public/simulation/templates/template_unit_support_female_citizen.xml
+++ b/binaries/data/mods/public/simulation/templates/template_unit_support_female_citizen.xml
@@ -86,6 +86,7 @@
1
+ false
9.5
diff --git a/binaries/data/mods/public/simulation/templates/template_unit_support_trader.xml b/binaries/data/mods/public/simulation/templates/template_unit_support_trader.xml
index b71bebb8ac..d97914e56d 100644
--- a/binaries/data/mods/public/simulation/templates/template_unit_support_trader.xml
+++ b/binaries/data/mods/public/simulation/templates/template_unit_support_trader.xml
@@ -43,6 +43,7 @@
false
+ false
9.5
diff --git a/binaries/data/mods/public/simulation/templates/units/maur_support_elephant.xml b/binaries/data/mods/public/simulation/templates/units/maur_support_elephant.xml
index aa3f5b81da..f14d8034ca 100644
--- a/binaries/data/mods/public/simulation/templates/units/maur_support_elephant.xml
+++ b/binaries/data/mods/public/simulation/templates/units/maur_support_elephant.xml
@@ -63,6 +63,9 @@
actor/fauna/animal/elephant_trained.xml
+
+ false
+
large
5.5
diff --git a/binaries/data/mods/public/simulation/templates/units/spart_support_female_citizen.xml b/binaries/data/mods/public/simulation/templates/units/spart_support_female_citizen.xml
index 6cd19ee113..fc8daf1021 100644
--- a/binaries/data/mods/public/simulation/templates/units/spart_support_female_citizen.xml
+++ b/binaries/data/mods/public/simulation/templates/units/spart_support_female_citizen.xml
@@ -32,6 +32,7 @@
standground
+ true
units/spartans/female_citizen.xml