@supalosa/chronodivide-bot 0.4.0 → 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.
Files changed (155) hide show
  1. package/.env.template +5 -0
  2. package/README.md +54 -47
  3. package/dist/bot/bot.js +14 -30
  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/awarenessImpl.js +132 -0
  8. package/dist/bot/logic/awarenessImpl.js.map +1 -0
  9. package/dist/bot/logic/building/ArtilleryUnit.js +2 -29
  10. package/dist/bot/logic/building/ArtilleryUnit.js.map +1 -0
  11. package/dist/bot/logic/building/antiAirStaticDefence.js +43 -0
  12. package/dist/bot/logic/building/antiAirStaticDefence.js.map +1 -0
  13. package/dist/bot/logic/building/antiGroundStaticDefence.js +7 -4
  14. package/dist/bot/logic/building/antiGroundStaticDefence.js.map +1 -1
  15. package/dist/bot/logic/building/basicAirUnit.js +2 -23
  16. package/dist/bot/logic/building/basicAirUnit.js.map +1 -1
  17. package/dist/bot/logic/building/basicBuilding.js +3 -2
  18. package/dist/bot/logic/building/basicBuilding.js.map +1 -1
  19. package/dist/bot/logic/building/basicGroundUnit.js +2 -43
  20. package/dist/bot/logic/building/basicGroundUnit.js.map +1 -1
  21. package/dist/bot/logic/building/building.js +55 -11
  22. package/dist/bot/logic/building/building.js.map +1 -0
  23. package/dist/bot/logic/building/buildingRules.js +10 -5
  24. package/dist/bot/logic/building/buildingRules.js.map +1 -1
  25. package/dist/bot/logic/building/common.js +19 -0
  26. package/dist/bot/logic/building/common.js.map +1 -0
  27. package/dist/bot/logic/building/harvester.js +2 -1
  28. package/dist/bot/logic/building/harvester.js.map +1 -1
  29. package/dist/bot/logic/building/queueController.js +69 -42
  30. package/dist/bot/logic/building/queueController.js.map +1 -1
  31. package/dist/bot/logic/common/utils.js +21 -0
  32. package/dist/bot/logic/common/utils.js.map +1 -1
  33. package/dist/bot/logic/composition/alliedCompositions.js +13 -0
  34. package/dist/bot/logic/composition/alliedCompositions.js.map +1 -0
  35. package/dist/bot/logic/composition/common.js +2 -0
  36. package/dist/bot/logic/composition/common.js.map +1 -0
  37. package/dist/bot/logic/composition/sovietCompositions.js +13 -0
  38. package/dist/bot/logic/composition/sovietCompositions.js.map +1 -0
  39. package/dist/bot/logic/mission/actionBatcher.js +92 -0
  40. package/dist/bot/logic/mission/actionBatcher.js.map +1 -0
  41. package/dist/bot/logic/mission/behaviours/combatSquad.js +124 -0
  42. package/dist/bot/logic/mission/behaviours/combatSquad.js.map +1 -0
  43. package/dist/bot/logic/mission/behaviours/common.js +58 -0
  44. package/dist/bot/logic/mission/behaviours/common.js.map +1 -0
  45. package/dist/bot/logic/mission/behaviours/engineerSquad.js +39 -0
  46. package/dist/bot/logic/mission/behaviours/engineerSquad.js.map +1 -0
  47. package/dist/bot/logic/mission/behaviours/expansionSquad.js +46 -0
  48. package/dist/bot/logic/mission/behaviours/expansionSquad.js.map +1 -0
  49. package/dist/bot/logic/mission/behaviours/retreatSquad.js +31 -0
  50. package/dist/bot/logic/mission/behaviours/retreatSquad.js.map +1 -0
  51. package/{src/bot/logic/squad/behaviours/scoutingSquad.ts → dist/bot/logic/mission/behaviours/scoutingSquad.js} +27 -51
  52. package/dist/bot/logic/mission/behaviours/scoutingSquad.js.map +1 -0
  53. package/dist/bot/logic/mission/mission.js +91 -19
  54. package/dist/bot/logic/mission/mission.js.map +1 -1
  55. package/dist/bot/logic/mission/missionController.js +262 -21
  56. package/dist/bot/logic/mission/missionController.js.map +1 -1
  57. package/dist/bot/logic/mission/missions/attackMission.js +113 -39
  58. package/dist/bot/logic/mission/missions/attackMission.js.map +1 -1
  59. package/dist/bot/logic/mission/missions/basicMission.js +13 -0
  60. package/dist/bot/logic/mission/missions/basicMission.js.map +1 -0
  61. package/dist/bot/logic/mission/missions/defenceMission.js +43 -28
  62. package/dist/bot/logic/mission/missions/defenceMission.js.map +1 -1
  63. package/dist/bot/logic/mission/missions/engineerMission.js +37 -7
  64. package/dist/bot/logic/mission/missions/engineerMission.js.map +1 -1
  65. package/dist/bot/logic/mission/missions/expansionMission.js +42 -6
  66. package/dist/bot/logic/mission/missions/expansionMission.js.map +1 -1
  67. package/dist/bot/logic/mission/missions/missionBehaviour.js +2 -0
  68. package/dist/bot/logic/mission/missions/missionBehaviour.js.map +1 -0
  69. package/dist/bot/logic/mission/missions/retreatMission.js +31 -5
  70. package/dist/bot/logic/mission/missions/retreatMission.js.map +1 -1
  71. package/dist/bot/logic/mission/missions/scoutingMission.js +103 -6
  72. package/dist/bot/logic/mission/missions/scoutingMission.js.map +1 -1
  73. package/dist/bot/logic/mission/missions/squads/combatSquad.js +116 -0
  74. package/dist/bot/logic/mission/missions/squads/combatSquad.js.map +1 -0
  75. package/dist/bot/logic/mission/missions/squads/common.js +58 -0
  76. package/dist/bot/logic/mission/missions/squads/common.js.map +1 -0
  77. package/dist/bot/logic/mission/missions/squads/squad.js +2 -0
  78. package/dist/bot/logic/mission/missions/squads/squad.js.map +1 -0
  79. package/dist/bot/logic/squad/behaviours/attackSquad.js +63 -56
  80. package/dist/bot/logic/squad/behaviours/combatSquad.js +21 -25
  81. package/dist/bot/logic/squad/behaviours/combatSquad.js.map +1 -1
  82. package/dist/bot/logic/squad/behaviours/common.js +11 -26
  83. package/dist/bot/logic/squad/behaviours/common.js.map +1 -1
  84. package/dist/bot/logic/squad/behaviours/defenceSquad.js +15 -2
  85. package/dist/bot/logic/squad/behaviours/engineerSquad.js +2 -4
  86. package/dist/bot/logic/squad/behaviours/engineerSquad.js.map +1 -1
  87. package/dist/bot/logic/squad/behaviours/expansionSquad.js +2 -4
  88. package/dist/bot/logic/squad/behaviours/expansionSquad.js.map +1 -1
  89. package/dist/bot/logic/squad/behaviours/retreatSquad.js +1 -4
  90. package/dist/bot/logic/squad/behaviours/retreatSquad.js.map +1 -1
  91. package/dist/bot/logic/squad/behaviours/scoutingSquad.js +18 -25
  92. package/dist/bot/logic/squad/behaviours/scoutingSquad.js.map +1 -1
  93. package/dist/bot/logic/squad/squad.js +10 -10
  94. package/dist/bot/logic/squad/squad.js.map +1 -1
  95. package/dist/bot/logic/squad/squadBehaviour.js.map +1 -1
  96. package/dist/bot/logic/squad/squadController.js +5 -17
  97. package/dist/bot/logic/squad/squadController.js.map +1 -1
  98. package/dist/bot/logic/threat/threatCalculator.js +5 -5
  99. package/dist/bot/logic/threat/threatCalculator.js.map +1 -1
  100. package/dist/exampleBot.js +45 -18
  101. package/dist/exampleBot.js.map +1 -1
  102. package/package.json +5 -4
  103. package/src/bot/bot.ts +19 -45
  104. package/src/bot/logic/awareness.ts +34 -22
  105. package/src/bot/logic/building/antiAirStaticDefence.ts +64 -0
  106. package/src/bot/logic/building/antiGroundStaticDefence.ts +7 -20
  107. package/src/bot/logic/building/artilleryUnit.ts +2 -28
  108. package/src/bot/logic/building/basicAirUnit.ts +2 -33
  109. package/src/bot/logic/building/basicBuilding.ts +8 -6
  110. package/src/bot/logic/building/basicGroundUnit.ts +2 -46
  111. package/src/bot/logic/building/buildingRules.ts +15 -9
  112. package/src/bot/logic/building/common.ts +23 -0
  113. package/src/bot/logic/building/harvester.ts +2 -1
  114. package/src/bot/logic/building/queueController.ts +98 -43
  115. package/src/bot/logic/common/utils.ts +28 -0
  116. package/src/bot/logic/composition/alliedCompositions.ts +22 -0
  117. package/src/bot/logic/composition/common.ts +3 -0
  118. package/src/bot/logic/composition/sovietCompositions.ts +21 -0
  119. package/src/bot/logic/{squad/behaviours → mission}/actionBatcher.ts +66 -7
  120. package/src/bot/logic/mission/mission.ts +186 -37
  121. package/src/bot/logic/mission/missionController.ts +340 -31
  122. package/src/bot/logic/mission/missionFactories.ts +3 -3
  123. package/src/bot/logic/mission/missions/attackMission.ts +181 -44
  124. package/src/bot/logic/mission/missions/defenceMission.ts +72 -45
  125. package/src/bot/logic/mission/missions/engineerMission.ts +67 -15
  126. package/src/bot/logic/mission/missions/expansionMission.ts +67 -14
  127. package/src/bot/logic/mission/missions/retreatMission.ts +50 -6
  128. package/src/bot/logic/mission/missions/scoutingMission.ts +138 -14
  129. package/src/bot/logic/{squad/behaviours → mission/missions/squads}/combatSquad.ts +56 -33
  130. package/src/bot/logic/{squad/behaviours → mission/missions/squads}/common.ts +11 -17
  131. package/src/bot/logic/mission/missions/squads/squad.ts +19 -0
  132. package/src/bot/logic/threat/threat.ts +15 -15
  133. package/src/bot/logic/threat/threatCalculator.ts +10 -10
  134. package/src/exampleBot.ts +50 -24
  135. package/.prettierrc +0 -5
  136. package/TODO.md +0 -15
  137. package/dist/bot/logic/building/artilleryUnit.js.map +0 -1
  138. package/dist/bot/logic/building/massedAntiGroundUnit.js +0 -20
  139. package/dist/bot/logic/building/queues.js +0 -19
  140. package/dist/bot/logic/knowledge.js +0 -1
  141. package/dist/bot/logic/mission/basicMission.js +0 -26
  142. package/dist/bot/logic/mission/expansionMission.js +0 -32
  143. package/dist/bot/logic/squad/behaviours/actionBatcher.js +0 -36
  144. package/dist/bot/logic/squad/behaviours/actionBatcher.js.map +0 -1
  145. package/dist/bot/logic/squad/behaviours/squadExpansion.js +0 -31
  146. package/dist/bot/logic/squad/behaviours/squadScouters.js +0 -8
  147. package/rules.ini +0 -23126
  148. package/src/bot/logic/mission/missions/oneTimeMission.ts +0 -33
  149. package/src/bot/logic/squad/behaviours/engineerSquad.ts +0 -58
  150. package/src/bot/logic/squad/behaviours/expansionSquad.ts +0 -64
  151. package/src/bot/logic/squad/behaviours/retreatSquad.ts +0 -50
  152. package/src/bot/logic/squad/squad.ts +0 -165
  153. package/src/bot/logic/squad/squadBehaviour.ts +0 -66
  154. package/src/bot/logic/squad/squadBehaviours.ts +0 -8
  155. package/src/bot/logic/squad/squadController.ts +0 -271
package/.env.template ADDED
@@ -0,0 +1,5 @@
1
+ SERVER_URL="wss://gserv-sea1.chronodivide.com"
2
+ CLIENT_URL="https://game.chronodivide.com/"
3
+ ONLINE_BOT_NAME="username_of_your_bot"
4
+ ONLINE_BOT_PASSWORD="password_of_your_bot"
5
+ PLAYER_NAME="username_of_human_account"
package/README.md CHANGED
@@ -1,27 +1,25 @@
1
1
  # Supalosa's Chrono Divide Bot
2
2
 
3
+ [中文版文档](README-CN.md)
4
+
3
5
  [Chrono Divide](https://chronodivide.com/) is a ground-up rebuild of Red Alert 2 in the browser. It is feature-complete and allows for online skirmish play against other players.
4
6
  It also provides [an API to build bots](https://discord.com/channels/771701199812558848/842700851520339988), as there is no built-in AI yet.
5
7
 
6
- This repository is one such implementation of a bot.
7
-
8
- ## Development State
8
+ This repository is one such implementation of a bot. The original template for the bot is available at [game-api-playground](https://github.com/chronodivide/game-api-playground/blob/master/README.md).
9
9
 
10
- Development on this is paused as I'm currently focusing on a Starcraft 2 bot instead.
11
- The bot only plays Allied, and is not particularly good at the game. Feel free to use its code as a training dummy against your own bot, or extend it if you'd like. Caveat: I'm not a professional AI dev, this was my first foray into this, nor am I particularly experienced with TypeScript or JS.
10
+ ## Development State and Future plans
12
11
 
13
- ## Future plans (on hold)
12
+ The developer of Chrono Divide has expressed interest in integrating this bot into the game directly. As a consequence, I am aiming to implement missing features to create a satisfactory AI opponent for humans.
13
+ Directionally, this means I am not looking to make this AI a perfect opponent with perfect compositions or micro, and instead hope that it can be a fun challenge for newer players.
14
14
 
15
- I was working on three things at once before I put this on hold:
15
+ See `TODO.md` for a granular list of structural changes and feature improvements that are planned for the bot.
16
16
 
17
- - Task System - Something to not only follow actual build orders, but manage attacks, harass/attack the enemy, perform scouting, expand to other bases etc.
18
- - Squad System - Ability to independently control more than one mass of units (i.e. squads), for example a Harass Squad directed by a Harass Task.
19
- - Map Control System - Ability to analyse the state of the map and decide whether to fight for control over areas. Currently we already divide the map into square regions with individual threat calculations, but don't really do much with that information.
20
-
21
- A lot of these concepts are being built into my Starcraft 2 bot, [Supabot](https://github.com/Supalosa/supabot) - maybe I'll come back to this when I'm done there.
17
+ Feel free to contribute to the repository, or even fork the repo and build your own version.
22
18
 
23
19
  ## Install instructions
24
20
 
21
+ Node 14 is required by the Chrono Divide API. Higher versions are not supported yet.
22
+
25
23
  ```sh
26
24
  npm install
27
25
  npm run build
@@ -30,61 +28,70 @@ npx cross-env MIX_DIR="C:\path_to_ra2_install_dir" npm start
30
28
 
31
29
  This will create a replay (`.rpl`) file that can be [imported into the live game](https://game.chronodivide.com/).
32
30
 
31
+ You can modify `exampleBot.ts` to configure the match. You will most likely want to look at the line with `const mapName = "..."` to change the map, or the `const offlineSettings1v1` to change the bot countries.
32
+
33
33
  ## Playing against the bot
34
34
 
35
- Contact the developer of Chrono Divide for details if you are seriously interested in playing against a bot (this one or your own).
35
+ Currently, playing against this bot **is only possible for developers**, because it requires you to run this repository from source. Follow these steps to set up online play.
36
36
 
37
- ## Debugging
37
+ ### Initial set up steps (one time only)
38
38
 
39
- ```sh
40
- npx cross-env MIX_DIR="C:\path_to_ra2_install_dir" npm --node-options="${NODE_OPTIONS} --inspect" start
41
- ```
39
+ 1. Create a Chronodivide account for your bot using the official client at [https://game.chronodivide.com].
40
+ 2. If you don't already have one, create a Chronodivide account for yourself using the same link,
41
+ 3. Copy `.env.template` to `.env`. The `.env` file is not checked into the repo.
42
+ 4. Set the value of `ONLINE_BOT_NAME` to the username of the bot from step 1.
43
+ 5. Set the value of `ONLINE_BOT_PASSWORD` to the password from step 1.
44
+ 6. Set the value of `PLAYER_NAME` to the human's account name.
45
+ 7. (Optional) Change `SERVER_URL` if you want to connect to another server. The Chronodivide accounts from step 1 and 2 need to be present on that server.
42
46
 
43
- ## Publishing
47
+ ### Running the bot and connecting to the game
44
48
 
45
- Have the npmjs token in ~/.npmrc or somewhere appropriate.
49
+ Start the bot with `ONLINE_MATCH=1`. For example:
46
50
 
51
+ ```sh
52
+ ONLINE_MATCH=1 npx cross-env MIX_DIR="${GAMEPATH}" npm --node-options="${NODE_OPTIONS} --inspect" start
47
53
  ```
48
- npm publish
54
+
55
+ The bot will connect to the server and should return output like this:
56
+
49
57
  ```
58
+ You may use the following link(s) to join, after the game is created:
50
59
 
51
- # ignore me
60
+ https://game.chronodivide.com/#/game/12345/supalosa
52
61
 
62
+
63
+ Press ENTER to create the game now...
53
64
  ```
54
- # dev pc
55
- export GAMEPATH="G:\Origin\Ra2_YurisRevenge\Command and Conquer Red Alert II"
56
- # dev laptop
57
- export GAMEPATH="D:\EA Games\Command and Conquer Red Alert II"
58
65
 
59
- ---
66
+ Navigate to the link, **log in using the human credentials first**, then hit ENTER in the terminal so the bot can create the game.
67
+ Do not hit ENTER too early, as there is a very narrow window for the human connect to the match.
68
+
69
+ ## Debugging
60
70
 
61
- # run without any debug
62
- npm run build && npx cross-env MIX_DIR="${GAMEPATH}" npm start
71
+ To generate a replay with debugging enabled:
63
72
 
64
- # run with attached debugger
65
- npm run build && npx cross-env MIX_DIR="${GAMEPATH}" npm --node-options="${NODE_OPTIONS} --inspect" start
73
+ ```sh
74
+ npx cross-env MIX_DIR="C:\path_to_ra2_install_dir" npm --node-options="${NODE_OPTIONS} --inspect" start
75
+ ```
66
76
 
67
- # run with attached debugger and verbose API logging
68
- npm run build && DEBUG_LOGGING="action" npx cross-env MIX_DIR="${GAMEPATH}" npm --node-options="${NODE_OPTIONS} --inspect" start
77
+ To log all actions generated by the bots:
69
78
 
70
- # DEBUG_LOGGING can also be narrowed down to a specific logger, e.g. "action" or "move"
79
+ ```sh
80
+ DEBUG_LOGGING="action" npx cross-env MIX_DIR="${GAMEPATH}" npm --node-options="${NODE_OPTIONS} --inspect" start
71
81
  ```
72
82
 
73
- ---
83
+ We also take advantage of the in-game bot debug functionality provided by CD. These are basically bot-only actions that are saved in the replay, but you must enable the visualisations in the CD client before watching the replay, by typing the following into the dev console:.
74
84
 
75
- ladder maps: https://github.com/chronodivide/pvpgn-server/blob/26bbbe39613751cff696a73f087ce5b4cd938fc8/conf/bnmaps.conf.in#L321-L328
85
+ ```
86
+ r.debug_text = true;
87
+ ```
88
+
89
+ This will debug the bot which has been configured with `setDebugMode(true)`, this is done in `exampleBot.ts`.
76
90
 
77
- CDR2 1v1 2_malibu_cliffs_le.map
78
- CDR2 1v1 4_country_swing_le_v2.map
79
- CDR2 1v1 mp01t4.map
80
- CDR2 1v1 tn04t2.map
81
- CDR2 1v1 mp10s4.map
82
- CDR2 1v1 heckcorners.map
83
- CDR2 1v1 4_montana_dmz_le.map
84
- CDR2 1v1 barrel.map
91
+ ## Publishing
85
92
 
86
- ---
93
+ Have the npmjs token in ~/.npmrc or somewhere appropriate.
87
94
 
88
- to play vs bot
89
- export SERVER_URL="wss://<region_server>"
90
- export CLIENT_URL="https://game.chronodivide.com/"
95
+ ```
96
+ npm publish
97
+ ```
package/dist/bot/bot.js CHANGED
@@ -1,9 +1,8 @@
1
- import { ApiEventType, Bot, QueueStatus, ObjectType, FactoryType, } from "@chronodivide/game-api";
1
+ import { ApiEventType, Bot, ObjectType, FactoryType } from "@chronodivide/game-api";
2
2
  import { determineMapBounds } from "./logic/map/map.js";
3
3
  import { SectorCache } from "./logic/map/sector.js";
4
4
  import { MissionController } from "./logic/mission/missionController.js";
5
- import { SquadController } from "./logic/squad/squadController.js";
6
- import { QUEUES, QueueController, queueTypeToName } from "./logic/building/queueController.js";
5
+ import { QueueController } from "./logic/building/queueController.js";
7
6
  import { MatchAwarenessImpl } from "./logic/awareness.js";
8
7
  import { formatTimeDuration } from "./logic/common/utils.js";
9
8
  const DEBUG_STATE_UPDATE_INTERVAL_SECONDS = 6;
@@ -18,7 +17,6 @@ export class SupalosaBot extends Bot {
18
17
  this.tickOfLastAttackOrder = 0;
19
18
  this.matchAwareness = null;
20
19
  this.missionController = new MissionController((message, sayInGame) => this.logBotStatus(message, sayInGame));
21
- this.squadController = new SquadController((message, sayInGame) => this.logBotStatus(message, sayInGame));
22
20
  this.queueController = new QueueController();
23
21
  }
24
22
  onGameStart(game) {
@@ -56,16 +54,13 @@ export class SupalosaBot extends Bot {
56
54
  this.logBotStatus(`No army or production left, quitting.`);
57
55
  this.actionsApi.quitGame();
58
56
  }
59
- // Build logic.
60
- this.queueController.onAiUpdate(game, this.productionApi, this.actionsApi, myPlayer, threatCache, (message) => this.logBotStatus(message));
61
- // Mission logic every 6 ticks
62
- if (this.gameApi.getCurrentTick() % 6 === 0) {
63
- this.missionController.onAiUpdate(game, myPlayer, this.matchAwareness, this.squadController);
64
- }
65
- // Squad logic every 3 ticks
57
+ // Mission logic every 3 ticks
66
58
  if (this.gameApi.getCurrentTick() % 3 === 0) {
67
- this.squadController.onAiUpdate(game, this.actionsApi, myPlayer, this.matchAwareness);
59
+ this.missionController.onAiUpdate(game, this.actionsApi, myPlayer, this.matchAwareness);
68
60
  }
61
+ const unitTypeRequests = this.missionController.getRequestedUnitTypes();
62
+ // Build logic.
63
+ this.queueController.onAiUpdate(game, this.productionApi, this.actionsApi, myPlayer, threatCache, unitTypeRequests, (message) => this.logBotStatus(message));
69
64
  }
70
65
  }
71
66
  getHumanTimestamp(game) {
@@ -85,27 +80,16 @@ export class SupalosaBot extends Bot {
85
80
  if (!this.getDebugMode()) {
86
81
  return;
87
82
  }
83
+ // Update the global debug text.
88
84
  const myPlayer = game.getPlayerData(this.name);
89
- const queueState = QUEUES.reduce((prev, queueType) => {
90
- if (this.productionApi.getQueueData(queueType).size === 0) {
91
- return prev;
92
- }
93
- const paused = this.productionApi.getQueueData(queueType).status === QueueStatus.OnHold;
94
- return (prev +
95
- " [" +
96
- queueTypeToName(queueType) +
97
- (paused ? " PAUSED" : "") +
98
- ": " +
99
- this.productionApi.getQueueData(queueType).items.map((item) => item.rules.name + "x" + item.quantity) +
100
- "]");
101
- }, "");
102
- let globalDebugText = `Cash: ${myPlayer.credits} | Queues: ${queueState}\n`;
103
85
  const harvesters = game.getVisibleUnits(this.name, "self", (r) => r.harvester).length;
104
- globalDebugText += `Harvesters: ${harvesters}\n`;
105
- globalDebugText += this.squadController.debugSquads(this.gameApi, this.actionsApi);
106
- this.missionController.logDebugOutput();
86
+ let globalDebugText = `Cash: ${myPlayer.credits} | Harvesters: ${harvesters}\n`;
87
+ globalDebugText += this.queueController.getGlobalDebugText(this.gameApi, this.productionApi);
88
+ globalDebugText += this.missionController.getGlobalDebugText(this.gameApi);
89
+ globalDebugText += this.matchAwareness?.getGlobalDebugText();
90
+ this.missionController.updateDebugText(this.actionsApi);
107
91
  // Tag enemy units with IDs
108
- game.getVisibleUnits(this.name, "hostile").forEach((unitId) => {
92
+ game.getVisibleUnits(this.name, "enemy").forEach((unitId) => {
109
93
  this.actionsApi.setUnitDebugText(unitId, unitId.toString());
110
94
  });
111
95
  this.actionsApi.setGlobalDebugText(globalDebugText);
@@ -1 +1 @@
1
- {"version":3,"file":"bot.js","sourceRoot":"","sources":["../../src/bot/bot.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,YAAY,EACZ,GAAG,EAGH,WAAW,EACX,UAAU,EACV,WAAW,GAEd,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,sCAAsC,CAAC;AACzE,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACnE,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,qCAAqC,CAAC;AAC/F,OAAO,EAAkB,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1E,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAE7D,MAAM,mCAAmC,GAAG,CAAC,CAAC;AAE9C,gDAAgD;AAChD,MAAM,iBAAiB,GAAG,EAAE,CAAC;AAC7B,MAAM,+BAA+B,GAAG,IAAI,CAAC,CAAC,wEAAwE;AAEtH,MAAM,OAAO,WAAY,SAAQ,GAAG;IAUhC,YACI,IAAY,EACZ,OAAe,EACP,cAAwB,EAAE,EAC1B,gBAAgB,IAAI;QAE5B,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAHb,gBAAW,GAAX,WAAW,CAAe;QAC1B,kBAAa,GAAb,aAAa,CAAO;QARxB,0BAAqB,GAAW,CAAC,CAAC;QAElC,mBAAc,GAA0B,IAAI,CAAC;QASjD,IAAI,CAAC,iBAAiB,GAAG,IAAI,iBAAiB,CAAC,CAAC,OAAO,EAAE,SAAS,EAAE,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC;QAC9G,IAAI,CAAC,eAAe,GAAG,IAAI,eAAe,CAAC,CAAC,OAAO,EAAE,SAAS,EAAE,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC;QAC1G,IAAI,CAAC,eAAe,GAAG,IAAI,eAAe,EAAE,CAAC;IACjD,CAAC;IAEQ,WAAW,CAAC,IAAa;QAC9B,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QACpC,MAAM,MAAM,GAAG,GAAG,CAAC;QACnB,MAAM,OAAO,GAAG,MAAM,GAAG,EAAE,CAAC;QAC5B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,CAAC;QAE/C,IAAI,CAAC,cAAc,GAAG,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACtD,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAE/C,IAAI,CAAC,cAAc,GAAG,IAAI,kBAAkB,CACxC,IAAI,EACJ,IAAI,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,cAAc,CAAC,EACjD,QAAQ,CAAC,aAAa,EACtB,CAAC,OAAO,EAAE,SAAS,EAAE,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,SAAS,CAAC,CAChE,CAAC;QACF,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QAEhD,IAAI,CAAC,YAAY,CAAC,eAAe,IAAI,CAAC,cAAc,CAAC,KAAK,KAAK,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC,CAAC;QAE7F,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,CAAC;IAC/F,CAAC;IAEQ,UAAU,CAAC,IAAa;QAC7B,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;YACtB,OAAO;SACV;QAED,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,cAAc,EAAE,CAAC;QAEzD,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,GAAG,iBAAiB,CAAC,GAAG,mCAAmC,KAAK,CAAC,EAAE;YACzF,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;SAC/B;QAED,IAAI,IAAI,CAAC,cAAc,EAAE,GAAG,IAAI,CAAC,SAAU,KAAK,CAAC,EAAE;YAC/C,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAE/C,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;YAE/C,IAAI,IAAI,CAAC,cAAc,EAAE,GAAG,iBAAiB,GAAG,+BAA+B,EAAE;gBAC7E,IAAI,CAAC,YAAY,CAAC,2BAA2B,+BAA+B,WAAW,CAAC,CAAC;gBACzF,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC;aAC9B;YAED,yBAAyB;YACzB,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC;YAC1F,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CACjC,IAAI,CAAC,IAAI,EACT,MAAM,EACN,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAC7E,CAAC;YACF,MAAM,mBAAmB,GAAG,IAAI,CAAC,eAAe,CAC5C,IAAI,CAAC,IAAI,EACT,MAAM,EACN,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,UAAU,CAAC,QAAQ,IAAI,CAAC,CAAC,OAAO,IAAI,WAAW,CAAC,IAAI,CACxE,CAAC;YACF,IAAI,SAAS,CAAC,MAAM,IAAI,CAAC,IAAI,mBAAmB,CAAC,MAAM,IAAI,CAAC,IAAI,QAAQ,CAAC,MAAM,IAAI,CAAC,EAAE;gBAClF,IAAI,CAAC,YAAY,CAAC,uCAAuC,CAAC,CAAC;gBAC3D,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC;aAC9B;YAED,eAAe;YACf,IAAI,CAAC,eAAe,CAAC,UAAU,CAC3B,IAAI,EACJ,IAAI,CAAC,aAAa,EAClB,IAAI,CAAC,UAAU,EACf,QAAQ,EACR,WAAW,EACX,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAC1C,CAAC;YAEF,8BAA8B;YAC9B,IAAI,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,GAAG,CAAC,KAAK,CAAC,EAAE;gBACzC,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;aAChG;YAED,4BAA4B;YAC5B,IAAI,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,GAAG,CAAC,KAAK,CAAC,EAAE;gBACzC,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,UAAU,EAAE,QAAQ,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;aACzF;SACJ;IACL,CAAC;IAEO,iBAAiB,CAAC,IAAa;QACnC,OAAO,kBAAkB,CAAC,IAAI,CAAC,cAAc,EAAE,GAAG,iBAAiB,CAAC,CAAC;IACzE,CAAC;IAEO,YAAY,CAAC,OAAe,EAAE,YAAqB,KAAK;QAC5D,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE;YACrB,OAAO;SACV;QACD,MAAM,SAAS,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACvD,OAAO,CAAC,GAAG,CAAC,IAAI,SAAS,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC,CAAC;QACtD,IAAI,SAAS,EAAE;YACX,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,GAAG,SAAS,KAAK,OAAO,EAAE,CAAC,CAAC;SACtD;IACL,CAAC;IAEO,gBAAgB,CAAC,IAAa;QAClC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE;YACtB,OAAO;SACV;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/C,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,SAAS,EAAE,EAAE;YACjD,IAAI,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,IAAI,KAAK,CAAC,EAAE;gBACvD,OAAO,IAAI,CAAC;aACf;YACD,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,MAAM,KAAK,WAAW,CAAC,MAAM,CAAC;YACxF,OAAO,CACH,IAAI;gBACJ,IAAI;gBACJ,eAAe,CAAC,SAAS,CAAC;gBAC1B,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;gBACzB,IAAI;gBACJ,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC;gBACrG,GAAG,CACN,CAAC;QACN,CAAC,EAAE,EAAE,CAAC,CAAC;QACP,IAAI,eAAe,GAAG,SAAS,QAAQ,CAAC,OAAO,cAAc,UAAU,IAAI,CAAC;QAC5E,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC;QACtF,eAAe,IAAI,eAAe,UAAU,IAAI,CAAC;QACjD,eAAe,IAAI,IAAI,CAAC,eAAe,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QACnF,IAAI,CAAC,iBAAiB,CAAC,cAAc,EAAE,CAAC;QAExC,2BAA2B;QAC3B,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;YAC1D,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;QAChE,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,UAAU,CAAC,kBAAkB,CAAC,eAAe,CAAC,CAAC;IACxD,CAAC;IAEQ,WAAW,CAAC,EAAY;QAC7B,QAAQ,EAAE,CAAC,IAAI,EAAE;YACb,KAAK,YAAY,CAAC,aAAa,CAAC,CAAC;gBAC7B,kCAAkC;gBAClC,IAAI,EAAE,CAAC,YAAY,EAAE,UAAU,IAAI,IAAI,CAAC,IAAI,EAAE;oBAC1C,IAAI,CAAC,qBAAqB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,GAAG,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,CAAC;iBAClG;gBACD,MAAM;aACT;YACD;gBACI,MAAM;SACb;IACL,CAAC;CACJ"}
1
+ {"version":3,"file":"bot.js","sourceRoot":"","sources":["../../src/bot/bot.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { Vector2 } from "@chronodivide/game-api";
2
2
  import { calculateGlobalThreat } from "./threat/threatCalculator.js";
3
- import { getDistanceBetweenPoints, getPointTowardsOtherPoint } from "./map/map.js";
3
+ import { getPointTowardsOtherPoint } from "./map/map.js";
4
4
  import { Circle, Quadtree } from "@timohausmann/quadtree-ts";
5
5
  import { ScoutingManager } from "./common/scout.js";
6
6
  const SECTORS_TO_UPDATE_PER_CYCLE = 8;
@@ -30,7 +30,7 @@ export class MatchAwarenessImpl {
30
30
  const intersections = this.hostileQuadTree.retrieve(new Circle({ x: searchX, y: searchY, r: radius }));
31
31
  return intersections
32
32
  .map(({ x, y, data: unitId }) => ({ x, y, unitId: unitId }))
33
- .filter(({ x, y }) => getDistanceBetweenPoints(new Vector2(x, y), new Vector2(searchX, searchY)) <= radius)
33
+ .filter(({ x, y }) => new Vector2(x, y).distanceTo(new Vector2(searchX, searchY)) <= radius)
34
34
  .filter(({ unitId }) => !!unitId);
35
35
  }
36
36
  getThreatCache() {
@@ -80,11 +80,11 @@ export class MatchAwarenessImpl {
80
80
  !game.areAlliedPlayers(playerData.name, other.name))
81
81
  .map((other) => other.name);
82
82
  // Build the quadtree, if this is too slow we should consider doing this periodically.
83
- const hostileUnitIds = game.getVisibleUnits(playerData.name, "hostile");
83
+ const hostileUnitIds = game.getVisibleUnits(playerData.name, "enemy");
84
84
  try {
85
85
  const hostileUnits = hostileUnitIds
86
- .map((id) => game.getUnitData(id))
87
- .filter((unit) => this.isHostileUnit(unit, hostilePlayerNames));
86
+ .map((id) => game.getGameObjectData(id))
87
+ .filter((gameObjectData) => gameObjectData !== undefined);
88
88
  rebuildQuadtree(this.hostileQuadTree, hostileUnits);
89
89
  }
90
90
  catch (err) {
@@ -97,9 +97,6 @@ export class MatchAwarenessImpl {
97
97
  this.logger(`${Math.round(visibility * 1000.0) / 10}% of tiles visible. Calculating threat.`);
98
98
  // Update the global threat cache
99
99
  this.threatCache = calculateGlobalThreat(game, playerData, visibility);
100
- this.logger(`Threat LAND: Them ${Math.round(this.threatCache.totalOffensiveLandThreat)}, us: ${Math.round(this.threatCache.totalAvailableAntiGroundFirepower)}.`);
101
- this.logger(`Threat DEFENSIVE: Them ${Math.round(this.threatCache.totalDefensiveThreat)}, us: ${Math.round(this.threatCache.totalDefensivePower)}.`);
102
- this.logger(`Threat AIR: Them ${Math.round(this.threatCache.totalOffensiveAirThreat)}, us: ${Math.round(this.threatCache.totalAvailableAntiAirFirepower)}.`);
103
100
  // As the game approaches 2 hours, be more willing to attack. (15 ticks per second)
104
101
  const gameLengthFactor = Math.max(0, 1.0 - game.getCurrentTick() / (15 * 7200.0));
105
102
  this.logger(`Game length multiplier: ${gameLengthFactor}`);
@@ -128,5 +125,13 @@ export class MatchAwarenessImpl {
128
125
  this.mainRallyPoint = getPointTowardsOtherPoint(game, playerData.startLocation, enemy.startLocation, 10, 10, 0);
129
126
  }
130
127
  }
128
+ getGlobalDebugText() {
129
+ if (!this.threatCache) {
130
+ return undefined;
131
+ }
132
+ return (`Threat LAND: Them ${Math.round(this.threatCache.totalOffensiveLandThreat)}, us: ${Math.round(this.threatCache.totalAvailableAntiGroundFirepower)}.\n` +
133
+ `Threat DEFENSIVE: Them ${Math.round(this.threatCache.totalDefensiveThreat)}, us: ${Math.round(this.threatCache.totalDefensivePower)}.\n` +
134
+ `Threat AIR: Them ${Math.round(this.threatCache.totalOffensiveAirThreat)}, us: ${Math.round(this.threatCache.totalAvailableAntiAirFirepower)}.`);
135
+ }
131
136
  }
132
137
  //# sourceMappingURL=awareness.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"awareness.js","sourceRoot":"","sources":["../../../src/bot/logic/awareness.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"awareness.js","sourceRoot":"","sources":["../../../src/bot/logic/awareness.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,132 @@
1
+ import { ObjectType } from "@chronodivide/game-api";
2
+ import { calculateGlobalThreat } from "./threat/threatCalculator.js";
3
+ import { getDistanceBetweenPoints, getPointTowardsOtherPoint } from "./map/map.js";
4
+ import { Circle, Quadtree } from "@timohausmann/quadtree-ts";
5
+ import { ScoutingManager } from "./common/scout";
6
+ const SECTORS_TO_UPDATE_PER_CYCLE = 8;
7
+ const RALLY_POINT_UPDATE_INTERVAL_TICKS = 60;
8
+ const THREAT_UPDATE_INTERVAL_TICKS = 30;
9
+ const rebuildQuadtree = (quadtree, units) => {
10
+ quadtree.clear();
11
+ units.forEach((unit) => {
12
+ quadtree.insert(new Circle({ x: unit.tile.rx, y: unit.tile.ry, r: 1, data: unit.id }));
13
+ });
14
+ };
15
+ export class MatchAwarenessImpl {
16
+ constructor(threatCache, sectorCache, mainRallyPoint, logger) {
17
+ this.threatCache = threatCache;
18
+ this.sectorCache = sectorCache;
19
+ this.mainRallyPoint = mainRallyPoint;
20
+ this.logger = logger;
21
+ this._shouldAttack = false;
22
+ const { x: width, y: height } = sectorCache.getMapBounds();
23
+ this.hostileQuadTree = new Quadtree({ width, height });
24
+ this.scoutingManager = new ScoutingManager(logger);
25
+ }
26
+ getHostilesNearPoint2d(point, radius) {
27
+ return this.getHostilesNearPoint(point.x, point.y, radius);
28
+ }
29
+ getHostilesNearPoint(searchX, searchY, radius) {
30
+ const intersections = this.hostileQuadTree.retrieve(new Circle({ x: searchX, y: searchY, r: radius }));
31
+ return intersections
32
+ .map(({ x, y, data: unitId }) => ({ x, y, unitId: unitId }))
33
+ .filter(({ x, y }) => getDistanceBetweenPoints({ x, y }, { x: searchX, y: searchY }) <= radius)
34
+ .filter(({ unitId }) => !!unitId);
35
+ }
36
+ getThreatCache() {
37
+ return this.threatCache;
38
+ }
39
+ getSectorCache() {
40
+ return this.sectorCache;
41
+ }
42
+ getMainRallyPoint() {
43
+ return this.mainRallyPoint;
44
+ }
45
+ getScoutingManager() {
46
+ return this.scoutingManager;
47
+ }
48
+ shouldAttack() {
49
+ return this._shouldAttack;
50
+ }
51
+ checkShouldAttack(threatCache, threatFactor) {
52
+ let scaledGroundPower = Math.pow(threatCache.totalAvailableAntiGroundFirepower, 1.025);
53
+ let scaledGroundThreat = (threatFactor * threatCache.totalOffensiveLandThreat + threatCache.totalDefensiveThreat) * 1.1;
54
+ let scaledAirPower = Math.pow(threatCache.totalAvailableAirPower, 1.025);
55
+ let scaledAirThreat = (threatFactor * threatCache.totalOffensiveAntiAirThreat + threatCache.totalDefensiveThreat) * 1.1;
56
+ return scaledGroundPower > scaledGroundThreat || scaledAirPower > scaledAirThreat;
57
+ }
58
+ isHostileUnit(unit, hostilePlayerNames) {
59
+ if (!unit) {
60
+ return false;
61
+ }
62
+ return hostilePlayerNames.includes(unit.owner);
63
+ }
64
+ onGameStart(gameApi, playerData) {
65
+ this.scoutingManager.onGameStart(gameApi, playerData, this.sectorCache);
66
+ }
67
+ onAiUpdate(game, playerData) {
68
+ const sectorCache = this.sectorCache;
69
+ sectorCache.updateSectors(game.getCurrentTick(), SECTORS_TO_UPDATE_PER_CYCLE, game.mapApi, playerData);
70
+ this.scoutingManager.onAiUpdate(game, playerData, this);
71
+ let updateRatio = sectorCache?.getSectorUpdateRatio(game.getCurrentTick() - game.getTickRate() * 60);
72
+ if (updateRatio && updateRatio < 1.0) {
73
+ this.logger(`${updateRatio * 100.0}% of sectors updated in last 60 seconds.`);
74
+ }
75
+ const hostilePlayerNames = game
76
+ .getPlayers()
77
+ .map((name) => game.getPlayerData(name))
78
+ .filter((other) => other.name !== playerData.name &&
79
+ other.isCombatant &&
80
+ !game.areAlliedPlayers(playerData.name, other.name))
81
+ .map((other) => other.name);
82
+ // Build the quadtree, if this is too slow we should consider doing this periodically.
83
+ const hostileUnitIds = game.getVisibleUnits(playerData.name, "hostile", (r) => r.isSelectableCombatant || r.type === ObjectType.Building);
84
+ try {
85
+ const hostileUnits = hostileUnitIds
86
+ .map((id) => game.getUnitData(id))
87
+ .filter((unit) => this.isHostileUnit(unit, hostilePlayerNames));
88
+ rebuildQuadtree(this.hostileQuadTree, hostileUnits);
89
+ }
90
+ catch (err) {
91
+ // Hack. Will be fixed soon.
92
+ console.error(`caught error`, hostileUnitIds);
93
+ }
94
+ if (game.getCurrentTick() % THREAT_UPDATE_INTERVAL_TICKS == 0) {
95
+ let visibility = sectorCache?.getOverallVisibility();
96
+ if (visibility) {
97
+ this.logger(`${Math.round(visibility * 1000.0) / 10}% of tiles visible. Calculating threat.`);
98
+ // Update the global threat cache
99
+ this.threatCache = calculateGlobalThreat(game, playerData, visibility);
100
+ this.logger(`Threat LAND: Them ${Math.round(this.threatCache.totalOffensiveLandThreat)}, us: ${Math.round(this.threatCache.totalAvailableAntiGroundFirepower)}.`);
101
+ this.logger(`Threat DEFENSIVE: Them ${Math.round(this.threatCache.totalDefensiveThreat)}, us: ${Math.round(this.threatCache.totalDefensivePower)}.`);
102
+ this.logger(`Threat AIR: Them ${Math.round(this.threatCache.totalOffensiveAirThreat)}, us: ${Math.round(this.threatCache.totalAvailableAntiAirFirepower)}.`);
103
+ // As the game approaches 2 hours, be more willing to attack. (15 ticks per second)
104
+ const gameLengthFactor = Math.max(0, 1.0 - game.getCurrentTick() / (15 * 7200.0));
105
+ this.logger(`Game length multiplier: ${gameLengthFactor}`);
106
+ if (!this._shouldAttack) {
107
+ // If not attacking, make it harder to switch to attack mode by multiplying the opponent's threat.
108
+ this._shouldAttack = this.checkShouldAttack(this.threatCache, 1.25 * gameLengthFactor);
109
+ if (this._shouldAttack) {
110
+ this.logger(`Globally switched to attack mode.`);
111
+ }
112
+ }
113
+ else {
114
+ // If currently attacking, make it harder to switch to defence mode my dampening the opponent's threat.
115
+ this._shouldAttack = this.checkShouldAttack(this.threatCache, 0.75 * gameLengthFactor);
116
+ if (!this._shouldAttack) {
117
+ this.logger(`Globally switched to defence mode.`);
118
+ }
119
+ }
120
+ }
121
+ }
122
+ // Update rally point every few ticks.
123
+ if (game.getCurrentTick() % RALLY_POINT_UPDATE_INTERVAL_TICKS === 0) {
124
+ const enemyPlayers = game
125
+ .getPlayers()
126
+ .filter((p) => p !== playerData.name && !game.areAlliedPlayers(playerData.name, p));
127
+ const enemy = game.getPlayerData(enemyPlayers[0]);
128
+ this.mainRallyPoint = getPointTowardsOtherPoint(game, playerData.startLocation, enemy.startLocation, 10, 10, 0);
129
+ }
130
+ }
131
+ }
132
+ //# sourceMappingURL=awarenessImpl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"awarenessImpl.js","sourceRoot":"","sources":["../../../src/bot/logic/awarenessImpl.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,3 @@
1
- import { GameMath } from "@chronodivide/game-api";
2
- import { numBuildingsOwnedOfType } from "./buildingRules.js";
3
1
  export class ArtilleryUnit {
4
2
  constructor(basePriority, artilleryPower, antiGroundPower, baseAmount) {
5
3
  this.basePriority = basePriority;
@@ -11,33 +9,8 @@ export class ArtilleryUnit {
11
9
  return undefined;
12
10
  }
13
11
  getPriority(game, playerData, technoRules, threatCache) {
14
- const numOwned = numBuildingsOwnedOfType(game, playerData, technoRules);
15
- let priority = this.basePriority;
16
- // If the enemy's defensive power is increasing we will start to build these.
17
- if (threatCache && threatCache.totalDefensivePower > threatCache.totalAvailableAntiGroundFirepower) {
18
- priority +=
19
- this.artilleryPower *
20
- (threatCache.totalAvailableAntiGroundFirepower / Math.max(1, threatCache.totalDefensivePower));
21
- }
22
- if (threatCache && this.antiGroundPower > 0) {
23
- // If the enemy's power is increasing we should try to keep up.
24
- if (threatCache.totalOffensiveLandThreat > threatCache.totalAvailableAntiGroundFirepower) {
25
- priority +=
26
- this.antiGroundPower *
27
- this.basePriority *
28
- (threatCache.totalOffensiveLandThreat / Math.max(1, threatCache.totalAvailableAntiGroundFirepower));
29
- }
30
- else {
31
- // But also, if our power dwarfs the enemy, keep pressing the advantage.
32
- priority +=
33
- (this.antiGroundPower *
34
- this.basePriority *
35
- GameMath.sqrt(threatCache.totalAvailableAntiGroundFirepower /
36
- Math.max(1, threatCache.totalOffensiveLandThreat + threatCache.totalDefensiveThreat))) /
37
- (numOwned + 1);
38
- }
39
- }
40
- return priority * (1.0 - numOwned / this.baseAmount);
12
+ // Units aren't built automatically, but are instead requested by missions.
13
+ return 0;
41
14
  }
42
15
  getMaxCount(game, playerData, technoRules, threatCache) {
43
16
  return null;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"artilleryUnit.js","sourceRoot":"","sources":["../../../../src/bot/logic/building/artilleryUnit.ts"],"names":[],"mappings":"AAIA,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,2EAA2E;QAC3E,OAAO,CAAC,CAAC;IACb,CAAC;IAED,WAAW,CACP,IAAa,EACb,UAAsB,EACtB,WAAwB,EACxB,WAAgC;QAEhC,OAAO,IAAI,CAAC;IAChB,CAAC;CACJ"}
@@ -0,0 +1,43 @@
1
+ import { getPointTowardsOtherPoint } from "../map/map.js";
2
+ import { getDefaultPlacementLocation, numBuildingsOwnedOfType } from "./buildingRules.js";
3
+ export class AntiAirStaticDefence {
4
+ constructor(basePriority, baseAmount, airStrength) {
5
+ this.basePriority = basePriority;
6
+ this.baseAmount = baseAmount;
7
+ this.airStrength = airStrength;
8
+ }
9
+ getPlacementLocation(game, playerData, technoRules) {
10
+ // Prefer front towards enemy.
11
+ let startLocation = playerData.startLocation;
12
+ let players = game.getPlayers();
13
+ let enemyFacingLocationCandidates = [];
14
+ for (let i = 0; i < players.length; ++i) {
15
+ let playerName = players[i];
16
+ if (playerName == playerData.name) {
17
+ continue;
18
+ }
19
+ let enemyPlayer = game.getPlayerData(playerName);
20
+ enemyFacingLocationCandidates.push(getPointTowardsOtherPoint(game, startLocation, enemyPlayer.startLocation, 4, 16, 1.5));
21
+ }
22
+ let selectedLocation = enemyFacingLocationCandidates[Math.floor(game.generateRandom() * enemyFacingLocationCandidates.length)];
23
+ return getDefaultPlacementLocation(game, playerData, selectedLocation, technoRules, false, 0);
24
+ }
25
+ getPriority(game, playerData, technoRules, threatCache) {
26
+ if (threatCache) {
27
+ let denominator = threatCache.totalAvailableAntiAirFirepower + this.airStrength;
28
+ if (threatCache.totalOffensiveAirThreat > denominator * 1.1) {
29
+ return this.basePriority * (threatCache.totalOffensiveAirThreat / Math.max(1, denominator));
30
+ }
31
+ else {
32
+ return 0;
33
+ }
34
+ }
35
+ const strengthPerCost = (this.airStrength / technoRules.cost) * 1000;
36
+ const numOwned = numBuildingsOwnedOfType(game, playerData, technoRules);
37
+ return this.basePriority * (1.0 - numOwned / this.baseAmount) * strengthPerCost;
38
+ }
39
+ getMaxCount(game, playerData, technoRules, threatCache) {
40
+ return null;
41
+ }
42
+ }
43
+ //# sourceMappingURL=antiAirStaticDefence.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"antiAirStaticDefence.js","sourceRoot":"","sources":["../../../../src/bot/logic/building/antiAirStaticDefence.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAC;AAE1D,OAAO,EAAmB,2BAA2B,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAE3G,MAAM,OAAO,oBAAoB;IAC7B,YACY,YAAoB,EACpB,UAAkB,EAClB,WAAmB;QAFnB,iBAAY,GAAZ,YAAY,CAAQ;QACpB,eAAU,GAAV,UAAU,CAAQ;QAClB,gBAAW,GAAX,WAAW,CAAQ;IAC5B,CAAC;IAEJ,oBAAoB,CAChB,IAAa,EACb,UAAsB,EACtB,WAAwB;QAExB,8BAA8B;QAC9B,IAAI,aAAa,GAAG,UAAU,CAAC,aAAa,CAAC;QAC7C,IAAI,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QAChC,IAAI,6BAA6B,GAAc,EAAE,CAAC;QAClD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE;YACrC,IAAI,UAAU,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;YAC5B,IAAI,UAAU,IAAI,UAAU,CAAC,IAAI,EAAE;gBAC/B,SAAS;aACZ;YACD,IAAI,WAAW,GAAG,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;YACjD,6BAA6B,CAAC,IAAI,CAC9B,yBAAyB,CAAC,IAAI,EAAE,aAAa,EAAE,WAAW,CAAC,aAAa,EAAE,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,CACxF,CAAC;SACL;QACD,IAAI,gBAAgB,GAChB,6BAA6B,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,EAAE,GAAG,6BAA6B,CAAC,MAAM,CAAC,CAAC,CAAC;QAC5G,OAAO,2BAA2B,CAAC,IAAI,EAAE,UAAU,EAAE,gBAAgB,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;IAClG,CAAC;IAED,WAAW,CACP,IAAa,EACb,UAAsB,EACtB,WAAwB,EACxB,WAAgC;QAEhC,IAAI,WAAW,EAAE;YACb,IAAI,WAAW,GAAG,WAAW,CAAC,8BAA8B,GAAG,IAAI,CAAC,WAAW,CAAC;YAChF,IAAI,WAAW,CAAC,uBAAuB,GAAG,WAAW,GAAG,GAAG,EAAE;gBACzD,OAAO,IAAI,CAAC,YAAY,GAAG,CAAC,WAAW,CAAC,uBAAuB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC;aAC/F;iBAAM;gBACH,OAAO,CAAC,CAAC;aACZ;SACJ;QACD,MAAM,eAAe,GAAG,CAAC,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;QACrE,MAAM,QAAQ,GAAG,uBAAuB,CAAC,IAAI,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;QACxE,OAAO,IAAI,CAAC,YAAY,GAAG,CAAC,GAAG,GAAG,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,eAAe,CAAC;IACpF,CAAC;IAED,WAAW,CACP,IAAa,EACb,UAAsB,EACtB,WAAwB,EACxB,WAAgC;QAEhC,OAAO,IAAI,CAAC;IAChB,CAAC;CACJ"}
@@ -1,10 +1,10 @@
1
1
  import { getPointTowardsOtherPoint } from "../map/map.js";
2
2
  import { getDefaultPlacementLocation, numBuildingsOwnedOfType } from "./buildingRules.js";
3
3
  export class AntiGroundStaticDefence {
4
- constructor(basePriority, baseAmount, strength) {
4
+ constructor(basePriority, baseAmount, groundStrength) {
5
5
  this.basePriority = basePriority;
6
6
  this.baseAmount = baseAmount;
7
- this.strength = strength;
7
+ this.groundStrength = groundStrength;
8
8
  }
9
9
  getPlacementLocation(game, playerData, technoRules) {
10
10
  // Prefer front towards enemy.
@@ -25,12 +25,15 @@ export class AntiGroundStaticDefence {
25
25
  getPriority(game, playerData, technoRules, threatCache) {
26
26
  // If the enemy's ground power is increasing we should try to keep up.
27
27
  if (threatCache) {
28
- let denominator = threatCache.totalAvailableAntiGroundFirepower + threatCache.totalDefensivePower + this.strength;
28
+ let denominator = threatCache.totalAvailableAntiGroundFirepower + threatCache.totalDefensivePower + this.groundStrength;
29
29
  if (threatCache.totalOffensiveLandThreat > denominator * 1.1) {
30
30
  return this.basePriority * (threatCache.totalOffensiveLandThreat / Math.max(1, denominator));
31
31
  }
32
+ else {
33
+ return 0;
34
+ }
32
35
  }
33
- const strengthPerCost = (this.strength / technoRules.cost) * 1000;
36
+ const strengthPerCost = (this.groundStrength / technoRules.cost) * 1000;
34
37
  const numOwned = numBuildingsOwnedOfType(game, playerData, technoRules);
35
38
  return this.basePriority * (1.0 - numOwned / this.baseAmount) * strengthPerCost;
36
39
  }