@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 @@
1
+ {"version":3,"file":"knowledge.js","names":[],"sources":["../../src/ai/knowledge.ts"],"sourcesContent":["import type { ResourceId } from '#engine/defs'\nimport type { AiArea } from './area'\nimport type { PlayerId } from '#engine/entity'\nimport { distSq, type Vec2 } from '#engine/math'\nimport type { CampInfo, EntityState, FogState, MineInfo } from '#engine/session/protocol'\nimport type { AiView } from './view'\nimport { heroOfState } from '#engine/hero'\nimport { BASE_REACH, CELL } from './reach'\n\n/*\n * Knowledge: what a computer player remembers, with when (AI plan, A3). The view (`view.ts`) is one think's picture\n * and is thrown away with it; a person playing remembers more than what is on the screen: \"their army was at the river\n * twenty seconds ago\", \"they have a second hall by the far mine\", \"they have flyers now\", \"I lost three peasants at the\n * east mine\". This file is that memory. It is updated once a think, after the view is made, from the view and the\n * view of the think before (which says what the dead were), and it is plain data, kept in the brain's memory, so a\n * save keeps it and a load gives it back.\n *\n * What it keeps, and from what:\n * - the enemy's **structures**: the engine remembers them already for the team (`teamMemory`: a building seen and out\n * of sight is still in the snapshot, `visible: false`, until someone sees its spot empty). Knowledge adds when each\n * was first and last seen, and keeps one that is gone a while, so that a base that \"looks gone\" can be told from one\n * never seen. Bases are the structures clustered, as the view clusters one's own;\n * - the enemy's **army**: a unit out of sight is not in the snapshot at all, so where an army was is only ever a memory.\n * Each think the enemy fighters in sight are grouped by nearness into sightings (where, when, how many, of what); a\n * newer sighting near an older one replaces it (the army moved), and a sighting is dropped when its place is in\n * sight again with no one there, so the army is never chased where it no longer is;\n * - their **workers** and **heroes** as last seen, the unit **types** seen (with the most seen at once) and the **tech**\n * that implies (a knight means what knights require);\n * - the **map**: when each coarse cell was last in sight (`lastLooked`), from the seat's fog;\n * - one's **own** losses (what died, where, to what), the attacks sent, and what was gathered over time (`income`);\n * - what was **heard**: pings, damage to one's own and allies' units, deaths seen.\n *\n * Everything is bounded (at most so many of each kind, the oldest dropped) and ages (`KnowledgeOptions`,\n * `forget`). Nothing here takes the world: it reads the view, cut to the seat's fog, and the seat's fog itself.\n */\n\n/**\n * How a brain's knowledge remembers (`BrainDef.knowledge`): how long, how much, what counts as the army. Every field\n * has its default; numbers are seconds where they say so\n *\n * @beta\n */\nexport interface KnowledgeOptions {\n\t/** Seconds a sighting of the enemy's army, or of a worker, is kept: 180 */\n\tarmyFor?: number\n\t/** Seconds a structure seen gone is still remembered as gone, and an event, a loss or an attack sent is kept: 300 */\n\tkeepFor?: number\n\t/** How near two groups of enemy fighters are to be one sighting, and a newer sighting to replace an older: 16 */\n\tmergeRadius?: number\n\t/** Seconds between samples of what was gathered, for `own.income`: 5 */\n\thistoryEvery?: number\n\t/** At most so many of each: sightings 12, workers 40, heroes 16, structures 400, losses 64, events 48, attacks 20, samples 36 */\n\tlimits?: Partial<Record<'sightings' | 'workers' | 'heroes' | 'structures' | 'lost' | 'events' | 'attacks' | 'history', number>>\n\t/** What of the enemy's units in sight counts as their army: their soldiers and heroes (`UnitSet.fighters`) when left out */\n\tarmy?: (entity: EntityState, view: AiView) => boolean\n}\n\n/**\n * An enemy structure as remembered: where, what, whose, and when it was first and last in sight (ticks). `gone` is the\n * tick it was known to be gone: seen destroyed, or its spot seen empty\n *\n * @beta\n */\nexport interface StructureSeen {\n\t/** The entity id of the structure */\n\tid: number\n\t/** The unit type id of the structure */\n\ttype: string\n\t/** The player the structure belonged to when seen */\n\towner: PlayerId\n\t/** Where the structure stands, in cells */\n\tat: Vec2\n\t/** The tick it was first in sight */\n\tfirst: number\n\t/** The tick it was last in sight */\n\tlast: number\n\t/** The tick it was known to be gone; nothing while it stands as far as known */\n\tgone?: number\n}\n\n/**\n * A group of the enemy's fighters, seen together (`enemy.armySeen`): where its middle was, the tick, how many, of\n * what types, with how much health and strength, whose (the owner of most of them)\n *\n * @beta\n */\nexport interface ArmySighting {\n\t/** Where the middle of the group was, in cells */\n\tat: Vec2\n\t/** The tick the group was seen at */\n\ttick: number\n\t/** The player the most of the group belong to */\n\towner: PlayerId\n\t/** How many fighters the group has */\n\tcount: number\n\t/** Their health together, as seen */\n\thealth: number\n\t/** Their strength together, as seen (`Strength.of`, with the health each had left) */\n\tstrength: number\n\t/** How many of each unit type are in the group, by type id */\n\ttypes: Record<string, number>\n\t/** How many heroes are among them */\n\theroes: number\n}\n\n/**\n * An enemy unit as last seen (`enemy.workersSeen`, `enemy.heroesSeen`): `level` for a hero, `died` the tick it was\n * seen to die (a hero may come back)\n *\n * @beta\n */\nexport interface UnitSeen {\n\t/** The entity id of the unit */\n\tid: number\n\t/** The unit type id of the unit */\n\ttype: string\n\t/** The player the unit belongs to */\n\towner: PlayerId\n\t/** Where it was last seen, in cells */\n\tat: Vec2\n\t/** The tick it was last seen at */\n\ttick: number\n\t/** The hero's level as last seen; none for a unit that is not a hero */\n\tlevel?: number\n\t/** The tick it was seen to die; nothing while it is not known dead */\n\tdied?: number\n}\n\n/**\n * A unit type of the enemy's as seen (`enemy.typesSeen`): first and last tick, and the most seen at once\n *\n * @beta\n */\nexport interface TypeSeen {\n\t/** The tick the type was first seen */\n\tfirst: number\n\t/** The tick the type was last seen */\n\tlast: number\n\t/** The most units of the type seen at once */\n\tmost: number\n}\n\n/**\n * An enemy's base, as its structures remembered cluster (`enemy.bases`): around what takes deposits (a hall), or\n * around any structure where none does. `gone` when every structure of it is known gone; `expansion` for every base of\n * an owner but the first seen of theirs\n *\n * @beta\n */\nexport interface EnemyBase {\n\t/** The player the base belongs to */\n\towner: PlayerId\n\t/** Where the base is, in cells: its middle */\n\tat: Vec2\n\t/** When the first of it was seen */\n\tfirst: number\n\t/** When any of it was last in sight */\n\tlast: number\n\t/** The structures of it as remembered, gone ones included */\n\tstructures: StructureSeen[]\n\t/** Whether it is around what takes deposits: a hall, not a lone tower */\n\thall: boolean\n\t/** Whether every structure of it is known gone */\n\tgone: boolean\n\t/** Whether it is a further base of the owner, not the first seen of theirs */\n\texpansion: boolean\n}\n\n/**\n * Something of one's own that died (`own.lost`): what, where, when, to what type of killer where it was seen\n *\n * @beta\n */\nexport interface Loss {\n\t/** The entity id of what died */\n\tid: number\n\t/** The unit type id of what died */\n\ttype: string\n\t/** Where it died, in cells */\n\tat: Vec2\n\t/** The tick it died at */\n\ttick: number\n\t/** The unit type id of its killer, when it was seen */\n\tby?: string\n}\n\n/**\n * An attack a module sent (`own.attackSent`): when, where to, with how many\n *\n * @beta\n */\nexport interface AttackSent {\n\t/** The tick the attack was sent at */\n\ttick: number\n\t/** Where the attack was sent, in cells */\n\tat: Vec2\n\t/** How many units it was sent with */\n\tcount: number\n}\n\n/**\n * A ping heard (`events.pings`): who marked where, of what kind\n *\n * @beta\n */\nexport interface PingHeard {\n\t/** The tick the ping was heard at */\n\ttick: number\n\t/** The player who pinged */\n\tplayer: PlayerId\n\t/** Where the ping marked, in cells */\n\tat: Vec2\n\t/** The kind of ping, its id */\n\tkind: string\n}\n\n/**\n * Damage seen done to one's own or an ally's entity in a think (`events.damage`): added up over the think, one line\n * an entity\n *\n * @beta\n */\nexport interface DamageSeen {\n\t/** The tick the damage was seen in */\n\ttick: number\n\t/** The entity id of what was damaged */\n\tid: number\n\t/** The unit type id of what was damaged */\n\ttype: string\n\t/** The player whose entity it is */\n\towner: PlayerId\n\t/** Where it stood, in cells */\n\tat: Vec2\n\t/** The damage done to it over the think */\n\tamount: number\n\t/** The unit type id of what did it, when it was seen */\n\tby?: string\n}\n\n/**\n * A death seen (`events.deaths`): of anyone known to the seat in the think before\n *\n * @beta\n */\nexport interface DeathSeen {\n\t/** The tick the death was seen in */\n\ttick: number\n\t/** The entity id of what died */\n\tid: number\n\t/** The unit type id of what died */\n\ttype: string\n\t/** The player whose it was */\n\towner: PlayerId\n\t/** Where it died, in cells */\n\tat: Vec2\n\t/** The unit type id of what killed it, when it was seen */\n\tby?: string\n}\n\n/**\n * What a brain's knowledge is, as plain data: what a save keeps (`Brain.save`, under `knowledge`), what a game's module\n * may read or add to through `Knowledge`\n *\n * @beta\n */\nexport interface KnowledgeMemory {\n\t/** The version of the memory's format: 1 so far */\n\tv: 1\n\t/** The tick it was last brought up to date */\n\ttick: number\n\t/** The enemy structures remembered */\n\tstructures: StructureSeen[]\n\t/** Newest first */\n\tarmy: ArmySighting[]\n\t/** The enemy workers last seen */\n\tworkers: UnitSeen[]\n\t/** The enemy heroes last seen */\n\theroes: UnitSeen[]\n\t/** The enemy unit types seen, by type id */\n\ttypes: Record<string, TypeSeen>\n\t/** The tick each cell of the map was last in sight, row by row (-1: never); `cols` cells a row */\n\tlooked: { cols: number; rows: number; ticks: number[] }\n\t/** The own things that died, newest first */\n\tlost: Loss[]\n\t/** The attacks a module sent */\n\tattacks: AttackSent[]\n\t/** What was gathered of each resource since the game began, as far as rises in what the player has tell */\n\tgathered: Record<ResourceId, number>\n\t/** What the player had at the last update, to see the next rise against */\n\thad?: Record<ResourceId, number>\n\t/** Samples of `gathered`, oldest first */\n\thistory: { tick: number; gathered: Record<ResourceId, number> }[]\n\t/** The pings heard */\n\tpings: PingHeard[]\n\t/** The damage seen in the last thinks */\n\tdamage: DamageSeen[]\n\t/** The deaths seen in the last thinks */\n\tdeaths: DeathSeen[]\n}\n\nconst LIMITS = { sightings: 12, workers: 40, heroes: 16, structures: 400, lost: 64, events: 48, attacks: 20, history: 36 }\n\nconst empty = (): KnowledgeMemory => ({\n\tv: 1,\n\ttick: 0,\n\tstructures: [],\n\tarmy: [],\n\tworkers: [],\n\theroes: [],\n\ttypes: {},\n\tlooked: { cols: 0, rows: 0, ticks: [] },\n\tlost: [],\n\tattacks: [],\n\tgathered: {},\n\thistory: [],\n\tpings: [],\n\tdamage: [],\n\tdeaths: []\n})\n\nconst at = (point: Vec2): Vec2 => ({ x: point.x, z: point.z })\n\n/** Keeps the last `limit` of a list (the newest, for lists kept oldest first) */\nfunction trimOldest<T>(list: T[], limit: number): void {\n\tif (list.length > limit) list.splice(0, list.length - limit)\n}\n\n/**\n * What a computer player remembers of the enemy, the map and itself, with when (`Brain.knowledge`). Brought up to date\n * once a think from the view; asked through its parts: `enemy` (structures, bases, army seen, workers, heroes, tech),\n * `map` (when a place was last looked at), `own` (losses, attacks sent, income), `events` (pings, damage, deaths heard).\n * Plain data underneath (`data`), saved with the brain\n *\n * @beta\n */\nexport class Knowledge implements AiArea {\n\t/** Its id among the brain's areas: what its memory and its report are kept under */\n\treadonly id = 'knowledge'\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 what the computer player knew in a shape this brain does not read: it starts afresh'\n\n\t/** What it remembers, as plain data. Replaced as a whole by `restore` */\n\tdata: KnowledgeMemory = empty()\n\t/** The enemy: structures, bases, army, workers, heroes, tech */\n\treadonly enemy: EnemyKnowledge\n\t/** The map: when each place was last in sight */\n\treadonly map: MapKnowledge\n\t/** One's own: losses, attacks sent, income */\n\treadonly own: OwnKnowledge\n\t/** What was heard: pings, damage to friends, deaths */\n\treadonly events: HeardEvents\n\t/** @internal The view of the last update: for what is asked of the map now */\n\tview: AiView | undefined\n\t/** @internal The seat's fog as of the last update */\n\tfog: FogState | undefined\n\t/** Where in the fog each cell of the map is read: found again when the fog or the map is of another size */\n\tprivate sample: { fog: number; cells: Int32Array } | undefined\n\t/** The options it runs with: those given over the defaults, the limits being the built-in ones */\n\treadonly options: Required<Omit<KnowledgeOptions, 'army' | 'limits'>> & Pick<KnowledgeOptions, 'army'> & { limits: typeof LIMITS }\n\n\tconstructor(\n\t\toptions: KnowledgeOptions = {},\n\t\t/** The map's size, where known before the first update: what is looked at can be told before it (an older save) */\n\t\tsize?: { width: number; depth: number },\n\t\t/** Whether a save keeps it: not for a brain that remembers nothing between thinks (`BrainDef.knowledge: false`) */\n\t\tprivate readonly kept = true\n\t) {\n\t\tthis.options = {\n\t\t\tarmyFor: options.armyFor ?? 180,\n\t\t\tkeepFor: options.keepFor ?? 300,\n\t\t\tmergeRadius: options.mergeRadius ?? 16,\n\t\t\thistoryEvery: options.historyEvery ?? 5,\n\t\t\tarmy: options.army,\n\t\t\tlimits: { ...LIMITS, ...options.limits }\n\t\t}\n\t\tthis.enemy = new EnemyKnowledge(this)\n\t\tthis.map = new MapKnowledge(this)\n\t\tthis.own = new OwnKnowledge(this)\n\t\tthis.events = new HeardEvents(this)\n\t\tif (size) this.size(size.width, size.depth)\n\t}\n\n\t/** Makes what is remembered of the map the size of a map of this many units: forgotten where it was another size */\n\tprivate size(width: number, depth: number): void {\n\t\tconst cols = Math.max(1, Math.ceil(width / CELL))\n\t\tconst rows = Math.max(1, Math.ceil(depth / CELL))\n\t\tconst looked = this.data.looked\n\t\tif (looked.cols !== cols || looked.rows !== rows) this.data.looked = { cols, rows, ticks: new Array(cols * rows).fill(-1) }\n\t}\n\n\t/** The tick it was last brought up to date */\n\tget tick(): number {\n\t\treturn this.data.tick\n\t}\n\n\t/** @internal Seconds into the game of a tick, at the seat's rate */\n\tseconds(ticks: number): number {\n\t\treturn ticks / (this.view?.session.tickRate ?? 1)\n\t}\n\n\t/** @internal The tick so many seconds before the last update */\n\tsince(seconds: number | undefined): number {\n\t\tif (seconds === undefined) return -Infinity\n\t\treturn this.data.tick - seconds * (this.view?.session.tickRate ?? 1)\n\t}\n\n\t/**\n\t * Brings it up to date from a think's view. `before` is the view of the think before: what the dead of this think\n\t * were (a death says only an id). What the brain calls as each think begins, after the view is made\n\t */\n\tupdate(view: AiView, before?: AiView): void {\n\t\tconst { data, options } = this\n\t\tconst tick = view.tick\n\t\tconst rate = view.session.tickRate\n\t\tthis.view = view\n\t\tthis.enemy.reset()\n\t\tdata.tick = tick\n\t\tconst sees = this.lookAround(view)\n\n\t\t// the enemy's structures: those the snapshot has, in sight or remembered by the team; one it no longer has is known gone\n\t\tconst known = new Set<number>()\n\t\tconst byId = new Map(data.structures.map((each) => [each.id, each]))\n\t\tfor (const building of view.enemies.known().buildings()) {\n\t\t\tknown.add(building.id)\n\t\t\tlet seen = byId.get(building.id)\n\t\t\tif (!seen) {\n\t\t\t\tseen = { id: building.id, type: building.type, owner: building.owner, at: at(building), first: tick, last: tick }\n\t\t\t\tdata.structures.push(seen)\n\t\t\t\tbyId.set(building.id, seen)\n\t\t\t}\n\t\t\t// a building can turn into another (a hall into a keep), and is seen where it stands\n\t\t\tseen.type = building.type\n\t\t\tseen.at = at(building)\n\t\t\tif (building.visible) seen.last = tick\n\t\t\tdelete seen.gone\n\t\t}\n\t\tconst goneFor = options.keepFor * rate\n\t\tdata.structures = data.structures.filter((each) => {\n\t\t\tif (!known.has(each.id) && each.gone === undefined) each.gone = tick\n\t\t\treturn each.gone === undefined || tick - each.gone <= goneFor\n\t\t})\n\t\ttrimOldest(data.structures, options.limits.structures)\n\n\t\t// the types seen, with the most at once: what is in sight now\n\t\tconst now: Record<string, number> = {}\n\t\tfor (const entity of view.enemies) now[entity.type] = (now[entity.type] ?? 0) + 1\n\t\tfor (const [type, count] of Object.entries(now)) {\n\t\t\tconst seen = (data.types[type] ??= { first: tick, last: tick, most: 0 })\n\t\t\tseen.last = tick\n\t\t\tseen.most = Math.max(seen.most, count)\n\t\t}\n\n\t\tthis.seeArmy(view, sees)\n\t\tthis.seeUnits(view, sees)\n\t\tthis.hear(view, before)\n\t\tthis.count(view)\n\t}\n\n\t/** Brings what was last looked at up to date from the seat's fog: what is in sight now, by cell (1 for in sight) */\n\t/**\n\t * Reads the think's picture through this view without remembering anything of it: for a think a game loaded from a\n\t * save goes on with (`BrainMemory.thinking`), whose picture the saved game remembered already, so that what is restored\n\t * is as it was after that; only what is asked of the map now needs the view it is asked through\n\t */\n\tresume(view: AiView): void {\n\t\tthis.view = view\n\t\tthis.fog = view.session.fog()\n\t\tthis.size(view.session.terrain.width, view.session.terrain.depth)\n\t\tthis.enemy.reset()\n\t}\n\n\tprivate lookAround(view: AiView): Uint8Array {\n\t\tconst { width, depth } = view.session.terrain\n\t\t// a map of another size than what was remembered (a save of another map): what was looked at is forgotten\n\t\tthis.size(width, depth)\n\t\tconst { cols, rows } = this.data.looked\n\t\tconst ticks = this.data.looked.ticks\n\t\tconst fog = view.session.fog()\n\t\tthis.fog = fog\n\t\tconst sees = new Uint8Array(cols * rows)\n\t\tconst tick = view.tick\n\t\tif (fog.revealed || !fog.visible.length) {\n\t\t\tsees.fill(1)\n\t\t\tticks.fill(tick)\n\t\t\treturn sees\n\t\t}\n\t\t// where in the fog each cell's middle falls, worked out once for the map and the fog's size\n\t\tlet sample = this.sample\n\t\tif (!sample || sample.fog !== fog.width * 65536 + fog.depth || sample.cells.length !== cols * rows) {\n\t\t\tconst cells = new Int32Array(cols * rows)\n\t\t\tfor (let r = 0; r < rows; r++) {\n\t\t\t\tconst fz = Math.min(fog.depth - 1, Math.floor((((r + 0.5) * CELL) / depth) * fog.depth))\n\t\t\t\tfor (let c = 0; c < cols; c++)\n\t\t\t\t\tcells[r * cols + c] = fz * fog.width + Math.min(fog.width - 1, Math.floor((((c + 0.5) * CELL) / width) * fog.width))\n\t\t\t}\n\t\t\tsample = this.sample = { fog: fog.width * 65536 + fog.depth, cells }\n\t\t}\n\t\tconst { visible } = fog\n\t\tconst { cells } = sample\n\t\tfor (let i = 0; i < cells.length; i++) {\n\t\t\tif (!visible[cells[i]]) continue\n\t\t\tsees[i] = 1\n\t\t\tticks[i] = tick\n\t\t}\n\t\treturn sees\n\t}\n\n\t/** @internal The cell of a point, in what is remembered of the map: -1 off it */\n\tcell(point: Vec2): number {\n\t\tconst { cols, rows } = this.data.looked\n\t\tconst c = Math.floor(point.x / CELL)\n\t\tconst r = Math.floor(point.z / CELL)\n\t\tif (c < 0 || r < 0 || c >= cols || r >= rows) return -1\n\t\treturn r * cols + c\n\t}\n\n\t/**\n\t * The enemy's fighters in sight, grouped by nearness into sightings. A newer sighting replaces the older ones near\n\t * it (the army moved); an older one whose place is in sight with no sighting near is dropped (no one is there now)\n\t */\n\tprivate seeArmy(view: AiView, sees: Uint8Array): void {\n\t\tconst { data, options } = this\n\t\tconst tick = view.tick\n\t\tconst merge = options.mergeRadius * options.mergeRadius\n\t\tconst fighters = options.army ? view.enemies.units().where((entity) => options.army!(entity, view)) : view.enemies.units().fighters()\n\t\t// grouped greedily in the snapshot's order: each joins the first group whose first member is near, or starts one\n\t\tconst groups: EntityState[][] = []\n\t\tfor (const unit of fighters) {\n\t\t\tif (unit.health <= 0) continue\n\t\t\tconst group = groups.find((each) => distSq(each[0], unit) <= merge)\n\t\t\tif (group) group.push(unit)\n\t\t\telse groups.push([unit])\n\t\t}\n\t\tconst fresh: ArmySighting[] = groups.map((group) => {\n\t\t\tlet x = 0\n\t\t\tlet z = 0\n\t\t\tlet health = 0\n\t\t\tlet strength = 0\n\t\t\tlet heroes = 0\n\t\t\tconst types: Record<string, number> = {}\n\t\t\tconst owners = new Map<PlayerId, number>()\n\t\t\tfor (const unit of group) {\n\t\t\t\tx += unit.x\n\t\t\t\tz += unit.z\n\t\t\t\thealth += unit.health\n\t\t\t\tstrength += view.strength.of(unit)\n\t\t\t\tif (view.hasRole(unit, 'hero')) heroes++\n\t\t\t\ttypes[unit.type] = (types[unit.type] ?? 0) + 1\n\t\t\t\towners.set(unit.owner, (owners.get(unit.owner) ?? 0) + 1)\n\t\t\t}\n\t\t\tlet owner = group[0].owner\n\t\t\tfor (const [player, count] of owners) if (count > owners.get(owner)!) owner = player\n\t\t\treturn { at: { x: x / group.length, z: z / group.length }, tick, owner, count: group.length, health, strength, types, heroes }\n\t\t})\n\t\tconst oldest = tick - options.armyFor * view.session.tickRate\n\t\tconst kept = data.army.filter((old) => {\n\t\t\tif (old.tick < oldest) return false\n\t\t\tif (fresh.some((each) => distSq(each.at, old.at) <= merge)) return false\n\t\t\t// looked at again, and no one there\n\t\t\tconst cell = this.cell(old.at)\n\t\t\treturn cell < 0 || !sees[cell]\n\t\t})\n\t\tdata.army = [...fresh, ...kept].slice(0, options.limits.sightings)\n\t}\n\n\t/**\n\t * The enemy's workers and heroes in sight, by id, where they were. A worker whose place is in sight and who is not\n\t * there is forgotten; a hero is kept where last seen (there are few, and where they went matters)\n\t */\n\tprivate seeUnits(view: AiView, sees: Uint8Array): void {\n\t\tconst { data, options } = this\n\t\tconst tick = view.tick\n\t\tconst workers = new Map(data.workers.map((each) => [each.id, each]))\n\t\tfor (const unit of view.enemies.units()) {\n\t\t\tconst worker = view.hasRole(unit, 'worker') || (view.hasRole(unit, 'gatherer') && !view.hasRole(unit, 'soldier'))\n\t\t\tif (!worker) continue\n\t\t\tconst seen = workers.get(unit.id)\n\t\t\tif (seen) {\n\t\t\t\tseen.at = at(unit)\n\t\t\t\tseen.tick = tick\n\t\t\t} else workers.set(unit.id, { id: unit.id, type: unit.type, owner: unit.owner, at: at(unit), tick })\n\t\t}\n\t\tconst oldest = tick - options.armyFor * view.session.tickRate\n\t\tdata.workers = [...workers.values()].filter((each) => {\n\t\t\tif (each.tick === tick) return true\n\t\t\tconst cell = this.cell(each.at)\n\t\t\treturn each.tick >= oldest && (cell < 0 || !sees[cell])\n\t\t})\n\t\tdata.workers.sort((a, b) => b.tick - a.tick || a.id - b.id)\n\t\tdata.workers.length = Math.min(data.workers.length, options.limits.workers)\n\n\t\tconst heroes = new Map(data.heroes.map((each) => [each.id, each]))\n\t\tfor (const hero of view.enemies.heroes()) {\n\t\t\tconst seen = heroes.get(hero.id) ?? { id: hero.id, type: hero.type, owner: hero.owner, at: at(hero), tick }\n\t\t\tseen.type = hero.type\n\t\t\tseen.at = at(hero)\n\t\t\tseen.tick = tick\n\t\t\tconst level = heroOfState(hero)?.level\n\t\t\tif (level !== undefined) seen.level = level\n\t\t\tdelete seen.died\n\t\t\theroes.set(hero.id, seen)\n\t\t}\n\t\tdata.heroes = [...heroes.values()]\n\t\tdata.heroes.sort((a, b) => b.tick - a.tick || a.id - b.id)\n\t\tdata.heroes.length = Math.min(data.heroes.length, options.limits.heroes)\n\t}\n\n\t/** What the think's events say: deaths (one's own among them, as losses), pings, damage to one's own and allies' */\n\tprivate hear(view: AiView, before: AiView | undefined): void {\n\t\tconst { data, options } = this\n\t\tconst tick = view.tick\n\t\tconst limit = options.limits.events\n\t\tfor (const death of view.events.of('death')) {\n\t\t\t// a death says only an id: what it was is in the picture before, where the seat knew of it\n\t\t\tconst was = before?.byId(death.id) ?? view.byId(death.id)\n\t\t\tif (!was) continue\n\t\t\tconst by = death.killerType\n\t\t\tconst seen: DeathSeen = { tick, id: was.id, type: was.type, owner: was.owner, at: at(was), ...(by && { by }) }\n\t\t\tdata.deaths.push(seen)\n\t\t\tif (was.owner === view.playerId) data.lost.push({ id: was.id, type: was.type, at: seen.at, tick, ...(by && { by }) })\n\t\t\tconst worker = data.workers.findIndex((each) => each.id === was.id)\n\t\t\tif (worker >= 0) data.workers.splice(worker, 1)\n\t\t\tconst hero = data.heroes.find((each) => each.id === was.id)\n\t\t\tif (hero) hero.died = tick\n\t\t}\n\t\ttrimOldest(data.deaths, limit)\n\t\ttrimOldest(data.lost, options.limits.lost)\n\n\t\tfor (const ping of view.events.of('ping')) data.pings.push({ tick, player: ping.player, at: { x: ping.x, z: ping.z }, kind: ping.kind })\n\t\ttrimOldest(data.pings, limit)\n\n\t\t// damage comes many a think in a fight: added up to one line an entity\n\t\tconst damage = view.events.of('damage')\n\t\tif (damage.length) {\n\t\t\tconst byEntity = new Map<number, DamageSeen>()\n\t\t\tfor (const hit of damage) {\n\t\t\t\tconst target = view.byId(hit.id) ?? before?.byId(hit.id)\n\t\t\t\tif (!target || !view.isFriendly(target)) continue\n\t\t\t\tconst line = byEntity.get(hit.id)\n\t\t\t\tif (line) line.amount += hit.amount\n\t\t\t\telse\n\t\t\t\t\tbyEntity.set(hit.id, {\n\t\t\t\t\t\ttick,\n\t\t\t\t\t\tid: hit.id,\n\t\t\t\t\t\ttype: target.type,\n\t\t\t\t\t\towner: target.owner,\n\t\t\t\t\t\tat: at(target),\n\t\t\t\t\t\tamount: hit.amount,\n\t\t\t\t\t\t...(hit.sourceType && { by: hit.sourceType })\n\t\t\t\t\t})\n\t\t\t}\n\t\t\tfor (const line of byEntity.values()) data.damage.push(line)\n\t\t\ttrimOldest(data.damage, limit)\n\t\t}\n\t\tthis.forgetOlder(this.since(options.keepFor), false)\n\t}\n\n\t/** What was gathered: every rise in what the player has, added up; sampled every `historyEvery` seconds */\n\tprivate count(view: AiView): void {\n\t\tconst { data, options } = this\n\t\tconst resources = view.me.resources\n\t\tif (data.had) {\n\t\t\tfor (const [kind, amount] of Object.entries(resources)) {\n\t\t\t\tconst rise = amount - (data.had[kind] ?? 0)\n\t\t\t\tif (rise > 0) data.gathered[kind] = (data.gathered[kind] ?? 0) + rise\n\t\t\t}\n\t\t}\n\t\tdata.had = { ...resources }\n\t\tconst last = data.history[data.history.length - 1]\n\t\tif (!last || view.tick - last.tick >= options.historyEvery * view.session.tickRate) {\n\t\t\tdata.history.push({ tick: view.tick, gathered: { ...data.gathered } })\n\t\t\ttrimOldest(data.history, options.limits.history)\n\t\t}\n\t}\n\n\t/** Forgets what is older than so many seconds: sightings, workers, losses, attacks, what was heard, structures long gone */\n\tforget(olderThan: number): void {\n\t\tthis.forgetOlder(this.since(olderThan), true)\n\t}\n\n\tprivate forgetOlder(oldest: number, all: boolean): void {\n\t\tconst { data } = this\n\t\tconst keep = <T extends { tick: number }>(list: T[]) => list.filter((each) => each.tick >= oldest)\n\t\tdata.lost = keep(data.lost)\n\t\tdata.attacks = keep(data.attacks)\n\t\tdata.pings = keep(data.pings)\n\t\tdata.damage = keep(data.damage)\n\t\tdata.deaths = keep(data.deaths)\n\t\tif (!all) return\n\t\tdata.army = keep(data.army)\n\t\tdata.workers = keep(data.workers)\n\t\tdata.heroes = keep(data.heroes)\n\t\tdata.structures = data.structures.filter((each) => each.gone === undefined || each.gone >= oldest)\n\t\tthis.enemy.reset()\n\t}\n\n\t/** What it remembers, as plain data 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.kept\n\t}\n\n\t/** Gives a copy of what is known, as plain data for a save of the brain */\n\tsave(): KnowledgeMemory {\n\t\t// the map's cells copied as a list of numbers, much faster than `structuredClone` walks them; the rest cloned, its\n\t\t// keys in their order\n\t\tconst { looked } = this.data\n\t\tconst copy = structuredClone({ ...this.data, looked: undefined }) as unknown as KnowledgeMemory\n\t\tcopy.looked = { cols: looked.cols, rows: looked.rows, ticks: looked.ticks.slice() }\n\t\treturn copy\n\t}\n\n\t/** Takes back what `save` gave. Memory of another shape is dropped: it starts afresh */\n\trestore(memory: unknown): boolean {\n\t\tconst data = memory as KnowledgeMemory | undefined\n\t\tif (!data || typeof data !== 'object' || data.v !== 1) return false\n\t\tthis.data = { ...empty(), ...structuredClone(data) }\n\t\t// a sighting from before sightings had a strength is let go: the army will be seen again, the sighting would not add up\n\t\tthis.data.army = this.data.army.filter((sighting) => typeof sighting.strength === 'number')\n\t\tthis.enemy.reset()\n\t\treturn true\n\t}\n\n\t/** What it knows, in short, for the debug tools: bases, the army seen with its age, the tech seen */\n\tinspect(): Record<string, unknown> {\n\t\tconst age = (tick: number) => Math.round(this.seconds(this.data.tick - tick))\n\t\treturn {\n\t\t\tbases: this.enemy.bases().map((base) => ({\n\t\t\t\towner: base.owner,\n\t\t\t\tat: [Math.round(base.at.x), Math.round(base.at.z)],\n\t\t\t\tstructures: base.structures.length,\n\t\t\t\tseen: age(base.last),\n\t\t\t\t...(base.gone && { gone: true })\n\t\t\t})),\n\t\t\tarmy: this.data.army.map((each) => ({ at: [Math.round(each.at.x), Math.round(each.at.z)], count: each.count, seen: age(each.tick) })),\n\t\t\ttech: this.enemy.techSeen(),\n\t\t\tlost: this.data.lost.length\n\t\t}\n\t}\n}\n\n/**\n * What a computer player remembers of its enemies (`knowledge.enemy`): their structures and bases, their army as last\n * seen, their workers and heroes, the types and tech seen. Creeps are no one's enemy here\n *\n * @beta\n */\nexport class EnemyKnowledge {\n\tprivate basesFound: EnemyBase[] | undefined\n\tprivate trainedBy: { registry: object; by: Map<string, string[]> } | undefined\n\n\tconstructor(private readonly knowledge: Knowledge) {}\n\n\t/** @internal Forgets what was worked out of the data: it changed */\n\treset(): void {\n\t\tthis.basesFound = undefined\n\t}\n\n\t/** Their structures remembered and not known gone (`gone: true` for those too), of one owner where given */\n\tstructures(options: { owner?: PlayerId; gone?: boolean } = {}): StructureSeen[] {\n\t\treturn this.knowledge.data.structures.filter(\n\t\t\t(each) => (options.gone || each.gone === undefined) && (options.owner === undefined || each.owner === options.owner)\n\t\t)\n\t}\n\n\t/**\n\t * Their bases: the structures remembered, gone ones too, clustered by owner around what takes deposits (a hall), or\n\t * around any structure where none does. The first seen of each owner's first; `gone` where all of it is known gone\n\t */\n\tbases(owner?: PlayerId): EnemyBase[] {\n\t\tconst all = (this.basesFound ??= this.cluster())\n\t\treturn owner === undefined ? all : all.filter((base) => base.owner === owner)\n\t}\n\n\tprivate cluster(): EnemyBase[] {\n\t\tconst { knowledge } = this\n\t\tconst registry = knowledge.view?.registry\n\t\tconst reach = BASE_REACH * BASE_REACH\n\t\tconst takesDeposits = (each: StructureSeen) => !!registry?.units.has(each.type) && !!registry.unit(each.type).dropOff\n\t\t// by the time each was first seen, so the first base of an owner is the first found of theirs\n\t\tconst structures = [...knowledge.data.structures].sort((a, b) => a.first - b.first || a.id - b.id)\n\t\tconst bases: EnemyBase[] = []\n\t\tconst centreOf = (each: StructureSeen) => bases.find((base) => base.owner === each.owner && distSq(base.at, each.at) < reach)\n\t\tfor (const each of structures) {\n\t\t\tif (!takesDeposits(each) || centreOf(each)) continue\n\t\t\tbases.push({\n\t\t\t\towner: each.owner,\n\t\t\t\tat: at(each.at),\n\t\t\t\tfirst: each.first,\n\t\t\t\tlast: each.last,\n\t\t\t\tstructures: [],\n\t\t\t\thall: true,\n\t\t\t\tgone: false,\n\t\t\t\texpansion: false\n\t\t\t})\n\t\t}\n\t\tfor (const each of structures) {\n\t\t\tlet base = centreOf(each)\n\t\t\tif (!base) {\n\t\t\t\tbase = { owner: each.owner, at: at(each.at), first: each.first, last: each.last, structures: [], hall: false, gone: false, expansion: false }\n\t\t\t\tbases.push(base)\n\t\t\t}\n\t\t\tbase.structures.push(each)\n\t\t\tbase.first = Math.min(base.first, each.first)\n\t\t\tbase.last = Math.max(base.last, each.last)\n\t\t}\n\t\tconst firstOf = new Set<PlayerId>()\n\t\tbases.sort((a, b) => a.first - b.first || a.owner - b.owner)\n\t\tfor (const base of bases) {\n\t\t\tbase.gone = base.structures.every((each) => each.gone !== undefined)\n\t\t\tif (!base.hall) continue\n\t\t\tif (firstOf.has(base.owner)) base.expansion = true\n\t\t\telse firstOf.add(base.owner)\n\t\t}\n\t\treturn bases\n\t}\n\n\t/** Their bases beyond the first of each owner's, with a hall: where they expanded to, as far as seen */\n\texpansionsSeen(): EnemyBase[] {\n\t\treturn this.bases().filter((base) => base.expansion && !base.gone)\n\t}\n\n\t/** Their army as last seen, in groups, newest first; only those seen within so many seconds where given */\n\tarmySeen(withinSeconds?: number): ArmySighting[] {\n\t\tconst oldest = this.knowledge.since(withinSeconds)\n\t\treturn this.knowledge.data.army.filter((each) => each.tick >= oldest)\n\t}\n\n\t/** Their workers as last seen, newest first; only those seen within so many seconds where given */\n\tworkersSeen(withinSeconds?: number): UnitSeen[] {\n\t\tconst oldest = this.knowledge.since(withinSeconds)\n\t\treturn this.knowledge.data.workers.filter((each) => each.tick >= oldest)\n\t}\n\n\t/** Their heroes as last seen, newest first: type, level, where, and `died` when seen to die */\n\theroesSeen(): UnitSeen[] {\n\t\treturn this.knowledge.data.heroes\n\t}\n\n\t/** The unit and structure types of theirs seen, with when and the most seen at once */\n\ttypesSeen(): Readonly<Record<string, TypeSeen>> {\n\t\treturn this.knowledge.data.types\n\t}\n\n\t/** The most of a type of theirs seen at once: 0 for one never seen */\n\tmostSeen(type: string): number {\n\t\treturn this.knowledge.data.types[type]?.most ?? 0\n\t}\n\n\t/**\n\t * What they have, as far as what was seen tells: the types seen; what those require, named as `UnitTypeDef.requires`\n\t * names them; and the building that trains a type, where only one does (a gryphon means an aviary, and what an aviary\n\t * requires). Sorted, for the same answer every time\n\t */\n\ttechSeen(): string[] {\n\t\tconst registry = this.knowledge.view?.registry\n\t\tconst tech = new Set<string>()\n\t\tconst add = (id: string) => {\n\t\t\tif (tech.has(id)) return\n\t\t\ttech.add(id)\n\t\t\tif (!registry?.units.has(id)) return\n\t\t\tfor (const need of registry.unit(id).requires ?? []) add(need)\n\t\t\tconst trainers = this.trainersOf(id)\n\t\t\tif (trainers.length === 1) add(trainers[0])\n\t\t}\n\t\tfor (const type of Object.keys(this.knowledge.data.types)) add(type)\n\t\treturn [...tech].sort()\n\t}\n\n\t/** The building types that train a unit type, found once for the game's definitions */\n\tprivate trainersOf(type: string): readonly string[] {\n\t\tconst registry = this.knowledge.view?.registry\n\t\tif (!registry) return []\n\t\tif (this.trainedBy?.registry !== registry) {\n\t\t\tconst by = new Map<string, string[]>()\n\t\t\tfor (const def of registry.units.all())\n\t\t\t\tfor (const trained of def.trains ?? []) (by.get(trained) ?? by.set(trained, []).get(trained)!).push(def.id)\n\t\t\tthis.trainedBy = { registry, by }\n\t\t}\n\t\treturn this.trainedBy.by.get(type) ?? []\n\t}\n\n\t/** Takes in what a type seen was, where the game or an older save tells: as if seen, `count` at once, at a tick */\n\tsawType(type: string, count: number, tick = this.knowledge.tick): void {\n\t\tconst seen = (this.knowledge.data.types[type] ??= { first: tick, last: tick, most: 0 })\n\t\tseen.last = Math.max(seen.last, tick)\n\t\tseen.most = Math.max(seen.most, count)\n\t}\n}\n\n/**\n * What a computer player remembers of the map (`knowledge.map`): when each place was last in sight. The cells are of\n * the view's grid (8 units)\n *\n * @beta\n */\nexport class MapKnowledge {\n\tconstructor(private readonly knowledge: Knowledge) {}\n\n\t/** The tick a place was last in sight of the seat's team: none for a place never seen */\n\tlastLooked(point: Vec2): number | undefined {\n\t\tconst cell = this.knowledge.cell(point)\n\t\tconst tick = cell < 0 ? -1 : (this.knowledge.data.looked.ticks[cell] ?? -1)\n\t\treturn tick < 0 ? undefined : tick\n\t}\n\n\t/** Seconds since a place was last in sight: `Infinity` for one never seen */\n\tsinceLooked(point: Vec2): number {\n\t\tconst tick = this.lastLooked(point)\n\t\treturn tick === undefined ? Infinity : this.knowledge.seconds(this.knowledge.tick - tick)\n\t}\n\n\t/** Whether a place is in sight now, as of the last update */\n\tinSight(point: Vec2): boolean {\n\t\treturn this.lastLooked(point) === this.knowledge.tick && this.knowledge.view !== undefined\n\t}\n\n\t/** Whether the seat's team has explored a place: seen it once, as the fog says */\n\texplored(point: Vec2): boolean {\n\t\tconst { fog, view } = this.knowledge\n\t\tif (!fog || !view) return this.lastLooked(point) !== undefined\n\t\tif (fog.revealed || !fog.explored.length) return true\n\t\tconst { width, depth } = view.session.terrain\n\t\tconst fx = Math.floor((point.x / width) * fog.width)\n\t\tconst fz = Math.floor((point.z / depth) * fog.depth)\n\t\tif (fx < 0 || fz < 0 || fx >= fog.width || fz >= fog.depth) return false\n\t\treturn !!fog.explored[fz * fog.width + fx]\n\t}\n\n\t/** Takes in that a place was looked at, at a tick: where the game or an older save tells */\n\tlook(point: Vec2, tick = this.knowledge.tick): void {\n\t\tconst cell = this.knowledge.cell(point)\n\t\tconst ticks = this.knowledge.data.looked.ticks\n\t\tif (cell >= 0) ticks[cell] = Math.max(ticks[cell] ?? -1, tick)\n\t}\n\n\t/**\n\t * The map's mines (`view.mines`), each with when its place was last looked at and whose base is by it, as far as\n\t * known: where to expand, where to look for theirs\n\t */\n\tmines(): (MineInfo & { looked?: number; taken?: PlayerId })[] {\n\t\tconst view = this.knowledge.view\n\t\tif (!view) return []\n\t\tconst mine = view.bases()\n\t\tconst theirs = this.knowledge.enemy.bases().filter((base) => base.hall && !base.gone)\n\t\tconst reach = BASE_REACH * BASE_REACH\n\t\treturn view.mines().map((each) => {\n\t\t\tconst looked = this.lastLooked(each)\n\t\t\tconst taken = mine.some((base) => distSq(base.at, each) < reach) ? view.playerId : theirs.find((base) => distSq(base.at, each) < reach)?.owner\n\t\t\treturn { ...each, ...(looked !== undefined && { looked }), ...(taken !== undefined && { taken }) }\n\t\t})\n\t}\n\n\t/** The map's creep camps, as the seat knows them (`view.camps`) */\n\tcamps(): readonly CampInfo[] {\n\t\treturn this.knowledge.view?.camps() ?? []\n\t}\n}\n\n/**\n * What a computer player remembers of itself (`knowledge.own`): what it lost, the attacks it sent, what it gathered\n *\n * @beta\n */\nexport class OwnKnowledge {\n\tconstructor(private readonly knowledge: Knowledge) {}\n\n\t/** What of its own died, oldest first; only within so many seconds where given */\n\tlost(withinSeconds?: number): Loss[] {\n\t\tconst oldest = this.knowledge.since(withinSeconds)\n\t\treturn this.knowledge.data.lost.filter((each) => each.tick >= oldest)\n\t}\n\n\t/** What of its own died within a distance of a place: \"we are being raided here\" */\n\tlostNear(point: Vec2, radius: number, withinSeconds?: number): Loss[] {\n\t\tconst reach = radius * radius\n\t\treturn this.lost(withinSeconds).filter((each) => distSq(each.at, point) <= reach)\n\t}\n\n\t/** Notes an attack sent, for whoever asks later (`attacks`): what a module that sends an army calls */\n\tattackSent(point: Vec2, count: number): void {\n\t\tconst { data, options } = this.knowledge\n\t\tdata.attacks.push({ tick: data.tick, at: at(point), count })\n\t\ttrimOldest(data.attacks, options.limits.attacks)\n\t}\n\n\t/** The attacks sent, oldest first; only within so many seconds where given */\n\tattacks(withinSeconds?: number): AttackSent[] {\n\t\tconst oldest = this.knowledge.since(withinSeconds)\n\t\treturn this.knowledge.data.attacks.filter((each) => each.tick >= oldest)\n\t}\n\n\t/**\n\t * What it gathers of a resource a minute, over the last so many seconds (60): from the rises in what it has, so it\n\t * is at least this (what was gathered and spent between two thinks does not show). Bounty counts as gathered\n\t */\n\tincome(kind: ResourceId, seconds = 60): number {\n\t\tconst { data } = this.knowledge\n\t\tconst rate = this.knowledge.view?.session.tickRate ?? 1\n\t\tconst from = data.tick - seconds * rate\n\t\tconst sample = data.history.find((each) => each.tick >= from) ?? data.history[0]\n\t\tif (!sample) return 0\n\t\tconst elapsed = (data.tick - sample.tick) / rate\n\t\tif (elapsed <= 0) return 0\n\t\treturn (((data.gathered[kind] ?? 0) - (sample.gathered[kind] ?? 0)) / elapsed) * 60\n\t}\n\n\t/** The income of every resource gathered so far, a minute (`income`) */\n\tincomes(seconds = 60): Record<ResourceId, number> {\n\t\tconst result: Record<ResourceId, number> = {}\n\t\tfor (const kind of Object.keys(this.knowledge.data.gathered)) result[kind] = this.income(kind, seconds)\n\t\treturn result\n\t}\n\n\t/** What was gathered of each resource since the game began, as far as the rises tell */\n\tget gathered(): Readonly<Record<ResourceId, number>> {\n\t\treturn this.knowledge.data.gathered\n\t}\n\n\t/** The samples of what was gathered, oldest first */\n\tget history(): KnowledgeMemory['history'] {\n\t\treturn this.knowledge.data.history\n\t}\n}\n\n/**\n * What a computer player heard (`knowledge.events`): pings, damage to its own and its allies', deaths, each with its\n * tick, the oldest first\n *\n * @beta\n */\nexport class HeardEvents {\n\tconstructor(private readonly knowledge: Knowledge) {}\n\n\t/** Pings heard; only within so many seconds where given */\n\tpings(withinSeconds?: number): PingHeard[] {\n\t\tconst oldest = this.knowledge.since(withinSeconds)\n\t\treturn this.knowledge.data.pings.filter((each) => each.tick >= oldest)\n\t}\n\n\t/** Damage seen done to its own and its allies' entities, a line an entity a think; only within so many seconds where given */\n\tdamage(withinSeconds?: number): DamageSeen[] {\n\t\tconst oldest = this.knowledge.since(withinSeconds)\n\t\treturn this.knowledge.data.damage.filter((each) => each.tick >= oldest)\n\t}\n\n\t/** Deaths seen, anyone's; only within so many seconds where given */\n\tdeaths(withinSeconds?: number): DeathSeen[] {\n\t\tconst oldest = this.knowledge.since(withinSeconds)\n\t\treturn this.knowledge.data.deaths.filter((each) => each.tick >= oldest)\n\t}\n}\n\ndeclare module './area' {\n\tinterface AreaMemories {\n\t\tknowledge?: KnowledgeMemory\n\t}\n}\n"],"mappings":"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"}
@@ -52,6 +52,7 @@ export interface LanesPlayOptions {
52
52
  * @beta
53
53
  */
54
54
  export interface LanesPlayMemory {
55
+ /** The version of the memory's format: 1 so far */
55
56
  v: 1;
56
57
  /** The heroes resting, by id: the tick they turned for home */
57
58
  resting: Record<string, number>;
@@ -69,6 +70,7 @@ export interface LanesPlayMemory {
69
70
  export interface LaneSide {
70
71
  /** The name of its path: what the goal and squad of the lane are named by (`lanes.push:mid`) */
71
72
  path: string;
73
+ /** The path's points in order, in cells */
72
74
  points: readonly Vec2[];
73
75
  /** The end of the lane that is its side's: 0 the first point's, 1 the last's */
74
76
  from: 0 | 1;
@@ -82,6 +84,7 @@ export interface LaneSide {
82
84
  * @beta
83
85
  */
84
86
  export interface LaneState {
87
+ /** The lane, as its side reads it */
85
88
  lane: LaneSide;
86
89
  /** How far along its side's furthest minion is: none with no minion of its side on the lane */
87
90
  front?: number;
@@ -89,15 +92,18 @@ export interface LaneState {
89
92
  theirFront?: number;
90
93
  /** Its side's minions on it (the player's own and its allies'), and theirs */
91
94
  ours: EntityState[];
95
+ /** Their minions on the lane */
92
96
  theirs: EntityState[];
93
97
  /** The heroes on it: its allies' (the player's own left out), and theirs */
94
98
  allies: EntityState[];
99
+ /** Their heroes on the lane */
95
100
  enemies: EntityState[];
96
101
  /** The towers by it, its side's and theirs (theirs as remembered), with how far along each stands */
97
102
  ourTowers: {
98
103
  tower: EntityState;
99
104
  at: number;
100
105
  }[];
106
+ /** Their towers by the lane, each with how far along it stands in cells */
101
107
  theirTowers: {
102
108
  tower: EntityState;
103
109
  at: number;
@@ -137,6 +143,7 @@ export declare class LanesPlay {
137
143
  readonly ai: Brain;
138
144
  /** How it plays: the module's, the seat's over it */
139
145
  readonly options: LanesPlayOptions;
146
+ /** What the play keeps between thinks, as `LanesPlayMemory`: the heroes resting and when each was sent home */
140
147
  readonly memory: LanesPlayMemory;
141
148
  private sides;
142
149
  constructor(
@@ -196,6 +203,7 @@ export declare class LanesPlay {
196
203
  * @beta
197
204
  */
198
205
  export interface LanesModule extends AiModule {
206
+ /** The lanes play the module runs */
199
207
  play: LanesPlay;
200
208
  }
201
209
  /**
@@ -212,7 +220,7 @@ export declare const LANES: import("./module").ModuleKey<LanesModule>;
212
220
  */
213
221
  export declare const lanesPlay: (options?: LanesPlayOptions) => AiModuleDef;
214
222
  /**
215
- * The engine's computer player for a game of lanes (`withLanes`): a brain of its rules, the words, `lanesPlay`, the
223
+ * The engine's computer player for a game of lanes (`lanesPack`): a brain of its rules, the words, `lanesPlay`, the
216
224
  * team, the picker, squads and micro (the file's comment). Heroes walk the lanes with their waves, rest at home when
217
225
  * hurt, help an ally's hero, take a camp with no wave to walk with. A variant is `lanesBrain.with({ ... })`; a game's
218
226
  * own lanes brain is `lanesBrainOf({ id, lanes, ... })`
@@ -225,7 +233,7 @@ export declare function lanesBrainOf(def: BrainExtension & {
225
233
  }): BrainDef;
226
234
  /**
227
235
  * The engine's computer player for a game of lanes, as it is: `lanesBrainOf({ id: 'core.lanes' })`. List it in the
228
- * game's `GameModule.brains` and seat it (`world.computers.seat(player, { brain: lanesBrain })`)
236
+ * game's `Rules.brains` and seat it (`world.computers.seat(player, { brain: lanesBrain })`)
229
237
  *
230
238
  * @beta
231
239
  */