@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
|
@@ -4,25 +4,25 @@ import { GlobalThreat } from "./threat.js";
|
|
|
4
4
|
export function calculateGlobalThreat(game: GameApi, playerData: PlayerData, visibleAreaPercent: number): GlobalThreat {
|
|
5
5
|
let groundUnits = game.getVisibleUnits(
|
|
6
6
|
playerData.name,
|
|
7
|
-
"
|
|
7
|
+
"enemy",
|
|
8
8
|
(r) => r.type == ObjectType.Vehicle || r.type == ObjectType.Infantry,
|
|
9
9
|
);
|
|
10
|
-
let airUnits = game.getVisibleUnits(playerData.name, "
|
|
10
|
+
let airUnits = game.getVisibleUnits(playerData.name, "enemy", (r) => r.movementZone == MovementZone.Fly);
|
|
11
11
|
let groundDefence = game
|
|
12
|
-
.getVisibleUnits(playerData.name, "
|
|
12
|
+
.getVisibleUnits(playerData.name, "enemy", (r) => r.type == ObjectType.Building)
|
|
13
13
|
.filter((unitId) => isAntiGround(game, unitId));
|
|
14
14
|
let antiAirPower = game
|
|
15
|
-
.getVisibleUnits(playerData.name, "
|
|
15
|
+
.getVisibleUnits(playerData.name, "enemy", (r) => r.type != ObjectType.Building)
|
|
16
16
|
.filter((unitId) => isAntiAir(game, unitId));
|
|
17
17
|
|
|
18
18
|
let ourAntiGroundUnits = game
|
|
19
19
|
.getVisibleUnits(playerData.name, "self", (r) => r.isSelectableCombatant)
|
|
20
20
|
.filter((unitId) => isAntiGround(game, unitId));
|
|
21
21
|
let ourAntiAirUnits = game
|
|
22
|
-
.getVisibleUnits(playerData.name, "self", (r) => r.isSelectableCombatant)
|
|
22
|
+
.getVisibleUnits(playerData.name, "self", (r) => r.isSelectableCombatant || r.type === ObjectType.Building)
|
|
23
23
|
.filter((unitId) => isAntiAir(game, unitId));
|
|
24
24
|
let ourGroundDefence = game
|
|
25
|
-
.getVisibleUnits(playerData.name, "self", (r) => r.type
|
|
25
|
+
.getVisibleUnits(playerData.name, "self", (r) => r.type === ObjectType.Building)
|
|
26
26
|
.filter((unitId) => isAntiGround(game, unitId));
|
|
27
27
|
let ourAirUnits = game.getVisibleUnits(
|
|
28
28
|
playerData.name,
|
|
@@ -45,8 +45,8 @@ export function calculateGlobalThreat(game: GameApi, playerData: PlayerData, vis
|
|
|
45
45
|
observedGroundThreat,
|
|
46
46
|
observedAirThreat,
|
|
47
47
|
observedAntiAirThreat,
|
|
48
|
-
observedGroundDefence
|
|
49
|
-
ourGroundDefencePower
|
|
48
|
+
observedGroundDefence,
|
|
49
|
+
ourGroundDefencePower,
|
|
50
50
|
ourAntiGroundPower,
|
|
51
51
|
ourAntiAirPower,
|
|
52
52
|
ourAirPower,
|
|
@@ -76,14 +76,14 @@ function calculateFirepowerForUnit(unitData: UnitData): number {
|
|
|
76
76
|
threat +=
|
|
77
77
|
(hpRatio *
|
|
78
78
|
((unitData.primaryWeapon.rules.damage + 1) * GameMath.sqrt(unitData.primaryWeapon.rules.range + 1))) /
|
|
79
|
-
Math.max(unitData.primaryWeapon.
|
|
79
|
+
Math.max(unitData.primaryWeapon.rules.rof, 1);
|
|
80
80
|
}
|
|
81
81
|
if (unitData.secondaryWeapon) {
|
|
82
82
|
threat +=
|
|
83
83
|
(hpRatio *
|
|
84
84
|
((unitData.secondaryWeapon.rules.damage + 1) *
|
|
85
85
|
GameMath.sqrt(unitData.secondaryWeapon.rules.range + 1))) /
|
|
86
|
-
Math.max(unitData.secondaryWeapon.
|
|
86
|
+
Math.max(unitData.secondaryWeapon.rules.rof, 1);
|
|
87
87
|
}
|
|
88
88
|
return Math.min(800, threat);
|
|
89
89
|
}
|
package/src/exampleBot.ts
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
|
-
import
|
|
1
|
+
import "dotenv/config";
|
|
2
|
+
import { Agent, Bot, CreateBaseOpts, CreateOfflineOpts, CreateOnlineOpts, cdapi } from "@chronodivide/game-api";
|
|
2
3
|
import { SupalosaBot } from "./bot/bot.js";
|
|
4
|
+
import { off } from "process";
|
|
3
5
|
|
|
4
6
|
async function main() {
|
|
5
7
|
/*
|
|
@@ -8,18 +10,34 @@ async function main() {
|
|
|
8
10
|
CDR2 1v1 4_country_swing_le_v2.map
|
|
9
11
|
CDR2 1v1 mp01t4.map, large map, oil derricks
|
|
10
12
|
CDR2 1v1 tn04t2.map, small map
|
|
11
|
-
CDR2 1v1 mp10s4.map <- depth charge, naval map (not supported)
|
|
13
|
+
CDR2 1v1 mp10s4.map <- depth charge, naval map (not supported). Cramped in position 1.
|
|
12
14
|
CDR2 1v1 heckcorners.map
|
|
13
15
|
CDR2 1v1 4_montana_dmz_le.map
|
|
14
16
|
CDR2 1v1 barrel.map
|
|
15
17
|
|
|
16
18
|
Other maps:
|
|
17
19
|
mp03t4 large map, no oil derricks
|
|
20
|
+
mp02t2.map,mp06t2.map,mp11t2.map,mp08t2.map,mp21s2.map,mp14t2.map,mp29u2.map,mp31s2.map,mp18s3.map,mp09t3.map,mp01t4.map,mp03t4.map,mp05t4.map,mp10s4.map,mp12s4.map,mp13s4.map,mp19t4.map,
|
|
21
|
+
mp15s4.map,mp16s4.map,mp23t4.map,mp33u4.map,mp34u4.map,mp17t6.map,mp20t6.map,mp25t6.map,mp26s6.map,mp30s6.map,mp22s8.map,mp27t8.map,mp32s8.map,mp06mw.map,mp08mw.map,mp14mw.map,mp29mw.map,
|
|
22
|
+
mp05mw.map,mp13mw.map,mp15mw.map,mp16mw.map,mp23mw.map,mp17mw.map,mp25mw.map,mp30mw.map,mp22mw.map,mp27mw.map,mp32mw.map,mp09du.map,mp01du.map,mp05du.map,mp13du.map,mp15du.map,mp18du.map,
|
|
23
|
+
mp24du.map,mp17du.map,mp25du.map,mp27du.map,mp32du.map,c1m1a.map,c1m1b.map,c1m1c.map,c1m2a.map,c1m2b.map,c1m2c.map,c1m3a.map,c1m3b.map,c1m3c.map,c1m4a.map,c1m4b.map,c1m4c.map,c1m5a.map,
|
|
24
|
+
c1m5b.map,c1m5c.map,c2m1a.map,c2m1b.map,c2m1c.map,c2m2a.map,c2m2b.map,c2m2c.map,c2m3a.map,c2m3b.map,c2m3c.map,c2m4a.map,c2m4b.map,c2m4c.map,c2m5a.map,c2m5b.map,c2m5c.map,c3m1a.map,c3m1b.map,
|
|
25
|
+
c3m1c.map,c3m2a.map,c3m2b.map,c3m2c.map,c3m3a.map,c3m3b.map,c3m3c.map,c3m4a.map,c3m4b.map,c3m4c.map,c3m5a.map,c3m5b.map,c3m5c.map,c4m1a.map,c4m1b.map,c4m1c.map,c4m2a.map,c4m2b.map,c4m2c.map,
|
|
26
|
+
c4m3a.map,c4m3b.map,c4m3c.map,c4m4a.map,c4m4b.map,c4m4c.map,c4m5a.map,c4m5b.map,c4m5c.map,c5m1a.map,c5m1b.map,c5m1c.map,c5m2a.map,c5m2b.map,c5m2c.map,c5m3a.map,c5m3b.map,c5m3c.map,c5m4a.map,
|
|
27
|
+
c5m4b.map,c5m4c.map,c5m5a.map,c5m5b.map,c5m5c.map,tn01t2.map,tn01mw.map,tn04t2.map,tn04mw.map,tn02s4.map,tn02mw.map,amazon01.map,eb1.map,eb2.map,eb3.map,eb4.map,eb5.map,invasion.map,arena.map,
|
|
28
|
+
barrel.map,bayopigs.map,bermuda.map,break.map,carville.map,deadman.map,death.map,disaster.map,dustbowl.map,goldst.map,grinder.map,hailmary.map,hills.map,kaliforn.map,killer.map,lostlake.map,
|
|
29
|
+
newhghts.map,oceansid.map,pacific.map,potomac.map,powdrkeg.map,rockets.map,roulette.map,round.map,seaofiso.map,shrapnel.map,tanyas.map,tower.map,tsunami.map,valley.map,xmas.map,yuriplot.map,
|
|
30
|
+
cavernsofsiberia.map,countryswingfixed.map,4_country_swing_le_v2.map,dorado_descent_yr_port.mpr,dryheat.map,dunepatrolremake.map,heckbvb.map,heckcorners.map,heckgolden.mpr,heckcorners_b.map,
|
|
31
|
+
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,
|
|
32
|
+
offensedefense.map,ore2_startfixed.map,rekoool_fast_6players.mpr,rekoool_fast_8players.mpr,riverram.map,tourofegypt.map,unrepent.map,sinkswim_yr_port.map
|
|
18
33
|
*/
|
|
19
|
-
const mapName = "
|
|
34
|
+
const mapName = "mp03t4.map";
|
|
20
35
|
// Bot names must be unique in online mode
|
|
21
|
-
const
|
|
22
|
-
const
|
|
36
|
+
const timestamp = String(Date.now()).substr(-6);
|
|
37
|
+
const firstBotName = `Joe${timestamp}`;
|
|
38
|
+
const secondBotName = `Bob${timestamp}`;
|
|
39
|
+
const thirdBotName = `Mike${timestamp}`;
|
|
40
|
+
const fourthBotName = `Charlie${timestamp}`;
|
|
23
41
|
|
|
24
42
|
await cdapi.init(process.env.MIX_DIR || "./");
|
|
25
43
|
|
|
@@ -40,19 +58,7 @@ async function main() {
|
|
|
40
58
|
8=Russians
|
|
41
59
|
*/
|
|
42
60
|
|
|
43
|
-
const
|
|
44
|
-
online: true as true,
|
|
45
|
-
serverUrl: process.env.SERVER_URL!,
|
|
46
|
-
clientUrl: process.env.CLIENT_URL!,
|
|
47
|
-
agents: [new SupalosaBot(botName, "Americans"), { name: otherBotName, country: "French" }] as [Bot, ...Agent[]],
|
|
48
|
-
};
|
|
49
|
-
|
|
50
|
-
const offlineSettings = {
|
|
51
|
-
agents: [new SupalosaBot(botName, "French", false), new SupalosaBot(otherBotName, "Russians", true)],
|
|
52
|
-
};
|
|
53
|
-
|
|
54
|
-
const game = await cdapi.createGame({
|
|
55
|
-
...offlineSettings,
|
|
61
|
+
const baseSettings: CreateBaseOpts = {
|
|
56
62
|
buildOffAlly: false,
|
|
57
63
|
cratesAppear: false,
|
|
58
64
|
credits: 10000,
|
|
@@ -63,7 +69,41 @@ async function main() {
|
|
|
63
69
|
shortGame: true,
|
|
64
70
|
superWeapons: false,
|
|
65
71
|
unitCount: 0,
|
|
66
|
-
}
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
const onlineSettings: CreateOnlineOpts = {
|
|
75
|
+
...baseSettings,
|
|
76
|
+
online: true,
|
|
77
|
+
serverUrl: process.env.SERVER_URL!,
|
|
78
|
+
clientUrl: process.env.CLIENT_URL!,
|
|
79
|
+
agents: [
|
|
80
|
+
new SupalosaBot(process.env.ONLINE_BOT_NAME ?? firstBotName, "Americans"),
|
|
81
|
+
{ name: process.env.PLAYER_NAME ?? secondBotName, country: "French" },
|
|
82
|
+
] as [Bot, ...Agent[]],
|
|
83
|
+
botPassword: process.env.ONLINE_BOT_PASSWORD ?? "default",
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
const offlineSettings1v1: CreateOfflineOpts = {
|
|
87
|
+
...baseSettings,
|
|
88
|
+
online: false,
|
|
89
|
+
agents: [
|
|
90
|
+
new SupalosaBot(firstBotName, "French", [], true).setDebugMode(true),
|
|
91
|
+
new SupalosaBot(secondBotName, "Russians", [], false),
|
|
92
|
+
],
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
const offlineSettings2v2: CreateOfflineOpts = {
|
|
96
|
+
...baseSettings,
|
|
97
|
+
online: false,
|
|
98
|
+
agents: [
|
|
99
|
+
new SupalosaBot(firstBotName, "French", [firstBotName], false),
|
|
100
|
+
new SupalosaBot(secondBotName, "Russians", [firstBotName], true).setDebugMode(true),
|
|
101
|
+
new SupalosaBot(thirdBotName, "Russians", [fourthBotName], false),
|
|
102
|
+
new SupalosaBot(fourthBotName, "French", [thirdBotName], false),
|
|
103
|
+
],
|
|
104
|
+
};
|
|
105
|
+
|
|
106
|
+
const game = await cdapi.createGame(process.env.ONLINE_MATCH ? onlineSettings : offlineSettings1v1);
|
|
67
107
|
while (!game.isFinished()) {
|
|
68
108
|
await game.update();
|
|
69
109
|
}
|
package/.prettierrc
DELETED
package/TODO.md
DELETED
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
# TODO for Supabot
|
|
2
|
-
|
|
3
|
-
Urgent
|
|
4
|
-
|
|
5
|
-
- maybe not spam move commands for scouting and attacking missions
|
|
6
|
-
- don't spam repair
|
|
7
|
-
- handle multiple opponents or allies
|
|
8
|
-
- leader pathfinding
|
|
9
|
-
|
|
10
|
-
Medium priority
|
|
11
|
-
|
|
12
|
-
- detect naval map (can scan tiles to check if more of the map is water or not)
|
|
13
|
-
- handle naval construction
|
|
14
|
-
- detect islands and implement island-hopping
|
|
15
|
-
|
|
16
|
-
Not urgent
|
|
17
|
-
|
|
18
|
-
- Remove squad paradigm, all unit-related for mission can just go into the mission.
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"artilleryUnit.js","sourceRoot":"","sources":["../../../../src/bot/logic/building/artilleryUnit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,QAAQ,EAA2B,MAAM,wBAAwB,CAAC;AAEpF,OAAO,EAAmB,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAE9E,MAAM,OAAO,aAAa;IACtB,YACY,YAAoB,EACpB,cAAsB,EACtB,eAAuB,EACvB,UAAkB;QAHlB,iBAAY,GAAZ,YAAY,CAAQ;QACpB,mBAAc,GAAd,cAAc,CAAQ;QACtB,oBAAe,GAAf,eAAe,CAAQ;QACvB,eAAU,GAAV,UAAU,CAAQ;IAC3B,CAAC;IAEJ,oBAAoB,CAChB,IAAa,EACb,UAAsB,EACtB,WAAwB;QAExB,OAAO,SAAS,CAAC;IACrB,CAAC;IAED,WAAW,CACP,IAAa,EACb,UAAsB,EACtB,WAAwB,EACxB,WAAgC;QAEhC,MAAM,QAAQ,GAAG,uBAAuB,CAAC,IAAI,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;QACxE,IAAI,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC;QACjC,6EAA6E;QAC7E,IAAI,WAAW,IAAI,WAAW,CAAC,mBAAmB,GAAG,WAAW,CAAC,iCAAiC,EAAE;YAChG,QAAQ;gBACJ,IAAI,CAAC,cAAc;oBACnB,CAAC,WAAW,CAAC,iCAAiC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,CAAC,mBAAmB,CAAC,CAAC,CAAC;SACtG;QACD,IAAI,WAAW,IAAI,IAAI,CAAC,eAAe,GAAG,CAAC,EAAE;YACzC,+DAA+D;YAC/D,IAAI,WAAW,CAAC,wBAAwB,GAAG,WAAW,CAAC,iCAAiC,EAAE;gBACtF,QAAQ;oBACJ,IAAI,CAAC,eAAe;wBACpB,IAAI,CAAC,YAAY;wBACjB,CAAC,WAAW,CAAC,wBAAwB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,CAAC,iCAAiC,CAAC,CAAC,CAAC;aAC3G;iBAAM;gBACH,wEAAwE;gBACxE,QAAQ;oBACJ,CAAC,IAAI,CAAC,eAAe;wBACjB,IAAI,CAAC,YAAY;wBACjB,QAAQ,CAAC,IAAI,CACT,WAAW,CAAC,iCAAiC;4BACzC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,CAAC,wBAAwB,GAAG,WAAW,CAAC,oBAAoB,CAAC,CAC3F,CAAC;wBACN,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;aACtB;SACJ;QACD,OAAO,QAAQ,GAAG,CAAC,GAAG,GAAG,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC;IACzD,CAAC;IAED,WAAW,CACP,IAAa,EACb,UAAsB,EACtB,WAAwB,EACxB,WAAgC;QAEhC,OAAO,IAAI,CAAC;IAChB,CAAC;CACJ"}
|
|
@@ -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 {};
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
// A basic mission requests specific units.
|
|
2
|
-
export class BasicMission {
|
|
3
|
-
constructor(uniqueName, priority = 1, squads = []) {
|
|
4
|
-
this.uniqueName = uniqueName;
|
|
5
|
-
this.priority = priority;
|
|
6
|
-
this.squads = squads;
|
|
7
|
-
}
|
|
8
|
-
getUniqueName() {
|
|
9
|
-
return this.uniqueName;
|
|
10
|
-
}
|
|
11
|
-
isActive() {
|
|
12
|
-
return true;
|
|
13
|
-
}
|
|
14
|
-
removeSquad(squad) {
|
|
15
|
-
this.squads = this.squads.filter((s) => s != squad);
|
|
16
|
-
}
|
|
17
|
-
addSquad(squad) {
|
|
18
|
-
if (!this.squads.find((s) => s == squad)) {
|
|
19
|
-
this.squads.push(squad);
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
getSquads() {
|
|
23
|
-
return this.squads;
|
|
24
|
-
}
|
|
25
|
-
onSquadAdded(gameApi, playerData, threatData) { }
|
|
26
|
-
}
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
import { Mission, disbandMission, noop } from "./mission.js";
|
|
2
|
-
import { SquadExpansion } from "../squad/behaviours/expansionSquad.js";
|
|
3
|
-
import { Squad } from "../squad/squad.js";
|
|
4
|
-
/**
|
|
5
|
-
* A mission that tries to create an MCV (if it doesn't exist) and deploy it somewhere it can be deployed.
|
|
6
|
-
*/
|
|
7
|
-
export class ExpansionMission extends Mission {
|
|
8
|
-
constructor(uniqueName, priority) {
|
|
9
|
-
super(uniqueName, priority);
|
|
10
|
-
this.hadSquad = false;
|
|
11
|
-
}
|
|
12
|
-
onAiUpdate(gameApi, playerData, threatData) {
|
|
13
|
-
if (this.getSquad() === null) {
|
|
14
|
-
if (!this.hadSquad) {
|
|
15
|
-
this.hadSquad = true;
|
|
16
|
-
return this.setSquad(new Squad(this.getUniqueName(), new SquadExpansion(), this));
|
|
17
|
-
}
|
|
18
|
-
else {
|
|
19
|
-
return disbandMission();
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
else {
|
|
23
|
-
return noop();
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
export class ExpansionMissionFactory {
|
|
28
|
-
maybeCreateMission(gameApi, playerData, threatData, existingMissions) {
|
|
29
|
-
// No auto-expansion missions.
|
|
30
|
-
return null;
|
|
31
|
-
}
|
|
32
|
-
}
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
import { OrderType, SideType } from "@chronodivide/game-api";
|
|
2
|
-
import { disband, noop, requestUnits } from "../squadBehaviour.js";
|
|
3
|
-
const DEPLOY_COOLDOWN_TICKS = 30;
|
|
4
|
-
// Expansion or initial base.
|
|
5
|
-
export class SquadExpansion {
|
|
6
|
-
constructor() {
|
|
7
|
-
this.hasAttemptedDeployWith = null;
|
|
8
|
-
}
|
|
9
|
-
onAiUpdate(gameApi, actionsApi, playerData, squad, threatData) {
|
|
10
|
-
let myMcvName = playerData.country?.side == SideType.GDI ? "AMCV" : "SMCV";
|
|
11
|
-
const mcvs = squad.getUnitsOfType(gameApi, myMcvName);
|
|
12
|
-
if (mcvs.length === 0) {
|
|
13
|
-
// Perhaps we deployed already (or the unit was destroyed), end the mission.
|
|
14
|
-
if (this.hasAttemptedDeployWith !== null) {
|
|
15
|
-
return disband();
|
|
16
|
-
}
|
|
17
|
-
// We need an mcv!
|
|
18
|
-
return requestUnits(myMcvName, 100);
|
|
19
|
-
}
|
|
20
|
-
else if (!this.hasAttemptedDeployWith ||
|
|
21
|
-
gameApi.getCurrentTick() > this.hasAttemptedDeployWith.gameTick + DEPLOY_COOLDOWN_TICKS) {
|
|
22
|
-
actionsApi.orderUnits(mcvs.map((mcv) => mcv.id), OrderType.DeploySelected);
|
|
23
|
-
// Add a cooldown to deploy attempts.
|
|
24
|
-
this.hasAttemptedDeployWith = {
|
|
25
|
-
unitId: mcvs[0].id,
|
|
26
|
-
gameTick: gameApi.getCurrentTick(),
|
|
27
|
-
};
|
|
28
|
-
}
|
|
29
|
-
return noop();
|
|
30
|
-
}
|
|
31
|
-
}
|