@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":"plans.js","names":[],"sources":["../../../src/ai/plans/plans.ts"],"sourcesContent":["import type { Brain } from '#engine/ai/brain'\nimport type { AiArea } from '#engine/ai/area'\nimport { BuildPlan, type BuildPlanMemory, type BuildPlanOptions, type BuildPlanReport, type Want } from './build'\nimport { ProductionPlan, type ProductionPlanMemory, type ProductionPlanOptions, type ProductionPlanReport } from './production'\nimport type { PurseReport } from './purse'\n\n/*\n * The plans of a brain (AI plan, B3), under one name (`ai.plans`): the build plan (what to build, and how to get\n * there) and the production plan (what to train and research), and the game's build order over both (`order`: what\n * to have first, each item waiting for the one before, the computer's own wants held back meanwhile). They are the\n * brain's, as its goals are, so that every module adds to the same ones; the modules `build()` and `production()`\n * run each in its place among a brain's modules, and the melee player runs them in its own. What they remember is\n * kept together in the brain's memory (`BrainMemory.plans`)\n */\n\n/**\n * One item of a build order: a type to have (one of it), or a type and how many. Counts of a type add up along the order\n *\n * @beta\n */\nexport type BuildOrderItem = string | { type: string; count?: number }\n\n/**\n * How a brain plans (`BrainDef.plans`): the build plan's options, the production plan's, the build order\n *\n * @beta\n */\nexport interface PlansOptions {\n\t/** Options of the build plan */\n\tbuild?: BuildPlanOptions\n\t/** Options of the production plan */\n\tproduction?: ProductionPlanOptions\n\t/**\n\t * What to have first, in order (`BuildOrderItem`): each item waits for the one before, and nothing else the\n\t * computer would make of itself is made meanwhile (`following`); what it works out for itself once done. The\n\t * seat's `AiOptions.buildOrder`\n\t */\n\torder?: BuildOrderItem[]\n}\n\n/**\n * What the plans remember between thinks, for a save\n *\n * @beta\n */\nexport interface PlansMemory {\n\t/** The version of the memory's format: 1 so far */\n\tv: 1\n\t/** The build plan's memory */\n\tbuild?: BuildPlanMemory\n\t/** The production plan's memory */\n\tproduction?: ProductionPlanMemory\n}\n\n/**\n * The plans as the report shows them: the purse, and each plan's part\n *\n * @beta\n */\nexport interface PlansReport {\n\t/** The purse: what is free, promised and held */\n\tpurse: PurseReport\n\t/** The build plan's wants and which one saves up */\n\tbuild: BuildPlanReport\n\t/** The production plan's composition and what it trained */\n\tproduction: ProductionPlanReport\n\t/** The build order's next item, while it is being followed */\n\torder?: { type: string; count: number; item: number }\n}\n\n/**\n * A brain's plans (`ai.plans`): `build` for what is to be built, `production` for what is to be trained and\n * researched, the game's build `order` over both. `want` is the one door: a want of a building goes to the build\n * plan; one of a unit goes to the build plan for its buildings, and the production plan trains it\n *\n * @beta\n */\nexport class Plans implements AiArea {\n\t/** Its id among the brain's areas: what its memory and its report are kept under */\n\treadonly id = 'plans'\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 planned in a shape this brain does not read: it plans afresh'\n\n\t/** What to build, and the steps to it */\n\treadonly build: BuildPlan\n\t/** What to train and research */\n\treadonly production: ProductionPlan\n\tprivate readonly order: BuildOrderItem[]\n\tprivate followedAt = -1\n\tprivate next: PlansReport['order'] | undefined\n\n\tconstructor(\n\t\t/** The brain they plan for */\n\t\treadonly ai: Brain,\n\t\toptions: PlansOptions = {}\n\t) {\n\t\tthis.build = new BuildPlan(ai, options.build)\n\t\tthis.production = new ProductionPlan(ai, options.production)\n\t\tthis.order = options.order ?? []\n\t}\n\n\t/** Adds a want: what the brain works towards from now (`BuildPlan.want`). Gives back its id */\n\twant(def: Want): string {\n\t\treturn this.build.want(def)\n\t}\n\n\t/**\n\t * Works on the game's build order, once a think: the first item not had (what stands, is on its way or is queued\n\t * counted; counts of a type adding up along the order) is a want before all others (`order`, priority 1000), and\n\t * `following` is true. Called by the build plan as it thinks; a module may call it sooner\n\t */\n\tfollow(): PlansReport['order'] | undefined {\n\t\tconst { ai, build } = this\n\t\tif (this.followedAt === ai.tick) return this.next\n\t\tthis.followedAt = ai.tick\n\t\tlet next: PlansReport['order'] | undefined\n\t\tconst wanted = new Map<string, number>()\n\t\tfor (let i = 0; i < this.order.length && !next; i++) {\n\t\t\tconst item = this.order[i]\n\t\t\tconst { type, count = 1 } = typeof item === 'string' ? { type: item } : item\n\t\t\tconst need = (wanted.get(type) ?? 0) + count\n\t\t\twanted.set(type, need)\n\t\t\tif (build.have(type) + build.onItsWay(type) < need) next = { type, count: need, item: i }\n\t\t}\n\t\tthis.next = next\n\t\tif (next) build.want({ id: 'order', type: next.type, count: next.count, priority: 1000, by: 'the build order' })\n\t\telse build.drop('order')\n\t\treturn next\n\t}\n\n\t/** Whether the game's build order is still being followed: what the computer would make of itself waits */\n\tget following(): boolean {\n\t\treturn this.follow() !== undefined\n\t}\n\n\t/** Takes a want out, by id */\n\tdrop(id: string): boolean {\n\t\treturn this.build.drop(id)\n\t}\n\n\t/** The purse and each plan's part, for the report */\n\treport(): PlansReport {\n\t\treturn {\n\t\t\tpurse: this.ai.purse.inspect(),\n\t\t\tbuild: this.build.report(),\n\t\t\tproduction: this.production.report(),\n\t\t\t...(this.next && { order: { ...this.next } })\n\t\t}\n\t}\n\n\t/** What the plans remember, for a save */\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 true\n\t}\n\n\t/** Gives a copy of the plans' memory, for a save of the brain */\n\tsave(): PlansMemory {\n\t\tconst production = this.production.save()\n\t\treturn { v: 1, build: this.build.save(), ...(production && { production }) }\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 PlansMemory | undefined\n\t\tif (!given || typeof given !== 'object' || given.v !== 1) return false\n\t\tif (given.build !== undefined) this.build.restore(given.build)\n\t\tthis.production.restore(given.production)\n\t\treturn true\n\t}\n}\n\ndeclare module '#engine/ai/area' {\n\tinterface AreaMemories {\n\t\tplans?: PlansMemory\n\t}\n}\n"],"mappings":";;;;;;;;;;AA6EA,IAAa,QAAb,MAAqC;CAgB1B;;CAdV,KAAc;;CAEd,SAAkB;;CAGlB;;CAEA;CACA;CACA,aAAqB;CACrB;CAEA,YAEC,IACA,UAAwB,CAAC,GACxB;EAFQ,KAAA,KAAA;EAGT,KAAK,QAAQ,IAAI,UAAU,IAAI,QAAQ,KAAK;EAC5C,KAAK,aAAa,IAAI,eAAe,IAAI,QAAQ,UAAU;EAC3D,KAAK,QAAQ,QAAQ,SAAS,CAAC;CAChC;;CAGA,KAAK,KAAmB;EACvB,OAAO,KAAK,MAAM,KAAK,GAAG;CAC3B;;;;;;CAOA,SAA2C;EAC1C,MAAM,EAAE,IAAI,UAAU;EACtB,IAAI,KAAK,eAAe,GAAG,MAAM,OAAO,KAAK;EAC7C,KAAK,aAAa,GAAG;EACrB,IAAI;EACJ,MAAM,yBAAS,IAAI,IAAoB;EACvC,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK,MAAM,UAAU,CAAC,MAAM,KAAK;GACpD,MAAM,OAAO,KAAK,MAAM;GACxB,MAAM,EAAE,MAAM,QAAQ,MAAM,OAAO,SAAS,WAAW,EAAE,MAAM,KAAK,IAAI;GACxE,MAAM,QAAQ,OAAO,IAAI,IAAI,KAAK,KAAK;GACvC,OAAO,IAAI,MAAM,IAAI;GACrB,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,SAAS,IAAI,IAAI,MAAM,OAAO;IAAE;IAAM,OAAO;IAAM,MAAM;GAAE;EACzF;EACA,KAAK,OAAO;EACZ,IAAI,MAAM,MAAM,KAAK;GAAE,IAAI;GAAS,MAAM,KAAK;GAAM,OAAO,KAAK;GAAO,UAAU;GAAM,IAAI;EAAkB,CAAC;OAC1G,MAAM,KAAK,OAAO;EACvB,OAAO;CACR;;CAGA,IAAI,YAAqB;EACxB,OAAO,KAAK,OAAO,MAAM,KAAA;CAC1B;;CAGA,KAAK,IAAqB;EACzB,OAAO,KAAK,MAAM,KAAK,EAAE;CAC1B;;CAGA,SAAsB;EACrB,OAAO;GACN,OAAO,KAAK,GAAG,MAAM,QAAQ;GAC7B,OAAO,KAAK,MAAM,OAAO;GACzB,YAAY,KAAK,WAAW,OAAO;GACnC,GAAI,KAAK,QAAQ,EAAE,OAAO,EAAE,GAAG,KAAK,KAAK,EAAE;EAC5C;CACD;;;CAIA,YAAqB;EACpB,OAAO;CACR;;CAGA,OAAoB;EACnB,MAAM,aAAa,KAAK,WAAW,KAAK;EACxC,OAAO;GAAE,GAAG;GAAG,OAAO,KAAK,MAAM,KAAK;GAAG,GAAI,cAAc,EAAE,WAAW;EAAG;CAC5E;;CAGA,QAAQ,QAA0B;EACjC,MAAM,QAAQ;EACd,IAAI,CAAC,SAAS,OAAO,UAAU,YAAY,MAAM,MAAM,GAAG,OAAO;EACjE,IAAI,MAAM,UAAU,KAAA,GAAW,KAAK,MAAM,QAAQ,MAAM,KAAK;EAC7D,KAAK,WAAW,QAAQ,MAAM,UAAU;EACxC,OAAO;CACR;AACD"}
@@ -1,4 +1,4 @@
1
- import type { UnitTypeDef, UpgradeDef } from '#engine/defs';
1
+ import { type UnitTypeDef, type UpgradeDef } from '#engine/defs';
2
2
  import type { EntityState } from '#engine/session/protocol';
3
3
  import { type Brain } from '#engine/ai/brain';
4
4
  import { type AiModuleDef } from '#engine/ai/module';
@@ -40,7 +40,7 @@ export interface ProductionPlanOptions {
40
40
  /** How important training and research are to the purse (`Purse`): 0 when left out, under every want that saves */
41
41
  priority?: number;
42
42
  /**
43
- * The tier of the game's upkeep (`GameModule.upkeep`: 0 none, 1 the first) the composition trains no further into:
43
+ * The tier of the game's upkeep (`Rules.upkeep`: 0 none, 1 the first) the composition trains no further into:
44
44
  * a soldier that would take the supply used past it waits, and no supply is wanted past it, unless the money would
45
45
  * lie idle (`upkeepSpare`). What is wanted outright (a wave's, a build order's) is trained all the same. `UPKEEP_TIER`
46
46
  * (1) when left out; `false` reads no upkeep
@@ -69,11 +69,17 @@ export declare const UPKEEP_SPARE = 600;
69
69
  * @beta
70
70
  */
71
71
  export interface CompositionReport {
72
+ /** The id of the unit type */
72
73
  type: string;
74
+ /** How much of the army is wanted of the type, 0..1 */
73
75
  target: number;
76
+ /** How many of the type the player has */
74
77
  have: number;
78
+ /** How much of the army it is now, 0..1 */
75
79
  share: number;
80
+ /** How well the type answers their army: 1 is as good as against anyone */
76
81
  counter: number;
82
+ /** How urgent it is to train the type next, from the target, the share and the counter */
77
83
  urge: number;
78
84
  }
79
85
  /**
@@ -83,10 +89,15 @@ export interface CompositionReport {
83
89
  * @beta
84
90
  */
85
91
  export interface ProductionPlanReport {
92
+ /** The unit types weighed, each with its target, share, counter and urge */
86
93
  composition: CompositionReport[];
94
+ /** The unit types it queued this think */
87
95
  trained: string[];
96
+ /** The upgrades it researched this think */
88
97
  researched: string[];
98
+ /** The unit wants it trains towards */
89
99
  wants: string[];
100
+ /** Why it did not train, or what it does, in words */
90
101
  status: string;
91
102
  }
92
103
  /**
@@ -95,6 +106,7 @@ export interface ProductionPlanReport {
95
106
  * @beta
96
107
  */
97
108
  export interface ProductionPlanMemory {
109
+ /** The want of supply it set: the supply building's type, how many it needs and the most it asked for */
98
110
  supply?: {
99
111
  type: string;
100
112
  need: number;
@@ -0,0 +1,434 @@
1
+ import { supplyOf } from "../../defs.js";
2
+ import { availableToPlayer } from "../../shared.js";
3
+ import { queueOf } from "../../systems/productionQueue.js";
4
+ import { defineModule } from "../module.js";
5
+ import { an } from "../geometry.js";
6
+ //#region src/ai/plans/production.ts
7
+ /**
8
+ * The tier of upkeep the production plan trains no further into where its options say none (`upkeepTier`)
9
+ *
10
+ * @beta
11
+ */
12
+ var UPKEEP_TIER = 1;
13
+ /**
14
+ * The money free past which the production plan reads no upkeep: what would lie idle else (`upkeepSpare`)
15
+ *
16
+ * @beta
17
+ */
18
+ var UPKEEP_SPARE = 600;
19
+ var QUEUE = 2;
20
+ var SUPPLY_MARGIN = 4;
21
+ /** The id of the build plan's want of supply */
22
+ var SUPPLY_WANT = "production.supply";
23
+ var RESEARCH_SPARE = 200;
24
+ /**
25
+ * The brain's production plan (`ai.plans.production`): what it trains and researches, by the wants of units, the
26
+ * composition and the counters, with supply kept ahead. `train` and `research` are the primitives any module uses
27
+ * to queue something through the purse; `think` runs the plan once a think
28
+ *
29
+ * @beta
30
+ */
31
+ var ProductionPlan = class {
32
+ ai;
33
+ options = {};
34
+ thoughtAt = -1;
35
+ trained = [];
36
+ researched = [];
37
+ status = "new";
38
+ weighed = [];
39
+ wantedNow = [];
40
+ /** What the supply want was last set with (`supplyAhead`): kept in a save, for a loaded game to have it again */
41
+ supply;
42
+ constructor(ai, options = {}) {
43
+ this.ai = ai;
44
+ this.configure(options);
45
+ }
46
+ /** Takes options in, over what it had */
47
+ configure(options) {
48
+ this.options = {
49
+ ...this.options,
50
+ ...options
51
+ };
52
+ }
53
+ /** The plan's options as they stand */
54
+ get settings() {
55
+ return this.options;
56
+ }
57
+ /** Whether the player may make a type or research an upgrade (`key`: `upgrade:<id>`), as its race and the game's `available` hook say */
58
+ may(def, key) {
59
+ const { me } = this.ai.view;
60
+ return availableToPlayer(def, {
61
+ race: me.race,
62
+ availability: me.availability
63
+ }, key);
64
+ }
65
+ /** How many of a unit type the player's buildings are training */
66
+ queued(type) {
67
+ let count = 0;
68
+ for (const entity of this.ai.view.mine) for (const item of queueOf(entity)) if (item.kind === "unit" && item.id === type) count++;
69
+ return count;
70
+ }
71
+ /**
72
+ * Trains a unit at a building, when it fits the supply, the queue has room and the purse allows: whether it was
73
+ * sent. The supply used is bumped on the view's `me` at once, so that the next call this think does not queue past
74
+ * the cap before the command lands. What the economy, the hero module and this plan all train through
75
+ */
76
+ train(building, type, priority = this.options.priority ?? 0) {
77
+ const { ai } = this;
78
+ const { me } = ai.view;
79
+ const supply = supplyOf(type);
80
+ if (supply > 0 && me.supplyUsed + supply > me.supplyCap) return false;
81
+ if (queueOf(building).length >= (this.options.queue ?? QUEUE)) return false;
82
+ if (!ai.purse.affords(type.cost, 0, priority)) return false;
83
+ ai.purse.spend(type.cost, priority);
84
+ me.supplyUsed += supply;
85
+ ai.send({
86
+ type: "train",
87
+ building: building.id,
88
+ unitType: type.id
89
+ });
90
+ return true;
91
+ }
92
+ /**
93
+ * Researches an upgrade at a building, when it is not researching already, the building's queue has room and the
94
+ * purse allows with `spare` left over: whether it was sent. `me.researching` is bumped at once
95
+ */
96
+ research(building, upgrade, spare = 0, priority = this.options.priority ?? 0) {
97
+ const { ai } = this;
98
+ const { me } = ai.view;
99
+ if (me.researching.includes(upgrade.id)) return false;
100
+ if (queueOf(building).length >= (this.options.queue ?? QUEUE)) return false;
101
+ if (!ai.purse.affords(upgrade.cost, spare, priority)) return false;
102
+ ai.purse.spend(upgrade.cost, priority);
103
+ me.researching.push(upgrade.id);
104
+ ai.send({
105
+ type: "research",
106
+ building: building.id,
107
+ upgrade: upgrade.id
108
+ });
109
+ return true;
110
+ }
111
+ /** Whether an upgrade can be researched now: a level left, not under way, the player's to make, what the next level requires standing */
112
+ researchable(upgrade) {
113
+ const { me } = this.ai.view;
114
+ const level = me.upgrades[upgrade.id] ?? 0;
115
+ return level < (upgrade.maxLevel ?? 1) && !me.researching.includes(upgrade.id) && this.may(upgrade, `upgrade:${upgrade.id}`) && this.ai.view.has(upgrade.requires?.[level]);
116
+ }
117
+ /** The soldier types the player can train now: at a finished building of its own, their requirements standing */
118
+ trainable() {
119
+ const { view, registry } = this.ai;
120
+ const types = [];
121
+ for (const building of view.mine.buildings().finished()) for (const id of view.def(building).trains ?? []) {
122
+ if (!registry.units.has(id)) continue;
123
+ const def = registry.unit(id);
124
+ if (types.includes(def) || !view.hasRole(id, "soldier") || !this.may(def, id) || !view.has(def.requires)) continue;
125
+ types.push(def);
126
+ }
127
+ return types;
128
+ }
129
+ /** The army's composition wanted, as given: the function asked, the data as it is */
130
+ composition() {
131
+ const { composition } = this.options;
132
+ return typeof composition === "function" ? composition(this.ai) : composition;
133
+ }
134
+ /**
135
+ * The composition as weighed this think, for the types it can train: each type's share wanted (the composition's
136
+ * for its id, or for a tag or role where no type has that id, split among the types that have it; even when there is no composition), its
137
+ * share of the soldiers now, how well it answers the enemy's army seen, and its urge: `target × (1 + counters ×
138
+ * (counter − 1)) − share`. The most urgent is trained first
139
+ */
140
+ weigh() {
141
+ const { view } = this.ai;
142
+ const types = this.trainable();
143
+ if (!types.length) return [];
144
+ const composition = this.composition();
145
+ const weights = /* @__PURE__ */ new Map();
146
+ if (composition) for (const [key, share] of Object.entries(composition)) {
147
+ const tagged = this.ai.registry.units.has(key) ? types.filter((def) => def.id === key) : types.filter((def) => view.roles.hasTag(def.id, key) || view.roles.has(def.id, key));
148
+ for (const def of tagged) weights.set(def, (weights.get(def) ?? 0) + share / tagged.length);
149
+ }
150
+ let total = 0;
151
+ for (const def of types) total += composition ? weights.get(def) ?? 0 : 1;
152
+ const soldiers = view.mine.fighters().where((_, def) => !def.hero);
153
+ const counters = this.counters(types);
154
+ const pull = this.options.counters ?? 1;
155
+ return types.map((def) => {
156
+ const target = total > 0 ? (composition ? weights.get(def) ?? 0 : 1) / total : 0;
157
+ const have = soldiers.ofType(def.id).length;
158
+ const share = soldiers.length ? have / soldiers.length : 0;
159
+ const counter = counters.get(def.id) ?? 1;
160
+ return {
161
+ type: def.id,
162
+ target,
163
+ have,
164
+ share,
165
+ counter,
166
+ urge: target * (1 + pull * (counter - 1)) - share
167
+ };
168
+ });
169
+ }
170
+ /** How well each type answers the most of each enemy unit type seen at once (`Strength.counterFor`): 1 for each where nothing was seen */
171
+ counters(types) {
172
+ const { ai } = this;
173
+ const result = /* @__PURE__ */ new Map();
174
+ if (ai.def.knowledge === false) return result;
175
+ const seen = {};
176
+ for (const [type, { most }] of Object.entries(ai.knowledge.enemy.typesSeen())) if (ai.registry.units.has(type) && ai.registry.unit(type).kind === "unit") seen[type] = most;
177
+ if (!Object.keys(seen).length) return result;
178
+ for (const { def, score } of ai.view.strength.counterFor(seen, types)) result.set(def.id, score);
179
+ return result;
180
+ }
181
+ /** The unit wants the build plan holds that are to be trained now (their buildings up), most important first; the order's alone while it is followed */
182
+ wanted() {
183
+ const { ai } = this;
184
+ const build = ai.plans.build;
185
+ const following = ai.plans.following;
186
+ return build.list().filter((want) => {
187
+ if (following && want.id !== "order") return false;
188
+ if (!ai.registry.units.has(want.type) || ai.registry.unit(want.type).kind !== "unit") return false;
189
+ const count = typeof want.count === "function" ? want.count(ai) : want.count ?? 1;
190
+ return build.have(want.type) + this.queued(want.type) < count && build.next(want.type)?.how === "train" && build.next(want.type)?.type === want.type;
191
+ }).sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0));
192
+ }
193
+ /** The finished buildings of the player's that train a type, with room in their queue */
194
+ trainersOf(type) {
195
+ const { view } = this.ai;
196
+ return view.mine.buildings().finished().filter((building) => !!view.def(building).trains?.includes(type) && queueOf(building).length < (this.options.queue ?? QUEUE));
197
+ }
198
+ /**
199
+ * The think, once a think: the unit wants first (each at a building that trains it, as many as wanted), then the
200
+ * composition's most urgent type at every building with room, as the supply, the queue and the purse allow; one
201
+ * more of what provides supply wanted when the next does not fit; then the research
202
+ */
203
+ think() {
204
+ const { ai } = this;
205
+ if (this.thoughtAt === ai.tick) return;
206
+ this.thoughtAt = ai.tick;
207
+ this.trained = [];
208
+ this.researched = [];
209
+ this.wantedNow = [];
210
+ this.weighed = [];
211
+ this.status = "nothing to train";
212
+ if (this.options.train !== false) {
213
+ const { me } = ai.view;
214
+ const priority = this.options.priority ?? 0;
215
+ let short;
216
+ let unpaid;
217
+ let upkept;
218
+ const upkeep = ai.purse.affords(void 0, this.options.upkeepSpare ?? 600, priority) ? void 0 : this.upkeepLimit();
219
+ const queue = (type, upTo, composition = false) => {
220
+ let sent = 0;
221
+ for (const trainer of this.trainersOf(type.id)) {
222
+ if (sent >= upTo) break;
223
+ const supply = supplyOf(type);
224
+ if (supply > 0 && me.supplyUsed + supply > me.supplyCap) {
225
+ short ??= type;
226
+ break;
227
+ }
228
+ if (composition && supply > 0 && upkeep !== void 0 && me.supplyUsed + supply > upkeep) {
229
+ upkept ??= type;
230
+ break;
231
+ }
232
+ if (!ai.purse.affords(type.cost, 0, priority)) {
233
+ unpaid ??= type;
234
+ break;
235
+ }
236
+ if (!this.train(trainer, type, priority)) break;
237
+ this.trained.push(type.id);
238
+ sent++;
239
+ }
240
+ return sent;
241
+ };
242
+ for (const want of this.wanted()) {
243
+ this.wantedNow.push(want.id);
244
+ const count = typeof want.count === "function" ? want.count(ai) : want.count ?? 1;
245
+ const type = ai.registry.unit(want.type);
246
+ const sent = queue(type, count - ai.plans.build.have(want.type) - this.queued(want.type));
247
+ if (sent) ai.decide(`trains ${sent === 1 ? an(type.id) : `${sent} ${type.id}`}: wanted${want.by ? ` by ${want.by}` : ""}`, { kind: "production" });
248
+ }
249
+ if (!ai.plans.following) {
250
+ this.weighed = this.weigh();
251
+ const ranked = this.weighed.every((entry) => entry.target <= 0) ? [] : [...this.weighed].sort((a, b) => b.urge - a.urge);
252
+ const pull = this.options.counters ?? 1;
253
+ for (const entry of ranked) {
254
+ if (pull > 0 && entry.counter <= 0) continue;
255
+ if (entry.urge <= 0 && ranked[0].urge > 0) continue;
256
+ const type = ai.registry.unit(entry.type);
257
+ const before = unpaid;
258
+ const sent = queue(type, Infinity, true);
259
+ if (sent) {
260
+ ai.decide(`trains ${sent === 1 ? an(type.id) : `${sent} ${type.id}`}: ${entry.counter !== 1 ? `answers their army ${entry.counter.toFixed(2)}, ` : ""}${Math.round(entry.share * 100)}% of the army for ${Math.round(entry.target * 100)}% wanted`, { kind: "production" });
261
+ break;
262
+ }
263
+ if (short || upkept) break;
264
+ if (unpaid && unpaid !== before) continue;
265
+ }
266
+ }
267
+ if (short) this.status = `${an(short.id)} does not fit the supply`;
268
+ else if (upkept) this.status = `holds at ${upkeep} supply: ${an(upkept.id)} would take it into upkeep`;
269
+ else if (unpaid) this.status = `waits for the money for ${an(unpaid.id)}`;
270
+ else if (this.trained.length) this.status = `trained ${this.trained.join(", ")}`;
271
+ const next = short ?? (this.weighed.length ? ai.registry.unit([...this.weighed].sort((a, b) => b.urge - a.urge)[0].type) : void 0);
272
+ if (this.options.supplyAhead !== false) this.supplyAhead(next, upkeep);
273
+ }
274
+ this.runResearch();
275
+ }
276
+ /**
277
+ * The supply used the composition trains no further than for upkeep (`upkeepTier`): where the tier after the one it
278
+ * may be in begins. None in a game without upkeep, past its last tier, or with `upkeepTier: false`
279
+ */
280
+ upkeepLimit() {
281
+ const tier = this.options.upkeepTier ?? 1;
282
+ if (tier === false) return void 0;
283
+ return this.ai.registry.upkeep[tier]?.above;
284
+ }
285
+ /**
286
+ * Supply kept ahead: when the type to train next does not fit (or the free supply is under the margin), one more of
287
+ * the cheapest building that provides supply is wanted of the build plan, unless the cap is the game's most or one
288
+ * is on its way already
289
+ */
290
+ supplyAhead(next, upkeep) {
291
+ const { ai } = this;
292
+ const { view } = ai;
293
+ const { me } = view;
294
+ const margin = this.options.supplyMargin ?? SUPPLY_MARGIN;
295
+ const need = (next ? supplyOf(next) : 0) + margin;
296
+ const most = Math.min(ai.registry.settings.supply.max, upkeep ?? Infinity);
297
+ if (me.supplyCap >= most || me.supplyCap - me.supplyUsed >= need) return;
298
+ const type = [...view.typesOf("supply")].sort((a, b) => (a.cost?.[ai.purse.money] ?? 0) - (b.cost?.[ai.purse.money] ?? 0))[0];
299
+ if (!type) return;
300
+ this.wantSupply(type.id, need, most);
301
+ }
302
+ /**
303
+ * One at a time: what stands finished, and one more. A standing want, with what is needed in its condition: set
304
+ * again whenever the need changes
305
+ */
306
+ wantSupply(type, need, most) {
307
+ const { ai } = this;
308
+ this.supply = {
309
+ type,
310
+ need,
311
+ most
312
+ };
313
+ ai.plans.build.want({
314
+ id: SUPPLY_WANT,
315
+ type,
316
+ count: () => ai.view.mine.ofType(type).finished().length + 1,
317
+ priority: 90,
318
+ by: "supply",
319
+ keep: true,
320
+ when: () => {
321
+ const now = ai.view.me;
322
+ return now.supplyCap < most && now.supplyCap - now.supplyUsed < need;
323
+ }
324
+ });
325
+ }
326
+ /** What it remembers, for a save: what the supply want was set with, while it stands */
327
+ save() {
328
+ const { supply } = this;
329
+ if (!supply || !this.ai.plans.build.get(SUPPLY_WANT)) return void 0;
330
+ return { supply: {
331
+ type: supply.type,
332
+ need: supply.need,
333
+ ...Number.isFinite(supply.most) && { most: supply.most }
334
+ } };
335
+ }
336
+ /**
337
+ * Takes back what `save` gave, after the build plan's: the supply want is had again at once, before the first think,
338
+ * as the game saved from has it (the module sets it again only when supply runs short, after the build plan thinks)
339
+ */
340
+ restore(memory) {
341
+ const supply = memory?.supply;
342
+ this.supply = void 0;
343
+ if (!supply || typeof supply.type !== "string" || !this.ai.registry.units.has(supply.type)) return;
344
+ this.wantSupply(supply.type, supply.need, supply.most ?? Infinity);
345
+ }
346
+ /**
347
+ * The upgrade to research next: the first of the list it can (`research` as a list), what the function gives, or,
348
+ * left to itself, the one the most of its units benefit from (`UpgradeEffect.units`), ties as the game lists them
349
+ */
350
+ nextResearch() {
351
+ const { ai } = this;
352
+ const { view, registry } = ai;
353
+ const { research } = this.options;
354
+ if (typeof research === "function") {
355
+ const id = research(ai);
356
+ return id !== void 0 && registry.upgrades.has(id) && this.researchable(registry.upgrade(id)) ? registry.upgrade(id) : void 0;
357
+ }
358
+ const offered = [];
359
+ for (const building of view.mine.buildings().finished()) for (const id of view.def(building).researches ?? []) {
360
+ if (!registry.upgrades.has(id)) continue;
361
+ const def = registry.upgrade(id);
362
+ if (!offered.includes(def) && this.researchable(def)) offered.push(def);
363
+ }
364
+ if (research) {
365
+ for (const id of research) {
366
+ const found = offered.find((def) => def.id === id);
367
+ if (found) return found;
368
+ }
369
+ return;
370
+ }
371
+ let best;
372
+ let most = -1;
373
+ for (const def of offered) {
374
+ const benefits = view.mine.units().filter((unit) => def.effects.some((effect) => effectApplies(effect.units, view.def(unit)))).length;
375
+ if (benefits > most) {
376
+ most = benefits;
377
+ best = def;
378
+ }
379
+ }
380
+ return best;
381
+ }
382
+ /** Research, with money to spare: the next upgrade at a finished building of the player's that researches it */
383
+ runResearch() {
384
+ const { ai } = this;
385
+ const { view } = ai;
386
+ const next = this.nextResearch();
387
+ if (!next) return;
388
+ const at = view.mine.buildings().finished().find((building) => !!view.def(building).researches?.includes(next.id) && queueOf(building).length < (this.options.queue ?? QUEUE));
389
+ if (!at) return;
390
+ if (this.research(at, next, this.options.researchSpare ?? RESEARCH_SPARE)) {
391
+ this.researched.push(next.id);
392
+ ai.decide(`researches ${next.id}: money to spare`, { kind: "research" });
393
+ }
394
+ }
395
+ /** The composition as weighed, what was trained and researched this think, the wants trained towards, and the status */
396
+ report() {
397
+ return {
398
+ composition: this.weighed.map((entry) => ({ ...entry })),
399
+ trained: [...this.trained],
400
+ researched: [...this.researched],
401
+ wants: [...this.wantedNow],
402
+ status: this.status
403
+ };
404
+ }
405
+ };
406
+ /** Whether an upgrade's effect applies to a unit type: everything the player owns when it names none */
407
+ function effectApplies(units, def) {
408
+ if (!units) return true;
409
+ if (typeof units === "function") return units(def);
410
+ return units.includes(def.id);
411
+ }
412
+ /**
413
+ * The production module: runs the brain's production plan (`ai.plans.production.think()`) in its place among a
414
+ * brain's modules, after the build plan (which puts up what a want needs) where a brain has both. With options for
415
+ * the plan
416
+ *
417
+ * @beta
418
+ */
419
+ var production = (options = {}) => defineModule({
420
+ id: "production",
421
+ make: (ai) => {
422
+ ai.plans.production.configure(options);
423
+ return {
424
+ id: "production",
425
+ phase: "plan",
426
+ after: ["build"],
427
+ think: () => ai.plans.production.think()
428
+ };
429
+ }
430
+ });
431
+ //#endregion
432
+ export { ProductionPlan, UPKEEP_SPARE, UPKEEP_TIER, production };
433
+
434
+ //# sourceMappingURL=production.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"production.js","names":[],"sources":["../../../src/ai/plans/production.ts"],"sourcesContent":["import { supplyOf, type UnitTypeDef, type UpgradeDef } from '#engine/defs'\nimport { queueOf } from '#engine/systems/productionQueue'\nimport type { EntityState } from '#engine/session/protocol'\nimport { availableToPlayer } from '#engine/shared'\nimport { type Brain } from '#engine/ai/brain'\nimport { type AiModule, type AiModuleDef, defineModule } from '#engine/ai/module'\nimport type { Want } from './build'\nimport { an } from '../geometry'\n\n/*\n * The production plan (AI plan, B3): what a computer player trains and researches. The old melee player trained, at\n * each barracks, \"whatever answers their army best, then whatever there is the least of\", and researched \"whatever is\n * first with gold to spare\". The plan keeps a **composition** instead: the army it wants, as shares by unit type or\n * tag (`{ footman: 2, rifleman: 1 }`, `{ ranged: 1, melee: 1 }`), from the brain's definition, the seat's options, the\n * profile (D1) and the waves (D2) as those land; what is trained is what is furthest under its share, with what\n * answers the enemy's army seen (`Strength.counterFor`, A4) pulling the shares about: a type that cannot hit what\n * they field is not trained while they field it. **Wants** of units (`ai.plans.want({ type: 'gryphon', count: 4 })`)\n * come before the composition: the build plan puts their buildings up, this plan trains them. It trains at every\n * building that trains, as the queue length and the purse allow, and keeps **supply ahead**: when what it would train\n * next does not fit, it wants one more of the cheapest building that provides supply. **Research** goes by a ranked\n * list (`research: ['swords', ...]`, or a function giving the next), or, left to itself, by what the army it has uses\n * most, with money to spare. **Upkeep** (`Rules.upkeep`) is read: the composition trains no further into a tier\n * of upkeep than `upkeepTier` says, unless the money would lie idle (`upkeepSpare`), and no supply is wanted past it.\n * Nothing here is of one game: the types come from the roles and the definitions\n */\n\n/**\n * The army a computer player wants, as shares by unit type id or tag (the kit's `ranged`, `melee`, `hitsAir`, a\n * game's own): `{ footman: 2, rifleman: 1 }` is two footmen to a rifleman. A tag's share is split among the types\n * that have it; a type named gets its own beside. Types it cannot train yet are left out until it can\n *\n * @beta\n */\nexport type Composition = Record<string, number>\n\n/**\n * How the production plan goes about it (`BrainDef.plans.production`, the `production()` module; the data of it in\n * `AiOptions.composition` and `research`)\n *\n * @beta\n */\nexport interface ProductionPlanOptions {\n\t/** The army it wants (`Composition`), or a function of the brain giving it. Even shares of every soldier type it can train when left out */\n\tcomposition?: Composition | ((ai: Brain) => Composition)\n\t/**\n\t * How much what answers the enemy's army seen pulls the shares about: 0 not at all, 1 (left out) as much as a\n\t * share; a type that cannot hit what they field is not trained while they field it\n\t */\n\tcounters?: number\n\t/** Whether it trains soldiers at all: yes when left out. Workers and heroes are the economy's and the hero module's */\n\ttrain?: boolean\n\t/** How many may queue at one building: 2 when left out */\n\tqueue?: number\n\t/** Whether to want one more of what provides supply when what it would train next does not fit: yes when left out */\n\tsupplyAhead?: boolean\n\t/** Supply to keep free beyond the next unit's, so that the farm is up before it is needed: 4 when left out */\n\tsupplyMargin?: number\n\t/** Upgrades to research, in order, by id (the first it can is next), or a function of the brain giving the next; what the army it has uses most when left out */\n\tresearch?: string[] | ((ai: Brain) => string | undefined)\n\t/** Money to have left over before researching: 200 when left out (research is a luxury) */\n\tresearchSpare?: number\n\t/** How important training and research are to the purse (`Purse`): 0 when left out, under every want that saves */\n\tpriority?: number\n\t/**\n\t * The tier of the game's upkeep (`Rules.upkeep`: 0 none, 1 the first) the composition trains no further into:\n\t * a soldier that would take the supply used past it waits, and no supply is wanted past it, unless the money would\n\t * lie idle (`upkeepSpare`). What is wanted outright (a wave's, a build order's) is trained all the same. `UPKEEP_TIER`\n\t * (1) when left out; `false` reads no upkeep\n\t */\n\tupkeepTier?: number | false\n\t/** Money free past which upkeep is not read (it would lie idle else): `UPKEEP_SPARE` (600) when left out */\n\tupkeepSpare?: number\n}\n\n/**\n * The tier of upkeep the production plan trains no further into where its options say none (`upkeepTier`)\n *\n * @beta\n */\nexport const UPKEEP_TIER = 1\n\n/**\n * The money free past which the production plan reads no upkeep: what would lie idle else (`upkeepSpare`)\n *\n * @beta\n */\nexport const UPKEEP_SPARE = 600\n\n/**\n * One type as the production plan weighs it, for the report: its share of the army wanted (`target`, 0..1), its share\n * now (`share`), how well it answers their army (`counter`: 1 is as good as against anyone), and what the two come\n * to (`urge`: the most urgent is trained next)\n *\n * @beta\n */\nexport interface CompositionReport {\n\t/** The id of the unit type */\n\ttype: string\n\t/** How much of the army is wanted of the type, 0..1 */\n\ttarget: number\n\t/** How many of the type the player has */\n\thave: number\n\t/** How much of the army it is now, 0..1 */\n\tshare: number\n\t/** How well the type answers their army: 1 is as good as against anyone */\n\tcounter: number\n\t/** How urgent it is to train the type next, from the target, the share and the counter */\n\turge: number\n}\n\n/**\n * The production plan as the report shows it: the composition as weighed, what it trained and researched this\n * think, the unit wants it trains towards, and why it did not train where it did not\n *\n * @beta\n */\nexport interface ProductionPlanReport {\n\t/** The unit types weighed, each with its target, share, counter and urge */\n\tcomposition: CompositionReport[]\n\t/** The unit types it queued this think */\n\ttrained: string[]\n\t/** The upgrades it researched this think */\n\tresearched: string[]\n\t/** The unit wants it trains towards */\n\twants: string[]\n\t/** Why it did not train, or what it does, in words */\n\tstatus: string\n}\n\nconst QUEUE = 2\nconst SUPPLY_MARGIN = 4\n/** The id of the build plan's want of supply */\nconst SUPPLY_WANT = 'production.supply'\nconst RESEARCH_SPARE = 200\n\n/**\n * What the production plan remembers between thinks, for a save: what its want of supply was set with\n *\n * @beta\n */\nexport interface ProductionPlanMemory {\n\t/** The want of supply it set: the supply building's type, how many it needs and the most it asked for */\n\tsupply?: { type: string; need: number; most?: number }\n}\n\n/**\n * The brain's production plan (`ai.plans.production`): what it trains and researches, by the wants of units, the\n * composition and the counters, with supply kept ahead. `train` and `research` are the primitives any module uses\n * to queue something through the purse; `think` runs the plan once a think\n *\n * @beta\n */\nexport class ProductionPlan {\n\tprivate options: ProductionPlanOptions = {}\n\tprivate thoughtAt = -1\n\tprivate trained: string[] = []\n\tprivate researched: string[] = []\n\tprivate status = 'new'\n\tprivate weighed: CompositionReport[] = []\n\tprivate wantedNow: string[] = []\n\t/** What the supply want was last set with (`supplyAhead`): kept in a save, for a loaded game to have it again */\n\tprivate supply: { type: string; need: number; most: number } | undefined\n\n\tconstructor(\n\t\t/** The brain it plans for */\n\t\treadonly ai: Brain,\n\t\toptions: ProductionPlanOptions = {}\n\t) {\n\t\tthis.configure(options)\n\t}\n\n\t/** Takes options in, over what it had */\n\tconfigure(options: ProductionPlanOptions): void {\n\t\tthis.options = { ...this.options, ...options }\n\t}\n\n\t/** The plan's options as they stand */\n\tget settings(): Readonly<ProductionPlanOptions> {\n\t\treturn this.options\n\t}\n\n\t/** Whether the player may make a type or research an upgrade (`key`: `upgrade:<id>`), as its race and the game's `available` hook say */\n\tprivate may(def: { readonly race?: string }, key: string): boolean {\n\t\tconst { me } = this.ai.view\n\t\treturn availableToPlayer(def, { race: me.race, availability: me.availability }, key)\n\t}\n\n\t/** How many of a unit type the player's buildings are training */\n\tqueued(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/**\n\t * Trains a unit at a building, when it fits the supply, the queue has room and the purse allows: whether it was\n\t * sent. The supply used is bumped on the view's `me` at once, so that the next call this think does not queue past\n\t * the cap before the command lands. What the economy, the hero module and this plan all train through\n\t */\n\ttrain(building: EntityState, type: UnitTypeDef, priority = this.options.priority ?? 0): boolean {\n\t\tconst { ai } = this\n\t\tconst { me } = ai.view\n\t\tconst supply = supplyOf(type)\n\t\tif (supply > 0 && me.supplyUsed + supply > me.supplyCap) return false\n\t\tif (queueOf(building).length >= (this.options.queue ?? QUEUE)) return false\n\t\tif (!ai.purse.affords(type.cost, 0, priority)) return false\n\t\tai.purse.spend(type.cost, priority)\n\t\tme.supplyUsed += supply\n\t\tai.send({ type: 'train', building: building.id, unitType: type.id })\n\t\treturn true\n\t}\n\n\t/**\n\t * Researches an upgrade at a building, when it is not researching already, the building's queue has room and the\n\t * purse allows with `spare` left over: whether it was sent. `me.researching` is bumped at once\n\t */\n\tresearch(building: EntityState, upgrade: UpgradeDef, spare = 0, priority = this.options.priority ?? 0): boolean {\n\t\tconst { ai } = this\n\t\tconst { me } = ai.view\n\t\tif (me.researching.includes(upgrade.id)) return false\n\t\tif (queueOf(building).length >= (this.options.queue ?? QUEUE)) return false\n\t\tif (!ai.purse.affords(upgrade.cost, spare, priority)) return false\n\t\tai.purse.spend(upgrade.cost, priority)\n\t\tme.researching.push(upgrade.id)\n\t\tai.send({ type: 'research', building: building.id, upgrade: upgrade.id })\n\t\treturn true\n\t}\n\n\t/** Whether an upgrade can be researched now: a level left, not under way, the player's to make, what the next level requires standing */\n\tresearchable(upgrade: UpgradeDef): boolean {\n\t\tconst { me } = this.ai.view\n\t\tconst level = me.upgrades[upgrade.id] ?? 0\n\t\treturn (\n\t\t\tlevel < (upgrade.maxLevel ?? 1) &&\n\t\t\t!me.researching.includes(upgrade.id) &&\n\t\t\tthis.may(upgrade, `upgrade:${upgrade.id}`) &&\n\t\t\tthis.ai.view.has(upgrade.requires?.[level])\n\t\t)\n\t}\n\n\t/** The soldier types the player can train now: at a finished building of its own, their requirements standing */\n\ttrainable(): UnitTypeDef[] {\n\t\tconst { view, registry } = this.ai\n\t\tconst types: UnitTypeDef[] = []\n\t\tfor (const building of view.mine.buildings().finished()) {\n\t\t\tfor (const id of view.def(building).trains ?? []) {\n\t\t\t\tif (!registry.units.has(id)) continue\n\t\t\t\tconst def = registry.unit(id)\n\t\t\t\tif (types.includes(def) || !view.hasRole(id, 'soldier') || !this.may(def, id) || !view.has(def.requires)) continue\n\t\t\t\ttypes.push(def)\n\t\t\t}\n\t\t}\n\t\treturn types\n\t}\n\n\t/** The army's composition wanted, as given: the function asked, the data as it is */\n\tprivate composition(): Composition | undefined {\n\t\tconst { composition } = this.options\n\t\treturn typeof composition === 'function' ? composition(this.ai) : composition\n\t}\n\n\t/**\n\t * The composition as weighed this think, for the types it can train: each type's share wanted (the composition's\n\t * for its id, or for a tag or role where no type has that id, split among the types that have it; even when there is no composition), its\n\t * share of the soldiers now, how well it answers the enemy's army seen, and its urge: `target × (1 + counters ×\n\t * (counter − 1)) − share`. The most urgent is trained first\n\t */\n\tweigh(): CompositionReport[] {\n\t\tconst { view } = this.ai\n\t\tconst types = this.trainable()\n\t\tif (!types.length) return []\n\t\tconst composition = this.composition()\n\t\tconst weights = new Map<UnitTypeDef, number>()\n\t\tif (composition) {\n\t\t\tfor (const [key, share] of Object.entries(composition)) {\n\t\t\t\t// a key is a type's id first (the fixture's `soldier` is a type and a role): a tag or a role only where no type has the id\n\t\t\t\tconst tagged = this.ai.registry.units.has(key)\n\t\t\t\t\t? types.filter((def) => def.id === key)\n\t\t\t\t\t: types.filter((def) => view.roles.hasTag(def.id, key) || view.roles.has(def.id, key))\n\t\t\t\tfor (const def of tagged) weights.set(def, (weights.get(def) ?? 0) + share / tagged.length)\n\t\t\t}\n\t\t}\n\t\tlet total = 0\n\t\tfor (const def of types) total += composition ? (weights.get(def) ?? 0) : 1\n\t\tconst soldiers = view.mine.fighters().where((_, def) => !def.hero)\n\t\tconst counters = this.counters(types)\n\t\tconst pull = this.options.counters ?? 1\n\t\treturn types.map((def) => {\n\t\t\tconst target = total > 0 ? (composition ? (weights.get(def) ?? 0) : 1) / total : 0\n\t\t\tconst have = soldiers.ofType(def.id).length\n\t\t\tconst share = soldiers.length ? have / soldiers.length : 0\n\t\t\tconst counter = counters.get(def.id) ?? 1\n\t\t\treturn { type: def.id, target, have, share, counter, urge: target * (1 + pull * (counter - 1)) - share }\n\t\t})\n\t}\n\n\t/** How well each type answers the most of each enemy unit type seen at once (`Strength.counterFor`): 1 for each where nothing was seen */\n\tprivate counters(types: UnitTypeDef[]): Map<string, number> {\n\t\tconst { ai } = this\n\t\tconst result = new Map<string, number>()\n\t\tif (ai.def.knowledge === false) return result\n\t\tconst seen: Record<string, number> = {}\n\t\tfor (const [type, { most }] of Object.entries(ai.knowledge.enemy.typesSeen()))\n\t\t\tif (ai.registry.units.has(type) && ai.registry.unit(type).kind === 'unit') seen[type] = most\n\t\tif (!Object.keys(seen).length) return result\n\t\tfor (const { def, score } of ai.view.strength.counterFor(seen, types)) result.set(def.id, score)\n\t\treturn result\n\t}\n\n\t/** The unit wants the build plan holds that are to be trained now (their buildings up), most important first; the order's alone while it is followed */\n\twanted(): Want[] {\n\t\tconst { ai } = this\n\t\tconst build = ai.plans.build\n\t\tconst following = ai.plans.following\n\t\treturn build\n\t\t\t.list()\n\t\t\t.filter((want) => {\n\t\t\t\tif (following && want.id !== 'order') return false\n\t\t\t\tif (!ai.registry.units.has(want.type) || ai.registry.unit(want.type).kind !== 'unit') return false\n\t\t\t\tconst count = typeof want.count === 'function' ? want.count(ai) : (want.count ?? 1)\n\t\t\t\treturn (\n\t\t\t\t\tbuild.have(want.type) + this.queued(want.type) < count &&\n\t\t\t\t\tbuild.next(want.type)?.how === 'train' &&\n\t\t\t\t\tbuild.next(want.type)?.type === want.type\n\t\t\t\t)\n\t\t\t})\n\t\t\t.sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0))\n\t}\n\n\t/** The finished buildings of the player's that train a type, with room in their queue */\n\tprivate trainersOf(type: string): EntityState[] {\n\t\tconst { view } = this.ai\n\t\treturn view.mine\n\t\t\t.buildings()\n\t\t\t.finished()\n\t\t\t.filter((building) => !!view.def(building).trains?.includes(type) && queueOf(building).length < (this.options.queue ?? QUEUE))\n\t}\n\n\t/**\n\t * The think, once a think: the unit wants first (each at a building that trains it, as many as wanted), then the\n\t * composition's most urgent type at every building with room, as the supply, the queue and the purse allow; one\n\t * more of what provides supply wanted when the next does not fit; then the research\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 = []\n\t\tthis.researched = []\n\t\tthis.wantedNow = []\n\t\tthis.weighed = []\n\t\tthis.status = 'nothing to train'\n\t\tif (this.options.train !== false) {\n\t\t\tconst { me } = ai.view\n\t\t\tconst priority = this.options.priority ?? 0\n\t\t\tlet short: UnitTypeDef | undefined\n\t\t\tlet unpaid: UnitTypeDef | undefined\n\t\t\tlet upkept: UnitTypeDef | undefined\n\t\t\t// the upkeep it holds at, while the money would not lie idle past it\n\t\t\tconst upkeep = ai.purse.affords(undefined, this.options.upkeepSpare ?? UPKEEP_SPARE, priority) ? undefined : this.upkeepLimit()\n\t\t\tconst queue = (type: UnitTypeDef, upTo: number, composition = false) => {\n\t\t\t\tlet sent = 0\n\t\t\t\tfor (const trainer of this.trainersOf(type.id)) {\n\t\t\t\t\tif (sent >= upTo) break\n\t\t\t\t\tconst supply = supplyOf(type)\n\t\t\t\t\tif (supply > 0 && me.supplyUsed + supply > me.supplyCap) {\n\t\t\t\t\t\tshort ??= type\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t\t// the composition's soldiers go no further into upkeep than told\n\t\t\t\t\tif (composition && supply > 0 && upkeep !== undefined && me.supplyUsed + supply > upkeep) {\n\t\t\t\t\t\tupkept ??= type\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t\tif (!ai.purse.affords(type.cost, 0, priority)) {\n\t\t\t\t\t\tunpaid ??= type\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t\tif (!this.train(trainer, type, priority)) break\n\t\t\t\t\tthis.trained.push(type.id)\n\t\t\t\t\tsent++\n\t\t\t\t}\n\t\t\t\treturn sent\n\t\t\t}\n\t\t\t// what is wanted outright, most important first\n\t\t\tfor (const want of this.wanted()) {\n\t\t\t\tthis.wantedNow.push(want.id!)\n\t\t\t\tconst count = typeof want.count === 'function' ? want.count(ai) : (want.count ?? 1)\n\t\t\t\tconst type = ai.registry.unit(want.type)\n\t\t\t\tconst sent = queue(type, count - ai.plans.build.have(want.type) - this.queued(want.type))\n\t\t\t\tif (sent)\n\t\t\t\t\tai.decide(`trains ${sent === 1 ? an(type.id) : `${sent} ${type.id}`}: wanted${want.by ? ` by ${want.by}` : ''}`, { kind: 'production' })\n\t\t\t}\n\t\t\t// then the army as the composition wants it, the most urgent type at each building with room, while the\n\t\t\t// order is not being followed (what the game says to make first holds back what the computer would make)\n\t\t\tif (!ai.plans.following) {\n\t\t\t\tthis.weighed = this.weigh()\n\t\t\t\t// a composition that wants nothing (`{}`: the waves', D2, whose groups are wanted outright) trains nothing\n\t\t\t\tconst empty = this.weighed.every((entry) => entry.target <= 0)\n\t\t\t\tconst ranked = empty ? [] : [...this.weighed].sort((a, b) => b.urge - a.urge)\n\t\t\t\tconst pull = this.options.counters ?? 1\n\t\t\t\tfor (const entry of ranked) {\n\t\t\t\t\t// what cannot hit what they field is not trained while they field it (where the counters count); what\n\t\t\t\t\t// is over its share waits while something is under its own\n\t\t\t\t\tif (pull > 0 && entry.counter <= 0) continue\n\t\t\t\t\tif (entry.urge <= 0 && ranked[0].urge > 0) continue\n\t\t\t\t\tconst type = ai.registry.unit(entry.type)\n\t\t\t\t\tconst before = unpaid\n\t\t\t\t\tconst sent = queue(type, Infinity, true)\n\t\t\t\t\tif (sent) {\n\t\t\t\t\t\tai.decide(\n\t\t\t\t\t\t\t`trains ${sent === 1 ? an(type.id) : `${sent} ${type.id}`}: ${entry.counter !== 1 ? `answers their army ${entry.counter.toFixed(2)}, ` : ''}${Math.round(entry.share * 100)}% of the army for ${Math.round(entry.target * 100)}% wanted`,\n\t\t\t\t\t\t\t{ kind: 'production' }\n\t\t\t\t\t\t)\n\t\t\t\t\t\t// what was sent changes the shares: the next type is weighed anew next think\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t\t// nothing fits the supply: nothing else will; one it cannot pay for: the next it can may go, so that\n\t\t\t\t\t// an army is raised while the dearer type waits for its resource\n\t\t\t\t\tif (short || upkept) break\n\t\t\t\t\tif (unpaid && unpaid !== before) continue\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (short) this.status = `${an(short.id)} does not fit the supply`\n\t\t\telse if (upkept) this.status = `holds at ${upkeep} supply: ${an(upkept.id)} would take it into upkeep`\n\t\t\telse if (unpaid) this.status = `waits for the money for ${an(unpaid.id)}`\n\t\t\telse if (this.trained.length) this.status = `trained ${this.trained.join(', ')}`\n\t\t\t// supply ahead of what comes next: what did not fit, else the most urgent\n\t\t\tconst next = short ?? (this.weighed.length ? ai.registry.unit([...this.weighed].sort((a, b) => b.urge - a.urge)[0].type) : undefined)\n\t\t\tif (this.options.supplyAhead !== false) this.supplyAhead(next, upkeep)\n\t\t}\n\t\tthis.runResearch()\n\t}\n\n\t/**\n\t * The supply used the composition trains no further than for upkeep (`upkeepTier`): where the tier after the one it\n\t * may be in begins. None in a game without upkeep, past its last tier, or with `upkeepTier: false`\n\t */\n\tupkeepLimit(): number | undefined {\n\t\tconst tier = this.options.upkeepTier ?? UPKEEP_TIER\n\t\tif (tier === false) return undefined\n\t\treturn this.ai.registry.upkeep[tier]?.above\n\t}\n\n\t/**\n\t * Supply kept ahead: when the type to train next does not fit (or the free supply is under the margin), one more of\n\t * the cheapest building that provides supply is wanted of the build plan, unless the cap is the game's most or one\n\t * is on its way already\n\t */\n\tprivate supplyAhead(next: UnitTypeDef | undefined, upkeep?: number): void {\n\t\tconst { ai } = this\n\t\tconst { view } = ai\n\t\tconst { me } = view\n\t\tconst margin = this.options.supplyMargin ?? SUPPLY_MARGIN\n\t\tconst need = (next ? supplyOf(next) : 0) + margin\n\t\t// no further than the upkeep it holds at: the margin up to it, not past\n\t\tconst most = Math.min(ai.registry.settings.supply.max, upkeep ?? Infinity)\n\t\tif (me.supplyCap >= most || me.supplyCap - me.supplyUsed >= need) return\n\t\tconst types = [...view.typesOf('supply')].sort((a, b) => (a.cost?.[ai.purse.money] ?? 0) - (b.cost?.[ai.purse.money] ?? 0))\n\t\tconst type = types[0]\n\t\tif (!type) return\n\t\tthis.wantSupply(type.id, need, most)\n\t}\n\n\t/**\n\t * One at a time: what stands finished, and one more. A standing want, with what is needed in its condition: set\n\t * again whenever the need changes\n\t */\n\tprivate wantSupply(type: string, need: number, most: number): void {\n\t\tconst { ai } = this\n\t\tthis.supply = { type, need, most }\n\t\tai.plans.build.want({\n\t\t\tid: SUPPLY_WANT,\n\t\t\ttype,\n\t\t\tcount: () => ai.view.mine.ofType(type).finished().length + 1,\n\t\t\tpriority: 90,\n\t\t\tby: 'supply',\n\t\t\tkeep: true,\n\t\t\twhen: () => {\n\t\t\t\tconst now = ai.view.me\n\t\t\t\treturn now.supplyCap < most && now.supplyCap - now.supplyUsed < need\n\t\t\t}\n\t\t})\n\t}\n\n\t/** What it remembers, for a save: what the supply want was set with, while it stands */\n\tsave(): ProductionPlanMemory | undefined {\n\t\tconst { supply } = this\n\t\tif (!supply || !this.ai.plans.build.get(SUPPLY_WANT)) return undefined\n\t\t// no most but the game's (one without one): Infinity, which a save does not hold\n\t\treturn { supply: { type: supply.type, need: supply.need, ...(Number.isFinite(supply.most) && { most: supply.most }) } }\n\t}\n\n\t/**\n\t * Takes back what `save` gave, after the build plan's: the supply want is had again at once, before the first think,\n\t * as the game saved from has it (the module sets it again only when supply runs short, after the build plan thinks)\n\t */\n\trestore(memory: ProductionPlanMemory | undefined): void {\n\t\tconst supply = memory?.supply\n\t\tthis.supply = undefined\n\t\tif (!supply || typeof supply.type !== 'string' || !this.ai.registry.units.has(supply.type)) return\n\t\tthis.wantSupply(supply.type, supply.need, supply.most ?? Infinity)\n\t}\n\n\t/**\n\t * The upgrade to research next: the first of the list it can (`research` as a list), what the function gives, or,\n\t * left to itself, the one the most of its units benefit from (`UpgradeEffect.units`), ties as the game lists them\n\t */\n\tnextResearch(): UpgradeDef | undefined {\n\t\tconst { ai } = this\n\t\tconst { view, registry } = ai\n\t\tconst { research } = this.options\n\t\tif (typeof research === 'function') {\n\t\t\tconst id = research(ai)\n\t\t\treturn id !== undefined && registry.upgrades.has(id) && this.researchable(registry.upgrade(id)) ? registry.upgrade(id) : undefined\n\t\t}\n\t\tconst offered: UpgradeDef[] = []\n\t\tfor (const building of view.mine.buildings().finished()) {\n\t\t\tfor (const id of view.def(building).researches ?? []) {\n\t\t\t\tif (!registry.upgrades.has(id)) continue\n\t\t\t\tconst def = registry.upgrade(id)\n\t\t\t\tif (!offered.includes(def) && this.researchable(def)) offered.push(def)\n\t\t\t}\n\t\t}\n\t\tif (research) {\n\t\t\tfor (const id of research) {\n\t\t\t\tconst found = offered.find((def) => def.id === id)\n\t\t\t\tif (found) return found\n\t\t\t}\n\t\t\treturn undefined\n\t\t}\n\t\tlet best: UpgradeDef | undefined\n\t\tlet most = -1\n\t\tfor (const def of offered) {\n\t\t\tconst benefits = view.mine.units().filter((unit) => def.effects.some((effect) => effectApplies(effect.units, view.def(unit)))).length\n\t\t\tif (benefits > most) {\n\t\t\t\tmost = benefits\n\t\t\t\tbest = def\n\t\t\t}\n\t\t}\n\t\treturn best\n\t}\n\n\t/** Research, with money to spare: the next upgrade at a finished building of the player's that researches it */\n\tprivate runResearch(): void {\n\t\tconst { ai } = this\n\t\tconst { view } = ai\n\t\tconst next = this.nextResearch()\n\t\tif (!next) return\n\t\tconst at = view.mine\n\t\t\t.buildings()\n\t\t\t.finished()\n\t\t\t.find((building) => !!view.def(building).researches?.includes(next.id) && queueOf(building).length < (this.options.queue ?? QUEUE))\n\t\tif (!at) return\n\t\tif (this.research(at, next, this.options.researchSpare ?? RESEARCH_SPARE)) {\n\t\t\tthis.researched.push(next.id)\n\t\t\tai.decide(`researches ${next.id}: money to spare`, { kind: 'research' })\n\t\t}\n\t}\n\n\t/** The composition as weighed, what was trained and researched this think, the wants trained towards, and the status */\n\treport(): ProductionPlanReport {\n\t\treturn {\n\t\t\tcomposition: this.weighed.map((entry) => ({ ...entry })),\n\t\t\ttrained: [...this.trained],\n\t\t\tresearched: [...this.researched],\n\t\t\twants: [...this.wantedNow],\n\t\t\tstatus: this.status\n\t\t}\n\t}\n}\n\n/** Whether an upgrade's effect applies to a unit type: everything the player owns when it names none */\nfunction effectApplies(units: string[] | ((def: UnitTypeDef) => boolean) | undefined, def: UnitTypeDef): boolean {\n\tif (!units) return true\n\tif (typeof units === 'function') return units(def)\n\treturn units.includes(def.id)\n}\n\n/**\n * The production module: runs the brain's production plan (`ai.plans.production.think()`) in its place among a\n * brain's modules, after the build plan (which puts up what a want needs) where a brain has both. With options for\n * the plan\n *\n * @beta\n */\nexport const production = (options: ProductionPlanOptions = {}): AiModuleDef =>\n\tdefineModule({ id: 'production', make: (ai: Brain): AiModule => {\n\t\tai.plans.production.configure(options)\n\t\treturn {\n\t\t\tid: 'production',\n\t\t\tphase: 'plan',\n\t\t\tafter: ['build'],\n\t\t\tthink: () => ai.plans.production.think()\n\t\t}\n\t} })\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import type { Cost, ResourceKind } from '#engine/defs';
1
+ import type { Cost, ResourceId } from '#engine/defs';
2
2
  import type { Registry } from '#engine/registry';
3
3
  import type { AiView } from '#engine/ai/view';
4
4
  /**
@@ -15,7 +15,7 @@ export declare class Purse {
15
15
  /** What was paid this think (`spend`), by resource: with `promised`, never more than the picture's resources (`ai/checks.ts`) */
16
16
  spent: Cost;
17
17
  /** The resource most things cost (`Registry.currency`): what `affords` keeps `spare` of */
18
- readonly money: ResourceKind;
18
+ readonly money: ResourceId;
19
19
  private holds;
20
20
  constructor(registry: Registry);
21
21
  /**
@@ -26,7 +26,7 @@ export declare class Purse {
26
26
  /** What someone this important may spend: what is free, and what is held by anyone less important */
27
27
  available(priority?: number): Cost;
28
28
  /** The resource a cost is short of, out of what someone this important may spend: none when it can be paid */
29
- shortOf(cost: Cost | undefined, priority?: number): ResourceKind | undefined;
29
+ shortOf(cost: Cost | undefined, priority?: number): ResourceId | undefined;
30
30
  /**
31
31
  * Whether a cost can be paid by someone this important, with `spare` of the money left over after it (a luxury
32
32
  * waits for gold to spare): out of what is free, and what is held by anyone less important
@@ -64,8 +64,11 @@ export declare class Purse {
64
64
  * @beta
65
65
  */
66
66
  export interface PurseReport {
67
+ /** What the player has that nothing holds or has promised */
67
68
  free: Cost;
69
+ /** What builders on their way will pay */
68
70
  promised: Cost;
71
+ /** What is held, by the id of the holder, with its cost and how important the holder is */
69
72
  held: Record<string, {
70
73
  cost: Cost;
71
74
  priority: number;