@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,33 +0,0 @@
1
- import { GameApi, PlayerData } from "@chronodivide/game-api";
2
- import { GlobalThreat } from "../../threat/threat.js";
3
- import { Mission, MissionAction, disbandMission, noop } from "../mission.js";
4
- import { ExpansionSquad } from "../../squad/behaviours/expansionSquad.js";
5
- import { Squad } from "../../squad/squad.js";
6
- import { MissionFactory } from "../missionFactories.js";
7
- import { SquadBehaviour } from "../../squad/squadBehaviour.js";
8
- import { MatchAwareness } from "../../awareness.js";
9
- import { DebugLogger } from "../../common/utils.js";
10
-
11
- /**
12
- * A mission that gets dispatched once, and once the squad decides to disband, the mission is disbanded.
13
- */
14
- export abstract class OneTimeMission<T = undefined> extends Mission<T> {
15
- private hadSquad = false;
16
-
17
- constructor(uniqueName: string, priority: number, private behaviourFactory: () => SquadBehaviour, logger: DebugLogger) {
18
- super(uniqueName, priority, logger);
19
- }
20
-
21
- onAiUpdate(gameApi: GameApi, playerData: PlayerData, matchAwareness: MatchAwareness): MissionAction {
22
- if (this.getSquad() === null) {
23
- if (!this.hadSquad) {
24
- this.hadSquad = true;
25
- return this.setSquad(new Squad(this.getUniqueName(), this.behaviourFactory(), this));
26
- } else {
27
- return disbandMission();
28
- }
29
- } else {
30
- return noop();
31
- }
32
- }
33
- }
@@ -1,58 +0,0 @@
1
- import { ActionsApi, GameApi, OrderType, PlayerData, SideType } from "@chronodivide/game-api";
2
- import { Squad } from "../squad.js";
3
- import { SquadAction, SquadBehaviour, disband, noop, requestSpecificUnits, requestUnits } from "../squadBehaviour.js";
4
- import { MatchAwareness } from "../../awareness.js";
5
- import { ActionBatcher } from "./actionBatcher.js";
6
-
7
- const CAPTURE_COOLDOWN_TICKS = 30;
8
-
9
- // Capture squad
10
- export class EngineerSquad implements SquadBehaviour {
11
- private hasAttemptedCaptureWith: {
12
- unitId: number;
13
- gameTick: number;
14
- } | null = null;
15
-
16
- /**
17
- * @param captureTarget ID of the target to try and capture/send engineer into.
18
- */
19
- constructor(private captureTarget: number) {}
20
-
21
- public onAiUpdate(
22
- gameApi: GameApi,
23
- actionsApi: ActionsApi,
24
- actionBatcher: ActionBatcher,
25
- playerData: PlayerData,
26
- squad: Squad,
27
- matchAwareness: MatchAwareness,
28
- ): SquadAction {
29
- const engineerTypes = ["ENGINEER", "SENGINEER"];
30
- const engineers = squad.getUnitsOfTypes(gameApi, ...engineerTypes);
31
- if (engineers.length === 0) {
32
- // Perhaps we deployed already (or the unit was destroyed), end the mission.
33
- if (this.hasAttemptedCaptureWith !== null) {
34
- return disband();
35
- }
36
- return requestUnits(engineerTypes, 100);
37
- } else if (
38
- !this.hasAttemptedCaptureWith ||
39
- gameApi.getCurrentTick() > this.hasAttemptedCaptureWith.gameTick + CAPTURE_COOLDOWN_TICKS
40
- ) {
41
- actionsApi.orderUnits(
42
- engineers.map((engineer) => engineer.id),
43
- OrderType.Capture,
44
- this.captureTarget,
45
- );
46
- // Add a cooldown to deploy attempts.
47
- this.hasAttemptedCaptureWith = {
48
- unitId: engineers[0].id,
49
- gameTick: gameApi.getCurrentTick(),
50
- };
51
- }
52
- return noop();
53
- }
54
-
55
- public getGlobalDebugText(): string | undefined {
56
- return undefined;
57
- }
58
- }
@@ -1,64 +0,0 @@
1
- import { ActionsApi, GameApi, OrderType, PlayerData, SideType } from "@chronodivide/game-api";
2
- import { GlobalThreat } from "../../threat/threat.js";
3
- import { Squad } from "../squad.js";
4
- import { SquadAction, SquadBehaviour, disband, noop, requestSpecificUnits, requestUnits } from "../squadBehaviour.js";
5
- import { MatchAwareness } from "../../awareness.js";
6
- import { ActionBatcher } from "./actionBatcher.js";
7
-
8
- const DEPLOY_COOLDOWN_TICKS = 30;
9
-
10
- // Expansion or initial base.
11
- export class ExpansionSquad implements SquadBehaviour {
12
- private hasAttemptedDeployWith: {
13
- unitId: number;
14
- gameTick: number;
15
- } | null = null;
16
-
17
- /**
18
- * @param selectedMcv ID of the MCV to try to expand with. If that unit dies, the squad will disband. If no value is provided,
19
- * the mission requests an MCV.
20
- */
21
- constructor(private selectedMcv: number | null) {}
22
-
23
- public onAiUpdate(
24
- gameApi: GameApi,
25
- actionsApi: ActionsApi,
26
- actionBatcher: ActionBatcher,
27
- playerData: PlayerData,
28
- squad: Squad,
29
- matchAwareness: MatchAwareness,
30
- ): SquadAction {
31
- const mcvTypes = ["AMCV", "SMCV"];
32
- const mcvs = squad.getUnitsOfTypes(gameApi, ...mcvTypes);
33
- if (mcvs.length === 0) {
34
- // Perhaps we deployed already (or the unit was destroyed), end the mission.
35
- if (this.hasAttemptedDeployWith !== null) {
36
- return disband();
37
- }
38
- // We need an mcv!
39
- if (this.selectedMcv) {
40
- return requestSpecificUnits([this.selectedMcv], 100);
41
- } else {
42
- return requestUnits(mcvTypes, 100);
43
- }
44
- } else if (
45
- !this.hasAttemptedDeployWith ||
46
- gameApi.getCurrentTick() > this.hasAttemptedDeployWith.gameTick + DEPLOY_COOLDOWN_TICKS
47
- ) {
48
- actionsApi.orderUnits(
49
- mcvs.map((mcv) => mcv.id),
50
- OrderType.DeploySelected,
51
- );
52
- // Add a cooldown to deploy attempts.
53
- this.hasAttemptedDeployWith = {
54
- unitId: mcvs[0].id,
55
- gameTick: gameApi.getCurrentTick(),
56
- };
57
- }
58
- return noop();
59
- }
60
-
61
- public getGlobalDebugText(): string | undefined {
62
- return undefined;
63
- }
64
- }
@@ -1,50 +0,0 @@
1
- import { ActionsApi, GameApi, OrderType, PlayerData, Vector2 } from "@chronodivide/game-api";
2
- import { GlobalThreat } from "../../threat/threat.js";
3
- import { Squad } from "../squad.js";
4
- import { SquadAction, SquadBehaviour, disband, noop, requestSpecificUnits, requestUnits } from "../squadBehaviour.js";
5
- import { MatchAwareness } from "../../awareness.js";
6
- import { ActionBatcher } from "./actionBatcher.js";
7
-
8
- const SCOUT_MOVE_COOLDOWN_TICKS = 30;
9
-
10
- export class RetreatSquad implements SquadBehaviour {
11
- private createdAt: number | null = null;
12
-
13
- constructor(
14
- private unitIds: number[],
15
- private retreatToPoint: Vector2,
16
- ) {}
17
-
18
- public onAiUpdate(
19
- gameApi: GameApi,
20
- actionsApi: ActionsApi,
21
- actionBatcher: ActionBatcher,
22
- playerData: PlayerData,
23
- squad: Squad,
24
- matchAwareness: MatchAwareness,
25
- ): SquadAction {
26
- if (!this.createdAt) {
27
- this.createdAt = gameApi.getCurrentTick();
28
- }
29
- if (squad.getUnitIds().length > 0) {
30
- // Only send the order once we have managed to claim some units.
31
- actionsApi.orderUnits(
32
- squad.getUnitIds(),
33
- OrderType.AttackMove,
34
- this.retreatToPoint.x,
35
- this.retreatToPoint.y,
36
- );
37
- return disband();
38
- }
39
- if (this.createdAt && gameApi.getCurrentTick() > this.createdAt + 240) {
40
- // Disband automatically after 240 ticks in case we couldn't actually claim any units.
41
- return disband();
42
- } else {
43
- return requestSpecificUnits(this.unitIds, 1000);
44
- }
45
- }
46
-
47
- public getGlobalDebugText(): string | undefined {
48
- return undefined;
49
- }
50
- }
@@ -1,165 +0,0 @@
1
- import { ActionsApi, GameApi, PlayerData, TechnoRules, Tile, UnitData, Vector2 } from "@chronodivide/game-api";
2
- import { Mission } from "../mission/mission.js";
3
- import { SquadAction, SquadBehaviour, disband } from "./squadBehaviour.js";
4
- import { MatchAwareness } from "../awareness.js";
5
- import { getDistanceBetweenTileAndPoint } from "../map/map.js";
6
- import { DebugLogger } from "../common/utils.js";
7
- import { ActionBatcher } from "./behaviours/actionBatcher.js";
8
-
9
- export enum SquadLiveness {
10
- SquadDead,
11
- SquadActive,
12
- }
13
-
14
- export type SquadConstructionRequest = {
15
- squad: Squad;
16
- unitType: TechnoRules;
17
- priority: number;
18
- };
19
-
20
- const calculateCenterOfMass: (unitTiles: Tile[]) => {
21
- centerOfMass: Vector2;
22
- maxDistance: number;
23
- } | null = (unitTiles) => {
24
- if (unitTiles.length === 0) {
25
- return null;
26
- }
27
- // TODO: use median here
28
- const sums = unitTiles.reduce(
29
- ({ x, y }, tile) => {
30
- return {
31
- x: x + (tile?.rx || 0),
32
- y: y + (tile?.ry || 0),
33
- };
34
- },
35
- { x: 0, y: 0 },
36
- );
37
- const centerOfMass = new Vector2(Math.round(sums.x / unitTiles.length), Math.round(sums.y / unitTiles.length));
38
-
39
- // max distance of units to the center of mass
40
- const distances = unitTiles.map((tile) => getDistanceBetweenTileAndPoint(tile, centerOfMass));
41
- const maxDistance = Math.max(...distances);
42
- return { centerOfMass, maxDistance };
43
- };
44
-
45
- export class Squad {
46
- private unitIds: number[] = [];
47
- private liveness: SquadLiveness = SquadLiveness.SquadActive;
48
- private lastLivenessUpdateTick: number = 0;
49
- private centerOfMass: Vector2 | null = null;
50
- private maxDistanceToCenterOfMass: number | null = null;
51
-
52
- constructor(
53
- private name: string,
54
- private behaviour: SquadBehaviour,
55
- private mission: Mission<any> | null,
56
- private killable = false,
57
- ) {}
58
-
59
- public getName(): string {
60
- return this.name;
61
- }
62
-
63
- public getCenterOfMass() {
64
- return this.centerOfMass;
65
- }
66
-
67
- public getMaxDistanceToCenterOfMass() {
68
- return this.maxDistanceToCenterOfMass;
69
- }
70
-
71
- public onAiUpdate(
72
- gameApi: GameApi,
73
- actionsApi: ActionsApi,
74
- actionBatcher: ActionBatcher,
75
- playerData: PlayerData,
76
- matchAwareness: MatchAwareness,
77
- logger: DebugLogger,
78
- ): SquadAction {
79
- this.updateLiveness(gameApi);
80
- const movableUnitTiles = this.unitIds
81
- .map((unitId) => gameApi.getUnitData(unitId))
82
- .filter((unit) => unit?.canMove)
83
- .map((unit) => unit?.tile)
84
- .filter((tile) => !!tile) as Tile[];
85
- const tileMetrics = calculateCenterOfMass(movableUnitTiles);
86
- if (tileMetrics) {
87
- this.centerOfMass = tileMetrics.centerOfMass;
88
- this.maxDistanceToCenterOfMass = tileMetrics.maxDistance;
89
- } else {
90
- this.centerOfMass = null;
91
- this.maxDistanceToCenterOfMass = null;
92
- }
93
-
94
- if (this.mission && this.mission.isActive() == false) {
95
- // Orphaned squad, might get picked up later.
96
- this.mission.removeSquad();
97
- this.mission = null;
98
- return disband();
99
- } else if (!this.mission) {
100
- return disband();
101
- }
102
- return this.behaviour.onAiUpdate(gameApi, actionsApi, actionBatcher, playerData, this, matchAwareness, logger);
103
- }
104
- public getMission(): Mission | null {
105
- return this.mission;
106
- }
107
-
108
- public setMission(mission: Mission | null) {
109
- if (this.mission != undefined && this.mission != mission) {
110
- this.mission.removeSquad();
111
- }
112
- this.mission = mission;
113
- }
114
-
115
- public getUnitIds(): number[] {
116
- return this.unitIds;
117
- }
118
-
119
- public getUnits(gameApi: GameApi): UnitData[] {
120
- return this.unitIds
121
- .map((unitId) => gameApi.getUnitData(unitId))
122
- .filter((unit) => unit != null)
123
- .map((unit) => unit!);
124
- }
125
-
126
- public getUnitsOfTypes(gameApi: GameApi, ...names: string[]): UnitData[] {
127
- return this.unitIds
128
- .map((unitId) => gameApi.getUnitData(unitId))
129
- .filter((unit) => !!unit && names.includes(unit.name))
130
- .map((unit) => unit!);
131
- }
132
-
133
- public getUnitsMatching(gameApi: GameApi, filter: (r: UnitData) => boolean): UnitData[] {
134
- return this.unitIds
135
- .map((unitId) => gameApi.getUnitData(unitId))
136
- .filter((unit) => !!unit && filter(unit))
137
- .map((unit) => unit!);
138
- }
139
-
140
- public removeUnit(unitIdToRemove: number): void {
141
- this.unitIds = this.unitIds.filter((unitId) => unitId != unitIdToRemove);
142
- }
143
-
144
- public addUnit(unitIdToAdd: number): void {
145
- this.unitIds.push(unitIdToAdd);
146
- }
147
-
148
- private updateLiveness(gameApi: GameApi) {
149
- this.unitIds = this.unitIds.filter((unitId) => gameApi.getUnitData(unitId));
150
- this.lastLivenessUpdateTick = gameApi.getCurrentTick();
151
- if (this.killable && this.unitIds.length == 0) {
152
- if (this.liveness == SquadLiveness.SquadActive) {
153
- this.liveness = SquadLiveness.SquadDead;
154
- }
155
- }
156
- }
157
-
158
- public getLiveness() {
159
- return this.liveness;
160
- }
161
-
162
- public getGlobalDebugText(): string | undefined {
163
- return this.behaviour.getGlobalDebugText();
164
- }
165
- }
@@ -1,66 +0,0 @@
1
- import { ActionsApi, GameApi, PlayerData, Vector2 } from "@chronodivide/game-api";
2
- import { Squad } from "./squad.js";
3
- import { MatchAwareness } from "../awareness.js";
4
- import { DebugLogger } from "../common/utils.js";
5
- import { ActionBatcher } from "./behaviours/actionBatcher.js";
6
-
7
- export type SquadActionNoop = {
8
- type: "noop";
9
- };
10
- export type SquadActionDisband = {
11
- type: "disband";
12
- };
13
- export type SquadActionMergeInto = {
14
- type: "mergeInto";
15
- mergeInto: Squad;
16
- };
17
- export type SquadActionRequestUnits = {
18
- type: "request";
19
- unitNames: string[];
20
- priority: number;
21
- };
22
- export type SquadActionRequestSpecificUnits = {
23
- type: "requestSpecific";
24
- unitIds: number[];
25
- priority: number;
26
- };
27
- export type SquadActionGrabFreeCombatants = {
28
- type: "requestCombatants";
29
- point: Vector2;
30
- radius: number;
31
- };
32
-
33
- export const noop = () => ({ type: "noop" }) as SquadActionNoop;
34
-
35
- export const disband = () => ({ type: "disband" }) as SquadActionDisband;
36
-
37
- export const requestUnits = (unitNames: string[], priority: number) =>
38
- ({ type: "request", unitNames, priority }) as SquadActionRequestUnits;
39
-
40
- export const requestSpecificUnits = (unitIds: number[], priority: number) =>
41
- ({ type: "requestSpecific", unitIds, priority }) as SquadActionRequestSpecificUnits;
42
-
43
- export const grabCombatants = (point: Vector2, radius: number) =>
44
- ({ type: "requestCombatants", point, radius }) as SquadActionGrabFreeCombatants;
45
-
46
- export type SquadAction =
47
- | SquadActionNoop
48
- | SquadActionDisband
49
- | SquadActionMergeInto
50
- | SquadActionRequestUnits
51
- | SquadActionRequestSpecificUnits
52
- | SquadActionGrabFreeCombatants;
53
-
54
- export interface SquadBehaviour {
55
- onAiUpdate(
56
- gameApi: GameApi,
57
- actionsApi: ActionsApi,
58
- actionBatcher: ActionBatcher,
59
- playerData: PlayerData,
60
- squad: Squad,
61
- matchAwareness: MatchAwareness,
62
- logger: DebugLogger,
63
- ): SquadAction;
64
-
65
- getGlobalDebugText(): string | undefined;
66
- }
@@ -1,8 +0,0 @@
1
- import { ExpansionSquad } from "./behaviours/expansionSquad.js";
2
- import { SquadBehaviour } from "./squadBehaviour.js";
3
-
4
- /*
5
- export const ALL_SQUAD_BEHAVIOURS: SquadBehaviour[] = [
6
- //new SquadScouters(),
7
- new SquadExpansion(),
8
- ];*/