@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,139 @@
1
+ //#region src/ai/plans/purse.ts
2
+ /**
3
+ * What a computer player has to spend this think (`ai.purse`): its resources less what is promised and held, spent
4
+ * through `spend`. Rebuilt from the picture each think
5
+ *
6
+ * @beta
7
+ */
8
+ var Purse = class {
9
+ /** What is free to spend now, by resource: less with every `spend` and `reserve` of the think. `view.me.purse` is this */
10
+ free = {};
11
+ /** What builders on their way to a site will pay as they get there, by resource */
12
+ promised = {};
13
+ /** What was paid this think (`spend`), by resource: with `promised`, never more than the picture's resources (`ai/checks.ts`) */
14
+ spent = {};
15
+ /** The resource most things cost (`Registry.currency`): what `affords` keeps `spare` of */
16
+ money;
17
+ holds = {};
18
+ constructor(registry) {
19
+ this.money = registry.currency ?? registry.resources[0]?.id ?? "";
20
+ }
21
+ /**
22
+ * Starts the think's ledger from the picture: the player's resources, less what its builders on their way will pay
23
+ * (`promised`). Every hold of the think before is dropped: whoever still wants one makes it again
24
+ */
25
+ begin(view) {
26
+ this.free = { ...view.me.resources };
27
+ this.promised = {};
28
+ this.spent = {};
29
+ this.holds = {};
30
+ const { registry } = view;
31
+ for (const entity of view.mine) {
32
+ const own = entity.own;
33
+ if (own?.order !== "build" || !own.build || !registry.units.has(own.build)) continue;
34
+ const cost = registry.unit(own.build).cost;
35
+ for (const kind in cost) {
36
+ this.promised[kind] = (this.promised[kind] ?? 0) + cost[kind];
37
+ this.free[kind] = (this.free[kind] ?? 0) - cost[kind];
38
+ }
39
+ }
40
+ }
41
+ /** What someone this important may spend: what is free, and what is held by anyone less important */
42
+ available(priority = 0) {
43
+ const sum = { ...this.free };
44
+ for (const id in this.holds) {
45
+ const hold = this.holds[id];
46
+ if (hold.priority >= priority) continue;
47
+ for (const kind in hold.cost) sum[kind] = (sum[kind] ?? 0) + hold.cost[kind];
48
+ }
49
+ return sum;
50
+ }
51
+ /** The resource a cost is short of, out of what someone this important may spend: none when it can be paid */
52
+ shortOf(cost, priority = 0) {
53
+ const available = this.available(priority);
54
+ for (const kind in cost) if ((available[kind] ?? 0) < cost[kind]) return kind;
55
+ }
56
+ /**
57
+ * Whether a cost can be paid by someone this important, with `spare` of the money left over after it (a luxury
58
+ * waits for gold to spare): out of what is free, and what is held by anyone less important
59
+ */
60
+ affords(cost, spare = 0, priority = 0) {
61
+ return this.shortOf(cost, priority) === void 0 && (this.available(priority)[this.money] ?? 0) >= (cost?.[this.money] ?? 0) + spare;
62
+ }
63
+ /**
64
+ * Pays a cost, for a command sent this think: out of what is free first, then out of what is held by anyone less
65
+ * important (the least important first), whose holds are less by that much. False, and nothing paid, when it cannot be
66
+ */
67
+ spend(cost, priority = 0) {
68
+ if (this.shortOf(cost, priority) !== void 0) return false;
69
+ const lesser = Object.keys(this.holds).filter((id) => this.holds[id].priority < priority).sort((a, b) => this.holds[a].priority - this.holds[b].priority);
70
+ for (const kind in cost) {
71
+ let owed = cost[kind];
72
+ this.spent[kind] = (this.spent[kind] ?? 0) + owed;
73
+ const free = this.free[kind] ?? 0;
74
+ const fromFree = Math.min(owed, Math.max(0, free));
75
+ this.free[kind] = free - fromFree;
76
+ owed -= fromFree;
77
+ for (const id of lesser) {
78
+ if (owed <= 0) break;
79
+ const held = this.holds[id].cost[kind] ?? 0;
80
+ const taken = Math.min(owed, held);
81
+ this.holds[id].cost[kind] = held - taken;
82
+ owed -= taken;
83
+ }
84
+ if (owed > 0) this.free[kind] = (this.free[kind] ?? 0) - owed;
85
+ }
86
+ return true;
87
+ }
88
+ /**
89
+ * Holds a cost aside under a name (a goal's id, a want's) for the rest of the think, with how important the holder
90
+ * is (0 when left out): what is free is less by it, so that nothing less important spends what is saved up. Made
91
+ * again each think by whoever still saves; a second hold under the same name replaces the first
92
+ */
93
+ reserve(id, cost, priority = 0) {
94
+ this.release(id);
95
+ this.holds[id] = {
96
+ cost: { ...cost },
97
+ priority
98
+ };
99
+ for (const kind in cost) this.free[kind] = (this.free[kind] ?? 0) - cost[kind];
100
+ }
101
+ /** Lets a hold go: what it held is free again this think */
102
+ release(id) {
103
+ const held = this.holds[id];
104
+ if (!held) return;
105
+ delete this.holds[id];
106
+ for (const kind in held.cost) this.free[kind] = (this.free[kind] ?? 0) + held.cost[kind];
107
+ }
108
+ /** What is held under a name */
109
+ reservation(id) {
110
+ return this.holds[id]?.cost;
111
+ }
112
+ /** What is held altogether, by resource */
113
+ reserved() {
114
+ const sum = {};
115
+ for (const id in this.holds) for (const kind in this.holds[id].cost) sum[kind] = (sum[kind] ?? 0) + this.holds[id].cost[kind];
116
+ return sum;
117
+ }
118
+ /** Every hold, by name: what and how important */
119
+ holdings() {
120
+ return this.holds;
121
+ }
122
+ /** The ledger for the report: what is free, what is promised, what is held and by whom */
123
+ inspect() {
124
+ const held = {};
125
+ for (const id in this.holds) held[id] = {
126
+ cost: { ...this.holds[id].cost },
127
+ priority: this.holds[id].priority
128
+ };
129
+ return {
130
+ free: { ...this.free },
131
+ promised: { ...this.promised },
132
+ held
133
+ };
134
+ }
135
+ };
136
+ //#endregion
137
+ export { Purse };
138
+
139
+ //# sourceMappingURL=purse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"purse.js","names":[],"sources":["../../../src/ai/plans/purse.ts"],"sourcesContent":["import type { Cost, ResourceId } from '#engine/defs'\nimport type { Registry } from '#engine/registry'\nimport type { AiView } from '#engine/ai/view'\n\n/*\n * The purse (AI plan, B3): the one ledger a computer player spends through. Commands land next tick, so a think that\n * sent a worker to build a barracks still sees the gold in its next picture; and a building is paid for as its builder\n * arrives, not as it is sent. Without a ledger the same gold is spent twice. The purse is rebuilt from the picture at\n * the start of every think (`begin`): the player's resources, less what builders on their way will pay (`promised`),\n * less what is held (`reserve`: a goal's money claim, a want of the build plan saving up for a hall). What is left is\n * `free`, and everything that spends (`spend`) takes it off `free` for the rest of the think. Nothing is carried from\n * one think to the next: a hold belongs to whoever made it and is made again each think while they still want it, so\n * nothing can be promised twice or held for ever.\n *\n * A hold has a priority, as a want does: saving up for a hero does not stop the hall going up, and does stop the\n * footmen. Whoever asks the purse says how important they are (`affords(cost, spare, priority)`), and may spend what\n * is held by anyone less important; a hold spent into is less by that much for the rest of the think.\n */\n\n/**\n * What a computer player has to spend this think (`ai.purse`): its resources less what is promised and held, spent\n * through `spend`. Rebuilt from the picture each think\n *\n * @beta\n */\nexport class Purse {\n\t/** What is free to spend now, by resource: less with every `spend` and `reserve` of the think. `view.me.purse` is this */\n\tfree: Cost = {}\n\t/** What builders on their way to a site will pay as they get there, by resource */\n\tpromised: Cost = {}\n\t/** What was paid this think (`spend`), by resource: with `promised`, never more than the picture's resources (`ai/checks.ts`) */\n\tspent: Cost = {}\n\t/** The resource most things cost (`Registry.currency`): what `affords` keeps `spare` of */\n\treadonly money: ResourceId\n\tprivate holds: Record<string, { cost: Cost; priority: number }> = {}\n\n\tconstructor(registry: Registry) {\n\t\tthis.money = registry.currency ?? registry.resources[0]?.id ?? ''\n\t}\n\n\t/**\n\t * Starts the think's ledger from the picture: the player's resources, less what its builders on their way will pay\n\t * (`promised`). Every hold of the think before is dropped: whoever still wants one makes it again\n\t */\n\tbegin(view: AiView): void {\n\t\tthis.free = { ...view.me.resources }\n\t\tthis.promised = {}\n\t\tthis.spent = {}\n\t\tthis.holds = {}\n\t\tconst { registry } = view\n\t\tfor (const entity of view.mine) {\n\t\t\tconst own = entity.own\n\t\t\tif (own?.order !== 'build' || !own.build || !registry.units.has(own.build)) continue\n\t\t\tconst cost = registry.unit(own.build).cost\n\t\t\tfor (const kind in cost) {\n\t\t\t\tthis.promised[kind] = (this.promised[kind] ?? 0) + cost[kind]\n\t\t\t\tthis.free[kind] = (this.free[kind] ?? 0) - cost[kind]\n\t\t\t}\n\t\t}\n\t}\n\n\t/** What someone this important may spend: what is free, and what is held by anyone less important */\n\tavailable(priority = 0): Cost {\n\t\tconst sum: Cost = { ...this.free }\n\t\tfor (const id in this.holds) {\n\t\t\tconst hold = this.holds[id]\n\t\t\tif (hold.priority >= priority) continue\n\t\t\tfor (const kind in hold.cost) sum[kind] = (sum[kind] ?? 0) + hold.cost[kind]\n\t\t}\n\t\treturn sum\n\t}\n\n\t/** The resource a cost is short of, out of what someone this important may spend: none when it can be paid */\n\tshortOf(cost: Cost | undefined, priority = 0): ResourceId | undefined {\n\t\tconst available = this.available(priority)\n\t\tfor (const kind in cost) if ((available[kind] ?? 0) < cost[kind]) return kind\n\t\treturn undefined\n\t}\n\n\t/**\n\t * Whether a cost can be paid by someone this important, with `spare` of the money left over after it (a luxury\n\t * waits for gold to spare): out of what is free, and what is held by anyone less important\n\t */\n\taffords(cost: Cost | undefined, spare = 0, priority = 0): boolean {\n\t\treturn this.shortOf(cost, priority) === undefined && (this.available(priority)[this.money] ?? 0) >= (cost?.[this.money] ?? 0) + spare\n\t}\n\n\t/**\n\t * Pays a cost, for a command sent this think: out of what is free first, then out of what is held by anyone less\n\t * important (the least important first), whose holds are less by that much. False, and nothing paid, when it cannot be\n\t */\n\tspend(cost: Cost | undefined, priority = 0): boolean {\n\t\tif (this.shortOf(cost, priority) !== undefined) return false\n\t\tconst lesser = Object.keys(this.holds)\n\t\t\t.filter((id) => this.holds[id].priority < priority)\n\t\t\t.sort((a, b) => this.holds[a].priority - this.holds[b].priority)\n\t\tfor (const kind in cost) {\n\t\t\tlet owed = cost[kind]\n\t\t\tthis.spent[kind] = (this.spent[kind] ?? 0) + owed\n\t\t\tconst free = this.free[kind] ?? 0\n\t\t\tconst fromFree = Math.min(owed, Math.max(0, free))\n\t\t\tthis.free[kind] = free - fromFree\n\t\t\towed -= fromFree\n\t\t\tfor (const id of lesser) {\n\t\t\t\tif (owed <= 0) break\n\t\t\t\tconst held = this.holds[id].cost[kind] ?? 0\n\t\t\t\tconst taken = Math.min(owed, held)\n\t\t\t\tthis.holds[id].cost[kind] = held - taken\n\t\t\t\towed -= taken\n\t\t\t}\n\t\t\t// what the lesser holds did not cover goes on the free side, under nothing: `shortOf` said it is there\n\t\t\tif (owed > 0) this.free[kind] = (this.free[kind] ?? 0) - owed\n\t\t}\n\t\treturn true\n\t}\n\n\t/**\n\t * Holds a cost aside under a name (a goal's id, a want's) for the rest of the think, with how important the holder\n\t * is (0 when left out): what is free is less by it, so that nothing less important spends what is saved up. Made\n\t * again each think by whoever still saves; a second hold under the same name replaces the first\n\t */\n\treserve(id: string, cost: Cost, priority = 0): void {\n\t\tthis.release(id)\n\t\tthis.holds[id] = { cost: { ...cost }, priority }\n\t\tfor (const kind in cost) this.free[kind] = (this.free[kind] ?? 0) - cost[kind]\n\t}\n\n\t/** Lets a hold go: what it held is free again this think */\n\trelease(id: string): void {\n\t\tconst held = this.holds[id]\n\t\tif (!held) return\n\t\tdelete this.holds[id]\n\t\tfor (const kind in held.cost) this.free[kind] = (this.free[kind] ?? 0) + held.cost[kind]\n\t}\n\n\t/** What is held under a name */\n\treservation(id: string): Readonly<Cost> | undefined {\n\t\treturn this.holds[id]?.cost\n\t}\n\n\t/** What is held altogether, by resource */\n\treserved(): Cost {\n\t\tconst sum: Cost = {}\n\t\tfor (const id in this.holds) for (const kind in this.holds[id].cost) sum[kind] = (sum[kind] ?? 0) + this.holds[id].cost[kind]\n\t\treturn sum\n\t}\n\n\t/** Every hold, by name: what and how important */\n\tholdings(): Readonly<Record<string, { cost: Readonly<Cost>; priority: number }>> {\n\t\treturn this.holds\n\t}\n\n\t/** The ledger for the report: what is free, what is promised, what is held and by whom */\n\tinspect(): PurseReport {\n\t\tconst held: PurseReport['held'] = {}\n\t\tfor (const id in this.holds) held[id] = { cost: { ...this.holds[id].cost }, priority: this.holds[id].priority }\n\t\treturn { free: { ...this.free }, promised: { ...this.promised }, held }\n\t}\n}\n\n/**\n * The purse as the report shows it: what is free, what builders on their way will pay, what is held and by whom, with\n * how important each holder is\n *\n * @beta\n */\nexport interface PurseReport {\n\t/** What the player has that nothing holds or has promised */\n\tfree: Cost\n\t/** What builders on their way will pay */\n\tpromised: Cost\n\t/** What is held, by the id of the holder, with its cost and how important the holder is */\n\theld: Record<string, { cost: Cost; priority: number }>\n}\n"],"mappings":"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"}
@@ -6,10 +6,13 @@ import type { AiView } from '#engine/ai/view';
6
6
  * @beta
7
7
  */
8
8
  export interface TechStep {
9
+ /** The unit type id the step is on */
9
10
  type: string;
11
+ /** How it is made: built by a worker, turned into from another type (`morph`) or trained at a building */
10
12
  how: 'build' | 'morph' | 'train';
11
13
  /** For a `morph`, the type that turns into it; for a `train`, the type that trains it; for a `build`, the type that builds it */
12
14
  from: string;
15
+ /** The type the step is on the way to */
13
16
  for: string;
14
17
  }
15
18
  /**
@@ -21,8 +24,11 @@ export interface TechStep {
21
24
  * @beta
22
25
  */
23
26
  export interface TechPath {
27
+ /** The steps in the order they can be taken, the type itself not among them */
24
28
  steps: TechStep[];
29
+ /** The definitions that go round in a circle, where they do */
25
30
  cycle?: string[];
31
+ /** The type nothing of the player's can make, where there is one */
26
32
  impossible?: string;
27
33
  }
28
34
  /**
@@ -0,0 +1,122 @@
1
+ import { upgradesOf } from "../../defs.js";
2
+ import { availableToPlayer } from "../../shared.js";
3
+ //#region src/ai/plans/tech.ts
4
+ /**
5
+ * How a type is made, by the player's definitions: built by a worker type, turned into from another type, or trained
6
+ * at a building type; nothing for a type nothing of the player's race makes (a creep's hut). Of the makers, one the
7
+ * player has first, then the first in the game's order
8
+ *
9
+ * @internal
10
+ */
11
+ function makerOf(view, type) {
12
+ const { registry, me } = view;
13
+ if (!registry.units.has(type)) return void 0;
14
+ const def = registry.unit(type);
15
+ const may = (maker) => availableToPlayer(maker, {
16
+ race: me.race,
17
+ availability: me.availability
18
+ }, maker.id);
19
+ const owned = (maker) => view.mine.ofType(maker.id).length > 0;
20
+ const pick = (makers) => makers.find(owned) ?? makers[0];
21
+ const all = registry.units.all().filter(may);
22
+ if (def.kind === "building") {
23
+ const builders = all.filter((maker) => maker.kind === "unit" && maker.builds?.includes(type));
24
+ if (builders.length) return {
25
+ how: "build",
26
+ from: pick(builders).id
27
+ };
28
+ const befores = all.filter((maker) => upgradesOf(maker).includes(type));
29
+ if (befores.length) return {
30
+ how: "morph",
31
+ from: pick(befores).id
32
+ };
33
+ return;
34
+ }
35
+ if (def.kind === "unit") {
36
+ const trainers = all.filter((maker) => maker.kind === "building" && maker.trains?.includes(type));
37
+ if (trainers.length) return {
38
+ how: "train",
39
+ from: pick(trainers).id
40
+ };
41
+ }
42
+ }
43
+ /**
44
+ * The steps from what the player has to being able to make a type: what it requires that it lacks, each of those in
45
+ * turn, and the type's maker where it has none (the hall that trains the worker, the worker that builds the barracks,
46
+ * the hall that turns into the keep). What stands finished (`view.me.tech`, with what it counts as) or is on its way
47
+ * (`onItsWay`: under construction, a builder sent, a morph queued) is had already. A requirement no type has as its
48
+ * id is met by a type that provides it
49
+ *
50
+ * @beta
51
+ */
52
+ function techPath(view, target, onItsWay = () => false) {
53
+ const { registry, me } = view;
54
+ const steps = [];
55
+ const planned = /* @__PURE__ */ new Set();
56
+ const visiting = /* @__PURE__ */ new Set();
57
+ const path = { steps };
58
+ const may = (def) => availableToPlayer(def, {
59
+ race: me.race,
60
+ availability: me.availability
61
+ }, def.id);
62
+ const have = (id) => me.tech.includes(id) || view.mine.ofType(id).length > 0 || onItsWay(id);
63
+ /** Whether a requirement is met, or will be by a step planned already (a planned keep provides the town hall) */
64
+ const covered = (id) => have(id) || planned.has(id) || [...planned].some((type) => registry.units.has(type) && registry.unit(type).provides?.includes(id));
65
+ /** What is to be made for a requirement: the type itself, or the first type the player may make that provides it */
66
+ const typeFor = (id) => {
67
+ if (registry.units.has(id) && makerOf(view, id)) return id;
68
+ return registry.units.all().find((def) => may(def) && def.provides?.includes(id) && makerOf(view, def.id))?.id;
69
+ };
70
+ const need = (id, forWhat) => {
71
+ if (covered(id)) return true;
72
+ const type = typeFor(id);
73
+ if (type === void 0) {
74
+ path.impossible = id;
75
+ return false;
76
+ }
77
+ if (type !== id && covered(type)) return true;
78
+ if (visiting.has(type)) {
79
+ path.cycle = [...visiting, type];
80
+ return false;
81
+ }
82
+ visiting.add(type);
83
+ const def = registry.unit(type);
84
+ for (const required of def.requires ?? []) if (!need(required, type)) return false;
85
+ const maker = makerOf(view, type);
86
+ if (!have(maker.from) && !need(maker.from, type)) return false;
87
+ visiting.delete(type);
88
+ planned.add(type);
89
+ steps.push({
90
+ type,
91
+ ...maker,
92
+ for: forWhat
93
+ });
94
+ return true;
95
+ };
96
+ if (!registry.units.has(target)) {
97
+ path.impossible = target;
98
+ return path;
99
+ }
100
+ const def = registry.unit(target);
101
+ for (const required of def.requires ?? []) if (!need(required, target)) return path;
102
+ const maker = makerOf(view, target);
103
+ if (!maker) {
104
+ path.impossible = target;
105
+ return path;
106
+ }
107
+ if (!have(maker.from)) need(maker.from, target);
108
+ return path;
109
+ }
110
+ /**
111
+ * A tech path's trouble in words, for the report and the log: nothing for a path with none
112
+ *
113
+ * @internal
114
+ */
115
+ function techTrouble(path) {
116
+ if (path.cycle) return `each needs another it does not have, so nothing can start it: ${path.cycle.join(" → ")} (a game whose definitions go round like this needs one of them to start with; a player that lost them all cannot make them again)`;
117
+ if (path.impossible !== void 0) return `nothing of its own makes ${path.impossible}`;
118
+ }
119
+ //#endregion
120
+ export { makerOf, techPath, techTrouble };
121
+
122
+ //# sourceMappingURL=tech.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tech.js","names":[],"sources":["../../../src/ai/plans/tech.ts"],"sourcesContent":["import { type UnitTypeDef, upgradesOf } from '#engine/defs'\nimport { availableToPlayer } from '#engine/shared'\nimport type { AiView } from '#engine/ai/view'\n\n/*\n * The tech path (AI plan, B3): how a computer player gets from what it has to what it wants. \"I want gryphons\" is,\n * to the definitions, \"gryphons are trained at an aviary, which needs a keep and a lumber mill; a keep is what a town\n * hall turns into\". Nothing here knows those names: it reads `requires` (what must stand finished), `trains` and\n * `builds` (who makes what), `upgradesTo` (what turns into what, one or several) and `provides` (what counts as what: a keep is a town\n * hall too) and walks them back from the wanted type to the player's tech, giving the steps in the order they can be\n * taken. `requires` is a list that must all hold; there is no \"either\" form. A cycle in a game's definitions (a\n * building that requires what it provides) is refused with a message naming it, rather than walked for ever\n */\n\n/**\n * One step towards a type: a building to build (by a worker), a building to turn another into (`morph`, from the\n * type that turns into it), or a unit to train (at the type that trains it). `for` is what the step is on the way to\n *\n * @beta\n */\nexport interface TechStep {\n\t/** The unit type id the step is on */\n\ttype: string\n\t/** How it is made: built by a worker, turned into from another type (`morph`) or trained at a building */\n\thow: 'build' | 'morph' | 'train'\n\t/** For a `morph`, the type that turns into it; for a `train`, the type that trains it; for a `build`, the type that builds it */\n\tfrom: string\n\t/** The type the step is on the way to */\n\tfor: string\n}\n\n/**\n * The steps from what the player has to being able to make a type (`techPath`): the prerequisites, the producer, in\n * the order they can be taken; the type itself is not among them. `cycle` names the definitions that go round in a\n * circle where they do, `impossible` the type nothing of the player's can make, and the steps are then as far as the\n * walk got\n *\n * @beta\n */\nexport interface TechPath {\n\t/** The steps in the order they can be taken, the type itself not among them */\n\tsteps: TechStep[]\n\t/** The definitions that go round in a circle, where they do */\n\tcycle?: string[]\n\t/** The type nothing of the player's can make, where there is one */\n\timpossible?: string\n}\n\n/**\n * How a type is made, by the player's definitions: built by a worker type, turned into from another type, or trained\n * at a building type; nothing for a type nothing of the player's race makes (a creep's hut). Of the makers, one the\n * player has first, then the first in the game's order\n *\n * @internal\n */\nexport function makerOf(view: AiView, type: string): Pick<TechStep, 'how' | 'from'> | undefined {\n\tconst { registry, me } = view\n\tif (!registry.units.has(type)) return undefined\n\tconst def = registry.unit(type)\n\tconst may = (maker: UnitTypeDef) => availableToPlayer(maker, { race: me.race, availability: me.availability }, maker.id)\n\tconst owned = (maker: UnitTypeDef) => view.mine.ofType(maker.id).length > 0\n\tconst pick = (makers: UnitTypeDef[]) => makers.find(owned) ?? makers[0]\n\tconst all = registry.units.all().filter(may)\n\tif (def.kind === 'building') {\n\t\tconst builders = all.filter((maker) => maker.kind === 'unit' && maker.builds?.includes(type))\n\t\tif (builders.length) return { how: 'build', from: pick(builders).id }\n\t\tconst befores = all.filter((maker) => upgradesOf(maker).includes(type))\n\t\tif (befores.length) return { how: 'morph', from: pick(befores).id }\n\t\treturn undefined\n\t}\n\tif (def.kind === 'unit') {\n\t\tconst trainers = all.filter((maker) => maker.kind === 'building' && maker.trains?.includes(type))\n\t\tif (trainers.length) return { how: 'train', from: pick(trainers).id }\n\t}\n\treturn undefined\n}\n\n/**\n * The steps from what the player has to being able to make a type: what it requires that it lacks, each of those in\n * turn, and the type's maker where it has none (the hall that trains the worker, the worker that builds the barracks,\n * the hall that turns into the keep). What stands finished (`view.me.tech`, with what it counts as) or is on its way\n * (`onItsWay`: under construction, a builder sent, a morph queued) is had already. A requirement no type has as its\n * id is met by a type that provides it\n *\n * @beta\n */\nexport function techPath(view: AiView, target: string, onItsWay: (type: string) => boolean = () => false): TechPath {\n\tconst { registry, me } = view\n\tconst steps: TechStep[] = []\n\tconst planned = new Set<string>()\n\tconst visiting = new Set<string>()\n\tconst path: TechPath = { steps }\n\tconst may = (def: UnitTypeDef) => availableToPlayer(def, { race: me.race, availability: me.availability }, def.id)\n\tconst have = (id: string) => me.tech.includes(id) || view.mine.ofType(id).length > 0 || onItsWay(id)\n\t/** Whether a requirement is met, or will be by a step planned already (a planned keep provides the town hall) */\n\tconst covered = (id: string) =>\n\t\thave(id) || planned.has(id) || [...planned].some((type) => registry.units.has(type) && registry.unit(type).provides?.includes(id))\n\n\t/** What is to be made for a requirement: the type itself, or the first type the player may make that provides it */\n\tconst typeFor = (id: string): string | undefined => {\n\t\tif (registry.units.has(id) && makerOf(view, id)) return id\n\t\tconst provider = registry.units.all().find((def) => may(def) && def.provides?.includes(id) && makerOf(view, def.id))\n\t\treturn provider?.id\n\t}\n\n\tconst need = (id: string, forWhat: string): boolean => {\n\t\tif (covered(id)) return true\n\t\tconst type = typeFor(id)\n\t\tif (type === undefined) {\n\t\t\tpath.impossible = id\n\t\t\treturn false\n\t\t}\n\t\tif (type !== id && covered(type)) return true\n\t\tif (visiting.has(type)) {\n\t\t\tpath.cycle = [...visiting, type]\n\t\t\treturn false\n\t\t}\n\t\tvisiting.add(type)\n\t\tconst def = registry.unit(type)\n\t\tfor (const required of def.requires ?? []) if (!need(required, type)) return false\n\t\tconst maker = makerOf(view, type)!\n\t\t// a morph turns what the player has (or will have) into it; a build needs a builder; a train a trainer\n\t\tif (!have(maker.from) && !need(maker.from, type)) return false\n\t\tvisiting.delete(type)\n\t\tplanned.add(type)\n\t\tsteps.push({ type, ...maker, for: forWhat })\n\t\treturn true\n\t}\n\n\tif (!registry.units.has(target)) {\n\t\tpath.impossible = target\n\t\treturn path\n\t}\n\tconst def = registry.unit(target)\n\tfor (const required of def.requires ?? []) if (!need(required, target)) return path\n\tconst maker = makerOf(view, target)\n\tif (!maker) {\n\t\tpath.impossible = target\n\t\treturn path\n\t}\n\tif (!have(maker.from)) need(maker.from, target)\n\treturn path\n}\n\n/**\n * A tech path's trouble in words, for the report and the log: nothing for a path with none\n *\n * @internal\n */\nexport function techTrouble(path: TechPath): string | undefined {\n\tif (path.cycle)\n\t\treturn `each needs another it does not have, so nothing can start it: ${path.cycle.join(' → ')} (a game whose definitions go round like this needs one of them to start with; a player that lost them all cannot make them again)`\n\tif (path.impossible !== undefined) return `nothing of its own makes ${path.impossible}`\n\treturn undefined\n}\n"],"mappings":";;;;;;;;;;AAuDA,SAAgB,QAAQ,MAAc,MAA0D;CAC/F,MAAM,EAAE,UAAU,OAAO;CACzB,IAAI,CAAC,SAAS,MAAM,IAAI,IAAI,GAAG,OAAO,KAAA;CACtC,MAAM,MAAM,SAAS,KAAK,IAAI;CAC9B,MAAM,OAAO,UAAuB,kBAAkB,OAAO;EAAE,MAAM,GAAG;EAAM,cAAc,GAAG;CAAa,GAAG,MAAM,EAAE;CACvH,MAAM,SAAS,UAAuB,KAAK,KAAK,OAAO,MAAM,EAAE,CAAC,CAAC,SAAS;CAC1E,MAAM,QAAQ,WAA0B,OAAO,KAAK,KAAK,KAAK,OAAO;CACrE,MAAM,MAAM,SAAS,MAAM,IAAI,CAAC,CAAC,OAAO,GAAG;CAC3C,IAAI,IAAI,SAAS,YAAY;EAC5B,MAAM,WAAW,IAAI,QAAQ,UAAU,MAAM,SAAS,UAAU,MAAM,QAAQ,SAAS,IAAI,CAAC;EAC5F,IAAI,SAAS,QAAQ,OAAO;GAAE,KAAK;GAAS,MAAM,KAAK,QAAQ,CAAC,CAAC;EAAG;EACpE,MAAM,UAAU,IAAI,QAAQ,UAAU,WAAW,KAAK,CAAC,CAAC,SAAS,IAAI,CAAC;EACtE,IAAI,QAAQ,QAAQ,OAAO;GAAE,KAAK;GAAS,MAAM,KAAK,OAAO,CAAC,CAAC;EAAG;EAClE;CACD;CACA,IAAI,IAAI,SAAS,QAAQ;EACxB,MAAM,WAAW,IAAI,QAAQ,UAAU,MAAM,SAAS,cAAc,MAAM,QAAQ,SAAS,IAAI,CAAC;EAChG,IAAI,SAAS,QAAQ,OAAO;GAAE,KAAK;GAAS,MAAM,KAAK,QAAQ,CAAC,CAAC;EAAG;CACrE;AAED;;;;;;;;;;AAWA,SAAgB,SAAS,MAAc,QAAgB,iBAA4C,OAAiB;CACnH,MAAM,EAAE,UAAU,OAAO;CACzB,MAAM,QAAoB,CAAC;CAC3B,MAAM,0BAAU,IAAI,IAAY;CAChC,MAAM,2BAAW,IAAI,IAAY;CACjC,MAAM,OAAiB,EAAE,MAAM;CAC/B,MAAM,OAAO,QAAqB,kBAAkB,KAAK;EAAE,MAAM,GAAG;EAAM,cAAc,GAAG;CAAa,GAAG,IAAI,EAAE;CACjH,MAAM,QAAQ,OAAe,GAAG,KAAK,SAAS,EAAE,KAAK,KAAK,KAAK,OAAO,EAAE,CAAC,CAAC,SAAS,KAAK,SAAS,EAAE;;CAEnG,MAAM,WAAW,OAChB,KAAK,EAAE,KAAK,QAAQ,IAAI,EAAE,KAAK,CAAC,GAAG,OAAO,CAAC,CAAC,MAAM,SAAS,SAAS,MAAM,IAAI,IAAI,KAAK,SAAS,KAAK,IAAI,CAAC,CAAC,UAAU,SAAS,EAAE,CAAC;;CAGlI,MAAM,WAAW,OAAmC;EACnD,IAAI,SAAS,MAAM,IAAI,EAAE,KAAK,QAAQ,MAAM,EAAE,GAAG,OAAO;EAExD,OADiB,SAAS,MAAM,IAAI,CAAC,CAAC,MAAM,QAAQ,IAAI,GAAG,KAAK,IAAI,UAAU,SAAS,EAAE,KAAK,QAAQ,MAAM,IAAI,EAAE,CAC3G,CAAA,EAAU;CAClB;CAEA,MAAM,QAAQ,IAAY,YAA6B;EACtD,IAAI,QAAQ,EAAE,GAAG,OAAO;EACxB,MAAM,OAAO,QAAQ,EAAE;EACvB,IAAI,SAAS,KAAA,GAAW;GACvB,KAAK,aAAa;GAClB,OAAO;EACR;EACA,IAAI,SAAS,MAAM,QAAQ,IAAI,GAAG,OAAO;EACzC,IAAI,SAAS,IAAI,IAAI,GAAG;GACvB,KAAK,QAAQ,CAAC,GAAG,UAAU,IAAI;GAC/B,OAAO;EACR;EACA,SAAS,IAAI,IAAI;EACjB,MAAM,MAAM,SAAS,KAAK,IAAI;EAC9B,KAAK,MAAM,YAAY,IAAI,YAAY,CAAC,GAAG,IAAI,CAAC,KAAK,UAAU,IAAI,GAAG,OAAO;EAC7E,MAAM,QAAQ,QAAQ,MAAM,IAAI;EAEhC,IAAI,CAAC,KAAK,MAAM,IAAI,KAAK,CAAC,KAAK,MAAM,MAAM,IAAI,GAAG,OAAO;EACzD,SAAS,OAAO,IAAI;EACpB,QAAQ,IAAI,IAAI;EAChB,MAAM,KAAK;GAAE;GAAM,GAAG;GAAO,KAAK;EAAQ,CAAC;EAC3C,OAAO;CACR;CAEA,IAAI,CAAC,SAAS,MAAM,IAAI,MAAM,GAAG;EAChC,KAAK,aAAa;EAClB,OAAO;CACR;CACA,MAAM,MAAM,SAAS,KAAK,MAAM;CAChC,KAAK,MAAM,YAAY,IAAI,YAAY,CAAC,GAAG,IAAI,CAAC,KAAK,UAAU,MAAM,GAAG,OAAO;CAC/E,MAAM,QAAQ,QAAQ,MAAM,MAAM;CAClC,IAAI,CAAC,OAAO;EACX,KAAK,aAAa;EAClB,OAAO;CACR;CACA,IAAI,CAAC,KAAK,MAAM,IAAI,GAAG,KAAK,MAAM,MAAM,MAAM;CAC9C,OAAO;AACR;;;;;;AAOA,SAAgB,YAAY,MAAoC;CAC/D,IAAI,KAAK,OACR,OAAO,iEAAiE,KAAK,MAAM,KAAK,KAAK,EAAE;CAChG,IAAI,KAAK,eAAe,KAAA,GAAW,OAAO,4BAA4B,KAAK;AAE5E"}
@@ -64,12 +64,12 @@ export interface AiFlags {
64
64
  */
65
65
  export interface AiProfile extends AiSettings {
66
66
  /**
67
- * The brain it plays with, by id (one the game lists in `GameModule.brains`): what a race's profile says
67
+ * The brain it plays with, by id (one the game lists in `Rules.brains`): what a race's profile says
68
68
  * (`GameAi.races`, campaign plan AR3), for a seat that names none and a map that says none. The game's first brain
69
69
  * where nothing says
70
70
  */
71
71
  brain?: string;
72
- /** The difficulty by name: `easy`, `normal`, `hard`, `insane`, or a game's own (`GameModule.ai.difficulties`). `normal` when left out */
72
+ /** The difficulty by name: `easy`, `normal`, `hard`, `insane`, or a game's own (`Rules.ai.difficulties`). `normal` when left out */
73
73
  difficulty?: string;
74
74
  /** The personality by name: `balanced`, `rusher`, `turtle`, `expander`, `harasser`, or a game's own. `balanced` when left out */
75
75
  personality?: string;
@@ -136,7 +136,7 @@ export declare const DIFFICULTIES: Readonly<AiProfileTable>;
136
136
  */
137
137
  export declare const PERSONALITIES: Readonly<AiProfileTable>;
138
138
  /**
139
- * What a game says of its computer players' profiles (`GameModule.ai`): difficulties and personalities of its own, and
139
+ * What a game says of its computer players' profiles (`Rules.ai`): difficulties and personalities of its own, and
140
140
  * defaults over the engine's
141
141
  *
142
142
  * @beta
@@ -151,7 +151,7 @@ export interface GameAi {
151
151
  /** Defaults over the engine's, under the difficulty */
152
152
  defaults?: AiProfile;
153
153
  /**
154
- * How its computers play each of its races (`GameModule.races`), by race id: a layer over `defaults` and under the
154
+ * How its computers play each of its races (`Rules.races`), by race id: a layer over `defaults` and under the
155
155
  * difficulty, for a seat of that race (its build order, heroes, composition, flags; how often it thinks). Its
156
156
  * `difficulty` and `personality` are the seat's where the lobby and the map say none
157
157
  */
@@ -1,99 +1,4 @@
1
- //#region src/ai/settings.ts
2
- /**
3
- * Where each flag that an area has a name for goes in it, and whether it is a share (`true`: the share a lower layer or
4
- * the area gives; a number: that share; `false`: never)
5
- */
6
- var FLAGGED = {
7
- defendUsers: [["team", "defendUsers"], "switch"],
8
- say: [["team", "say"], "switch"],
9
- targetHeroes: [["micro", "targetHeroes"], "switch"],
10
- ignoreInjured: [["micro", "ignoreInjured"], "switch"],
11
- removeInjuries: [["micro", "removeInjuries"], "switch"],
12
- takeItems: [["micro", "takeItems"], "switch"],
13
- buyItems: [["micro", "buyItems"], "switch"],
14
- smartArtillery: [["micro", "smartArtillery"], "switch"],
15
- kite: [["micro", "kite"], "switch"],
16
- unitsFlee: [["micro", "unitsFlee"], "share"],
17
- heroesFlee: [["micro", "heroesFlee"], "share"],
18
- groupsFlee: [["squads", "retreatAt"], "share"],
19
- workersFlee: [["economy", "workersFlee"], "switch"],
20
- repairStructures: [[
21
- "plans",
22
- "build",
23
- "repair"
24
- ], "switch"],
25
- rebuild: [[
26
- "plans",
27
- "build",
28
- "rebuild"
29
- ], "switch"],
30
- scout: [["scouting", "scout"], "off"]
31
- };
32
- /** Of what a layer gives, the lists that add to the lower layers' rather than replace them */
33
- var ADDED = /* @__PURE__ */ new Set(["plans.build.wants", "waves.groups"]);
34
- /** Of what a layer gives, the tables merged key by key with the lower layers' rather than replaced */
35
- var MERGED = /* @__PURE__ */ new Set([
36
- "plans",
37
- "plans.build",
38
- "plans.production",
39
- "plans.build.placement"
40
- ]);
41
- var isObject = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
42
- /** A copy of a layer with its flags taken into the areas they name, the area's own value of the same layer over it */
43
- function folded(layer, ai) {
44
- const copy = { ...layer };
45
- for (const [flag, value] of Object.entries(layer.flags ?? {})) {
46
- const where = FLAGGED[flag];
47
- if (!where) continue;
48
- const said = typeof value === "function" ? ai ? value(ai) : void 0 : value;
49
- if (said === void 0) continue;
50
- const [path, kind] = where;
51
- const word = kind === "switch" ? !!said : kind === "off" ? said === false ? false : void 0 : said;
52
- if (word === void 0) continue;
53
- let at = copy;
54
- for (const key of path.slice(0, -1)) {
55
- at[key] = { ...at[key] };
56
- at = at[key];
57
- }
58
- const key = path[path.length - 1];
59
- if (at[key] === void 0) at[key] = word;
60
- }
61
- return copy;
62
- }
63
- /** A layer's values over the lower layers', key by key: see `ADDED`, `MERGED`; `true` over a share keeps the share */
64
- function over(under, given, path) {
65
- const merged = { ...under };
66
- for (const [key, value] of Object.entries(given)) {
67
- if (value === void 0) continue;
68
- const at = path ? `${path}.${key}` : key;
69
- const below = merged[key];
70
- if (ADDED.has(at) && Array.isArray(value)) merged[key] = [...below ?? [], ...value];
71
- else if ((MERGED.has(at) || !path) && isObject(value) && isObject(below)) merged[key] = over(below, value, at);
72
- else if (value === true && typeof below === "number") continue;
73
- else merged[key] = value;
74
- }
75
- return merged;
76
- }
77
- /**
78
- * The settings layered, lowest first (see the file's comment): each area's values key by key, a flag taken into the area
79
- * it names in its own layer. A flag that is a function of the brain is asked of `ai`, and left out where none is given
80
- *
81
- * @beta
82
- */
83
- function resolveSettings(layers, ai) {
84
- let resolved = {};
85
- for (const layer of layers) if (layer) resolved = over(resolved, folded(layer, ai), "");
86
- for (const [path, kind] of Object.values(FLAGGED)) {
87
- if (kind !== "share") continue;
88
- const area = resolved[path[0]];
89
- if (area?.[path[1]] === true) resolved[path[0]] = {
90
- ...area,
91
- [path[1]]: void 0
92
- };
93
- }
94
- return resolved;
95
- }
96
- //#endregion
1
+ import { resolveSettings } from "./settings.js";
97
2
  //#region src/ai/profiles.ts
98
3
  /**
99
4
  * The engine's defaults of how well it plays: the bottom layer. The areas' numbers are each area's own where no layer
@@ -330,6 +235,6 @@ function flagOf(ai, name) {
330
235
  return typeof value === "function" ? value(ai) : value;
331
236
  }
332
237
  //#endregion
333
- export { flagOf as a, resolveSettings as c, difficultiesOf as i, DIFFICULTIES as n, personalitiesOf as o, PERSONALITIES as r, resolveProfile as s, DEFAULT_PROFILE as t };
238
+ export { DEFAULT_PROFILE, DIFFICULTIES, PERSONALITIES, difficultiesOf, flagOf, personalitiesOf, resolveProfile };
334
239
 
335
- //# sourceMappingURL=profiles-B3NS9jwk.js.map
240
+ //# sourceMappingURL=profiles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profiles.js","names":[],"sources":["../../src/ai/profiles.ts"],"sourcesContent":["import type { Registry } from '#engine/registry'\nimport type { AiConditionTest } from './rules'\nimport type { ThinkBudgetOptions } from './budget'\nimport type { AiOptions } from './options'\nimport type { Brain } from './brain'\nimport { type AiSettings, resolveSettings } from './settings'\n\n/*\n * Profiles (AI plan, D1): how a computer player plays, as one piece of plain data. A profile (`AiProfile`) is the\n * settings of its areas (`AiSettings`, keyed by area: see settings.ts) and how well it plays, and is made of layers,\n * lowest first:\n *\n * the brain's → the game's defaults → the race's → the difficulty (by name) → the personality (by name) → the map → the seat\n *\n * - **A race's** (`GameAi.races`, by the race the seat plays) is how the game's computers play that race: its build\n * order, its heroes, its composition, a flag the race's roster asks for. Under the difficulty and the personality,\n * so that a hard rusher of either race is still hard and still rushes; the map's (`MapAi.races`) goes over the map's\n * settings for a player whose race the map leaves to the lobby.\n * - **A difficulty** (`easy`, `normal`, `hard`, `insane`, or a game's own: `Rules.ai.difficulties`) is how\n * well it plays: how often it thinks, how many commands a think may send (`commandsPerThink`, a person's hands), how\n * often it slips (`mistakes`: a think's fights left alone, a wave sent early; drawn with its own numbers, so the same\n * game slips alike), whether it sees through the fog (`vision: 'all'`, insane only: the one way a computer sees what\n * its seat does not, an observer's session), and the handicaps it is given (`handicap`: more of what its workers\n * bring in, more health, more damage, quicker making, asked of the game through its hooks as the computer is seated).\n * - **A personality** (`balanced`, `rusher`, `turtle`, `expander`, `harasser`, or a game's own: `Rules.ai.personalities`) is how\n * it likes to play: how much each goal weighs (`weights`), when it attacks and expands, how many towers it puts up.\n * - **The map's and the seat's** are what the map (`MapAi`), the lobby or the mission give (`AiOptions.settings`).\n *\n * `ai.profile` is the profile resolved; `ai.settings` its settings as the areas read them, worked out once a think.\n * Every field is data a lobby, a map or an editor can hold; a flag may be a function of the brain instead (code: given\n * again by the game, not kept in a save).\n */\n\n/**\n * A flag's value: as data, or worked out by the brain as it is asked (code, not kept in a save)\n *\n * @beta\n */\nexport type AiFlag<T> = T | ((ai: Brain) => T)\n\n/**\n * The classic RTS behaviour flags, where the meaning holds, and the kit's own beside them: each a yes or no, a number where\n * one says how much, or a function of the brain\n *\n * @beta\n */\nexport interface AiFlags {\n\t/** Helps its allies, people and computers, where asked (the team's `help` goal) */\n\tdefendUsers?: AiFlag<boolean>\n\t/** Hits heroes first among those alike (the micro's targets) */\n\ttargetHeroes?: AiFlag<boolean>\n\t/** Mends damaged buildings when no enemy reaches them (the build plan's `repair`) */\n\trepairStructures?: AiFlag<boolean>\n\t/** A hero leaves a fight under this share of its health: `true` at the share under it, `false` never (`micro.heroesFlee`) */\n\theroesFlee?: AiFlag<boolean | number>\n\t/** A unit leaves a fight under this share of its health: `true` at the share under it, `false` never (`micro.unitsFlee`) */\n\tunitsFlee?: AiFlag<boolean | number>\n\t/** A squad falls back from a fight away from home under these odds: `true` at the odds under it, `false` never (`squads.retreatAt`) */\n\tgroupsFlee?: AiFlag<boolean | number>\n\t/** Attacks before its time when the enemy's army as last seen is weak against its own: at these odds (`true`: 0.75) */\n\tnoMercy?: AiFlag<boolean | number>\n\t/** A unit that fled stays out until healed */\n\tignoreInjured?: AiFlag<boolean>\n\t/** The hurt go home to heal between fights */\n\tremoveInjuries?: AiFlag<boolean>\n\t/** Picks up what lies about */\n\ttakeItems?: AiFlag<boolean>\n\t/** Its heroes buy from shops in reach */\n\tbuyItems?: AiFlag<boolean>\n\t/** Builds its hall again where it can, once its home falls, rather than where it first stood: yes when left out */\n\tallowHomeChanges?: AiFlag<boolean>\n\t/** Siege units shoot buildings and stay behind their squad */\n\tsmartArtillery?: AiFlag<boolean>\n\t/** Each wave takes a way of its own to the target, by the brain's numbers: straight, or round one side or the other */\n\trandomPaths?: AiFlag<boolean>\n\t/** Builds again what it lost */\n\trebuild?: AiFlag<boolean>\n\t/** Ranged units step back from melee they outrun */\n\tkite?: AiFlag<boolean>\n\t/** Workers a raid is on walk to a safe base */\n\tworkersFlee?: AiFlag<boolean>\n\t/** Says its lines to its side (the team's `say`) */\n\tsay?: AiFlag<boolean>\n\t/** Sends a unit to look at the enemy (the scouting's goal) */\n\tscout?: AiFlag<boolean>\n}\n\n/**\n * How a computer player plays, as plain data: the settings of its areas (`AiSettings`) and how well it plays, every field\n * optional, layered (see the file's comment). What a difficulty, a personality and a game's defaults give\n *\n * @beta\n */\nexport interface AiProfile extends AiSettings {\n\t/**\n\t * The brain it plays with, by id (one the game lists in `Rules.brains`): what a race's profile says\n\t * (`GameAi.races`, campaign plan AR3), for a seat that names none and a map that says none. The game's first brain\n\t * where nothing says\n\t */\n\tbrain?: string\n\t/** The difficulty by name: `easy`, `normal`, `hard`, `insane`, or a game's own (`Rules.ai.difficulties`). `normal` when left out */\n\tdifficulty?: string\n\t/** The personality by name: `balanced`, `rusher`, `turtle`, `expander`, `harasser`, or a game's own. `balanced` when left out */\n\tpersonality?: string\n\t/** Seconds between thinks: its reactions */\n\tevery?: number\n\t/** Commands a think may send at the most, like a person's hands: no limit when left out */\n\tcommandsPerThink?: number\n\t/** How often it slips, 0 to 1: a think's fights left alone, a wave sent early. Drawn with the brain's own numbers */\n\tmistakes?: number\n\t/** `fair`: it sees what its seat does. `all`: it sees through the fog (an observer's session), for insane only */\n\tvision?: 'fair' | 'all'\n\t/**\n\t * How much of a think one tick may do (`ThinkBudgetOptions`): modules a tick, units looked at a tick, the milliseconds\n\t * a module is warned over (4). Nothing sliced when left out: a game sets it where its numbers ask, at many computers\n\t */\n\tbudget?: ThinkBudgetOptions\n\t/**\n\t * What it is given beyond the rules, each a factor (1 is none), through the game's hooks while it is seated:\n\t * `income`, what its workers bring in (1.5: half again; `beforeDeposit`); `health`, the most health of everything\n\t * it has (`stats`); `damage`, the damage it deals (`beforeDamage`, before armour); `buildTime`, how long what it\n\t * trains, builds and researches takes (0.8: a fifth sooner; `beforeProduce`). The classic handicap is `health`\n\t */\n\thandicap?: AiHandicap\n}\n\n/**\n * What a computer is given beyond the rules (`AiProfile.handicap`): each a factor, 1 (or left out) for none\n *\n * @beta\n */\nexport interface AiHandicap {\n\t/** What its workers bring in, through the game's `beforeDeposit` hook */\n\tincome?: number\n\t/** The most health of everything it has, through a `stats` hook: the classic handicap */\n\thealth?: number\n\t/** The damage it deals, before armour, through a `beforeDamage` hook */\n\tdamage?: number\n\t/** How long what it trains, builds and researches takes, through a `beforeProduce` hook: under 1 is sooner */\n\tbuildTime?: number\n}\n\n/**\n * A difficulty's or a personality's profile, the engine's or a game's\n *\n * @beta\n */\nexport type AiProfileTable = Record<string, AiProfile>\n\n/**\n * The engine's defaults of how well it plays: the bottom layer. The areas' numbers are each area's own where no layer\n * says them (`Economy`'s 8 workers)\n *\n * @beta\n */\nexport const DEFAULT_PROFILE: Readonly<AiProfile> = {\n\tdifficulty: 'normal',\n\tpersonality: 'balanced',\n\tevery: 1,\n\tmistakes: 0,\n\tvision: 'fair'\n}\n\n/** The numbers the strongest difficulties share */\nconst STRONG: AiProfile = {\n\tevery: 0.5,\n\teconomy: { workers: 10, expansions: 2 },\n\tarmy: { firstAttack: 105, attackEvery: 34, waveSize: 8 },\n\tdefence: { radius: 22 },\n\tscouting: { lookEvery: 60 }\n}\n\n/**\n * The engine's difficulties: how well it plays. `normal` is the areas' own numbers. `insane` sees through the fog and\n * gets half again of what its workers bring in, as the classic insane computer does\n *\n * @beta\n */\nexport const DIFFICULTIES: Readonly<AiProfileTable> = {\n\teasy: {\n\t\tevery: 2,\n\t\tcommandsPerThink: 12,\n\t\tmistakes: 0.25,\n\t\teconomy: { workers: 6, expansions: 0 },\n\t\tarmy: { firstAttack: 240, attackEvery: 70, waveSize: 4 },\n\t\tdefence: { radius: 10 },\n\t\tscouting: { lookEvery: 150 },\n\t\theroes: { most: 1 }\n\t},\n\tnormal: {},\n\thard: STRONG,\n\tinsane: { ...STRONG, vision: 'all', handicap: { income: 1.5 } }\n}\n\n/**\n * The engine's personalities: how it likes to play. Over the difficulty, so a rusher rushes on any of them\n *\n * @beta\n */\nexport const PERSONALITIES: Readonly<AiProfileTable> = {\n\tbalanced: {},\n\trusher: {\n\t\tarmy: { firstAttack: 90, attackEvery: 30, waveSize: 4 },\n\t\teconomy: { expansions: 0 },\n\t\tdefence: { towers: 0 },\n\t\tweights: { creep: 0.5, harass: 1.2, expand: 0.5 },\n\t\tflags: { noMercy: true }\n\t},\n\tturtle: {\n\t\tarmy: { firstAttack: 300 },\n\t\tdefence: { towers: 2, odds: 0.8 },\n\t\teconomy: { expansions: 0 },\n\t\tweights: { attack: 0.8, creep: 0.6, raid: 0.5, harass: 0.2, expand: 1.2 },\n\t\tflags: { workersFlee: true }\n\t},\n\texpander: {\n\t\teconomy: { expansions: 3, expandWhen: { all: [{ time: { after: 150 } }, { units: { role: 'barracks' } }] } },\n\t\tweights: { attack: 0.9, expand: 1.5 }\n\t},\n\tharasser: {\n\t\tarmy: { attackEvery: 30, waveSize: 4 },\n\t\tweights: { creep: 1.2, raid: 1.5, harass: 1.5 },\n\t\tflags: { kite: true, heroesFlee: 0.5, noMercy: true }\n\t}\n}\n\n/**\n * What a game says of its computer players' profiles (`Rules.ai`): difficulties and personalities of its own, and\n * defaults over the engine's\n *\n * @beta\n */\nexport interface GameAi {\n\t/** Difficulties of its own, by name, beside (or over) the engine's */\n\tdifficulties?: AiProfileTable\n\t/** Personalities of its own, by name */\n\tpersonalities?: AiProfileTable\n\t/** Conditions of its own, by id, for the data form (`{ is: 'mygame.bridgeDown', args }`), a map's file among them */\n\tconditions?: Record<string, AiConditionTest>\n\t/** Defaults over the engine's, under the difficulty */\n\tdefaults?: AiProfile\n\t/**\n\t * How its computers play each of its races (`Rules.races`), by race id: a layer over `defaults` and under the\n\t * difficulty, for a seat of that race (its build order, heroes, composition, flags; how often it thinks). Its\n\t * `difficulty` and `personality` are the seat's where the lobby and the map say none\n\t */\n\traces?: AiProfileTable\n\t/** Whether a lobby offers its seats a difficulty and a personality (`seatSettingsOf`): yes when left out */\n\tlobby?: boolean\n}\n\n/**\n * The difficulties a game's computers may play at, by name: the engine's, the game's over them\n *\n * @beta\n */\nexport function difficultiesOf(registry?: Pick<Registry, 'module'>): AiProfileTable {\n\treturn { ...DIFFICULTIES, ...registry?.module?.ai?.difficulties }\n}\n\n/**\n * The personalities a game's computers may have, by name: the engine's, the game's over them\n *\n * @beta\n */\nexport function personalitiesOf(registry?: Pick<Registry, 'module'>): AiProfileTable {\n\treturn { ...PERSONALITIES, ...registry?.module?.ai?.personalities }\n}\n\n/** What a profile says of how well it plays, beside its settings: layered field by field (the handicap and the budget merged) */\nconst HOW_WELL = ['brain', 'difficulty', 'personality', 'every', 'commandsPerThink', 'mistakes', 'vision', 'budget', 'handicap'] as const\n\n/**\n * A profile resolved (`resolveProfile`): what it plays by, and its settings' layers as given, lowest first, for the brain\n * to work out each think (a flag may be a function of it)\n *\n * @beta\n */\nexport interface ResolvedProfile {\n\t/** The profile, its settings layered (a flag's function left out) */\n\tprofile: AiProfile\n\t/** Its settings' layers, lowest first: the brain's, the game's, the race's, the difficulty's, the personality's, the seat's (the map's under it) */\n\tlayers: readonly AiSettings[]\n\t/** A difficulty or a personality the game does not have, passed over */\n\tunknown: string[]\n}\n\n/** A profile's settings: what is not of how well it plays */\nfunction settingsOf(profile: AiProfile | undefined): AiSettings | undefined {\n\tif (!profile) return undefined\n\tconst settings: Record<string, unknown> = { ...profile }\n\tfor (const key of HOW_WELL) delete settings[key]\n\treturn settings as AiSettings\n}\n\n/**\n * The profile a seat plays by (`Brain.profile`): the brain's settings (`BrainDef.settings`), the game's defaults, the\n * race's (`GameAi.races`, for the `race` the seat plays), the difficulty, the personality, the seat's own\n * (`AiOptions.settings`, the map's under it), each over the one before; how well it plays from the engine's defaults,\n * the game's, the race's, the difficulty, the personality and the seat's `every` and `budget`. A name the game does not\n * have is passed over, and `unknown` names it\n *\n * @beta\n */\nexport function resolveProfile(options: AiOptions, registry?: Pick<Registry, 'module'>, brain?: AiSettings, race?: string): ResolvedProfile {\n\tconst defaults = registry?.module?.ai?.defaults\n\tconst raced = race !== undefined ? registry?.module?.ai?.races?.[race] : undefined\n\tconst difficulty = options.difficulty ?? raced?.difficulty ?? defaults?.difficulty ?? 'normal'\n\tconst personality = options.personality ?? raced?.personality ?? defaults?.personality ?? 'balanced'\n\tconst difficulties = difficultiesOf(registry)\n\tconst personalities = personalitiesOf(registry)\n\tconst unknown: string[] = []\n\tif (!difficulties[difficulty]) unknown.push(`difficulty \"${difficulty}\"`)\n\tif (!personalities[personality]) unknown.push(`personality \"${personality}\"`)\n\tconst seat: AiProfile = {\n\t\t...(options.every !== undefined && { every: options.every }),\n\t\t...(options.budget !== undefined && { budget: typeof options.budget === 'number' ? { modulesPerTick: options.budget } : options.budget })\n\t}\n\tconst profile: Record<string, unknown> = {}\n\tfor (const each of [DEFAULT_PROFILE, defaults, raced, difficulties[difficulty], personalities[personality], seat])\n\t\tfor (const key of HOW_WELL) {\n\t\t\tconst value = each?.[key]\n\t\t\tif (value === undefined) continue\n\t\t\tprofile[key] = key === 'budget' || key === 'handicap' ? { ...(profile[key] as object | undefined), ...(value as object) } : value\n\t\t}\n\tprofile.difficulty = difficulty\n\tprofile.personality = personality\n\tconst layers = [\n\t\tbrain,\n\t\tsettingsOf(defaults),\n\t\tsettingsOf(raced),\n\t\tsettingsOf(difficulties[difficulty]),\n\t\tsettingsOf(personalities[personality]),\n\t\toptions.settings\n\t].filter((layer): layer is AiSettings => !!layer)\n\treturn { profile: { ...resolveSettings(layers), ...(profile as AiProfile) }, layers, unknown }\n}\n\n/**\n * A flag's value as asked now: a function of the brain worked out, data as it is. For a flag no area has a name for\n * (No Mercy, Random Paths, Allow Home Changes): the rest are the areas' (`ai.settings`)\n *\n * @beta\n */\nexport function flagOf<K extends keyof AiFlags>(ai: Brain, name: K): Exclude<AiFlags[K], (ai: Brain) => unknown> | undefined {\n\tconst value = ai.settings.flags?.[name]\n\treturn (typeof value === 'function' ? (value as (ai: Brain) => unknown)(ai) : value) as Exclude<AiFlags[K], (ai: Brain) => unknown> | undefined\n}\n"],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ //#region src/ai/reach.ts
2
+ /**
3
+ * The distances and times the AI kit measures by (design review B13), each named once with why it is what it is
4
+ */
5
+ /**
6
+ * The side of a cell of the view's grid, in units of the map: a few units, so that "near" looks at a few cells. The
7
+ * threat map and the knowledge share it
8
+ *
9
+ * @internal
10
+ */
11
+ var CELL = 8;
12
+ /**
13
+ * How far from its centre a building is still of a base: the view's own and the knowledge's of an enemy
14
+ *
15
+ * @internal
16
+ */
17
+ var BASE_REACH = 24;
18
+ /**
19
+ * How far from a mine a hall is that mine's: the economy's deposits, the hall built by a mine, the way kept clear
20
+ * between them
21
+ *
22
+ * @internal
23
+ */
24
+ var HALL_REACH = 16;
25
+ /**
26
+ * How near the middle of a squad a fight is: what is this near is in it (the squads' and the micro's measure)
27
+ *
28
+ * @internal
29
+ */
30
+ var FIGHT_REACH = 14;
31
+ /**
32
+ * How near one of its units a foe is for it to be in a fight: a squad that may turn back, a unit in the fight, a
33
+ * worker a raid is on
34
+ *
35
+ * @internal
36
+ */
37
+ var ENGAGED = 8;
38
+ /**
39
+ * How near one of theirs a lanes hero is in a fight (a hero with nothing this near walks on): a lane is wider than a
40
+ * squad's reach
41
+ *
42
+ * @internal
43
+ */
44
+ var LANE_ENGAGED = 9;
45
+ /**
46
+ * Seconds before an order that was lost is sent again: what keeps a stuck unit from being told every think
47
+ *
48
+ * @internal
49
+ */
50
+ var RESEND = 3;
51
+ //#endregion
52
+ export { BASE_REACH, CELL, ENGAGED, FIGHT_REACH, HALL_REACH, LANE_ENGAGED, RESEND };
53
+
54
+ //# sourceMappingURL=reach.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reach.js","names":[],"sources":["../../src/ai/reach.ts"],"sourcesContent":["/**\n * The distances and times the AI kit measures by (design review B13), each named once with why it is what it is\n */\n\n/**\n * The side of a cell of the view's grid, in units of the map: a few units, so that \"near\" looks at a few cells. The\n * threat map and the knowledge share it\n *\n * @internal\n */\nexport const CELL = 8\n\n/**\n * How far from its centre a building is still of a base: the view's own and the knowledge's of an enemy\n *\n * @internal\n */\nexport const BASE_REACH = 24\n\n/**\n * How far from a mine a hall is that mine's: the economy's deposits, the hall built by a mine, the way kept clear\n * between them\n *\n * @internal\n */\nexport const HALL_REACH = 16\n\n/**\n * How near the middle of a squad a fight is: what is this near is in it (the squads' and the micro's measure)\n *\n * @internal\n */\nexport const FIGHT_REACH = 14\n\n/**\n * How near one of its units a foe is for it to be in a fight: a squad that may turn back, a unit in the fight, a\n * worker a raid is on\n *\n * @internal\n */\nexport const ENGAGED = 8\n\n/**\n * How near one of theirs a lanes hero is in a fight (a hero with nothing this near walks on): a lane is wider than a\n * squad's reach\n *\n * @internal\n */\nexport const LANE_ENGAGED = 9\n\n/**\n * Seconds before an order that was lost is sent again: what keeps a stuck unit from being told every think\n *\n * @internal\n */\nexport const RESEND = 3\n"],"mappings":";;;;;;;;;;AAUA,IAAa,OAAO;;;;;;AAOpB,IAAa,aAAa;;;;;;;AAQ1B,IAAa,aAAa;;;;;;AAO1B,IAAa,cAAc;;;;;;;AAQ3B,IAAa,UAAU;;;;;;;AAQvB,IAAa,eAAe;;;;;;AAO5B,IAAa,SAAS"}
@@ -33,6 +33,7 @@ export interface AiDecision {
33
33
  * @beta
34
34
  */
35
35
  export interface KnowledgeReport {
36
+ /** The enemy bases known, each with its owner, where, how many structures, how many seconds ago it was seen and whether it is gone */
36
37
  bases: {
37
38
  owner: PlayerId;
38
39
  at: [number, number];
@@ -40,12 +41,15 @@ export interface KnowledgeReport {
40
41
  seen: number;
41
42
  gone?: true;
42
43
  }[];
44
+ /** The enemy armies as last seen, each with where, how many fighters and how many seconds ago */
43
45
  army: {
44
46
  at: [number, number];
45
47
  count: number;
46
48
  seen: number;
47
49
  }[];
50
+ /** The enemy tech seen: the types of their finished buildings */
48
51
  tech: string[];
52
+ /** How many of its own things were lost */
49
53
  lost: number;
50
54
  }
51
55
  /**
@@ -79,9 +83,13 @@ export interface AiStats {
79
83
  * @beta
80
84
  */
81
85
  export interface ThreatReport {
86
+ /** The side of a grid cell, in cells of the map */
82
87
  cell: number;
88
+ /** How many grid cells across */
83
89
  cols: number;
90
+ /** How many grid cells down */
84
91
  rows: number;
92
+ /** Each grid cell with something in it as `[col, row, friendly, enemy]`, the strength of each side */
85
93
  cells: [col: number, row: number, friendly: number, enemy: number][];
86
94
  }
87
95
  /**