@supalosa/chronodivide-bot 0.5.4 → 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 (124) hide show
  1. package/.env.template +4 -4
  2. package/.github/workflows/npm-publish.yml +24 -0
  3. package/README.md +108 -103
  4. package/dist/bot/bot.js +105 -105
  5. package/dist/bot/logic/awareness.js +136 -136
  6. package/dist/bot/logic/building/antiAirStaticDefence.js +42 -42
  7. package/dist/bot/logic/building/antiGroundStaticDefence.js +34 -34
  8. package/dist/bot/logic/building/{ArtilleryUnit.js → artilleryUnit.js} +18 -18
  9. package/dist/bot/logic/building/basicAirUnit.js +19 -19
  10. package/dist/bot/logic/building/basicBuilding.js +26 -26
  11. package/dist/bot/logic/building/basicGroundUnit.js +19 -19
  12. package/dist/bot/logic/building/buildingRules.js +175 -175
  13. package/dist/bot/logic/building/common.js +19 -19
  14. package/dist/bot/logic/building/harvester.js +16 -16
  15. package/dist/bot/logic/building/powerPlant.js +20 -20
  16. package/dist/bot/logic/building/queueController.js +183 -183
  17. package/dist/bot/logic/building/resourceCollectionBuilding.js +36 -36
  18. package/dist/bot/logic/common/scout.js +126 -126
  19. package/dist/bot/logic/common/utils.js +95 -95
  20. package/dist/bot/logic/composition/alliedCompositions.js +12 -12
  21. package/dist/bot/logic/composition/common.js +1 -1
  22. package/dist/bot/logic/composition/sovietCompositions.js +12 -12
  23. package/dist/bot/logic/map/map.js +44 -44
  24. package/dist/bot/logic/map/sector.js +137 -137
  25. package/dist/bot/logic/mission/actionBatcher.js +91 -91
  26. package/dist/bot/logic/mission/mission.js +122 -122
  27. package/dist/bot/logic/mission/missionController.js +321 -321
  28. package/dist/bot/logic/mission/missionFactories.js +12 -12
  29. package/dist/bot/logic/mission/missions/attackMission.js +214 -214
  30. package/dist/bot/logic/mission/missions/defenceMission.js +82 -82
  31. package/dist/bot/logic/mission/missions/engineerMission.js +63 -63
  32. package/dist/bot/logic/mission/missions/expansionMission.js +60 -60
  33. package/dist/bot/logic/mission/missions/retreatMission.js +33 -33
  34. package/dist/bot/logic/mission/missions/scoutingMission.js +133 -133
  35. package/dist/bot/logic/mission/missions/squads/combatSquad.js +115 -115
  36. package/dist/bot/logic/mission/missions/squads/common.js +57 -57
  37. package/dist/bot/logic/mission/missions/squads/squad.js +1 -1
  38. package/dist/bot/logic/threat/threat.js +22 -22
  39. package/dist/bot/logic/threat/threatCalculator.js +73 -73
  40. package/dist/exampleBot.js +100 -100
  41. package/package.json +32 -29
  42. package/src/bot/bot.ts +161 -161
  43. package/src/bot/logic/awareness.ts +245 -245
  44. package/src/bot/logic/building/antiAirStaticDefence.ts +64 -64
  45. package/src/bot/logic/building/antiGroundStaticDefence.ts +55 -55
  46. package/src/bot/logic/building/artilleryUnit.ts +39 -39
  47. package/src/bot/logic/building/basicAirUnit.ts +39 -39
  48. package/src/bot/logic/building/basicBuilding.ts +49 -49
  49. package/src/bot/logic/building/basicGroundUnit.ts +39 -39
  50. package/src/bot/logic/building/buildingRules.ts +250 -250
  51. package/src/bot/logic/building/common.ts +21 -21
  52. package/src/bot/logic/building/harvester.ts +31 -31
  53. package/src/bot/logic/building/powerPlant.ts +32 -32
  54. package/src/bot/logic/building/queueController.ts +297 -297
  55. package/src/bot/logic/building/resourceCollectionBuilding.ts +52 -52
  56. package/src/bot/logic/common/scout.ts +183 -183
  57. package/src/bot/logic/common/utils.ts +120 -120
  58. package/src/bot/logic/composition/alliedCompositions.ts +22 -22
  59. package/src/bot/logic/composition/common.ts +3 -3
  60. package/src/bot/logic/composition/sovietCompositions.ts +21 -21
  61. package/src/bot/logic/map/map.ts +66 -66
  62. package/src/bot/logic/map/sector.ts +174 -174
  63. package/src/bot/logic/mission/actionBatcher.ts +124 -124
  64. package/src/bot/logic/mission/mission.ts +232 -232
  65. package/src/bot/logic/mission/missionController.ts +413 -413
  66. package/src/bot/logic/mission/missionFactories.ts +51 -51
  67. package/src/bot/logic/mission/missions/attackMission.ts +336 -336
  68. package/src/bot/logic/mission/missions/defenceMission.ts +151 -151
  69. package/src/bot/logic/mission/missions/engineerMission.ts +113 -113
  70. package/src/bot/logic/mission/missions/expansionMission.ts +104 -104
  71. package/src/bot/logic/mission/missions/retreatMission.ts +54 -54
  72. package/src/bot/logic/mission/missions/scoutingMission.ts +186 -186
  73. package/src/bot/logic/mission/missions/squads/combatSquad.ts +160 -160
  74. package/src/bot/logic/mission/missions/squads/common.ts +63 -63
  75. package/src/bot/logic/mission/missions/squads/squad.ts +19 -19
  76. package/src/bot/logic/threat/threat.ts +15 -15
  77. package/src/bot/logic/threat/threatCalculator.ts +100 -100
  78. package/src/exampleBot.ts +111 -111
  79. package/tsconfig.json +73 -73
  80. package/dist/bot/logic/awarenessImpl.js +0 -132
  81. package/dist/bot/logic/awarenessImpl.js.map +0 -1
  82. package/dist/bot/logic/building/building.js +0 -126
  83. package/dist/bot/logic/building/building.js.map +0 -1
  84. package/dist/bot/logic/mission/behaviours/combatSquad.js +0 -124
  85. package/dist/bot/logic/mission/behaviours/combatSquad.js.map +0 -1
  86. package/dist/bot/logic/mission/behaviours/common.js +0 -58
  87. package/dist/bot/logic/mission/behaviours/common.js.map +0 -1
  88. package/dist/bot/logic/mission/behaviours/engineerSquad.js +0 -39
  89. package/dist/bot/logic/mission/behaviours/engineerSquad.js.map +0 -1
  90. package/dist/bot/logic/mission/behaviours/expansionSquad.js +0 -46
  91. package/dist/bot/logic/mission/behaviours/expansionSquad.js.map +0 -1
  92. package/dist/bot/logic/mission/behaviours/retreatSquad.js +0 -31
  93. package/dist/bot/logic/mission/behaviours/retreatSquad.js.map +0 -1
  94. package/dist/bot/logic/mission/behaviours/scoutingSquad.js +0 -94
  95. package/dist/bot/logic/mission/behaviours/scoutingSquad.js.map +0 -1
  96. package/dist/bot/logic/mission/missions/basicMission.js +0 -13
  97. package/dist/bot/logic/mission/missions/basicMission.js.map +0 -1
  98. package/dist/bot/logic/mission/missions/missionBehaviour.js +0 -2
  99. package/dist/bot/logic/mission/missions/missionBehaviour.js.map +0 -1
  100. package/dist/bot/logic/mission/missions/oneTimeMission.js +0 -27
  101. package/dist/bot/logic/mission/missions/oneTimeMission.js.map +0 -1
  102. package/dist/bot/logic/squad/behaviours/attackSquad.js +0 -89
  103. package/dist/bot/logic/squad/behaviours/combatSquad.js +0 -102
  104. package/dist/bot/logic/squad/behaviours/combatSquad.js.map +0 -1
  105. package/dist/bot/logic/squad/behaviours/common.js +0 -40
  106. package/dist/bot/logic/squad/behaviours/common.js.map +0 -1
  107. package/dist/bot/logic/squad/behaviours/defenceSquad.js +0 -61
  108. package/dist/bot/logic/squad/behaviours/engineerSquad.js +0 -36
  109. package/dist/bot/logic/squad/behaviours/engineerSquad.js.map +0 -1
  110. package/dist/bot/logic/squad/behaviours/expansionSquad.js +0 -43
  111. package/dist/bot/logic/squad/behaviours/expansionSquad.js.map +0 -1
  112. package/dist/bot/logic/squad/behaviours/retreatSquad.js +0 -28
  113. package/dist/bot/logic/squad/behaviours/retreatSquad.js.map +0 -1
  114. package/dist/bot/logic/squad/behaviours/scoutingSquad.js +0 -86
  115. package/dist/bot/logic/squad/behaviours/scoutingSquad.js.map +0 -1
  116. package/dist/bot/logic/squad/squad.js +0 -126
  117. package/dist/bot/logic/squad/squad.js.map +0 -1
  118. package/dist/bot/logic/squad/squadBehaviour.js +0 -6
  119. package/dist/bot/logic/squad/squadBehaviour.js.map +0 -1
  120. package/dist/bot/logic/squad/squadBehaviours.js +0 -7
  121. package/dist/bot/logic/squad/squadBehaviours.js.map +0 -1
  122. package/dist/bot/logic/squad/squadController.js +0 -199
  123. package/dist/bot/logic/squad/squadController.js.map +0 -1
  124. /package/dist/bot/logic/building/{ArtilleryUnit.js.map → artilleryUnit.js.map} +0 -0
@@ -1,132 +0,0 @@
1
- import { ObjectType } from "@chronodivide/game-api";
2
- import { calculateGlobalThreat } from "./threat/threatCalculator.js";
3
- import { getDistanceBetweenPoints, getPointTowardsOtherPoint } from "./map/map.js";
4
- import { Circle, Quadtree } from "@timohausmann/quadtree-ts";
5
- import { ScoutingManager } from "./common/scout";
6
- const SECTORS_TO_UPDATE_PER_CYCLE = 8;
7
- const RALLY_POINT_UPDATE_INTERVAL_TICKS = 60;
8
- const THREAT_UPDATE_INTERVAL_TICKS = 30;
9
- const rebuildQuadtree = (quadtree, units) => {
10
- quadtree.clear();
11
- units.forEach((unit) => {
12
- quadtree.insert(new Circle({ x: unit.tile.rx, y: unit.tile.ry, r: 1, data: unit.id }));
13
- });
14
- };
15
- export class MatchAwarenessImpl {
16
- constructor(threatCache, sectorCache, mainRallyPoint, logger) {
17
- this.threatCache = threatCache;
18
- this.sectorCache = sectorCache;
19
- this.mainRallyPoint = mainRallyPoint;
20
- this.logger = logger;
21
- this._shouldAttack = false;
22
- const { x: width, y: height } = sectorCache.getMapBounds();
23
- this.hostileQuadTree = new Quadtree({ width, height });
24
- this.scoutingManager = new ScoutingManager(logger);
25
- }
26
- getHostilesNearPoint2d(point, radius) {
27
- return this.getHostilesNearPoint(point.x, point.y, radius);
28
- }
29
- getHostilesNearPoint(searchX, searchY, radius) {
30
- const intersections = this.hostileQuadTree.retrieve(new Circle({ x: searchX, y: searchY, r: radius }));
31
- return intersections
32
- .map(({ x, y, data: unitId }) => ({ x, y, unitId: unitId }))
33
- .filter(({ x, y }) => getDistanceBetweenPoints({ x, y }, { x: searchX, y: searchY }) <= radius)
34
- .filter(({ unitId }) => !!unitId);
35
- }
36
- getThreatCache() {
37
- return this.threatCache;
38
- }
39
- getSectorCache() {
40
- return this.sectorCache;
41
- }
42
- getMainRallyPoint() {
43
- return this.mainRallyPoint;
44
- }
45
- getScoutingManager() {
46
- return this.scoutingManager;
47
- }
48
- shouldAttack() {
49
- return this._shouldAttack;
50
- }
51
- checkShouldAttack(threatCache, threatFactor) {
52
- let scaledGroundPower = Math.pow(threatCache.totalAvailableAntiGroundFirepower, 1.025);
53
- let scaledGroundThreat = (threatFactor * threatCache.totalOffensiveLandThreat + threatCache.totalDefensiveThreat) * 1.1;
54
- let scaledAirPower = Math.pow(threatCache.totalAvailableAirPower, 1.025);
55
- let scaledAirThreat = (threatFactor * threatCache.totalOffensiveAntiAirThreat + threatCache.totalDefensiveThreat) * 1.1;
56
- return scaledGroundPower > scaledGroundThreat || scaledAirPower > scaledAirThreat;
57
- }
58
- isHostileUnit(unit, hostilePlayerNames) {
59
- if (!unit) {
60
- return false;
61
- }
62
- return hostilePlayerNames.includes(unit.owner);
63
- }
64
- onGameStart(gameApi, playerData) {
65
- this.scoutingManager.onGameStart(gameApi, playerData, this.sectorCache);
66
- }
67
- onAiUpdate(game, playerData) {
68
- const sectorCache = this.sectorCache;
69
- sectorCache.updateSectors(game.getCurrentTick(), SECTORS_TO_UPDATE_PER_CYCLE, game.mapApi, playerData);
70
- this.scoutingManager.onAiUpdate(game, playerData, this);
71
- let updateRatio = sectorCache?.getSectorUpdateRatio(game.getCurrentTick() - game.getTickRate() * 60);
72
- if (updateRatio && updateRatio < 1.0) {
73
- this.logger(`${updateRatio * 100.0}% of sectors updated in last 60 seconds.`);
74
- }
75
- const hostilePlayerNames = game
76
- .getPlayers()
77
- .map((name) => game.getPlayerData(name))
78
- .filter((other) => other.name !== playerData.name &&
79
- other.isCombatant &&
80
- !game.areAlliedPlayers(playerData.name, other.name))
81
- .map((other) => other.name);
82
- // Build the quadtree, if this is too slow we should consider doing this periodically.
83
- const hostileUnitIds = game.getVisibleUnits(playerData.name, "hostile", (r) => r.isSelectableCombatant || r.type === ObjectType.Building);
84
- try {
85
- const hostileUnits = hostileUnitIds
86
- .map((id) => game.getUnitData(id))
87
- .filter((unit) => this.isHostileUnit(unit, hostilePlayerNames));
88
- rebuildQuadtree(this.hostileQuadTree, hostileUnits);
89
- }
90
- catch (err) {
91
- // Hack. Will be fixed soon.
92
- console.error(`caught error`, hostileUnitIds);
93
- }
94
- if (game.getCurrentTick() % THREAT_UPDATE_INTERVAL_TICKS == 0) {
95
- let visibility = sectorCache?.getOverallVisibility();
96
- if (visibility) {
97
- this.logger(`${Math.round(visibility * 1000.0) / 10}% of tiles visible. Calculating threat.`);
98
- // Update the global threat cache
99
- this.threatCache = calculateGlobalThreat(game, playerData, visibility);
100
- this.logger(`Threat LAND: Them ${Math.round(this.threatCache.totalOffensiveLandThreat)}, us: ${Math.round(this.threatCache.totalAvailableAntiGroundFirepower)}.`);
101
- this.logger(`Threat DEFENSIVE: Them ${Math.round(this.threatCache.totalDefensiveThreat)}, us: ${Math.round(this.threatCache.totalDefensivePower)}.`);
102
- this.logger(`Threat AIR: Them ${Math.round(this.threatCache.totalOffensiveAirThreat)}, us: ${Math.round(this.threatCache.totalAvailableAntiAirFirepower)}.`);
103
- // As the game approaches 2 hours, be more willing to attack. (15 ticks per second)
104
- const gameLengthFactor = Math.max(0, 1.0 - game.getCurrentTick() / (15 * 7200.0));
105
- this.logger(`Game length multiplier: ${gameLengthFactor}`);
106
- if (!this._shouldAttack) {
107
- // If not attacking, make it harder to switch to attack mode by multiplying the opponent's threat.
108
- this._shouldAttack = this.checkShouldAttack(this.threatCache, 1.25 * gameLengthFactor);
109
- if (this._shouldAttack) {
110
- this.logger(`Globally switched to attack mode.`);
111
- }
112
- }
113
- else {
114
- // If currently attacking, make it harder to switch to defence mode my dampening the opponent's threat.
115
- this._shouldAttack = this.checkShouldAttack(this.threatCache, 0.75 * gameLengthFactor);
116
- if (!this._shouldAttack) {
117
- this.logger(`Globally switched to defence mode.`);
118
- }
119
- }
120
- }
121
- }
122
- // Update rally point every few ticks.
123
- if (game.getCurrentTick() % RALLY_POINT_UPDATE_INTERVAL_TICKS === 0) {
124
- const enemyPlayers = game
125
- .getPlayers()
126
- .filter((p) => p !== playerData.name && !game.areAlliedPlayers(playerData.name, p));
127
- const enemy = game.getPlayerData(enemyPlayers[0]);
128
- this.mainRallyPoint = getPointTowardsOtherPoint(game, playerData.startLocation, enemy.startLocation, 10, 10, 0);
129
- }
130
- }
131
- }
132
- //# sourceMappingURL=awarenessImpl.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"awarenessImpl.js","sourceRoot":"","sources":["../../../src/bot/logic/awarenessImpl.ts"],"names":[],"mappings":"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"}
@@ -1,126 +0,0 @@
1
- import { ObjectType, } 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
- export function numBuildingsOwnedOfType(game, playerData, technoRules) {
11
- return game.getVisibleUnits(playerData.name, "self", (r) => r == technoRules).length;
12
- }
13
- export function numBuildingsOwnedOfName(game, playerData, name) {
14
- return game.getVisibleUnits(playerData.name, "self", (r) => r.name === name).length;
15
- }
16
- function computeAdjacentRect(point, t, adjacent) {
17
- return {
18
- x: point.x - adjacent,
19
- y: point.y - adjacent,
20
- width: t.width + 2 * adjacent,
21
- height: t.height + 2 * adjacent
22
- };
23
- }
24
- export function getAdjacencyTiles(game, playerData, technoRules) {
25
- let tiles = [];
26
- let buildings = game.getVisibleUnits(playerData.name, "self", (tech) => { return tech.type === ObjectType.Building; });
27
- for (let i in buildings) {
28
- let building = game.getUnitData(buildings[i]);
29
- if (building?.rules?.baseNormal) {
30
- let foundation = building?.foundation;
31
- let range = computeAdjacentRect({ x: building?.tile.rx, y: building?.tile.ry }, { width: foundation?.width, height: foundation?.height }, technoRules.adjacent);
32
- let baseTile = game.mapApi.getTile(range.x, range.y);
33
- if (!baseTile) {
34
- continue;
35
- }
36
- tiles.push(...game.mapApi.getTilesInRect(baseTile, { width: range.width, height: range.height }));
37
- }
38
- }
39
- return tiles;
40
- }
41
- function getTileDistances(startPoint, tiles) {
42
- let ret = [];
43
- for (let i in tiles) {
44
- let currentTile = tiles[i];
45
- ret.push({
46
- tile: currentTile,
47
- distance: distance(currentTile.rx, currentTile.ry, startPoint.x, startPoint.y)
48
- });
49
- }
50
- ret.sort((a, b) => {
51
- return a.distance - b.distance;
52
- });
53
- return ret;
54
- }
55
- function distance(x1, y1, x2, y2) {
56
- var dx = x1 - x2;
57
- var dy = y1 - y2;
58
- let tmp = dx * dx + dy * dy;
59
- if (0 === tmp) {
60
- return 0;
61
- }
62
- return Math.sqrt(tmp);
63
- }
64
- export function getDefaultPlacementLocation(game, playerData, startPoint, technoRules, space = 1) {
65
- // Random location, preferably near start location.
66
- let size = game.getBuildingPlacementData(technoRules.name);
67
- if (!size) {
68
- return undefined;
69
- }
70
- let tiles = getAdjacencyTiles(game, playerData, technoRules);
71
- let tileDistances = getTileDistances(startPoint, tiles);
72
- for (let tileDistance of tileDistances) {
73
- if (tileDistance.tile && game.canPlaceBuilding(playerData.name, technoRules.name, tileDistance.tile)) {
74
- return tileDistance.tile;
75
- }
76
- }
77
- return undefined;
78
- }
79
- export const DEFAULT_BUILDING_PRIORITY = 1;
80
- export const BUILDING_NAME_TO_RULES = new Map([
81
- // Allied
82
- ["GAPOWR", new PowerPlant()],
83
- ["GAREFN", new ResourceCollectionBuilding(10, 3)],
84
- ["GAWEAP", new BasicBuilding(15, 1)],
85
- ["GAPILE", new BasicBuilding(12, 1)],
86
- ["CMIN", new Harvester(15, 4, 2)],
87
- ["ENGINEER", new BasicBuilding(1, 1, 10000)],
88
- ["GADEPT", new BasicBuilding(1, 1, 10000)],
89
- ["GAAIRC", new BasicBuilding(8, 1, 6000)],
90
- ["GATECH", new BasicBuilding(20, 1, 4000)],
91
- ["GAYARD", new BasicBuilding(0, 0, 0)],
92
- ["GAPILL", new AntiGroundStaticDefence(5, 1, 5)],
93
- ["ATESLA", new AntiGroundStaticDefence(5, 1, 10)],
94
- ["GAWALL", new AntiGroundStaticDefence(0, 0, 0)],
95
- ["E1", new BasicGroundUnit(2, 3, 0.25, 0)],
96
- ["MTNK", new BasicGroundUnit(10, 3, 2, 0)],
97
- ["MGTK", new BasicGroundUnit(10, 1, 2.5, 0)],
98
- ["FV", new BasicGroundUnit(5, 2, 0.5, 1)],
99
- ["JUMPJET", new BasicAirUnit(10, 1, 1, 1)],
100
- ["ORCA", new BasicAirUnit(7, 1, 2, 0)],
101
- ["SREF", new ArtilleryUnit(9, 1)],
102
- ["CLEG", new BasicGroundUnit(0, 0)],
103
- ["SHAD", new BasicGroundUnit(0, 0)],
104
- // Soviet
105
- ["NAPOWR", new PowerPlant()],
106
- ["NAREFN", new ResourceCollectionBuilding(10, 3)],
107
- ["NAWEAP", new BasicBuilding(15, 1)],
108
- ["NAHAND", new BasicBuilding(12, 1)],
109
- ["HARV", new Harvester(15, 4, 2)],
110
- ["SENGINEER", new BasicBuilding(1, 1, 10000)],
111
- ["NADEPT", new BasicBuilding(1, 1, 10000)],
112
- ["NARADR", new BasicBuilding(8, 1, 4000)],
113
- ["NANRCT", new PowerPlant()],
114
- ["NAYARD", new BasicBuilding(0, 0, 0)],
115
- ["NATECH", new BasicBuilding(20, 1, 4000)],
116
- ["NALASR", new AntiGroundStaticDefence(5, 1, 5)],
117
- ["TESLA", new AntiGroundStaticDefence(5, 1, 10)],
118
- ["NAWALL", new AntiGroundStaticDefence(0, 0, 0)],
119
- ["E2", new BasicGroundUnit(2, 3, 0.25, 0)],
120
- ["HTNK", new BasicGroundUnit(10, 3, 3, 0)],
121
- ["APOC", new BasicGroundUnit(6, 1, 5, 0)],
122
- ["HTK", new BasicGroundUnit(5, 2, 0.33, 1.5)],
123
- ["ZEP", new BasicAirUnit(5, 1, 5, 1)],
124
- ["V3", new ArtilleryUnit(9, 1)], // V3 Rocket Launcher
125
- ]);
126
- //# sourceMappingURL=building.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"building.js","sourceRoot":"","sources":["../../../../src/bot/logic/building/building.ts"],"names":[],"mappings":"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"}
@@ -1,124 +0,0 @@
1
- import { GameMath, MovementZone, } from "@chronodivide/game-api";
2
- import { getAttackWeight, manageAttackMicro, manageMoveMicro } from "./common.js";
3
- import { isOwnedByNeutral, maxBy, minBy } from "../../common/utils.js";
4
- import { grabCombatants, noop } from "../mission.js";
5
- const TARGET_UPDATE_INTERVAL_TICKS = 10;
6
- const GRAB_INTERVAL_TICKS = 64;
7
- const GRAB_RADIUS = 20;
8
- // Units must be in a certain radius of the center of mass before attacking.
9
- // This scales for number of units in the squad though.
10
- const MIN_GATHER_RADIUS = 5;
11
- // If the radius expands beyond this amount then we should switch back to gathering mode.
12
- const MAX_GATHER_RADIUS = 15;
13
- const GATHER_RATIO = 10;
14
- var SquadState;
15
- (function (SquadState) {
16
- SquadState[SquadState["Gathering"] = 0] = "Gathering";
17
- SquadState[SquadState["Attacking"] = 1] = "Attacking";
18
- })(SquadState || (SquadState = {}));
19
- export class CombatSquad {
20
- /**
21
- *
22
- * @param rallyArea the initial location to grab combatants
23
- * @param targetArea
24
- * @param radius
25
- */
26
- constructor(rallyArea, targetArea, radius) {
27
- this.rallyArea = rallyArea;
28
- this.targetArea = targetArea;
29
- this.radius = radius;
30
- this.lastGrab = null;
31
- this.lastCommand = null;
32
- this.state = SquadState.Gathering;
33
- this.lastOrderGiven = {};
34
- }
35
- getGlobalDebugText() {
36
- return this.debugLastTarget ?? "<none>";
37
- }
38
- setAttackArea(targetArea) {
39
- this.targetArea = targetArea;
40
- }
41
- onAiUpdate(gameApi, actionsApi, actionBatcher, playerData, mission, matchAwareness, logger) {
42
- if (mission.getUnitIds().length > 0 &&
43
- (!this.lastCommand || gameApi.getCurrentTick() > this.lastCommand + TARGET_UPDATE_INTERVAL_TICKS)) {
44
- this.lastCommand = gameApi.getCurrentTick();
45
- const centerOfMass = mission.getCenterOfMass();
46
- const maxDistance = mission.getMaxDistanceToCenterOfMass();
47
- const units = mission.getUnitsMatching(gameApi, (r) => r.rules.isSelectableCombatant);
48
- // Only use ground units for center of mass.
49
- const groundUnits = mission.getUnitsMatching(gameApi, (r) => r.rules.isSelectableCombatant &&
50
- (r.rules.movementZone === MovementZone.Infantry ||
51
- r.rules.movementZone === MovementZone.Normal ||
52
- r.rules.movementZone === MovementZone.InfantryDestroyer));
53
- if (this.state === SquadState.Gathering) {
54
- const requiredGatherRadius = GameMath.sqrt(groundUnits.length) * GATHER_RATIO + MIN_GATHER_RADIUS;
55
- if (centerOfMass &&
56
- maxDistance &&
57
- gameApi.mapApi.getTile(centerOfMass.x, centerOfMass.y) !== undefined &&
58
- maxDistance > requiredGatherRadius) {
59
- units.forEach((unit) => {
60
- this.submitActionIfNew(actionBatcher, manageMoveMicro(unit, centerOfMass));
61
- });
62
- }
63
- else {
64
- logger(`CombatSquad ${mission.getUniqueName()} switching back to attack mode (${maxDistance})`);
65
- this.state = SquadState.Attacking;
66
- }
67
- }
68
- else {
69
- const targetPoint = this.targetArea || playerData.startLocation;
70
- const requiredGatherRadius = GameMath.sqrt(groundUnits.length) * GATHER_RATIO + MAX_GATHER_RADIUS;
71
- if (centerOfMass &&
72
- maxDistance &&
73
- gameApi.mapApi.getTile(centerOfMass.x, centerOfMass.y) !== undefined &&
74
- maxDistance > requiredGatherRadius) {
75
- // Switch back to gather mode
76
- logger(`CombatSquad ${mission.getUniqueName()} switching back to gather (${maxDistance})`);
77
- this.state = SquadState.Gathering;
78
- return noop();
79
- }
80
- // The unit with the shortest range chooses the target. Otherwise, a base range of 5 is chosen.
81
- const getRangeForUnit = (unit) => unit.primaryWeapon?.maxRange ?? unit.secondaryWeapon?.maxRange ?? 5;
82
- const attackLeader = minBy(units, getRangeForUnit);
83
- if (!attackLeader) {
84
- return noop();
85
- }
86
- // Find units within double the range of the leader.
87
- const nearbyHostiles = matchAwareness
88
- .getHostilesNearPoint(attackLeader.tile.rx, attackLeader.tile.ry, getRangeForUnit(attackLeader) * 2)
89
- .map(({ unitId }) => gameApi.getUnitData(unitId))
90
- .filter((unit) => !isOwnedByNeutral(unit));
91
- for (const unit of units) {
92
- const bestUnit = maxBy(nearbyHostiles, (target) => getAttackWeight(unit, target));
93
- if (bestUnit) {
94
- this.submitActionIfNew(actionBatcher, manageAttackMicro(unit, bestUnit));
95
- this.debugLastTarget = `Unit ${bestUnit.id.toString()}`;
96
- }
97
- else {
98
- this.submitActionIfNew(actionBatcher, manageMoveMicro(unit, targetPoint));
99
- this.debugLastTarget = `@${targetPoint.x},${targetPoint.y}`;
100
- }
101
- }
102
- }
103
- }
104
- if (!this.lastGrab || gameApi.getCurrentTick() > this.lastGrab + GRAB_INTERVAL_TICKS) {
105
- this.lastGrab = gameApi.getCurrentTick();
106
- return grabCombatants(mission.getCenterOfMass() ?? this.rallyArea, GRAB_RADIUS);
107
- }
108
- else {
109
- return noop();
110
- }
111
- }
112
- /**
113
- * Sends an action to the acitonBatcher if and only if the action is different from the last action we submitted to it.
114
- * Prevents spamming redundant orders, which affects performance and can also ccause the unit to sit around doing nothing.
115
- */
116
- submitActionIfNew(actionBatcher, action) {
117
- const lastAction = this.lastOrderGiven[action.unitId];
118
- if (!lastAction || !lastAction.isSameAs(action)) {
119
- actionBatcher.push(action);
120
- this.lastOrderGiven[action.unitId] = action;
121
- }
122
- }
123
- }
124
- //# sourceMappingURL=combatSquad.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"combatSquad.js","sourceRoot":"","sources":["../../../../../src/bot/logic/mission/behaviours/combatSquad.ts"],"names":[],"mappings":"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"}
@@ -1,58 +0,0 @@
1
- import { AttackState, ObjectType, OrderType, StanceType, Vector2, ZoneType } from "@chronodivide/game-api";
2
- import { getDistanceBetweenPoints, getDistanceBetweenUnits } from "../../map/map.js";
3
- import { BatchableAction } from "../actionBatcher.js";
4
- const NONCE_GI_DEPLOY = 0;
5
- const NONCE_GI_UNDEPLOY = 1;
6
- // Micro methods
7
- export function manageMoveMicro(attacker, attackPoint) {
8
- if (attacker.name === "E1") {
9
- const isDeployed = attacker.stance === StanceType.Deployed;
10
- if (isDeployed) {
11
- return BatchableAction.noTarget(attacker.id, OrderType.DeploySelected, NONCE_GI_UNDEPLOY);
12
- }
13
- }
14
- return BatchableAction.toPoint(attacker.id, OrderType.AttackMove, attackPoint);
15
- }
16
- export function manageAttackMicro(attacker, target) {
17
- const distance = getDistanceBetweenUnits(attacker, target);
18
- if (attacker.name === "E1") {
19
- // Para (deployed weapon) range is 5.
20
- const deployedWeaponRange = attacker.secondaryWeapon?.maxRange || 5;
21
- const isDeployed = attacker.stance === StanceType.Deployed;
22
- if (!isDeployed && (distance <= deployedWeaponRange || attacker.attackState === AttackState.JustFired)) {
23
- return BatchableAction.noTarget(attacker.id, OrderType.DeploySelected, NONCE_GI_DEPLOY);
24
- }
25
- else if (isDeployed && distance > deployedWeaponRange) {
26
- return BatchableAction.noTarget(attacker.id, OrderType.DeploySelected, NONCE_GI_UNDEPLOY);
27
- }
28
- }
29
- let targetData = target;
30
- let orderType = OrderType.Attack;
31
- const primaryWeaponRange = attacker.primaryWeapon?.maxRange || 5;
32
- if (targetData?.type == ObjectType.Building && distance < primaryWeaponRange * 0.8) {
33
- orderType = OrderType.Attack;
34
- }
35
- else if (targetData?.rules.canDisguise) {
36
- // Special case for mirage tank/spy as otherwise they just sit next to it.
37
- orderType = OrderType.Attack;
38
- }
39
- return BatchableAction.toTargetId(attacker.id, orderType, target.id);
40
- }
41
- /**
42
- *
43
- * @param attacker
44
- * @param target
45
- * @returns A number describing the weight of the given target for the attacker, or null if it should not attack it.
46
- */
47
- export function getAttackWeight(attacker, target) {
48
- const { rx: x, ry: y } = attacker.tile;
49
- const { rx: hX, ry: hY } = target.tile;
50
- if (!attacker.primaryWeapon?.projectileRules.isAntiAir && target.zone === ZoneType.Air) {
51
- return null;
52
- }
53
- if (!attacker.primaryWeapon?.projectileRules.isAntiGround && target.zone === ZoneType.Ground) {
54
- return null;
55
- }
56
- return 1000000 - getDistanceBetweenPoints(new Vector2(x, y), new Vector2(hX, hY));
57
- }
58
- //# sourceMappingURL=common.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"common.js","sourceRoot":"","sources":["../../../../../src/bot/logic/mission/behaviours/common.ts"],"names":[],"mappings":"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"}
@@ -1,39 +0,0 @@
1
- import { OrderType } from "@chronodivide/game-api";
2
- import { disbandMission, noop, requestUnits } from "../mission.js";
3
- const CAPTURE_COOLDOWN_TICKS = 30;
4
- // Capture squad
5
- export class EngineerSquad {
6
- /**
7
- * @param captureTarget ID of the target to try and capture/send engineer into.
8
- */
9
- constructor(captureTarget, priority) {
10
- this.captureTarget = captureTarget;
11
- this.priority = priority;
12
- this.hasAttemptedCaptureWith = null;
13
- }
14
- onAiUpdate(gameApi, actionsApi, actionBatcher, playerData, mission, matchAwareness) {
15
- const engineerTypes = ["ENGINEER", "SENGINEER"];
16
- const engineers = mission.getUnitsOfTypes(gameApi, ...engineerTypes);
17
- if (engineers.length === 0) {
18
- // Perhaps we deployed already (or the unit was destroyed), end the mission.
19
- if (this.hasAttemptedCaptureWith !== null) {
20
- return disbandMission();
21
- }
22
- return requestUnits(engineerTypes, this.priority);
23
- }
24
- else if (!this.hasAttemptedCaptureWith ||
25
- gameApi.getCurrentTick() > this.hasAttemptedCaptureWith.gameTick + CAPTURE_COOLDOWN_TICKS) {
26
- actionsApi.orderUnits(engineers.map((engineer) => engineer.id), OrderType.Capture, this.captureTarget);
27
- // Add a cooldown to deploy attempts.
28
- this.hasAttemptedCaptureWith = {
29
- unitId: engineers[0].id,
30
- gameTick: gameApi.getCurrentTick(),
31
- };
32
- }
33
- return noop();
34
- }
35
- getGlobalDebugText() {
36
- return undefined;
37
- }
38
- }
39
- //# sourceMappingURL=engineerSquad.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"engineerSquad.js","sourceRoot":"","sources":["../../../../../src/bot/logic/mission/behaviours/engineerSquad.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,SAAS,EAAwB,MAAM,wBAAwB,CAAC;AAI9F,OAAO,EAA0B,cAAc,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE3F,MAAM,sBAAsB,GAAG,EAAE,CAAC;AAElC,gBAAgB;AAChB,MAAM,OAAO,aAAa;IAMtB;;OAEG;IACH,YACY,aAAqB,EACrB,QAAgB;QADhB,kBAAa,GAAb,aAAa,CAAQ;QACrB,aAAQ,GAAR,QAAQ,CAAQ;QAVpB,4BAAuB,GAGpB,IAAI,CAAC;IAQb,CAAC;IAEG,UAAU,CACb,OAAgB,EAChB,UAAsB,EACtB,aAA4B,EAC5B,UAAsB,EACtB,OAA+B,EAC/B,cAA8B;QAE9B,MAAM,aAAa,GAAG,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;QAChD,MAAM,SAAS,GAAG,OAAO,CAAC,eAAe,CAAC,OAAO,EAAE,GAAG,aAAa,CAAC,CAAC;QACrE,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE;YACxB,4EAA4E;YAC5E,IAAI,IAAI,CAAC,uBAAuB,KAAK,IAAI,EAAE;gBACvC,OAAO,cAAc,EAAE,CAAC;aAC3B;YACD,OAAO,YAAY,CAAC,aAAa,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;SACrD;aAAM,IACH,CAAC,IAAI,CAAC,uBAAuB;YAC7B,OAAO,CAAC,cAAc,EAAE,GAAG,IAAI,CAAC,uBAAuB,CAAC,QAAQ,GAAG,sBAAsB,EAC3F;YACE,UAAU,CAAC,UAAU,CACjB,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,EACxC,SAAS,CAAC,OAAO,EACjB,IAAI,CAAC,aAAa,CACrB,CAAC;YACF,qCAAqC;YACrC,IAAI,CAAC,uBAAuB,GAAG;gBAC3B,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE;gBACvB,QAAQ,EAAE,OAAO,CAAC,cAAc,EAAE;aACrC,CAAC;SACL;QACD,OAAO,IAAI,EAAE,CAAC;IAClB,CAAC;IAEM,kBAAkB;QACrB,OAAO,SAAS,CAAC;IACrB,CAAC;CACJ"}
@@ -1,46 +0,0 @@
1
- import { OrderType } from "@chronodivide/game-api";
2
- import { disbandMission, noop, requestSpecificUnits, requestUnits } from "../mission.js";
3
- const DEPLOY_COOLDOWN_TICKS = 30;
4
- // Expansion or initial base.
5
- export class ExpansionSquad {
6
- /**
7
- * @param selectedMcv ID of the MCV to try to expand with. If that unit dies, the squad will disband. If no value is provided,
8
- * the mission requests an MCV.
9
- */
10
- constructor(selectedMcv, priority) {
11
- this.selectedMcv = selectedMcv;
12
- this.priority = priority;
13
- this.hasAttemptedDeployWith = null;
14
- }
15
- onAiUpdate(gameApi, actionsApi, actionBatcher, playerData, mission, matchAwareness) {
16
- const mcvTypes = ["AMCV", "SMCV"];
17
- const mcvs = mission.getUnitsOfTypes(gameApi, ...mcvTypes);
18
- if (mcvs.length === 0) {
19
- // Perhaps we deployed already (or the unit was destroyed), end the mission.
20
- if (this.hasAttemptedDeployWith !== null) {
21
- return disbandMission();
22
- }
23
- // We need an mcv!
24
- if (this.selectedMcv) {
25
- return requestSpecificUnits([this.selectedMcv], this.priority);
26
- }
27
- else {
28
- return requestUnits(mcvTypes, this.priority);
29
- }
30
- }
31
- else if (!this.hasAttemptedDeployWith ||
32
- gameApi.getCurrentTick() > this.hasAttemptedDeployWith.gameTick + DEPLOY_COOLDOWN_TICKS) {
33
- actionsApi.orderUnits(mcvs.map((mcv) => mcv.id), OrderType.DeploySelected);
34
- // Add a cooldown to deploy attempts.
35
- this.hasAttemptedDeployWith = {
36
- unitId: mcvs[0].id,
37
- gameTick: gameApi.getCurrentTick(),
38
- };
39
- }
40
- return noop();
41
- }
42
- getGlobalDebugText() {
43
- return undefined;
44
- }
45
- }
46
- //# sourceMappingURL=expansionSquad.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"expansionSquad.js","sourceRoot":"","sources":["../../../../../src/bot/logic/mission/behaviours/expansionSquad.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,SAAS,EAAc,MAAM,wBAAwB,CAAC;AAIpF,OAAO,EAA0B,cAAc,EAAE,IAAI,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAEjH,MAAM,qBAAqB,GAAG,EAAE,CAAC;AAEjC,6BAA6B;AAC7B,MAAM,OAAO,cAAc;IAMvB;;;OAGG;IACH,YACY,WAA0B,EAC1B,QAAgB;QADhB,gBAAW,GAAX,WAAW,CAAe;QAC1B,aAAQ,GAAR,QAAQ,CAAQ;QAXpB,2BAAsB,GAGnB,IAAI,CAAC;IASb,CAAC;IAEG,UAAU,CACb,OAAgB,EAChB,UAAsB,EACtB,aAA4B,EAC5B,UAAsB,EACtB,OAAgC,EAChC,cAA8B;QAE9B,MAAM,QAAQ,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAClC,MAAM,IAAI,GAAG,OAAO,CAAC,eAAe,CAAC,OAAO,EAAE,GAAG,QAAQ,CAAC,CAAC;QAC3D,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;YACnB,4EAA4E;YAC5E,IAAI,IAAI,CAAC,sBAAsB,KAAK,IAAI,EAAE;gBACtC,OAAO,cAAc,EAAE,CAAC;aAC3B;YACD,kBAAkB;YAClB,IAAI,IAAI,CAAC,WAAW,EAAE;gBAClB,OAAO,oBAAoB,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;aAClE;iBAAM;gBACH,OAAO,YAAY,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;aAChD;SACJ;aAAM,IACH,CAAC,IAAI,CAAC,sBAAsB;YAC5B,OAAO,CAAC,cAAc,EAAE,GAAG,IAAI,CAAC,sBAAsB,CAAC,QAAQ,GAAG,qBAAqB,EACzF;YACE,UAAU,CAAC,UAAU,CACjB,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EACzB,SAAS,CAAC,cAAc,CAC3B,CAAC;YACF,qCAAqC;YACrC,IAAI,CAAC,sBAAsB,GAAG;gBAC1B,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE;gBAClB,QAAQ,EAAE,OAAO,CAAC,cAAc,EAAE;aACrC,CAAC;SACL;QACD,OAAO,IAAI,EAAE,CAAC;IAClB,CAAC;IAEM,kBAAkB;QACrB,OAAO,SAAS,CAAC;IACrB,CAAC;CACJ"}
@@ -1,31 +0,0 @@
1
- import { OrderType } from "@chronodivide/game-api";
2
- import { disbandMission, requestSpecificUnits } from "../mission.js";
3
- const SCOUT_MOVE_COOLDOWN_TICKS = 30;
4
- export class RetreatSquad {
5
- constructor(unitIds, retreatToPoint) {
6
- this.unitIds = unitIds;
7
- this.retreatToPoint = retreatToPoint;
8
- this.createdAt = null;
9
- }
10
- onAiUpdate(gameApi, actionsApi, actionBatcher, playerData, mission, matchAwareness) {
11
- if (!this.createdAt) {
12
- this.createdAt = gameApi.getCurrentTick();
13
- }
14
- if (mission.getUnitIds().length > 0) {
15
- // Only send the order once we have managed to claim some units.
16
- actionsApi.orderUnits(mission.getUnitIds(), OrderType.AttackMove, this.retreatToPoint.x, this.retreatToPoint.y);
17
- return disbandMission();
18
- }
19
- if (this.createdAt && gameApi.getCurrentTick() > this.createdAt + 240) {
20
- // Disband automatically after 240 ticks in case we couldn't actually claim any units.
21
- return disbandMission();
22
- }
23
- else {
24
- return requestSpecificUnits(this.unitIds, 1000);
25
- }
26
- }
27
- getGlobalDebugText() {
28
- return undefined;
29
- }
30
- }
31
- //# sourceMappingURL=retreatSquad.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"retreatSquad.js","sourceRoot":"","sources":["../../../../../src/bot/logic/mission/behaviours/retreatSquad.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,SAAS,EAAuB,MAAM,wBAAwB,CAAC;AAI7F,OAAO,EAA0B,cAAc,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAE7F,MAAM,yBAAyB,GAAG,EAAE,CAAC;AAErC,MAAM,OAAO,YAAY;IAGrB,YACY,OAAiB,EACjB,cAAuB;QADvB,YAAO,GAAP,OAAO,CAAU;QACjB,mBAAc,GAAd,cAAc,CAAS;QAJ3B,cAAS,GAAkB,IAAI,CAAC;IAKrC,CAAC;IAEG,UAAU,CACb,OAAgB,EAChB,UAAsB,EACtB,aAA4B,EAC5B,UAAsB,EACtB,OAA8B,EAC9B,cAA8B;QAE9B,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;YACjB,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;SAC7C;QACD,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE;YACjC,gEAAgE;YAChE,UAAU,CAAC,UAAU,CACjB,OAAO,CAAC,UAAU,EAAE,EACpB,SAAS,CAAC,UAAU,EACpB,IAAI,CAAC,cAAc,CAAC,CAAC,EACrB,IAAI,CAAC,cAAc,CAAC,CAAC,CACxB,CAAC;YACF,OAAO,cAAc,EAAE,CAAC;SAC3B;QACD,IAAI,IAAI,CAAC,SAAS,IAAI,OAAO,CAAC,cAAc,EAAE,GAAG,IAAI,CAAC,SAAS,GAAG,GAAG,EAAE;YACnE,sFAAsF;YACtF,OAAO,cAAc,EAAE,CAAC;SAC3B;aAAM;YACH,OAAO,oBAAoB,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;SACnD;IACL,CAAC;IAEM,kBAAkB;QACrB,OAAO,SAAS,CAAC;IACrB,CAAC;CACJ"}