@supalosa/chronodivide-bot 0.4.0 → 0.5.2

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 (123) hide show
  1. package/.env.template +5 -0
  2. package/README.md +54 -47
  3. package/dist/bot/bot.js +14 -35
  4. package/dist/bot/bot.js.map +1 -1
  5. package/dist/bot/logic/awareness.js +13 -8
  6. package/dist/bot/logic/awareness.js.map +1 -1
  7. package/dist/bot/logic/building/ArtilleryUnit.js +2 -29
  8. package/dist/bot/logic/building/antiAirStaticDefence.js +43 -0
  9. package/dist/bot/logic/building/antiAirStaticDefence.js.map +1 -0
  10. package/dist/bot/logic/building/antiGroundStaticDefence.js +10 -20
  11. package/dist/bot/logic/building/antiGroundStaticDefence.js.map +1 -1
  12. package/dist/bot/logic/building/artilleryUnit.js.map +1 -1
  13. package/dist/bot/logic/building/basicAirUnit.js +2 -23
  14. package/dist/bot/logic/building/basicAirUnit.js.map +1 -1
  15. package/dist/bot/logic/building/basicBuilding.js +3 -2
  16. package/dist/bot/logic/building/basicBuilding.js.map +1 -1
  17. package/dist/bot/logic/building/basicGroundUnit.js +2 -43
  18. package/dist/bot/logic/building/basicGroundUnit.js.map +1 -1
  19. package/dist/bot/logic/building/buildingRules.js +15 -9
  20. package/dist/bot/logic/building/buildingRules.js.map +1 -1
  21. package/dist/bot/logic/building/common.js +19 -0
  22. package/dist/bot/logic/building/common.js.map +1 -0
  23. package/dist/bot/logic/building/harvester.js +2 -1
  24. package/dist/bot/logic/building/harvester.js.map +1 -1
  25. package/dist/bot/logic/building/queueController.js +69 -42
  26. package/dist/bot/logic/building/queueController.js.map +1 -1
  27. package/dist/bot/logic/common/utils.js +21 -0
  28. package/dist/bot/logic/common/utils.js.map +1 -1
  29. package/dist/bot/logic/composition/alliedCompositions.js +13 -0
  30. package/dist/bot/logic/composition/alliedCompositions.js.map +1 -0
  31. package/dist/bot/logic/composition/common.js +2 -0
  32. package/dist/bot/logic/composition/common.js.map +1 -0
  33. package/dist/bot/logic/composition/sovietCompositions.js +13 -0
  34. package/dist/bot/logic/composition/sovietCompositions.js.map +1 -0
  35. package/dist/bot/logic/mission/actionBatcher.js +92 -0
  36. package/dist/bot/logic/mission/actionBatcher.js.map +1 -0
  37. package/dist/bot/logic/mission/behaviours/combatSquad.js +124 -0
  38. package/dist/bot/logic/mission/behaviours/combatSquad.js.map +1 -0
  39. package/dist/bot/logic/mission/behaviours/common.js +56 -0
  40. package/dist/bot/logic/mission/behaviours/common.js.map +1 -0
  41. package/dist/bot/logic/mission/behaviours/engineerSquad.js +39 -0
  42. package/dist/bot/logic/mission/behaviours/engineerSquad.js.map +1 -0
  43. package/dist/bot/logic/mission/behaviours/expansionSquad.js +46 -0
  44. package/dist/bot/logic/mission/behaviours/expansionSquad.js.map +1 -0
  45. package/dist/bot/logic/mission/behaviours/retreatSquad.js +31 -0
  46. package/dist/bot/logic/mission/behaviours/retreatSquad.js.map +1 -0
  47. package/{src/bot/logic/squad/behaviours/scoutingSquad.ts → dist/bot/logic/mission/behaviours/scoutingSquad.js} +27 -51
  48. package/dist/bot/logic/mission/behaviours/scoutingSquad.js.map +1 -0
  49. package/dist/bot/logic/mission/mission.js +91 -19
  50. package/dist/bot/logic/mission/mission.js.map +1 -1
  51. package/dist/bot/logic/mission/missionController.js +262 -21
  52. package/dist/bot/logic/mission/missionController.js.map +1 -1
  53. package/dist/bot/logic/mission/missions/attackMission.js +113 -39
  54. package/dist/bot/logic/mission/missions/attackMission.js.map +1 -1
  55. package/dist/bot/logic/mission/missions/basicMission.js +13 -0
  56. package/dist/bot/logic/mission/missions/basicMission.js.map +1 -0
  57. package/dist/bot/logic/mission/missions/defenceMission.js +43 -28
  58. package/dist/bot/logic/mission/missions/defenceMission.js.map +1 -1
  59. package/dist/bot/logic/mission/missions/engineerMission.js +37 -7
  60. package/dist/bot/logic/mission/missions/engineerMission.js.map +1 -1
  61. package/dist/bot/logic/mission/missions/expansionMission.js +42 -6
  62. package/dist/bot/logic/mission/missions/expansionMission.js.map +1 -1
  63. package/dist/bot/logic/mission/missions/missionBehaviour.js +2 -0
  64. package/dist/bot/logic/mission/missions/missionBehaviour.js.map +1 -0
  65. package/dist/bot/logic/mission/missions/retreatMission.js +31 -5
  66. package/dist/bot/logic/mission/missions/retreatMission.js.map +1 -1
  67. package/dist/bot/logic/mission/missions/scoutingMission.js +103 -6
  68. package/dist/bot/logic/mission/missions/scoutingMission.js.map +1 -1
  69. package/dist/bot/logic/mission/missions/squads/combatSquad.js +116 -0
  70. package/dist/bot/logic/mission/missions/squads/combatSquad.js.map +1 -0
  71. package/dist/bot/logic/mission/missions/squads/common.js +58 -0
  72. package/dist/bot/logic/mission/missions/squads/common.js.map +1 -0
  73. package/dist/bot/logic/mission/missions/squads/squad.js +2 -0
  74. package/dist/bot/logic/mission/missions/squads/squad.js.map +1 -0
  75. package/dist/bot/logic/squad/squadController.js +6 -2
  76. package/dist/bot/logic/squad/squadController.js.map +1 -1
  77. package/dist/bot/logic/threat/threatCalculator.js +9 -9
  78. package/dist/bot/logic/threat/threatCalculator.js.map +1 -1
  79. package/dist/exampleBot.js +50 -18
  80. package/dist/exampleBot.js.map +1 -1
  81. package/package.json +5 -4
  82. package/src/bot/bot.ts +19 -51
  83. package/src/bot/logic/awareness.ts +34 -22
  84. package/src/bot/logic/building/antiAirStaticDefence.ts +64 -0
  85. package/src/bot/logic/building/antiGroundStaticDefence.ts +7 -20
  86. package/src/bot/logic/building/artilleryUnit.ts +2 -28
  87. package/src/bot/logic/building/basicAirUnit.ts +2 -33
  88. package/src/bot/logic/building/basicBuilding.ts +8 -6
  89. package/src/bot/logic/building/basicGroundUnit.ts +2 -46
  90. package/src/bot/logic/building/buildingRules.ts +15 -9
  91. package/src/bot/logic/building/common.ts +23 -0
  92. package/src/bot/logic/building/harvester.ts +2 -1
  93. package/src/bot/logic/building/queueController.ts +98 -43
  94. package/src/bot/logic/common/utils.ts +28 -0
  95. package/src/bot/logic/composition/alliedCompositions.ts +22 -0
  96. package/src/bot/logic/composition/common.ts +3 -0
  97. package/src/bot/logic/composition/sovietCompositions.ts +21 -0
  98. package/src/bot/logic/{squad/behaviours → mission}/actionBatcher.ts +66 -7
  99. package/src/bot/logic/mission/mission.ts +186 -37
  100. package/src/bot/logic/mission/missionController.ts +340 -31
  101. package/src/bot/logic/mission/missionFactories.ts +3 -3
  102. package/src/bot/logic/mission/missions/attackMission.ts +181 -44
  103. package/src/bot/logic/mission/missions/defenceMission.ts +72 -45
  104. package/src/bot/logic/mission/missions/engineerMission.ts +67 -15
  105. package/src/bot/logic/mission/missions/expansionMission.ts +67 -14
  106. package/src/bot/logic/mission/missions/retreatMission.ts +50 -6
  107. package/src/bot/logic/mission/missions/scoutingMission.ts +138 -14
  108. package/src/bot/logic/{squad/behaviours → mission/missions/squads}/combatSquad.ts +56 -33
  109. package/src/bot/logic/{squad/behaviours → mission/missions/squads}/common.ts +11 -17
  110. package/src/bot/logic/mission/missions/squads/squad.ts +19 -0
  111. package/src/bot/logic/threat/threatCalculator.ts +10 -10
  112. package/src/exampleBot.ts +56 -24
  113. package/.prettierrc +0 -5
  114. package/TODO.md +0 -15
  115. package/rules.ini +0 -23126
  116. package/src/bot/logic/mission/missions/oneTimeMission.ts +0 -33
  117. package/src/bot/logic/squad/behaviours/engineerSquad.ts +0 -58
  118. package/src/bot/logic/squad/behaviours/expansionSquad.ts +0 -64
  119. package/src/bot/logic/squad/behaviours/retreatSquad.ts +0 -50
  120. package/src/bot/logic/squad/squad.ts +0 -165
  121. package/src/bot/logic/squad/squadBehaviour.ts +0 -66
  122. package/src/bot/logic/squad/squadBehaviours.ts +0 -8
  123. package/src/bot/logic/squad/squadController.ts +0 -271
@@ -1 +1 @@
1
- {"version":3,"file":"mission.js","sourceRoot":"","sources":["../../../../src/bot/logic/mission/mission.ts"],"names":[],"mappings":"AAKA,yEAAyE;AACzE,mEAAmE;AACnE,MAAM,OAAgB,OAAO;IAMzB,YAAoB,UAAkB,EAAU,QAAgB,EAAY,MAAmB;QAA3E,eAAU,GAAV,UAAU,CAAQ;QAAU,aAAQ,GAAR,QAAQ,CAAQ;QAAY,WAAM,GAAN,MAAM,CAAa;QALvF,UAAK,GAAiB,IAAI,CAAC;QAC3B,WAAM,GAAG,IAAI,CAAC;QAEd,aAAQ,GAA0D,GAAG,EAAE,GAAE,CAAC,CAAC;IAEe,CAAC;IAInG,QAAQ;QACJ,OAAO,IAAI,CAAC,MAAM,CAAC;IACvB,CAAC;IAES,QAAQ,CAAC,KAAY;QAC3B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC;IAChC,CAAC;IAED,QAAQ;QACJ,OAAO,IAAI,CAAC,KAAK,CAAC;IACtB,CAAC;IAED,WAAW;QACP,2CAA2C;QAC3C,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;IACtB,CAAC;IAED,aAAa;QACT,OAAO,IAAI,CAAC,UAAU,CAAC;IAC3B,CAAC;IAED,0CAA0C;IAC1C,UAAU,CAAC,MAAsB;QAC7B,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QAClC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;IACxB,CAAC;IAED;;OAEG;IACH,IAAI,CAAC,QAA+D;QAChE,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,OAAO,IAAI,CAAC;IAChB,CAAC;CACJ;AAgBD,MAAM,CAAC,MAAM,IAAI,GAAG,GAAG,EAAE,CACrB,CAAC;IACG,IAAI,EAAE,MAAM;CACO,CAAA,CAAC;AAE5B,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,KAAY,EAAE,EAAE,CAC1C,CAAC;IACG,IAAI,EAAE,eAAe;IACrB,KAAK;CACuB,CAAA,CAAC;AAErC,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,MAAY,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAA2B,CAAA,CAAC"}
1
+ {"version":3,"file":"mission.js","sourceRoot":"","sources":["../../../../src/bot/logic/mission/mission.ts"],"names":[],"mappings":"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"}
@@ -1,51 +1,233 @@
1
- // Meta-controller for forming and controlling squads.
1
+ // Meta-controller for forming and controlling missions.
2
+ // Missions are groups of zero or more units that aim to accomplish a particular goal.
3
+ import { Vector2 } from "@chronodivide/game-api";
4
+ import { isDisbandMission, isGrabCombatants, isReleaseUnits, isRequestSpecificUnits, isRequestUnits, } from "./mission.js";
2
5
  import { createMissionFactories } from "./missionFactories.js";
6
+ import { ActionBatcher } from "./actionBatcher.js";
7
+ import { countBy, isSelectableCombatant } from "../common/utils.js";
8
+ // `missingUnitTypes` priority decays by this much every update loop.
9
+ const MISSING_UNIT_TYPE_REQUEST_DECAY_MULT_RATE = 0.75;
10
+ const MISSING_UNIT_TYPE_REQUEST_DECAY_FLAT_RATE = 1;
3
11
  export class MissionController {
4
12
  constructor(logger) {
5
13
  this.logger = logger;
6
14
  this.missions = [];
15
+ // A mapping of unit IDs to the missions they are assigned to. This may contain units that are dead, but
16
+ // is periodically cleaned in the update loop.
17
+ this.unitIdToMission = new Map();
18
+ // A mapping of unit types to the highest priority requested for a mission.
19
+ // This decays over time if requests are not 'refreshed' by mission.
20
+ this.requestedUnitTypes = new Map();
21
+ // Tracks missions to be externally disbanded the next time the mission update loop occurs.
7
22
  this.forceDisbandedMissions = [];
8
23
  this.missionFactories = createMissionFactories();
9
24
  }
10
- onAiUpdate(gameApi, playerData, matchAwareness, squadController) {
25
+ updateUnitIds(gameApi) {
26
+ // Check for units in multiple missions, this shouldn't happen.
27
+ this.unitIdToMission = new Map();
28
+ this.missions.forEach((mission) => {
29
+ const toRemove = [];
30
+ mission.getUnitIds().forEach((unitId) => {
31
+ if (this.unitIdToMission.has(unitId)) {
32
+ this.logger(`WARNING: unit ${unitId} is in multiple missions, please debug.`);
33
+ }
34
+ else if (!gameApi.getGameObjectData(unitId)) {
35
+ // say, if a unit was killed
36
+ toRemove.push(unitId);
37
+ }
38
+ else {
39
+ this.unitIdToMission.set(unitId, mission);
40
+ }
41
+ });
42
+ toRemove.forEach((unitId) => mission.removeUnit(unitId));
43
+ });
44
+ }
45
+ onAiUpdate(gameApi, actionsApi, playerData, matchAwareness) {
11
46
  // Remove inactive missions.
12
47
  this.missions = this.missions.filter((missions) => missions.isActive());
48
+ this.updateUnitIds(gameApi);
49
+ // Batch actions to reduce spamming of actions for larger armies.
50
+ const actionBatcher = new ActionBatcher();
13
51
  // Poll missions for requested actions.
14
52
  const missionActions = this.missions.map((mission) => ({
15
53
  mission,
16
- action: mission.onAiUpdate(gameApi, playerData, matchAwareness),
54
+ action: mission.onAiUpdate(gameApi, actionsApi, playerData, matchAwareness, actionBatcher),
17
55
  }));
18
56
  // Handle disbands and merges.
19
- const isDisband = (a) => a.type == "disband";
20
57
  const disbandedMissions = new Map();
21
58
  const disbandedMissionsArray = [];
22
59
  this.forceDisbandedMissions.forEach((name) => disbandedMissions.set(name, null));
23
60
  this.forceDisbandedMissions = [];
24
- missionActions
25
- .filter((a) => isDisband(a.action))
26
- .forEach((a) => {
61
+ missionActions.filter(isDisbandMission).forEach((a) => {
62
+ this.logger(`Mission ${a.mission.getUniqueName()} disbanding as requested.`);
63
+ a.mission.getUnitIds().forEach((unitId) => {
64
+ this.unitIdToMission.delete(unitId);
65
+ actionsApi.setUnitDebugText(unitId, undefined);
66
+ });
27
67
  disbandedMissions.set(a.mission.getUniqueName(), a.action.reason);
28
68
  });
29
- // Remove disbanded and merged squads.
69
+ // Handle unit requests.
70
+ // Release units
71
+ missionActions.filter(isReleaseUnits).forEach((a) => {
72
+ a.action.unitIds.forEach((unitId) => {
73
+ if (this.unitIdToMission.get(unitId)?.getUniqueName() === a.mission.getUniqueName()) {
74
+ this.removeUnitFromMission(a.mission, unitId, actionsApi);
75
+ }
76
+ });
77
+ });
78
+ // Request specific units by ID
79
+ const unitIdToHighestRequest = missionActions.filter(isRequestSpecificUnits).reduce((prev, missionWithAction) => {
80
+ const { unitIds } = missionWithAction.action;
81
+ unitIds.forEach((unitId) => {
82
+ if (prev.hasOwnProperty(unitId)) {
83
+ if (prev[unitId].action.priority > prev[unitId].action.priority) {
84
+ prev[unitId] = missionWithAction;
85
+ }
86
+ }
87
+ else {
88
+ prev[unitId] = missionWithAction;
89
+ }
90
+ });
91
+ return prev;
92
+ }, {});
93
+ // Map of Mission ID to Unit Type to Count.
94
+ const newMissionAssignments = Object.entries(unitIdToHighestRequest)
95
+ .flatMap(([id, request]) => {
96
+ const unitId = Number.parseInt(id);
97
+ const unit = gameApi.getGameObjectData(unitId);
98
+ const { mission: requestingMission } = request;
99
+ const missionName = requestingMission.getUniqueName();
100
+ if (!unit) {
101
+ this.logger(`mission ${missionName} requested non-existent unit ${unitId}`);
102
+ return [];
103
+ }
104
+ if (!this.unitIdToMission.has(unitId)) {
105
+ this.addUnitToMission(requestingMission, unit, actionsApi);
106
+ return [{ unitName: unit?.name, mission: requestingMission.getUniqueName() }];
107
+ }
108
+ return [];
109
+ })
110
+ .reduce((acc, curr) => {
111
+ if (!acc[curr.mission]) {
112
+ acc[curr.mission] = {};
113
+ }
114
+ if (!acc[curr.mission][curr.unitName]) {
115
+ acc[curr.mission][curr.unitName] = 0;
116
+ }
117
+ acc[curr.mission][curr.unitName] = acc[curr.mission][curr.unitName] + 1;
118
+ return acc;
119
+ }, {});
120
+ Object.entries(newMissionAssignments).forEach(([mission, assignments]) => {
121
+ this.logger(`Mission ${mission} received: ${Object.entries(assignments)
122
+ .map(([unitType, count]) => unitType + " x " + count)
123
+ .join(", ")}`);
124
+ });
125
+ // Request units by type - store the highest priority mission for each unit type.
126
+ const unitTypeToHighestRequest = missionActions.filter(isRequestUnits).reduce((prev, missionWithAction) => {
127
+ const { unitNames } = missionWithAction.action;
128
+ unitNames.forEach((unitName) => {
129
+ if (prev.hasOwnProperty(unitName)) {
130
+ if (prev[unitName].action.priority > prev[unitName].action.priority) {
131
+ prev[unitName] = missionWithAction;
132
+ }
133
+ }
134
+ else {
135
+ prev[unitName] = missionWithAction;
136
+ }
137
+ });
138
+ return prev;
139
+ }, {});
140
+ // Request combat-capable units in an area
141
+ const grabRequests = missionActions.filter(isGrabCombatants);
142
+ // Find un-assigned units and distribute them among all the requesting missions.
143
+ const unitIds = gameApi.getVisibleUnits(playerData.name, "self");
144
+ // List of units that are unassigned or not in a locked mission.
145
+ const freeUnits = unitIds
146
+ .map((unitId) => gameApi.getGameObjectData(unitId))
147
+ .filter((unit) => !!unit)
148
+ .map((unit) => ({
149
+ unit,
150
+ mission: this.unitIdToMission.get(unit.id),
151
+ }))
152
+ .filter((unitWithMission) => !unitWithMission.mission || unitWithMission.mission.isUnitsLocked() === false);
153
+ // Sort free units so that unassigned units get chosen before assigned (but unlocked) units.
154
+ freeUnits.sort((u1, u2) => (u1.mission?.getPriority() ?? 0) - (u2.mission?.getPriority() ?? 0));
155
+ const newAssignmentsByType = freeUnits
156
+ .flatMap(({ unit: freeUnit, mission: donatingMission }) => {
157
+ if (unitTypeToHighestRequest.hasOwnProperty(freeUnit.name)) {
158
+ const { mission: requestingMission } = unitTypeToHighestRequest[freeUnit.name];
159
+ if (donatingMission) {
160
+ if (donatingMission === requestingMission ||
161
+ donatingMission.getPriority() > requestingMission.getPriority()) {
162
+ return [];
163
+ }
164
+ this.removeUnitFromMission(donatingMission, freeUnit.id, actionsApi);
165
+ }
166
+ this.logger(`granting unit ${freeUnit.id}#${freeUnit.name} to mission ${requestingMission.getUniqueName()}`);
167
+ this.addUnitToMission(requestingMission, freeUnit, actionsApi);
168
+ delete unitTypeToHighestRequest[freeUnit.name];
169
+ return [
170
+ { unitName: freeUnit.name, missionName: requestingMission.getUniqueName(), method: "type" },
171
+ ];
172
+ }
173
+ else if (grabRequests.length > 0) {
174
+ const grantedMission = grabRequests.find((request) => {
175
+ const canGrabUnit = isSelectableCombatant(freeUnit);
176
+ return (canGrabUnit &&
177
+ request.action.point.distanceTo(new Vector2(freeUnit.tile.rx, freeUnit.tile.ry)) <=
178
+ request.action.radius);
179
+ });
180
+ if (grantedMission) {
181
+ if (donatingMission) {
182
+ if (donatingMission === grantedMission.mission ||
183
+ donatingMission.getPriority() > grantedMission.mission.getPriority()) {
184
+ return [];
185
+ }
186
+ this.removeUnitFromMission(donatingMission, freeUnit.id, actionsApi);
187
+ }
188
+ this.addUnitToMission(grantedMission.mission, freeUnit, actionsApi);
189
+ return [
190
+ {
191
+ unitName: freeUnit.name,
192
+ missionName: grantedMission.mission.getUniqueName(),
193
+ method: "grab",
194
+ },
195
+ ];
196
+ }
197
+ }
198
+ return [];
199
+ })
200
+ .reduce((acc, curr) => {
201
+ if (!acc[curr.missionName]) {
202
+ acc[curr.missionName] = {};
203
+ }
204
+ if (!acc[curr.missionName][curr.unitName]) {
205
+ acc[curr.missionName][curr.unitName] = { grab: 0, type: 0 };
206
+ }
207
+ acc[curr.missionName][curr.unitName][curr.method] =
208
+ acc[curr.missionName][curr.unitName][curr.method] + 1;
209
+ return acc;
210
+ }, {});
211
+ Object.entries(newAssignmentsByType).forEach(([mission, assignments]) => {
212
+ this.logger(`Mission ${mission} received: ${Object.entries(assignments)
213
+ .flatMap(([unitType, methodToCount]) => Object.entries(methodToCount)
214
+ .filter(([, count]) => count > 0)
215
+ .map(([method, count]) => unitType + " x " + count + " (by " + method + ")"))
216
+ .join(", ")}`);
217
+ });
218
+ this.updateRequestedUnitTypes(unitTypeToHighestRequest);
219
+ // Send all actions that can be batched together.
220
+ actionBatcher.resolve(actionsApi);
221
+ // Remove disbanded and merged missions.
30
222
  this.missions
31
223
  .filter((missions) => disbandedMissions.has(missions.getUniqueName()))
32
224
  .forEach((disbandedMission) => {
33
225
  const reason = disbandedMissions.get(disbandedMission.getUniqueName());
34
- this.logger(`mission disbanded: ${disbandedMission.getUniqueName()}, reason: ${reason}, hasSquad: ${!!disbandedMission.getSquad}`);
226
+ this.logger(`mission disbanded: ${disbandedMission.getUniqueName()}, reason: ${reason}`);
35
227
  disbandedMissionsArray.push({ mission: disbandedMission, reason });
36
228
  disbandedMission.endMission(disbandedMissions.get(disbandedMission.getUniqueName()));
37
- disbandedMission.getSquad()?.setMission(null);
38
229
  });
39
230
  this.missions = this.missions.filter((missions) => !disbandedMissions.has(missions.getUniqueName()));
40
- // Register new squads
41
- const isNewSquad = (a) => a.type == "registerSquad";
42
- missionActions
43
- .filter((a) => isNewSquad(a.action))
44
- .forEach((a) => {
45
- const action = a.action;
46
- squadController.registerSquad(action.squad);
47
- this.logger(`registered a squad: ${action.squad.getName()}`);
48
- });
49
231
  // Create dynamic missions.
50
232
  this.missionFactories.forEach((missionFactory) => {
51
233
  missionFactory.maybeCreateMissions(gameApi, playerData, matchAwareness, this, this.logger);
@@ -54,6 +236,43 @@ export class MissionController {
54
236
  });
55
237
  });
56
238
  }
239
+ updateRequestedUnitTypes(missingUnitTypeToHighestRequest) {
240
+ // Decay the priority over time.
241
+ const currentUnitTypes = Array.from(this.requestedUnitTypes.keys());
242
+ for (const unitType of currentUnitTypes) {
243
+ const newPriority = this.requestedUnitTypes.get(unitType) * MISSING_UNIT_TYPE_REQUEST_DECAY_MULT_RATE -
244
+ MISSING_UNIT_TYPE_REQUEST_DECAY_FLAT_RATE;
245
+ if (newPriority > 0.5) {
246
+ this.requestedUnitTypes.set(unitType, newPriority);
247
+ }
248
+ else {
249
+ this.requestedUnitTypes.delete(unitType);
250
+ }
251
+ }
252
+ // Add the new missing units to the priority set, if the request is higher than the existing value.
253
+ Object.entries(missingUnitTypeToHighestRequest).forEach(([unitType, request]) => {
254
+ const currentPriority = this.requestedUnitTypes.get(unitType);
255
+ this.requestedUnitTypes.set(unitType, currentPriority ? Math.max(currentPriority, request.action.priority) : request.action.priority);
256
+ });
257
+ }
258
+ /**
259
+ * Returns the set of units that have been requested for production by the missions.
260
+ *
261
+ * @returns A map of unit type to the highest priority for that unit type.
262
+ */
263
+ getRequestedUnitTypes() {
264
+ return this.requestedUnitTypes;
265
+ }
266
+ addUnitToMission(mission, unit, actionsApi) {
267
+ mission.addUnit(unit.id);
268
+ this.unitIdToMission.set(unit.id, mission);
269
+ actionsApi.setUnitDebugText(unit.id, mission.getUniqueName() + "_" + unit.id);
270
+ }
271
+ removeUnitFromMission(mission, unitId, actionsApi) {
272
+ mission.removeUnit(unitId);
273
+ this.unitIdToMission.delete(unitId);
274
+ actionsApi.setUnitDebugText(unitId, undefined);
275
+ }
57
276
  /**
58
277
  * Attempts to add a mission to the active set.
59
278
  * @param mission
@@ -74,8 +293,30 @@ export class MissionController {
74
293
  disbandMission(missionName) {
75
294
  this.forceDisbandedMissions.push(missionName);
76
295
  }
77
- logDebugOutput() {
78
- this.logger(`Missions (${this.missions.length}): ${this.missions.map((m) => m.getUniqueName()).join(", ")}`);
296
+ // return text to display for global debug
297
+ getGlobalDebugText(gameApi) {
298
+ const unitsInMission = (unitIds) => countBy(unitIds, (unitId) => gameApi.getGameObjectData(unitId)?.name);
299
+ let globalDebugText = "";
300
+ this.missions.forEach((mission) => {
301
+ this.logger(`Mission ${mission.getUniqueName()}: ${Object.entries(unitsInMission(mission.getUnitIds()))
302
+ .map(([unitName, count]) => `${unitName} x ${count}`)
303
+ .join(", ")}`);
304
+ const missionDebugText = mission.getGlobalDebugText();
305
+ if (missionDebugText) {
306
+ globalDebugText += mission.getUniqueName() + ": " + missionDebugText + "\n";
307
+ }
308
+ });
309
+ return globalDebugText;
310
+ }
311
+ updateDebugText(actionsApi) {
312
+ this.missions.forEach((mission) => {
313
+ mission
314
+ .getUnitIds()
315
+ .forEach((unitId) => actionsApi.setUnitDebugText(unitId, `${unitId}: ${mission.getUniqueName()}`));
316
+ });
317
+ }
318
+ getMissions() {
319
+ return this.missions;
79
320
  }
80
321
  }
81
322
  //# sourceMappingURL=missionController.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"missionController.js","sourceRoot":"","sources":["../../../../src/bot/logic/mission/missionController.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"missionController.js","sourceRoot":"","sources":["../../../../src/bot/logic/mission/missionController.ts"],"names":[],"mappings":"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"}
@@ -1,57 +1,127 @@
1
- import { ObjectType, Vector2 } from "@chronodivide/game-api";
2
- import { CombatSquad } from "../../squad/behaviours/combatSquad.js";
3
- import { Mission, disbandMission, noop } from "../mission.js";
4
- import { Squad } from "../../squad/squad.js";
1
+ import { ObjectType, SideType, Vector2 } from "@chronodivide/game-api";
2
+ import { CombatSquad } from "./squads/combatSquad.js";
3
+ import { Mission, disbandMission, noop, requestUnits } from "../mission.js";
5
4
  import { RetreatMission } from "./retreatMission.js";
6
- import { maxBy } from "../../common/utils.js";
5
+ import { countBy, isOwnedByNeutral, maxBy } from "../../common/utils.js";
6
+ import { getSovietComposition } from "../../composition/sovietCompositions.js";
7
+ import { getAlliedCompositions } from "../../composition/alliedCompositions.js";
8
+ import { manageMoveMicro } from "./squads/common.js";
7
9
  export var AttackFailReason;
8
10
  (function (AttackFailReason) {
9
11
  AttackFailReason[AttackFailReason["NoTargets"] = 0] = "NoTargets";
10
12
  AttackFailReason[AttackFailReason["DefenceTooStrong"] = 1] = "DefenceTooStrong";
11
13
  })(AttackFailReason || (AttackFailReason = {}));
14
+ var AttackMissionState;
15
+ (function (AttackMissionState) {
16
+ AttackMissionState[AttackMissionState["Preparing"] = 0] = "Preparing";
17
+ AttackMissionState[AttackMissionState["Attacking"] = 1] = "Attacking";
18
+ AttackMissionState[AttackMissionState["Retreating"] = 2] = "Retreating";
19
+ })(AttackMissionState || (AttackMissionState = {}));
12
20
  const NO_TARGET_RETARGET_TICKS = 450;
13
21
  const NO_TARGET_IDLE_TIMEOUT_TICKS = 900;
22
+ function calculateTargetComposition(gameApi, playerData, matchAwareness) {
23
+ if (!playerData.country) {
24
+ throw new Error(`player ${playerData.name} has no country`);
25
+ }
26
+ else if (playerData.country.side === SideType.Nod) {
27
+ return getSovietComposition(gameApi, playerData, matchAwareness);
28
+ }
29
+ else {
30
+ return getAlliedCompositions(gameApi, playerData, matchAwareness);
31
+ }
32
+ }
33
+ const ATTACK_MISSION_PRIORITY_RAMP = 1.01;
34
+ const ATTACK_MISSION_MAX_PRIORITY = 50;
14
35
  /**
15
36
  * A mission that tries to attack a certain area.
16
37
  */
17
38
  export class AttackMission extends Mission {
18
- constructor(uniqueName, priority, rallyArea, attackArea, radius, logger) {
19
- super(uniqueName, priority, logger);
20
- this.rallyArea = rallyArea;
39
+ constructor(uniqueName, priority, rallyArea, attackArea, radius, composition, logger) {
40
+ super(uniqueName, logger);
41
+ this.priority = priority;
21
42
  this.attackArea = attackArea;
22
43
  this.radius = radius;
44
+ this.composition = composition;
23
45
  this.lastTargetSeenAt = 0;
24
46
  this.hasPickedNewTarget = false;
47
+ this.state = AttackMissionState.Preparing;
48
+ this.squad = new CombatSquad(rallyArea, attackArea, radius);
49
+ }
50
+ _onAiUpdate(gameApi, actionsApi, playerData, matchAwareness, actionBatcher) {
51
+ switch (this.state) {
52
+ case AttackMissionState.Preparing:
53
+ return this.handlePreparingState(gameApi, actionsApi, playerData, matchAwareness, actionBatcher);
54
+ case AttackMissionState.Attacking:
55
+ return this.handleAttackingState(gameApi, actionsApi, playerData, matchAwareness, actionBatcher);
56
+ case AttackMissionState.Retreating:
57
+ return this.handleRetreatingState(gameApi, actionsApi, playerData, matchAwareness, actionBatcher);
58
+ }
25
59
  }
26
- onAiUpdate(gameApi, playerData, matchAwareness) {
27
- if (this.getSquad() === null) {
28
- this.behaviour = new CombatSquad(this.rallyArea, this.attackArea, this.radius);
29
- return this.setSquad(new Squad(this.getUniqueName(), this.behaviour, this));
60
+ handlePreparingState(gameApi, actionsApi, playerData, matchAwareness, actionBatcher) {
61
+ const currentComposition = countBy(this.getUnits(gameApi), (unit) => unit.name);
62
+ const missingUnits = Object.entries(this.composition).filter(([unitType, targetAmount]) => {
63
+ return !currentComposition[unitType] || currentComposition[unitType] < targetAmount;
64
+ });
65
+ if (missingUnits.length > 0) {
66
+ this.priority = Math.min(this.priority * ATTACK_MISSION_PRIORITY_RAMP, ATTACK_MISSION_MAX_PRIORITY);
67
+ return requestUnits(missingUnits.map(([unitName]) => unitName), this.priority);
30
68
  }
31
69
  else {
32
- // Dispatch missions.
33
- if (!matchAwareness.shouldAttack()) {
34
- return disbandMission(AttackFailReason.DefenceTooStrong);
35
- }
36
- const foundTargets = matchAwareness.getHostilesNearPoint2d(this.attackArea, this.radius);
37
- if (foundTargets.length > 0) {
38
- this.lastTargetSeenAt = gameApi.getCurrentTick();
39
- this.hasPickedNewTarget = false;
40
- }
41
- else if (gameApi.getCurrentTick() > this.lastTargetSeenAt + NO_TARGET_IDLE_TIMEOUT_TICKS) {
42
- return disbandMission(AttackFailReason.NoTargets);
43
- }
44
- else if (!this.hasPickedNewTarget &&
45
- gameApi.getCurrentTick() > this.lastTargetSeenAt + NO_TARGET_RETARGET_TICKS) {
46
- const newTarget = generateTarget(gameApi, playerData, matchAwareness);
47
- if (newTarget) {
48
- this.behaviour?.setAttackArea(newTarget);
49
- this.hasPickedNewTarget = true;
50
- }
70
+ this.priority = ATTACK_MISSION_INITIAL_PRIORITY;
71
+ this.state = AttackMissionState.Attacking;
72
+ return noop();
73
+ }
74
+ }
75
+ handleAttackingState(gameApi, actionsApi, playerData, matchAwareness, actionBatcher) {
76
+ if (this.getUnitIds().length === 0) {
77
+ // TODO: disband directly (we no longer retreat when losing)
78
+ this.state = AttackMissionState.Retreating;
79
+ return noop();
80
+ }
81
+ const foundTargets = matchAwareness
82
+ .getHostilesNearPoint2d(this.attackArea, this.radius)
83
+ .map((unit) => gameApi.getUnitData(unit.unitId))
84
+ .filter((unit) => !isOwnedByNeutral(unit));
85
+ const update = this.squad.onAiUpdate(gameApi, actionsApi, actionBatcher, playerData, this, matchAwareness, this.logger);
86
+ if (update.type !== "noop") {
87
+ return update;
88
+ }
89
+ if (foundTargets.length > 0) {
90
+ this.lastTargetSeenAt = gameApi.getCurrentTick();
91
+ this.hasPickedNewTarget = false;
92
+ }
93
+ else if (gameApi.getCurrentTick() > this.lastTargetSeenAt + NO_TARGET_IDLE_TIMEOUT_TICKS) {
94
+ return disbandMission(AttackFailReason.NoTargets);
95
+ }
96
+ else if (!this.hasPickedNewTarget &&
97
+ gameApi.getCurrentTick() > this.lastTargetSeenAt + NO_TARGET_RETARGET_TICKS) {
98
+ const newTarget = generateTarget(gameApi, playerData, matchAwareness);
99
+ if (newTarget) {
100
+ this.squad.setAttackArea(newTarget);
101
+ this.hasPickedNewTarget = true;
51
102
  }
52
103
  }
53
104
  return noop();
54
105
  }
106
+ handleRetreatingState(gameApi, actionsApi, playerData, matchAwareness, actionBatcher) {
107
+ this.getUnits(gameApi).forEach((unitId) => {
108
+ actionBatcher.push(manageMoveMicro(unitId, matchAwareness.getMainRallyPoint()));
109
+ });
110
+ return disbandMission();
111
+ }
112
+ getGlobalDebugText() {
113
+ return this.squad.getGlobalDebugText() ?? "<none>";
114
+ }
115
+ getState() {
116
+ return this.state;
117
+ }
118
+ // This mission can give up its units while preparing.
119
+ isUnitsLocked() {
120
+ return this.state !== AttackMissionState.Preparing;
121
+ }
122
+ getPriority() {
123
+ return this.priority;
124
+ }
55
125
  }
56
126
  // Calculates the weight for initiating an attack on the position of a unit or building.
57
127
  // This is separate from unit micro; the squad will be ordered to attack in the vicinity of the point.
@@ -71,7 +141,7 @@ function generateTarget(gameApi, playerData, matchAwareness, includeBaseLocation
71
141
  try {
72
142
  const tryFocusHarvester = gameApi.generateRandomInt(0, 1) === 0;
73
143
  const enemyUnits = gameApi
74
- .getVisibleUnits(playerData.name, "hostile")
144
+ .getVisibleUnits(playerData.name, "enemy")
75
145
  .map((unitId) => gameApi.getUnitData(unitId))
76
146
  .filter((u) => !!u && gameApi.getPlayerData(u.owner).isCombatant);
77
147
  const maxUnit = maxBy(enemyUnits, (u) => getTargetWeight(u, tryFocusHarvester));
@@ -107,6 +177,7 @@ function generateTarget(gameApi, playerData, matchAwareness, includeBaseLocation
107
177
  const VISIBLE_TARGET_ATTACK_COOLDOWN_TICKS = 120;
108
178
  // Number of ticks between attacking "bases" (enemy starting locations).
109
179
  const BASE_ATTACK_COOLDOWN_TICKS = 1800;
180
+ const ATTACK_MISSION_INITIAL_PRIORITY = 1;
110
181
  export class AttackMissionFactory {
111
182
  constructor(lastAttackAt = -VISIBLE_TARGET_ATTACK_COOLDOWN_TICKS) {
112
183
  this.lastAttackAt = lastAttackAt;
@@ -115,22 +186,25 @@ export class AttackMissionFactory {
115
186
  return "AttackMissionFactory";
116
187
  }
117
188
  maybeCreateMissions(gameApi, playerData, matchAwareness, missionController, logger) {
118
- if (!matchAwareness.shouldAttack()) {
189
+ if (gameApi.getCurrentTick() < this.lastAttackAt + VISIBLE_TARGET_ATTACK_COOLDOWN_TICKS) {
119
190
  return;
120
191
  }
121
- if (gameApi.getCurrentTick() < this.lastAttackAt + VISIBLE_TARGET_ATTACK_COOLDOWN_TICKS) {
192
+ // can only have one attack 'preparing' at once.
193
+ if (missionController
194
+ .getMissions()
195
+ .some((mission) => mission instanceof AttackMission && mission.getState() === AttackMissionState.Preparing)) {
122
196
  return;
123
197
  }
124
- const attackRadius = 15;
198
+ const attackRadius = 10;
125
199
  const includeEnemyBases = gameApi.getCurrentTick() > this.lastAttackAt + BASE_ATTACK_COOLDOWN_TICKS;
126
200
  const attackArea = generateTarget(gameApi, playerData, matchAwareness, includeEnemyBases);
127
201
  if (!attackArea) {
128
202
  return;
129
203
  }
130
- // TODO: not using a fixed value here. But performance slows to a crawl when this is unique.
131
- const squadName = "globalAttack";
132
- const tryAttack = missionController.addMission(new AttackMission(squadName, 100, matchAwareness.getMainRallyPoint(), attackArea, attackRadius, logger).then((reason, squad) => {
133
- missionController.addMission(new RetreatMission("retreat-from-" + squadName + gameApi.getCurrentTick(), 100, matchAwareness.getMainRallyPoint(), squad?.getUnitIds() ?? [], logger));
204
+ const squadName = "attack_" + gameApi.getCurrentTick();
205
+ const composition = calculateTargetComposition(gameApi, playerData, matchAwareness);
206
+ const tryAttack = missionController.addMission(new AttackMission(squadName, ATTACK_MISSION_INITIAL_PRIORITY, matchAwareness.getMainRallyPoint(), attackArea, attackRadius, composition, logger).then((unitIds, reason) => {
207
+ missionController.addMission(new RetreatMission("retreat-from-" + squadName + gameApi.getCurrentTick(), matchAwareness.getMainRallyPoint(), unitIds, logger));
134
208
  }));
135
209
  if (tryAttack) {
136
210
  this.lastAttackAt = gameApi.getCurrentTick();
@@ -1 +1 @@
1
- {"version":3,"file":"attackMission.js","sourceRoot":"","sources":["../../../../../src/bot/logic/mission/missions/attackMission.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"attackMission.js","sourceRoot":"","sources":["../../../../../src/bot/logic/mission/missions/attackMission.ts"],"names":[],"mappings":"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"}