@supalosa/chronodivide-bot 0.5.3 → 0.6.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (134) hide show
  1. package/.env.template +4 -4
  2. package/.github/workflows/npm-publish.yml +24 -0
  3. package/README.md +108 -97
  4. package/dist/bot/bot.js +105 -105
  5. package/dist/bot/bot.js.map +1 -1
  6. package/dist/bot/logic/awareness.js +136 -136
  7. package/dist/bot/logic/building/antiAirStaticDefence.js +42 -42
  8. package/dist/bot/logic/building/antiGroundStaticDefence.js +34 -30
  9. package/dist/bot/logic/building/antiGroundStaticDefence.js.map +1 -1
  10. package/dist/bot/logic/building/{ArtilleryUnit.js → artilleryUnit.js} +18 -18
  11. package/dist/bot/logic/building/basicAirUnit.js +19 -19
  12. package/dist/bot/logic/building/basicBuilding.js +26 -26
  13. package/dist/bot/logic/building/basicGroundUnit.js +19 -19
  14. package/dist/bot/logic/building/buildingRules.js +175 -174
  15. package/dist/bot/logic/building/buildingRules.js.map +1 -1
  16. package/dist/bot/logic/building/common.js +19 -18
  17. package/dist/bot/logic/building/common.js.map +1 -1
  18. package/dist/bot/logic/building/harvester.js +16 -16
  19. package/dist/bot/logic/building/powerPlant.js +20 -20
  20. package/dist/bot/logic/building/queueController.js +183 -183
  21. package/dist/bot/logic/building/resourceCollectionBuilding.js +36 -36
  22. package/dist/bot/logic/common/scout.js +126 -126
  23. package/dist/bot/logic/common/utils.js +95 -85
  24. package/dist/bot/logic/common/utils.js.map +1 -1
  25. package/dist/bot/logic/composition/alliedCompositions.js +12 -12
  26. package/dist/bot/logic/composition/common.js +1 -1
  27. package/dist/bot/logic/composition/sovietCompositions.js +12 -12
  28. package/dist/bot/logic/map/map.js +44 -44
  29. package/dist/bot/logic/map/sector.js +137 -137
  30. package/dist/bot/logic/mission/actionBatcher.js +91 -91
  31. package/dist/bot/logic/mission/mission.js +122 -122
  32. package/dist/bot/logic/mission/missionController.js +321 -321
  33. package/dist/bot/logic/mission/missionFactories.js +12 -12
  34. package/dist/bot/logic/mission/missions/attackMission.js +214 -214
  35. package/dist/bot/logic/mission/missions/defenceMission.js +82 -82
  36. package/dist/bot/logic/mission/missions/engineerMission.js +63 -63
  37. package/dist/bot/logic/mission/missions/expansionMission.js +60 -60
  38. package/dist/bot/logic/mission/missions/retreatMission.js +33 -33
  39. package/dist/bot/logic/mission/missions/scoutingMission.js +133 -133
  40. package/dist/bot/logic/mission/missions/squads/combatSquad.js +115 -115
  41. package/dist/bot/logic/mission/missions/squads/common.js +57 -57
  42. package/dist/bot/logic/mission/missions/squads/squad.js +1 -1
  43. package/dist/bot/logic/threat/threat.js +22 -22
  44. package/dist/bot/logic/threat/threatCalculator.js +73 -73
  45. package/dist/exampleBot.js +100 -112
  46. package/dist/exampleBot.js.map +1 -1
  47. package/package.json +32 -29
  48. package/src/bot/bot.ts +161 -161
  49. package/src/bot/logic/awareness.ts +245 -245
  50. package/src/bot/logic/building/antiAirStaticDefence.ts +64 -64
  51. package/src/bot/logic/building/antiGroundStaticDefence.ts +55 -51
  52. package/src/bot/logic/building/artilleryUnit.ts +39 -39
  53. package/src/bot/logic/building/basicAirUnit.ts +39 -39
  54. package/src/bot/logic/building/basicBuilding.ts +49 -49
  55. package/src/bot/logic/building/basicGroundUnit.ts +39 -39
  56. package/src/bot/logic/building/buildingRules.ts +250 -247
  57. package/src/bot/logic/building/common.ts +21 -23
  58. package/src/bot/logic/building/harvester.ts +31 -31
  59. package/src/bot/logic/building/powerPlant.ts +32 -32
  60. package/src/bot/logic/building/queueController.ts +297 -297
  61. package/src/bot/logic/building/resourceCollectionBuilding.ts +52 -52
  62. package/src/bot/logic/common/scout.ts +183 -183
  63. package/src/bot/logic/common/utils.ts +120 -112
  64. package/src/bot/logic/composition/alliedCompositions.ts +22 -22
  65. package/src/bot/logic/composition/common.ts +3 -3
  66. package/src/bot/logic/composition/sovietCompositions.ts +21 -21
  67. package/src/bot/logic/map/map.ts +66 -66
  68. package/src/bot/logic/map/sector.ts +174 -174
  69. package/src/bot/logic/mission/actionBatcher.ts +124 -124
  70. package/src/bot/logic/mission/mission.ts +232 -232
  71. package/src/bot/logic/mission/missionController.ts +413 -413
  72. package/src/bot/logic/mission/missionFactories.ts +51 -51
  73. package/src/bot/logic/mission/missions/attackMission.ts +336 -336
  74. package/src/bot/logic/mission/missions/defenceMission.ts +151 -151
  75. package/src/bot/logic/mission/missions/engineerMission.ts +113 -113
  76. package/src/bot/logic/mission/missions/expansionMission.ts +104 -104
  77. package/src/bot/logic/mission/missions/retreatMission.ts +54 -54
  78. package/src/bot/logic/mission/missions/scoutingMission.ts +186 -186
  79. package/src/bot/logic/mission/missions/squads/combatSquad.ts +160 -160
  80. package/src/bot/logic/mission/missions/squads/common.ts +63 -63
  81. package/src/bot/logic/mission/missions/squads/squad.ts +19 -19
  82. package/src/bot/logic/threat/threatCalculator.ts +100 -100
  83. package/src/exampleBot.ts +111 -124
  84. package/tsconfig.json +73 -73
  85. package/dist/bot/logic/building/building.js +0 -82
  86. package/dist/bot/logic/building/massedAntiGroundUnit.js +0 -20
  87. package/dist/bot/logic/building/queues.js +0 -19
  88. package/dist/bot/logic/knowledge.js +0 -1
  89. package/dist/bot/logic/mission/basicMission.js +0 -26
  90. package/dist/bot/logic/mission/behaviours/combatSquad.js +0 -124
  91. package/dist/bot/logic/mission/behaviours/combatSquad.js.map +0 -1
  92. package/dist/bot/logic/mission/behaviours/common.js +0 -56
  93. package/dist/bot/logic/mission/behaviours/common.js.map +0 -1
  94. package/dist/bot/logic/mission/behaviours/engineerSquad.js +0 -39
  95. package/dist/bot/logic/mission/behaviours/engineerSquad.js.map +0 -1
  96. package/dist/bot/logic/mission/behaviours/expansionSquad.js +0 -46
  97. package/dist/bot/logic/mission/behaviours/expansionSquad.js.map +0 -1
  98. package/dist/bot/logic/mission/behaviours/retreatSquad.js +0 -31
  99. package/dist/bot/logic/mission/behaviours/retreatSquad.js.map +0 -1
  100. package/dist/bot/logic/mission/behaviours/scoutingSquad.js +0 -94
  101. package/dist/bot/logic/mission/behaviours/scoutingSquad.js.map +0 -1
  102. package/dist/bot/logic/mission/expansionMission.js +0 -32
  103. package/dist/bot/logic/mission/missions/basicMission.js +0 -13
  104. package/dist/bot/logic/mission/missions/basicMission.js.map +0 -1
  105. package/dist/bot/logic/mission/missions/missionBehaviour.js +0 -2
  106. package/dist/bot/logic/mission/missions/missionBehaviour.js.map +0 -1
  107. package/dist/bot/logic/mission/missions/oneTimeMission.js +0 -27
  108. package/dist/bot/logic/mission/missions/oneTimeMission.js.map +0 -1
  109. package/dist/bot/logic/squad/behaviours/actionBatcher.js +0 -36
  110. package/dist/bot/logic/squad/behaviours/actionBatcher.js.map +0 -1
  111. package/dist/bot/logic/squad/behaviours/attackSquad.js +0 -82
  112. package/dist/bot/logic/squad/behaviours/combatSquad.js +0 -106
  113. package/dist/bot/logic/squad/behaviours/combatSquad.js.map +0 -1
  114. package/dist/bot/logic/squad/behaviours/common.js +0 -55
  115. package/dist/bot/logic/squad/behaviours/common.js.map +0 -1
  116. package/dist/bot/logic/squad/behaviours/defenceSquad.js +0 -48
  117. package/dist/bot/logic/squad/behaviours/engineerSquad.js +0 -38
  118. package/dist/bot/logic/squad/behaviours/engineerSquad.js.map +0 -1
  119. package/dist/bot/logic/squad/behaviours/expansionSquad.js +0 -45
  120. package/dist/bot/logic/squad/behaviours/expansionSquad.js.map +0 -1
  121. package/dist/bot/logic/squad/behaviours/retreatSquad.js +0 -31
  122. package/dist/bot/logic/squad/behaviours/retreatSquad.js.map +0 -1
  123. package/dist/bot/logic/squad/behaviours/scoutingSquad.js +0 -93
  124. package/dist/bot/logic/squad/behaviours/scoutingSquad.js.map +0 -1
  125. package/dist/bot/logic/squad/behaviours/squadExpansion.js +0 -31
  126. package/dist/bot/logic/squad/behaviours/squadScouters.js +0 -8
  127. package/dist/bot/logic/squad/squad.js +0 -126
  128. package/dist/bot/logic/squad/squad.js.map +0 -1
  129. package/dist/bot/logic/squad/squadBehaviour.js +0 -6
  130. package/dist/bot/logic/squad/squadBehaviour.js.map +0 -1
  131. package/dist/bot/logic/squad/squadBehaviours.js +0 -7
  132. package/dist/bot/logic/squad/squadBehaviours.js.map +0 -1
  133. package/dist/bot/logic/squad/squadController.js +0 -215
  134. package/dist/bot/logic/squad/squadController.js.map +0 -1
@@ -1,175 +1,176 @@
1
- import { GameMath, LandType, ObjectType, Vector2, } from "@chronodivide/game-api";
2
- import { AntiGroundStaticDefence } from "./antiGroundStaticDefence.js";
3
- import { ArtilleryUnit } from "./artilleryUnit.js";
4
- import { BasicAirUnit } from "./basicAirUnit.js";
5
- import { BasicBuilding } from "./basicBuilding.js";
6
- import { BasicGroundUnit } from "./basicGroundUnit.js";
7
- import { PowerPlant } from "./powerPlant.js";
8
- import { ResourceCollectionBuilding } from "./resourceCollectionBuilding.js";
9
- import { Harvester } from "./harvester.js";
10
- import { uniqBy } from "../common/utils.js";
11
- import { AntiAirStaticDefence } from "./antiAirStaticDefence.js";
12
- export function numBuildingsOwnedOfType(game, playerData, technoRules) {
13
- return game.getVisibleUnits(playerData.name, "self", (r) => r == technoRules).length;
14
- }
15
- export function numBuildingsOwnedOfName(game, playerData, name) {
16
- return game.getVisibleUnits(playerData.name, "self", (r) => r.name === name).length;
17
- }
18
- /**
19
- * Computes a rect 'centered' around a structure of a certain size with an additional radius (`adjacent`).
20
- * The radius is optionally expanded by the size of the new building.
21
- *
22
- * This is essentially the candidate placement around a given structure.
23
- *
24
- * @param point Top-left location of the inner rect.
25
- * @param t Size of the inner rect.
26
- * @param adjacent Amount to expand the building's inner rect by (so buildings must be adjacent by this many tiles)
27
- * @param newBuildingSize? Size of the new building
28
- * @returns
29
- */
30
- function computeAdjacentRect(point, t, adjacent, newBuildingSize) {
31
- return {
32
- x: point.x - adjacent - (newBuildingSize?.width || 0),
33
- y: point.y - adjacent - (newBuildingSize?.height || 0),
34
- width: t.width + 2 * adjacent + (newBuildingSize?.width || 0),
35
- height: t.height + 2 * adjacent + (newBuildingSize?.height || 0),
36
- };
37
- }
38
- export function getAdjacencyTiles(game, playerData, technoRules, onWater, minimumSpace) {
39
- const placementRules = game.getBuildingPlacementData(technoRules.name);
40
- const { width: newBuildingWidth, height: newBuildingHeight } = placementRules.foundation;
41
- const tiles = [];
42
- const buildings = game.getVisibleUnits(playerData.name, "self", (r) => r.type === ObjectType.Building);
43
- const removedTiles = new Set();
44
- for (let buildingId of buildings) {
45
- const building = game.getUnitData(buildingId);
46
- if (!building?.rules?.baseNormal) {
47
- // This building is not considered for adjacency checks.
48
- continue;
49
- }
50
- const { foundation, tile } = building;
51
- const buildingBase = new Vector2(tile.rx, tile.ry);
52
- const buildingSize = {
53
- width: foundation?.width,
54
- height: foundation?.height,
55
- };
56
- const range = computeAdjacentRect(buildingBase, buildingSize, technoRules.adjacent, placementRules.foundation);
57
- const baseTile = game.mapApi.getTile(range.x, range.y);
58
- if (!baseTile) {
59
- continue;
60
- }
61
- const adjacentTiles = game.mapApi
62
- .getTilesInRect(baseTile, {
63
- width: range.width,
64
- height: range.height,
65
- })
66
- .filter((tile) => !onWater || tile.landType === LandType.Water);
67
- tiles.push(...adjacentTiles);
68
- // Prevent placing the new building on tiles that would cause it to overlap with this building.
69
- const modifiedBase = new Vector2(buildingBase.x - (newBuildingWidth - 1), buildingBase.y - (newBuildingHeight - 1));
70
- const modifiedSize = {
71
- width: buildingSize.width + (newBuildingWidth - 1),
72
- height: buildingSize.height + (newBuildingHeight - 1),
73
- };
74
- const blockedRect = computeAdjacentRect(modifiedBase, modifiedSize, minimumSpace);
75
- const buildingTiles = adjacentTiles.filter((tile) => {
76
- return (tile.rx >= blockedRect.x &&
77
- tile.rx < blockedRect.x + blockedRect.width &&
78
- tile.ry >= blockedRect.y &&
79
- tile.ry < blockedRect.y + blockedRect.height);
80
- });
81
- buildingTiles.forEach((buildingTile) => removedTiles.add(buildingTile.id));
82
- }
83
- // Remove duplicate tiles.
84
- const withDuplicatesRemoved = uniqBy(tiles, (tile) => tile.id);
85
- // Remove tiles containing buildings and potentially area around them removed as well.
86
- return withDuplicatesRemoved.filter((tile) => !removedTiles.has(tile.id));
87
- }
88
- function getTileDistances(startPoint, tiles) {
89
- return tiles
90
- .map((tile) => ({
91
- tile,
92
- distance: distance(tile.rx, tile.ry, startPoint.x, startPoint.y),
93
- }))
94
- .sort((a, b) => {
95
- return a.distance - b.distance;
96
- });
97
- }
98
- function distance(x1, y1, x2, y2) {
99
- var dx = x1 - x2;
100
- var dy = y1 - y2;
101
- let tmp = dx * dx + dy * dy;
102
- if (0 === tmp) {
103
- return 0;
104
- }
105
- return GameMath.sqrt(tmp);
106
- }
107
- export function getDefaultPlacementLocation(game, playerData, idealPoint, technoRules, onWater = false, minSpace = 1) {
108
- // Closest possible location near `startPoint`.
109
- const size = game.getBuildingPlacementData(technoRules.name);
110
- if (!size) {
111
- return undefined;
112
- }
113
- const tiles = getAdjacencyTiles(game, playerData, technoRules, onWater, minSpace);
114
- const tileDistances = getTileDistances(idealPoint, tiles);
115
- for (let tileDistance of tileDistances) {
116
- if (tileDistance.tile && game.canPlaceBuilding(playerData.name, technoRules.name, tileDistance.tile)) {
117
- return tileDistance.tile;
118
- }
119
- }
120
- return undefined;
121
- }
122
- export const DEFAULT_BUILDING_PRIORITY = 0;
123
- export const BUILDING_NAME_TO_RULES = new Map([
124
- // Allied
125
- ["GAPOWR", new PowerPlant()],
126
- ["GAREFN", new ResourceCollectionBuilding(10, 3)],
127
- ["GAWEAP", new BasicBuilding(15, 1)],
128
- ["GAPILE", new BasicBuilding(12, 1)],
129
- ["CMIN", new Harvester(15, 4, 2)],
130
- ["GADEPT", new BasicBuilding(1, 1, 10000)],
131
- ["GAAIRC", new BasicBuilding(10, 1, 500)],
132
- ["AMRADR", new BasicBuilding(10, 1, 500)],
133
- ["GATECH", new BasicBuilding(20, 1, 4000)],
134
- ["GAYARD", new BasicBuilding(0, 0, 0)],
135
- ["GAPILL", new AntiGroundStaticDefence(2, 1, 5)],
136
- ["ATESLA", new AntiGroundStaticDefence(2, 1, 10)],
137
- ["NASAM", new AntiAirStaticDefence(2, 1, 5)],
138
- ["GAWALL", new AntiGroundStaticDefence(0, 0, 0)],
139
- ["E1", new BasicGroundUnit(2, 2, 0.2, 0)],
140
- ["ENGINEER", new BasicGroundUnit(1, 0, 0)],
141
- ["MTNK", new BasicGroundUnit(10, 3, 2, 0)],
142
- ["MGTK", new BasicGroundUnit(10, 1, 2.5, 0)],
143
- ["FV", new BasicGroundUnit(5, 2, 0.5, 1)],
144
- ["JUMPJET", new BasicAirUnit(10, 1, 1, 1)],
145
- ["ORCA", new BasicAirUnit(7, 1, 2, 0)],
146
- ["SREF", new ArtilleryUnit(10, 5, 3, 3)],
147
- ["CLEG", new BasicGroundUnit(0, 0)],
148
- ["SHAD", new BasicGroundUnit(0, 0)],
149
- // Soviet
150
- ["NAPOWR", new PowerPlant()],
151
- ["NAREFN", new ResourceCollectionBuilding(10, 3)],
152
- ["NAWEAP", new BasicBuilding(15, 1)],
153
- ["NAHAND", new BasicBuilding(12, 1)],
154
- ["HARV", new Harvester(15, 4, 2)],
155
- ["NADEPT", new BasicBuilding(1, 1, 10000)],
156
- ["NARADR", new BasicBuilding(10, 1, 500)],
157
- ["NANRCT", new PowerPlant()],
158
- ["NAYARD", new BasicBuilding(0, 0, 0)],
159
- ["NATECH", new BasicBuilding(20, 1, 4000)],
160
- ["NALASR", new AntiGroundStaticDefence(2, 1, 5)],
161
- ["NAFLAK", new AntiAirStaticDefence(2, 1, 5)],
162
- ["TESLA", new AntiGroundStaticDefence(2, 1, 10)],
163
- ["NAWALL", new AntiGroundStaticDefence(0, 0, 0)],
164
- ["E2", new BasicGroundUnit(2, 2, 0.2, 0)],
165
- ["SENGINEER", new BasicGroundUnit(1, 0, 0)],
166
- ["FLAKT", new BasicGroundUnit(2, 2, 0.1, 0.3)],
167
- ["YURI", new BasicGroundUnit(1, 1, 1, 0)],
168
- ["DOG", new BasicGroundUnit(1, 1, 0, 0)],
169
- ["HTNK", new BasicGroundUnit(10, 3, 3, 0)],
170
- ["APOC", new BasicGroundUnit(6, 1, 5, 0)],
171
- ["HTK", new BasicGroundUnit(5, 2, 0.33, 1.5)],
172
- ["ZEP", new BasicAirUnit(5, 1, 5, 1)],
173
- ["V3", new ArtilleryUnit(9, 10, 0, 3)], // V3 Rocket Launcher
174
- ]);
1
+ import { GameMath, LandType, ObjectType, Vector2, } from "@chronodivide/game-api";
2
+ import { AntiGroundStaticDefence } from "./antiGroundStaticDefence.js";
3
+ import { ArtilleryUnit } from "./artilleryUnit.js";
4
+ import { BasicAirUnit } from "./basicAirUnit.js";
5
+ import { BasicBuilding } from "./basicBuilding.js";
6
+ import { BasicGroundUnit } from "./basicGroundUnit.js";
7
+ import { PowerPlant } from "./powerPlant.js";
8
+ import { ResourceCollectionBuilding } from "./resourceCollectionBuilding.js";
9
+ import { Harvester } from "./harvester.js";
10
+ import { uniqBy } from "../common/utils.js";
11
+ import { AntiAirStaticDefence } from "./antiAirStaticDefence.js";
12
+ export function numBuildingsOwnedOfType(game, playerData, technoRules) {
13
+ return game.getVisibleUnits(playerData.name, "self", (r) => r == technoRules).length;
14
+ }
15
+ export function numBuildingsOwnedOfName(game, playerData, name) {
16
+ return game.getVisibleUnits(playerData.name, "self", (r) => r.name === name).length;
17
+ }
18
+ /**
19
+ * Computes a rect 'centered' around a structure of a certain size with an additional radius (`adjacent`).
20
+ * The radius is optionally expanded by the size of the new building.
21
+ *
22
+ * This is essentially the candidate placement around a given structure.
23
+ *
24
+ * @param point Top-left location of the inner rect.
25
+ * @param t Size of the inner rect.
26
+ * @param adjacent Amount to expand the building's inner rect by (so buildings must be adjacent by this many tiles)
27
+ * @param newBuildingSize? Size of the new building
28
+ * @returns
29
+ */
30
+ function computeAdjacentRect(point, t, adjacent, newBuildingSize) {
31
+ return {
32
+ x: point.x - adjacent - (newBuildingSize?.width || 0),
33
+ y: point.y - adjacent - (newBuildingSize?.height || 0),
34
+ width: t.width + 2 * adjacent + (newBuildingSize?.width || 0),
35
+ height: t.height + 2 * adjacent + (newBuildingSize?.height || 0),
36
+ };
37
+ }
38
+ function getAdjacentTiles(game, range, onWater) {
39
+ // use the bulk API to get all tiles from the baseTile to the (baseTile + range)
40
+ const adjacentTiles = game.mapApi
41
+ .getTilesInRect(range)
42
+ .filter((tile) => !onWater || tile.landType === LandType.Water);
43
+ return adjacentTiles;
44
+ }
45
+ export function getAdjacencyTiles(game, playerData, technoRules, onWater, minimumSpace) {
46
+ const placementRules = game.getBuildingPlacementData(technoRules.name);
47
+ const { width: newBuildingWidth, height: newBuildingHeight } = placementRules.foundation;
48
+ const tiles = [];
49
+ const buildings = game.getVisibleUnits(playerData.name, "self", (r) => r.type === ObjectType.Building);
50
+ const removedTiles = new Set();
51
+ for (let buildingId of buildings) {
52
+ const building = game.getUnitData(buildingId);
53
+ if (!building?.rules?.baseNormal) {
54
+ // This building is not considered for adjacency checks.
55
+ continue;
56
+ }
57
+ const { foundation, tile } = building;
58
+ const buildingBase = new Vector2(tile.rx, tile.ry);
59
+ const buildingSize = {
60
+ width: foundation?.width,
61
+ height: foundation?.height,
62
+ };
63
+ const range = computeAdjacentRect(buildingBase, buildingSize, technoRules.adjacent, placementRules.foundation);
64
+ const adjacentTiles = getAdjacentTiles(game, range, onWater);
65
+ if (adjacentTiles.length === 0) {
66
+ continue;
67
+ }
68
+ tiles.push(...adjacentTiles);
69
+ // Prevent placing the new building on tiles that would cause it to overlap with this building.
70
+ const modifiedBase = new Vector2(buildingBase.x - (newBuildingWidth - 1), buildingBase.y - (newBuildingHeight - 1));
71
+ const modifiedSize = {
72
+ width: buildingSize.width + (newBuildingWidth - 1),
73
+ height: buildingSize.height + (newBuildingHeight - 1),
74
+ };
75
+ const blockedRect = computeAdjacentRect(modifiedBase, modifiedSize, minimumSpace);
76
+ const buildingTiles = adjacentTiles.filter((tile) => {
77
+ return (tile.rx >= blockedRect.x &&
78
+ tile.rx < blockedRect.x + blockedRect.width &&
79
+ tile.ry >= blockedRect.y &&
80
+ tile.ry < blockedRect.y + blockedRect.height);
81
+ });
82
+ buildingTiles.forEach((buildingTile) => removedTiles.add(buildingTile.id));
83
+ }
84
+ // Remove duplicate tiles.
85
+ const withDuplicatesRemoved = uniqBy(tiles, (tile) => tile.id);
86
+ // Remove tiles containing buildings and potentially area around them removed as well.
87
+ return withDuplicatesRemoved.filter((tile) => !removedTiles.has(tile.id));
88
+ }
89
+ function getTileDistances(startPoint, tiles) {
90
+ return tiles
91
+ .map((tile) => ({
92
+ tile,
93
+ distance: distance(tile.rx, tile.ry, startPoint.x, startPoint.y),
94
+ }))
95
+ .sort((a, b) => {
96
+ return a.distance - b.distance;
97
+ });
98
+ }
99
+ function distance(x1, y1, x2, y2) {
100
+ var dx = x1 - x2;
101
+ var dy = y1 - y2;
102
+ let tmp = dx * dx + dy * dy;
103
+ if (0 === tmp) {
104
+ return 0;
105
+ }
106
+ return GameMath.sqrt(tmp);
107
+ }
108
+ export function getDefaultPlacementLocation(game, playerData, idealPoint, technoRules, onWater = false, minSpace = 1) {
109
+ // Closest possible location near `startPoint`.
110
+ const size = game.getBuildingPlacementData(technoRules.name);
111
+ if (!size) {
112
+ return undefined;
113
+ }
114
+ const tiles = getAdjacencyTiles(game, playerData, technoRules, onWater, minSpace);
115
+ const tileDistances = getTileDistances(idealPoint, tiles);
116
+ for (let tileDistance of tileDistances) {
117
+ if (tileDistance.tile && game.canPlaceBuilding(playerData.name, technoRules.name, tileDistance.tile)) {
118
+ return tileDistance.tile;
119
+ }
120
+ }
121
+ return undefined;
122
+ }
123
+ export const DEFAULT_BUILDING_PRIORITY = 0;
124
+ export const BUILDING_NAME_TO_RULES = new Map([
125
+ // Allied
126
+ ["GAPOWR", new PowerPlant()],
127
+ ["GAREFN", new ResourceCollectionBuilding(10, 3)],
128
+ ["GAWEAP", new BasicBuilding(15, 1)],
129
+ ["GAPILE", new BasicBuilding(12, 1)],
130
+ ["CMIN", new Harvester(15, 4, 2)],
131
+ ["GADEPT", new BasicBuilding(1, 1, 10000)],
132
+ ["GAAIRC", new BasicBuilding(10, 1, 500)],
133
+ ["AMRADR", new BasicBuilding(10, 1, 500)],
134
+ ["GATECH", new BasicBuilding(20, 1, 4000)],
135
+ ["GAYARD", new BasicBuilding(0, 0, 0)],
136
+ ["GAPILL", new AntiGroundStaticDefence(2, 1, 5, 5)],
137
+ ["ATESLA", new AntiGroundStaticDefence(2, 1, 10, 3)],
138
+ ["NASAM", new AntiAirStaticDefence(2, 1, 5)],
139
+ ["GAWALL", new AntiGroundStaticDefence(0, 0, 0, 0)],
140
+ ["E1", new BasicGroundUnit(2, 2, 0.2, 0)],
141
+ ["ENGINEER", new BasicGroundUnit(1, 0, 0)],
142
+ ["MTNK", new BasicGroundUnit(10, 3, 2, 0)],
143
+ ["MGTK", new BasicGroundUnit(10, 1, 2.5, 0)],
144
+ ["FV", new BasicGroundUnit(5, 2, 0.5, 1)],
145
+ ["JUMPJET", new BasicAirUnit(10, 1, 1, 1)],
146
+ ["ORCA", new BasicAirUnit(7, 1, 2, 0)],
147
+ ["SREF", new ArtilleryUnit(10, 5, 3, 3)],
148
+ ["CLEG", new BasicGroundUnit(0, 0)],
149
+ ["SHAD", new BasicGroundUnit(0, 0)],
150
+ // Soviet
151
+ ["NAPOWR", new PowerPlant()],
152
+ ["NAREFN", new ResourceCollectionBuilding(10, 3)],
153
+ ["NAWEAP", new BasicBuilding(15, 1)],
154
+ ["NAHAND", new BasicBuilding(12, 1)],
155
+ ["HARV", new Harvester(15, 4, 2)],
156
+ ["NADEPT", new BasicBuilding(1, 1, 10000)],
157
+ ["NARADR", new BasicBuilding(10, 1, 500)],
158
+ ["NANRCT", new PowerPlant()],
159
+ ["NAYARD", new BasicBuilding(0, 0, 0)],
160
+ ["NATECH", new BasicBuilding(20, 1, 4000)],
161
+ ["NALASR", new AntiGroundStaticDefence(2, 1, 5, 5)],
162
+ ["NAFLAK", new AntiAirStaticDefence(2, 1, 5)],
163
+ ["TESLA", new AntiGroundStaticDefence(2, 1, 10, 3)],
164
+ ["NAWALL", new AntiGroundStaticDefence(0, 0, 0, 0)],
165
+ ["E2", new BasicGroundUnit(2, 2, 0.2, 0)],
166
+ ["SENGINEER", new BasicGroundUnit(1, 0, 0)],
167
+ ["FLAKT", new BasicGroundUnit(2, 2, 0.1, 0.3)],
168
+ ["YURI", new BasicGroundUnit(1, 1, 1, 0)],
169
+ ["DOG", new BasicGroundUnit(1, 1, 0, 0)],
170
+ ["HTNK", new BasicGroundUnit(10, 3, 3, 0)],
171
+ ["APOC", new BasicGroundUnit(6, 1, 5, 0)],
172
+ ["HTK", new BasicGroundUnit(5, 2, 0.33, 1.5)],
173
+ ["ZEP", new BasicAirUnit(5, 1, 5, 1)],
174
+ ["V3", new ArtilleryUnit(9, 10, 0, 3)], // V3 Rocket Launcher
175
+ ]);
175
176
  //# sourceMappingURL=buildingRules.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"buildingRules.js","sourceRoot":"","sources":["../../../../src/bot/logic/building/buildingRules.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"buildingRules.js","sourceRoot":"","sources":["../../../../src/bot/logic/building/buildingRules.ts"],"names":[],"mappings":"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"}
@@ -1,19 +1,20 @@
1
- import { getPointTowardsOtherPoint } from "../map/map.js";
2
- import { getDefaultPlacementLocation } from "./buildingRules.js";
3
- export const getStaticDefencePlacement = (game, playerData, technoRules) => {
4
- // Prefer front towards enemy.
5
- let startLocation = playerData.startLocation;
6
- let players = game.getPlayers();
7
- let enemyFacingLocationCandidates = [];
8
- for (let i = 0; i < players.length; ++i) {
9
- let playerName = players[i];
10
- if (playerName == playerData.name) {
11
- continue;
12
- }
13
- let enemyPlayer = game.getPlayerData(playerName);
14
- enemyFacingLocationCandidates.push(getPointTowardsOtherPoint(game, startLocation, enemyPlayer.startLocation, 4, 16, 1.5));
15
- }
16
- let selectedLocation = enemyFacingLocationCandidates[Math.floor(game.generateRandom() * enemyFacingLocationCandidates.length)];
17
- return getDefaultPlacementLocation(game, playerData, selectedLocation, technoRules, false, 0);
18
- };
1
+ import { getPointTowardsOtherPoint } from "../map/map.js";
2
+ import { getDefaultPlacementLocation } from "./buildingRules.js";
3
+ export const getStaticDefencePlacement = (game, playerData, technoRules) => {
4
+ // Prefer front towards enemy.
5
+ const { startLocation, name: currentName } = playerData;
6
+ const allNames = game.getPlayers();
7
+ // Create a list of positions that point roughly towards hostile player start locatoins.
8
+ const candidates = allNames
9
+ .filter((otherName) => otherName !== currentName && !game.areAlliedPlayers(otherName, currentName))
10
+ .map((otherName) => {
11
+ const enemyPlayer = game.getPlayerData(otherName);
12
+ return getPointTowardsOtherPoint(game, startLocation, enemyPlayer.startLocation, 4, 16, 1.5);
13
+ });
14
+ if (candidates.length === 0) {
15
+ return undefined;
16
+ }
17
+ const selectedLocation = candidates[Math.floor(game.generateRandom() * candidates.length)];
18
+ return getDefaultPlacementLocation(game, playerData, selectedLocation, technoRules, false, 2);
19
+ };
19
20
  //# sourceMappingURL=common.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"common.js","sourceRoot":"","sources":["../../../../src/bot/logic/building/common.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,EAAE,2BAA2B,EAAE,MAAM,oBAAoB,CAAC;AAEjE,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,IAAa,EAAE,UAAsB,EAAE,WAAwB,EAAE,EAAE;IACzG,8BAA8B;IAC9B,IAAI,aAAa,GAAG,UAAU,CAAC,aAAa,CAAC;IAC7C,IAAI,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;IAChC,IAAI,6BAA6B,GAAc,EAAE,CAAC;IAClD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE;QACrC,IAAI,UAAU,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QAC5B,IAAI,UAAU,IAAI,UAAU,CAAC,IAAI,EAAE;YAC/B,SAAS;SACZ;QACD,IAAI,WAAW,GAAG,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;QACjD,6BAA6B,CAAC,IAAI,CAC9B,yBAAyB,CAAC,IAAI,EAAE,aAAa,EAAE,WAAW,CAAC,aAAa,EAAE,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,CACxF,CAAC;KACL;IACD,IAAI,gBAAgB,GAChB,6BAA6B,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,EAAE,GAAG,6BAA6B,CAAC,MAAM,CAAC,CAAC,CAAC;IAC5G,OAAO,2BAA2B,CAAC,IAAI,EAAE,UAAU,EAAE,gBAAgB,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;AAClG,CAAC,CAAC"}
1
+ {"version":3,"file":"common.js","sourceRoot":"","sources":["../../../../src/bot/logic/building/common.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,EAAE,2BAA2B,EAAE,MAAM,oBAAoB,CAAC;AAEjE,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,IAAa,EAAE,UAAsB,EAAE,WAAwB,EAAE,EAAE;IACzG,8BAA8B;IAC9B,MAAM,EAAE,aAAa,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,UAAU,CAAC;IACxD,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;IACnC,wFAAwF;IACxF,MAAM,UAAU,GAAG,QAAQ;SACtB,MAAM,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,KAAK,WAAW,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;SAClG,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE;QACf,MAAM,WAAW,GAAG,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;QAClD,OAAO,yBAAyB,CAAC,IAAI,EAAE,aAAa,EAAE,WAAW,CAAC,aAAa,EAAE,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC;IACjG,CAAC,CAAC,CAAC;IACP,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE;QACzB,OAAO,SAAS,CAAC;KACpB;IACD,MAAM,gBAAgB,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,EAAE,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;IAC3F,OAAO,2BAA2B,CAAC,IAAI,EAAE,UAAU,EAAE,gBAAgB,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;AAClG,CAAC,CAAC"}
@@ -1,17 +1,17 @@
1
- import { BasicGroundUnit } from "./basicGroundUnit.js";
2
- const IDEAL_HARVESTERS_PER_REFINERY = 2;
3
- const MAX_HARVESTERS_PER_REFINERY = 4;
4
- export class Harvester extends BasicGroundUnit {
5
- constructor(basePriority, baseAmount, minNeeded) {
6
- super(basePriority, baseAmount, 0, 0);
7
- this.minNeeded = minNeeded;
8
- }
9
- // Priority goes up when we have fewer than this many refineries.
10
- getPriority(game, playerData, technoRules, threatCache) {
11
- const refineries = game.getVisibleUnits(playerData.name, "self", (r) => r.refinery).length;
12
- const harvesters = game.getVisibleUnits(playerData.name, "self", (r) => r.harvester).length;
13
- const boost = harvesters < this.minNeeded ? 3 : harvesters > refineries * MAX_HARVESTERS_PER_REFINERY ? 0 : 1;
14
- return this.basePriority * (refineries / Math.max(harvesters / IDEAL_HARVESTERS_PER_REFINERY, 1)) * boost;
15
- }
16
- }
1
+ import { BasicGroundUnit } from "./basicGroundUnit.js";
2
+ const IDEAL_HARVESTERS_PER_REFINERY = 2;
3
+ const MAX_HARVESTERS_PER_REFINERY = 4;
4
+ export class Harvester extends BasicGroundUnit {
5
+ constructor(basePriority, baseAmount, minNeeded) {
6
+ super(basePriority, baseAmount, 0, 0);
7
+ this.minNeeded = minNeeded;
8
+ }
9
+ // Priority goes up when we have fewer than this many refineries.
10
+ getPriority(game, playerData, technoRules, threatCache) {
11
+ const refineries = game.getVisibleUnits(playerData.name, "self", (r) => r.refinery).length;
12
+ const harvesters = game.getVisibleUnits(playerData.name, "self", (r) => r.harvester).length;
13
+ const boost = harvesters < this.minNeeded ? 3 : harvesters > refineries * MAX_HARVESTERS_PER_REFINERY ? 0 : 1;
14
+ return this.basePriority * (refineries / Math.max(harvesters / IDEAL_HARVESTERS_PER_REFINERY, 1)) * boost;
15
+ }
16
+ }
17
17
  //# sourceMappingURL=harvester.js.map
@@ -1,21 +1,21 @@
1
- import { getDefaultPlacementLocation } from "./buildingRules.js";
2
- export class PowerPlant {
3
- getPlacementLocation(game, playerData, technoRules) {
4
- return getDefaultPlacementLocation(game, playerData, playerData.startLocation, technoRules);
5
- }
6
- getPriority(game, playerData, technoRules) {
7
- if (playerData.power.total < playerData.power.drain) {
8
- return 100;
9
- }
10
- else if (playerData.power.total < playerData.power.drain + technoRules.power / 2) {
11
- return 20;
12
- }
13
- else {
14
- return 0;
15
- }
16
- }
17
- getMaxCount(game, playerData, technoRules, threatCache) {
18
- return null;
19
- }
20
- }
1
+ import { getDefaultPlacementLocation } from "./buildingRules.js";
2
+ export class PowerPlant {
3
+ getPlacementLocation(game, playerData, technoRules) {
4
+ return getDefaultPlacementLocation(game, playerData, playerData.startLocation, technoRules);
5
+ }
6
+ getPriority(game, playerData, technoRules) {
7
+ if (playerData.power.total < playerData.power.drain) {
8
+ return 100;
9
+ }
10
+ else if (playerData.power.total < playerData.power.drain + technoRules.power / 2) {
11
+ return 20;
12
+ }
13
+ else {
14
+ return 0;
15
+ }
16
+ }
17
+ getMaxCount(game, playerData, technoRules, threatCache) {
18
+ return null;
19
+ }
20
+ }
21
21
  //# sourceMappingURL=powerPlant.js.map