Index: ps/trunk/binaries/data/mods/public/simulation/ai/petra/entityExtend.js =================================================================== --- ps/trunk/binaries/data/mods/public/simulation/ai/petra/entityExtend.js +++ ps/trunk/binaries/data/mods/public/simulation/ai/petra/entityExtend.js @@ -300,6 +300,24 @@ return false; }; +/** + * Check if the straight line between the two positions crosses an enemy territory + */ +m.isLineInsideEnemyTerritory = function(gameState, pos1, pos2, step=70) +{ + let dist = Math.sqrt(API3.SquareVectorDistance(pos1, pos2)); + let n = Math.floor(Math.sqrt(API3.SquareVectorDistance(pos1, pos2))/step) + 1; + let stepx = (pos2[0] - pos1[0]) / n; + let stepy = (pos2[1] - pos1[1]) / n; + for (let i = 1; i < n; ++i) + { + let owner = gameState.ai.HQ.territoryMap.getOwner([pos1[0]+i*stepx, pos1[1]+i*stepy]); + if (owner && gameState.isPlayerEnemy(owner)) + return true; + } + return false; +}; + m.dumpEntity = function(ent) { if (!ent) Index: ps/trunk/binaries/data/mods/public/simulation/ai/petra/tradeManager.js =================================================================== --- ps/trunk/binaries/data/mods/public/simulation/ai/petra/tradeManager.js +++ ps/trunk/binaries/data/mods/public/simulation/ai/petra/tradeManager.js @@ -391,8 +391,8 @@ */ m.TradeManager.prototype.checkRoutes = function(gameState, accessIndex) { - let market1 = gameState.updatingCollection("OwnMarkets", API3.Filters.byClass("Market"), gameState.getOwnStructures()).toEntityArray(); - let market2 = gameState.updatingCollection("ExclusiveAllyMarkets", API3.Filters.byClass("Market"), gameState.getExclusiveAllyEntities()).toEntityArray(); + let market1 = gameState.updatingCollection("OwnMarkets", API3.Filters.byClass("Market"), gameState.getOwnStructures()); + let market2 = gameState.updatingCollection("ExclusiveAllyMarkets", API3.Filters.byClass("Market"), gameState.getExclusiveAllyEntities()); if (market1.length + market2.length < 2) // We have to wait ... markets will be built soon { this.tradeRoute = undefined; @@ -400,7 +400,8 @@ return false; } - if (!market2.length) + let onlyOurs = !market2.hasEntities(); + if (onlyOurs) market2 = market1; let candidate = { "gain": 0 }; let potential = { "gain": 0 }; @@ -409,15 +410,15 @@ let traderTemplatesGains = gameState.getTraderTemplatesGains(); - for (let m1 of market1) + for (let m1 of market1.values()) { if (!m1.position()) continue; let access1 = m.getLandAccess(gameState, m1); let sea1 = m1.hasClass("NavalMarket") ? m.getSeaAccess(gameState, m1) : undefined; - for (let m2 of market2) + for (let m2 of market2.values()) { - if (m1.id() === m2.id()) + if (onlyOurs && m1.id() >= m2.id()) continue; if (!m2.position()) continue; @@ -427,6 +428,8 @@ let sea = sea1 && sea1 == sea2 ? sea1 : undefined; if (!land && !sea) continue; + if (land && m.isLineInsideEnemyTerritory(gameState, m1.position(), m2.position())) + continue; let gainMultiplier; if (land && traderTemplatesGains.landGainMultiplier) gainMultiplier = traderTemplatesGains.landGainMultiplier; Index: ps/trunk/binaries/data/mods/public/simulation/helpers/Commands.js =================================================================== --- ps/trunk/binaries/data/mods/public/simulation/helpers/Commands.js +++ ps/trunk/binaries/data/mods/public/simulation/helpers/Commands.js @@ -172,11 +172,12 @@ "attack": function(player, cmd, data) { - if (g_DebugCommands && !(IsOwnedByEnemyOfPlayer(player, cmd.target) || IsOwnedByNeutralOfPlayer(player, cmd.target))) - warn("Invalid command: attack target is not owned by enemy of player "+player+": "+uneval(cmd)); - let allowCapture = cmd.allowCapture || cmd.allowCapture == null; + if (g_DebugCommands && !allowCapture && + !(IsOwnedByEnemyOfPlayer(player, cmd.target) || IsOwnedByNeutralOfPlayer(player, cmd.target))) + warn("Invalid command: attack target is not owned by enemy of player "+player+": "+uneval(cmd)); + GetFormationUnitAIs(data.entities, player).forEach(cmpUnitAI => { cmpUnitAI.Attack(cmd.target, cmd.queued, allowCapture); });