Index: binaries/data/mods/public/simulation/ai/common-api/map-module.js =================================================================== --- binaries/data/mods/public/simulation/ai/common-api/map-module.js +++ binaries/data/mods/public/simulation/ai/common-api/map-module.js @@ -271,9 +271,16 @@ let w = this.width; if (kx < radius || kx >= w - radius || ky < radius || ky >= w - radius || this.map[kx+ky*w] === 0) return true; + if (!this.pattern || this.pattern[0] != radius) + { + this.pattern = [radius]; + let r2 = radius * radius; + for (let i = 1; i <= radius; ++i) + this.pattern.push(Math.floor(Math.sqrt(r2 - (i-0.5)*(i-0.5)) + 0.5)); + } for (let dy = 0; dy <= radius; ++dy) { - let dxmax = dy === 0 ? radius : Math.ceil(Math.sqrt(radius*radius - (dy-0.5)*(dy-0.5))); + let dxmax = this.pattern[dy]; let xp = kx + (ky + dy)*w; let xm = kx + (ky - dy)*w; for (let dx = -dxmax; dx <= dxmax; ++dx) Index: binaries/data/mods/public/simulation/ai/petra/mapModule.js =================================================================== --- binaries/data/mods/public/simulation/ai/petra/mapModule.js +++ binaries/data/mods/public/simulation/ai/petra/mapModule.js @@ -91,17 +91,29 @@ let fromClass = template.buildDistance().FromClass; if (minDist && fromClass) { - let cellSize = passabilityMap.cellSize; - let cellDist = 1 + minDist / cellSize; - let structures = gameState.getOwnStructures().filter(API3.Filters.byClass(fromClass)); - for (let ent of structures.values()) + if (template.get("Obstruction")) { - if (!ent.position()) - continue; - let pos = ent.position(); - let x = Math.round(pos[0] / cellSize); - let z = Math.round(pos[1] / cellSize); - map.addInfluence(x, z, cellDist, -255, "constant"); + if (template.get("Obstruction/Static")) + minDist -= Math.min(+template.get("Obstruction/Static/@width"), + +template.get("Obstruction/Static/@depth")) / 2; + else if (template.get("Obstruction/Unit")) + minDist -= +template.get("Obstruction/Unit/@radius"); + } + + if (minDist > 0) + { + let cellSize = passabilityMap.cellSize; + let cellDist = 1 + minDist / cellSize; + let structures = gameState.getOwnStructures().filter(API3.Filters.byClass(fromClass)); + for (let ent of structures.values()) + { + if (!ent.position()) + continue; + let pos = ent.position(); + let x = Math.round(pos[0] / cellSize); + let z = Math.round(pos[1] / cellSize); + map.addInfluence(x, z, cellDist, -255, "constant"); + } } } }