From 9e96bca85e1cd442d71f396a56c16232c8360b13 Mon Sep 17 00:00:00 2001 From: mimo Date: Tue, 29 Aug 2017 18:23:16 +0000 Subject: [PATCH] petra: improve the way units capturing a structure react when attacked by enemy units + some code cleanup This was SVN commit r20072. --- .../ai/common-api/terrain-analysis.js | 2 +- .../public/simulation/ai/petra/attackPlan.js | 21 ++++++++++++++++++- .../simulation/ai/petra/headquarters.js | 4 +--- .../simulation/ai/petra/tradeManager.js | 8 +++---- 4 files changed, 26 insertions(+), 9 deletions(-) diff --git a/binaries/data/mods/public/simulation/ai/common-api/terrain-analysis.js b/binaries/data/mods/public/simulation/ai/common-api/terrain-analysis.js index d6dea06856..2ee29e8613 100644 --- a/binaries/data/mods/public/simulation/ai/common-api/terrain-analysis.js +++ b/binaries/data/mods/public/simulation/ai/common-api/terrain-analysis.js @@ -251,7 +251,7 @@ m.Accessibility.prototype.floodFill = function(startIndex, value, onWater) return false; } - if ((!onWater && this.landPassMap[startIndex] !== 0) || (onWater && this.navalPassMap[startIndex] !== 0) ) + if (!onWater && this.landPassMap[startIndex] !== 0 || onWater && this.navalPassMap[startIndex] !== 0 ) return false; // already painted. let floodFor = "land"; diff --git a/binaries/data/mods/public/simulation/ai/petra/attackPlan.js b/binaries/data/mods/public/simulation/ai/petra/attackPlan.js index e14ded0251..2de54a4113 100644 --- a/binaries/data/mods/public/simulation/ai/petra/attackPlan.js +++ b/binaries/data/mods/public/simulation/ai/petra/attackPlan.js @@ -1274,7 +1274,26 @@ m.AttackPlan.prototype.update = function(gameState, events) } } else - { // if units are attacked, abandon their target (if it was a structure or a support) and retaliate + { + // Look first for nearby units to help us if possible + let collec = this.unitCollection.filterNearest(ourUnit.position(), 2); + for (let ent of collec.values()) + { + if (m.isSiegeUnit(ent)) + continue; + let orderData = ent.unitAIOrderData(); + if (orderData && orderData.length && orderData[0].target) + { + if (orderData[0].target === attacker.id()) + continue; + let target = gameState.getEntityById(orderData[0].target); + if (target && !target.hasClass("Structure") && !target.hasClass("Support")) + continue; + } + ent.attack(attacker.id(), m.allowCapture(gameState, ent, attacker)); + ent.setMetadata(PlayerID, "lastAttackPlanUpdateTime", time); + } + // Then the unit under attack: abandon its target (if it was a structure or a support) and retaliate // also if our unit is attacking a range unit and the attacker is a melee unit, retaliate let orderData = ourUnit.unitAIOrderData(); if (orderData && orderData.length && orderData[0].target) diff --git a/binaries/data/mods/public/simulation/ai/petra/headquarters.js b/binaries/data/mods/public/simulation/ai/petra/headquarters.js index ba8516fa75..2d5b2ec38e 100644 --- a/binaries/data/mods/public/simulation/ai/petra/headquarters.js +++ b/binaries/data/mods/public/simulation/ai/petra/headquarters.js @@ -1444,8 +1444,6 @@ m.HQ.prototype.buildWonder = function(gameState, queues, force = false) return; } - if (this.Config.debug > 0) - API3.warn(" civ " + gameState.getPlayerCiv() + " starts a plan for Wonder"); queues.wonder.addPlan(new m.ConstructionPlan(gameState, "structures/{civ}_wonder")); }; @@ -2253,7 +2251,7 @@ m.HQ.prototype.updateCaptureStrength = function(gameState) let orderData = ent.unitAIOrderData(); if (!orderData || !orderData.length || !orderData[0].attackType) continue; - if ((orderData[0].attackType === "Capture") !== allowCapture) + if (orderData[0].attackType === "Capture" !== allowCapture) ent.attack(targetId, allowCapture); } } diff --git a/binaries/data/mods/public/simulation/ai/petra/tradeManager.js b/binaries/data/mods/public/simulation/ai/petra/tradeManager.js index c257f00f7e..d28cc1100c 100644 --- a/binaries/data/mods/public/simulation/ai/petra/tradeManager.js +++ b/binaries/data/mods/public/simulation/ai/petra/tradeManager.js @@ -55,8 +55,8 @@ m.TradeManager.prototype.trainMoreTraders = function(gameState, queues) } }); if (numTraders >= this.targetNumTraders && - ((!this.tradeRoute.sea && numLandTraders >= Math.floor(this.targetNumTraders/2)) || - (this.tradeRoute.sea && numSeaTraders >= Math.floor(this.targetNumTraders/2)))) + (!this.tradeRoute.sea && numLandTraders >= Math.floor(this.targetNumTraders/2) || + this.tradeRoute.sea && numSeaTraders >= Math.floor(this.targetNumTraders/2))) return; let template; @@ -536,8 +536,8 @@ m.TradeManager.prototype.checkTrader = function(gameState, ent) let possibleRoute = this.checkRoutes(gameState, access); // Warning: presentRoute is from metadata, so contains entity ids if (!possibleRoute || - (possibleRoute.source.id() != presentRoute.source && possibleRoute.source.id() != presentRoute.target) || - (possibleRoute.target.id() != presentRoute.source && possibleRoute.target.id() != presentRoute.target)) + possibleRoute.source.id() != presentRoute.source && possibleRoute.source.id() != presentRoute.target || + possibleRoute.target.id() != presentRoute.source && possibleRoute.target.id() != presentRoute.target) { // Trader will be assigned in updateTrader ent.setMetadata(PlayerID, "route", undefined);