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/Attack.js =================================================================== --- binaries/data/mods/public/simulation/components/Attack.js +++ binaries/data/mods/public/simulation/components/Attack.js @@ -220,6 +220,19 @@ return []; }; +Attack.prototype.IsTargetHidden = function(target) +{ + let cmpIdentity = Engine.QueryInterface(target, IID_Identity); + if (!cmpIdentity) + return false; + + let targetClasses = cmpIdentity.GetClassesList(); + if (targetClasses.includes("Hidden")) + return true; + else + return false; +}; + Attack.prototype.CanAttack = function(target, wantedTypes) { const cmpFormation = Engine.QueryInterface(target, IID_Formation); 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 @@ -136,16 +136,23 @@ passClassName = "building-land"; } + var cmpObstruction = Engine.QueryInterface(this.entity, IID_Obstruction); if (!cmpObstruction) return result; // Fail + let cmpIdentityInterface = Engine.QueryInterface(this.entity, IID_Identity); + let VisibleClasses = cmpIdentityInterface.GetClassesList(); if (this.template.Category == "Wall") { // for walls, only test the center point var ret = cmpObstruction.CheckFoundation(passClassName, true); } + else if (VisibleClasses.includes("Hidden")) + { + var ret = "success"; + } else { var ret = cmpObstruction.CheckFoundation(passClassName, false); 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 @@ -6410,6 +6410,9 @@ if (!cmpAttack.CanAttack(e)) return false; + if (cmpAttack.IsTargetHidden(e)) + return false; + let cmpOwnership = Engine.QueryInterface(e, IID_Ownership); if (cmpOwnership && cmpOwnership.GetOwner() > 0) return true; @@ -6426,6 +6429,7 @@ if (!attackfilter(ent)) continue; let pref = cmpAttack.GetPreference(ent); + if (pref === null || pref === undefined) entsWithoutPref.push(ent); else if (!entsByPreferences[pref]) Index: binaries/data/mods/public/simulation/templates/structures/gaul/ambush_camp.xml =================================================================== --- binaries/data/mods/public/simulation/templates/structures/gaul/ambush_camp.xml +++ binaries/data/mods/public/simulation/templates/structures/gaul/ambush_camp.xml @@ -0,0 +1,86 @@ + + + + own ally neutral enemy + AmbushCamp + + AmbushCamp + 80 + + + + 3 + 10.0 + 3.0 + + + 50 + + 100 + 100 + 100 + + + + + 12.0 + + + 20 + 0.1 + Unit + Infantry + 0 + 6 + + + 100 + decay|rubble/rubble_rome_sb + + + rome + Army Camp + Castra + Build everywhere. Garrison Infantry to ambush the enemy. + CivSpecific + City AmbushCamp Hidden + structures/roman_camp.png + phase_village + + + + false + false + + + + + 5 + 5 + 3 + + + + + + + interface/complete/building/complete_broch.xml + attack/weapon/bow_attack.xml + attack/impact/arrow_impact.xml + + + + 2 + + + 30 + + + structures/gauls/ambush_camp.xml + structures/plot_ambush.xml + + + 29.5 + 8 + + Index: binaries/data/mods/public/simulation/templates/units/gaul/infantry_javelineer_b.xml =================================================================== --- binaries/data/mods/public/simulation/templates/units/gaul/infantry_javelineer_b.xml +++ binaries/data/mods/public/simulation/templates/units/gaul/infantry_javelineer_b.xml @@ -3,6 +3,7 @@ structures/gaul/assembly + structures/gaul/ambush_camp Index: binaries/data/mods/public/simulation/templates/units/gaul/infantry_slinger_b.xml =================================================================== --- binaries/data/mods/public/simulation/templates/units/gaul/infantry_slinger_b.xml +++ binaries/data/mods/public/simulation/templates/units/gaul/infantry_slinger_b.xml @@ -3,6 +3,7 @@ structures/gaul/assembly + structures/gaul/ambush_camp Index: binaries/data/mods/public/simulation/templates/units/gaul/infantry_spearman_b.xml =================================================================== --- binaries/data/mods/public/simulation/templates/units/gaul/infantry_spearman_b.xml +++ binaries/data/mods/public/simulation/templates/units/gaul/infantry_spearman_b.xml @@ -3,6 +3,7 @@ structures/gaul/assembly + structures/gaul/ambush_camp