Currently, only rectangles and circles obstruction are taken into account when trying to position a structure. That patch adds support for those defined by Right/Left obstructions.
This patch also computes the min radius (inner circle) which is needed by D783 (fix the minDistance BuildRestriction) to avoid the code dupplication currently done in D783.
Details
Details
- Reviewers
- None
- Commits
- rP20052: AI: take more obstruction shapes into account
Test on delenda that romans can position arches.
No need to know the AI code for that patch :)
Diff Detail
Diff Detail
- Repository
- rP 0 A.D. Public Repository
- Lint
Automatic diff as part of commit; lint not applicable. - Unit
Automatic diff as part of commit; unit tests not applicable.
Event Timeline
Comment Actions
Executing section Default... Executing section Source... Executing section JS... binaries/data/mods/public/simulation/ai/petra/baseManager.js | 217| » » resources.forEach(function(supply) | | [NORMAL] JSHintBear: | | Don't make functions within a loop. binaries/data/mods/public/simulation/ai/petra/baseManager.js | 479| » » » » this.gatherersByType(gameState,·type).forEach(function·(ent)·{ | | [NORMAL] JSHintBear: | | Don't make functions within a loop. binaries/data/mods/public/simulation/ai/petra/baseManager.js | 534| » » this.gatherersByType(gameState,·res).forEach(function·(ent)·{ | | [NORMAL] JSHintBear: | | Don't make functions within a loop. binaries/data/mods/public/simulation/ai/petra/baseManager.js | 543| » » » this.workersBySubrole(gameState,·"hunter").forEach(function·(ent)·{ | | [NORMAL] JSHintBear: | | Don't make functions within a loop. binaries/data/mods/public/simulation/ai/petra/baseManager.js | 550| » » » this.workersBySubrole(gameState,·"fisher").forEach(function·(ent)·{ | | [NORMAL] JSHintBear: | | Don't make functions within a loop. binaries/data/mods/public/simulation/ai/petra/baseManager.js | 618| » » » » gatherers.forEach(·function·(ent)·{ | | [NORMAL] JSHintBear: | | Don't make functions within a loop. binaries/data/mods/public/simulation/ai/petra/baseManager.js | 833| » » » idleBuilderWorkers.forEach(function(ent)·{ | | [NORMAL] JSHintBear: | | Don't make functions within a loop. binaries/data/mods/public/simulation/ai/petra/baseManager.js | 844| » » » » let·nonBuilderWorkers·=·workers.filter(function(ent)·{ | | [NORMAL] JSHintBear: | | Don't make functions within a loop. binaries/data/mods/public/simulation/ai/petra/baseManager.js | 856| » » » » nonBuilderWorkers.sort(function·(workerA,workerB) | | [NORMAL] JSHintBear: | | Don't make functions within a loop. binaries/data/mods/public/simulation/ai/petra/baseManager.js | 918| » » » idleBuilderWorkers.forEach(function(ent)·{ | | [NORMAL] JSHintBear: | | Don't make functions within a loop. binaries/data/mods/public/simulation/ai/petra/baseManager.js | 929| » » » » let·nonBuilderWorkers·=·workers.filter(function(ent)·{ | | [NORMAL] JSHintBear: | | Don't make functions within a loop. binaries/data/mods/public/simulation/ai/petra/baseManager.js | 943| » » » » nearestNonBuilders.forEach(function(ent)·{ | | [NORMAL] JSHintBear: | | Don't make functions within a loop. binaries/data/mods/public/simulation/ai/petra/headquarters.js | 168| » » » » builders.forEach(function·(worker)·{ | | [NORMAL] JSHintBear: | | Don't make functions within a loop. binaries/data/mods/public/simulation/ai/petra/headquarters.js |2319| » » if·(gameState.ai.playedTurn·%·4·==·0) | | [NORMAL] JSHintBear: | | Use '===' to compare with '0'. | | [NORMAL] ESLintBear (no-multi-spaces): | | Multiple spaces found before '='. |----| | /mnt/data/jenkins-phabricator/workspace/phabricator_lint/binaries/data/mods/public/simulation/ai/petra/attackPlan.js | |++++| /mnt/data/jenkins-phabricator/workspace/phabricator_lint/binaries/data/mods/public/simulation/ai/petra/attackPlan.js | 127| 127| { | 128| 128| priority = 90; | 129| 129| // basically we want a mix of citizen soldiers so our barracks have a purpose, and champion units. | 130| |- this.unitStat.RangedInfantry = { "priority": 0.7, "minSize": 5, "targetSize": 20, "batchSize": 5, "classes": ["Infantry", "Ranged", "CitizenSoldier"], | | 130|+ this.unitStat.RangedInfantry = { "priority": 0.7, "minSize": 5, "targetSize": 20, "batchSize": 5, "classes": ["Infantry", "Ranged", "CitizenSoldier"], | 131| 131| "interests": [["strength",3], ["cost",1] ] }; | 132| 132| this.unitStat.MeleeInfantry = { "priority": 0.7, "minSize": 5, "targetSize": 20, "batchSize": 5, "classes": ["Infantry", "Melee", "CitizenSoldier"], | 133| 133| "interests": [ ["strength",3], ["cost",1] ] }; | | [NORMAL] ESLintBear (no-multi-spaces): | | Multiple spaces found before '='. |----| | /mnt/data/jenkins-phabricator/workspace/phabricator_lint/binaries/data/mods/public/simulation/ai/petra/attackPlan.js | |++++| /mnt/data/jenkins-phabricator/workspace/phabricator_lint/binaries/data/mods/public/simulation/ai/petra/attackPlan.js | 129| 129| // basically we want a mix of citizen soldiers so our barracks have a purpose, and champion units. | 130| 130| this.unitStat.RangedInfantry = { "priority": 0.7, "minSize": 5, "targetSize": 20, "batchSize": 5, "classes": ["Infantry", "Ranged", "CitizenSoldier"], | 131| 131| "interests": [["strength",3], ["cost",1] ] }; | 132| |- this.unitStat.MeleeInfantry = { "priority": 0.7, "minSize": 5, "targetSize": 20, "batchSize": 5, "classes": ["Infantry", "Melee", "CitizenSoldier"], | | 132|+ this.unitStat.MeleeInfantry = { "priority": 0.7, "minSize": 5, "targetSize": 20, "batchSize": 5, "classes": ["Infantry", "Melee", "CitizenSoldier"], | 133| 133| "interests": [ ["strength",3], ["cost",1] ] }; | 134| 134| this.unitStat.ChampRangedInfantry = { "priority": 1, "minSize": 3, "targetSize": 18, "batchSize": 3, "classes": ["Infantry", "Ranged", "Champion"], | 135| 135| "interests": [["strength",3], ["cost",1] ] }; | | [NORMAL] ESLintBear (no-multi-spaces): | | Multiple spaces found before '='. |----| | /mnt/data/jenkins-phabricator/workspace/phabricator_lint/binaries/data/mods/public/simulation/ai/petra/attackPlan.js | |++++| /mnt/data/jenkins-phabricator/workspace/phabricator_lint/binaries/data/mods/public/simulation/ai/petra/attackPlan.js | 133| 133| "interests": [ ["strength",3], ["cost",1] ] }; | 134| 134| this.unitStat.ChampRangedInfantry = { "priority": 1, "minSize": 3, "targetSize": 18, "batchSize": 3, "classes": ["Infantry", "Ranged", "Champion"], | 135| 135| "interests": [["strength",3], ["cost",1] ] }; | 136| |- this.unitStat.ChampMeleeInfantry = { "priority": 1, "minSize": 3, "targetSize": 18, "batchSize": 3, "classes": ["Infantry", "Melee", "Champion"], | | 136|+ this.unitStat.ChampMeleeInfantry = { "priority": 1, "minSize": 3, "targetSize": 18, "batchSize": 3, "classes": ["Infantry", "Melee", "Champion"], | 137| 137| "interests": [ ["strength",3], ["cost",1] ] }; | 138| 138| this.unitStat.RangedCavalry = { "priority": 0.7, "minSize": 4, "targetSize": 20, "batchSize": 4, "classes": ["Cavalry", "Ranged", "CitizenSoldier"], | 139| 139| "interests": [ ["strength",2], ["cost",1] ] }; | | [NORMAL] ESLintBear (no-multi-spaces): | | Multiple spaces found before '='. |----| | /mnt/data/jenkins-phabricator/workspace/phabricator_lint/binaries/data/mods/public/simulation/ai/petra/attackPlan.js | |++++| /mnt/data/jenkins-phabricator/workspace/phabricator_lint/binaries/data/mods/public/simulation/ai/petra/attackPlan.js | 135| 135| "interests": [["strength",3], ["cost",1] ] }; | 136| 136| this.unitStat.ChampMeleeInfantry = { "priority": 1, "minSize": 3, "targetSize": 18, "batchSize": 3, "classes": ["Infantry", "Melee", "Champion"], | 137| 137| "interests": [ ["strength",3], ["cost",1] ] }; | 138| |- this.unitStat.RangedCavalry = { "priority": 0.7, "minSize": 4, "targetSize": 20, "batchSize": 4, "classes": ["Cavalry", "Ranged", "CitizenSoldier"], | | 138|+ this.unitStat.RangedCavalry = { "priority": 0.7, "minSize": 4, "targetSize": 20, "batchSize": 4, "classes": ["Cavalry", "Ranged", "CitizenSoldier"], | 139| 139| "interests": [ ["strength",2], ["cost",1] ] }; | 140| 140| this.unitStat.MeleeCavalry = { "priority": 0.7, "minSize": 4, "targetSize": 20, "batchSize": 4, "classes": ["Cavalry", "Melee", "CitizenSoldier"], | 141| 141| "interests": [ ["strength",2], ["cost",1] ] }; | | [NORMAL] ESLintBear (no-multi-spaces): | | Multiple spaces found before '='. |----| | /mnt/data/jenkins-phabricator/workspace/phabricator_lint/binaries/data/mods/public/simulation/ai/petra/attackPlan.js | |++++| /mnt/data/jenkins-phabricator/workspace/phabricator_lint/binaries/data/mods/public/simulation/ai/petra/attackPlan.js | 137| 137| "interests": [ ["strength",3], ["cost",1] ] }; | 138| 138| this.unitStat.RangedCavalry = { "priority": 0.7, "minSize": 4, "targetSize": 20, "batchSize": 4, "classes": ["Cavalry", "Ranged", "CitizenSoldier"], | 139| 139| "interests": [ ["strength",2], ["cost",1] ] }; | 140| |- this.unitStat.MeleeCavalry = { "priority": 0.7, "minSize": 4, "targetSize": 20, "batchSize": 4, "classes": ["Cavalry", "Melee", "CitizenSoldier"], | | 140|+ this.unitStat.MeleeCavalry = { "priority": 0.7, "minSize": 4, "targetSize": 20, "batchSize": 4, "classes": ["Cavalry", "Melee", "CitizenSoldier"], | 141| 141| "interests": [ ["strength",2], ["cost",1] ] }; | 142| 142| this.unitStat.ChampRangedCavalry = { "priority": 1, "minSize": 3, "targetSize": 15, "batchSize": 3, "classes": ["Cavalry", "Ranged", "Champion"], | 143| 143| "interests": [ ["strength",3], ["cost",1] ] }; | | [NORMAL] ESLintBear (no-multi-spaces): | | Multiple spaces found before '='. |----| | /mnt/data/jenkins-phabricator/workspace/phabricator_lint/binaries/data/mods/public/simulation/ai/petra/attackPlan.js | |++++| /mnt/data/jenkins-phabricator/workspace/phabricator_lint/binaries/data/mods/public/simulation/ai/petra/attackPlan.js | 139| 139| "interests": [ ["strength",2], ["cost",1] ] }; | 140| 140| this.unitStat.MeleeCavalry = { "priority": 0.7, "minSize": 4, "targetSize": 20, "batchSize": 4, "classes": ["Cavalry", "Melee", "CitizenSoldier"], | 141| 141| "interests": [ ["strength",2], ["cost",1] ] }; | 142| |- this.unitStat.ChampRangedCavalry = { "priority": 1, "minSize": 3, "targetSize": 15, "batchSize": 3, "classes": ["Cavalry", "Ranged", "Champion"], | | 142|+ this.unitStat.ChampRangedCavalry = { "priority": 1, "minSize": 3, "targetSize": 15, "batchSize": 3, "classes": ["Cavalry", "Ranged", "Champion"], | 143| 143| "interests": [ ["strength",3], ["cost",1] ] }; | 144| 144| this.unitStat.ChampMeleeCavalry = { "priority": 1, "minSize": 3, "targetSize": 15, "batchSize": 3, "classes": ["Cavalry", "Melee", "Champion"], | 145| 145| "interests": [ ["strength",2], ["cost",1] ] }; | | [NORMAL] ESLintBear (no-multi-spaces): | | Multiple spaces found before '='. |----| | /mnt/data/jenkins-phabricator/workspace/phabricator_lint/binaries/data/mods/public/simulation/ai/petra/attackPlan.js | |++++| /mnt/data/jenkins-phabricator/workspace/phabricator_lint/binaries/data/mods/public/simulation/ai/petra/attackPlan.js | 141| 141| "interests": [ ["strength",2], ["cost",1] ] }; | 142| 142| this.unitStat.ChampRangedCavalry = { "priority": 1, "minSize": 3, "targetSize": 15, "batchSize": 3, "classes": ["Cavalry", "Ranged", "Champion"], | 143| 143| "interests": [ ["strength",3], ["cost",1] ] }; | 144| |- this.unitStat.ChampMeleeCavalry = { "priority": 1, "minSize": 3, "targetSize": 15, "batchSize": 3, "classes": ["Cavalry", "Melee", "Champion"], | | 144|+ this.unitStat.ChampMeleeCavalry = { "priority": 1, "minSize": 3, "targetSize": 15, "batchSize": 3, "classes": ["Cavalry", "Melee", "Champion"], | 145| 145| "interests": [ ["strength",2], ["cost",1] ] }; | 146| 146| this.unitStat.Hero = { "priority": 1, "minSize": 0, "targetSize": 1, "batchSize": 1, "classes": ["Hero"], | 147| 147| "interests": [ ["strength",2], ["cost",1] ] }; | | [NORMAL] ESLintBear (no-multi-spaces): | | Multiple spaces found before '='. |----| | /mnt/data/jenkins-phabricator/workspace/phabricator_lint/binaries/data/mods/public/simulation/ai/petra/attackPlan.js | |++++| /mnt/data/jenkins-phabricator/workspace/phabricator_lint/binaries/data/mods/public/simulation/ai/petra/attackPlan.js | 143| 143| "interests": [ ["strength",3], ["cost",1] ] }; | 144| 144| this.unitStat.ChampMeleeCavalry = { "priority": 1, "minSize": 3, "targetSize": 15, "batchSize": 3, "classes": ["Cavalry", "Melee", "Champion"], | 145| 145| "interests": [ ["strength",2], ["cost",1] ] }; | 146| |- this.unitStat.Hero = { "priority": 1, "minSize": 0, "targetSize": 1, "batchSize": 1, "classes": ["Hero"], | | 146|+ this.unitStat.Hero = { "priority": 1, "minSize": 0, "targetSize": 1, "batchSize": 1, "classes": ["Hero"], | 147| 147| "interests": [ ["strength",2], ["cost",1] ] }; | 148| 148| this.neededShips = 5; | 149| 149| } | | [NORMAL] ESLintBear (no-multi-spaces): | | Multiple spaces found before '='. |----| | /mnt/data/jenkins-phabricator/workspace/phabricator_lint/binaries/data/mods/public/simulation/ai/petra/attackPlan.js | |++++| /mnt/data/jenkins-phabricator/workspace/phabricator_lint/binaries/data/mods/public/simulation/ai/petra/attackPlan.js | 152| 152| priority = 70; | 153| 153| this.unitStat.RangedInfantry = { "priority": 1, "minSize": 6, "targetSize": 16, "batchSize": 3, "classes": ["Infantry","Ranged"], | 154| 154| "interests": [ ["canGather", 1], ["strength",1.6], ["cost",1.5], ["costsResource", 0.3, "stone"], ["costsResource", 0.3, "metal"] ] }; | 155| |- this.unitStat.MeleeInfantry = { "priority": 1, "minSize": 6, "targetSize": 16, "batchSize": 3, "classes": ["Infantry","Melee"], | | 155|+ this.unitStat.MeleeInfantry = { "priority": 1, "minSize": 6, "targetSize": 16, "batchSize": 3, "classes": ["Infantry","Melee"], | 156| 156| "interests": [ ["canGather", 1], ["strength",1.6], ["cost",1.5], ["costsResource", 0.3, "stone"], ["costsResource", 0.3, "metal"] ] }; | 157| 157| this.unitStat.Cavalry = { "priority": 1, "minSize": 2, "targetSize": 6, "batchSize": 2, "classes": ["Cavalry", "CitizenSoldier"], | 158| 158| "interests": [ ["strength",1], ["cost",1] ] }; binaries/data/mods/public/simulation/ai/petra/attackPlan.js |1437| » » » » let·mStruct·=·enemyStructures.filter(function·(enemy)·{ | | [NORMAL] JSHintBear: | | Don't make functions within a loop. binaries/data/mods/public/simulation/ai/petra/attackPlan.js |1450| » » » » » mStruct.sort(function·(structa,·structb) | | [NORMAL] JSHintBear: | | Don't make functions within a loop. binaries/data/mods/public/simulation/ai/petra/attackPlan.js |1490| » » » » let·mUnit·=·enemyUnits.filter(function·(enemy)·{ | | [NORMAL] JSHintBear: | | Don't make functions within a loop. binaries/data/mods/public/simulation/ai/petra/attackPlan.js |1510| » » » » » mUnit.sort(function·(unitA,unitB)·{ | | [NORMAL] JSHintBear: | | Don't make functions within a loop. binaries/data/mods/public/simulation/ai/petra/attackPlan.js |1551| » » » » » let·mStruct·=·enemyStructures.filter(function·(enemy)·{ | | [NORMAL] JSHintBear: | | Don't make functions within a loop. binaries/data/mods/public/simulation/ai/petra/attackPlan.js |1564| » » » » » » mStruct.sort(function·(structa,structb)·{ | | [NORMAL] JSHintBear: | | Don't make functions within a loop. binaries/data/mods/public/simulation/ai/petra/attackPlan.js |1589| » » » » » » this.unitCollection.forEach(·function·(unit)·{ | | [NORMAL] JSHintBear: | | Don't make functions within a loop. binaries/data/mods/public/simulation/ai/common-api/entity.js | 167| » » » let·w·=·+right["@x"]·+·+right["@width"]/2·-·+left["@x"]·+·+left["@width"]/2; | | [NORMAL] JSHintBear: | | Confusing plusses. binaries/data/mods/public/simulation/ai/common-api/entity.js | 167| » » » let·w·=·+right["@x"]·+·+right["@width"]/2·-·+left["@x"]·+·+left["@width"]/2; | | [NORMAL] JSHintBear: | | Confusing plusses. binaries/data/mods/public/simulation/ai/common-api/entity.js | 168| » » » let·h·=·Math.max(+right["@z"]·+·+right["@depth"]/2,·+left["@z"]·+·+left["@depth"]/2) | | [NORMAL] JSHintBear: | | Confusing plusses. binaries/data/mods/public/simulation/ai/common-api/entity.js | 168| » » » let·h·=·Math.max(+right["@z"]·+·+right["@depth"]/2,·+left["@z"]·+·+left["@depth"]/2) | | [NORMAL] JSHintBear: | | Confusing plusses. binaries/data/mods/public/simulation/ai/common-api/entity.js | 169| » » » ······-·Math.min(+right["@z"]·-·+right["@depth"]/2,·+left["@z"]·-·+left["@depth"]/2); | | [NORMAL] JSHintBear: | | Misleading line break before '-'; readers may interpret this as an expression boundary. Executing section XML GUI... Executing section Python... Executing section Perl...
http://jw:8080/job/phabricator_lint/441/ for more details.
Comment Actions
Build has FAILED
Link to build: http://jw:8080/job/phabricator/1921/
See console output for more information: http://jw:8080/job/phabricator/1921/console