@supalosa/chronodivide-bot 0.5.2 → 0.5.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.
- package/README.md +6 -0
- package/dist/bot/bot.js +2 -2
- package/dist/bot/bot.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/antiGroundStaticDefence.js +6 -2
- package/dist/bot/logic/building/antiGroundStaticDefence.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 +15 -14
- package/dist/bot/logic/building/buildingRules.js.map +1 -1
- package/dist/bot/logic/building/common.js +13 -12
- package/dist/bot/logic/building/common.js.map +1 -1
- package/dist/bot/logic/common/utils.js +12 -2
- package/dist/bot/logic/common/utils.js.map +1 -1
- package/dist/bot/logic/mission/behaviours/combatSquad.js +1 -1
- package/dist/bot/logic/mission/behaviours/combatSquad.js.map +1 -1
- package/dist/bot/logic/mission/behaviours/common.js +5 -3
- package/dist/bot/logic/mission/behaviours/common.js.map +1 -1
- package/dist/bot/logic/squad/behaviours/attackSquad.js +63 -56
- package/dist/bot/logic/squad/behaviours/combatSquad.js +21 -25
- package/dist/bot/logic/squad/behaviours/combatSquad.js.map +1 -1
- package/dist/bot/logic/squad/behaviours/common.js +11 -26
- 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/engineerSquad.js +2 -4
- package/dist/bot/logic/squad/behaviours/engineerSquad.js.map +1 -1
- package/dist/bot/logic/squad/behaviours/expansionSquad.js +2 -4
- package/dist/bot/logic/squad/behaviours/expansionSquad.js.map +1 -1
- package/dist/bot/logic/squad/behaviours/retreatSquad.js +1 -4
- package/dist/bot/logic/squad/behaviours/retreatSquad.js.map +1 -1
- package/dist/bot/logic/squad/behaviours/scoutingSquad.js +18 -25
- package/dist/bot/logic/squad/behaviours/scoutingSquad.js.map +1 -1
- package/dist/bot/logic/squad/squad.js +10 -10
- 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 +5 -21
- package/dist/bot/logic/squad/squadController.js.map +1 -1
- package/dist/exampleBot.js +13 -24
- package/dist/exampleBot.js.map +1 -1
- package/package.json +3 -3
- package/src/bot/bot.ts +4 -4
- package/src/bot/logic/building/antiGroundStaticDefence.ts +5 -1
- package/src/bot/logic/building/buildingRules.ts +19 -16
- package/src/bot/logic/building/common.ts +13 -15
- package/src/bot/logic/common/utils.ts +12 -4
- package/src/bot/logic/threat/threat.ts +15 -15
- package/src/exampleBot.ts +10 -23
- 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/actionBatcher.js +0 -36
- package/dist/bot/logic/squad/behaviours/actionBatcher.js.map +0 -1
- package/dist/bot/logic/squad/behaviours/squadExpansion.js +0 -31
- package/dist/bot/logic/squad/behaviours/squadScouters.js +0 -8
- /package/dist/bot/logic/building/{artilleryUnit.js.map → ArtilleryUnit.js.map} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"squad.js","sourceRoot":"","sources":["../../../../src/bot/logic/squad/squad.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"squad.js","sourceRoot":"","sources":["../../../../src/bot/logic/squad/squad.ts"],"names":[],"mappings":"AAGA,OAAO,EAA+B,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAE3E,OAAO,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,CAAC,MAAM,QAAQ,CAAC;AAGvB,MAAM,CAAN,IAAY,aAGX;AAHD,WAAY,aAAa;IACrB,2DAAS,CAAA;IACT,+DAAW,CAAA;AACf,CAAC,EAHW,aAAa,KAAb,aAAa,QAGxB;AAQD,MAAM,qBAAqB,GAGhB,CAAC,SAAS,EAAE,EAAE;IACrB,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE;QACxB,OAAO,IAAI,CAAC;KACf;IACD,wBAAwB;IACxB,MAAM,IAAI,GAAG,SAAS,CAAC,MAAM,CACzB,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,EAAE;QACf,OAAO;YACH,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,IAAI,CAAC,CAAC;YACtB,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,IAAI,CAAC,CAAC;SACzB,CAAC;IACN,CAAC,EACD,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CACjB,CAAC;IACF,MAAM,YAAY,GAAG;QACjB,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,SAAS,CAAC,MAAM,CAAC;QACxC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,SAAS,CAAC,MAAM,CAAC;KAC3C,CAAC;IAEF,8CAA8C;IAC9C,MAAM,SAAS,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,wBAAwB,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE,EAAE,YAAY,CAAC,CAAC,CAAC;IAC9G,MAAM,WAAW,GAAG,CAAC,CAAC,GAAG,CAAC,SAAS,CAAE,CAAC;IACtC,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,CAAC;AACzC,CAAC,CAAC;AAEF,MAAM,OAAO,KAAK;IAOd,YACY,IAAY,EACZ,SAAyB,EACzB,OAA4B,EAC5B,WAAW,KAAK;QAHhB,SAAI,GAAJ,IAAI,CAAQ;QACZ,cAAS,GAAT,SAAS,CAAgB;QACzB,YAAO,GAAP,OAAO,CAAqB;QAC5B,aAAQ,GAAR,QAAQ,CAAQ;QAVpB,YAAO,GAAa,EAAE,CAAC;QACvB,aAAQ,GAAkB,aAAa,CAAC,WAAW,CAAC;QACpD,2BAAsB,GAAW,CAAC,CAAC;QACnC,iBAAY,GAAmB,IAAI,CAAC;QACpC,8BAAyB,GAAkB,IAAI,CAAC;IAOrD,CAAC;IAEG,OAAO;QACV,OAAO,IAAI,CAAC,IAAI,CAAC;IACrB,CAAC;IAEM,eAAe;QAClB,OAAO,IAAI,CAAC,YAAY,CAAC;IAC7B,CAAC;IAEM,4BAA4B;QAC/B,OAAO,IAAI,CAAC,yBAAyB,CAAC;IAC1C,CAAC;IAEM,UAAU,CACb,OAAgB,EAChB,UAAsB,EACtB,UAAsB,EACtB,cAA8B,EAC9B,MAAmB;QAEnB,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;QAC7B,MAAM,gBAAgB,GAAG,IAAI,CAAC,OAAO;aAChC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;aAC5C,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC;aAC/B,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC;aACzB,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAW,CAAC;QACxC,MAAM,WAAW,GAAG,qBAAqB,CAAC,gBAAgB,CAAC,CAAC;QAC5D,IAAI,WAAW,EAAE;YACb,IAAI,CAAC,YAAY,GAAG,WAAW,CAAC,YAAY,CAAC;YAC7C,IAAI,CAAC,yBAAyB,GAAG,WAAW,CAAC,WAAW,CAAC;SAC5D;aAAM;YACH,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;YACzB,IAAI,CAAC,yBAAyB,GAAG,IAAI,CAAC;SACzC;QAED,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,KAAK,EAAE;YAClD,6CAA6C;YAC7C,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;YAC3B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;YACpB,OAAO,OAAO,EAAE,CAAC;SACpB;aAAM,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;YACtB,OAAO,OAAO,EAAE,CAAC;SACpB;QACD,OAAO,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,CAAC,CAAC;IACpG,CAAC;IACM,UAAU;QACb,OAAO,IAAI,CAAC,OAAO,CAAC;IACxB,CAAC;IAEM,UAAU,CAAC,OAAuB;QACrC,IAAI,IAAI,CAAC,OAAO,IAAI,SAAS,IAAI,IAAI,CAAC,OAAO,IAAI,OAAO,EAAE;YACtD,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;SAC9B;QACD,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IAC3B,CAAC;IAEM,UAAU;QACb,OAAO,IAAI,CAAC,OAAO,CAAC;IACxB,CAAC;IAEM,QAAQ,CAAC,OAAgB;QAC5B,OAAO,IAAI,CAAC,OAAO;aACd,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;aAC5C,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,IAAI,CAAC;aAC9B,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAK,CAAC,CAAC;IAC9B,CAAC;IAEM,eAAe,CAAC,OAAgB,EAAE,GAAG,KAAe;QACvD,OAAO,IAAI,CAAC,OAAO;aACd,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;aAC5C,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;aACrD,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAK,CAAC,CAAC;IAC9B,CAAC;IAEM,gBAAgB,CAAC,OAAgB,EAAE,MAAgC;QACtE,OAAO,IAAI,CAAC,OAAO;aACd,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;aAC5C,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC;aACxC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAK,CAAC,CAAC;IAC9B,CAAC;IAEM,UAAU,CAAC,cAAsB;QACpC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,IAAI,cAAc,CAAC,CAAC;IAC7E,CAAC;IAEM,OAAO,CAAC,WAAmB;QAC9B,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACnC,CAAC;IAEO,cAAc,CAAC,OAAgB;QACnC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC;QAC5E,IAAI,CAAC,sBAAsB,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;QACvD,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,EAAE;YAC3C,IAAI,IAAI,CAAC,QAAQ,IAAI,aAAa,CAAC,WAAW,EAAE;gBAC5C,IAAI,CAAC,QAAQ,GAAG,aAAa,CAAC,SAAS,CAAC;aAC3C;SACJ;IACL,CAAC;IAEM,WAAW;QACd,OAAO,IAAI,CAAC,QAAQ,CAAC;IACzB,CAAC;CACJ"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"squadBehaviour.js","sourceRoot":"","sources":["../../../../src/bot/logic/squad/squadBehaviour.ts"],"names":[],"mappings":"AAgCA,MAAM,CAAC,MAAM,IAAI,GAAG,GAAG,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"squadBehaviour.js","sourceRoot":"","sources":["../../../../src/bot/logic/squad/squadBehaviour.ts"],"names":[],"mappings":"AAgCA,MAAM,CAAC,MAAM,IAAI,GAAG,GAAG,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAsB,CAAA,CAAC;AAEhE,MAAM,CAAC,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAyB,CAAA,CAAC;AAEzE,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,SAAmB,EAAE,QAAgB,EAAE,EAAE,CAClE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAA8B,CAAA,CAAC;AAE1E,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,OAAiB,EAAE,QAAgB,EAAE,EAAE,CACxE,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,QAAQ,EAAsC,CAAA,CAAC;AAExF,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,KAAc,EAAE,MAAc,EAAE,EAAE,CAC7D,CAAC,EAAE,IAAI,EAAE,mBAAmB,EAAE,KAAK,EAAE,MAAM,EAAoC,CAAA,CAAC"}
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
// Meta-controller for forming and controlling squads.
|
|
2
2
|
import { SquadLiveness } from "./squad.js";
|
|
3
3
|
import { getDistanceBetween } from "../map/map.js";
|
|
4
|
-
import
|
|
5
|
-
import { ActionBatcher } from "./behaviours/actionBatcher.js";
|
|
4
|
+
import _ from "lodash";
|
|
6
5
|
export class SquadController {
|
|
7
6
|
constructor(logger) {
|
|
8
7
|
this.logger = logger;
|
|
@@ -25,12 +24,10 @@ export class SquadController {
|
|
|
25
24
|
}
|
|
26
25
|
});
|
|
27
26
|
});
|
|
28
|
-
// Batch actions to reduce spamming of actions for larger armies.
|
|
29
|
-
const actionBatcher = new ActionBatcher();
|
|
30
27
|
const squadActions = this.squads.map((squad) => {
|
|
31
28
|
return {
|
|
32
29
|
squad,
|
|
33
|
-
action: squad.onAiUpdate(gameApi, actionsApi,
|
|
30
|
+
action: squad.onAiUpdate(gameApi, actionsApi, playerData, matchAwareness, this.logger),
|
|
34
31
|
};
|
|
35
32
|
});
|
|
36
33
|
// Handle disbands and merges.
|
|
@@ -44,7 +41,6 @@ export class SquadController {
|
|
|
44
41
|
a.squad.getMission()?.removeSquad();
|
|
45
42
|
a.squad.getUnitIds().forEach((unitId) => {
|
|
46
43
|
this.unitIdToSquad.delete(unitId);
|
|
47
|
-
actionsApi.setUnitDebugText(unitId, undefined);
|
|
48
44
|
});
|
|
49
45
|
disbandedSquads.add(a.squad.getName());
|
|
50
46
|
});
|
|
@@ -140,6 +136,7 @@ export class SquadController {
|
|
|
140
136
|
.map((unitId) => gameApi.getUnitData(unitId))
|
|
141
137
|
.filter((unit) => !!unit && !this.unitIdToSquad.has(unit.id || 0))
|
|
142
138
|
.map((unit) => unit);
|
|
139
|
+
// [squadName][unitName]['type' | 'grab']
|
|
143
140
|
const newAssignmentsByType = freeUnits
|
|
144
141
|
.flatMap((freeUnit) => {
|
|
145
142
|
if (unitTypeToHighestRequest.hasOwnProperty(freeUnit.name)) {
|
|
@@ -182,7 +179,6 @@ export class SquadController {
|
|
|
182
179
|
.map(([method, count]) => unitType + " x " + count + " (by " + method + ")"))
|
|
183
180
|
.join(", ")}`);
|
|
184
181
|
});
|
|
185
|
-
actionBatcher.resolve(actionsApi);
|
|
186
182
|
}
|
|
187
183
|
addUnitToSquad(squad, unit) {
|
|
188
184
|
squad.addUnit(unit.id);
|
|
@@ -191,24 +187,12 @@ export class SquadController {
|
|
|
191
187
|
registerSquad(squad) {
|
|
192
188
|
this.squads.push(squad);
|
|
193
189
|
}
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
const unitsInSquad = (unitIds) => countBy(unitIds, (unitId) => gameApi.getUnitData(unitId)?.name);
|
|
197
|
-
let globalDebugText = "";
|
|
190
|
+
debugSquads(gameApi) {
|
|
191
|
+
const unitsInSquad = (unitIds) => _.countBy(unitIds, (unitId) => gameApi.getUnitData(unitId)?.name);
|
|
198
192
|
this.squads.forEach((squad) => {
|
|
199
193
|
this.logger(`Squad ${squad.getName()}: ${Object.entries(unitsInSquad(squad.getUnitIds()))
|
|
200
194
|
.map(([unitName, count]) => `${unitName} x ${count}`)
|
|
201
195
|
.join(", ")}`);
|
|
202
|
-
const squadDebugText = squad.getGlobalDebugText();
|
|
203
|
-
if (squadDebugText) {
|
|
204
|
-
globalDebugText += squad.getName() + ": " + squadDebugText + "\n";
|
|
205
|
-
}
|
|
206
|
-
});
|
|
207
|
-
return globalDebugText;
|
|
208
|
-
}
|
|
209
|
-
updateDebugText(actionsApi) {
|
|
210
|
-
this.squads.forEach((squad) => {
|
|
211
|
-
squad.getUnitIds().forEach((unitId) => actionsApi.setUnitDebugText(unitId, squad.getName()));
|
|
212
196
|
});
|
|
213
197
|
}
|
|
214
198
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"squadController.js","sourceRoot":"","sources":["../../../../src/bot/logic/squad/squadController.ts"],"names":[],"mappings":"AAAA,sDAAsD;
|
|
1
|
+
{"version":3,"file":"squadController.js","sourceRoot":"","sources":["../../../../src/bot/logic/squad/squadController.ts"],"names":[],"mappings":"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"}
|
package/dist/exampleBot.js
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import "dotenv/config";
|
|
2
2
|
import { cdapi } from "@chronodivide/game-api";
|
|
3
3
|
import { SupalosaBot } from "./bot/bot.js";
|
|
4
|
-
|
|
4
|
+
import { Countries } from "./bot/logic/common/utils.js";
|
|
5
|
+
// The game will automatically end after this time. This is to handle stalemates.
|
|
6
|
+
const MAX_GAME_LENGTH_SECONDS = 7200; // 7200 = two hours
|
|
5
7
|
async function main() {
|
|
6
8
|
/*
|
|
7
9
|
Ladder maps:
|
|
@@ -30,7 +32,7 @@ async function main() {
|
|
|
30
32
|
heckcorners_b_golden.map,hecklvl.map,heckrvr.map,hecktvt.map,isleland.map,jungleofvietnam.map,2_malibu_cliffs_le.map,mojosprt.map,4_montana_dmz_le.map,6_near_ore_far.map,8_near_ore_far.map,
|
|
31
33
|
offensedefense.map,ore2_startfixed.map,rekoool_fast_6players.mpr,rekoool_fast_8players.mpr,riverram.map,tourofegypt.map,unrepent.map,sinkswim_yr_port.map
|
|
32
34
|
*/
|
|
33
|
-
const mapName = "
|
|
35
|
+
const mapName = "heckcorners_b.map";
|
|
34
36
|
// Bot names must be unique in online mode
|
|
35
37
|
const timestamp = String(Date.now()).substr(-6);
|
|
36
38
|
const firstBotName = `Joe${timestamp}`;
|
|
@@ -40,19 +42,6 @@ async function main() {
|
|
|
40
42
|
await cdapi.init(process.env.MIX_DIR || "./");
|
|
41
43
|
console.log("Server URL: " + process.env.SERVER_URL);
|
|
42
44
|
console.log("Client URL: " + process.env.CLIENT_URL);
|
|
43
|
-
/*
|
|
44
|
-
Countries:
|
|
45
|
-
0=Americans
|
|
46
|
-
1=Alliance -> Korea
|
|
47
|
-
2=French
|
|
48
|
-
3=Germans
|
|
49
|
-
4=British
|
|
50
|
-
|
|
51
|
-
5=Africans -> Libya
|
|
52
|
-
6=Arabs -> Iraq
|
|
53
|
-
7=Confederation -> Cuba
|
|
54
|
-
8=Russians
|
|
55
|
-
*/
|
|
56
45
|
const baseSettings = {
|
|
57
46
|
buildOffAlly: false,
|
|
58
47
|
cratesAppear: false,
|
|
@@ -71,8 +60,8 @@ async function main() {
|
|
|
71
60
|
serverUrl: process.env.SERVER_URL,
|
|
72
61
|
clientUrl: process.env.CLIENT_URL,
|
|
73
62
|
agents: [
|
|
74
|
-
new SupalosaBot(process.env.ONLINE_BOT_NAME ?? firstBotName,
|
|
75
|
-
{ name: process.env.PLAYER_NAME ?? secondBotName, country:
|
|
63
|
+
new SupalosaBot(process.env.ONLINE_BOT_NAME ?? firstBotName, Countries.USA),
|
|
64
|
+
{ name: process.env.PLAYER_NAME ?? secondBotName, country: Countries.FRANCE },
|
|
76
65
|
],
|
|
77
66
|
botPassword: process.env.ONLINE_BOT_PASSWORD ?? "default",
|
|
78
67
|
};
|
|
@@ -80,23 +69,23 @@ async function main() {
|
|
|
80
69
|
...baseSettings,
|
|
81
70
|
online: false,
|
|
82
71
|
agents: [
|
|
83
|
-
new SupalosaBot(firstBotName,
|
|
84
|
-
new SupalosaBot(secondBotName,
|
|
72
|
+
new SupalosaBot(firstBotName, Countries.FRANCE, [], false),
|
|
73
|
+
new SupalosaBot(secondBotName, Countries.RUSSIA, [], true).setDebugMode(true),
|
|
85
74
|
],
|
|
86
75
|
};
|
|
87
76
|
const offlineSettings2v2 = {
|
|
88
77
|
...baseSettings,
|
|
89
78
|
online: false,
|
|
90
79
|
agents: [
|
|
91
|
-
new SupalosaBot(firstBotName,
|
|
92
|
-
new SupalosaBot(secondBotName,
|
|
93
|
-
new SupalosaBot(thirdBotName,
|
|
94
|
-
new SupalosaBot(fourthBotName,
|
|
80
|
+
new SupalosaBot(firstBotName, Countries.FRANCE, [firstBotName], false),
|
|
81
|
+
new SupalosaBot(secondBotName, Countries.RUSSIA, [firstBotName], true).setDebugMode(true),
|
|
82
|
+
new SupalosaBot(thirdBotName, Countries.RUSSIA, [fourthBotName], false),
|
|
83
|
+
new SupalosaBot(fourthBotName, Countries.FRANCE, [thirdBotName], false),
|
|
95
84
|
],
|
|
96
85
|
};
|
|
97
86
|
const game = await cdapi.createGame(process.env.ONLINE_MATCH ? onlineSettings : offlineSettings1v1);
|
|
98
87
|
while (!game.isFinished()) {
|
|
99
|
-
if (game.getCurrentTick() / 15 >
|
|
88
|
+
if (!!MAX_GAME_LENGTH_SECONDS && game.getCurrentTick() / 15 > MAX_GAME_LENGTH_SECONDS) {
|
|
100
89
|
console.log(`Game forced to end due to timeout`);
|
|
101
90
|
break;
|
|
102
91
|
}
|
package/dist/exampleBot.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"exampleBot.js","sourceRoot":"","sources":["../src/exampleBot.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,CAAC;AACvB,OAAO,EAAmE,KAAK,EAAE,MAAM,wBAAwB,CAAC;AAChH,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"exampleBot.js","sourceRoot":"","sources":["../src/exampleBot.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@supalosa/chronodivide-bot",
|
|
3
|
-
"version": "0.5.
|
|
3
|
+
"version": "0.5.4",
|
|
4
4
|
"description": "Example bot for Chrono Divide",
|
|
5
5
|
"repository": "https://github.com/Supalosa/supalosa-chronodivide-bot",
|
|
6
6
|
"main": "dist/exampleBot.js",
|
|
@@ -13,13 +13,13 @@
|
|
|
13
13
|
},
|
|
14
14
|
"license": "UNLICENSED",
|
|
15
15
|
"devDependencies": {
|
|
16
|
-
"@chronodivide/game-api": "^0.
|
|
16
|
+
"@chronodivide/game-api": "^0.51.2",
|
|
17
17
|
"@types/node": "^14.17.32",
|
|
18
18
|
"prettier": "3.0.3",
|
|
19
19
|
"typescript": "^4.3.5"
|
|
20
20
|
},
|
|
21
21
|
"peerDependencies": {
|
|
22
|
-
"@chronodivide/game-api": "^0.
|
|
22
|
+
"@chronodivide/game-api": "^0.51.2"
|
|
23
23
|
},
|
|
24
24
|
"dependencies": {
|
|
25
25
|
"@datastructures-js/priority-queue": "^6.3.0",
|
package/src/bot/bot.ts
CHANGED
|
@@ -5,7 +5,7 @@ import { SectorCache } from "./logic/map/sector.js";
|
|
|
5
5
|
import { MissionController } from "./logic/mission/missionController.js";
|
|
6
6
|
import { QueueController } from "./logic/building/queueController.js";
|
|
7
7
|
import { MatchAwareness, MatchAwarenessImpl } from "./logic/awareness.js";
|
|
8
|
-
import { formatTimeDuration } from "./logic/common/utils.js";
|
|
8
|
+
import { Countries, formatTimeDuration } from "./logic/common/utils.js";
|
|
9
9
|
|
|
10
10
|
const DEBUG_STATE_UPDATE_INTERVAL_SECONDS = 6;
|
|
11
11
|
|
|
@@ -23,7 +23,7 @@ export class SupalosaBot extends Bot {
|
|
|
23
23
|
|
|
24
24
|
constructor(
|
|
25
25
|
name: string,
|
|
26
|
-
country:
|
|
26
|
+
country: Countries,
|
|
27
27
|
private tryAllyWith: string[] = [],
|
|
28
28
|
private enableLogging = true,
|
|
29
29
|
) {
|
|
@@ -115,9 +115,9 @@ export class SupalosaBot extends Bot {
|
|
|
115
115
|
if (!this.enableLogging) {
|
|
116
116
|
return;
|
|
117
117
|
}
|
|
118
|
-
|
|
119
|
-
console.log(`[${timestamp} ${this.name}] ${message}`);
|
|
118
|
+
this.logger.info(message);
|
|
120
119
|
if (sayInGame) {
|
|
120
|
+
const timestamp = this.getHumanTimestamp(this.gameApi);
|
|
121
121
|
this.actionsApi.sayAll(`${timestamp}: ${message}`);
|
|
122
122
|
}
|
|
123
123
|
}
|
|
@@ -9,6 +9,7 @@ export class AntiGroundStaticDefence implements AiBuildingRules {
|
|
|
9
9
|
private basePriority: number,
|
|
10
10
|
private baseAmount: number,
|
|
11
11
|
private groundStrength: number,
|
|
12
|
+
private limit: number,
|
|
12
13
|
) {}
|
|
13
14
|
|
|
14
15
|
getPlacementLocation(
|
|
@@ -25,6 +26,10 @@ export class AntiGroundStaticDefence implements AiBuildingRules {
|
|
|
25
26
|
technoRules: TechnoRules,
|
|
26
27
|
threatCache: GlobalThreat | null,
|
|
27
28
|
): number {
|
|
29
|
+
const numOwned = numBuildingsOwnedOfType(game, playerData, technoRules);
|
|
30
|
+
if (numOwned >= this.limit) {
|
|
31
|
+
return 0;
|
|
32
|
+
}
|
|
28
33
|
// If the enemy's ground power is increasing we should try to keep up.
|
|
29
34
|
if (threatCache) {
|
|
30
35
|
let denominator =
|
|
@@ -36,7 +41,6 @@ export class AntiGroundStaticDefence implements AiBuildingRules {
|
|
|
36
41
|
}
|
|
37
42
|
}
|
|
38
43
|
const strengthPerCost = (this.groundStrength / technoRules.cost) * 1000;
|
|
39
|
-
const numOwned = numBuildingsOwnedOfType(game, playerData, technoRules);
|
|
40
44
|
return this.basePriority * (1.0 - numOwned / this.baseAmount) * strengthPerCost;
|
|
41
45
|
}
|
|
42
46
|
|
|
@@ -5,6 +5,7 @@ import {
|
|
|
5
5
|
LandType,
|
|
6
6
|
ObjectType,
|
|
7
7
|
PlayerData,
|
|
8
|
+
Rectangle,
|
|
8
9
|
Size,
|
|
9
10
|
TechnoRules,
|
|
10
11
|
Tile,
|
|
@@ -64,7 +65,7 @@ export function numBuildingsOwnedOfName(game: GameApi, playerData: PlayerData, n
|
|
|
64
65
|
* @param newBuildingSize? Size of the new building
|
|
65
66
|
* @returns
|
|
66
67
|
*/
|
|
67
|
-
function computeAdjacentRect(point: Vector2, t: Size, adjacent: number, newBuildingSize?: Size) {
|
|
68
|
+
function computeAdjacentRect(point: Vector2, t: Size, adjacent: number, newBuildingSize?: Size): Rectangle {
|
|
68
69
|
return {
|
|
69
70
|
x: point.x - adjacent - (newBuildingSize?.width || 0),
|
|
70
71
|
y: point.y - adjacent - (newBuildingSize?.height || 0),
|
|
@@ -73,6 +74,14 @@ function computeAdjacentRect(point: Vector2, t: Size, adjacent: number, newBuild
|
|
|
73
74
|
};
|
|
74
75
|
}
|
|
75
76
|
|
|
77
|
+
function getAdjacentTiles(game: GameApi, range: Rectangle, onWater: boolean) {
|
|
78
|
+
// use the bulk API to get all tiles from the baseTile to the (baseTile + range)
|
|
79
|
+
const adjacentTiles = game.mapApi
|
|
80
|
+
.getTilesInRect(range)
|
|
81
|
+
.filter((tile) => !onWater || tile.landType === LandType.Water);
|
|
82
|
+
return adjacentTiles;
|
|
83
|
+
}
|
|
84
|
+
|
|
76
85
|
export function getAdjacencyTiles(
|
|
77
86
|
game: GameApi,
|
|
78
87
|
playerData: PlayerData,
|
|
@@ -98,16 +107,10 @@ export function getAdjacencyTiles(
|
|
|
98
107
|
height: foundation?.height,
|
|
99
108
|
};
|
|
100
109
|
const range = computeAdjacentRect(buildingBase, buildingSize, technoRules.adjacent, placementRules.foundation);
|
|
101
|
-
const
|
|
102
|
-
if (
|
|
110
|
+
const adjacentTiles = getAdjacentTiles(game, range, onWater);
|
|
111
|
+
if (adjacentTiles.length === 0) {
|
|
103
112
|
continue;
|
|
104
113
|
}
|
|
105
|
-
const adjacentTiles = game.mapApi
|
|
106
|
-
.getTilesInRect(baseTile, {
|
|
107
|
-
width: range.width,
|
|
108
|
-
height: range.height,
|
|
109
|
-
})
|
|
110
|
-
.filter((tile) => !onWater || tile.landType === LandType.Water);
|
|
111
114
|
tiles.push(...adjacentTiles);
|
|
112
115
|
|
|
113
116
|
// Prevent placing the new building on tiles that would cause it to overlap with this building.
|
|
@@ -200,10 +203,10 @@ export const BUILDING_NAME_TO_RULES = new Map<string, AiBuildingRules>([
|
|
|
200
203
|
["GATECH", new BasicBuilding(20, 1, 4000)], // Allied Battle Lab
|
|
201
204
|
["GAYARD", new BasicBuilding(0, 0, 0)], // Naval Yard, disabled
|
|
202
205
|
|
|
203
|
-
["GAPILL", new AntiGroundStaticDefence(2, 1, 5)], // Pillbox
|
|
204
|
-
["ATESLA", new AntiGroundStaticDefence(2, 1, 10)], // Prism Cannon
|
|
205
|
-
["NASAM", new AntiAirStaticDefence(2, 1, 5)], //
|
|
206
|
-
["GAWALL", new AntiGroundStaticDefence(0, 0, 0)], // Walls
|
|
206
|
+
["GAPILL", new AntiGroundStaticDefence(2, 1, 5, 5)], // Pillbox
|
|
207
|
+
["ATESLA", new AntiGroundStaticDefence(2, 1, 10, 3)], // Prism Cannon
|
|
208
|
+
["NASAM", new AntiAirStaticDefence(2, 1, 5)], // Patriot Missile
|
|
209
|
+
["GAWALL", new AntiGroundStaticDefence(0, 0, 0, 0)], // Walls
|
|
207
210
|
|
|
208
211
|
["E1", new BasicGroundUnit(2, 2, 0.2, 0)], // GI
|
|
209
212
|
["ENGINEER", new BasicGroundUnit(1, 0, 0)], // Engineer
|
|
@@ -229,10 +232,10 @@ export const BUILDING_NAME_TO_RULES = new Map<string, AiBuildingRules>([
|
|
|
229
232
|
|
|
230
233
|
["NATECH", new BasicBuilding(20, 1, 4000)], // Soviet Battle Lab
|
|
231
234
|
|
|
232
|
-
["NALASR", new AntiGroundStaticDefence(2, 1, 5)], // Sentry Gun
|
|
235
|
+
["NALASR", new AntiGroundStaticDefence(2, 1, 5, 5)], // Sentry Gun
|
|
233
236
|
["NAFLAK", new AntiAirStaticDefence(2, 1, 5)], // Flak Cannon
|
|
234
|
-
["TESLA", new AntiGroundStaticDefence(2, 1, 10)], // Tesla Coil
|
|
235
|
-
["NAWALL", new AntiGroundStaticDefence(0, 0, 0)], // Walls
|
|
237
|
+
["TESLA", new AntiGroundStaticDefence(2, 1, 10, 3)], // Tesla Coil
|
|
238
|
+
["NAWALL", new AntiGroundStaticDefence(0, 0, 0, 0)], // Walls
|
|
236
239
|
|
|
237
240
|
["E2", new BasicGroundUnit(2, 2, 0.2, 0)], // Conscript
|
|
238
241
|
["SENGINEER", new BasicGroundUnit(1, 0, 0)], // Soviet Engineer
|
|
@@ -4,20 +4,18 @@ import { getDefaultPlacementLocation } from "./buildingRules.js";
|
|
|
4
4
|
|
|
5
5
|
export const getStaticDefencePlacement = (game: GameApi, playerData: PlayerData, technoRules: TechnoRules) => {
|
|
6
6
|
// Prefer front towards enemy.
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
);
|
|
7
|
+
const { startLocation, name: currentName } = playerData;
|
|
8
|
+
const allNames = game.getPlayers();
|
|
9
|
+
// Create a list of positions that point roughly towards hostile player start locatoins.
|
|
10
|
+
const candidates = allNames
|
|
11
|
+
.filter((otherName) => otherName !== currentName && !game.areAlliedPlayers(otherName, currentName))
|
|
12
|
+
.map((otherName) => {
|
|
13
|
+
const enemyPlayer = game.getPlayerData(otherName);
|
|
14
|
+
return getPointTowardsOtherPoint(game, startLocation, enemyPlayer.startLocation, 4, 16, 1.5);
|
|
15
|
+
});
|
|
16
|
+
if (candidates.length === 0) {
|
|
17
|
+
return undefined;
|
|
19
18
|
}
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
return getDefaultPlacementLocation(game, playerData, selectedLocation, technoRules, false, 0);
|
|
19
|
+
const selectedLocation = candidates[Math.floor(game.generateRandom() * candidates.length)];
|
|
20
|
+
return getDefaultPlacementLocation(game, playerData, selectedLocation, technoRules, false, 2);
|
|
23
21
|
};
|
|
@@ -1,10 +1,18 @@
|
|
|
1
1
|
import { GameObjectData, TechnoRules, UnitData } from "@chronodivide/game-api";
|
|
2
2
|
|
|
3
|
-
export
|
|
4
|
-
|
|
5
|
-
|
|
3
|
+
export enum Countries {
|
|
4
|
+
USA = "Americans",
|
|
5
|
+
KOREA = "Alliance",
|
|
6
|
+
FRANCE = "French",
|
|
7
|
+
GERMANY = "Germans",
|
|
8
|
+
GREAT_BRITAIN = "British",
|
|
9
|
+
LIBYA = "Africans",
|
|
10
|
+
IRAQ = "Arabs",
|
|
11
|
+
CUBA = "Confederation",
|
|
12
|
+
RUSSIA = "Russians",
|
|
13
|
+
}
|
|
6
14
|
|
|
7
|
-
export
|
|
15
|
+
export type DebugLogger = (message: string, sayInGame?: boolean) => void;
|
|
8
16
|
|
|
9
17
|
export const isOwnedByNeutral = (unitData: UnitData | undefined) => unitData?.owner === "@@NEUTRAL@@";
|
|
10
18
|
|
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
// A periodically-refreshed cache of known threats to a bot so we can use it in decision making.
|
|
2
|
-
|
|
3
|
-
export class GlobalThreat {
|
|
4
|
-
constructor(
|
|
5
|
-
public certainty: number, // 0.0 - 1.0 based on approximate visibility around the map.
|
|
6
|
-
public totalOffensiveLandThreat: number, // a number that approximates how much land-based firepower our opponents have.
|
|
7
|
-
public totalOffensiveAirThreat: number, // a number that approximates how much airborne firepower our opponents have.
|
|
8
|
-
public totalOffensiveAntiAirThreat: number, // a number that approximates how much anti-air firepower our opponents have.
|
|
9
|
-
public totalDefensiveThreat: number, // a number that approximates how much defensive power our opponents have.
|
|
10
|
-
public totalDefensivePower: number, // a number that approximates how much defensive power we have.
|
|
11
|
-
public totalAvailableAntiGroundFirepower: number, // how much anti-ground power we have
|
|
12
|
-
public totalAvailableAntiAirFirepower: number, // how much anti-air power we have
|
|
13
|
-
public totalAvailableAirPower: number, // how much firepower we have in air units
|
|
14
|
-
) {}
|
|
15
|
-
}
|
|
1
|
+
// A periodically-refreshed cache of known threats to a bot so we can use it in decision making.
|
|
2
|
+
|
|
3
|
+
export class GlobalThreat {
|
|
4
|
+
constructor(
|
|
5
|
+
public certainty: number, // 0.0 - 1.0 based on approximate visibility around the map.
|
|
6
|
+
public totalOffensiveLandThreat: number, // a number that approximates how much land-based firepower our opponents have.
|
|
7
|
+
public totalOffensiveAirThreat: number, // a number that approximates how much airborne firepower our opponents have.
|
|
8
|
+
public totalOffensiveAntiAirThreat: number, // a number that approximates how much anti-air firepower our opponents have.
|
|
9
|
+
public totalDefensiveThreat: number, // a number that approximates how much defensive power our opponents have.
|
|
10
|
+
public totalDefensivePower: number, // a number that approximates how much defensive power we have.
|
|
11
|
+
public totalAvailableAntiGroundFirepower: number, // how much anti-ground power we have
|
|
12
|
+
public totalAvailableAntiAirFirepower: number, // how much anti-air power we have
|
|
13
|
+
public totalAvailableAirPower: number, // how much firepower we have in air units
|
|
14
|
+
) {}
|
|
15
|
+
}
|
package/src/exampleBot.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import "dotenv/config";
|
|
2
2
|
import { Agent, Bot, CreateBaseOpts, CreateOfflineOpts, CreateOnlineOpts, cdapi } from "@chronodivide/game-api";
|
|
3
3
|
import { SupalosaBot } from "./bot/bot.js";
|
|
4
|
+
import { Countries } from "./bot/logic/common/utils.js";
|
|
4
5
|
|
|
5
6
|
// The game will automatically end after this time. This is to handle stalemates.
|
|
6
7
|
const MAX_GAME_LENGTH_SECONDS: number | null = 7200; // 7200 = two hours
|
|
@@ -33,7 +34,7 @@ async function main() {
|
|
|
33
34
|
heckcorners_b_golden.map,hecklvl.map,heckrvr.map,hecktvt.map,isleland.map,jungleofvietnam.map,2_malibu_cliffs_le.map,mojosprt.map,4_montana_dmz_le.map,6_near_ore_far.map,8_near_ore_far.map,
|
|
34
35
|
offensedefense.map,ore2_startfixed.map,rekoool_fast_6players.mpr,rekoool_fast_8players.mpr,riverram.map,tourofegypt.map,unrepent.map,sinkswim_yr_port.map
|
|
35
36
|
*/
|
|
36
|
-
const mapName = "
|
|
37
|
+
const mapName = "heckcorners_b.map";
|
|
37
38
|
// Bot names must be unique in online mode
|
|
38
39
|
const timestamp = String(Date.now()).substr(-6);
|
|
39
40
|
const firstBotName = `Joe${timestamp}`;
|
|
@@ -46,20 +47,6 @@ async function main() {
|
|
|
46
47
|
console.log("Server URL: " + process.env.SERVER_URL!);
|
|
47
48
|
console.log("Client URL: " + process.env.CLIENT_URL!);
|
|
48
49
|
|
|
49
|
-
/*
|
|
50
|
-
Countries:
|
|
51
|
-
0=Americans
|
|
52
|
-
1=Alliance -> Korea
|
|
53
|
-
2=French
|
|
54
|
-
3=Germans
|
|
55
|
-
4=British
|
|
56
|
-
|
|
57
|
-
5=Africans -> Libya
|
|
58
|
-
6=Arabs -> Iraq
|
|
59
|
-
7=Confederation -> Cuba
|
|
60
|
-
8=Russians
|
|
61
|
-
*/
|
|
62
|
-
|
|
63
50
|
const baseSettings: CreateBaseOpts = {
|
|
64
51
|
buildOffAlly: false,
|
|
65
52
|
cratesAppear: false,
|
|
@@ -79,8 +66,8 @@ async function main() {
|
|
|
79
66
|
serverUrl: process.env.SERVER_URL!,
|
|
80
67
|
clientUrl: process.env.CLIENT_URL!,
|
|
81
68
|
agents: [
|
|
82
|
-
new SupalosaBot(process.env.ONLINE_BOT_NAME ?? firstBotName,
|
|
83
|
-
{ name: process.env.PLAYER_NAME ?? secondBotName, country:
|
|
69
|
+
new SupalosaBot(process.env.ONLINE_BOT_NAME ?? firstBotName, Countries.USA),
|
|
70
|
+
{ name: process.env.PLAYER_NAME ?? secondBotName, country: Countries.FRANCE },
|
|
84
71
|
] as [Bot, ...Agent[]],
|
|
85
72
|
botPassword: process.env.ONLINE_BOT_PASSWORD ?? "default",
|
|
86
73
|
};
|
|
@@ -89,8 +76,8 @@ async function main() {
|
|
|
89
76
|
...baseSettings,
|
|
90
77
|
online: false,
|
|
91
78
|
agents: [
|
|
92
|
-
new SupalosaBot(firstBotName,
|
|
93
|
-
new SupalosaBot(secondBotName,
|
|
79
|
+
new SupalosaBot(firstBotName, Countries.FRANCE, [], false),
|
|
80
|
+
new SupalosaBot(secondBotName, Countries.RUSSIA, [], true).setDebugMode(true),
|
|
94
81
|
],
|
|
95
82
|
};
|
|
96
83
|
|
|
@@ -98,10 +85,10 @@ async function main() {
|
|
|
98
85
|
...baseSettings,
|
|
99
86
|
online: false,
|
|
100
87
|
agents: [
|
|
101
|
-
new SupalosaBot(firstBotName,
|
|
102
|
-
new SupalosaBot(secondBotName,
|
|
103
|
-
new SupalosaBot(thirdBotName,
|
|
104
|
-
new SupalosaBot(fourthBotName,
|
|
88
|
+
new SupalosaBot(firstBotName, Countries.FRANCE, [firstBotName], false),
|
|
89
|
+
new SupalosaBot(secondBotName, Countries.RUSSIA, [firstBotName], true).setDebugMode(true),
|
|
90
|
+
new SupalosaBot(thirdBotName, Countries.RUSSIA, [fourthBotName], false),
|
|
91
|
+
new SupalosaBot(fourthBotName, Countries.FRANCE, [thirdBotName], false),
|
|
105
92
|
],
|
|
106
93
|
};
|
|
107
94
|
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import { numBuildingsOwnedOfType } from "./building.js";
|
|
2
|
-
export class MassedAntiGroundUnit {
|
|
3
|
-
constructor(basePriority, baseAmount) {
|
|
4
|
-
this.basePriority = basePriority;
|
|
5
|
-
this.baseAmount = baseAmount;
|
|
6
|
-
}
|
|
7
|
-
getPlacementLocation(game, playerData, technoRules) {
|
|
8
|
-
return undefined;
|
|
9
|
-
}
|
|
10
|
-
getPriority(game, playerData, technoRules, threatCache) {
|
|
11
|
-
// If the enemy's ground power is increasing we should try to keep up.
|
|
12
|
-
if (threatCache) {
|
|
13
|
-
if (threatCache.totalAvailableAntiGroundFirepower * threatCache.certainty > threatCache.totalAvailableAntiGroundFirepower) {
|
|
14
|
-
return this.basePriority * (threatCache.totalAvailableAntiGroundFirepower / Math.max(1, threatCache.totalAvailableAntiGroundFirepower));
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
|
-
const numOwned = numBuildingsOwnedOfType(game, playerData, technoRules);
|
|
18
|
-
return this.basePriority * (1.0 - (numOwned / this.baseAmount));
|
|
19
|
-
}
|
|
20
|
-
}
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import { QueueType } from "@chronodivide/game-api";
|
|
2
|
-
export const queueTypeToName = (queue) => {
|
|
3
|
-
switch (queue) {
|
|
4
|
-
case QueueType.Structures:
|
|
5
|
-
return "Structures";
|
|
6
|
-
case QueueType.Armory:
|
|
7
|
-
return "Armory";
|
|
8
|
-
case QueueType.Infantry:
|
|
9
|
-
return "Infantry";
|
|
10
|
-
case QueueType.Vehicles:
|
|
11
|
-
return "Vehicles";
|
|
12
|
-
case QueueType.Aircrafts:
|
|
13
|
-
return "Aircrafts";
|
|
14
|
-
case QueueType.Ships:
|
|
15
|
-
return "Ships";
|
|
16
|
-
default:
|
|
17
|
-
return "Unknown";
|
|
18
|
-
}
|
|
19
|
-
};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|