@v12-engine/engine 0.1.1 → 0.4.0

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 (951) hide show
  1. package/dist/abilities/amounts.d.ts +28 -0
  2. package/dist/abilities/amounts.js +74 -0
  3. package/dist/abilities/amounts.js.map +1 -0
  4. package/dist/abilities/buffs.d.ts +106 -6
  5. package/dist/abilities/buffs.js +443 -0
  6. package/dist/abilities/buffs.js.map +1 -0
  7. package/dist/abilities/castTold.d.ts +2 -0
  8. package/dist/abilities/castTold.js +66 -0
  9. package/dist/abilities/castTold.js.map +1 -0
  10. package/dist/abilities/chance.d.ts +38 -0
  11. package/dist/abilities/chance.js +77 -0
  12. package/dist/abilities/chance.js.map +1 -0
  13. package/dist/abilities/charges.d.ts +18 -0
  14. package/dist/abilities/charges.js +101 -0
  15. package/dist/abilities/charges.js.map +1 -0
  16. package/dist/abilities/control.d.ts +28 -0
  17. package/dist/abilities/control.js +113 -0
  18. package/dist/abilities/control.js.map +1 -0
  19. package/dist/abilities/dispel.js +51 -0
  20. package/dist/abilities/dispel.js.map +1 -0
  21. package/dist/abilities/effectFields.d.ts +1 -1
  22. package/dist/abilities/effectFields.js +676 -0
  23. package/dist/abilities/effectFields.js.map +1 -0
  24. package/dist/abilities/effectIndex.d.ts +27 -0
  25. package/dist/abilities/effectIndex.js +64 -0
  26. package/dist/abilities/effectIndex.js.map +1 -0
  27. package/dist/abilities/effects/buff.d.ts +9 -3
  28. package/dist/abilities/effects/buff.js +84 -0
  29. package/dist/abilities/effects/buff.js.map +1 -0
  30. package/dist/abilities/effects/conditions.d.ts +2 -0
  31. package/dist/abilities/effects/conditions.js +41 -0
  32. package/dist/abilities/effects/conditions.js.map +1 -0
  33. package/dist/abilities/effects/core.js +54 -0
  34. package/dist/abilities/effects/core.js.map +1 -0
  35. package/dist/abilities/effects/damage.d.ts +1 -1
  36. package/dist/abilities/effects/damage.js +43 -0
  37. package/dist/abilities/effects/damage.js.map +1 -0
  38. package/dist/abilities/effects/heal.d.ts +2 -2
  39. package/dist/abilities/effects/heal.js +51 -0
  40. package/dist/abilities/effects/heal.js.map +1 -0
  41. package/dist/abilities/effects/missile.d.ts +13 -1
  42. package/dist/abilities/effects/missile.js +104 -0
  43. package/dist/abilities/effects/missile.js.map +1 -0
  44. package/dist/abilities/effects/morph.d.ts +5 -0
  45. package/dist/abilities/effects/morph.js +43 -0
  46. package/dist/abilities/effects/morph.js.map +1 -0
  47. package/dist/abilities/effects/moves.d.ts +16 -4
  48. package/dist/abilities/effects/moves.js +212 -0
  49. package/dist/abilities/effects/moves.js.map +1 -0
  50. package/dist/abilities/effects/passives.d.ts +19 -9
  51. package/dist/abilities/effects/passives.js +131 -0
  52. package/dist/abilities/effects/passives.js.map +1 -0
  53. package/dist/abilities/effects/proxy.d.ts +5 -0
  54. package/dist/abilities/effects/proxy.js +60 -0
  55. package/dist/abilities/effects/proxy.js.map +1 -0
  56. package/dist/abilities/effects/sight.d.ts +2 -2
  57. package/dist/abilities/effects/sight.js +39 -0
  58. package/dist/abilities/effects/sight.js.map +1 -0
  59. package/dist/abilities/effects/spawn.d.ts +5 -2
  60. package/dist/abilities/effects/spawn.js +40 -0
  61. package/dist/abilities/effects/spawn.js.map +1 -0
  62. package/dist/abilities/effects/timed.d.ts +2 -2
  63. package/dist/abilities/effects/timed.js +96 -0
  64. package/dist/abilities/effects/timed.js.map +1 -0
  65. package/dist/abilities/effects/trade.d.ts +1 -1
  66. package/dist/abilities/effects/trade.js +25 -0
  67. package/dist/abilities/effects/trade.js.map +1 -0
  68. package/dist/abilities/effects.d.ts +97 -23
  69. package/dist/abilities/effects.js +860 -0
  70. package/dist/abilities/effects.js.map +1 -0
  71. package/dist/abilities/land.d.ts +38 -4
  72. package/dist/abilities/land.js +189 -0
  73. package/dist/abilities/land.js.map +1 -0
  74. package/dist/abilities/recast.d.ts +45 -0
  75. package/dist/abilities/recast.js +118 -0
  76. package/dist/abilities/recast.js.map +1 -0
  77. package/dist/abilities/scaled.js +40 -0
  78. package/dist/abilities/scaled.js.map +1 -0
  79. package/dist/abilities/screen.d.ts +6 -0
  80. package/dist/abilities/screen.js +83 -0
  81. package/dist/abilities/screen.js.map +1 -0
  82. package/dist/abilities/shapes.d.ts +66 -0
  83. package/dist/abilities/shapes.js +122 -0
  84. package/dist/abilities/shapes.js.map +1 -0
  85. package/dist/abilities/text.d.ts +14 -2
  86. package/dist/abilities/text.js +204 -0
  87. package/dist/abilities/text.js.map +1 -0
  88. package/dist/abilities/triggers.d.ts +98 -0
  89. package/dist/abilities/triggers.js +351 -0
  90. package/dist/abilities/triggers.js.map +1 -0
  91. package/dist/abilityChanges.d.ts +131 -0
  92. package/dist/abilityChanges.js +345 -0
  93. package/dist/abilityChanges.js.map +1 -0
  94. package/dist/ai/area.d.ts +4 -1
  95. package/dist/ai/brain.d.ts +4 -1
  96. package/dist/ai/brain.js +844 -0
  97. package/dist/ai/brain.js.map +1 -0
  98. package/dist/ai/budget.js +74 -0
  99. package/dist/ai/budget.js.map +1 -0
  100. package/dist/ai/checks.d.ts +9 -1
  101. package/dist/ai/checks.js +242 -0
  102. package/dist/ai/checks.js.map +1 -0
  103. package/dist/ai/computer.d.ts +11 -4
  104. package/dist/ai/computer.js +251 -0
  105. package/dist/ai/computer.js.map +1 -0
  106. package/dist/ai/defence.d.ts +4 -0
  107. package/dist/ai/defence.js +430 -0
  108. package/dist/ai/defence.js.map +1 -0
  109. package/dist/ai/define.d.ts +3 -2
  110. package/dist/ai/define.js +31 -0
  111. package/dist/ai/define.js.map +1 -0
  112. package/dist/ai/economy.d.ts +10 -7
  113. package/dist/ai/economy.js +780 -0
  114. package/dist/ai/economy.js.map +1 -0
  115. package/dist/ai/geometry.js +38 -0
  116. package/dist/ai/geometry.js.map +1 -0
  117. package/dist/ai/goals.d.ts +1 -0
  118. package/dist/ai/goals.js +560 -0
  119. package/dist/ai/goals.js.map +1 -0
  120. package/dist/ai/knowledge.d.ts +72 -7
  121. package/dist/ai/knowledge.js +804 -0
  122. package/dist/ai/knowledge.js.map +1 -0
  123. package/dist/ai/lanes.d.ts +10 -2
  124. package/dist/ai/lanes.js +715 -0
  125. package/dist/ai/lanes.js.map +1 -0
  126. package/dist/ai/melee/build.js +264 -0
  127. package/dist/ai/melee/build.js.map +1 -0
  128. package/dist/ai/melee/goals.d.ts +7 -0
  129. package/dist/ai/melee/goals.js +720 -0
  130. package/dist/ai/melee/goals.js.map +1 -0
  131. package/dist/ai/melee/heroes.js +68 -0
  132. package/dist/ai/melee/heroes.js.map +1 -0
  133. package/dist/ai/melee/index.d.ts +1 -1
  134. package/dist/ai/melee/index.js +51 -0
  135. package/dist/ai/melee/index.js.map +1 -0
  136. package/dist/ai/melee/production.js +29 -0
  137. package/dist/ai/melee/production.js.map +1 -0
  138. package/dist/ai/melee/surrender.js +64 -0
  139. package/dist/ai/melee/surrender.js.map +1 -0
  140. package/dist/ai/micro.d.ts +9 -0
  141. package/dist/ai/micro.js +1316 -0
  142. package/dist/ai/micro.js.map +1 -0
  143. package/dist/ai/mission.d.ts +9 -2
  144. package/dist/ai/mission.js +538 -0
  145. package/dist/ai/mission.js.map +1 -0
  146. package/dist/ai/missionRules.d.ts +1 -1
  147. package/dist/ai/missionRules.js +26 -0
  148. package/dist/ai/missionRules.js.map +1 -0
  149. package/dist/ai/module.d.ts +6 -2
  150. package/dist/ai/module.js +37 -0
  151. package/dist/ai/module.js.map +1 -0
  152. package/dist/ai/options.d.ts +3 -3
  153. package/dist/ai/plans/build.d.ts +20 -1
  154. package/dist/ai/plans/build.js +608 -0
  155. package/dist/ai/plans/build.js.map +1 -0
  156. package/dist/ai/plans/placement.d.ts +4 -1
  157. package/dist/ai/plans/placement.js +295 -0
  158. package/dist/ai/plans/placement.js.map +1 -0
  159. package/dist/ai/plans/plans.d.ts +9 -0
  160. package/dist/ai/plans/plans.js +110 -0
  161. package/dist/ai/plans/plans.js.map +1 -0
  162. package/dist/ai/plans/production.d.ts +14 -2
  163. package/dist/ai/plans/production.js +434 -0
  164. package/dist/ai/plans/production.js.map +1 -0
  165. package/dist/ai/plans/purse.d.ts +6 -3
  166. package/dist/ai/plans/purse.js +139 -0
  167. package/dist/ai/plans/purse.js.map +1 -0
  168. package/dist/ai/plans/tech.d.ts +6 -0
  169. package/dist/ai/plans/tech.js +122 -0
  170. package/dist/ai/plans/tech.js.map +1 -0
  171. package/dist/ai/profiles.d.ts +4 -4
  172. package/dist/{profiles-B3NS9jwk.js → ai/profiles.js} +3 -98
  173. package/dist/ai/profiles.js.map +1 -0
  174. package/dist/ai/reach.js +54 -0
  175. package/dist/ai/reach.js.map +1 -0
  176. package/dist/ai/report.d.ts +8 -0
  177. package/dist/ai/report.js +87 -0
  178. package/dist/ai/report.js.map +1 -0
  179. package/dist/ai/roles.d.ts +4 -0
  180. package/dist/ai/roles.js +207 -0
  181. package/dist/ai/roles.js.map +1 -0
  182. package/dist/ai/rules.d.ts +8 -2
  183. package/dist/ai/rules.js +416 -0
  184. package/dist/ai/rules.js.map +1 -0
  185. package/dist/ai/scouting.d.ts +6 -0
  186. package/dist/ai/scouting.js +324 -0
  187. package/dist/ai/scouting.js.map +1 -0
  188. package/dist/ai/settings.js +99 -0
  189. package/dist/ai/settings.js.map +1 -0
  190. package/dist/ai/squads.d.ts +21 -2
  191. package/dist/ai/squads.js +916 -0
  192. package/dist/ai/squads.js.map +1 -0
  193. package/dist/ai/strength.js +320 -0
  194. package/dist/ai/strength.js.map +1 -0
  195. package/dist/ai/task.d.ts +3 -1
  196. package/dist/ai/task.js +17 -0
  197. package/dist/ai/task.js.map +1 -0
  198. package/dist/ai/tasks/attack.js +24 -0
  199. package/dist/ai/tasks/attack.js.map +1 -0
  200. package/dist/ai/tasks/capture.d.ts +3 -3
  201. package/dist/ai/tasks/capture.js +37 -0
  202. package/dist/ai/tasks/capture.js.map +1 -0
  203. package/dist/ai/tasks/creep.js +29 -0
  204. package/dist/ai/tasks/creep.js.map +1 -0
  205. package/dist/ai/tasks/defend.js +61 -0
  206. package/dist/ai/tasks/defend.js.map +1 -0
  207. package/dist/ai/tasks/drop.js +81 -0
  208. package/dist/ai/tasks/drop.js.map +1 -0
  209. package/dist/ai/tasks/escort.js +59 -0
  210. package/dist/ai/tasks/escort.js.map +1 -0
  211. package/dist/ai/tasks/gather.js +48 -0
  212. package/dist/ai/tasks/gather.js.map +1 -0
  213. package/dist/ai/tasks/harass.js +39 -0
  214. package/dist/ai/tasks/harass.js.map +1 -0
  215. package/dist/ai/tasks/hold.js +32 -0
  216. package/dist/ai/tasks/hold.js.map +1 -0
  217. package/dist/ai/tasks/index.js +34 -0
  218. package/dist/ai/tasks/index.js.map +1 -0
  219. package/dist/ai/tasks/move.js +26 -0
  220. package/dist/ai/tasks/move.js.map +1 -0
  221. package/dist/ai/tasks/patrol.js +59 -0
  222. package/dist/ai/tasks/patrol.js.map +1 -0
  223. package/dist/ai/tasks/retreat.js +28 -0
  224. package/dist/ai/tasks/retreat.js.map +1 -0
  225. package/dist/ai/tasks/scout.js +73 -0
  226. package/dist/ai/tasks/scout.js.map +1 -0
  227. package/dist/ai/tasks/shared.d.ts +1 -1
  228. package/dist/ai/tasks/shared.js +137 -0
  229. package/dist/ai/tasks/shared.js.map +1 -0
  230. package/dist/ai/team.d.ts +18 -1
  231. package/dist/ai/team.js +492 -0
  232. package/dist/ai/team.js.map +1 -0
  233. package/dist/ai/threat.d.ts +6 -0
  234. package/dist/ai/threat.js +206 -0
  235. package/dist/ai/threat.js.map +1 -0
  236. package/dist/ai/view.d.ts +21 -7
  237. package/dist/ai/view.js +677 -0
  238. package/dist/ai/view.js.map +1 -0
  239. package/dist/ai/waves.d.ts +6 -0
  240. package/dist/ai/waves.js +410 -0
  241. package/dist/ai/waves.js.map +1 -0
  242. package/dist/ai.js +54 -6239
  243. package/dist/aiTesting.d.ts +6 -3
  244. package/dist/aiTesting.js +229 -0
  245. package/dist/aiTesting.js.map +1 -0
  246. package/dist/areas.d.ts +4 -1
  247. package/dist/areas.js +295 -0
  248. package/dist/areas.js.map +1 -0
  249. package/dist/attacks.d.ts +3 -3
  250. package/dist/attacks.js +127 -0
  251. package/dist/attacks.js.map +1 -0
  252. package/dist/burning.d.ts +267 -0
  253. package/dist/burning.js +795 -0
  254. package/dist/burning.js.map +1 -0
  255. package/dist/bytes.js +21 -0
  256. package/dist/bytes.js.map +1 -0
  257. package/dist/callings.d.ts +71 -0
  258. package/dist/callings.js +157 -0
  259. package/dist/callings.js.map +1 -0
  260. package/dist/cameraOrders.d.ts +78 -0
  261. package/dist/cameraOrders.js +114 -0
  262. package/dist/cameraOrders.js.map +1 -0
  263. package/dist/camps.d.ts +70 -4
  264. package/dist/camps.js +501 -0
  265. package/dist/camps.js.map +1 -0
  266. package/dist/capture.d.ts +15 -3
  267. package/dist/capture.js +304 -0
  268. package/dist/capture.js.map +1 -0
  269. package/dist/cellLayers.d.ts +78 -13
  270. package/dist/cellLayers.js +275 -0
  271. package/dist/cellLayers.js.map +1 -0
  272. package/dist/cellPatches.d.ts +24 -0
  273. package/dist/cellPatches.js +73 -0
  274. package/dist/cellPatches.js.map +1 -0
  275. package/dist/cinematics.d.ts +10 -5
  276. package/dist/cinematics.js +161 -0
  277. package/dist/cinematics.js.map +1 -0
  278. package/dist/clock.d.ts +2 -2
  279. package/dist/clock.js +78 -0
  280. package/dist/clock.js.map +1 -0
  281. package/dist/commands.d.ts +36 -4
  282. package/dist/commands.js +636 -0
  283. package/dist/commands.js.map +1 -0
  284. package/dist/components.d.ts +31 -10
  285. package/dist/components.js +74 -0
  286. package/dist/components.js.map +1 -0
  287. package/dist/computers.d.ts +4 -4
  288. package/dist/computers.js +194 -0
  289. package/dist/computers.js.map +1 -0
  290. package/dist/concealment.d.ts +25 -2
  291. package/dist/concealment.js +409 -0
  292. package/dist/concealment.js.map +1 -0
  293. package/dist/coreComponents.js +130 -0
  294. package/dist/coreComponents.js.map +1 -0
  295. package/dist/createGame.d.ts +306 -0
  296. package/dist/createGame.js +405 -0
  297. package/dist/createGame.js.map +1 -0
  298. package/dist/dashing.d.ts +18 -2
  299. package/dist/dashing.js +41 -0
  300. package/dist/dashing.js.map +1 -0
  301. package/dist/debug.d.ts +8 -0
  302. package/dist/debug.js +5 -3
  303. package/dist/debug2.js +76 -0
  304. package/dist/debug2.js.map +1 -0
  305. package/dist/debugCommands.d.ts +6 -6
  306. package/dist/debugCommands.js +537 -0
  307. package/dist/debugCommands.js.map +1 -0
  308. package/dist/debugging.d.ts +1 -0
  309. package/dist/defaultSets.d.ts +183 -0
  310. package/dist/defaultSets.js +216 -0
  311. package/dist/defaultSets.js.map +1 -0
  312. package/dist/definitions.d.ts +6 -0
  313. package/dist/definitions.js +78 -0
  314. package/dist/definitions.js.map +1 -0
  315. package/dist/defs.d.ts +1895 -165
  316. package/dist/defs.js +380 -0
  317. package/dist/defs.js.map +1 -0
  318. package/dist/denying.d.ts +4 -4
  319. package/dist/denying.js +106 -0
  320. package/dist/denying.js.map +1 -0
  321. package/dist/destructibles.d.ts +2 -2
  322. package/dist/destructibles.js +36 -0
  323. package/dist/destructibles.js.map +1 -0
  324. package/dist/determinism.d.ts +4 -4
  325. package/dist/determinism.js +247 -0
  326. package/dist/determinism.js.map +1 -0
  327. package/dist/dialog.d.ts +17 -2
  328. package/dist/dialog.js +108 -0
  329. package/dist/dialog.js.map +1 -0
  330. package/dist/effectRefs.js +28 -0
  331. package/dist/effectRefs.js.map +1 -0
  332. package/dist/effects.d.ts +27 -11
  333. package/dist/effects.js +110 -0
  334. package/dist/effects.js.map +1 -0
  335. package/dist/endings.d.ts +1 -1
  336. package/dist/endings.js +78 -0
  337. package/dist/endings.js.map +1 -0
  338. package/dist/engagement.d.ts +40 -6
  339. package/dist/engagement.js +530 -0
  340. package/dist/engagement.js.map +1 -0
  341. package/dist/engineEvents.d.ts +72 -9
  342. package/dist/engineEvents.js +520 -0
  343. package/dist/engineEvents.js.map +1 -0
  344. package/dist/entity.d.ts +275 -26
  345. package/dist/entity.js +441 -0
  346. package/dist/entity.js.map +1 -0
  347. package/dist/entityIndex.d.ts +10 -3
  348. package/dist/entityIndex.js +149 -0
  349. package/dist/entityIndex.js.map +1 -0
  350. package/dist/errors.d.ts +6 -2
  351. package/dist/errors.js +59 -0
  352. package/dist/errors.js.map +1 -0
  353. package/dist/events.d.ts +11 -5
  354. package/dist/events.js +158 -0
  355. package/dist/events.js.map +1 -0
  356. package/dist/exactMath.js +273 -0
  357. package/dist/exactMath.js.map +1 -0
  358. package/dist/features.d.ts +1 -1
  359. package/dist/features.js +127 -0
  360. package/dist/features.js.map +1 -0
  361. package/dist/fields.d.ts +25 -5
  362. package/dist/fields.js +140 -0
  363. package/dist/fields.js.map +1 -0
  364. package/dist/fixture.d.ts +3 -3
  365. package/dist/fixture.js +512 -0
  366. package/dist/fixture.js.map +1 -0
  367. package/dist/fog.d.ts +26 -3
  368. package/dist/fog.js +333 -0
  369. package/dist/fog.js.map +1 -0
  370. package/dist/foliage.d.ts +476 -0
  371. package/dist/foliage.js +1478 -0
  372. package/dist/foliage.js.map +1 -0
  373. package/dist/foliageDebug.d.ts +57 -0
  374. package/dist/foliageDebug.js +172 -0
  375. package/dist/foliageDebug.js.map +1 -0
  376. package/dist/foliageRegrowth.d.ts +20 -0
  377. package/dist/foliageRegrowth.js +332 -0
  378. package/dist/foliageRegrowth.js.map +1 -0
  379. package/dist/formState.d.ts +67 -0
  380. package/dist/formState.js +65 -0
  381. package/dist/formState.js.map +1 -0
  382. package/dist/formation.d.ts +46 -8
  383. package/dist/formation.js +297 -0
  384. package/dist/formation.js.map +1 -0
  385. package/dist/forms.d.ts +58 -0
  386. package/dist/forms.js +146 -0
  387. package/dist/forms.js.map +1 -0
  388. package/dist/friendlyFire.d.ts +2 -2
  389. package/dist/friendlyFire.js +37 -0
  390. package/dist/friendlyFire.js.map +1 -0
  391. package/dist/game.d.ts +141 -48
  392. package/dist/game.js +834 -0
  393. package/dist/game.js.map +1 -0
  394. package/dist/gameData.d.ts +96 -22
  395. package/dist/gameData.js +1690 -0
  396. package/dist/gameData.js.map +1 -0
  397. package/dist/gameFiles.d.ts +3 -3
  398. package/dist/gameFiles.js +14 -0
  399. package/dist/gameFiles.js.map +1 -0
  400. package/dist/gates.js +92 -0
  401. package/dist/gates.js.map +1 -0
  402. package/dist/generate.d.ts +28 -1
  403. package/dist/generate.js +1062 -0
  404. package/dist/generate.js.map +1 -0
  405. package/dist/generateWorker.d.ts +7 -3
  406. package/dist/generateWorker.js +86 -0
  407. package/dist/generateWorker.js.map +1 -0
  408. package/dist/grid.d.ts +9 -0
  409. package/dist/grid.js +102 -0
  410. package/dist/grid.js.map +1 -0
  411. package/dist/ground.d.ts +17 -1
  412. package/dist/ground.js +375 -0
  413. package/dist/ground.js.map +1 -0
  414. package/dist/groundObjects.d.ts +70 -0
  415. package/dist/groundObjects.js +371 -0
  416. package/dist/groundObjects.js.map +1 -0
  417. package/dist/groundSpeed.d.ts +20 -3
  418. package/dist/groundSpeed.js +117 -0
  419. package/dist/groundSpeed.js.map +1 -0
  420. package/dist/hero.d.ts +126 -10
  421. package/dist/hero.js +432 -0
  422. package/dist/hero.js.map +1 -0
  423. package/dist/holds.d.ts +94 -0
  424. package/dist/holds.js +305 -0
  425. package/dist/holds.js.map +1 -0
  426. package/dist/home.d.ts +1 -1
  427. package/dist/home.js +30 -0
  428. package/dist/home.js.map +1 -0
  429. package/dist/hooks.d.ts +339 -57
  430. package/dist/hooks.js +105 -0
  431. package/dist/hooks.js.map +1 -0
  432. package/dist/hotReload.d.ts +6 -5
  433. package/dist/hotReload.js +145 -0
  434. package/dist/hotReload.js.map +1 -0
  435. package/dist/ids.d.ts +3 -3
  436. package/dist/ids.js +30 -0
  437. package/dist/ids.js.map +1 -0
  438. package/dist/idsFile.d.ts +36 -0
  439. package/dist/idsFile.js +134 -0
  440. package/dist/idsFile.js.map +1 -0
  441. package/dist/index.d.ts +105 -68
  442. package/dist/index.js +194 -4701
  443. package/dist/inspect.d.ts +29 -2
  444. package/dist/{inspect-D9dWHmZ0.js → inspect.js} +21 -12
  445. package/dist/inspect.js.map +1 -0
  446. package/dist/inventory.d.ts +14 -1
  447. package/dist/inventory.js +84 -0
  448. package/dist/inventory.js.map +1 -0
  449. package/dist/items.d.ts +136 -8
  450. package/dist/items.js +585 -0
  451. package/dist/items.js.map +1 -0
  452. package/dist/lanes.d.ts +12 -3
  453. package/dist/lanes.js +496 -0
  454. package/dist/lanes.js.map +1 -0
  455. package/dist/life.d.ts +6 -2
  456. package/dist/life.js +287 -0
  457. package/dist/life.js.map +1 -0
  458. package/dist/log.d.ts +26 -3
  459. package/dist/log.js +192 -0
  460. package/dist/log.js.map +1 -0
  461. package/dist/manaBurn.d.ts +2 -2
  462. package/dist/manaBurn.js +75 -0
  463. package/dist/manaBurn.js.map +1 -0
  464. package/dist/map/file.d.ts +56 -3
  465. package/dist/map/file.js +264 -0
  466. package/dist/map/file.js.map +1 -0
  467. package/dist/map/images.js +61 -0
  468. package/dist/map/images.js.map +1 -0
  469. package/dist/map/look.d.ts +1 -1
  470. package/dist/map/look.js +30 -0
  471. package/dist/map/look.js.map +1 -0
  472. package/dist/map/pathProfile.js +183 -0
  473. package/dist/map/pathProfile.js.map +1 -0
  474. package/dist/map/resize.d.ts +4 -0
  475. package/dist/map/resize.js +136 -0
  476. package/dist/map/resize.js.map +1 -0
  477. package/dist/map/schema.js +257 -0
  478. package/dist/map/schema.js.map +1 -0
  479. package/dist/map/terrain.js +214 -0
  480. package/dist/map/terrain.js.map +1 -0
  481. package/dist/map/types.d.ts +92 -13
  482. package/dist/map/types.js +251 -0
  483. package/dist/map/types.js.map +1 -0
  484. package/dist/mapCheck/cells.js +94 -0
  485. package/dist/mapCheck/cells.js.map +1 -0
  486. package/dist/mapCheck/rules/foliage.d.ts +9 -0
  487. package/dist/mapCheck/rules/foliage.js +83 -0
  488. package/dist/mapCheck/rules/foliage.js.map +1 -0
  489. package/dist/mapCheck/rules/names.js +39 -0
  490. package/dist/mapCheck/rules/names.js.map +1 -0
  491. package/dist/mapCheck/rules/objects.d.ts +1 -1
  492. package/dist/mapCheck/rules/objects.js +56 -0
  493. package/dist/mapCheck/rules/objects.js.map +1 -0
  494. package/dist/mapCheck/rules/paths.js +32 -0
  495. package/dist/mapCheck/rules/paths.js.map +1 -0
  496. package/dist/mapCheck/rules/players.js +20 -0
  497. package/dist/mapCheck/rules/players.js.map +1 -0
  498. package/dist/mapCheck/rules/races.js +56 -0
  499. package/dist/mapCheck/rules/races.js.map +1 -0
  500. package/dist/mapCheck/rules/random.js +47 -0
  501. package/dist/mapCheck/rules/random.js.map +1 -0
  502. package/dist/mapCheck/rules/regions.js +30 -0
  503. package/dist/mapCheck/rules/regions.js.map +1 -0
  504. package/dist/mapCheck/rules/targets.js +31 -0
  505. package/dist/mapCheck/rules/targets.js.map +1 -0
  506. package/dist/mapCheck/rules/walking.js +45 -0
  507. package/dist/mapCheck/rules/walking.js.map +1 -0
  508. package/dist/mapCheck.d.ts +2 -2
  509. package/dist/mapCheck.js +63 -0
  510. package/dist/mapCheck.js.map +1 -0
  511. package/dist/mapFields.d.ts +25 -2
  512. package/dist/mapFields.js +134 -0
  513. package/dist/mapFields.js.map +1 -0
  514. package/dist/mapFile.js +176 -0
  515. package/dist/mapFile.js.map +1 -0
  516. package/dist/mapMeasure.d.ts +8 -0
  517. package/dist/mapMeasure.js +283 -0
  518. package/dist/mapMeasure.js.map +1 -0
  519. package/dist/mapMerge.d.ts +1 -0
  520. package/dist/mapMerge.js +172 -0
  521. package/dist/mapMerge.js.map +1 -0
  522. package/dist/mapObjectives.js +138 -0
  523. package/dist/mapObjectives.js.map +1 -0
  524. package/dist/mapObjects.js +80 -0
  525. package/dist/mapObjects.js.map +1 -0
  526. package/dist/math.d.ts +37 -7
  527. package/dist/math.js +155 -0
  528. package/dist/math.js.map +1 -0
  529. package/dist/messages.d.ts +71 -4
  530. package/dist/messages.js +29 -0
  531. package/dist/messages.js.map +1 -0
  532. package/dist/missionRules.d.ts +10 -2
  533. package/dist/{missionRules-C-bGxm0Q.js → missionRules.js} +30 -150
  534. package/dist/missionRules.js.map +1 -0
  535. package/dist/mods.d.ts +39 -20
  536. package/dist/mods.js +271 -0
  537. package/dist/mods.js.map +1 -0
  538. package/dist/moves.d.ts +87 -0
  539. package/dist/moves.js +539 -0
  540. package/dist/moves.js.map +1 -0
  541. package/dist/names.d.ts +7 -0
  542. package/dist/names.js +122 -0
  543. package/dist/names.js.map +1 -0
  544. package/dist/navigation/agentParams.js +14 -0
  545. package/dist/navigation/agentParams.js.map +1 -0
  546. package/dist/navigation/air.d.ts +7 -3
  547. package/dist/navigation/air.js +401 -0
  548. package/dist/navigation/air.js.map +1 -0
  549. package/dist/navigation/builds.d.ts +34 -2
  550. package/dist/navigation/builds.js +287 -0
  551. package/dist/navigation/builds.js.map +1 -0
  552. package/dist/navigation/groundAreas.d.ts +59 -1
  553. package/dist/navigation/groundAreas.js +407 -0
  554. package/dist/navigation/groundAreas.js.map +1 -0
  555. package/dist/navigation/navigation.d.ts +98 -9
  556. package/dist/navigation/recast.d.ts +194 -18
  557. package/dist/navigation/recast.js +1379 -0
  558. package/dist/navigation/recast.js.map +1 -0
  559. package/dist/navigation/sidePaths.d.ts +8 -3
  560. package/dist/navigation/sidePaths.js +241 -0
  561. package/dist/navigation/sidePaths.js.map +1 -0
  562. package/dist/navigation/sized.js +243 -0
  563. package/dist/navigation/sized.js.map +1 -0
  564. package/dist/nearest.js +32 -0
  565. package/dist/nearest.js.map +1 -0
  566. package/dist/noise.js +59 -0
  567. package/dist/noise.js.map +1 -0
  568. package/dist/objectives.d.ts +12 -3
  569. package/dist/objectives.js +144 -0
  570. package/dist/objectives.js.map +1 -0
  571. package/dist/orders/basic.d.ts +5 -5
  572. package/dist/orders/basic.js +417 -0
  573. package/dist/orders/basic.js.map +1 -0
  574. package/dist/orders/build.js +278 -0
  575. package/dist/orders/build.js.map +1 -0
  576. package/dist/orders/cast.d.ts +13 -3
  577. package/dist/orders/cast.js +558 -0
  578. package/dist/orders/cast.js.map +1 -0
  579. package/dist/orders/facts.js +16 -0
  580. package/dist/orders/facts.js.map +1 -0
  581. package/dist/orders/harvest.d.ts +21 -5
  582. package/dist/orders/harvest.js +540 -0
  583. package/dist/orders/harvest.js.map +1 -0
  584. package/dist/orders/idle.d.ts +3 -1
  585. package/dist/orders/idle.js +234 -0
  586. package/dist/orders/idle.js.map +1 -0
  587. package/dist/orders/items.js +92 -0
  588. package/dist/orders/items.js.map +1 -0
  589. package/dist/orders/queue.js +108 -0
  590. package/dist/orders/queue.js.map +1 -0
  591. package/dist/orders/waiting.d.ts +39 -0
  592. package/dist/orders/waiting.js +149 -0
  593. package/dist/orders/waiting.js.map +1 -0
  594. package/dist/pack.schema.js +13 -0
  595. package/dist/pack.schema.js.map +1 -0
  596. package/dist/pack.schema.json +7622 -841
  597. package/dist/packs/director/index.d.ts +13 -5
  598. package/dist/packs/director/index.js +204 -0
  599. package/dist/packs/director/index.js.map +1 -0
  600. package/dist/packs/heroes/campaign.d.ts +3 -2
  601. package/dist/packs/heroes/campaign.js +241 -0
  602. package/dist/packs/heroes/campaign.js.map +1 -0
  603. package/dist/packs/heroes/carry.d.ts +6 -0
  604. package/dist/packs/heroes/carry.js +112 -0
  605. package/dist/packs/heroes/carry.js.map +1 -0
  606. package/dist/packs/heroes/commands.js +115 -0
  607. package/dist/packs/heroes/commands.js.map +1 -0
  608. package/dist/packs/heroes/fallen.d.ts +43 -0
  609. package/dist/packs/heroes/fallen.js +61 -0
  610. package/dist/packs/heroes/fallen.js.map +1 -0
  611. package/dist/packs/heroes/hire.js +60 -0
  612. package/dist/packs/heroes/hire.js.map +1 -0
  613. package/dist/packs/heroes/index.d.ts +7 -6
  614. package/dist/packs/heroes/index.js +130 -0
  615. package/dist/packs/heroes/index.js.map +1 -0
  616. package/dist/packs/heroes/loop.d.ts +95 -0
  617. package/dist/packs/heroes/loop.js +250 -0
  618. package/dist/packs/heroes/loop.js.map +1 -0
  619. package/dist/packs/heroes/making.d.ts +6 -3
  620. package/dist/packs/heroes/making.js +55 -0
  621. package/dist/packs/heroes/making.js.map +1 -0
  622. package/dist/packs/heroes/respawn.d.ts +3 -3
  623. package/dist/packs/heroes/respawn.js +87 -0
  624. package/dist/packs/heroes/respawn.js.map +1 -0
  625. package/dist/packs/heroes/sets.d.ts +32 -0
  626. package/dist/packs/heroes/sets.js +51 -0
  627. package/dist/packs/heroes/sets.js.map +1 -0
  628. package/dist/packs/heroes/spells.d.ts +16 -0
  629. package/dist/packs/heroes/spells.js +269 -0
  630. package/dist/packs/heroes/spells.js.map +1 -0
  631. package/dist/packs/items/defaults.d.ts +43 -0
  632. package/dist/packs/items/defaults.js +1504 -0
  633. package/dist/packs/items/defaults.js.map +1 -0
  634. package/dist/packs/items/index.d.ts +27 -0
  635. package/dist/packs/items/index.js +214 -0
  636. package/dist/packs/items/index.js.map +1 -0
  637. package/dist/packs/moba/index.d.ts +3 -3
  638. package/dist/packs/moba/index.js +174 -0
  639. package/dist/packs/moba/index.js.map +1 -0
  640. package/dist/packs/pack.d.ts +15 -15
  641. package/dist/packs/pack.js +14 -0
  642. package/dist/packs/pack.js.map +1 -0
  643. package/dist/packs.d.ts +15 -7
  644. package/dist/packs.js +222 -0
  645. package/dist/packs.js.map +1 -0
  646. package/dist/paths.d.ts +2 -0
  647. package/dist/paths.js +109 -0
  648. package/dist/paths.js.map +1 -0
  649. package/dist/plain.js +57 -0
  650. package/dist/plain.js.map +1 -0
  651. package/dist/player.d.ts +33 -10
  652. package/dist/player.js +159 -0
  653. package/dist/player.js.map +1 -0
  654. package/dist/portals.d.ts +1 -1
  655. package/dist/portals.js +194 -0
  656. package/dist/portals.js.map +1 -0
  657. package/dist/prefabs.d.ts +25 -2
  658. package/dist/prefabs.js +239 -0
  659. package/dist/prefabs.js.map +1 -0
  660. package/dist/presetBuildings.js +58 -0
  661. package/dist/presetBuildings.js.map +1 -0
  662. package/dist/presetFoliage.d.ts +27 -0
  663. package/dist/presetFoliage.js +98 -0
  664. package/dist/presetFoliage.js.map +1 -0
  665. package/dist/presetGround.js +65 -0
  666. package/dist/presetGround.js.map +1 -0
  667. package/dist/proxies.d.ts +12 -0
  668. package/dist/proxies.js +79 -0
  669. package/dist/proxies.js.map +1 -0
  670. package/dist/query.d.ts +56 -0
  671. package/dist/query.js +88 -0
  672. package/dist/query.js.map +1 -0
  673. package/dist/races.d.ts +15 -14
  674. package/dist/races.js +172 -0
  675. package/dist/races.js.map +1 -0
  676. package/dist/randomGroups.js +91 -0
  677. package/dist/randomGroups.js.map +1 -0
  678. package/dist/registry.d.ts +117 -53
  679. package/dist/registry.js +323 -0
  680. package/dist/registry.js.map +1 -0
  681. package/dist/remains.d.ts +11 -9
  682. package/dist/remains.js +188 -0
  683. package/dist/remains.js.map +1 -0
  684. package/dist/replication.d.ts +12 -7
  685. package/dist/replication.js +100 -0
  686. package/dist/replication.js.map +1 -0
  687. package/dist/rng.d.ts +2 -0
  688. package/dist/rng.js +40 -0
  689. package/dist/rng.js.map +1 -0
  690. package/dist/rules.d.ts +186 -99
  691. package/dist/rules.js +179 -0
  692. package/dist/rules.js.map +1 -0
  693. package/dist/rulesCheck.d.ts +5 -4
  694. package/dist/rulesCheck.js +693 -0
  695. package/dist/rulesCheck.js.map +1 -0
  696. package/dist/runes.d.ts +2 -2
  697. package/dist/runes.js +80 -0
  698. package/dist/runes.js.map +1 -0
  699. package/dist/save.d.ts +37 -12
  700. package/dist/save.js +532 -0
  701. package/dist/save.js.map +1 -0
  702. package/dist/scenario.d.ts +2 -2
  703. package/dist/scenario.js +99 -0
  704. package/dist/scenario.js.map +1 -0
  705. package/dist/scheduler.d.ts +3 -0
  706. package/dist/scheduler.js +156 -0
  707. package/dist/scheduler.js.map +1 -0
  708. package/dist/score.d.ts +19 -19
  709. package/dist/score.js +709 -0
  710. package/dist/score.js.map +1 -0
  711. package/dist/sequences.d.ts +10 -6
  712. package/dist/sequences.js +206 -0
  713. package/dist/sequences.js.map +1 -0
  714. package/dist/server/doorman.js +154 -0
  715. package/dist/server/doorman.js.map +1 -0
  716. package/dist/server/gameServer.d.ts +16 -1
  717. package/dist/server/gameServer.js +643 -0
  718. package/dist/server/gameServer.js.map +1 -0
  719. package/dist/server/index.d.ts +1 -1
  720. package/dist/server/lobby.js +199 -0
  721. package/dist/server/lobby.js.map +1 -0
  722. package/dist/server/log.js +18 -0
  723. package/dist/server/log.js.map +1 -0
  724. package/dist/server/match.js +267 -0
  725. package/dist/server/match.js.map +1 -0
  726. package/dist/server/mode.d.ts +18 -9
  727. package/dist/server/mode.js +220 -0
  728. package/dist/server/mode.js.map +1 -0
  729. package/dist/{navigation-worker.js → server/navigation-worker.js} +1 -1
  730. package/dist/server/navigation-worker.js.map +1 -0
  731. package/dist/server/navigation.js +39 -0
  732. package/dist/server/navigation.js.map +1 -0
  733. package/dist/server/ops.d.ts +4 -0
  734. package/dist/server/ops.js +137 -0
  735. package/dist/server/ops.js.map +1 -0
  736. package/dist/server/packs.d.ts +3 -3
  737. package/dist/server/packs.js +32 -0
  738. package/dist/server/packs.js.map +1 -0
  739. package/dist/server/ratings.d.ts +5 -0
  740. package/dist/server/ratings.js +104 -0
  741. package/dist/server/ratings.js.map +1 -0
  742. package/dist/server/relay.d.ts +12 -2
  743. package/dist/server/relay.js +144 -0
  744. package/dist/server/relay.js.map +1 -0
  745. package/dist/server/rooms.d.ts +9 -2
  746. package/dist/server/rooms.js +442 -0
  747. package/dist/server/rooms.js.map +1 -0
  748. package/dist/server/seat.js +116 -0
  749. package/dist/server/seat.js.map +1 -0
  750. package/dist/server/seatSettings.d.ts +3 -3
  751. package/dist/server/seatSettings.js +63 -0
  752. package/dist/server/seatSettings.js.map +1 -0
  753. package/dist/server/secret.js +13 -0
  754. package/dist/server/secret.js.map +1 -0
  755. package/dist/server/start.d.ts +13 -6
  756. package/dist/server/start.js +76 -0
  757. package/dist/server/start.js.map +1 -0
  758. package/dist/server/websocket.d.ts +9 -1
  759. package/dist/server/websocket.js +306 -0
  760. package/dist/server/websocket.js.map +1 -0
  761. package/dist/server.js +15 -2861
  762. package/dist/session/can.js +26 -0
  763. package/dist/session/can.js.map +1 -0
  764. package/dist/session/commandReplay.d.ts +8 -2
  765. package/dist/session/commandReplay.js +293 -0
  766. package/dist/session/commandReplay.js.map +1 -0
  767. package/dist/session/debug.js +151 -0
  768. package/dist/session/debug.js.map +1 -0
  769. package/dist/session/delay.js +62 -0
  770. package/dist/session/delay.js.map +1 -0
  771. package/dist/session/delta.d.ts +14 -1
  772. package/dist/session/delta.js +407 -0
  773. package/dist/session/delta.js.map +1 -0
  774. package/dist/session/entityState.js +415 -0
  775. package/dist/session/entityState.js.map +1 -0
  776. package/dist/session/local.d.ts +47 -5
  777. package/dist/session/local.js +670 -0
  778. package/dist/session/local.js.map +1 -0
  779. package/dist/session/memory.d.ts +20 -2
  780. package/dist/session/memory.js +131 -0
  781. package/dist/session/memory.js.map +1 -0
  782. package/dist/session/protocol.d.ts +325 -31
  783. package/dist/session/protocol.js +55 -0
  784. package/dist/session/protocol.js.map +1 -0
  785. package/dist/session/remote.d.ts +74 -12
  786. package/dist/session/remote.js +1394 -0
  787. package/dist/session/remote.js.map +1 -0
  788. package/dist/session/replay.d.ts +11 -2
  789. package/dist/session/replay.js +160 -0
  790. package/dist/session/replay.js.map +1 -0
  791. package/dist/session/seed.js +12 -0
  792. package/dist/session/seed.js.map +1 -0
  793. package/dist/session/share.d.ts +5 -1
  794. package/dist/session/share.js +94 -0
  795. package/dist/session/share.js.map +1 -0
  796. package/dist/session/socket.d.ts +1 -1
  797. package/dist/session/socket.js +29 -0
  798. package/dist/session/socket.js.map +1 -0
  799. package/dist/session/wire.d.ts +5 -0
  800. package/dist/session/wire.js +84 -0
  801. package/dist/session/wire.js.map +1 -0
  802. package/dist/session/worker.d.ts +77 -12
  803. package/dist/session/worker.js +499 -0
  804. package/dist/session/worker.js.map +1 -0
  805. package/dist/shared.d.ts +31 -5
  806. package/dist/shared.js +166 -0
  807. package/dist/shared.js.map +1 -0
  808. package/dist/sides.d.ts +9 -3
  809. package/dist/sides.js +149 -0
  810. package/dist/sides.js.map +1 -0
  811. package/dist/sight.js +85 -0
  812. package/dist/sight.js.map +1 -0
  813. package/dist/simulate-worker.js +1 -1
  814. package/dist/simulate.d.ts +12 -8
  815. package/dist/{simulate-oXBiw1Ff.js → simulate.js} +10 -11
  816. package/dist/simulate.js.map +1 -0
  817. package/dist/smart.js +77 -0
  818. package/dist/smart.js.map +1 -0
  819. package/dist/spatial.d.ts +32 -16
  820. package/dist/spatial.js +234 -0
  821. package/dist/spatial.js.map +1 -0
  822. package/dist/spawning.d.ts +1 -0
  823. package/dist/spawning.js +224 -0
  824. package/dist/spawning.js.map +1 -0
  825. package/dist/stances.d.ts +6 -3
  826. package/dist/stances.js +169 -0
  827. package/dist/stances.js.map +1 -0
  828. package/dist/start.d.ts +10 -10
  829. package/dist/start.js +75 -0
  830. package/dist/start.js.map +1 -0
  831. package/dist/stats.d.ts +42 -16
  832. package/dist/stats.js +290 -0
  833. package/dist/stats.js.map +1 -0
  834. package/dist/summoned.d.ts +52 -0
  835. package/dist/summoned.js +38 -0
  836. package/dist/summoned.js.map +1 -0
  837. package/dist/summons.d.ts +10 -13
  838. package/dist/summons.js +271 -0
  839. package/dist/summons.js.map +1 -0
  840. package/dist/systems/abilities.js +224 -0
  841. package/dist/systems/abilities.js.map +1 -0
  842. package/dist/systems/combat.d.ts +35 -1
  843. package/dist/systems/combat.js +677 -0
  844. package/dist/systems/combat.js.map +1 -0
  845. package/dist/systems/combatTold.d.ts +3 -1
  846. package/dist/systems/combatTold.js +85 -0
  847. package/dist/systems/combatTold.js.map +1 -0
  848. package/dist/systems/construction.js +80 -0
  849. package/dist/systems/construction.js.map +1 -0
  850. package/dist/systems/economy.d.ts +0 -6
  851. package/dist/systems/economy.js +128 -0
  852. package/dist/systems/economy.js.map +1 -0
  853. package/dist/systems/fog.d.ts +1 -1
  854. package/dist/systems/fog.js +120 -0
  855. package/dist/systems/fog.js.map +1 -0
  856. package/dist/systems/life.js +32 -0
  857. package/dist/systems/life.js.map +1 -0
  858. package/dist/systems/movement.d.ts +24 -12
  859. package/dist/systems/movement.js +1247 -0
  860. package/dist/systems/movement.js.map +1 -0
  861. package/dist/systems/orders.js +64 -0
  862. package/dist/systems/orders.js.map +1 -0
  863. package/dist/systems/production.js +322 -0
  864. package/dist/systems/production.js.map +1 -0
  865. package/dist/systems/productionQueue.js +120 -0
  866. package/dist/systems/productionQueue.js.map +1 -0
  867. package/dist/systems/victory.d.ts +1 -1
  868. package/dist/systems/victory.js +56 -0
  869. package/dist/systems/victory.js.map +1 -0
  870. package/dist/talk.d.ts +6 -6
  871. package/dist/talk.js +153 -0
  872. package/dist/talk.js.map +1 -0
  873. package/dist/targeting.d.ts +142 -0
  874. package/dist/targeting.js +49 -0
  875. package/dist/targeting.js.map +1 -0
  876. package/dist/tech.d.ts +20 -3
  877. package/dist/tech.js +239 -0
  878. package/dist/tech.js.map +1 -0
  879. package/dist/techTree.d.ts +7 -0
  880. package/dist/techTree.js +90 -0
  881. package/dist/techTree.js.map +1 -0
  882. package/dist/terrain.d.ts +59 -7
  883. package/dist/terrain.js +389 -0
  884. package/dist/terrain.js.map +1 -0
  885. package/dist/terrainSave.d.ts +6 -0
  886. package/dist/terrainSave.js +74 -0
  887. package/dist/terrainSave.js.map +1 -0
  888. package/dist/testing.d.ts +8 -7
  889. package/dist/testing.js +13 -739
  890. package/dist/testing.js.map +1 -1
  891. package/dist/tiles.d.ts +1 -1
  892. package/dist/tiles.js +43 -0
  893. package/dist/tiles.js.map +1 -0
  894. package/dist/timers.d.ts +29 -4
  895. package/dist/timers.js +242 -0
  896. package/dist/timers.js.map +1 -0
  897. package/dist/tomes.d.ts +4 -4
  898. package/dist/tomes.js +94 -0
  899. package/dist/tomes.js.map +1 -0
  900. package/dist/trade.js +103 -0
  901. package/dist/trade.js.map +1 -0
  902. package/dist/transport.d.ts +6 -1
  903. package/dist/transport.js +281 -0
  904. package/dist/transport.js.map +1 -0
  905. package/dist/tunables.d.ts +10 -3
  906. package/dist/tunables.js +56 -0
  907. package/dist/tunables.js.map +1 -0
  908. package/dist/unitResources.d.ts +67 -0
  909. package/dist/unitResources.js +266 -0
  910. package/dist/unitResources.js.map +1 -0
  911. package/dist/upkeep.d.ts +6 -1
  912. package/dist/upkeep.js +26 -0
  913. package/dist/upkeep.js.map +1 -0
  914. package/dist/veterancy.d.ts +8 -3
  915. package/dist/veterancy.js +131 -0
  916. package/dist/veterancy.js.map +1 -0
  917. package/dist/vision.d.ts +36 -0
  918. package/dist/vision.js +133 -0
  919. package/dist/vision.js.map +1 -0
  920. package/dist/walls.d.ts +1 -1
  921. package/dist/walls.js +278 -0
  922. package/dist/walls.js.map +1 -0
  923. package/dist/world.d.ts +606 -88
  924. package/dist/world.js +1263 -0
  925. package/dist/world.js.map +1 -0
  926. package/package.json +2 -2
  927. package/dist/ai.js.map +0 -1
  928. package/dist/attributes.d.ts +0 -66
  929. package/dist/brain-BvVdUhX8.js +0 -7659
  930. package/dist/brain-BvVdUhX8.js.map +0 -1
  931. package/dist/builds-C6LfgvEU.js +0 -460
  932. package/dist/builds-C6LfgvEU.js.map +0 -1
  933. package/dist/coreComponents-syuh2fPG.js +0 -5149
  934. package/dist/coreComponents-syuh2fPG.js.map +0 -1
  935. package/dist/debugCommands-CzjrSm66.js +0 -14739
  936. package/dist/debugCommands-CzjrSm66.js.map +0 -1
  937. package/dist/determinism-BCymQwiE.js +0 -518
  938. package/dist/determinism-BCymQwiE.js.map +0 -1
  939. package/dist/game-DiJEN-Ks.js +0 -5800
  940. package/dist/game-DiJEN-Ks.js.map +0 -1
  941. package/dist/index.js.map +0 -1
  942. package/dist/inspect-D9dWHmZ0.js.map +0 -1
  943. package/dist/local-Dkovq42k.js +0 -1379
  944. package/dist/local-Dkovq42k.js.map +0 -1
  945. package/dist/missionRules-C-bGxm0Q.js.map +0 -1
  946. package/dist/navigation-worker.js.map +0 -1
  947. package/dist/packs-g5thvmGn.js +0 -3199
  948. package/dist/packs-g5thvmGn.js.map +0 -1
  949. package/dist/profiles-B3NS9jwk.js.map +0 -1
  950. package/dist/server.js.map +0 -1
  951. package/dist/simulate-oXBiw1Ff.js.map +0 -1
@@ -0,0 +1,324 @@
1
+ import { distSq } from "../math.js";
2
+ import { baseStats } from "../defs.js";
3
+ import { heroOfState } from "../hero.js";
4
+ import { defineModule } from "./module.js";
5
+ import { consider, curve, defineGoal } from "./goals.js";
6
+ import { pair, point, where } from "./geometry.js";
7
+ //#region src/ai/scouting.ts
8
+ /** How many places one round takes a scout to at most: the rest wait for the next */
9
+ var ROUND = 4;
10
+ /**
11
+ * The id of the scouting's goal
12
+ *
13
+ * @beta
14
+ */
15
+ var SCOUT = "scout";
16
+ /**
17
+ * A brain's scouting (`ai.scouting`): its plan of looks (`looks`), the scout it sends (`scoutFor`), through the `scout`
18
+ * goal the `scouting()` module puts on the picker. Kept in the brain's memory (`BrainMemory.scouting`)
19
+ *
20
+ * @internal
21
+ */
22
+ var Scouting = class Scouting {
23
+ ai;
24
+ /** What finds it on a brain (`ai.area(Scouting)`): made the first time a module asks for it */
25
+ static id = "scouting";
26
+ /** Makes the scouting of a brain; what `ai.area(Scouting)` calls the first time a module asks for it */
27
+ static make(ai) {
28
+ return new Scouting(ai);
29
+ }
30
+ /** Its id among the brain's areas: what its memory and its report are kept under */
31
+ id = "scouting";
32
+ /** What the log says where a save's memory of it is of a shape it does not read */
33
+ afresh = "the save remembers the computer player’s scouting in a shape this brain does not read: it starts afresh";
34
+ /** Whether a `scouting()` module is in the brain: without one, nothing here runs, and the goal is not the brain's */
35
+ enabled = false;
36
+ memory = {
37
+ v: 1,
38
+ rounds: 0
39
+ };
40
+ moduleOptions = {};
41
+ /** The goal it scouts through: added to the brain's picker by the module, unless told not to scout */
42
+ goal;
43
+ constructor(ai) {
44
+ this.ai = ai;
45
+ this.goal = this.makeGoal();
46
+ }
47
+ /** Puts the `scouting()` module's options under the brain's settings, and its goal on the picker */
48
+ configure(options) {
49
+ this.moduleOptions = options;
50
+ if (!this.enabled && this.options.scout !== false) this.ai.goals.add(this.goal);
51
+ this.enabled = true;
52
+ }
53
+ /** How it scouts: the module's options, the brain's settings over them (`ai.settings.scouting`) */
54
+ get options() {
55
+ return this.ai.cache("scouting.options", () => ({
56
+ ...this.moduleOptions,
57
+ ...this.ai.settings.scouting
58
+ }));
59
+ }
60
+ /** Seconds a place stays out of sight before it is due again */
61
+ get lookEvery() {
62
+ return this.options.lookEvery ?? 90;
63
+ }
64
+ /** The scout's unit, while it lives */
65
+ get scout() {
66
+ return this.memory.scout;
67
+ }
68
+ /**
69
+ * Their starts it was told of (`AiOptions.enemyBases`) not seen yet: not looked at, and no building of theirs known
70
+ * near (a creep's hut is no base)
71
+ */
72
+ unseenStarts() {
73
+ const { ai } = this;
74
+ const bases = ai.options.enemyBases ?? [];
75
+ if (!(ai.def.knowledge !== false)) return bases.map(point);
76
+ const { map, enemy } = ai.knowledge;
77
+ const rivals = enemy.structures({ gone: true });
78
+ const reach = 196;
79
+ return bases.filter((base) => map.lastLooked(base) === void 0 && !rivals.some((building) => distSq(building.at, base) < reach)).map(point);
80
+ }
81
+ /**
82
+ * The plan of looks, once a think: their starts not seen (due at once), then their bases as remembered, the mines they
83
+ * would expand to, where their army was last seen, each due once out of sight `lookEvery` seconds. A game's own
84
+ * places (`scout` as a function) in place of all of it
85
+ */
86
+ looks() {
87
+ const { ai } = this;
88
+ return ai.cache("scouting.looks", () => {
89
+ const options = this.options;
90
+ const every = this.lookEvery;
91
+ const knows = ai.def.knowledge !== false;
92
+ const lost = this.lostPlaces();
93
+ const reach = 196;
94
+ const since = (at) => {
95
+ const looked = knows ? ai.knowledge.map.sinceLooked(at) : Infinity;
96
+ let losing = Infinity;
97
+ for (const each of lost) if (distSq(each.at, at) < reach) losing = Math.min(losing, (ai.tick - each.tick) / ai.session.tickRate);
98
+ return Math.min(looked, losing);
99
+ };
100
+ const look = (at, kind) => {
101
+ const ago = since(at);
102
+ return {
103
+ at: point(at),
104
+ kind,
105
+ since: ago,
106
+ due: ago >= every
107
+ };
108
+ };
109
+ if (typeof options.scout === "function") return options.scout(ai).map((at) => look(at, "game"));
110
+ const starts = this.unseenStarts();
111
+ const looks = starts.map((at) => ({
112
+ at,
113
+ kind: "start",
114
+ since: Infinity,
115
+ due: true
116
+ }));
117
+ if (!knows) return looks;
118
+ const { enemy } = ai.knowledge;
119
+ const theirs = enemy.bases().filter((base) => !base.gone);
120
+ for (const base of theirs) looks.push(look(base.at, "base"));
121
+ const told = ai.options.enemyBases ?? [];
122
+ for (const at of told) if (!starts.some((each) => each.x === at.x && each.z === at.z) && !theirs.some((base) => distSq(base.at, at) < 196)) looks.push(look(at, "base"));
123
+ if (options.expansions ?? true) {
124
+ const mine = ai.view.bases();
125
+ const near = (at, of) => of.reduce((best, each) => Math.min(best, distSq(each, at)), Infinity);
126
+ const centres = [...theirs.map((base) => base.at), ...told];
127
+ const candidates = ai.view.mines().filter((each) => {
128
+ if (theirs.some((base) => distSq(base.at, each) < 196)) return false;
129
+ const toThem = near(each, centres);
130
+ return toThem < 3600 && toThem < near(each, mine.map((base) => base.at));
131
+ }).sort((a, b) => near(a, centres) - near(b, centres) || a.id - b.id);
132
+ for (const each of candidates.slice(0, 3)) looks.push(look(each, "expansion"));
133
+ }
134
+ if (options.army ?? true) {
135
+ const army = enemy.armySeen()[0];
136
+ if (army) looks.push(look(army.at, "army"));
137
+ }
138
+ return looks;
139
+ });
140
+ }
141
+ /**
142
+ * The places scouts were lost on the way to, these `lookEvery` seconds: the round of a scout that died before it was
143
+ * over taken in, once, as it is found gone
144
+ */
145
+ lostPlaces() {
146
+ const { ai } = this;
147
+ const memory = this.memory;
148
+ if (memory.round && memory.scout !== void 0 && !ai.view.mine.has(memory.scout)) {
149
+ const lost = memory.lost ??= [];
150
+ for (const at of memory.round) lost.push({
151
+ at: point(at),
152
+ tick: ai.tick
153
+ });
154
+ ai.decide(`lost its scout on the way to ${memory.round.map(where).join(", ")}: not sent there again for ${this.lookEvery} s`, {
155
+ kind: "scout",
156
+ goal: SCOUT
157
+ });
158
+ delete memory.round;
159
+ delete memory.scout;
160
+ } else if (memory.round && !this.out()) delete memory.round;
161
+ const every = this.lookEvery * ai.session.tickRate;
162
+ if (memory.lost?.some((each) => ai.tick - each.tick >= every)) memory.lost = memory.lost.filter((each) => ai.tick - each.tick < every);
163
+ return memory.lost ?? [];
164
+ }
165
+ /** The looks due now, nearest a place first, each after the one before: the round a scout is sent on */
166
+ round(from) {
167
+ const due = this.looks().filter((each) => each.due);
168
+ const starts = due.filter((each) => each.kind === "start").map((each) => each.at);
169
+ if (starts.length) return starts.slice(0, 1);
170
+ const rest = due.map((each) => each.at);
171
+ const round = [];
172
+ let at = from;
173
+ while (rest.length && round.length < ROUND) {
174
+ let best = 0;
175
+ for (let i = 1; i < rest.length; i++) if (distSq(rest[i], at) < distSq(rest[best], at)) best = i;
176
+ at = rest.splice(best, 1)[0];
177
+ round.push(at);
178
+ }
179
+ return round;
180
+ }
181
+ /**
182
+ * Who goes to look, of what it may have: the scout of the last round, while it is there; else a flying unit with
183
+ * nothing to do (`flyers`); else the fastest of its fighters with nothing to do that is no hero; else, only to find
184
+ * a start of theirs not seen yet, a worker. Looking again (their base, an expansion, their army) waits for a fighter:
185
+ * a worker sent into a base it knows is lost to its towers, and what chases it home comes into its own (AI1)
186
+ */
187
+ scoutFor(available) {
188
+ const { ai } = this;
189
+ const kept = available.find((unit) => unit.id === this.memory.scout);
190
+ if (kept) return kept;
191
+ const { registry } = ai;
192
+ const speed = (unit) => baseStats(ai.view.def(unit), registry).moveSpeed;
193
+ const fastest = (units) => [...units].sort((a, b) => speed(b) - speed(a) || a.id - b.id)[0];
194
+ const idle = available.fighters().where((unit) => !unit.own?.order && !heroOfState(unit));
195
+ if (this.options.flyers ?? true) {
196
+ const flyer = fastest(idle.withRole("air"));
197
+ if (flyer) return flyer;
198
+ }
199
+ const fighter = fastest(idle);
200
+ if (fighter || !this.unseenStarts().length) return fighter;
201
+ return fastest(available.workers().where((unit) => !unit.own?.hidden && unit.own?.order !== "build" && unit.own?.order !== "construct"));
202
+ }
203
+ /** The goal: worth 0.3 while a look is due, one unit claimed, a squad of one sent on the round */
204
+ makeGoal() {
205
+ return defineGoal({
206
+ id: SCOUT,
207
+ weight: .3,
208
+ considerations: [consider("looks due", () => this.out() ? 1 : this.looks().filter((each) => each.due).length, curve.step(1)), consider("seconds into the game", (ai) => ai.time, curve.step(this.options.from ?? 15))],
209
+ claims: { units: (_ai, available) => {
210
+ const unit = this.scoutFor(available);
211
+ return unit ? [unit] : [];
212
+ } },
213
+ run: (_ai, claimed) => this.send(claimed.units.first())
214
+ });
215
+ }
216
+ /** The scout's squad while it is on a round */
217
+ out() {
218
+ const squad = this.ai.squads.named(SCOUT);
219
+ return !!squad && squad.current?.kind === "scout" && squad.done === void 0;
220
+ }
221
+ /** Sends the scout on the round of looks due, unless it is on one */
222
+ send(unit) {
223
+ const { ai } = this;
224
+ if (!unit || this.out()) return;
225
+ const round = this.round(unit);
226
+ if (!round.length) return;
227
+ this.memory.scout = unit.id;
228
+ this.memory.round = round.map(point);
229
+ this.memory.rounds++;
230
+ ai.squads.make(SCOUT, [unit], {
231
+ micro: false,
232
+ owner: this.goal.id
233
+ }).scout(round);
234
+ ai.decide(`sends ${unit.type} ${unit.id} to look at ${round.map(where).join(", ")}`, {
235
+ kind: "scout",
236
+ goal: SCOUT
237
+ });
238
+ }
239
+ /** The scouting as the report shows it */
240
+ report() {
241
+ const { ai } = this;
242
+ if (!this.enabled) return {
243
+ looks: [],
244
+ rounds: 0
245
+ };
246
+ const squad = ai.squads.named(SCOUT);
247
+ const points = squad?.current?.kind === "scout" && squad.done === void 0 ? squad.current.data.points : void 0;
248
+ const next = squad?.current?.memory.next ?? 0;
249
+ return {
250
+ looks: this.looks().map((each) => ({
251
+ at: pair(each.at),
252
+ kind: each.kind,
253
+ ...Number.isFinite(each.since) && { seen: Math.round(each.since) },
254
+ due: each.due
255
+ })),
256
+ ...this.memory.scout !== void 0 && ai.view.mine.has(this.memory.scout) && { scout: this.memory.scout },
257
+ ...points && { going: points.slice(next).map(pair) },
258
+ rounds: this.memory.rounds
259
+ };
260
+ }
261
+ /** What it remembers, for a save: a copy */
262
+ /** Whether it has anything to remember now: one that does not is left out of a save */
263
+ remembers() {
264
+ return this.enabled;
265
+ }
266
+ /** Its part of the brain's report */
267
+ reportTo(report) {
268
+ report.scouting = this.report();
269
+ }
270
+ /** Gives a copy of the scouting's memory, for a save of the brain */
271
+ save() {
272
+ const { round, lost, ...rest } = this.memory;
273
+ return {
274
+ ...rest,
275
+ ...round && { round: round.map(point) },
276
+ ...lost && { lost: lost.map((each) => ({
277
+ at: point(each.at),
278
+ tick: each.tick
279
+ })) }
280
+ };
281
+ }
282
+ /** Takes back what `save` gave: whether it was read */
283
+ restore(memory) {
284
+ const given = memory;
285
+ if (!given || typeof given !== "object" || given.v !== 1) return false;
286
+ this.memory = {
287
+ v: 1,
288
+ rounds: given.rounds ?? 0,
289
+ ...given.scout !== void 0 && { scout: given.scout },
290
+ ...Array.isArray(given.round) && { round: given.round.map(point) },
291
+ ...Array.isArray(given.lost) && { lost: given.lost.map((each) => ({
292
+ at: point(each.at),
293
+ tick: each.tick
294
+ })) }
295
+ };
296
+ return true;
297
+ }
298
+ /** Takes in the scout of a save from before the module (the melee player kept it) */
299
+ adopt(scout) {
300
+ if (scout !== void 0 && this.memory.scout === void 0) this.memory.scout = scout;
301
+ }
302
+ };
303
+ /**
304
+ * The scouting module: puts the `scout` goal on the brain's picker, which sends one unit at a time to look at what is
305
+ * due (`ai.scouting`). With how it scouts where the brain's definition and the seat's options say nothing
306
+ * (`ScoutingOptions`)
307
+ *
308
+ * @beta
309
+ */
310
+ var scouting = (options = {}) => defineModule({
311
+ id: "scouting",
312
+ make: (ai) => {
313
+ ai.area(Scouting).configure(options);
314
+ return {
315
+ id: "scouting",
316
+ phase: "act",
317
+ think: () => void 0
318
+ };
319
+ }
320
+ });
321
+ //#endregion
322
+ export { SCOUT, Scouting, scouting };
323
+
324
+ //# sourceMappingURL=scouting.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scouting.js","names":[],"sources":["../../src/ai/scouting.ts"],"sourcesContent":["import { baseStats } from '#engine/defs'\nimport type { AiArea } from './area'\nimport type { AiReport } from './report'\nimport { distSq, type Vec2 } from '#engine/math'\nimport type { EntityState } from '#engine/session/protocol'\nimport { type Brain } from './brain'\nimport { type AiModule, type AiModuleDef, defineModule } from './module'\nimport { consider, curve, defineGoal, type GoalDef } from './goals'\nimport type { UnitSet } from './view'\nimport { heroOfState } from '#engine/hero'\nimport { pair, point, where } from './geometry'\n\n/*\n * Scouting (AI plan, C3): going to look. What a computer knows of its rivals is what it saw (A3: their buildings stay\n * remembered, their army is where it was last seen), so a computer that looked once, early, plays the rest of the game\n * against a picture of minute two: it misses the expansion, the tech switch to flyers, the army gathering at the\n * corner. A player looks again and again; this is the computer doing the same:\n *\n * - **A plan of looks.** First their bases it was told of (the starts) and has not seen, one after the other, as the\n * old melee player did. Then, every `lookEvery` seconds, each place worth a look again: their bases as remembered,\n * the mines they would expand to (mines nobody of its own holds, nearer one of their bases than any of its own), and\n * where their army was last seen. A place is due once it has been out of sight `lookEvery` seconds; nothing is due\n * while it is in sight.\n * - **One scout.** The looks due go to one unit at a time, as a squad of one (`scout`) on a `scout` task over the\n * places, nearest first: a flying unit where it has one idle (it sees over walls and is not stopped by them), else\n * the fastest of its fighters with nothing to do that is no hero, else a worker. The same unit goes on to the next\n * round while it lives.\n * - **What it saw** is the knowledge's: the scout's sight brings structures, workers, the army and the tech in as any\n * unit's does, so scouting only has to be there.\n *\n * The plan is a goal on the brain's picker (`scout`, weight 0.3: anything more important takes the unit), so it never\n * fights the army for units. `scout: false` leaves it out (a mission's computer that knows where everything is), a\n * function says where to look (`scout: (ai) => points`). What it remembers (the scout, the rounds) is plain data in\n * the brain's memory (`BrainMemory.scouting`).\n */\n\n/** How near one of their bases a mine is to be a likely expansion of theirs, and not its own way */\nconst EXPANSION_REACH = 60\n/** How near a known building of theirs a start is seen: a base found where it was said to be */\nconst BASE_SEEN = 14\n/** How many places one round takes a scout to at most: the rest wait for the next */\nconst ROUND = 4\n\n/**\n * How a brain scouts (`BrainDef.scouting`, the seat's `AiOptions.scouting` over it, the `scouting()` module's own under\n * both). Data, but for the function form of `scout`\n *\n * @beta\n */\nexport interface ScoutingOptions {\n\t/** Seconds a place stays out of sight before it is worth a look again: 90 when left out */\n\tlookEvery?: number\n\t/**\n\t * Where to look: `false` nowhere (the goal is left out), a function for places of the game's own each think (in place\n\t * of the kit's plan). The kit's plan when left out\n\t */\n\tscout?: false | ((ai: Brain) => Vec2[])\n\t/** Whether the mines they would expand to are looked at: yes when left out */\n\texpansions?: boolean\n\t/** Whether where their army was last seen is looked at again: yes when left out */\n\tarmy?: boolean\n\t/** Whether a flying unit with nothing to do goes before the fastest on foot: yes when left out */\n\tflyers?: boolean\n\t/** Seconds into the game before the first look: 15 when left out */\n\tfrom?: number\n}\n\n/**\n * What the scouting remembers between thinks, as a save keeps it\n *\n * @beta\n */\nexport interface ScoutingMemory {\n\t/** The version of the memory's format: 1 so far */\n\tv: 1\n\t/** The unit that scouts, while it lives: the same one goes on to the next round */\n\tscout?: number\n\t/** Rounds sent */\n\trounds: number\n\t/** The places of the round the scout is on, while it is */\n\tround?: Vec2[]\n\t/**\n\t * Places a scout was lost on the way to, and when: not due again for `lookEvery` seconds, as if looked at (a lost\n\t * scout says as much: what guards it is there). Never the same unit sent to die at their towers over and over (AI1)\n\t */\n\tlost?: { at: Vec2; tick: number }[]\n}\n\n/**\n * A place in the plan of looks: where, what kind of place it is, when it was last in sight\n *\n * @beta\n */\nexport interface Look {\n\t/** Where the place is, in cells */\n\tat: Vec2\n\t/** Their start not seen yet, their base, a mine they would expand to, where their army was, or a place the game names */\n\tkind: 'start' | 'base' | 'expansion' | 'army' | 'game'\n\t/** Seconds since it was last in sight: `Infinity` for never */\n\tsince: number\n\t/** Whether it is worth a look now */\n\tdue: boolean\n}\n\n/**\n * The scouting as the report shows it (`AiReport.scouting`): the plan of looks with how old each is, the scout, where\n * it goes\n *\n * @beta\n */\nexport interface ScoutingReport {\n\t/** The plan of looks, each with where, its kind, how many seconds ago it was seen and whether it is due */\n\tlooks: { at: [number, number]; kind: Look['kind']; seen?: number; due: boolean }[]\n\t/** The entity id of the unit that scouts; nothing when there is none */\n\tscout?: number\n\t/** The places the scout is going to, in order, in cells */\n\tgoing?: [number, number][]\n\t/** How many rounds of looks were sent */\n\trounds: number\n}\n\n/**\n * The id of the scouting's goal\n *\n * @beta\n */\nexport const SCOUT = 'scout'\n\n/**\n * A brain's scouting (`ai.scouting`): its plan of looks (`looks`), the scout it sends (`scoutFor`), through the `scout`\n * goal the `scouting()` module puts on the picker. Kept in the brain's memory (`BrainMemory.scouting`)\n *\n * @internal\n */\nexport class Scouting implements AiArea {\n\t/** What finds it on a brain (`ai.area(Scouting)`): made the first time a module asks for it */\n\tstatic readonly id = 'scouting'\n\t/** Makes the scouting of a brain; what `ai.area(Scouting)` calls the first time a module asks for it */\n\tstatic make(ai: Brain): Scouting {\n\t\treturn new Scouting(ai)\n\t}\n\t/** Its id among the brain's areas: what its memory and its report are kept under */\n\treadonly id = 'scouting'\n\t/** What the log says where a save's memory of it is of a shape it does not read */\n\treadonly afresh = 'the save remembers the computer player’s scouting in a shape this brain does not read: it starts afresh'\n\n\t/** Whether a `scouting()` module is in the brain: without one, nothing here runs, and the goal is not the brain's */\n\tenabled = false\n\tprivate memory: ScoutingMemory = { v: 1, rounds: 0 }\n\tprivate moduleOptions: ScoutingOptions = {}\n\t/** The goal it scouts through: added to the brain's picker by the module, unless told not to scout */\n\treadonly goal: GoalDef\n\n\tconstructor(\n\t\t/** The brain it scouts for */\n\t\treadonly ai: Brain\n\t) {\n\t\tthis.goal = this.makeGoal()\n\t}\n\n\t/** Puts the `scouting()` module's options under the brain's settings, and its goal on the picker */\n\tconfigure(options: ScoutingOptions): void {\n\t\tthis.moduleOptions = options\n\t\tif (!this.enabled && this.options.scout !== false) this.ai.goals.add(this.goal)\n\t\tthis.enabled = true\n\t}\n\n\t/** How it scouts: the module's options, the brain's settings over them (`ai.settings.scouting`) */\n\tget options(): ScoutingOptions {\n\t\treturn this.ai.cache('scouting.options', () => ({ ...this.moduleOptions, ...this.ai.settings.scouting }))\n\t}\n\n\t/** Seconds a place stays out of sight before it is due again */\n\tget lookEvery(): number {\n\t\treturn this.options.lookEvery ?? 90\n\t}\n\n\t/** The scout's unit, while it lives */\n\tget scout(): number | undefined {\n\t\treturn this.memory.scout\n\t}\n\n\t/**\n\t * Their starts it was told of (`AiOptions.enemyBases`) not seen yet: not looked at, and no building of theirs known\n\t * near (a creep's hut is no base)\n\t */\n\tunseenStarts(): Vec2[] {\n\t\tconst { ai } = this\n\t\tconst bases = ai.options.enemyBases ?? []\n\t\tconst knows = ai.def.knowledge !== false\n\t\tif (!knows) return bases.map(point)\n\t\tconst { map, enemy } = ai.knowledge\n\t\tconst rivals = enemy.structures({ gone: true })\n\t\tconst reach = BASE_SEEN * BASE_SEEN\n\t\treturn bases.filter((base) => map.lastLooked(base) === undefined && !rivals.some((building) => distSq(building.at, base) < reach)).map(point)\n\t}\n\n\t/**\n\t * The plan of looks, once a think: their starts not seen (due at once), then their bases as remembered, the mines they\n\t * would expand to, where their army was last seen, each due once out of sight `lookEvery` seconds. A game's own\n\t * places (`scout` as a function) in place of all of it\n\t */\n\tlooks(): Look[] {\n\t\tconst { ai } = this\n\t\treturn ai.cache('scouting.looks', () => {\n\t\t\tconst options = this.options\n\t\t\tconst every = this.lookEvery\n\t\t\tconst knows = ai.def.knowledge !== false\n\t\t\tconst lost = this.lostPlaces()\n\t\t\tconst reach = BASE_SEEN * BASE_SEEN\n\t\t\tconst since = (at: Vec2) => {\n\t\t\t\tconst looked = knows ? ai.knowledge.map.sinceLooked(at) : Infinity\n\t\t\t\tlet losing = Infinity\n\t\t\t\tfor (const each of lost) if (distSq(each.at, at) < reach) losing = Math.min(losing, (ai.tick - each.tick) / ai.session.tickRate)\n\t\t\t\treturn Math.min(looked, losing)\n\t\t\t}\n\t\t\tconst look = (at: Vec2, kind: Look['kind']): Look => {\n\t\t\t\tconst ago = since(at)\n\t\t\t\treturn { at: point(at), kind, since: ago, due: ago >= every }\n\t\t\t}\n\t\t\tif (typeof options.scout === 'function') return options.scout(ai).map((at) => look(at, 'game'))\n\t\t\tconst starts = this.unseenStarts()\n\t\t\tconst looks: Look[] = starts.map((at) => ({ at, kind: 'start', since: Infinity, due: true }))\n\t\t\tif (!knows) return looks\n\t\t\tconst { enemy } = ai.knowledge\n\t\t\tconst theirs = enemy.bases().filter((base) => !base.gone)\n\t\t\tfor (const base of theirs) looks.push(look(base.at, 'base'))\n\t\t\tconst told = ai.options.enemyBases ?? []\n\t\t\t// a start that was seen, with nothing remembered there now, is worth looking at again: they may have come back\n\t\t\tfor (const at of told)\n\t\t\t\tif (!starts.some((each) => each.x === at.x && each.z === at.z) && !theirs.some((base) => distSq(base.at, at) < BASE_SEEN * BASE_SEEN))\n\t\t\t\t\tlooks.push(look(at, 'base'))\n\t\t\tif (options.expansions ?? true) {\n\t\t\t\tconst mine = ai.view.bases()\n\t\t\t\tconst near = (at: Vec2, of: readonly Vec2[]) => of.reduce((best, each) => Math.min(best, distSq(each, at)), Infinity)\n\t\t\t\tconst centres = [...theirs.map((base) => base.at), ...told]\n\t\t\t\tconst candidates = ai.view\n\t\t\t\t\t.mines()\n\t\t\t\t\t.filter((each) => {\n\t\t\t\t\t\tif (theirs.some((base) => distSq(base.at, each) < BASE_SEEN * BASE_SEEN)) return false\n\t\t\t\t\t\tconst toThem = near(each, centres)\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\ttoThem < EXPANSION_REACH * EXPANSION_REACH &&\n\t\t\t\t\t\t\ttoThem <\n\t\t\t\t\t\t\t\tnear(\n\t\t\t\t\t\t\t\t\teach,\n\t\t\t\t\t\t\t\t\tmine.map((base) => base.at)\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t)\n\t\t\t\t\t})\n\t\t\t\t\t.sort((a, b) => near(a, centres) - near(b, centres) || a.id - b.id)\n\t\t\t\tfor (const each of candidates.slice(0, 3)) looks.push(look(each, 'expansion'))\n\t\t\t}\n\t\t\tif (options.army ?? true) {\n\t\t\t\tconst army = enemy.armySeen()[0]\n\t\t\t\tif (army) looks.push(look(army.at, 'army'))\n\t\t\t}\n\t\t\treturn looks\n\t\t})\n\t}\n\n\t/**\n\t * The places scouts were lost on the way to, these `lookEvery` seconds: the round of a scout that died before it was\n\t * over taken in, once, as it is found gone\n\t */\n\tprivate lostPlaces(): readonly { at: Vec2; tick: number }[] {\n\t\tconst { ai } = this\n\t\tconst memory = this.memory\n\t\tif (memory.round && memory.scout !== undefined && !ai.view.mine.has(memory.scout)) {\n\t\t\tconst lost = (memory.lost ??= [])\n\t\t\tfor (const at of memory.round) lost.push({ at: point(at), tick: ai.tick })\n\t\t\tai.decide(`lost its scout on the way to ${memory.round.map(where).join(', ')}: not sent there again for ${this.lookEvery} s`, {\n\t\t\t\tkind: 'scout',\n\t\t\t\tgoal: SCOUT\n\t\t\t})\n\t\t\tdelete memory.round\n\t\t\tdelete memory.scout\n\t\t} else if (memory.round && !this.out()) delete memory.round\n\t\tconst every = this.lookEvery * ai.session.tickRate\n\t\tif (memory.lost?.some((each) => ai.tick - each.tick >= every)) memory.lost = memory.lost.filter((each) => ai.tick - each.tick < every)\n\t\treturn memory.lost ?? []\n\t}\n\n\t/** The looks due now, nearest a place first, each after the one before: the round a scout is sent on */\n\tround(from: Vec2): Vec2[] {\n\t\tconst due = this.looks().filter((each) => each.due)\n\t\t// their starts first, in the order told; the rest a walk from one to the nearest next\n\t\tconst starts = due.filter((each) => each.kind === 'start').map((each) => each.at)\n\t\tif (starts.length) return starts.slice(0, 1)\n\t\tconst rest = due.map((each) => each.at)\n\t\tconst round: Vec2[] = []\n\t\tlet at = from\n\t\twhile (rest.length && round.length < ROUND) {\n\t\t\tlet best = 0\n\t\t\tfor (let i = 1; i < rest.length; i++) if (distSq(rest[i], at) < distSq(rest[best], at)) best = i\n\t\t\tat = rest.splice(best, 1)[0]\n\t\t\tround.push(at)\n\t\t}\n\t\treturn round\n\t}\n\n\t/**\n\t * Who goes to look, of what it may have: the scout of the last round, while it is there; else a flying unit with\n\t * nothing to do (`flyers`); else the fastest of its fighters with nothing to do that is no hero; else, only to find\n\t * a start of theirs not seen yet, a worker. Looking again (their base, an expansion, their army) waits for a fighter:\n\t * a worker sent into a base it knows is lost to its towers, and what chases it home comes into its own (AI1)\n\t */\n\tscoutFor(available: UnitSet): EntityState | undefined {\n\t\tconst { ai } = this\n\t\tconst kept = available.find((unit) => unit.id === this.memory.scout)\n\t\tif (kept) return kept\n\t\tconst { registry } = ai\n\t\tconst speed = (unit: EntityState) => baseStats(ai.view.def(unit), registry).moveSpeed\n\t\tconst fastest = (units: Iterable<EntityState>) => [...units].sort((a, b) => speed(b) - speed(a) || a.id - b.id)[0]\n\t\tconst idle = available.fighters().where((unit) => !unit.own?.order && !heroOfState(unit))\n\t\tif (this.options.flyers ?? true) {\n\t\t\tconst flyer = fastest(idle.withRole('air'))\n\t\t\tif (flyer) return flyer\n\t\t}\n\t\tconst fighter = fastest(idle)\n\t\tif (fighter || !this.unseenStarts().length) return fighter\n\t\t// a worker inside a mine is not told to go anywhere until it is out: one outside, not building\n\t\treturn fastest(available.workers().where((unit) => !unit.own?.hidden && unit.own?.order !== 'build' && unit.own?.order !== 'construct'))\n\t}\n\n\t/** The goal: worth 0.3 while a look is due, one unit claimed, a squad of one sent on the round */\n\tprivate makeGoal(): GoalDef {\n\t\treturn defineGoal({\n\t\t\tid: SCOUT,\n\t\t\tweight: 0.3,\n\t\t\tconsiderations: [\n\t\t\t\t// while its scout is out on a round, the round goes on\n\t\t\t\tconsider('looks due', () => (this.out() ? 1 : this.looks().filter((each) => each.due).length), curve.step(1)),\n\t\t\t\tconsider('seconds into the game', (ai) => ai.time, curve.step(this.options.from ?? 15))\n\t\t\t],\n\t\t\tclaims: {\n\t\t\t\tunits: (_ai, available) => {\n\t\t\t\t\tconst unit = this.scoutFor(available)\n\t\t\t\t\treturn unit ? [unit] : []\n\t\t\t\t}\n\t\t\t},\n\t\t\trun: (_ai, claimed) => this.send(claimed.units.first())\n\t\t})\n\t}\n\n\t/** The scout's squad while it is on a round */\n\tprivate out(): boolean {\n\t\tconst squad = this.ai.squads.named(SCOUT)\n\t\treturn !!squad && squad.current?.kind === 'scout' && squad.done === undefined\n\t}\n\n\t/** Sends the scout on the round of looks due, unless it is on one */\n\tprivate send(unit: EntityState | undefined): void {\n\t\tconst { ai } = this\n\t\tif (!unit || this.out()) return\n\t\tconst round = this.round(unit)\n\t\tif (!round.length) return\n\t\tthis.memory.scout = unit.id\n\t\tthis.memory.round = round.map(point)\n\t\tthis.memory.rounds++\n\t\tai.squads.make(SCOUT, [unit], { micro: false, owner: this.goal.id }).scout(round)\n\t\tai.decide(`sends ${unit.type} ${unit.id} to look at ${round.map(where).join(', ')}`, { kind: 'scout', goal: SCOUT })\n\t}\n\n\t/** The scouting as the report shows it */\n\treport(): ScoutingReport {\n\t\tconst { ai } = this\n\t\tif (!this.enabled) return { looks: [], rounds: 0 }\n\t\tconst squad = ai.squads.named(SCOUT)\n\t\tconst points = squad?.current?.kind === 'scout' && squad.done === undefined ? (squad.current.data.points as Vec2[]) : undefined\n\t\tconst next = (squad?.current?.memory.next as number | undefined) ?? 0\n\t\treturn {\n\t\t\tlooks: this.looks().map((each) => ({\n\t\t\t\tat: pair(each.at),\n\t\t\t\tkind: each.kind,\n\t\t\t\t...(Number.isFinite(each.since) && { seen: Math.round(each.since) }),\n\t\t\t\tdue: each.due\n\t\t\t})),\n\t\t\t...(this.memory.scout !== undefined && ai.view.mine.has(this.memory.scout) && { scout: this.memory.scout }),\n\t\t\t...(points && { going: points.slice(next).map(pair) }),\n\t\t\trounds: this.memory.rounds\n\t\t}\n\t}\n\n\t/** What it remembers, for a save: a copy */\n\t/** Whether it has anything to remember now: one that does not is left out of a save */\n\tremembers(): boolean {\n\t\treturn this.enabled\n\t}\n\n\t/** Its part of the brain's report */\n\treportTo(report: AiReport): void {\n\t\treport.scouting = this.report()\n\t}\n\n\t/** Gives a copy of the scouting's memory, for a save of the brain */\n\tsave(): ScoutingMemory {\n\t\tconst { round, lost, ...rest } = this.memory\n\t\treturn {\n\t\t\t...rest,\n\t\t\t...(round && { round: round.map(point) }),\n\t\t\t...(lost && { lost: lost.map((each) => ({ at: point(each.at), tick: each.tick })) })\n\t\t}\n\t}\n\n\t/** Takes back what `save` gave: whether it was read */\n\trestore(memory: unknown): boolean {\n\t\tconst given = memory as ScoutingMemory | undefined\n\t\tif (!given || typeof given !== 'object' || given.v !== 1) return false\n\t\tthis.memory = {\n\t\t\tv: 1,\n\t\t\trounds: given.rounds ?? 0,\n\t\t\t...(given.scout !== undefined && { scout: given.scout }),\n\t\t\t...(Array.isArray(given.round) && { round: given.round.map(point) }),\n\t\t\t...(Array.isArray(given.lost) && { lost: given.lost.map((each) => ({ at: point(each.at), tick: each.tick })) })\n\t\t}\n\t\treturn true\n\t}\n\n\t/** Takes in the scout of a save from before the module (the melee player kept it) */\n\tadopt(scout: number | undefined): void {\n\t\tif (scout !== undefined && this.memory.scout === undefined) this.memory.scout = scout\n\t}\n}\n\n/**\n * The scouting module: puts the `scout` goal on the brain's picker, which sends one unit at a time to look at what is\n * due (`ai.scouting`). With how it scouts where the brain's definition and the seat's options say nothing\n * (`ScoutingOptions`)\n *\n * @beta\n */\nexport const scouting = (options: ScoutingOptions = {}): AiModuleDef =>\n\tdefineModule({ id: 'scouting', make: (ai: Brain): AiModule => {\n\t\tai.area(Scouting).configure(options)\n\t\treturn { id: 'scouting', phase: 'act', think: () => undefined }\n\t} })\n\ndeclare module './area' {\n\tinterface AreaMemories {\n\t\tscouting?: ScoutingMemory\n\t}\n}\n"],"mappings":"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"}
@@ -0,0 +1,99 @@
1
+ //#region src/ai/settings.ts
2
+ /**
3
+ * Where each flag that an area has a name for goes in it, and whether it is a share (`true`: the share a lower layer or
4
+ * the area gives; a number: that share; `false`: never)
5
+ */
6
+ var FLAGGED = {
7
+ defendUsers: [["team", "defendUsers"], "switch"],
8
+ say: [["team", "say"], "switch"],
9
+ targetHeroes: [["micro", "targetHeroes"], "switch"],
10
+ ignoreInjured: [["micro", "ignoreInjured"], "switch"],
11
+ removeInjuries: [["micro", "removeInjuries"], "switch"],
12
+ takeItems: [["micro", "takeItems"], "switch"],
13
+ buyItems: [["micro", "buyItems"], "switch"],
14
+ smartArtillery: [["micro", "smartArtillery"], "switch"],
15
+ kite: [["micro", "kite"], "switch"],
16
+ unitsFlee: [["micro", "unitsFlee"], "share"],
17
+ heroesFlee: [["micro", "heroesFlee"], "share"],
18
+ groupsFlee: [["squads", "retreatAt"], "share"],
19
+ workersFlee: [["economy", "workersFlee"], "switch"],
20
+ repairStructures: [[
21
+ "plans",
22
+ "build",
23
+ "repair"
24
+ ], "switch"],
25
+ rebuild: [[
26
+ "plans",
27
+ "build",
28
+ "rebuild"
29
+ ], "switch"],
30
+ scout: [["scouting", "scout"], "off"]
31
+ };
32
+ /** Of what a layer gives, the lists that add to the lower layers' rather than replace them */
33
+ var ADDED = /* @__PURE__ */ new Set(["plans.build.wants", "waves.groups"]);
34
+ /** Of what a layer gives, the tables merged key by key with the lower layers' rather than replaced */
35
+ var MERGED = /* @__PURE__ */ new Set([
36
+ "plans",
37
+ "plans.build",
38
+ "plans.production",
39
+ "plans.build.placement"
40
+ ]);
41
+ var isObject = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
42
+ /** A copy of a layer with its flags taken into the areas they name, the area's own value of the same layer over it */
43
+ function folded(layer, ai) {
44
+ const copy = { ...layer };
45
+ for (const [flag, value] of Object.entries(layer.flags ?? {})) {
46
+ const where = FLAGGED[flag];
47
+ if (!where) continue;
48
+ const said = typeof value === "function" ? ai ? value(ai) : void 0 : value;
49
+ if (said === void 0) continue;
50
+ const [path, kind] = where;
51
+ const word = kind === "switch" ? !!said : kind === "off" ? said === false ? false : void 0 : said;
52
+ if (word === void 0) continue;
53
+ let at = copy;
54
+ for (const key of path.slice(0, -1)) {
55
+ at[key] = { ...at[key] };
56
+ at = at[key];
57
+ }
58
+ const key = path[path.length - 1];
59
+ if (at[key] === void 0) at[key] = word;
60
+ }
61
+ return copy;
62
+ }
63
+ /** A layer's values over the lower layers', key by key: see `ADDED`, `MERGED`; `true` over a share keeps the share */
64
+ function over(under, given, path) {
65
+ const merged = { ...under };
66
+ for (const [key, value] of Object.entries(given)) {
67
+ if (value === void 0) continue;
68
+ const at = path ? `${path}.${key}` : key;
69
+ const below = merged[key];
70
+ if (ADDED.has(at) && Array.isArray(value)) merged[key] = [...below ?? [], ...value];
71
+ else if ((MERGED.has(at) || !path) && isObject(value) && isObject(below)) merged[key] = over(below, value, at);
72
+ else if (value === true && typeof below === "number") continue;
73
+ else merged[key] = value;
74
+ }
75
+ return merged;
76
+ }
77
+ /**
78
+ * The settings layered, lowest first (see the file's comment): each area's values key by key, a flag taken into the area
79
+ * it names in its own layer. A flag that is a function of the brain is asked of `ai`, and left out where none is given
80
+ *
81
+ * @beta
82
+ */
83
+ function resolveSettings(layers, ai) {
84
+ let resolved = {};
85
+ for (const layer of layers) if (layer) resolved = over(resolved, folded(layer, ai), "");
86
+ for (const [path, kind] of Object.values(FLAGGED)) {
87
+ if (kind !== "share") continue;
88
+ const area = resolved[path[0]];
89
+ if (area?.[path[1]] === true) resolved[path[0]] = {
90
+ ...area,
91
+ [path[1]]: void 0
92
+ };
93
+ }
94
+ return resolved;
95
+ }
96
+ //#endregion
97
+ export { resolveSettings };
98
+
99
+ //# sourceMappingURL=settings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings.js","names":[],"sources":["../../src/ai/settings.ts"],"sourcesContent":["/**\n * The settings of a brain (design review B2): every number and switch its areas play by, in one schema keyed by area,\n * each under the area's own names (`{ economy: { workers }, defence: { radius, towers }, micro: { unitsFlee } }`). Every\n * layer speaks it, lowest first:\n *\n * the brain's definition (`BrainDef.settings`) → the game's defaults (`GameAi.defaults`) → the race's\n * (`GameAi.races`) → the difficulty → the personality → the map (`MapAi.settings`, `MapAi.races`) → the seat\n * (`AiOptions.settings`)\n *\n * and `resolveSettings` layers them once: an area's values key by key, the higher layer's over the lower's. What a\n * module was made with (`economy({ workers })`) is under all of them, and what no layer says is the area's own default\n * (`Economy`'s 8 workers). An area reads what it plays by from `ai.settings` and nothing else.\n *\n * The classic flags (`AiFlags`) are a section of their own, for a lobby and the editor's flags list: a flag that says what\n * an area has a name for (Kite: `micro.kite`, Units Flee: `micro.unitsFlee`) is taken into that area in the layer that\n * says it, so that a higher layer's word goes over it either way. A flag may be a function of the brain: worked out each\n * think, as `ai.settings` is\n */\nimport type { DefenceOptions } from './defence'\nimport type { EconomyOptions } from './economy'\nimport type { Brain } from './brain'\nimport type { LanesPlayOptions } from './lanes'\nimport type { MeleeArmyOptions } from './melee/goals'\nimport type { MeleeHeroesOptions } from './melee/heroes'\nimport type { MicroOptions } from './micro'\nimport type { PlansOptions } from './plans/plans'\nimport type { AiFlags } from './profiles'\nimport type { ScoutingOptions } from './scouting'\nimport type { SquadsOptions } from './squads'\nimport type { TeamOptions } from './team'\nimport type { WavesOptions } from './waves'\n\n/**\n * What a brain's areas play by, by area, each under its own names (see the file's comment): what every layer gives, from\n * the brain's definition to the seat. Plain data where a lobby, a map or a save holds it; a function in it is code, not\n * kept in a save\n *\n * @beta\n */\nexport interface AiSettings {\n\t/** The workers and the bases (`Economy`) */\n\teconomy?: EconomyOptions\n\t/** What it defends and how (`Defence`) */\n\tdefence?: DefenceOptions\n\t/** How often it looks and with whom (`Scouting`) */\n\tscouting?: ScoutingOptions\n\t/** How its units fight (`Micro`) */\n\tmicro?: MicroOptions\n\t/** How its squads go, and the tasks they may be given (`Squads`) */\n\tsquads?: SquadsOptions\n\t/** How it plays with its team (`Team`) */\n\tteam?: TeamOptions\n\t/** The waves it was given (`Waves`) */\n\twaves?: WavesOptions\n\t/** What it builds, trains and researches, and in what order (`Plans`) */\n\tplans?: PlansOptions\n\t/** The melee army: when it attacks, how many go, how a wave goes (`melee.army`) */\n\tarmy?: MeleeArmyOptions\n\t/** The melee player's heroes: how many, and from when (`melee.heroes`) */\n\theroes?: MeleeHeroesOptions\n\t/** A lanes brain's play (`lanes`) */\n\tlanes?: LanesPlayOptions\n\t/** How much each goal weighs, by its id (1 when left out): the picker's (`Goals`) */\n\tweights?: Record<string, number>\n\t/** The classic flags (see the file's comment) */\n\tflags?: AiFlags\n}\n\n/**\n * Where each flag that an area has a name for goes in it, and whether it is a share (`true`: the share a lower layer or\n * the area gives; a number: that share; `false`: never)\n */\nconst FLAGGED: Readonly<Partial<Record<keyof AiFlags, readonly [path: readonly string[], kind: 'switch' | 'share' | 'off']>>> = {\n\tdefendUsers: [['team', 'defendUsers'], 'switch'],\n\tsay: [['team', 'say'], 'switch'],\n\ttargetHeroes: [['micro', 'targetHeroes'], 'switch'],\n\tignoreInjured: [['micro', 'ignoreInjured'], 'switch'],\n\tremoveInjuries: [['micro', 'removeInjuries'], 'switch'],\n\ttakeItems: [['micro', 'takeItems'], 'switch'],\n\tbuyItems: [['micro', 'buyItems'], 'switch'],\n\tsmartArtillery: [['micro', 'smartArtillery'], 'switch'],\n\tkite: [['micro', 'kite'], 'switch'],\n\tunitsFlee: [['micro', 'unitsFlee'], 'share'],\n\theroesFlee: [['micro', 'heroesFlee'], 'share'],\n\tgroupsFlee: [['squads', 'retreatAt'], 'share'],\n\tworkersFlee: [['economy', 'workersFlee'], 'switch'],\n\trepairStructures: [['plans', 'build', 'repair'], 'switch'],\n\trebuild: [['plans', 'build', 'rebuild'], 'switch'],\n\t// only its no: the scouting's `scout` is who goes, where it is not `false`\n\tscout: [['scouting', 'scout'], 'off']\n}\n\n/** Of what a layer gives, the lists that add to the lower layers' rather than replace them */\nconst ADDED = new Set(['plans.build.wants', 'waves.groups'])\n\n/** Of what a layer gives, the tables merged key by key with the lower layers' rather than replaced */\nconst MERGED = new Set(['plans', 'plans.build', 'plans.production', 'plans.build.placement'])\n\ntype Loose = Record<string, unknown>\n\nconst isObject = (value: unknown): value is Loose => typeof value === 'object' && value !== null && !Array.isArray(value)\n\n/** A copy of a layer with its flags taken into the areas they name, the area's own value of the same layer over it */\nfunction folded(layer: AiSettings, ai: Brain | undefined): Loose {\n\tconst copy: Loose = { ...layer }\n\tfor (const [flag, value] of Object.entries(layer.flags ?? {})) {\n\t\tconst where = FLAGGED[flag as keyof AiFlags]\n\t\tif (!where) continue\n\t\tconst said = typeof value === 'function' ? (ai ? (value as (ai: Brain) => unknown)(ai) : undefined) : value\n\t\tif (said === undefined) continue\n\t\tconst [path, kind] = where\n\t\tconst word = kind === 'switch' ? !!said : kind === 'off' ? (said === false ? false : undefined) : said\n\t\tif (word === undefined) continue\n\t\tlet at = copy\n\t\tfor (const key of path.slice(0, -1)) {\n\t\t\tat[key] = { ...(at[key] as Loose | undefined) }\n\t\t\tat = at[key] as Loose\n\t\t}\n\t\tconst key = path[path.length - 1]\n\t\tif (at[key] === undefined) at[key] = word\n\t}\n\treturn copy\n}\n\n/** A layer's values over the lower layers', key by key: see `ADDED`, `MERGED`; `true` over a share keeps the share */\nfunction over(under: Loose, given: Loose, path: string): Loose {\n\tconst merged: Loose = { ...under }\n\tfor (const [key, value] of Object.entries(given)) {\n\t\tif (value === undefined) continue\n\t\tconst at = path ? `${path}.${key}` : key\n\t\tconst below = merged[key]\n\t\tif (ADDED.has(at) && Array.isArray(value)) merged[key] = [...((below as unknown[] | undefined) ?? []), ...value]\n\t\telse if ((MERGED.has(at) || !path) && isObject(value) && isObject(below)) merged[key] = over(below, value, at)\n\t\telse if (value === true && typeof below === 'number') continue\n\t\telse merged[key] = value\n\t}\n\treturn merged\n}\n\n/**\n * The settings layered, lowest first (see the file's comment): each area's values key by key, a flag taken into the area\n * it names in its own layer. A flag that is a function of the brain is asked of `ai`, and left out where none is given\n *\n * @beta\n */\nexport function resolveSettings(layers: readonly (AiSettings | undefined)[], ai?: Brain): AiSettings {\n\tlet resolved: Loose = {}\n\tfor (const layer of layers) if (layer) resolved = over(resolved, folded(layer, ai), '')\n\t// a share left at `true` is the area's own\n\tfor (const [path, kind] of Object.values(FLAGGED)) {\n\t\tif (kind !== 'share') continue\n\t\tconst area = resolved[path[0]] as Loose | undefined\n\t\tif (area?.[path[1]] === true) resolved[path[0]] = { ...area, [path[1]]: undefined }\n\t}\n\treturn resolved as AiSettings\n}\n"],"mappings":"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"}
@@ -81,7 +81,9 @@ export interface SquadData {
81
81
  * @beta
82
82
  */
83
83
  export interface SquadsMemory {
84
+ /** The version of the memory's format: 1 so far */
84
85
  v: 1;
86
+ /** Each squad's data */
85
87
  squads: SquadData[];
86
88
  }
87
89
  /**
@@ -90,13 +92,19 @@ export interface SquadsMemory {
90
92
  * @beta
91
93
  */
92
94
  export interface SquadReport {
95
+ /** The squad's name, by which it is found (`ai.squads.named`) */
93
96
  name: string;
97
+ /** What holds the squad: the module or goal that made it */
94
98
  owner: string;
99
+ /** The entity ids of its units */
95
100
  units: number[];
101
+ /** How strong its units are together */
96
102
  strength: number;
97
103
  /** Its middle */
98
104
  at?: [number, number];
105
+ /** How many units it has */
99
106
  size: number;
107
+ /** Its task: the kind, the phase it is in, since when, where, and how it ended once done */
100
108
  task?: {
101
109
  kind: string;
102
110
  phase: string;
@@ -104,7 +112,9 @@ export interface SquadReport {
104
112
  at?: [number, number];
105
113
  done?: TaskDone;
106
114
  };
115
+ /** How many times it retreated */
107
116
  retreats: number;
117
+ /** The tick its task last changed and why */
108
118
  changed?: {
109
119
  tick: number;
110
120
  why: string;
@@ -167,6 +177,7 @@ export declare class Squad {
167
177
  * What it was doing is over. Its first orders go at once; the squads module watches it from then on
168
178
  */
169
179
  task<D extends object, M extends object>(def: TaskDef<D, M>, data: D & TaskCommon): this;
180
+ /** Gives the squad a task of a game's own, by its definition and data; what it was doing is over and the squad is returned */
170
181
  task(kind: string, data?: TaskData): this;
171
182
  /** Ends its task, saying how: what a task's `think` calls once it is over */
172
183
  finish(done: TaskDone): void;
@@ -237,12 +248,12 @@ export declare class Squad {
237
248
  /** Sends its units an order (`move`, `hold`, the game's), all or some of them: counted as the task's last */
238
249
  order(order: OrderInit, units?: readonly number[], queue?: boolean): void;
239
250
  /**
240
- * Puts its units, all or some, in a stance, where the game has stances (`withStances`): those not in it already. A
251
+ * Puts its units, all or some, in a stance, where the game has stances (`stancesPack`): those not in it already. A
241
252
  * squad that holds is defensive, one sent to fight aggressive
242
253
  */
243
254
  setStance(id: string, units?: readonly number[]): void;
244
255
  /**
245
- * Sends its units to take a capture point of the game's (`withCapture`), by its id: they fight their way in and
256
+ * Sends its units to take a capture point of the game's (`capturePack`), by its id: they fight their way in and
246
257
  * stand in it until it is theirs (`captured`), or it is gone (`lost`)
247
258
  */
248
259
  capture(id: string): this;
@@ -275,6 +286,7 @@ export declare class SquadGroup implements Iterable<Squad> {
275
286
  ai: Brain,
276
287
  /** The squads */
277
288
  squads: readonly Squad[]);
289
+ /** Iterates the squads, so that the set reads as a list */
278
290
  [Symbol.iterator](): Iterator<Squad>;
279
291
  /** How many squads */
280
292
  get length(): number;
@@ -284,14 +296,20 @@ export declare class SquadGroup implements Iterable<Squad> {
284
296
  strength(): number;
285
297
  /** Each given the same task */
286
298
  task<D extends object, M extends object>(def: TaskDef<D, M>, data: D & TaskCommon): this;
299
+ /** Gives each squad the same task, by its kind and data, and returns the set */
287
300
  task(kind: string, data?: TaskData): this;
301
+ /** Tells each squad to attack a point, an entity or an entity id, as `Squad.attack` does, and returns the set */
288
302
  attack(target: Vec2 | EntityState | number, options?: {
289
303
  avoid?: 'army' | false;
290
304
  then?: TaskOrder;
291
305
  }): this;
306
+ /** Tells each squad to defend a place within a radius as `Squad.defend` does; does nothing without a place; returns the set */
292
307
  defend(at: Vec2 | undefined, radius?: number): this;
308
+ /** Tells each squad to hold at a place, or where it is, as `Squad.hold` does, and returns the set */
293
309
  hold(at?: Vec2): this;
310
+ /** Tells each squad to move to a point as `Squad.move` does, and returns the set */
294
311
  move(at: Vec2): this;
312
+ /** Tells each squad to retreat to a point, or home when left out, as `Squad.retreat` does, and returns the set */
295
313
  retreat(to?: Vec2): this;
296
314
  /** Each disbanded */
297
315
  disband(why?: string): void;
@@ -410,6 +428,7 @@ export declare class Squads implements AiArea {
410
428
  /** What the squads are, for a save: copies */
411
429
  /** Whether it has anything to remember now: one that does not is left out of a save */
412
430
  remembers(): boolean;
431
+ /** Gives the squads' data as plain data for a save of the brain */
413
432
  save(): SquadsMemory;
414
433
  /** Takes back what `save` gave: whether it was read. A squad on a task the brain does not know is kept, and does nothing */
415
434
  restore(memory: unknown): boolean;