Index: binaries/data/mods/public/art/actors/structures/gauls/ambush_camp.xml
===================================================================
--- binaries/data/mods/public/art/actors/structures/gauls/ambush_camp.xml
+++ binaries/data/mods/public/art/actors/structures/gauls/ambush_camp.xml
@@ -0,0 +1,42 @@
+
+
+
+
+
+ structural/field_propped_8x8.dae
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ basic_trans.xml
+
Index: binaries/data/mods/public/art/actors/structures/plot_ambush.xml
===================================================================
--- binaries/data/mods/public/art/actors/structures/plot_ambush.xml
+++ binaries/data/mods/public/art/actors/structures/plot_ambush.xml
@@ -0,0 +1,26 @@
+
+
+
+
+
+ structural/field_propped_8x8.dae
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ basic_trans.xml
+
Index: binaries/data/mods/public/simulation/components/Ambush.js
===================================================================
--- binaries/data/mods/public/simulation/components/Ambush.js
+++ binaries/data/mods/public/simulation/components/Ambush.js
@@ -0,0 +1,21 @@
+function Ambush() {}
+
+Ambush.prototype.Schema =
+ "Specifies if an entity is hidden, so that it will not automatically be attacked by UnitAI." +
+ "" +
+ "false" +
+ "" +
+ "" +
+ "" +
+ "" ;
+
+Ambush.prototype.Init = function()
+{
+};
+
+ Ambush.prototype.IsEntityHidden = function()
+ {
+ return (this.template.Hidden)
+ };
+
+Engine.RegisterComponentType(IID_Ambush, "Ambush", Ambush);
Index: binaries/data/mods/public/simulation/components/BuildRestrictions.js
===================================================================
--- binaries/data/mods/public/simulation/components/BuildRestrictions.js
+++ binaries/data/mods/public/simulation/components/BuildRestrictions.js
@@ -18,6 +18,7 @@
"land" +
"shore" +
"land-shore"+
+ "land-ignore-obstruction"+
"" +
"" +
"" +
@@ -131,6 +132,10 @@
passClassName = "default-terrain-only";
break;
+ case "land-ignore-obstruction":
+ passClassName = "building-land-no-obstruction";
+ break;
+
case "land":
default:
passClassName = "building-land";
@@ -146,6 +151,15 @@
// for walls, only test the center point
var ret = cmpObstruction.CheckFoundation(passClassName, true);
}
+ else if (this.template.PlacementType == "land-ignore-obstruction")
+ {
+ // this is needed as the the none
+ // is not actually used when building
+ // it is rather assumed to be foundation
+ // by the c++ part. See palisades as another example who use
+ // land-shore but are still obstructed by foundations
+ var ret = "success";
+ }
else
{
var ret = cmpObstruction.CheckFoundation(passClassName, false);
Index: binaries/data/mods/public/simulation/components/BuildingAI.js
===================================================================
--- binaries/data/mods/public/simulation/components/BuildingAI.js
+++ binaries/data/mods/public/simulation/components/BuildingAI.js
@@ -185,9 +185,14 @@
// Add new targets.
for (let entity of msg.added)
+ {
+ const cmpAmbush = Engine.QueryInterface(entity, IID_Ambush);
+ if (cmpAmbush && cmpAmbush.IsEntityHidden(entity))
+ continue;
+
if (cmpAttack.CanAttack(entity))
this.targetUnits.push(entity);
-
+ }
// Remove targets outside of vision-range.
for (let entity of msg.removed)
{
Index: binaries/data/mods/public/simulation/components/Player.js
===================================================================
--- binaries/data/mods/public/simulation/components/Player.js
+++ binaries/data/mods/public/simulation/components/Player.js
@@ -45,7 +45,7 @@
/**
* Which units will be shown with special icons at the top.
*/
-var panelEntityClasses = "Hero Relic";
+var panelEntityClasses = "Hero Relic Ambush";
Player.prototype.Init = function()
{
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
@@ -6413,6 +6413,10 @@
if (!cmpAttack.CanAttack(e))
return false;
+ const cmpAmbush = Engine.QueryInterface(e, IID_Ambush);
+ if (cmpAmbush && cmpAmbush.IsEntityHidden(e))
+ return false;
+
let cmpOwnership = Engine.QueryInterface(e, IID_Ownership);
if (cmpOwnership && cmpOwnership.GetOwner() > 0)
return true;
Index: binaries/data/mods/public/simulation/components/interfaces/Ambush.js
===================================================================
--- binaries/data/mods/public/simulation/components/interfaces/Ambush.js
+++ binaries/data/mods/public/simulation/components/interfaces/Ambush.js
@@ -0,0 +1 @@
+Engine.RegisterInterface("Ambush");
Index: binaries/data/mods/public/simulation/components/tests/test_UnitAI.js
===================================================================
--- binaries/data/mods/public/simulation/components/tests/test_UnitAI.js
+++ binaries/data/mods/public/simulation/components/tests/test_UnitAI.js
@@ -1,6 +1,7 @@
Engine.LoadHelperScript("Player.js");
Engine.LoadHelperScript("Position.js");
Engine.LoadHelperScript("Sound.js");
+Engine.LoadComponentScript("interfaces/Ambush.js");
Engine.LoadComponentScript("interfaces/Auras.js");
Engine.LoadComponentScript("interfaces/Builder.js");
Engine.LoadComponentScript("interfaces/BuildingAI.js");
Index: binaries/data/mods/public/simulation/data/pathfinder.xml
===================================================================
--- binaries/data/mods/public/simulation/data/pathfinder.xml
+++ binaries/data/mods/public/simulation/data/pathfinder.xml
@@ -63,6 +63,8 @@
from water and not on cliffs or mountains.
* Shore is used for docks, which must be near water and
land, yet shallow enough for builders to approach.
+ * Land-no-obstruction is used for buildings which should
+ be land only, but ignore all obstructions.
-->
foundation
@@ -75,6 +77,12 @@
8.0
1.25
+
+ none
+ 0
+ 4.0
+ 1.0
+