@supalosa/chronodivide-bot 0.3.1 → 0.5.1
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.
- package/.env.template +5 -0
- package/README.md +57 -39
- package/dist/bot/bot.js +27 -37
- package/dist/bot/bot.js.map +1 -1
- package/dist/bot/logic/awareness.js +13 -8
- package/dist/bot/logic/awareness.js.map +1 -1
- package/dist/bot/logic/awarenessImpl.js +132 -0
- package/dist/bot/logic/awarenessImpl.js.map +1 -0
- package/dist/bot/logic/building/ArtilleryUnit.js +2 -29
- package/dist/bot/logic/building/ArtilleryUnit.js.map +1 -0
- package/dist/bot/logic/building/antiAirStaticDefence.js +43 -0
- package/dist/bot/logic/building/antiAirStaticDefence.js.map +1 -0
- package/dist/bot/logic/building/antiGroundStaticDefence.js +8 -5
- package/dist/bot/logic/building/antiGroundStaticDefence.js.map +1 -1
- package/dist/bot/logic/building/basicAirUnit.js +2 -23
- package/dist/bot/logic/building/basicAirUnit.js.map +1 -1
- package/dist/bot/logic/building/basicBuilding.js +3 -2
- package/dist/bot/logic/building/basicBuilding.js.map +1 -1
- package/dist/bot/logic/building/basicGroundUnit.js +2 -43
- package/dist/bot/logic/building/basicGroundUnit.js.map +1 -1
- package/dist/bot/logic/building/building.js +55 -11
- package/dist/bot/logic/building/building.js.map +1 -0
- package/dist/bot/logic/building/buildingRules.js +62 -50
- package/dist/bot/logic/building/buildingRules.js.map +1 -1
- package/dist/bot/logic/building/common.js +19 -0
- package/dist/bot/logic/building/common.js.map +1 -0
- package/dist/bot/logic/building/harvester.js +2 -1
- package/dist/bot/logic/building/harvester.js.map +1 -1
- package/dist/bot/logic/building/queueController.js +73 -41
- package/dist/bot/logic/building/queueController.js.map +1 -1
- package/dist/bot/logic/common/utils.js +35 -0
- package/dist/bot/logic/common/utils.js.map +1 -1
- package/dist/bot/logic/composition/alliedCompositions.js +13 -0
- package/dist/bot/logic/composition/alliedCompositions.js.map +1 -0
- package/dist/bot/logic/composition/common.js +2 -0
- package/dist/bot/logic/composition/common.js.map +1 -0
- package/dist/bot/logic/composition/sovietCompositions.js +13 -0
- package/dist/bot/logic/composition/sovietCompositions.js.map +1 -0
- package/dist/bot/logic/mission/actionBatcher.js +92 -0
- package/dist/bot/logic/mission/actionBatcher.js.map +1 -0
- package/dist/bot/logic/mission/behaviours/combatSquad.js +124 -0
- package/dist/bot/logic/mission/behaviours/combatSquad.js.map +1 -0
- package/dist/bot/logic/mission/behaviours/common.js +58 -0
- package/dist/bot/logic/mission/behaviours/common.js.map +1 -0
- package/dist/bot/logic/mission/behaviours/engineerSquad.js +39 -0
- package/dist/bot/logic/mission/behaviours/engineerSquad.js.map +1 -0
- package/dist/bot/logic/mission/behaviours/expansionSquad.js +46 -0
- package/dist/bot/logic/mission/behaviours/expansionSquad.js.map +1 -0
- package/dist/bot/logic/mission/behaviours/retreatSquad.js +31 -0
- package/dist/bot/logic/mission/behaviours/retreatSquad.js.map +1 -0
- package/{src/bot/logic/squad/behaviours/scoutingSquad.ts → dist/bot/logic/mission/behaviours/scoutingSquad.js} +29 -47
- package/dist/bot/logic/mission/behaviours/scoutingSquad.js.map +1 -0
- package/dist/bot/logic/mission/mission.js +91 -19
- package/dist/bot/logic/mission/mission.js.map +1 -1
- package/dist/bot/logic/mission/missionController.js +262 -21
- package/dist/bot/logic/mission/missionController.js.map +1 -1
- package/dist/bot/logic/mission/missions/attackMission.js +159 -52
- package/dist/bot/logic/mission/missions/attackMission.js.map +1 -1
- package/dist/bot/logic/mission/missions/basicMission.js +13 -0
- package/dist/bot/logic/mission/missions/basicMission.js.map +1 -0
- package/dist/bot/logic/mission/missions/defenceMission.js +43 -28
- package/dist/bot/logic/mission/missions/defenceMission.js.map +1 -1
- package/dist/bot/logic/mission/missions/engineerMission.js +37 -7
- package/dist/bot/logic/mission/missions/engineerMission.js.map +1 -1
- package/dist/bot/logic/mission/missions/expansionMission.js +42 -6
- package/dist/bot/logic/mission/missions/expansionMission.js.map +1 -1
- package/dist/bot/logic/mission/missions/missionBehaviour.js +2 -0
- package/dist/bot/logic/mission/missions/missionBehaviour.js.map +1 -0
- package/dist/bot/logic/mission/missions/retreatMission.js +31 -5
- package/dist/bot/logic/mission/missions/retreatMission.js.map +1 -1
- package/dist/bot/logic/mission/missions/scoutingMission.js +103 -6
- package/dist/bot/logic/mission/missions/scoutingMission.js.map +1 -1
- package/dist/bot/logic/mission/missions/squads/combatSquad.js +116 -0
- package/dist/bot/logic/mission/missions/squads/combatSquad.js.map +1 -0
- package/dist/bot/logic/mission/missions/squads/common.js +58 -0
- package/dist/bot/logic/mission/missions/squads/common.js.map +1 -0
- package/dist/bot/logic/mission/missions/squads/squad.js +2 -0
- package/dist/bot/logic/mission/missions/squads/squad.js.map +1 -0
- package/dist/bot/logic/squad/behaviours/attackSquad.js +63 -56
- package/dist/bot/logic/squad/behaviours/combatSquad.js +19 -18
- package/dist/bot/logic/squad/behaviours/combatSquad.js.map +1 -1
- package/dist/bot/logic/squad/behaviours/common.js +2 -19
- package/dist/bot/logic/squad/behaviours/common.js.map +1 -1
- package/dist/bot/logic/squad/behaviours/defenceSquad.js +15 -2
- package/dist/bot/logic/squad/behaviours/retreatSquad.js.map +1 -1
- package/dist/bot/logic/squad/behaviours/scoutingSquad.js +17 -21
- package/dist/bot/logic/squad/behaviours/scoutingSquad.js.map +1 -1
- package/dist/bot/logic/squad/squad.js +8 -5
- package/dist/bot/logic/squad/squad.js.map +1 -1
- package/dist/bot/logic/squad/squadBehaviour.js.map +1 -1
- package/dist/bot/logic/squad/squadController.js +3 -2
- package/dist/bot/logic/squad/squadController.js.map +1 -1
- package/dist/bot/logic/threat/threatCalculator.js +5 -5
- package/dist/bot/logic/threat/threatCalculator.js.map +1 -1
- package/dist/exampleBot.js +53 -16
- package/dist/exampleBot.js.map +1 -1
- package/package.json +5 -4
- package/src/bot/bot.ts +38 -53
- package/src/bot/logic/awareness.ts +34 -22
- package/src/bot/logic/building/antiAirStaticDefence.ts +64 -0
- package/src/bot/logic/building/antiGroundStaticDefence.ts +7 -20
- package/src/bot/logic/building/artilleryUnit.ts +2 -28
- package/src/bot/logic/building/basicAirUnit.ts +2 -33
- package/src/bot/logic/building/basicBuilding.ts +8 -6
- package/src/bot/logic/building/basicGroundUnit.ts +2 -46
- package/src/bot/logic/building/buildingRules.ts +73 -57
- package/src/bot/logic/building/common.ts +23 -0
- package/src/bot/logic/building/harvester.ts +2 -1
- package/src/bot/logic/building/queueController.ts +105 -42
- package/src/bot/logic/common/utils.ts +47 -0
- package/src/bot/logic/composition/alliedCompositions.ts +22 -0
- package/src/bot/logic/composition/common.ts +3 -0
- package/src/bot/logic/composition/sovietCompositions.ts +21 -0
- package/src/bot/logic/mission/actionBatcher.ts +124 -0
- package/src/bot/logic/mission/mission.ts +186 -37
- package/src/bot/logic/mission/missionController.ts +340 -31
- package/src/bot/logic/mission/missionFactories.ts +3 -3
- package/src/bot/logic/mission/missions/attackMission.ts +234 -56
- package/src/bot/logic/mission/missions/defenceMission.ts +72 -45
- package/src/bot/logic/mission/missions/engineerMission.ts +67 -15
- package/src/bot/logic/mission/missions/expansionMission.ts +67 -14
- package/src/bot/logic/mission/missions/retreatMission.ts +50 -6
- package/src/bot/logic/mission/missions/scoutingMission.ts +138 -14
- package/src/bot/logic/mission/missions/squads/combatSquad.ts +160 -0
- package/src/bot/logic/{squad/behaviours → mission/missions/squads}/common.ts +14 -20
- package/src/bot/logic/mission/missions/squads/squad.ts +19 -0
- package/src/bot/logic/threat/threat.ts +15 -15
- package/src/bot/logic/threat/threatCalculator.ts +10 -10
- package/src/exampleBot.ts +59 -19
- package/.prettierrc +0 -5
- package/TODO.md +0 -18
- package/dist/bot/logic/building/artilleryUnit.js.map +0 -1
- package/dist/bot/logic/building/massedAntiGroundUnit.js +0 -20
- package/dist/bot/logic/building/queues.js +0 -19
- package/dist/bot/logic/knowledge.js +0 -1
- package/dist/bot/logic/mission/basicMission.js +0 -26
- package/dist/bot/logic/mission/expansionMission.js +0 -32
- package/dist/bot/logic/squad/behaviours/squadExpansion.js +0 -31
- package/dist/bot/logic/squad/behaviours/squadScouters.js +0 -8
- package/rules.ini +0 -23126
- package/src/bot/logic/mission/missions/oneTimeMission.ts +0 -33
- package/src/bot/logic/squad/behaviours/combatSquad.ts +0 -127
- package/src/bot/logic/squad/behaviours/engineerSquad.ts +0 -53
- package/src/bot/logic/squad/behaviours/expansionSquad.ts +0 -59
- package/src/bot/logic/squad/behaviours/retreatSquad.ts +0 -44
- package/src/bot/logic/squad/squad.ts +0 -159
- package/src/bot/logic/squad/squadBehaviour.ts +0 -62
- package/src/bot/logic/squad/squadBehaviours.ts +0 -8
- package/src/bot/logic/squad/squadController.ts +0 -254
|
@@ -0,0 +1,39 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -1,61 +1,41 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { Squad } from "../squad.js";
|
|
3
|
-
import { SquadAction, SquadBehaviour, disband, noop, requestUnits } from "../squadBehaviour.js";
|
|
4
|
-
import { MatchAwareness } from "../../awareness.js";
|
|
5
|
-
import { DebugLogger } from "../../common/utils.js";
|
|
1
|
+
import { OrderType } from "@chronodivide/game-api";
|
|
6
2
|
import { getDistanceBetweenTileAndPoint } from "../../map/map.js";
|
|
7
|
-
import {
|
|
8
|
-
|
|
3
|
+
import { disbandMission, noop, requestUnits } from "../mission.js";
|
|
9
4
|
const SCOUT_MOVE_COOLDOWN_TICKS = 30;
|
|
10
|
-
|
|
11
5
|
// Max units to spend on a particular scout target.
|
|
12
6
|
const MAX_ATTEMPTS_PER_TARGET = 5;
|
|
13
|
-
|
|
14
7
|
// Maximum ticks to spend trying to scout a target *without making progress towards it*.
|
|
15
8
|
// Every time a unit gets closer to the target, the timer refreshes.
|
|
16
9
|
const MAX_TICKS_PER_TARGET = 600;
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
private hadUnit: boolean = false;
|
|
29
|
-
|
|
30
|
-
public onAiUpdate(
|
|
31
|
-
gameApi: GameApi,
|
|
32
|
-
actionsApi: ActionsApi,
|
|
33
|
-
playerData: PlayerData,
|
|
34
|
-
squad: Squad,
|
|
35
|
-
matchAwareness: MatchAwareness,
|
|
36
|
-
logger: DebugLogger,
|
|
37
|
-
): SquadAction {
|
|
10
|
+
export class ScoutingSquad {
|
|
11
|
+
constructor(priority) {
|
|
12
|
+
this.priority = priority;
|
|
13
|
+
this.scoutTarget = null;
|
|
14
|
+
this.attemptsOnCurrentTarget = 0;
|
|
15
|
+
this.scoutTargetRefreshedAt = 0;
|
|
16
|
+
this.lastMoveCommandTick = 0;
|
|
17
|
+
this.scoutTargetIsPermanent = false;
|
|
18
|
+
this.hadUnit = false;
|
|
19
|
+
}
|
|
20
|
+
onAiUpdate(gameApi, actionsApi, actionBatcher, playerData, mission, matchAwareness, logger) {
|
|
38
21
|
const scoutNames = ["ADOG", "DOG", "E1", "E2", "FV", "HTK"];
|
|
39
|
-
const scouts =
|
|
40
|
-
|
|
22
|
+
const scouts = mission.getUnitsOfTypes(gameApi, ...scoutNames);
|
|
41
23
|
if ((matchAwareness.getSectorCache().getOverallVisibility() || 0) > 0.9) {
|
|
42
|
-
return
|
|
24
|
+
return disbandMission();
|
|
43
25
|
}
|
|
44
|
-
|
|
45
26
|
if (scouts.length === 0) {
|
|
46
27
|
// Count the number of times the scout dies trying to uncover the current scoutTarget.
|
|
47
28
|
if (this.scoutTarget && this.hadUnit) {
|
|
48
29
|
this.attemptsOnCurrentTarget++;
|
|
49
30
|
this.hadUnit = false;
|
|
50
31
|
}
|
|
51
|
-
return requestUnits(scoutNames,
|
|
52
|
-
}
|
|
32
|
+
return requestUnits(scoutNames, this.priority);
|
|
33
|
+
}
|
|
34
|
+
else if (this.scoutTarget) {
|
|
53
35
|
this.hadUnit = true;
|
|
54
36
|
if (!this.scoutTargetIsPermanent) {
|
|
55
37
|
if (this.attemptsOnCurrentTarget > MAX_ATTEMPTS_PER_TARGET) {
|
|
56
|
-
logger(
|
|
57
|
-
`Scout target ${this.scoutTarget.x},${this.scoutTarget.y} took too many attempts, moving to next`,
|
|
58
|
-
);
|
|
38
|
+
logger(`Scout target ${this.scoutTarget.x},${this.scoutTarget.y} took too many attempts, moving to next`);
|
|
59
39
|
this.setScoutTarget(null, 0);
|
|
60
40
|
return noop();
|
|
61
41
|
}
|
|
@@ -77,12 +57,10 @@ export class ScoutingSquad implements SquadBehaviour {
|
|
|
77
57
|
}
|
|
78
58
|
});
|
|
79
59
|
// Check that a scout is actually moving closer to the target.
|
|
80
|
-
const distances = scouts.map((unit) => getDistanceBetweenTileAndPoint(unit.tile, this.scoutTarget
|
|
60
|
+
const distances = scouts.map((unit) => getDistanceBetweenTileAndPoint(unit.tile, this.scoutTarget));
|
|
81
61
|
const newMinDistance = Math.min(...distances);
|
|
82
62
|
if (!this.scoutMinDistance || newMinDistance < this.scoutMinDistance) {
|
|
83
|
-
logger(
|
|
84
|
-
`Scout timeout refreshed because unit moved closer to point (${newMinDistance} < ${this.scoutMinDistance})`,
|
|
85
|
-
);
|
|
63
|
+
logger(`Scout timeout refreshed because unit moved closer to point (${newMinDistance} < ${this.scoutMinDistance})`);
|
|
86
64
|
this.scoutTargetRefreshedAt = gameApi.getCurrentTick();
|
|
87
65
|
this.scoutMinDistance = newMinDistance;
|
|
88
66
|
}
|
|
@@ -91,22 +69,26 @@ export class ScoutingSquad implements SquadBehaviour {
|
|
|
91
69
|
logger(`Scout target ${this.scoutTarget.x},${this.scoutTarget.y} successfully scouted, moving to next`);
|
|
92
70
|
this.setScoutTarget(null, gameApi.getCurrentTick());
|
|
93
71
|
}
|
|
94
|
-
}
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
95
74
|
const nextScoutTarget = matchAwareness.getScoutingManager().getNewScoutTarget();
|
|
96
75
|
if (!nextScoutTarget) {
|
|
97
76
|
logger(`No more scouting targets available, disbanding.`);
|
|
98
|
-
return
|
|
77
|
+
return disbandMission();
|
|
99
78
|
}
|
|
100
79
|
this.setScoutTarget(nextScoutTarget, gameApi.getCurrentTick());
|
|
101
80
|
}
|
|
102
81
|
return noop();
|
|
103
82
|
}
|
|
104
|
-
|
|
105
|
-
setScoutTarget(target: PrioritisedScoutTarget | null, currentTick: number) {
|
|
83
|
+
setScoutTarget(target, currentTick) {
|
|
106
84
|
this.attemptsOnCurrentTarget = 0;
|
|
107
85
|
this.scoutTargetRefreshedAt = currentTick;
|
|
108
86
|
this.scoutTarget = target?.asVector2() ?? null;
|
|
109
87
|
this.scoutMinDistance = undefined;
|
|
110
88
|
this.scoutTargetIsPermanent = target?.isPermanent ?? false;
|
|
111
89
|
}
|
|
90
|
+
getGlobalDebugText() {
|
|
91
|
+
return undefined;
|
|
92
|
+
}
|
|
112
93
|
}
|
|
94
|
+
//# sourceMappingURL=scoutingSquad.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scoutingSquad.js","sourceRoot":"","sources":["../../../../../src/bot/logic/mission/behaviours/scoutingSquad.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,35 +1,96 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
import { Vector2 } from "@chronodivide/game-api";
|
|
2
|
+
import { getDistanceBetweenTileAndPoint } from "../map/map.js";
|
|
3
|
+
const calculateCenterOfMass = (unitTiles) => {
|
|
4
|
+
if (unitTiles.length === 0) {
|
|
5
|
+
return null;
|
|
6
|
+
}
|
|
7
|
+
// TODO: use median here
|
|
8
|
+
const sums = unitTiles.reduce(({ x, y }, tile) => {
|
|
9
|
+
return {
|
|
10
|
+
x: x + (tile?.rx || 0),
|
|
11
|
+
y: y + (tile?.ry || 0),
|
|
12
|
+
};
|
|
13
|
+
}, { x: 0, y: 0 });
|
|
14
|
+
const centerOfMass = new Vector2(Math.round(sums.x / unitTiles.length), Math.round(sums.y / unitTiles.length));
|
|
15
|
+
// max distance of units to the center of mass
|
|
16
|
+
const distances = unitTiles.map((tile) => getDistanceBetweenTileAndPoint(tile, centerOfMass));
|
|
17
|
+
const maxDistance = Math.max(...distances);
|
|
18
|
+
return { centerOfMass, maxDistance };
|
|
19
|
+
};
|
|
20
|
+
// AI starts Missions based on heuristics.
|
|
3
21
|
export class Mission {
|
|
4
|
-
constructor(uniqueName,
|
|
22
|
+
constructor(uniqueName, logger) {
|
|
5
23
|
this.uniqueName = uniqueName;
|
|
6
|
-
this.priority = priority;
|
|
7
24
|
this.logger = logger;
|
|
8
|
-
this.squad = null;
|
|
9
25
|
this.active = true;
|
|
26
|
+
this.unitIds = [];
|
|
27
|
+
this.centerOfMass = null;
|
|
28
|
+
this.maxDistanceToCenterOfMass = null;
|
|
10
29
|
this.onFinish = () => { };
|
|
11
30
|
}
|
|
31
|
+
// TODO call this
|
|
32
|
+
updateCenterOfMass(gameApi) {
|
|
33
|
+
const movableUnitTiles = this.unitIds
|
|
34
|
+
.map((unitId) => gameApi.getUnitData(unitId))
|
|
35
|
+
.filter((unit) => unit?.canMove)
|
|
36
|
+
.map((unit) => unit?.tile)
|
|
37
|
+
.filter((tile) => !!tile);
|
|
38
|
+
const tileMetrics = calculateCenterOfMass(movableUnitTiles);
|
|
39
|
+
if (tileMetrics) {
|
|
40
|
+
this.centerOfMass = tileMetrics.centerOfMass;
|
|
41
|
+
this.maxDistanceToCenterOfMass = tileMetrics.maxDistance;
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
this.centerOfMass = null;
|
|
45
|
+
this.maxDistanceToCenterOfMass = null;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
onAiUpdate(gameApi, actionsApi, playerData, matchAwareness, actionBatcher) {
|
|
49
|
+
this.updateCenterOfMass(gameApi);
|
|
50
|
+
return this._onAiUpdate(gameApi, actionsApi, playerData, matchAwareness, actionBatcher);
|
|
51
|
+
}
|
|
12
52
|
isActive() {
|
|
13
53
|
return this.active;
|
|
14
54
|
}
|
|
15
|
-
|
|
16
|
-
this.
|
|
17
|
-
|
|
55
|
+
getUnitIds() {
|
|
56
|
+
return this.unitIds;
|
|
57
|
+
}
|
|
58
|
+
removeUnit(unitIdToRemove) {
|
|
59
|
+
this.unitIds = this.unitIds.filter((unitId) => unitId != unitIdToRemove);
|
|
60
|
+
}
|
|
61
|
+
addUnit(unitIdToAdd) {
|
|
62
|
+
this.unitIds.push(unitIdToAdd);
|
|
63
|
+
}
|
|
64
|
+
getUnits(gameApi) {
|
|
65
|
+
return this.unitIds
|
|
66
|
+
.map((unitId) => gameApi.getUnitData(unitId))
|
|
67
|
+
.filter((unit) => unit != null)
|
|
68
|
+
.map((unit) => unit);
|
|
18
69
|
}
|
|
19
|
-
|
|
20
|
-
return this.
|
|
70
|
+
getUnitsOfTypes(gameApi, ...names) {
|
|
71
|
+
return this.unitIds
|
|
72
|
+
.map((unitId) => gameApi.getUnitData(unitId))
|
|
73
|
+
.filter((unit) => !!unit && names.includes(unit.name))
|
|
74
|
+
.map((unit) => unit);
|
|
21
75
|
}
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
76
|
+
getUnitsMatching(gameApi, filter) {
|
|
77
|
+
return this.unitIds
|
|
78
|
+
.map((unitId) => gameApi.getUnitData(unitId))
|
|
79
|
+
.filter((unit) => !!unit && filter(unit))
|
|
80
|
+
.map((unit) => unit);
|
|
81
|
+
}
|
|
82
|
+
getCenterOfMass() {
|
|
83
|
+
return this.centerOfMass;
|
|
84
|
+
}
|
|
85
|
+
getMaxDistanceToCenterOfMass() {
|
|
86
|
+
return this.maxDistanceToCenterOfMass;
|
|
25
87
|
}
|
|
26
88
|
getUniqueName() {
|
|
27
89
|
return this.uniqueName;
|
|
28
90
|
}
|
|
29
91
|
// Don't call this from the mission itself
|
|
30
92
|
endMission(reason) {
|
|
31
|
-
this.onFinish(
|
|
32
|
-
this.squad = null;
|
|
93
|
+
this.onFinish(this.unitIds, reason);
|
|
33
94
|
this.active = false;
|
|
34
95
|
}
|
|
35
96
|
/**
|
|
@@ -39,13 +100,24 @@ export class Mission {
|
|
|
39
100
|
this.onFinish = onFinish;
|
|
40
101
|
return this;
|
|
41
102
|
}
|
|
103
|
+
/**
|
|
104
|
+
* Determines whether units can be stolen from this mission by other missions with higher priority.
|
|
105
|
+
*/
|
|
106
|
+
isUnitsLocked() {
|
|
107
|
+
return true;
|
|
108
|
+
}
|
|
42
109
|
}
|
|
43
110
|
export const noop = () => ({
|
|
44
111
|
type: "noop",
|
|
45
112
|
});
|
|
46
|
-
export const registerSquad = (squad) => ({
|
|
47
|
-
type: "registerSquad",
|
|
48
|
-
squad,
|
|
49
|
-
});
|
|
50
113
|
export const disbandMission = (reason) => ({ type: "disband", reason });
|
|
114
|
+
export const isDisbandMission = (a) => a.action.type === "disband";
|
|
115
|
+
export const requestUnits = (unitNames, priority) => ({ type: "request", unitNames, priority });
|
|
116
|
+
export const isRequestUnits = (a) => a.action.type === "request";
|
|
117
|
+
export const requestSpecificUnits = (unitIds, priority) => ({ type: "requestSpecific", unitIds, priority });
|
|
118
|
+
export const isRequestSpecificUnits = (a) => a.action.type === "requestSpecific";
|
|
119
|
+
export const grabCombatants = (point, radius) => ({ type: "requestCombatants", point, radius });
|
|
120
|
+
export const isGrabCombatants = (a) => a.action.type === "requestCombatants";
|
|
121
|
+
export const releaseUnits = (unitIds) => ({ type: "releaseUnits", unitIds });
|
|
122
|
+
export const isReleaseUnits = (a) => a.action.type === "releaseUnits";
|
|
51
123
|
//# sourceMappingURL=mission.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mission.js","sourceRoot":"","sources":["../../../../src/bot/logic/mission/mission.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"mission.js","sourceRoot":"","sources":["../../../../src/bot/logic/mission/mission.ts"],"names":[],"mappings":"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"}
|