@v12-engine/engine 0.1.0 → 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":"economy.js","names":[],"sources":["../../src/ai/economy.ts"],"sourcesContent":["import { baseStats, constructionOf, type ResourceId, type UnitTypeDef } from '#engine/defs'\nimport type { AiArea } from './area'\nimport type { AiReport } from './report'\nimport { queueOf } from '#engine/systems/productionQueue'\nimport { builtSoFar } from '#engine/systems/construction'\nimport { snapshotOf } from '#engine/components'\nimport { distSq, type Vec2 } from '#engine/math'\nimport { gathering } from '#engine/orders/harvest'\nimport type { EntityState } from '#engine/session/protocol'\nimport { gathers } from '#engine/shared'\nimport { type Brain } from './brain'\nimport { type AiModule, type AiModuleDef, defineModule } from './module'\nimport { type AiCondition, evaluate } from './rules'\nimport type { Base, UnitSet } from './view'\nimport { pair, point, where } from './geometry'\nimport { ENGAGED, HALL_REACH } from './reach'\n\n/*\n * The economy (AI plan, C4): the workers, base by base. The old melee player sent an idle worker to the nearest mine\n * with a hall by it and trained workers while it had fewer than so many a hall; nothing kept count of where they\n * worked, so a new hall by a second mine was staffed only by what it trained itself, a mine past what it could take\n * kept getting more, and a raid on the mine was met by workers mining on. This is what a player watches on their\n * economy, written down:\n *\n * - **Workers per base, per resource** (`workersPer`): so many on the money at each base, so many on the other\n * resource (harvest priorities, a town at a time). An idle worker goes where the most are missing, the\n * nearest base first among equals.\n * - **Saturation** (`saturate`): a mine takes only so many workers before more of them only queue at it. A worker in\n * a mine it enters one at a time (`resource.entered`, `slots`) is inside for its gather time, then walks to the hall\n * and back: while it walks, others go in, so a mine serves as many as fit in one round trip, `slots × (1 + walk /\n * gather)`, rounded up (five, for a mine twelve steps from a hall). A deposit worked from beside it (a tree) serves\n * as many as it has slots, by home or, where none is near home, the woods nearest it however far. What stands on a\n * mine to gather it (`builtOn`, a cursed mine) serves its `gatherers`.\n * Workers past what their base's deposits serve are not trained.\n * - **Rebalancing**: a base whose deposits ran out, or that has more on them than they serve, gives what it has spare\n * to a base that is short (a new expansion): workers walk over rather than wait for the new hall to train its own.\n * - **Training** workers at every hall that stands, up to what the bases want together, and a builder or so more\n * (`builders`): a worker sent to build is off its mine meanwhile.\n * - **Expansions** (`expansions`, `expandWhen`): another hall by a mine nobody has a hall at, near enough home, once\n * the condition holds (time and an army building, when left out): a want of the build plan, which saves up for it,\n * sends a worker to look at the ground first where nobody has (the settler), and builds it anew when lost.\n * - **Workers flee a raid** (`workersFlee`): workers a raid is on, at a base its fighters do not hold, walk to the\n * nearest base no enemy is at, and back to work at their own once it has stood clear a while.\n * - **What goes up by builders** gets one where nobody works on it, and **what the money is gathered at** where it\n * has to stand on the mine first (`builtOn`) is built at each hall before anything else.\n *\n * Mending and building anew what was lost are the build plan's (B3: `repair`, `rebuild`). What the economy remembers\n * (who fled from where) is plain data in the brain's memory (`BrainMemory.economy`).\n */\n\n/** How far from home a mine is taken for another hall: further is across the map */\nconst EXPAND_REACH = 64\n/** A point so far from a place on the way to another */\nfunction towards(from: Vec2, to: Vec2, distance: number): Vec2 {\n\tconst length = Math.sqrt(distSq(from, to))\n\tif (length <= distance) return { x: to.x, z: to.z }\n\treturn { x: from.x + ((to.x - from.x) / length) * distance, z: from.z + ((to.z - from.z) / length) * distance }\n}\n\n/** How far from a mine's middle its side is, a mine being 3 or 4 wide: where a route to it goes */\nconst MINE_SIDE = 3.5\n/** How far from a mine's middle a route may end and the mine still count as walked to: by its side, a mine being 3 or 4 wide */\nconst MINE_WALK_REACH = 6\n/** How near a base what is at it is */\nconst AT_BASE = 20\n/** How far round the nearest tree the woods go that home gathers from, where none is near home */\nconst WOODS = 12\n/** The odds of the base's fighters near a worker against the foes on it, under which the worker runs */\nconst FLEE_UNDER = 0.5\n/** Seconds a base a worker fled from stands clear before it goes back */\nconst CLEAR_FOR = 5\n/** How near its builder a building half built is being worked on */\nconst AT_SITE = 10\n/** How many workers rebalancing moves in a think: a few at a time, so that a base never empties at once */\nconst MOVE_AT_ONCE = 3\n/** Seconds the other resource runs short, with the money piling up, before one more worker goes to it (AI2) */\nconst BLOCKED = 15\n/** What counts as the other resource running short, and as the money piling up: what little a building or a unit costs of it, and enough for most */\nconst SHORT_UNDER = 100\nconst PILED = 300\n/** How many more workers on the other resource at most, for what waits on it */\nconst MORE_AT_MOST = 3\n/** What the economy holds the workers that fled by (`ai.goals.take`): no goal sends them anywhere until they are back */\nconst FLED = 'economy:fled'\n\n/**\n * How many workers a base wants on each resource (`EconomyOptions.workersPer`): as numbers by resource id, or a\n * function of the base (`index` 0 is home)\n *\n * @beta\n */\nexport type WorkersPer = Partial<Record<ResourceId, number>> | ((ai: Brain, base: Base, index: number) => Partial<Record<ResourceId, number>>)\n\n/**\n * How a brain runs its economy (`BrainDef.economy`, the seat's `AiOptions.economy` over it, the `economy()` module's\n * own under both). Every field has a data form a save keeps; the function forms are the brain's to give again\n *\n * @beta\n */\nexport interface EconomyOptions {\n\t/** Workers on the game's money at each base, where `workersPer` says nothing of it: 8 when left out */\n\tworkers?: number\n\t/** Workers on the other resource, at home only, where `workersPer` says nothing of it: 3 when left out */\n\tlumberjacks?: number\n\t/**\n\t * Workers on each resource at each base (`WorkersPer`): `{ gold: 5, lumber: 3 }` at every base, or a function of the\n\t * base for one that differs (home, an expansion). What it leaves out is `workers` and `lumberjacks`\n\t */\n\tworkersPer?: WorkersPer\n\t/** Whether a base wants no more workers on a deposit than it serves (see the file's comment): yes when left out */\n\tsaturate?: boolean\n\t/** Whether its halls train workers up to what the bases want: yes when left out */\n\ttrainWorkers?: boolean\n\t/**\n\t * Workers trained past what the bases want, to build with: a worker sent to build is off the mine meanwhile, and a\n\t * mine with only as many as it serves would gather less. 1 when left out\n\t */\n\tbuilders?: number\n\t/** Halls to have past the first, each by a mine nobody has a hall at: the seat's `expansions`, else none */\n\texpansions?: number\n\t/**\n\t * When it may expand: a condition (`AiCondition`, as data or a function). Four minutes in and with a building that\n\t * trains soldiers, when left out\n\t */\n\texpandWhen?: AiCondition\n\t/** Whether workers a raid is on walk to a base no enemy is at, and back once theirs is clear: yes when left out */\n\tworkersFlee?: boolean\n}\n\n/**\n * What the economy remembers between thinks, as a save keeps it: the workers that fled a raid\n *\n * @beta\n */\nexport interface EconomyMemory {\n\t/** The version of the memory's format: 1 so far */\n\tv: 1\n\t/** Each worker that fled, by id: the base it fled (its middle), where to, since when, and since when its base stood clear */\n\tfled: Record<string, { from: Vec2; to: Vec2; since: number; clear?: number }>\n\t/**\n\t * Workers more on the other resource at home, while it runs short with the money piling up (AI2): one more each\n\t * `BLOCKED` seconds it stays so, at most `MORE_AT_MOST`, one fewer each twice that once it is not. Since when it has\n\t * been short (`since`) or not (`easy`), and who was sent to it lately (`moved`)\n\t */\n\tmaterial?: { more: number; since?: number; easy?: number; moved?: Record<string, number> }\n}\n\n/**\n * One base as the economy sees it (`ai.economy.bases()`, the report): its deposits, what they serve, the workers it\n * wants and has on each resource\n *\n * @beta\n */\nexport interface EconomyBase {\n\t/** The view's base */\n\tbase: Base\n\t/** Its deposits it gathers from, by resource: those of the money with a hall by them (or something of its own on them), the rest near it */\n\tdeposits: Partial<Record<ResourceId, EntityState[]>>\n\t/** How many workers its deposits of each resource serve at once */\n\tserves: Partial<Record<ResourceId, number>>\n\t/** How many it wants on each resource: what it is to have, no more than what is served where it saturates */\n\twants: Partial<Record<ResourceId, number>>\n\t/** The workers at work on each resource at it, by id */\n\tworking: Partial<Record<ResourceId, number[]>>\n}\n\n/**\n * The economy as the report shows it (`AiReport.economy.bases`, `fled`): each base with what it wants and has, the\n * workers that fled, how many it trains, what the next expansion waits for\n *\n * @beta\n */\nexport interface EconomyReport {\n\t/** The bases, each with where it is, its hall's entity id and per resource the workers working, wanted and served by it */\n\tbases: { at: [number, number]; hall: number; workers: Record<ResourceId, [working: number, wants: number, serves: number]> }[]\n\t/** The workers that fled a raid, each with the unit's id, the place it fled and the tick it fled at */\n\tfled: { unit: number; from: [number, number]; since: number }[]\n\t/** Workers it has, those queued counted, and what its bases want together */\n\tworkers: [have: number, want: number]\n\t/** Where the next hall goes, and what it waits for: the build plan's status of the want */\n\texpansion?: string\n}\n\n/**\n * The id of the want for another hall, on the build plan\n *\n * @internal\n */\nexport const EXPAND_WANT = 'economy.expand'\n\n/**\n * A brain's economy (`ai.economy`): its workers, base by base, run by the `economy()` module each think (`think`), or\n * by the melee player's turn, and asked by whoever wants to know (`bases`, `freeMine`, `waiting`). Kept in the brain's\n * memory (`BrainMemory.economy`)\n *\n * @internal\n */\nexport class Economy implements AiArea {\n\t/** What finds it on a brain (`ai.area(Economy)`): made the first time a module asks for it */\n\tstatic readonly id = 'economy'\n\t/** Makes the economy of a brain; what `ai.area(Economy)` calls the first time a module asks for it */\n\tstatic make(ai: Brain): Economy {\n\t\treturn new Economy(ai)\n\t}\n\t/** Its id among the brain's areas: what its memory and its report are kept under */\n\treadonly id = 'economy'\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 economy in a shape this brain does not read: it starts afresh'\n\n\t/** Whether an `economy()` module is in the brain, or the melee player runs it: without one, nothing here runs by itself */\n\tenabled = false\n\t/**\n\t * Whether everything else waits for what the money is gathered at (`builtOn`, a cursed mine), with none of it\n\t * standing and none on its way: there is no money without it\n\t */\n\twaiting = false\n\tprivate memory: EconomyMemory = { v: 1, fled: {} }\n\tprivate moduleOptions: EconomyOptions = {}\n\tprivate thoughtAt = -1\n\tprivate found: { tick: number; bases: EconomyBase[] } | undefined\n\tprivate trained = 0\n\n\tconstructor(\n\t\t/** The brain it runs the economy of */\n\t\treadonly ai: Brain\n\t) {}\n\n\t/** Puts the `economy()` module's options under the brain's settings: what the module is made with */\n\tconfigure(options: EconomyOptions): void {\n\t\tthis.moduleOptions = options\n\t\tthis.enabled = true\n\t}\n\n\t/** How it runs the economy: the module's options, the brain's settings over them (`ai.settings.economy`) */\n\tget options(): EconomyOptions {\n\t\treturn this.ai.cache('economy.options', () => ({ ...this.moduleOptions, ...this.ai.settings.economy }))\n\t}\n\n\t/** How many of a unit type its buildings have queued: on their way, for what is counted as had */\n\tprivate queued(type: string): number {\n\t\tlet count = 0\n\t\tfor (const entity of this.ai.view.mine) for (const item of queueOf(entity)) if (item.kind === 'unit' && item.id === type) count++\n\t\treturn count\n\t}\n\n\t/** What a base wants on a resource where nothing caps it: `workersPer`, then `workers` on the money everywhere, `lumberjacks` on the other at home */\n\tprivate asked(kind: ResourceId, base: Base, index: number): number {\n\t\tconst options = this.options\n\t\tconst per = typeof options.workersPer === 'function' ? options.workersPer(this.ai, base, index) : (options.workersPer ?? {})\n\t\tconst asked = per[kind] ?? (kind === this.money ? (options.workers ?? 8) : index === 0 ? (options.lumberjacks ?? 3) : 0)\n\t\t// more at home while what it saves for waits on it (AI2)\n\t\treturn kind === this.material && index === 0 ? asked + (this.memory.material?.more ?? 0) : asked\n\t}\n\n\t/** The game's money: what most things cost (`Registry.currency`), the first resource where it names none */\n\tget money(): ResourceId {\n\t\tconst { registry } = this.ai\n\t\treturn registry.currency ?? registry.resources[0]?.id ?? ''\n\t}\n\n\t/** The other resource workers gather, where the game has one (lumber, in melee) */\n\tget material(): ResourceId | undefined {\n\t\treturn this.ai.registry.resources.find((resource) => resource.id !== this.money)?.id\n\t}\n\n\t/** What gathers: the first worker type the player can make (`worker` role) */\n\tget worker(): UnitTypeDef | undefined {\n\t\treturn this.ai.view.typesOf('worker')[0]\n\t}\n\n\t/** What stands on a mine to gather it there (`topper` role: `builtOn` the money), where the game has one */\n\tget topper(): UnitTypeDef | undefined {\n\t\treturn this.ai.view.typesOf('topper')[0]\n\t}\n\n\t/**\n\t * What gathers the other resource where the worker does not (a ghoul, who fights too): of the gatherers the player\n\t * can make, the first that gathers it. The worker where it does\n\t */\n\tget lumberjack(): UnitTypeDef | undefined {\n\t\tconst { worker, material } = this\n\t\tif (material === undefined || !worker || gathers(worker, material)) return worker\n\t\treturn this.ai.view.typesOf('gatherer').find((def) => def.kind === 'unit' && def !== worker && gathers(def, material))\n\t}\n\n\t/** Whether a building takes deposits of a resource (`dropOff`) */\n\tprivate takes(def: UnitTypeDef, kind: ResourceId): boolean {\n\t\treturn def.dropOff === true || (Array.isArray(def.dropOff) && def.dropOff.includes(kind))\n\t}\n\n\t/**\n\t * Its bases as the economy sees them, once a think: each of the view's bases (home first) with the deposits it\n\t * gathers from, what they serve, the workers it wants and those at work there\n\t */\n\tbases(): EconomyBase[] {\n\t\tconst { ai } = this\n\t\tif (this.found?.tick === ai.tick) return this.found.bases\n\t\tconst { view } = ai\n\t\tconst { money, material, topper, worker } = this\n\t\tconst saturate = this.options.saturate ?? true\n\t\tconst halls = view.mine\n\t\t\t.buildings()\n\t\t\t.finished()\n\t\t\t.where((_, def) => this.takes(def, money))\n\t\tconst toppers = topper ? view.mine.ofType(topper.id).finished() : undefined\n\t\tconst mines = view.resources.ofResource(money).alive()\n\t\tconst reach = HALL_REACH * HALL_REACH\n\t\tconst bases: EconomyBase[] = view.bases().map((base, index) => {\n\t\t\tconst deposits: EconomyBase['deposits'] = {}\n\t\t\tconst serves: EconomyBase['serves'] = {}\n\t\t\t// the money: the mines with a hall of its own by them, at this base; or, where the money is gathered at what\n\t\t\t// stands on a mine, those with one of its own on them\n\t\t\tconst served = mines.filter((each) =>\n\t\t\t\ttoppers\n\t\t\t\t\t? toppers.some((top) => top.x === each.x && top.z === each.z && base.buildings.has(top.id))\n\t\t\t\t\t: halls.some((hall) => distSq(hall, each) < reach && base.buildings.has(hall.id))\n\t\t\t)\n\t\t\tdeposits[money] = served\n\t\t\tserves[money] = served.reduce((sum, each) => sum + this.serving(each, base), 0)\n\t\t\tif (material !== undefined) {\n\t\t\t\tlet trees = view.resourcesNear(base).ofResource(material).alive().items\n\t\t\t\t// none by home (a hall away from the woods): the woods nearest it, however far, or home would never want any\n\t\t\t\tif (!trees.length && index === 0) {\n\t\t\t\t\tconst nearest = view.resources.ofResource(material).alive().nearest(base.at)\n\t\t\t\t\tif (nearest) trees = view.resourcesNear(nearest, WOODS).ofResource(material).alive().items\n\t\t\t\t}\n\t\t\t\tdeposits[material] = trees as EntityState[]\n\t\t\t\tserves[material] = trees.reduce((sum, each) => sum + (view.def(each).resource?.slots ?? 1), 0)\n\t\t\t}\n\t\t\tconst wants: EconomyBase['wants'] = {}\n\t\t\tfor (const kind of [money, ...(material !== undefined ? [material] : [])]) {\n\t\t\t\t// the workers only want what they can gather: the other resource is the lumberjacks' where they do not\n\t\t\t\tif (!worker || !gathers(worker, kind)) continue\n\t\t\t\tconst want = this.asked(kind, base, index)\n\t\t\t\twants[kind] = saturate ? Math.min(want, serves[kind] ?? 0) : (serves[kind] ?? 0) > 0 ? want : 0\n\t\t\t}\n\t\t\treturn { base, deposits, serves, wants, working: {} }\n\t\t})\n\t\t// who works where: each harvesting worker at the base nearest where it walks to (the mine, or the hall it brings\n\t\t// what it carries to: either is its base's; one sent to another base counts there on its way), else where it is,\n\t\t// on what it carries (or what it walks to)\n\t\tif (worker) {\n\t\t\tfor (const unit of view.mine.ofType(worker.id)) {\n\t\t\t\tif (unit.own?.order !== 'harvest') continue\n\t\t\t\tconst kind = snapshotOf(unit, gathering)?.kind ?? this.kindNear(unit.own.goal ?? unit)\n\t\t\t\tconst at = unit.own.goal ?? unit\n\t\t\t\tlet best: EconomyBase | undefined\n\t\t\t\tlet bestDistance = Infinity\n\t\t\t\tfor (const each of bases) {\n\t\t\t\t\tconst d = distSq(each.base.at, at)\n\t\t\t\t\tif (d < bestDistance) {\n\t\t\t\t\t\tbestDistance = d\n\t\t\t\t\t\tbest = each\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (best) (best.working[kind] ??= []).push(unit.id)\n\t\t\t}\n\t\t}\n\t\tthis.found = { tick: ai.tick, bases }\n\t\treturn bases\n\t}\n\n\t/** The resource of the deposit nearest a place: what a worker walking there will gather. The money where none is near */\n\tprivate kindNear(at: Vec2): ResourceId {\n\t\tconst near = this.ai.view.resources.nearest(at)\n\t\treturn near && distSq(near, at) < 6 * 6 ? (this.ai.view.def(near).resource?.id ?? this.money) : this.money\n\t}\n\n\t/**\n\t * How many workers one deposit of the money serves at once, as worked by this base (see the file's comment): what\n\t * stands on it to gather it says (`gatherers`); one entered serves its slots for every round trip from the hall\n\t * nearest it; one worked from beside, its slots\n\t */\n\tserving(deposit: EntityState, base: Base): number {\n\t\tconst { view, registry } = this.ai\n\t\tconst def = view.def(deposit)\n\t\tconst resource = def.resource\n\t\tconst { topper, worker } = this\n\t\tif (topper?.builtOn === resource?.id && topper) return topper.gatherers ?? 5\n\t\tif (!resource?.entered || !worker) return resource?.slots ?? 1\n\t\tconst hall = base.buildings.where((_, each) => this.takes(each, resource.id)).nearest(deposit)\n\t\tif (!hall) return resource.slots\n\t\t// the walk between the two edges: what has no size of its own (a deposit) stands in for nothing\n\t\tconst size = (each: UnitTypeDef) => (each.stats ? baseStats(each, registry).radius : 0) || 0\n\t\tconst speed = baseStats(worker, registry).moveSpeed || 0\n\t\tconst gap = Math.max(0, Math.sqrt(distSq(hall, deposit)) - size(view.def(hall)) - size(def))\n\t\tconst gather = resource.gatherTime ?? worker.harvester?.gatherTime ?? 1\n\t\tconst walk = speed > 0 ? (2 * gap) / speed : 0\n\t\treturn Math.max(1, Math.ceil((resource.slots || 1) * (1 + walk / Math.max(0.1, gather))))\n\t}\n\n\t/** Whether a unit is busy for someone else: in a squad (on an errand), held by a rule, or fled */\n\tprivate busy(unit: EntityState): boolean {\n\t\tconst { ai } = this\n\t\treturn ai.squads.squadOf(unit) !== undefined || ai.goals.ruled(unit.id) || this.memory.fled[unit.id] !== undefined\n\t}\n\n\t/**\n\t * A gold mine near enough home that nobody has a hall by, and nothing of anyone's stands on, and that a worker can\n\t * walk to from home: the nearest, for another hall. None where every one is taken, or none is known. A mine on\n\t * ground cut off from home (a plateau with no ramp, an island) is left out: the walk to it is asked of the ground\n\t * the player knows each time, nearest first, so the answer is the picture's alone\n\t */\n\tfreeMine(): Vec2 | undefined {\n\t\tconst { view } = this.ai\n\t\tconst home = view.home()\n\t\tif (!home) return undefined\n\t\tconst money = this.money\n\t\t// anyone's hall that takes the money, in sight or remembered\n\t\tconst halls = view.all.filter((entity) => view.def(entity).kind === 'building' && this.takes(view.def(entity), money))\n\t\tconst reach = HALL_REACH * HALL_REACH\n\t\tconst most = EXPAND_REACH * EXPAND_REACH\n\t\tconst free = [...view.mines()]\n\t\t\t.map((mine) => ({ mine, d: distSq(mine, home) }))\n\t\t\t.filter(({ mine, d }) => d < most && !halls.some((hall) => distSq(hall, mine) < reach))\n\t\t\t.sort((a, b) => a.d - b.d || a.mine.id - b.mine.id)\n\t\t// from the hall's side towards each mine: the ground under the hall itself has no route out\n\t\tconst out = (view.def(home).radius ?? 2) + 1.5\n\t\tfor (const { mine } of free) if (this.walkable(towards(home, mine, out), mine)) return { x: mine.x, z: mine.z }\n\t\treturn undefined\n\t}\n\n\t/** Whether a worker walks from one place to a mine: the route over the ground known to its side (the mine itself is in the way) ends by it */\n\tprivate walkable(from: Vec2, mine: Vec2): boolean {\n\t\tconst route = this.ai.view.findPath(from, towards(mine, from, MINE_SIDE))\n\t\tconst end = route?.[route.length - 1]\n\t\treturn !!end && distSq(end, mine) <= MINE_WALK_REACH * MINE_WALK_REACH\n\t}\n\n\t/**\n\t * The think, once a think: a builder to every building half built that nobody works on, workers off a raid and back,\n\t * idle workers to where they are missing, the spare moved where short, the other resource's gatherers, what the\n\t * money is gathered at, workers trained, the next hall wanted. A second call in the same think does nothing\n\t */\n\tthink(): void {\n\t\tconst { ai } = this\n\t\tif (this.thoughtAt === ai.tick) return\n\t\tthis.thoughtAt = ai.tick\n\t\tthis.trained = 0\n\t\tthis.prune()\n\t\tconst options = this.options\n\t\tthis.sites()\n\t\tif (options.workersFlee ?? true) this.flee()\n\t\tthis.back()\n\t\tthis.blocked()\n\t\tthis.assign()\n\t\tthis.rebalance()\n\t\tthis.toMaterial()\n\t\tthis.lumberjacks()\n\t\tthis.toppers()\n\t\tif (options.trainWorkers ?? true) this.train()\n\t\tthis.expand()\n\t}\n\n\t/**\n\t * Whether the other resource holds it up (lumber, where gold is the money): under `SHORT_UNDER` of it with `PILED` of\n\t * the money or more, what it has as the snapshot says. One more worker on it at home each `BLOCKED` seconds it is so,\n\t * at most `MORE_AT_MOST`; one fewer each twice that once it is not\n\t */\n\tprivate blocked(): void {\n\t\tconst { ai } = this\n\t\tconst { material } = this\n\t\tif (material === undefined) return\n\t\tconst tick = ai.tick\n\t\tconst period = BLOCKED * ai.session.tickRate\n\t\tconst kept = this.memory.material\n\t\tconst have = ai.view.me.resources\n\t\tif ((have[material] ?? 0) < SHORT_UNDER && (have[this.money] ?? 0) >= PILED) {\n\t\t\tconst state = (this.memory.material ??= { more: 0 })\n\t\t\tdelete state.easy\n\t\t\tstate.since ??= tick\n\t\t\tif (tick - state.since < period || state.more >= MORE_AT_MOST) return\n\t\t\tstate.more++\n\t\t\tstate.since = tick\n\t\t\tai.decide(`puts ${state.more} more on ${material} at home: ${this.money} piles up while ${material} runs short`, { kind: 'economy' })\n\t\t\treturn\n\t\t}\n\t\tif (!kept) return\n\t\tdelete kept.since\n\t\tif (kept.more <= 0) {\n\t\t\tdelete this.memory.material\n\t\t\treturn\n\t\t}\n\t\tkept.easy ??= tick\n\t\tif (tick - kept.easy < period * 2) return\n\t\tkept.more--\n\t\tkept.easy = tick\n\t}\n\n\t/**\n\t * Home short on the other resource while more are put on it (`blocked`), and nobody idle to send: a worker of the\n\t * money at home, carrying nothing, goes to the trees by home. One a think\n\t */\n\tprivate toMaterial(): void {\n\t\tconst { ai } = this\n\t\tconst { view } = ai\n\t\tconst { material, money, worker } = this\n\t\tif (material === undefined || !(this.memory.material?.more ?? 0) || !worker || !gathers(worker, material)) return\n\t\tconst home = this.bases()[0]\n\t\tif (!home || (home.wants[material] ?? 0) - (home.working[material]?.length ?? 0) <= 0) return\n\t\tconst tree = nearestOf(home.deposits[material] ?? [], home.base.at)\n\t\tif (!tree) return\n\t\t// those sent this way a little while ago are on their way still, counted on what they carried last\n\t\tconst state = this.memory.material!\n\t\tconst moved = (state.moved ??= {})\n\t\tfor (const id in moved) {\n\t\t\tconst unit = view.byId(Number(id))\n\t\t\t// there once it gathers it, or no longer at it; a minute at the most\n\t\t\tif (!unit || unit.own?.order !== 'harvest' || snapshotOf(unit, gathering)?.kind === material || ai.tick - moved[id] >= 60 * ai.session.tickRate)\n\t\t\t\tdelete moved[id]\n\t\t}\n\t\tconst missing = (home.wants[material] ?? 0) - (home.working[material]?.length ?? 0) - Object.keys(moved).length\n\t\tif (missing <= 0) return\n\t\tconst from = (home.working[money] ?? [])\n\t\t\t.map((id) => view.byId(id)!)\n\t\t\t.filter((unit) => unit && moved[unit.id] === undefined && !unit.own?.hidden && !snapshotOf(unit, gathering)?.carrying && !this.busy(unit))\n\t\t\t.sort((a, b) => distSq(a, tree) - distSq(b, tree) || a.id - b.id)[0]\n\t\tif (!from) return\n\t\tai.send({ type: 'order', entities: [from.id], order: { type: 'harvest', target: tree.id } })\n\t\tmoved[from.id] = ai.tick\n\t\tai.decide(`moves a worker from ${money} to ${material} at home`, { kind: 'economy' })\n\t}\n\n\t/** Whether it has run at all: by the module, or the melee player's turn */\n\tget running(): boolean {\n\t\treturn this.enabled || this.thoughtAt >= 0\n\t}\n\n\t/** Marks the think's economy done another way (a brain's own turn that ran it itself): `think` does nothing more this think */\n\tdone(): void {\n\t\tthis.thoughtAt = this.ai.tick\n\t}\n\n\t/** What is remembered of the dead, or of what is no longer its own, let go of */\n\tprivate prune(): void {\n\t\tconst { view, goals } = this.ai\n\t\tfor (const id in this.memory.fled) if (!view.mine.has(Number(id))) delete this.memory.fled[id]\n\t\t// what it holds and no longer remembers as fled (a save of before, a unit given away) is let go of\n\t\tconst held = goals.held(FLED)\n\t\tif (held) {\n\t\t\tconst away = held.units.filter((id) => this.memory.fled[id] === undefined)\n\t\t\tif (away.length) goals.drop(FLED, away)\n\t\t}\n\t}\n\n\t/** Its workers, as of the think */\n\tprivate workers(): UnitSet {\n\t\tconst { worker } = this\n\t\tconst { view } = this.ai\n\t\treturn worker ? view.mine.ofType(worker.id) : view.mine.where(() => false)\n\t}\n\n\t/** A builder to every building of its own going up by builders that nobody works on: the nearest free worker */\n\tprivate sites(): void {\n\t\tconst { ai } = this\n\t\tconst { view } = ai\n\t\tconst workers = this.workers()\n\t\tfor (const site of view.mine) {\n\t\t\t// what goes up on its own needs nobody\n\t\t\tif (builtSoFar(site) === undefined || constructionOf(view.def(site)) !== 'builder') continue\n\t\t\tconst busy = workers.some(\n\t\t\t\t(worker) => (worker.own?.order === 'build' || worker.own?.order === 'construct') && distSq(worker, site) < AT_SITE * AT_SITE\n\t\t\t)\n\t\t\t// one sent to it lately is on its way, whatever a picture a few ticks old says (a think sliced by its budget)\n\t\t\tconst sent = `construct:${site.id}:`\n\t\t\tif (busy || workers.some((worker) => ai.sentTo(worker.id)?.key === sent)) continue\n\t\t\tconst helper = workers.where((worker) => !worker.own?.hidden && worker.own?.order !== 'build' && !this.busy(worker)).nearest(site)\n\t\t\tif (helper) ai.send({ type: 'order', entities: [helper.id], order: { type: 'construct', target: site.id } })\n\t\t}\n\t}\n\n\t/**\n\t * Workers a raid is on, at a base its fighters do not hold: off to the nearest base no enemy is at. A worker with no\n\t * such base stays at work: there is nowhere better to be\n\t */\n\tprivate flee(): void {\n\t\tconst { ai } = this\n\t\tconst { view } = ai\n\t\tconst foes = view.hostile\n\t\t\t.alive()\n\t\t\t.units()\n\t\t\t.where((entity, def) => !entity.asleep && !!def.attacks?.length)\n\t\tif (!foes.length) return\n\t\tconst bases = view.bases()\n\t\tconst safe = bases.filter((base) => !foes.near(base.at, AT_BASE).length)\n\t\tif (!safe.length) return\n\t\tconst fled: EntityState[] = []\n\t\tfor (const unit of this.workers()) {\n\t\t\tif (unit.own?.hidden || this.busy(unit) || unit.own?.order === 'build') continue\n\t\t\tconst on = foes.near(unit, ENGAGED)\n\t\t\tif (!on.length) continue\n\t\t\t// held, where the base's fighters near it stand a fair chance against what is on it\n\t\t\tconst guards = view.mine.fighters().near(unit, ENGAGED * 2)\n\t\t\tif (guards.length && view.strength.odds(guards, on) >= FLEE_UNDER) continue\n\t\t\tconst from = bases.reduce((best, base) => (distSq(base.at, unit) < distSq(best.at, unit) ? base : best), bases[0])\n\t\t\tconst to = safe\n\t\t\t\t.filter((base) => base !== from)\n\t\t\t\t.reduce<Base | undefined>((best, base) => (!best || distSq(base.at, unit) < distSq(best.at, unit) ? base : best), undefined)\n\t\t\tif (!to) continue\n\t\t\tthis.memory.fled[unit.id] = { from: point(from.at), to: point(to.at), since: ai.tick }\n\t\t\tfled.push(unit)\n\t\t}\n\t\tif (!fled.length) return\n\t\t// by where they go: one order for those going the same way\n\t\tconst byDestination = new Map<string, { to: Vec2; ids: number[] }>()\n\t\tfor (const unit of fled) {\n\t\t\tconst to = this.memory.fled[unit.id].to\n\t\t\tconst key = `${to.x},${to.z}`\n\t\t\tconst entry = byDestination.get(key) ?? byDestination.set(key, { to, ids: [] }).get(key)!\n\t\t\tentry.ids.push(unit.id)\n\t\t}\n\t\t// held while away, so that nothing else sends them off (a scout wanted: the pool's workers are a goal's to take)\n\t\tai.goals.take(\n\t\t\tfled.map((unit) => unit.id),\n\t\t\t'told',\n\t\t\t{ id: FLED, seconds: Infinity }\n\t\t)\n\t\tfor (const { to, ids } of byDestination.values()) {\n\t\t\tai.send({ type: 'order', entities: ids, order: { type: 'move', point: to } })\n\t\t\tai.decide(`${ids.length === 1 ? '1 worker flees' : `${ids.length} workers flee`} a raid to the base at ${where(to)}`, { kind: 'economy' })\n\t\t}\n\t}\n\n\t/** Those that fled, back to work at their own base once it has stood clear long enough */\n\tprivate back(): void {\n\t\tconst { ai } = this\n\t\tconst { view } = ai\n\t\tconst foes = view.hostile\n\t\t\t.alive()\n\t\t\t.units()\n\t\t\t.where((entity, def) => !entity.asleep && !!def.attacks?.length)\n\t\tconst back: number[] = []\n\t\tfor (const id in this.memory.fled) {\n\t\t\tconst fled = this.memory.fled[id]\n\t\t\tif (foes.near(fled.from, AT_BASE).length) {\n\t\t\t\tdelete fled.clear\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tfled.clear ??= ai.tick\n\t\t\tif (ai.tick - fled.clear < CLEAR_FOR * ai.session.tickRate) continue\n\t\t\tback.push(Number(id))\n\t\t\tdelete this.memory.fled[id]\n\t\t}\n\t\tif (!back.length) return\n\t\tai.goals.drop(FLED, back)\n\t\t// to the deposit of the money nearest each: to work where they were\n\t\tconst bases = this.bases()\n\t\tconst byDeposit = new Map<number, number[]>()\n\t\tfor (const id of back) {\n\t\t\tconst unit = view.byId(id)!\n\t\t\tconst deposit = bases\n\t\t\t\t.flatMap((each) => each.deposits[this.money] ?? [])\n\t\t\t\t.reduce<EntityState | undefined>((best, each) => (!best || distSq(each, unit) < distSq(best, unit) ? each : best), undefined)\n\t\t\tif (deposit) (byDeposit.get(deposit.id) ?? byDeposit.set(deposit.id, []).get(deposit.id)!).push(id)\n\t\t}\n\t\tfor (const [target, entities] of byDeposit) ai.send({ type: 'order', entities, order: { type: 'harvest', target } })\n\t\tai.decide(`${back.length === 1 ? '1 worker goes' : `${back.length} workers go`} back to work: the raid is over`, { kind: 'economy' })\n\t}\n\n\t/**\n\t * The idle workers, each to the base and resource where the most are missing (the nearest base among equals); with\n\t * nothing missing anywhere, to the money at the nearest base that has some, rather than stand about\n\t */\n\tprivate assign(): void {\n\t\tconst { ai } = this\n\t\tconst { view } = ai\n\t\tconst home = view.home()\n\t\tconst idle = this.workers().where((unit) => !!unit.own && !unit.own.order && !unit.own.hidden && !this.busy(unit))\n\t\tif (!idle.length || !home) return\n\t\tconst bases = this.bases()\n\t\tconst { money } = this\n\t\t// how many each base is short on each resource, as it stands, less what this think sends\n\t\tconst short = bases.map((each) => {\n\t\t\tconst missing: Partial<Record<ResourceId, number>> = {}\n\t\t\tfor (const kind in each.wants) missing[kind] = each.wants[kind]! - (each.working[kind]?.length ?? 0)\n\t\t\treturn missing\n\t\t})\n\t\tconst orders = new Map<number, number[]>()\n\t\tfor (const unit of idle) {\n\t\t\tlet best: { at: number; kind: ResourceId; missing: number; distance: number } | undefined\n\t\t\tbases.forEach((each, at) => {\n\t\t\t\tfor (const kind in short[at]) {\n\t\t\t\t\tconst missing = short[at][kind]!\n\t\t\t\t\tif (missing <= 0 || !each.deposits[kind]?.length) continue\n\t\t\t\t\tconst distance = distSq(each.base.at, unit)\n\t\t\t\t\tif (!best || missing > best.missing || (missing === best.missing && distance < best.distance)) best = { at, kind, missing, distance }\n\t\t\t\t}\n\t\t\t})\n\t\t\tlet deposit: EntityState | undefined\n\t\t\tif (best) {\n\t\t\t\tshort[best.at][best.kind]! -= 1\n\t\t\t\tconst base = bases[best.at]\n\t\t\t\t// the money: the deposit of the base nearest the worker; the other: the deposit nearest the base's middle, where\n\t\t\t\t// the walk to the hall is shortest\n\t\t\t\tdeposit = best.kind === money ? nearestOf(base.deposits[money]!, unit) : nearestOf(base.deposits[best.kind]!, base.base.at)\n\t\t\t} else {\n\t\t\t\t// nothing missing anywhere: on the money nearest it all the same; with no hall by any mine, the mine nearest home\n\t\t\t\tconst served = bases.flatMap((each) => each.deposits[money] ?? [])\n\t\t\t\tdeposit = served.length ? nearestOf(served, unit) : this.topper ? undefined : view.resources.ofResource(money).alive().nearest(home)\n\t\t\t}\n\t\t\tif (deposit) (orders.get(deposit.id) ?? orders.set(deposit.id, []).get(deposit.id)!).push(unit.id)\n\t\t}\n\t\tfor (const [target, entities] of orders) ai.send({ type: 'order', entities, order: { type: 'harvest', target } })\n\t}\n\n\t/**\n\t * A base with more on the money than its deposits serve (or with none left) gives its spare to a base that is short,\n\t * a few a think: those not carrying anything, so that nothing gathered is lost on the way\n\t */\n\tprivate rebalance(): void {\n\t\tconst { ai } = this\n\t\tconst { view } = ai\n\t\tconst { money } = this\n\t\tconst bases = this.bases()\n\t\tif (bases.length < 2) return\n\t\tlet moved = 0\n\t\tfor (const from of bases) {\n\t\t\tconst working = from.working[money] ?? []\n\t\t\tconst spare = working.length - (from.wants[money] ?? 0)\n\t\t\tif (spare <= 0) continue\n\t\t\tconst to = bases\n\t\t\t\t.filter((each) => each !== from && (each.wants[money] ?? 0) - (each.working[money]?.length ?? 0) > 0 && each.deposits[money]?.length)\n\t\t\t\t.sort((a, b) => distSq(a.base.at, from.base.at) - distSq(b.base.at, from.base.at))[0]\n\t\t\tif (!to) continue\n\t\t\tconst missing = (to.wants[money] ?? 0) - (to.working[money]?.length ?? 0)\n\t\t\tconst ids = working\n\t\t\t\t.map((id) => view.byId(id)!)\n\t\t\t\t.filter((unit) => !unit.own?.hidden && !snapshotOf(unit, gathering)?.carrying && !this.busy(unit))\n\t\t\t\t.slice(0, Math.min(spare, missing, MOVE_AT_ONCE - moved))\n\t\t\t\t.map((unit) => unit.id)\n\t\t\tif (!ids.length) continue\n\t\t\tconst deposit = nearestOf(to.deposits[money]!, from.base.at)!\n\t\t\tai.send({ type: 'order', entities: ids, order: { type: 'harvest', target: deposit.id } })\n\t\t\tai.decide(\n\t\t\t\t`moves ${ids.length === 1 ? '1 worker' : `${ids.length} workers`} from the base at ${where(from.base.at)} to the one at ${where(to.base.at)}: ${(from.wants[money] ?? 0) === 0 ? 'its mine is gone' : 'it has more than it serves'}`,\n\t\t\t\t{ kind: 'economy' }\n\t\t\t)\n\t\t\tmoved += ids.length\n\t\t\tif (moved >= MOVE_AT_ONCE) return\n\t\t}\n\t}\n\n\t/**\n\t * Where the worker does not gather the other resource: so many of what does (`lumberjack`, a ghoul) sent to the trees\n\t * by home, those at home first, as many as home wants on it (the seat's `lumberjacks`). They are trained as soldiers are\n\t */\n\tprivate lumberjacks(): void {\n\t\tconst { ai } = this\n\t\tconst { view } = ai\n\t\tconst { lumberjack, worker, material } = this\n\t\tconst home = view.home()\n\t\tif (!lumberjack || lumberjack === worker || material === undefined || !home) return\n\t\tconst homeBase = view.bases()[0]\n\t\tconst wanted = homeBase ? this.asked(material, homeBase, 0) : 0\n\t\tconst all = view.mine.ofType(lumberjack.id).where((unit) => !unit.own?.hidden && !this.busy(unit))\n\t\tconst chopping = all.filter((unit) => unit.own?.order === 'harvest').length\n\t\tif (chopping >= wanted) return\n\t\tconst tree = view.resources.ofResource(material).nearest(home)\n\t\tif (!tree) return\n\t\tconst free = all.filter((unit) => unit.own?.order !== 'harvest' && distSq(unit, home) < HALL_REACH * HALL_REACH * 4)\n\t\tfree.sort((a, b) => distSq(a, home) - distSq(b, home))\n\t\tconst sent = free.slice(0, wanted - chopping)\n\t\tif (sent.length) ai.send({ type: 'order', entities: sent.map((unit) => unit.id), order: { type: 'harvest', target: tree.id } })\n\t}\n\n\t/**\n\t * Where mines are gathered from at what stands on them (`topper`): one put up on each mine by a hall of its own that\n\t * has none, a mine at a time, through the build plan. With none at all and none on its way, everything else waits\n\t * (`waiting`)\n\t */\n\tprivate toppers(): void {\n\t\tconst { ai } = this\n\t\tconst { view } = ai\n\t\tconst { topper } = this\n\t\tthis.waiting = false\n\t\tif (!topper || view.mine.some((entity) => entity.own?.build === topper.id && entity.own.order === 'build')) return\n\t\tconst hall = view.typesOf('hall')[0]\n\t\tconst halls = hall ? view.mine.ofType(hall.id).finished() : view.mine.where(() => false)\n\t\tfor (const at of halls) if (ai.plans.build.build(topper, { near: { x: at.x, z: at.z }, by: 'economy' })) return\n\t\tthis.waiting = view.mine.ofType(topper.id).length === 0\n\t}\n\n\t/** How many workers the bases want together: what the halls train up to, with `builders` more */\n\twanted(): number {\n\t\tlet sum = 0\n\t\tfor (const each of this.bases()) for (const kind in each.wants) sum += each.wants[kind] ?? 0\n\t\treturn sum\n\t}\n\n\t/** Workers trained at every hall with nothing in its queue, while it has fewer (those queued counted) than its bases want */\n\tprivate train(): void {\n\t\tconst { ai } = this\n\t\tconst { view } = ai\n\t\tconst { worker } = this\n\t\tif (!worker) return\n\t\tconst halls = view.mine\n\t\t\t.buildings()\n\t\t\t.finished()\n\t\t\t.where((_, def) => (def.trains ?? []).includes(worker.id))\n\t\tlet have = this.workers().length + this.queued(worker.id)\n\t\tconst want = this.wanted() + (this.options.builders ?? 1)\n\t\t// those at a base that is short train first\n\t\tconst bases = this.bases()\n\t\tconst shortAt = (at: Vec2) => {\n\t\t\tconst base = bases.find((each) => each.base.buildings.some((building) => building.x === at.x && building.z === at.z))\n\t\t\tif (!base) return 0\n\t\t\tlet missing = 0\n\t\t\tfor (const kind in base.wants) missing += (base.wants[kind] ?? 0) - (base.working[kind]?.length ?? 0)\n\t\t\treturn missing\n\t\t}\n\t\tconst ready = halls.filter((each) => !queueOf(each).length)\n\t\tready.sort((a, b) => shortAt(b) - shortAt(a))\n\t\tfor (const at of ready) {\n\t\t\tif (have >= want) return\n\t\t\tif (!ai.plans.production.train(at, worker)) return\n\t\t\thave++\n\t\t\tthis.trained++\n\t\t}\n\t}\n\n\t/** Another hall by a free mine, as many as it is to have, once the condition holds: a standing want of the build plan */\n\tprivate expand(): void {\n\t\tconst { ai } = this\n\t\tconst hall = ai.view.typesOf('hall')[0]\n\t\tconst expansions = this.options.expansions ?? 0\n\t\tif (!hall || expansions <= 0) {\n\t\t\tai.plans.build.drop(EXPAND_WANT)\n\t\t\treturn\n\t\t}\n\t\tconst when = this.options.expandWhen ?? DEFAULT_EXPAND_WHEN\n\t\tai.plans.build.want({\n\t\t\tid: EXPAND_WANT,\n\t\t\ttype: hall.id,\n\t\t\tcount: 1 + expansions,\n\t\t\tpriority: 40,\n\t\t\tkeep: true,\n\t\t\tby: 'economy',\n\t\t\t// by the mine, not just within sight of it: the first ground seen on the way there would be as far as a hall\n\t\t\t// reaches. Where nobody has looked, the plan sends a worker first\n\t\t\twithin: HALL_REACH - 1,\n\t\t\tnear: () => this.freeMine(),\n\t\t\twhen: (brain) => evaluate(when, brain) && !!this.freeMine()\n\t\t})\n\t}\n\n\t/** The economy as the report shows it */\n\treport(): EconomyReport {\n\t\tconst { ai } = this\n\t\tconst { worker } = this\n\t\tconst running = this.running\n\t\tconst bases = running ? this.bases() : []\n\t\treturn {\n\t\t\tbases: bases.map((each) => {\n\t\t\t\tconst workers: EconomyReport['bases'][number]['workers'] = {}\n\t\t\t\tfor (const kind of new Set([...Object.keys(each.wants), ...Object.keys(each.working)]))\n\t\t\t\t\tworkers[kind] = [each.working[kind]?.length ?? 0, each.wants[kind] ?? 0, each.serves[kind] ?? 0]\n\t\t\t\treturn { at: pair(each.base.at), hall: each.base.centre.id, workers }\n\t\t\t}),\n\t\t\tfled: Object.entries(this.memory.fled).map(([unit, fled]) => ({ unit: Number(unit), from: pair(fled.from), since: fled.since })),\n\t\t\tworkers: [worker ? this.workers().length + this.queued(worker.id) : 0, running ? this.wanted() + (this.options.builders ?? 1) : 0],\n\t\t\t...(ai.plans.build.get(EXPAND_WANT) && { expansion: ai.plans.build.status(EXPAND_WANT) ?? 'new' })\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 Object.keys(this.memory.fled).length > 0 || this.memory.material !== undefined\n\t}\n\n\t/** Its part of the brain's report */\n\treportTo(report: AiReport): void {\n\t\treport.economy = { ...report.economy, ...this.report() }\n\t}\n\n\t/** Gives a copy of the economy's memory, for a save of the brain */\n\tsave(): EconomyMemory {\n\t\treturn structuredClone(this.memory)\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 EconomyMemory | 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\tfled: structuredClone(given.fled ?? {}),\n\t\t\t...(given.material && typeof given.material.more === 'number' && { material: { ...given.material } })\n\t\t}\n\t\treturn true\n\t}\n}\n\n/** When it expands, where nothing says: four minutes in, with a building that trains soldiers */\nconst DEFAULT_EXPAND_WHEN: AiCondition = { all: [{ time: { after: 240 } }, { units: { role: 'barracks' } }] }\n\n/** Of some entities, the one nearest a place */\nfunction nearestOf(entities: readonly EntityState[], to: Vec2): EntityState | undefined {\n\tlet best: EntityState | undefined\n\tlet bestDistance = Infinity\n\tfor (const each of entities) {\n\t\tconst d = distSq(each, to)\n\t\tif (d < bestDistance) {\n\t\t\tbestDistance = d\n\t\t\tbest = each\n\t\t}\n\t}\n\treturn best\n}\n\n/**\n * The economy module: the workers base by base each think (`ai.economy.think`): builders to sites, workers off a raid and\n * back, the idle where they are missing, the spare moved, the other resource's gatherers, what the money is gathered at,\n * workers trained, another hall wanted. With how it runs where the brain's definition and the seat's options say nothing\n * (`EconomyOptions`)\n *\n * @beta\n */\nexport const economy = (options: EconomyOptions = {}): AiModuleDef =>\n\tdefineModule({ id: 'economy', make: (ai: Brain): AiModule => {\n\t\tai.area(Economy).configure(options)\n\t\treturn {\n\t\t\tid: 'economy',\n\t\t\tphase: 'plan',\n\t\t\tthink: () => ai.area(Economy).think()\n\t\t}\n\t} })\n\ndeclare module './area' {\n\tinterface AreaMemories {\n\t\teconomy?: EconomyMemory\n\t}\n}\n"],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ //#region src/ai/geometry.ts
2
+ /**
3
+ * A point as plain data, for a save or a task's data: `{ x, z }` and nothing else
4
+ *
5
+ * @beta
6
+ */
7
+ var point = (at) => ({
8
+ x: at.x,
9
+ z: at.z
10
+ });
11
+ /**
12
+ * A point as a report has it: `[x, z]`, rounded
13
+ *
14
+ * @beta
15
+ */
16
+ var pair = (at) => [Math.round(at.x), Math.round(at.z)];
17
+ /**
18
+ * A point as a decision writes it: `(40, 60)`
19
+ *
20
+ * @beta
21
+ */
22
+ var where = (at) => `(${Math.round(at.x)}, ${Math.round(at.z)})`;
23
+ /**
24
+ * Units counted as a decision writes them: `1 unit`, `3 units`
25
+ *
26
+ * @beta
27
+ */
28
+ var plural = (n) => n === 1 ? "1 unit" : `${n} units`;
29
+ /**
30
+ * A thing as a decision writes it, with its article: `a farm`, `an altar`
31
+ *
32
+ * @beta
33
+ */
34
+ var an = (thing) => `${/^[aeiou]/i.test(thing) ? "an" : "a"} ${thing}`;
35
+ //#endregion
36
+ export { an, pair, plural, point, where };
37
+
38
+ //# sourceMappingURL=geometry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"geometry.js","names":[],"sources":["../../src/ai/geometry.ts"],"sourcesContent":["/**\n * The small words of the AI kit (design review B13): a point as plain data, as a pair for a report, as a decision\n * writes it, and the counts and articles of a decision's line. One copy, for every module and area\n */\nimport type { Vec2 } from '#engine/math'\n\n/**\n * A point as plain data, for a save or a task's data: `{ x, z }` and nothing else\n *\n * @beta\n */\nexport const point = (at: Vec2): Vec2 => ({ x: at.x, z: at.z })\n\n/**\n * A point as a report has it: `[x, z]`, rounded\n *\n * @beta\n */\nexport const pair = (at: Vec2): [number, number] => [Math.round(at.x), Math.round(at.z)]\n\n/**\n * A point as a decision writes it: `(40, 60)`\n *\n * @beta\n */\nexport const where = (at: Vec2) => `(${Math.round(at.x)}, ${Math.round(at.z)})`\n\n/**\n * Units counted as a decision writes them: `1 unit`, `3 units`\n *\n * @beta\n */\nexport const plural = (n: number) => (n === 1 ? '1 unit' : `${n} units`)\n\n/**\n * A thing as a decision writes it, with its article: `a farm`, `an altar`\n *\n * @beta\n */\nexport const an = (thing: string) => `${/^[aeiou]/i.test(thing) ? 'an' : 'a'} ${thing}`\n"],"mappings":";;;;;;AAWA,IAAa,SAAS,QAAoB;CAAE,GAAG,GAAG;CAAG,GAAG,GAAG;AAAE;;;;;;AAO7D,IAAa,QAAQ,OAA+B,CAAC,KAAK,MAAM,GAAG,CAAC,GAAG,KAAK,MAAM,GAAG,CAAC,CAAC;;;;;;AAOvF,IAAa,SAAS,OAAa,IAAI,KAAK,MAAM,GAAG,CAAC,EAAE,IAAI,KAAK,MAAM,GAAG,CAAC,EAAE;;;;;;AAO7E,IAAa,UAAU,MAAe,MAAM,IAAI,WAAW,GAAG,EAAE;;;;;;AAOhE,IAAa,MAAM,UAAkB,GAAG,YAAY,KAAK,KAAK,IAAI,OAAO,IAAI,GAAG"}
@@ -340,6 +340,7 @@ export declare class Goals implements AiArea {
340
340
  /** What is held and on cooldown, for a save */
341
341
  /** Whether it has anything to remember now: one that does not is left out of a save */
342
342
  remembers(): boolean;
343
+ /** Gives what the goals remember, the holds and the rest, as plain data for a save of the brain */
343
344
  save(): GoalsMemory;
344
345
  /** Takes back what `save` gave: whether it was read */
345
346
  restore(memory: unknown): boolean;