@v12-engine/engine 0.1.1 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (951) hide show
  1. package/dist/abilities/amounts.d.ts +28 -0
  2. package/dist/abilities/amounts.js +74 -0
  3. package/dist/abilities/amounts.js.map +1 -0
  4. package/dist/abilities/buffs.d.ts +106 -6
  5. package/dist/abilities/buffs.js +443 -0
  6. package/dist/abilities/buffs.js.map +1 -0
  7. package/dist/abilities/castTold.d.ts +2 -0
  8. package/dist/abilities/castTold.js +66 -0
  9. package/dist/abilities/castTold.js.map +1 -0
  10. package/dist/abilities/chance.d.ts +38 -0
  11. package/dist/abilities/chance.js +77 -0
  12. package/dist/abilities/chance.js.map +1 -0
  13. package/dist/abilities/charges.d.ts +18 -0
  14. package/dist/abilities/charges.js +101 -0
  15. package/dist/abilities/charges.js.map +1 -0
  16. package/dist/abilities/control.d.ts +28 -0
  17. package/dist/abilities/control.js +113 -0
  18. package/dist/abilities/control.js.map +1 -0
  19. package/dist/abilities/dispel.js +51 -0
  20. package/dist/abilities/dispel.js.map +1 -0
  21. package/dist/abilities/effectFields.d.ts +1 -1
  22. package/dist/abilities/effectFields.js +676 -0
  23. package/dist/abilities/effectFields.js.map +1 -0
  24. package/dist/abilities/effectIndex.d.ts +27 -0
  25. package/dist/abilities/effectIndex.js +64 -0
  26. package/dist/abilities/effectIndex.js.map +1 -0
  27. package/dist/abilities/effects/buff.d.ts +9 -3
  28. package/dist/abilities/effects/buff.js +84 -0
  29. package/dist/abilities/effects/buff.js.map +1 -0
  30. package/dist/abilities/effects/conditions.d.ts +2 -0
  31. package/dist/abilities/effects/conditions.js +41 -0
  32. package/dist/abilities/effects/conditions.js.map +1 -0
  33. package/dist/abilities/effects/core.js +54 -0
  34. package/dist/abilities/effects/core.js.map +1 -0
  35. package/dist/abilities/effects/damage.d.ts +1 -1
  36. package/dist/abilities/effects/damage.js +43 -0
  37. package/dist/abilities/effects/damage.js.map +1 -0
  38. package/dist/abilities/effects/heal.d.ts +2 -2
  39. package/dist/abilities/effects/heal.js +51 -0
  40. package/dist/abilities/effects/heal.js.map +1 -0
  41. package/dist/abilities/effects/missile.d.ts +13 -1
  42. package/dist/abilities/effects/missile.js +104 -0
  43. package/dist/abilities/effects/missile.js.map +1 -0
  44. package/dist/abilities/effects/morph.d.ts +5 -0
  45. package/dist/abilities/effects/morph.js +43 -0
  46. package/dist/abilities/effects/morph.js.map +1 -0
  47. package/dist/abilities/effects/moves.d.ts +16 -4
  48. package/dist/abilities/effects/moves.js +212 -0
  49. package/dist/abilities/effects/moves.js.map +1 -0
  50. package/dist/abilities/effects/passives.d.ts +19 -9
  51. package/dist/abilities/effects/passives.js +131 -0
  52. package/dist/abilities/effects/passives.js.map +1 -0
  53. package/dist/abilities/effects/proxy.d.ts +5 -0
  54. package/dist/abilities/effects/proxy.js +60 -0
  55. package/dist/abilities/effects/proxy.js.map +1 -0
  56. package/dist/abilities/effects/sight.d.ts +2 -2
  57. package/dist/abilities/effects/sight.js +39 -0
  58. package/dist/abilities/effects/sight.js.map +1 -0
  59. package/dist/abilities/effects/spawn.d.ts +5 -2
  60. package/dist/abilities/effects/spawn.js +40 -0
  61. package/dist/abilities/effects/spawn.js.map +1 -0
  62. package/dist/abilities/effects/timed.d.ts +2 -2
  63. package/dist/abilities/effects/timed.js +96 -0
  64. package/dist/abilities/effects/timed.js.map +1 -0
  65. package/dist/abilities/effects/trade.d.ts +1 -1
  66. package/dist/abilities/effects/trade.js +25 -0
  67. package/dist/abilities/effects/trade.js.map +1 -0
  68. package/dist/abilities/effects.d.ts +97 -23
  69. package/dist/abilities/effects.js +860 -0
  70. package/dist/abilities/effects.js.map +1 -0
  71. package/dist/abilities/land.d.ts +38 -4
  72. package/dist/abilities/land.js +189 -0
  73. package/dist/abilities/land.js.map +1 -0
  74. package/dist/abilities/recast.d.ts +45 -0
  75. package/dist/abilities/recast.js +118 -0
  76. package/dist/abilities/recast.js.map +1 -0
  77. package/dist/abilities/scaled.js +40 -0
  78. package/dist/abilities/scaled.js.map +1 -0
  79. package/dist/abilities/screen.d.ts +6 -0
  80. package/dist/abilities/screen.js +83 -0
  81. package/dist/abilities/screen.js.map +1 -0
  82. package/dist/abilities/shapes.d.ts +66 -0
  83. package/dist/abilities/shapes.js +122 -0
  84. package/dist/abilities/shapes.js.map +1 -0
  85. package/dist/abilities/text.d.ts +14 -2
  86. package/dist/abilities/text.js +204 -0
  87. package/dist/abilities/text.js.map +1 -0
  88. package/dist/abilities/triggers.d.ts +98 -0
  89. package/dist/abilities/triggers.js +351 -0
  90. package/dist/abilities/triggers.js.map +1 -0
  91. package/dist/abilityChanges.d.ts +131 -0
  92. package/dist/abilityChanges.js +345 -0
  93. package/dist/abilityChanges.js.map +1 -0
  94. package/dist/ai/area.d.ts +4 -1
  95. package/dist/ai/brain.d.ts +4 -1
  96. package/dist/ai/brain.js +844 -0
  97. package/dist/ai/brain.js.map +1 -0
  98. package/dist/ai/budget.js +74 -0
  99. package/dist/ai/budget.js.map +1 -0
  100. package/dist/ai/checks.d.ts +9 -1
  101. package/dist/ai/checks.js +242 -0
  102. package/dist/ai/checks.js.map +1 -0
  103. package/dist/ai/computer.d.ts +11 -4
  104. package/dist/ai/computer.js +251 -0
  105. package/dist/ai/computer.js.map +1 -0
  106. package/dist/ai/defence.d.ts +4 -0
  107. package/dist/ai/defence.js +430 -0
  108. package/dist/ai/defence.js.map +1 -0
  109. package/dist/ai/define.d.ts +3 -2
  110. package/dist/ai/define.js +31 -0
  111. package/dist/ai/define.js.map +1 -0
  112. package/dist/ai/economy.d.ts +10 -7
  113. package/dist/ai/economy.js +780 -0
  114. package/dist/ai/economy.js.map +1 -0
  115. package/dist/ai/geometry.js +38 -0
  116. package/dist/ai/geometry.js.map +1 -0
  117. package/dist/ai/goals.d.ts +1 -0
  118. package/dist/ai/goals.js +560 -0
  119. package/dist/ai/goals.js.map +1 -0
  120. package/dist/ai/knowledge.d.ts +72 -7
  121. package/dist/ai/knowledge.js +804 -0
  122. package/dist/ai/knowledge.js.map +1 -0
  123. package/dist/ai/lanes.d.ts +10 -2
  124. package/dist/ai/lanes.js +715 -0
  125. package/dist/ai/lanes.js.map +1 -0
  126. package/dist/ai/melee/build.js +264 -0
  127. package/dist/ai/melee/build.js.map +1 -0
  128. package/dist/ai/melee/goals.d.ts +7 -0
  129. package/dist/ai/melee/goals.js +720 -0
  130. package/dist/ai/melee/goals.js.map +1 -0
  131. package/dist/ai/melee/heroes.js +68 -0
  132. package/dist/ai/melee/heroes.js.map +1 -0
  133. package/dist/ai/melee/index.d.ts +1 -1
  134. package/dist/ai/melee/index.js +51 -0
  135. package/dist/ai/melee/index.js.map +1 -0
  136. package/dist/ai/melee/production.js +29 -0
  137. package/dist/ai/melee/production.js.map +1 -0
  138. package/dist/ai/melee/surrender.js +64 -0
  139. package/dist/ai/melee/surrender.js.map +1 -0
  140. package/dist/ai/micro.d.ts +9 -0
  141. package/dist/ai/micro.js +1316 -0
  142. package/dist/ai/micro.js.map +1 -0
  143. package/dist/ai/mission.d.ts +9 -2
  144. package/dist/ai/mission.js +538 -0
  145. package/dist/ai/mission.js.map +1 -0
  146. package/dist/ai/missionRules.d.ts +1 -1
  147. package/dist/ai/missionRules.js +26 -0
  148. package/dist/ai/missionRules.js.map +1 -0
  149. package/dist/ai/module.d.ts +6 -2
  150. package/dist/ai/module.js +37 -0
  151. package/dist/ai/module.js.map +1 -0
  152. package/dist/ai/options.d.ts +3 -3
  153. package/dist/ai/plans/build.d.ts +20 -1
  154. package/dist/ai/plans/build.js +608 -0
  155. package/dist/ai/plans/build.js.map +1 -0
  156. package/dist/ai/plans/placement.d.ts +4 -1
  157. package/dist/ai/plans/placement.js +295 -0
  158. package/dist/ai/plans/placement.js.map +1 -0
  159. package/dist/ai/plans/plans.d.ts +9 -0
  160. package/dist/ai/plans/plans.js +110 -0
  161. package/dist/ai/plans/plans.js.map +1 -0
  162. package/dist/ai/plans/production.d.ts +14 -2
  163. package/dist/ai/plans/production.js +434 -0
  164. package/dist/ai/plans/production.js.map +1 -0
  165. package/dist/ai/plans/purse.d.ts +6 -3
  166. package/dist/ai/plans/purse.js +139 -0
  167. package/dist/ai/plans/purse.js.map +1 -0
  168. package/dist/ai/plans/tech.d.ts +6 -0
  169. package/dist/ai/plans/tech.js +122 -0
  170. package/dist/ai/plans/tech.js.map +1 -0
  171. package/dist/ai/profiles.d.ts +4 -4
  172. package/dist/{profiles-B3NS9jwk.js → ai/profiles.js} +3 -98
  173. package/dist/ai/profiles.js.map +1 -0
  174. package/dist/ai/reach.js +54 -0
  175. package/dist/ai/reach.js.map +1 -0
  176. package/dist/ai/report.d.ts +8 -0
  177. package/dist/ai/report.js +87 -0
  178. package/dist/ai/report.js.map +1 -0
  179. package/dist/ai/roles.d.ts +4 -0
  180. package/dist/ai/roles.js +207 -0
  181. package/dist/ai/roles.js.map +1 -0
  182. package/dist/ai/rules.d.ts +8 -2
  183. package/dist/ai/rules.js +416 -0
  184. package/dist/ai/rules.js.map +1 -0
  185. package/dist/ai/scouting.d.ts +6 -0
  186. package/dist/ai/scouting.js +324 -0
  187. package/dist/ai/scouting.js.map +1 -0
  188. package/dist/ai/settings.js +99 -0
  189. package/dist/ai/settings.js.map +1 -0
  190. package/dist/ai/squads.d.ts +21 -2
  191. package/dist/ai/squads.js +916 -0
  192. package/dist/ai/squads.js.map +1 -0
  193. package/dist/ai/strength.js +320 -0
  194. package/dist/ai/strength.js.map +1 -0
  195. package/dist/ai/task.d.ts +3 -1
  196. package/dist/ai/task.js +17 -0
  197. package/dist/ai/task.js.map +1 -0
  198. package/dist/ai/tasks/attack.js +24 -0
  199. package/dist/ai/tasks/attack.js.map +1 -0
  200. package/dist/ai/tasks/capture.d.ts +3 -3
  201. package/dist/ai/tasks/capture.js +37 -0
  202. package/dist/ai/tasks/capture.js.map +1 -0
  203. package/dist/ai/tasks/creep.js +29 -0
  204. package/dist/ai/tasks/creep.js.map +1 -0
  205. package/dist/ai/tasks/defend.js +61 -0
  206. package/dist/ai/tasks/defend.js.map +1 -0
  207. package/dist/ai/tasks/drop.js +81 -0
  208. package/dist/ai/tasks/drop.js.map +1 -0
  209. package/dist/ai/tasks/escort.js +59 -0
  210. package/dist/ai/tasks/escort.js.map +1 -0
  211. package/dist/ai/tasks/gather.js +48 -0
  212. package/dist/ai/tasks/gather.js.map +1 -0
  213. package/dist/ai/tasks/harass.js +39 -0
  214. package/dist/ai/tasks/harass.js.map +1 -0
  215. package/dist/ai/tasks/hold.js +32 -0
  216. package/dist/ai/tasks/hold.js.map +1 -0
  217. package/dist/ai/tasks/index.js +34 -0
  218. package/dist/ai/tasks/index.js.map +1 -0
  219. package/dist/ai/tasks/move.js +26 -0
  220. package/dist/ai/tasks/move.js.map +1 -0
  221. package/dist/ai/tasks/patrol.js +59 -0
  222. package/dist/ai/tasks/patrol.js.map +1 -0
  223. package/dist/ai/tasks/retreat.js +28 -0
  224. package/dist/ai/tasks/retreat.js.map +1 -0
  225. package/dist/ai/tasks/scout.js +73 -0
  226. package/dist/ai/tasks/scout.js.map +1 -0
  227. package/dist/ai/tasks/shared.d.ts +1 -1
  228. package/dist/ai/tasks/shared.js +137 -0
  229. package/dist/ai/tasks/shared.js.map +1 -0
  230. package/dist/ai/team.d.ts +18 -1
  231. package/dist/ai/team.js +492 -0
  232. package/dist/ai/team.js.map +1 -0
  233. package/dist/ai/threat.d.ts +6 -0
  234. package/dist/ai/threat.js +206 -0
  235. package/dist/ai/threat.js.map +1 -0
  236. package/dist/ai/view.d.ts +21 -7
  237. package/dist/ai/view.js +677 -0
  238. package/dist/ai/view.js.map +1 -0
  239. package/dist/ai/waves.d.ts +6 -0
  240. package/dist/ai/waves.js +410 -0
  241. package/dist/ai/waves.js.map +1 -0
  242. package/dist/ai.js +54 -6239
  243. package/dist/aiTesting.d.ts +6 -3
  244. package/dist/aiTesting.js +229 -0
  245. package/dist/aiTesting.js.map +1 -0
  246. package/dist/areas.d.ts +4 -1
  247. package/dist/areas.js +295 -0
  248. package/dist/areas.js.map +1 -0
  249. package/dist/attacks.d.ts +3 -3
  250. package/dist/attacks.js +127 -0
  251. package/dist/attacks.js.map +1 -0
  252. package/dist/burning.d.ts +267 -0
  253. package/dist/burning.js +795 -0
  254. package/dist/burning.js.map +1 -0
  255. package/dist/bytes.js +21 -0
  256. package/dist/bytes.js.map +1 -0
  257. package/dist/callings.d.ts +71 -0
  258. package/dist/callings.js +157 -0
  259. package/dist/callings.js.map +1 -0
  260. package/dist/cameraOrders.d.ts +78 -0
  261. package/dist/cameraOrders.js +114 -0
  262. package/dist/cameraOrders.js.map +1 -0
  263. package/dist/camps.d.ts +70 -4
  264. package/dist/camps.js +501 -0
  265. package/dist/camps.js.map +1 -0
  266. package/dist/capture.d.ts +15 -3
  267. package/dist/capture.js +304 -0
  268. package/dist/capture.js.map +1 -0
  269. package/dist/cellLayers.d.ts +78 -13
  270. package/dist/cellLayers.js +275 -0
  271. package/dist/cellLayers.js.map +1 -0
  272. package/dist/cellPatches.d.ts +24 -0
  273. package/dist/cellPatches.js +73 -0
  274. package/dist/cellPatches.js.map +1 -0
  275. package/dist/cinematics.d.ts +10 -5
  276. package/dist/cinematics.js +161 -0
  277. package/dist/cinematics.js.map +1 -0
  278. package/dist/clock.d.ts +2 -2
  279. package/dist/clock.js +78 -0
  280. package/dist/clock.js.map +1 -0
  281. package/dist/commands.d.ts +36 -4
  282. package/dist/commands.js +636 -0
  283. package/dist/commands.js.map +1 -0
  284. package/dist/components.d.ts +31 -10
  285. package/dist/components.js +74 -0
  286. package/dist/components.js.map +1 -0
  287. package/dist/computers.d.ts +4 -4
  288. package/dist/computers.js +194 -0
  289. package/dist/computers.js.map +1 -0
  290. package/dist/concealment.d.ts +25 -2
  291. package/dist/concealment.js +409 -0
  292. package/dist/concealment.js.map +1 -0
  293. package/dist/coreComponents.js +130 -0
  294. package/dist/coreComponents.js.map +1 -0
  295. package/dist/createGame.d.ts +306 -0
  296. package/dist/createGame.js +405 -0
  297. package/dist/createGame.js.map +1 -0
  298. package/dist/dashing.d.ts +18 -2
  299. package/dist/dashing.js +41 -0
  300. package/dist/dashing.js.map +1 -0
  301. package/dist/debug.d.ts +8 -0
  302. package/dist/debug.js +5 -3
  303. package/dist/debug2.js +76 -0
  304. package/dist/debug2.js.map +1 -0
  305. package/dist/debugCommands.d.ts +6 -6
  306. package/dist/debugCommands.js +537 -0
  307. package/dist/debugCommands.js.map +1 -0
  308. package/dist/debugging.d.ts +1 -0
  309. package/dist/defaultSets.d.ts +183 -0
  310. package/dist/defaultSets.js +216 -0
  311. package/dist/defaultSets.js.map +1 -0
  312. package/dist/definitions.d.ts +6 -0
  313. package/dist/definitions.js +78 -0
  314. package/dist/definitions.js.map +1 -0
  315. package/dist/defs.d.ts +1895 -165
  316. package/dist/defs.js +380 -0
  317. package/dist/defs.js.map +1 -0
  318. package/dist/denying.d.ts +4 -4
  319. package/dist/denying.js +106 -0
  320. package/dist/denying.js.map +1 -0
  321. package/dist/destructibles.d.ts +2 -2
  322. package/dist/destructibles.js +36 -0
  323. package/dist/destructibles.js.map +1 -0
  324. package/dist/determinism.d.ts +4 -4
  325. package/dist/determinism.js +247 -0
  326. package/dist/determinism.js.map +1 -0
  327. package/dist/dialog.d.ts +17 -2
  328. package/dist/dialog.js +108 -0
  329. package/dist/dialog.js.map +1 -0
  330. package/dist/effectRefs.js +28 -0
  331. package/dist/effectRefs.js.map +1 -0
  332. package/dist/effects.d.ts +27 -11
  333. package/dist/effects.js +110 -0
  334. package/dist/effects.js.map +1 -0
  335. package/dist/endings.d.ts +1 -1
  336. package/dist/endings.js +78 -0
  337. package/dist/endings.js.map +1 -0
  338. package/dist/engagement.d.ts +40 -6
  339. package/dist/engagement.js +530 -0
  340. package/dist/engagement.js.map +1 -0
  341. package/dist/engineEvents.d.ts +72 -9
  342. package/dist/engineEvents.js +520 -0
  343. package/dist/engineEvents.js.map +1 -0
  344. package/dist/entity.d.ts +275 -26
  345. package/dist/entity.js +441 -0
  346. package/dist/entity.js.map +1 -0
  347. package/dist/entityIndex.d.ts +10 -3
  348. package/dist/entityIndex.js +149 -0
  349. package/dist/entityIndex.js.map +1 -0
  350. package/dist/errors.d.ts +6 -2
  351. package/dist/errors.js +59 -0
  352. package/dist/errors.js.map +1 -0
  353. package/dist/events.d.ts +11 -5
  354. package/dist/events.js +158 -0
  355. package/dist/events.js.map +1 -0
  356. package/dist/exactMath.js +273 -0
  357. package/dist/exactMath.js.map +1 -0
  358. package/dist/features.d.ts +1 -1
  359. package/dist/features.js +127 -0
  360. package/dist/features.js.map +1 -0
  361. package/dist/fields.d.ts +25 -5
  362. package/dist/fields.js +140 -0
  363. package/dist/fields.js.map +1 -0
  364. package/dist/fixture.d.ts +3 -3
  365. package/dist/fixture.js +512 -0
  366. package/dist/fixture.js.map +1 -0
  367. package/dist/fog.d.ts +26 -3
  368. package/dist/fog.js +333 -0
  369. package/dist/fog.js.map +1 -0
  370. package/dist/foliage.d.ts +476 -0
  371. package/dist/foliage.js +1478 -0
  372. package/dist/foliage.js.map +1 -0
  373. package/dist/foliageDebug.d.ts +57 -0
  374. package/dist/foliageDebug.js +172 -0
  375. package/dist/foliageDebug.js.map +1 -0
  376. package/dist/foliageRegrowth.d.ts +20 -0
  377. package/dist/foliageRegrowth.js +332 -0
  378. package/dist/foliageRegrowth.js.map +1 -0
  379. package/dist/formState.d.ts +67 -0
  380. package/dist/formState.js +65 -0
  381. package/dist/formState.js.map +1 -0
  382. package/dist/formation.d.ts +46 -8
  383. package/dist/formation.js +297 -0
  384. package/dist/formation.js.map +1 -0
  385. package/dist/forms.d.ts +58 -0
  386. package/dist/forms.js +146 -0
  387. package/dist/forms.js.map +1 -0
  388. package/dist/friendlyFire.d.ts +2 -2
  389. package/dist/friendlyFire.js +37 -0
  390. package/dist/friendlyFire.js.map +1 -0
  391. package/dist/game.d.ts +141 -48
  392. package/dist/game.js +834 -0
  393. package/dist/game.js.map +1 -0
  394. package/dist/gameData.d.ts +96 -22
  395. package/dist/gameData.js +1690 -0
  396. package/dist/gameData.js.map +1 -0
  397. package/dist/gameFiles.d.ts +3 -3
  398. package/dist/gameFiles.js +14 -0
  399. package/dist/gameFiles.js.map +1 -0
  400. package/dist/gates.js +92 -0
  401. package/dist/gates.js.map +1 -0
  402. package/dist/generate.d.ts +28 -1
  403. package/dist/generate.js +1062 -0
  404. package/dist/generate.js.map +1 -0
  405. package/dist/generateWorker.d.ts +7 -3
  406. package/dist/generateWorker.js +86 -0
  407. package/dist/generateWorker.js.map +1 -0
  408. package/dist/grid.d.ts +9 -0
  409. package/dist/grid.js +102 -0
  410. package/dist/grid.js.map +1 -0
  411. package/dist/ground.d.ts +17 -1
  412. package/dist/ground.js +375 -0
  413. package/dist/ground.js.map +1 -0
  414. package/dist/groundObjects.d.ts +70 -0
  415. package/dist/groundObjects.js +371 -0
  416. package/dist/groundObjects.js.map +1 -0
  417. package/dist/groundSpeed.d.ts +20 -3
  418. package/dist/groundSpeed.js +117 -0
  419. package/dist/groundSpeed.js.map +1 -0
  420. package/dist/hero.d.ts +126 -10
  421. package/dist/hero.js +432 -0
  422. package/dist/hero.js.map +1 -0
  423. package/dist/holds.d.ts +94 -0
  424. package/dist/holds.js +305 -0
  425. package/dist/holds.js.map +1 -0
  426. package/dist/home.d.ts +1 -1
  427. package/dist/home.js +30 -0
  428. package/dist/home.js.map +1 -0
  429. package/dist/hooks.d.ts +339 -57
  430. package/dist/hooks.js +105 -0
  431. package/dist/hooks.js.map +1 -0
  432. package/dist/hotReload.d.ts +6 -5
  433. package/dist/hotReload.js +145 -0
  434. package/dist/hotReload.js.map +1 -0
  435. package/dist/ids.d.ts +3 -3
  436. package/dist/ids.js +30 -0
  437. package/dist/ids.js.map +1 -0
  438. package/dist/idsFile.d.ts +36 -0
  439. package/dist/idsFile.js +134 -0
  440. package/dist/idsFile.js.map +1 -0
  441. package/dist/index.d.ts +105 -68
  442. package/dist/index.js +194 -4701
  443. package/dist/inspect.d.ts +29 -2
  444. package/dist/{inspect-D9dWHmZ0.js → inspect.js} +21 -12
  445. package/dist/inspect.js.map +1 -0
  446. package/dist/inventory.d.ts +14 -1
  447. package/dist/inventory.js +84 -0
  448. package/dist/inventory.js.map +1 -0
  449. package/dist/items.d.ts +136 -8
  450. package/dist/items.js +585 -0
  451. package/dist/items.js.map +1 -0
  452. package/dist/lanes.d.ts +12 -3
  453. package/dist/lanes.js +496 -0
  454. package/dist/lanes.js.map +1 -0
  455. package/dist/life.d.ts +6 -2
  456. package/dist/life.js +287 -0
  457. package/dist/life.js.map +1 -0
  458. package/dist/log.d.ts +26 -3
  459. package/dist/log.js +192 -0
  460. package/dist/log.js.map +1 -0
  461. package/dist/manaBurn.d.ts +2 -2
  462. package/dist/manaBurn.js +75 -0
  463. package/dist/manaBurn.js.map +1 -0
  464. package/dist/map/file.d.ts +56 -3
  465. package/dist/map/file.js +264 -0
  466. package/dist/map/file.js.map +1 -0
  467. package/dist/map/images.js +61 -0
  468. package/dist/map/images.js.map +1 -0
  469. package/dist/map/look.d.ts +1 -1
  470. package/dist/map/look.js +30 -0
  471. package/dist/map/look.js.map +1 -0
  472. package/dist/map/pathProfile.js +183 -0
  473. package/dist/map/pathProfile.js.map +1 -0
  474. package/dist/map/resize.d.ts +4 -0
  475. package/dist/map/resize.js +136 -0
  476. package/dist/map/resize.js.map +1 -0
  477. package/dist/map/schema.js +257 -0
  478. package/dist/map/schema.js.map +1 -0
  479. package/dist/map/terrain.js +214 -0
  480. package/dist/map/terrain.js.map +1 -0
  481. package/dist/map/types.d.ts +92 -13
  482. package/dist/map/types.js +251 -0
  483. package/dist/map/types.js.map +1 -0
  484. package/dist/mapCheck/cells.js +94 -0
  485. package/dist/mapCheck/cells.js.map +1 -0
  486. package/dist/mapCheck/rules/foliage.d.ts +9 -0
  487. package/dist/mapCheck/rules/foliage.js +83 -0
  488. package/dist/mapCheck/rules/foliage.js.map +1 -0
  489. package/dist/mapCheck/rules/names.js +39 -0
  490. package/dist/mapCheck/rules/names.js.map +1 -0
  491. package/dist/mapCheck/rules/objects.d.ts +1 -1
  492. package/dist/mapCheck/rules/objects.js +56 -0
  493. package/dist/mapCheck/rules/objects.js.map +1 -0
  494. package/dist/mapCheck/rules/paths.js +32 -0
  495. package/dist/mapCheck/rules/paths.js.map +1 -0
  496. package/dist/mapCheck/rules/players.js +20 -0
  497. package/dist/mapCheck/rules/players.js.map +1 -0
  498. package/dist/mapCheck/rules/races.js +56 -0
  499. package/dist/mapCheck/rules/races.js.map +1 -0
  500. package/dist/mapCheck/rules/random.js +47 -0
  501. package/dist/mapCheck/rules/random.js.map +1 -0
  502. package/dist/mapCheck/rules/regions.js +30 -0
  503. package/dist/mapCheck/rules/regions.js.map +1 -0
  504. package/dist/mapCheck/rules/targets.js +31 -0
  505. package/dist/mapCheck/rules/targets.js.map +1 -0
  506. package/dist/mapCheck/rules/walking.js +45 -0
  507. package/dist/mapCheck/rules/walking.js.map +1 -0
  508. package/dist/mapCheck.d.ts +2 -2
  509. package/dist/mapCheck.js +63 -0
  510. package/dist/mapCheck.js.map +1 -0
  511. package/dist/mapFields.d.ts +25 -2
  512. package/dist/mapFields.js +134 -0
  513. package/dist/mapFields.js.map +1 -0
  514. package/dist/mapFile.js +176 -0
  515. package/dist/mapFile.js.map +1 -0
  516. package/dist/mapMeasure.d.ts +8 -0
  517. package/dist/mapMeasure.js +283 -0
  518. package/dist/mapMeasure.js.map +1 -0
  519. package/dist/mapMerge.d.ts +1 -0
  520. package/dist/mapMerge.js +172 -0
  521. package/dist/mapMerge.js.map +1 -0
  522. package/dist/mapObjectives.js +138 -0
  523. package/dist/mapObjectives.js.map +1 -0
  524. package/dist/mapObjects.js +80 -0
  525. package/dist/mapObjects.js.map +1 -0
  526. package/dist/math.d.ts +37 -7
  527. package/dist/math.js +155 -0
  528. package/dist/math.js.map +1 -0
  529. package/dist/messages.d.ts +71 -4
  530. package/dist/messages.js +29 -0
  531. package/dist/messages.js.map +1 -0
  532. package/dist/missionRules.d.ts +10 -2
  533. package/dist/{missionRules-C-bGxm0Q.js → missionRules.js} +30 -150
  534. package/dist/missionRules.js.map +1 -0
  535. package/dist/mods.d.ts +39 -20
  536. package/dist/mods.js +271 -0
  537. package/dist/mods.js.map +1 -0
  538. package/dist/moves.d.ts +87 -0
  539. package/dist/moves.js +539 -0
  540. package/dist/moves.js.map +1 -0
  541. package/dist/names.d.ts +7 -0
  542. package/dist/names.js +122 -0
  543. package/dist/names.js.map +1 -0
  544. package/dist/navigation/agentParams.js +14 -0
  545. package/dist/navigation/agentParams.js.map +1 -0
  546. package/dist/navigation/air.d.ts +7 -3
  547. package/dist/navigation/air.js +401 -0
  548. package/dist/navigation/air.js.map +1 -0
  549. package/dist/navigation/builds.d.ts +34 -2
  550. package/dist/navigation/builds.js +287 -0
  551. package/dist/navigation/builds.js.map +1 -0
  552. package/dist/navigation/groundAreas.d.ts +59 -1
  553. package/dist/navigation/groundAreas.js +407 -0
  554. package/dist/navigation/groundAreas.js.map +1 -0
  555. package/dist/navigation/navigation.d.ts +98 -9
  556. package/dist/navigation/recast.d.ts +194 -18
  557. package/dist/navigation/recast.js +1379 -0
  558. package/dist/navigation/recast.js.map +1 -0
  559. package/dist/navigation/sidePaths.d.ts +8 -3
  560. package/dist/navigation/sidePaths.js +241 -0
  561. package/dist/navigation/sidePaths.js.map +1 -0
  562. package/dist/navigation/sized.js +243 -0
  563. package/dist/navigation/sized.js.map +1 -0
  564. package/dist/nearest.js +32 -0
  565. package/dist/nearest.js.map +1 -0
  566. package/dist/noise.js +59 -0
  567. package/dist/noise.js.map +1 -0
  568. package/dist/objectives.d.ts +12 -3
  569. package/dist/objectives.js +144 -0
  570. package/dist/objectives.js.map +1 -0
  571. package/dist/orders/basic.d.ts +5 -5
  572. package/dist/orders/basic.js +417 -0
  573. package/dist/orders/basic.js.map +1 -0
  574. package/dist/orders/build.js +278 -0
  575. package/dist/orders/build.js.map +1 -0
  576. package/dist/orders/cast.d.ts +13 -3
  577. package/dist/orders/cast.js +558 -0
  578. package/dist/orders/cast.js.map +1 -0
  579. package/dist/orders/facts.js +16 -0
  580. package/dist/orders/facts.js.map +1 -0
  581. package/dist/orders/harvest.d.ts +21 -5
  582. package/dist/orders/harvest.js +540 -0
  583. package/dist/orders/harvest.js.map +1 -0
  584. package/dist/orders/idle.d.ts +3 -1
  585. package/dist/orders/idle.js +234 -0
  586. package/dist/orders/idle.js.map +1 -0
  587. package/dist/orders/items.js +92 -0
  588. package/dist/orders/items.js.map +1 -0
  589. package/dist/orders/queue.js +108 -0
  590. package/dist/orders/queue.js.map +1 -0
  591. package/dist/orders/waiting.d.ts +39 -0
  592. package/dist/orders/waiting.js +149 -0
  593. package/dist/orders/waiting.js.map +1 -0
  594. package/dist/pack.schema.js +13 -0
  595. package/dist/pack.schema.js.map +1 -0
  596. package/dist/pack.schema.json +7622 -841
  597. package/dist/packs/director/index.d.ts +13 -5
  598. package/dist/packs/director/index.js +204 -0
  599. package/dist/packs/director/index.js.map +1 -0
  600. package/dist/packs/heroes/campaign.d.ts +3 -2
  601. package/dist/packs/heroes/campaign.js +241 -0
  602. package/dist/packs/heroes/campaign.js.map +1 -0
  603. package/dist/packs/heroes/carry.d.ts +6 -0
  604. package/dist/packs/heroes/carry.js +112 -0
  605. package/dist/packs/heroes/carry.js.map +1 -0
  606. package/dist/packs/heroes/commands.js +115 -0
  607. package/dist/packs/heroes/commands.js.map +1 -0
  608. package/dist/packs/heroes/fallen.d.ts +43 -0
  609. package/dist/packs/heroes/fallen.js +61 -0
  610. package/dist/packs/heroes/fallen.js.map +1 -0
  611. package/dist/packs/heroes/hire.js +60 -0
  612. package/dist/packs/heroes/hire.js.map +1 -0
  613. package/dist/packs/heroes/index.d.ts +7 -6
  614. package/dist/packs/heroes/index.js +130 -0
  615. package/dist/packs/heroes/index.js.map +1 -0
  616. package/dist/packs/heroes/loop.d.ts +95 -0
  617. package/dist/packs/heroes/loop.js +250 -0
  618. package/dist/packs/heroes/loop.js.map +1 -0
  619. package/dist/packs/heroes/making.d.ts +6 -3
  620. package/dist/packs/heroes/making.js +55 -0
  621. package/dist/packs/heroes/making.js.map +1 -0
  622. package/dist/packs/heroes/respawn.d.ts +3 -3
  623. package/dist/packs/heroes/respawn.js +87 -0
  624. package/dist/packs/heroes/respawn.js.map +1 -0
  625. package/dist/packs/heroes/sets.d.ts +32 -0
  626. package/dist/packs/heroes/sets.js +51 -0
  627. package/dist/packs/heroes/sets.js.map +1 -0
  628. package/dist/packs/heroes/spells.d.ts +16 -0
  629. package/dist/packs/heroes/spells.js +269 -0
  630. package/dist/packs/heroes/spells.js.map +1 -0
  631. package/dist/packs/items/defaults.d.ts +43 -0
  632. package/dist/packs/items/defaults.js +1504 -0
  633. package/dist/packs/items/defaults.js.map +1 -0
  634. package/dist/packs/items/index.d.ts +27 -0
  635. package/dist/packs/items/index.js +214 -0
  636. package/dist/packs/items/index.js.map +1 -0
  637. package/dist/packs/moba/index.d.ts +3 -3
  638. package/dist/packs/moba/index.js +174 -0
  639. package/dist/packs/moba/index.js.map +1 -0
  640. package/dist/packs/pack.d.ts +15 -15
  641. package/dist/packs/pack.js +14 -0
  642. package/dist/packs/pack.js.map +1 -0
  643. package/dist/packs.d.ts +15 -7
  644. package/dist/packs.js +222 -0
  645. package/dist/packs.js.map +1 -0
  646. package/dist/paths.d.ts +2 -0
  647. package/dist/paths.js +109 -0
  648. package/dist/paths.js.map +1 -0
  649. package/dist/plain.js +57 -0
  650. package/dist/plain.js.map +1 -0
  651. package/dist/player.d.ts +33 -10
  652. package/dist/player.js +159 -0
  653. package/dist/player.js.map +1 -0
  654. package/dist/portals.d.ts +1 -1
  655. package/dist/portals.js +194 -0
  656. package/dist/portals.js.map +1 -0
  657. package/dist/prefabs.d.ts +25 -2
  658. package/dist/prefabs.js +239 -0
  659. package/dist/prefabs.js.map +1 -0
  660. package/dist/presetBuildings.js +58 -0
  661. package/dist/presetBuildings.js.map +1 -0
  662. package/dist/presetFoliage.d.ts +27 -0
  663. package/dist/presetFoliage.js +98 -0
  664. package/dist/presetFoliage.js.map +1 -0
  665. package/dist/presetGround.js +65 -0
  666. package/dist/presetGround.js.map +1 -0
  667. package/dist/proxies.d.ts +12 -0
  668. package/dist/proxies.js +79 -0
  669. package/dist/proxies.js.map +1 -0
  670. package/dist/query.d.ts +56 -0
  671. package/dist/query.js +88 -0
  672. package/dist/query.js.map +1 -0
  673. package/dist/races.d.ts +15 -14
  674. package/dist/races.js +172 -0
  675. package/dist/races.js.map +1 -0
  676. package/dist/randomGroups.js +91 -0
  677. package/dist/randomGroups.js.map +1 -0
  678. package/dist/registry.d.ts +117 -53
  679. package/dist/registry.js +323 -0
  680. package/dist/registry.js.map +1 -0
  681. package/dist/remains.d.ts +11 -9
  682. package/dist/remains.js +188 -0
  683. package/dist/remains.js.map +1 -0
  684. package/dist/replication.d.ts +12 -7
  685. package/dist/replication.js +100 -0
  686. package/dist/replication.js.map +1 -0
  687. package/dist/rng.d.ts +2 -0
  688. package/dist/rng.js +40 -0
  689. package/dist/rng.js.map +1 -0
  690. package/dist/rules.d.ts +186 -99
  691. package/dist/rules.js +179 -0
  692. package/dist/rules.js.map +1 -0
  693. package/dist/rulesCheck.d.ts +5 -4
  694. package/dist/rulesCheck.js +693 -0
  695. package/dist/rulesCheck.js.map +1 -0
  696. package/dist/runes.d.ts +2 -2
  697. package/dist/runes.js +80 -0
  698. package/dist/runes.js.map +1 -0
  699. package/dist/save.d.ts +37 -12
  700. package/dist/save.js +532 -0
  701. package/dist/save.js.map +1 -0
  702. package/dist/scenario.d.ts +2 -2
  703. package/dist/scenario.js +99 -0
  704. package/dist/scenario.js.map +1 -0
  705. package/dist/scheduler.d.ts +3 -0
  706. package/dist/scheduler.js +156 -0
  707. package/dist/scheduler.js.map +1 -0
  708. package/dist/score.d.ts +19 -19
  709. package/dist/score.js +709 -0
  710. package/dist/score.js.map +1 -0
  711. package/dist/sequences.d.ts +10 -6
  712. package/dist/sequences.js +206 -0
  713. package/dist/sequences.js.map +1 -0
  714. package/dist/server/doorman.js +154 -0
  715. package/dist/server/doorman.js.map +1 -0
  716. package/dist/server/gameServer.d.ts +16 -1
  717. package/dist/server/gameServer.js +643 -0
  718. package/dist/server/gameServer.js.map +1 -0
  719. package/dist/server/index.d.ts +1 -1
  720. package/dist/server/lobby.js +199 -0
  721. package/dist/server/lobby.js.map +1 -0
  722. package/dist/server/log.js +18 -0
  723. package/dist/server/log.js.map +1 -0
  724. package/dist/server/match.js +267 -0
  725. package/dist/server/match.js.map +1 -0
  726. package/dist/server/mode.d.ts +18 -9
  727. package/dist/server/mode.js +220 -0
  728. package/dist/server/mode.js.map +1 -0
  729. package/dist/{navigation-worker.js → server/navigation-worker.js} +1 -1
  730. package/dist/server/navigation-worker.js.map +1 -0
  731. package/dist/server/navigation.js +39 -0
  732. package/dist/server/navigation.js.map +1 -0
  733. package/dist/server/ops.d.ts +4 -0
  734. package/dist/server/ops.js +137 -0
  735. package/dist/server/ops.js.map +1 -0
  736. package/dist/server/packs.d.ts +3 -3
  737. package/dist/server/packs.js +32 -0
  738. package/dist/server/packs.js.map +1 -0
  739. package/dist/server/ratings.d.ts +5 -0
  740. package/dist/server/ratings.js +104 -0
  741. package/dist/server/ratings.js.map +1 -0
  742. package/dist/server/relay.d.ts +12 -2
  743. package/dist/server/relay.js +144 -0
  744. package/dist/server/relay.js.map +1 -0
  745. package/dist/server/rooms.d.ts +9 -2
  746. package/dist/server/rooms.js +442 -0
  747. package/dist/server/rooms.js.map +1 -0
  748. package/dist/server/seat.js +116 -0
  749. package/dist/server/seat.js.map +1 -0
  750. package/dist/server/seatSettings.d.ts +3 -3
  751. package/dist/server/seatSettings.js +63 -0
  752. package/dist/server/seatSettings.js.map +1 -0
  753. package/dist/server/secret.js +13 -0
  754. package/dist/server/secret.js.map +1 -0
  755. package/dist/server/start.d.ts +13 -6
  756. package/dist/server/start.js +76 -0
  757. package/dist/server/start.js.map +1 -0
  758. package/dist/server/websocket.d.ts +9 -1
  759. package/dist/server/websocket.js +306 -0
  760. package/dist/server/websocket.js.map +1 -0
  761. package/dist/server.js +15 -2861
  762. package/dist/session/can.js +26 -0
  763. package/dist/session/can.js.map +1 -0
  764. package/dist/session/commandReplay.d.ts +8 -2
  765. package/dist/session/commandReplay.js +293 -0
  766. package/dist/session/commandReplay.js.map +1 -0
  767. package/dist/session/debug.js +151 -0
  768. package/dist/session/debug.js.map +1 -0
  769. package/dist/session/delay.js +62 -0
  770. package/dist/session/delay.js.map +1 -0
  771. package/dist/session/delta.d.ts +14 -1
  772. package/dist/session/delta.js +407 -0
  773. package/dist/session/delta.js.map +1 -0
  774. package/dist/session/entityState.js +415 -0
  775. package/dist/session/entityState.js.map +1 -0
  776. package/dist/session/local.d.ts +47 -5
  777. package/dist/session/local.js +670 -0
  778. package/dist/session/local.js.map +1 -0
  779. package/dist/session/memory.d.ts +20 -2
  780. package/dist/session/memory.js +131 -0
  781. package/dist/session/memory.js.map +1 -0
  782. package/dist/session/protocol.d.ts +325 -31
  783. package/dist/session/protocol.js +55 -0
  784. package/dist/session/protocol.js.map +1 -0
  785. package/dist/session/remote.d.ts +74 -12
  786. package/dist/session/remote.js +1394 -0
  787. package/dist/session/remote.js.map +1 -0
  788. package/dist/session/replay.d.ts +11 -2
  789. package/dist/session/replay.js +160 -0
  790. package/dist/session/replay.js.map +1 -0
  791. package/dist/session/seed.js +12 -0
  792. package/dist/session/seed.js.map +1 -0
  793. package/dist/session/share.d.ts +5 -1
  794. package/dist/session/share.js +94 -0
  795. package/dist/session/share.js.map +1 -0
  796. package/dist/session/socket.d.ts +1 -1
  797. package/dist/session/socket.js +29 -0
  798. package/dist/session/socket.js.map +1 -0
  799. package/dist/session/wire.d.ts +5 -0
  800. package/dist/session/wire.js +84 -0
  801. package/dist/session/wire.js.map +1 -0
  802. package/dist/session/worker.d.ts +77 -12
  803. package/dist/session/worker.js +499 -0
  804. package/dist/session/worker.js.map +1 -0
  805. package/dist/shared.d.ts +31 -5
  806. package/dist/shared.js +166 -0
  807. package/dist/shared.js.map +1 -0
  808. package/dist/sides.d.ts +9 -3
  809. package/dist/sides.js +149 -0
  810. package/dist/sides.js.map +1 -0
  811. package/dist/sight.js +85 -0
  812. package/dist/sight.js.map +1 -0
  813. package/dist/simulate-worker.js +1 -1
  814. package/dist/simulate.d.ts +12 -8
  815. package/dist/{simulate-oXBiw1Ff.js → simulate.js} +10 -11
  816. package/dist/simulate.js.map +1 -0
  817. package/dist/smart.js +77 -0
  818. package/dist/smart.js.map +1 -0
  819. package/dist/spatial.d.ts +32 -16
  820. package/dist/spatial.js +234 -0
  821. package/dist/spatial.js.map +1 -0
  822. package/dist/spawning.d.ts +1 -0
  823. package/dist/spawning.js +224 -0
  824. package/dist/spawning.js.map +1 -0
  825. package/dist/stances.d.ts +6 -3
  826. package/dist/stances.js +169 -0
  827. package/dist/stances.js.map +1 -0
  828. package/dist/start.d.ts +10 -10
  829. package/dist/start.js +75 -0
  830. package/dist/start.js.map +1 -0
  831. package/dist/stats.d.ts +42 -16
  832. package/dist/stats.js +290 -0
  833. package/dist/stats.js.map +1 -0
  834. package/dist/summoned.d.ts +52 -0
  835. package/dist/summoned.js +38 -0
  836. package/dist/summoned.js.map +1 -0
  837. package/dist/summons.d.ts +10 -13
  838. package/dist/summons.js +271 -0
  839. package/dist/summons.js.map +1 -0
  840. package/dist/systems/abilities.js +224 -0
  841. package/dist/systems/abilities.js.map +1 -0
  842. package/dist/systems/combat.d.ts +35 -1
  843. package/dist/systems/combat.js +677 -0
  844. package/dist/systems/combat.js.map +1 -0
  845. package/dist/systems/combatTold.d.ts +3 -1
  846. package/dist/systems/combatTold.js +85 -0
  847. package/dist/systems/combatTold.js.map +1 -0
  848. package/dist/systems/construction.js +80 -0
  849. package/dist/systems/construction.js.map +1 -0
  850. package/dist/systems/economy.d.ts +0 -6
  851. package/dist/systems/economy.js +128 -0
  852. package/dist/systems/economy.js.map +1 -0
  853. package/dist/systems/fog.d.ts +1 -1
  854. package/dist/systems/fog.js +120 -0
  855. package/dist/systems/fog.js.map +1 -0
  856. package/dist/systems/life.js +32 -0
  857. package/dist/systems/life.js.map +1 -0
  858. package/dist/systems/movement.d.ts +24 -12
  859. package/dist/systems/movement.js +1247 -0
  860. package/dist/systems/movement.js.map +1 -0
  861. package/dist/systems/orders.js +64 -0
  862. package/dist/systems/orders.js.map +1 -0
  863. package/dist/systems/production.js +322 -0
  864. package/dist/systems/production.js.map +1 -0
  865. package/dist/systems/productionQueue.js +120 -0
  866. package/dist/systems/productionQueue.js.map +1 -0
  867. package/dist/systems/victory.d.ts +1 -1
  868. package/dist/systems/victory.js +56 -0
  869. package/dist/systems/victory.js.map +1 -0
  870. package/dist/talk.d.ts +6 -6
  871. package/dist/talk.js +153 -0
  872. package/dist/talk.js.map +1 -0
  873. package/dist/targeting.d.ts +142 -0
  874. package/dist/targeting.js +49 -0
  875. package/dist/targeting.js.map +1 -0
  876. package/dist/tech.d.ts +20 -3
  877. package/dist/tech.js +239 -0
  878. package/dist/tech.js.map +1 -0
  879. package/dist/techTree.d.ts +7 -0
  880. package/dist/techTree.js +90 -0
  881. package/dist/techTree.js.map +1 -0
  882. package/dist/terrain.d.ts +59 -7
  883. package/dist/terrain.js +389 -0
  884. package/dist/terrain.js.map +1 -0
  885. package/dist/terrainSave.d.ts +6 -0
  886. package/dist/terrainSave.js +74 -0
  887. package/dist/terrainSave.js.map +1 -0
  888. package/dist/testing.d.ts +8 -7
  889. package/dist/testing.js +13 -739
  890. package/dist/testing.js.map +1 -1
  891. package/dist/tiles.d.ts +1 -1
  892. package/dist/tiles.js +43 -0
  893. package/dist/tiles.js.map +1 -0
  894. package/dist/timers.d.ts +29 -4
  895. package/dist/timers.js +242 -0
  896. package/dist/timers.js.map +1 -0
  897. package/dist/tomes.d.ts +4 -4
  898. package/dist/tomes.js +94 -0
  899. package/dist/tomes.js.map +1 -0
  900. package/dist/trade.js +103 -0
  901. package/dist/trade.js.map +1 -0
  902. package/dist/transport.d.ts +6 -1
  903. package/dist/transport.js +281 -0
  904. package/dist/transport.js.map +1 -0
  905. package/dist/tunables.d.ts +10 -3
  906. package/dist/tunables.js +56 -0
  907. package/dist/tunables.js.map +1 -0
  908. package/dist/unitResources.d.ts +67 -0
  909. package/dist/unitResources.js +266 -0
  910. package/dist/unitResources.js.map +1 -0
  911. package/dist/upkeep.d.ts +6 -1
  912. package/dist/upkeep.js +26 -0
  913. package/dist/upkeep.js.map +1 -0
  914. package/dist/veterancy.d.ts +8 -3
  915. package/dist/veterancy.js +131 -0
  916. package/dist/veterancy.js.map +1 -0
  917. package/dist/vision.d.ts +36 -0
  918. package/dist/vision.js +133 -0
  919. package/dist/vision.js.map +1 -0
  920. package/dist/walls.d.ts +1 -1
  921. package/dist/walls.js +278 -0
  922. package/dist/walls.js.map +1 -0
  923. package/dist/world.d.ts +606 -88
  924. package/dist/world.js +1263 -0
  925. package/dist/world.js.map +1 -0
  926. package/package.json +2 -2
  927. package/dist/ai.js.map +0 -1
  928. package/dist/attributes.d.ts +0 -66
  929. package/dist/brain-BvVdUhX8.js +0 -7659
  930. package/dist/brain-BvVdUhX8.js.map +0 -1
  931. package/dist/builds-C6LfgvEU.js +0 -460
  932. package/dist/builds-C6LfgvEU.js.map +0 -1
  933. package/dist/coreComponents-syuh2fPG.js +0 -5149
  934. package/dist/coreComponents-syuh2fPG.js.map +0 -1
  935. package/dist/debugCommands-CzjrSm66.js +0 -14739
  936. package/dist/debugCommands-CzjrSm66.js.map +0 -1
  937. package/dist/determinism-BCymQwiE.js +0 -518
  938. package/dist/determinism-BCymQwiE.js.map +0 -1
  939. package/dist/game-DiJEN-Ks.js +0 -5800
  940. package/dist/game-DiJEN-Ks.js.map +0 -1
  941. package/dist/index.js.map +0 -1
  942. package/dist/inspect-D9dWHmZ0.js.map +0 -1
  943. package/dist/local-Dkovq42k.js +0 -1379
  944. package/dist/local-Dkovq42k.js.map +0 -1
  945. package/dist/missionRules-C-bGxm0Q.js.map +0 -1
  946. package/dist/navigation-worker.js.map +0 -1
  947. package/dist/packs-g5thvmGn.js +0 -3199
  948. package/dist/packs-g5thvmGn.js.map +0 -1
  949. package/dist/profiles-B3NS9jwk.js.map +0 -1
  950. package/dist/server.js.map +0 -1
  951. package/dist/simulate-oXBiw1Ff.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"micro.js","names":[],"sources":["../../src/ai/micro.ts"],"sourcesContent":["import { type AbilityDef, anyEffect, at, baseStats, declaredAt, lowerChain, supplyOf, type UnitTypeDef } from '#engine/defs'\nimport { AIM_KINDS } from '#engine/targeting'\nimport { farthestReach } from '#engine/attacks'\nimport type { AiArea } from './area'\nimport type { AiReport } from './report'\nimport { snapshotOf } from '#engine/components'\nimport type { PlayerId } from '#engine/entity'\nimport { shopStock } from '#engine/items'\nimport { inventorySlots } from '#engine/inventory'\nimport { distSq, type Vec2 } from '#engine/math'\nimport type { Registry } from '#engine/registry'\nimport type { EntityState, LearnableInfo, Snapshot } from '#engine/session/protocol'\nimport type { Brain } from './brain'\nimport { type AiModule, type AiModuleDef, defineModule } from './module'\nimport { orderKey } from './checks'\nimport { type AiCondition, evaluate } from './rules'\nimport { type Squad } from './squads'\nimport { defineTask, type TaskDef } from './task'\nimport { UnitSet } from './view'\nimport { heroOfState } from '#engine/hero'\nimport { an, pair, point, where } from './geometry'\nimport { ENGAGED, FIGHT_REACH } from './reach'\n\n/*\n * Micro (AI plan, C2): the fight itself, once a squad is in one. The squads (C1) say where the army goes and watch\n * that it gets there; what each unit does once the swords are out was one rule for everyone (hit the caster, then the\n * weakest) and nothing else: no one stepped back, no one ran, no one bought anything, a catapult shot whatever stood\n * nearest. This file is what a player's hands do during a fight, and it never changes what a squad was told to do:\n *\n * - **Focus fire** (`targets`): all of a squad on one rival at a time, the one worth most. Damage spread over ten\n * units kills none of them for a long while; the same damage on one kills it at once, and a dead unit deals no\n * damage. Who is worth most is a ranked list of rules (casters, then heroes, then whoever is weakest; a game's\n * own: workers, a type by name, a condition), or a function of the game's. Chosen again every few seconds, or when\n * the target falls, and queued with the squad's errand so the units go on with it after.\n * - **Kiting** (`kite`): a ranged unit closed on by a melee one it can outrun steps back as far as its own reach, then\n * shoots again. A footman has to catch a rifleman to hurt it; a rifleman has to stand still only to shoot. Only from\n * what it is faster than: stepping back from something as fast as itself trades its shots for a walk and nothing\n * else (measured: riflemen kiting footmen of the same speed lost more fights than they won). Within the squad's\n * spread and no more than once in a while, so that the squad neither scatters nor stutters.\n * - **Fleeing** (`unitsFlee`, `heroesFlee`, `returnAt`): a unit about to die leaves the fight for the nearest safe\n * building of its own, and comes back once healed (or, with nothing to heal it, once safe). It leaves its squad for\n * the micro module's own `fleeing` squad, so the squad's task goes on without it (the classic Units Flee, Heroes\n * Flee); `removeInjuries` sends the hurt home to heal between fights, `ignoreInjured` keeps them out until healed.\n * - **Spells** (`spells`): an ability that has to be aimed is used where it does most: on the hurt friend, on the knot\n * of enemies, on the nearest foe, as its effects say (the ability's own `ai` first, then the brain's `spells` map,\n * then what the kit works out from the effects). What is on autocast looks after itself.\n * - **Items** (`takeItems`, `buyItems`, `shopping`): a potion is drunk when it is needed, what lies about is picked up,\n * and a hero with nothing to do walks to a shop in reach for what its list says.\n * - **Mercenaries** (`hireUnits`, `hiring`): with money to spare and supply free, a hero (or a fighter) with nothing to\n * do walks to a place that hires in reach (a tavern, a mercenary camp: `UnitTypeDef.hires`) and hires there what its\n * list says, or the strongest for its price.\n * - **Siege** (`smartArtillery`): a siege unit shoots buildings when there are any in reach and nothing threatens it,\n * and is kept behind its squad's middle.\n * - **Heroes** (`heroes`): which hero to make next and which skill it learns next, as a list or a function.\n *\n * Every knob has a data form (`MicroOptions`, plain JSON on the brain's definition or the seat's options) and a\n * function form. What the module remembers (who each squad hits, who fled where, who kited when, who shops for what)\n * is plain data in the brain's memory (`BrainMemory.micro`), so a save keeps it.\n */\n\n/** Seconds a squad keeps hitting the one it was told to, before it is chosen again */\nconst FOCUS_EVERY = 4\n/** Seconds between two steps back of one unit: what keeps a kiting unit from stuttering */\nconst KITE_EVERY = 3\n/** How near a melee foe comes, past its own reach, before a ranged unit steps back */\nconst KITE_CLOSE = 3\n/** How much faster than the foe a unit is to step back from it: as fast is not enough, the foe is on it again as it stops */\nconst KITE_FASTER = 1.05\n/** How far from the middle of its squad a kiting unit may step, past the squad's spread */\nconst KITE_LEASH = 1\n/** The odds under which a unit does not bother kiting: its squad falls back, or fights on to the last */\nconst KITE_ODDS = 0.3\n/** Seconds between two orders of a siege unit */\nconst SIEGE_EVERY = 4\n/** How near a siege unit a foe is for the unit to be threatened: it shoots what threatens it, not buildings */\nconst SIEGE_THREATENED = 6\n/** How far behind the squad's middle a siege unit ahead of it is sent */\nconst SIEGE_BEHIND = 3\n/** Seconds a fled unit with nothing to heal it waits in safety before it is back */\nconst FLEE_SAFE = 8\n/**\n * Seconds of its own healing a fled unit is worth waiting for: one that would take longer to be back at `returnAt` (a\n * trickle of regeneration) is as one nothing heals, and comes back once safe, rather than sitting out the game\n */\nconst HEAL_WAIT = 60\n/** How far a unit with nowhere safe to go runs from the fight */\nconst FLEE_AWAY = 20\n/** How near a destination a fleeing unit is there */\nconst FLEE_ARRIVE = 4\n/** Seconds before a fleeing unit standing idle short of its destination is sent again */\nconst FLEE_RESEND = 3\n/** How far a shop may be for a hero to walk to it: not across the map */\nconst SHOP_REACH = 60\n/** How near a shop a hero is at it: the engine's shop range (6), a little in */\nconst AT_SHOP = 5\n/** How important an item is to the purse: under a hero (35), over what can wait */\nconst SHOPPING_PRIORITY = 20\n/** How important a mercenary is to the purse: under an item, over the soldiers trained (0) */\nconst HIRING_PRIORITY = 10\n/** Money to have left over before hiring of itself (the kit's choice): a mercenary is bought with what would lie idle */\nconst HIRING_SPARE = 150\n/** Mercenaries it keeps at the most, of the kit's choice */\nconst HIRING_MOST = 4\n/** How near an item lying about a unit picks it up */\nconst PICK_UP = 10\n/** The share of its health under which a unit drinks what heals, and of its mana under which it drinks what restores */\nconst DRINK_HEALTH = 0.45\nconst DRINK_MANA = 0.25\n/** The squad the micro module keeps the units that fled in */\nconst FLEEING = 'fleeing'\n/** Whose the fleeing squad is */\nconst OWNER = 'micro'\n/**\n * What a computer player sees as it weighs an ability, for the ability's `ai` to decide with (`AbilityDef.ai`)\n *\n * @beta\n */\nexport interface AbilityAiView {\n\t/** The picture of the game the computer player has, as its seat sees it */\n\tsnapshot: Snapshot\n\t/** The registry of the game's definitions, for looking up unit types, abilities and buffs */\n\tregistry: Registry\n\t/** The player whose computer is weighing the ability */\n\tplayerId: PlayerId\n\t/** Enemy units it sees, near enough to the caster to matter */\n\tenemies: EntityState[]\n\t/** Its own and allied units that fight, near the caster */\n\tfriends: EntityState[]\n}\n\n/**\n * One rule of who is worth hitting first (`MicroOptions.targets`): what it picks out, how much it adds, when it counts.\n * Plain data\n *\n * @beta\n */\nexport interface TargetRule {\n\t/**\n\t * What it picks out: a role (`caster`, `hero`, `siege`, `worker`, `healer`), `building`, a tag (`ranged`, the game's\n\t * own), or a unit type by id\n\t */\n\tmatch: string\n\t/** What it adds to the worth of what it picks out: 1 when left out. Rules add up; a foe no rule names is worth 1 */\n\tweight?: number\n\t/** When it counts: a condition (`AiCondition`, as data or a function). Always when left out */\n\twhen?: AiCondition\n}\n\n/**\n * Who a squad hits, in code (`MicroOptions.targets`): of the foes in its fight, the one; nothing to leave the units to\n * themselves this time\n *\n * @beta\n */\nexport type TargetPicker = (ai: Brain, squad: Squad, foes: UnitSet) => EntityState | undefined\n\n/**\n * Where to use an ability, in code (`MicroOptions.spells`, by ability id): where (`point`) and on whom (`target`),\n * `null` for not now, `undefined` to leave it to what the kit works out from the effects. `foes` are the enemies within\n * the ability's reach of the caster, `friends` its own and its allies' fighters near it\n *\n * @beta\n */\nexport type SpellAim = (\n\tai: Brain,\n\tcaster: EntityState,\n\tfoes: readonly EntityState[],\n\tfriends: readonly EntityState[],\n\tlevel: number\n) => { point: Vec2; target?: number; to?: Vec2 } | null | undefined\n\n/**\n * A hero the brain means to have (`MicroOptions.heroes`): which, what it learns in what order, what it buys\n *\n * @beta\n */\nexport interface HeroPlan {\n\t/** The hero's unit type */\n\ttype: string\n\t/**\n\t * The order its skills are learned in, each level a line (`['stomp', 'holyLight', 'stomp', …]`); past the end, or\n\t * left out, the ultimate as soon as it can be had and then whatever is furthest behind. Or a function: the skill to\n\t * learn next of those it may, by id\n\t */\n\tskills?: string[] | ((ai: Brain, hero: EntityState, learnable: readonly LearnableInfo[]) => string | undefined)\n\t/** What it shops for, in place of the brain's `shopping` */\n\titems?: ShoppingItem[]\n\t/** The chance it is made at all, 0 to 1 (1 when left out): rolled once, with the brain's numbers, and remembered */\n\tchance?: number\n}\n\n/**\n * A line of a hero's shopping list (`MicroOptions.shopping`, `HeroPlan.items`): an item to carry, how many, when\n *\n * @beta\n */\nexport interface ShoppingItem {\n\t/** The item, by id */\n\titem: string\n\t/** How many of it to carry: 1 when left out */\n\tcount?: number\n\t/** When it is wanted: a condition. Always when left out */\n\twhen?: AiCondition\n}\n\n/**\n * A line of what a brain hires (`MicroOptions.hiring`): a unit a place hires out, how many of it to have, when\n *\n * @beta\n */\nexport interface HiringItem {\n\t/** The unit type, by id: one a place that hires lists (`UnitTypeDef.hires`) */\n\tunit: string\n\t/** How many of it to have: 1 when left out */\n\tcount?: number\n\t/** When it is wanted: a condition. Always when left out */\n\twhen?: AiCondition\n}\n\n/**\n * How a brain fights (`BrainDef.micro`, the seat's `AiOptions.micro` over it, the `micro()` module's own under both):\n * whom it hits first, whether its ranged units kite, when its units flee, how it casts, what it buys, how its siege is\n * used, which heroes it makes. Every field has a data form a save keeps; the function forms are the brain's to give\n * again\n *\n * @beta\n */\nexport interface MicroOptions {\n\t/**\n\t * Who is worth hitting first, as ranked rules (`TargetRule`), or a function that picks (`TargetPicker`). The kit's\n\t * when left out: casters 2, heroes 1.5 (with `targetHeroes`), siege 1, healers 2, over the type's declared\n\t * `UnitTypeDef.ai.priority`; among those alike, the weakest, the nearest\n\t */\n\ttargets?: TargetRule[] | TargetPicker\n\t/** Whether heroes are worth hitting first (the classic Target Heroes): yes when left out */\n\ttargetHeroes?: boolean\n\t/** Seconds a squad keeps hitting the rival it was told to before another is chosen: 4 */\n\tfocusEvery?: number\n\t/**\n\t * Whether ranged units step back from the melee closing on them, when they are the faster: `'ranged'` (or `true`)\n\t * when left out, `false` never\n\t */\n\tkite?: boolean | 'ranged'\n\t/** The share of its health under which a unit leaves the fight for safety (the classic Units Flee): 0.25. `false` never */\n\tunitsFlee?: number | false\n\t/** The same for heroes (Heroes Flee): 0.35. `false` never */\n\theroesFlee?: number | false\n\t/** The share of its health at which a unit that fled is back: 0.8 */\n\treturnAt?: number\n\t/** Whether the hurt go home to heal between fights, not only out of one (Remove Injuries): no when left out */\n\tremoveInjuries?: boolean\n\t/** Whether a unit that fled stays out until healed, however long (Ignore Injured): no when left out, so one nothing heals (or that heals too slowly to wait a minute for) comes back once safe */\n\tignoreInjured?: boolean\n\t/**\n\t * Where to use abilities, by ability id (`SpellAim`): before the ability's own `ai`, and before what the kit works\n\t * out from its effects. `false` casts nothing: what is on autocast looks after itself\n\t */\n\tspells?: Record<string, SpellAim> | false\n\t/** Whether a potion is drunk when it is needed: yes when left out */\n\tpotions?: boolean\n\t/** Whether what lies about is picked up (Take Items): yes when left out */\n\ttakeItems?: boolean\n\t/** Whether heroes buy from a shop in reach (Buy Items): yes when left out, where there is a shop and a list */\n\tbuyItems?: boolean\n\t/**\n\t * What a hero shops for, in order (`ShoppingItem`), or a function that names the item a hero should buy next (none\n\t * for nothing). The cheapest item whose ability heals, one of it, when left out; `false` nothing\n\t */\n\tshopping?: ShoppingItem[] | ((ai: Brain, hero: EntityState) => string | undefined) | false\n\t/** Whether it hires units at a place that hires in reach (a tavern, a mercenary camp: `UnitTypeDef.hires`): yes when left out, where there is one */\n\thireUnits?: boolean\n\t/**\n\t * What it hires, in order (`HiringItem`), or a function that names the unit to hire next of those a place offers (none\n\t * for nothing). When left out: no hero, the strongest soldier for its price, with money to spare (150 past it) and\n\t * supply free, four at the most. `false` nothing\n\t */\n\thiring?: HiringItem[] | ((ai: Brain, offered: readonly UnitTypeDef[]) => string | undefined) | false\n\t/** Whether siege units shoot buildings when they may and stay behind the squad (Smart Artillery): yes when left out */\n\tsmartArtillery?: boolean\n\t/**\n\t * The heroes to make, in order (`HeroPlan`: which, its skills, its items, a chance), or a function that picks the\n\t * next of those that could be made. The first that can be made, and the ultimate first, when left out\n\t */\n\theroes?: HeroPlan[] | ((ai: Brain, candidates: readonly UnitTypeDef[]) => UnitTypeDef | string | undefined)\n}\n\n/**\n * What the micro module remembers between thinks, as a save keeps it\n *\n * @beta\n */\nexport interface MicroMemory {\n\t/** The version of the memory's format: 1 so far */\n\tv: 1\n\t/** Whom each squad hits, by squad name: the foe and since when */\n\tfocus: Record<string, { target: number; since: number }>\n\t/** When each unit last stepped back, by unit id */\n\tkited: Record<string, number>\n\t/** Each unit that fled, by id: the squad it left, since when, where to, and why */\n\tfled: Record<string, { squad?: string; since: number; to: Vec2; why: 'hurt' | 'injured' }>\n\t/** What each siege unit was told to shoot, by unit id */\n\tsiege: Record<string, { target: number; since: number }>\n\t/** What each hero is on its way to buy, by hero id */\n\tshopping: Record<string, { shop: number; item: string; since: number }>\n\t/** Who is on their way to hire what, by the id of the unit sent: the place that hires, the unit type, since when */\n\thiring?: Record<string, { place: number; unit: string; since: number }>\n\t/** The chance of each hero plan as it was rolled, by its place in the list */\n\trolled: Record<string, boolean>\n}\n\n/**\n * The fights as the report shows them (`AiReport.micro`): each squad in one, its foes, its odds, whom it hits; the\n * units that fled; the heroes and what each learns next; who shops for what\n *\n * @beta\n */\nexport interface MicroReport {\n\t/** The fights, one for each squad in one, with its foes, its odds, whom it hits and its units that kited or shot a building this think */\n\tfights: {\n\t\tsquad: string\n\t\tfoes: number\n\t\todds: number\n\t\t/** Whom the squad hits: the foe, its type, since when */\n\t\ttarget?: { id: number; type: string; since: number }\n\t\t/** Its units that stepped back this think */\n\t\tkiting: number[]\n\t\t/** Its siege units told to shoot a building this think */\n\t\tsiege: number[]\n\t}[]\n\t/** The units that fled, each with its id, type, health, where to, since when and why */\n\tfleeing: { unit: number; type: string; health: number; to: [number, number]; since: number; why: 'hurt' | 'injured' }[]\n\t/** The heroes, each with its id, type, level and the ability it learns next */\n\theroes: { id: number; type: string; level: number; next?: string }[]\n\t/** The heroes on their way to buy, each with the hero's id, the item, the shop's id and since when */\n\tshopping: { hero: number; item: string; shop: number; since: number }[]\n\t/** Who is on their way to hire what: the unit sent, the place, the unit type, since when */\n\thiring: { by: number; place: number; unit: string; since: number }[]\n\t/** Abilities cast last think */\n\tcast: number\n\t/** Thinks whose fights it left alone, slips of its profile's `mistakes` */\n\tslipped?: number\n}\n\n/** The kit's rules of who is worth hitting first: casters, healers, heroes, siege; everyone else is worth 1 */\nconst DEFAULT_TARGETS: readonly TargetRule[] = [\n\t{ match: 'caster', weight: 2 },\n\t{ match: 'healer', weight: 2 },\n\t{ match: 'hero', weight: 1.5 },\n\t{ match: 'siege', weight: 1 }\n]\n\nconst percent = (share: number) => `${Math.round(share * 100)}%`\n\n/** A squad in a fight, as the module looks at it this think */\ninterface Fight {\n\tsquad: Squad\n\tunits: UnitSet\n\tmiddle: Vec2\n\tfoes: UnitSet\n\todds: number\n\ttarget?: EntityState\n\tkiting: number[]\n\tsiege: number[]\n}\n\n/** The parts of a think the module does, each once a think whoever asks first (the melee player's steps ask for some) */\ntype Part = 'fights' | 'spells' | 'items' | 'heroes'\n\n/**\n * A brain's micro (`ai.micro`): how its squads fight once in a fight, run by the `micro()` module each think after the\n * squads (`think`), and asked by whoever wants its judgement (`target`, `priority`, `nextHero`, `nextSkill`). Kept in\n * the brain's memory (`BrainMemory.micro`)\n *\n * @internal\n */\nexport class Micro implements AiArea {\n\t/** What finds it on a brain (`ai.area(Micro)`): made the first time a module asks for it */\n\tstatic readonly id = 'micro'\n\t/** Makes the micro of a brain; what `ai.area(Micro)` calls the first time a module asks for it */\n\tstatic make(ai: Brain): Micro {\n\t\treturn new Micro(ai)\n\t}\n\t/** Its id among the brain's areas: what its memory and its report are kept under */\n\treadonly id = 'micro'\n\t/** What the log says where a save's memory of it is of a shape it does not read */\n\treadonly afresh = 'the save remembers how the computer player was fighting in a shape this brain does not read: it fights afresh'\n\n\t/** What the module was made with, under the brain's settings */\n\tprivate configured: MicroOptions = {}\n\t/** Whether a `micro()` module is in the brain: without one, nothing here runs by itself, and the squads fight as units do */\n\tenabled = false\n\tprivate memory: MicroMemory = { v: 1, focus: {}, kited: {}, fled: {}, siege: {}, shopping: {}, rolled: {} }\n\tprivate fights: Fight[] = []\n\tprivate cast = 0\n\t/** Thinks its fights were left alone, a slip of its profile's `mistakes` */\n\tprivate slipped = 0\n\tprivate thoughtAt: Partial<Record<Part, number>> = {}\n\n\tconstructor(\n\t\t/** The brain it fights for */\n\t\treadonly ai: Brain\n\t) {\n\t\tai.squads.define(FLEE)\n\t}\n\n\t/** Puts the `micro()` module's options under the brain's settings: what the module is made with */\n\tconfigure(options: MicroOptions): void {\n\t\tthis.configured = options\n\t\tthis.enabled = true\n\t}\n\n\t/** How it fights: the module's options, the brain's settings over them (`ai.settings.micro`: when units and heroes flee, the flags) */\n\tget options(): MicroOptions {\n\t\treturn this.ai.cache('micro.options', () => ({ ...this.configured, ...this.ai.settings.micro }))\n\t}\n\n\t/** Whether the module fights for a squad: one on a task that fights (`TaskDef.fighting`), not told to be left alone (`SquadOptions.micro`) */\n\tmanages(squad: Squad): boolean {\n\t\tconst state = squad.current\n\t\treturn (\n\t\t\tthis.enabled && squad.options.micro !== false && !!state && state.done === undefined && this.ai.squads.taskDef(state.kind)?.fighting !== false\n\t\t)\n\t}\n\n\t/**\n\t * The whole think: the fights (focus fire, kiting, siege, fleeing), those that fled coming back, the spells, the\n\t * items, the heroes' skills. Each part once a think: a part the melee player's steps asked for already is not done again\n\t */\n\tthink(): void {\n\t\t// a slip (its profile's `mistakes`, drawn with its own numbers): this think's fights left to the units themselves.\n\t\t// Drawn as the think begins, not again on a pass that goes on with the fights (`ai.budget`)\n\t\tconst mistakes = this.ai.profile.mistakes ?? 0\n\t\tif (!this.fighting && mistakes > 0 && this.ai.rng.next() < mistakes) {\n\t\t\tthis.slipped++\n\t\t\tthis.done('fights')\n\t\t}\n\t\tif (!this.fight()) return\n\t\tthis.spells()\n\t\tthis.items()\n\t\tthis.heroes()\n\t}\n\n\t/**\n\t * The fights: each squad in one looked at, its units told whom to hit, stepped back, sent to shoot buildings, sent to\n\t * safety; and the fled coming back. The squads are looked at as many a tick as the budget has room for (F2,\n\t * `ai.budget`): false where it stopped for the tick with squads to go, to go on at the next over the same picture\n\t */\n\tfight(): boolean {\n\t\tconst { ai } = this\n\t\tconst { view } = ai\n\t\tif (!this.fighting) {\n\t\t\tif (!this.begin('fights')) return true\n\t\t\tthis.prune()\n\t\t\tthis.fights = []\n\t\t\t// what is remembered of squads that are no more, or out of their fight\n\t\t\tconst focused = this.memory.focus\n\t\t\tfor (const name in focused) {\n\t\t\t\tconst squad = ai.squads.named(name)\n\t\t\t\tif (!squad || !this.manages(squad)) delete focused[name]\n\t\t\t}\n\t\t\tthis.fighting = { squads: view.hostile.alive().length ? [...ai.squads.all()].filter((squad) => this.manages(squad)) : [], at: 0 }\n\t\t}\n\t\tconst hostile = view.hostile.alive()\n\t\tconst { squads } = this.fighting\n\t\tfor (; this.fighting.at < squads.length; this.fighting.at++) {\n\t\t\tconst looked = this.fightOf(squads[this.fighting.at], hostile)\n\t\t\tif (!ai.budget.spent(looked || 1) && this.fighting.at + 1 < squads.length) {\n\t\t\t\tthis.fighting.at++\n\t\t\t\tai.budget.later()\n\t\t\t\treturn false\n\t\t\t}\n\t\t}\n\t\tthis.fighting = undefined\n\t\tthis.injured()\n\t\tthis.back()\n\t\treturn true\n\t}\n\n\t/** One squad's fight, if it is in one: its units told whom to hit, stepped back, sent at buildings, sent to safety. Gives how many units were looked at */\n\tprivate fightOf(squad: Squad, hostile: UnitSet): number {\n\t\tconst { view } = this.ai\n\t\tconst focused = this.memory.focus\n\t\tconst units = squad.units()\n\t\tconst middle = units.centre()\n\t\tif (!middle) return 0\n\t\t// what the squad fights: the hostile units near it, and the buildings that shoot (a tower); not what sleeps\n\t\tconst foes = hostile.near(middle, FIGHT_REACH).where((entity, def) => !entity.asleep && (def.kind === 'unit' || !!def.attacks?.length))\n\t\tif (!foes.length) {\n\t\t\tdelete focused[squad.name]\n\t\t\treturn units.length\n\t\t}\n\t\tconst fight: Fight = { squad, units, middle, foes, odds: view.strength.odds(units, foes), kiting: [], siege: [] }\n\t\tthis.fights.push(fight)\n\t\tthis.flee(fight)\n\t\t// those that fled are out of the squad now: what follows orders the rest\n\t\tfight.units = squad.units()\n\t\tif (!fight.units.length) return units.length\n\t\tthis.siegeOf(fight)\n\t\tthis.kite(fight)\n\t\tthis.focus(fight)\n\t\treturn units.length\n\t}\n\n\t/** The squads still to be looked at for a fight this think, where a pass stopped for the tick's budget, and the next of them */\n\tprivate fighting: { squads: Squad[]; at: number } | undefined\n\n\t// ---- focus fire\n\n\t/**\n\t * How much a foe is worth hitting: what its type declares (`UnitTypeDef.ai.priority`, 1 when it says nothing) times\n\t * one and the weights of the rules that pick it out (`targets`, the kit's when none are given)\n\t */\n\tpriority(foe: EntityState): number {\n\t\tconst { view } = this.ai\n\t\tconst def = view.def(foe)\n\t\tlet worth = 1\n\t\tconst rules = Array.isArray(this.options.targets) ? this.options.targets : DEFAULT_TARGETS\n\t\tfor (const rule of rules) {\n\t\t\tif (rule.match === 'hero' && this.options.targetHeroes === false && !Array.isArray(this.options.targets)) continue\n\t\t\tif (!this.matches(rule.match, foe, def)) continue\n\t\t\tif (rule.when !== undefined && !evaluate(rule.when, this.ai)) continue\n\t\t\tworth += rule.weight ?? 1\n\t\t}\n\t\treturn (def.ai?.priority ?? 1) * worth\n\t}\n\n\t/** Whether a rule's word picks a foe out: `building`, a role, a tag, a type */\n\tprivate matches(match: string, foe: EntityState, def: UnitTypeDef): boolean {\n\t\tif (match === 'building') return def.kind === 'building'\n\t\tconst { roles } = this.ai.view\n\t\treturn foe.type === match || roles.has(foe.type, match) || roles.hasTag(foe.type, match)\n\t}\n\n\t/**\n\t * Whom a squad in a fight hits: the foe worth most (`priority`), the weakest among those alike (what falls soonest\n\t * deals no more damage), the nearest among those alike too; or what the game's picker says (`targets` as a function)\n\t */\n\ttarget(squad: Squad, foes: UnitSet): EntityState | undefined {\n\t\tif (typeof this.options.targets === 'function') return this.options.targets(this.ai, squad, foes)\n\t\tconst prey = this.preyOf(squad, foes)\n\t\tif (prey) return prey\n\t\tconst middle = squad.centre()\n\t\tif (!middle || !foes.length) return undefined\n\t\tlet best: EntityState | undefined\n\t\tlet most = -Infinity\n\t\tfor (const foe of foes) {\n\t\t\tconst stats = this.ai.view.strength.statsOf(foe)\n\t\t\tconst health = Math.max(0, Math.min(1, foe.health / Math.max(1, foe.maxHealth ?? stats.health)))\n\t\t\t// the nearest among those alike: a little, so that the weakest is still the weakest\n\t\t\tconst near = 1 - 0.2 * Math.min(1, Math.sqrt(distSq(foe, middle)) / FIGHT_REACH)\n\t\t\tconst score = this.priority(foe) * (2 - health) * near\n\t\t\tif (score > most) {\n\t\t\t\tmost = score\n\t\t\t\tbest = foe\n\t\t\t}\n\t\t}\n\t\treturn best\n\t}\n\n\t/**\n\t * What the squad's task wants hit first, where it is among the foes: a harass's worker (`TaskState.memory.prey`). The\n\t * task names it and the micro module, fighting for the squad, sends the order: one of them, not both, or the units are\n\t * told the same twice\n\t */\n\tprivate preyOf(squad: Squad, foes: UnitSet): EntityState | undefined {\n\t\tconst prey = squad.current?.memory.prey\n\t\treturn typeof prey === 'number' ? foes.find((foe) => foe.id === prey) : undefined\n\t}\n\n\t/**\n\t * All of a squad on one rival: chosen again once it fell or every `focusEvery` seconds, the units within reach of it\n\t * told to attack it, and then, queued, to go on with the squad's errand. The healers are left to their spells, the\n\t * siege to its buildings, what stepped back this think to its step\n\t */\n\tprivate focus(fight: Fight): void {\n\t\tconst { ai } = this\n\t\tconst { squad, foes, units } = fight\n\t\tconst every = (this.options.focusEvery ?? FOCUS_EVERY) * ai.session.tickRate\n\t\tconst kept = this.memory.focus[squad.name]\n\t\tconst current = kept && foes.find((foe) => foe.id === kept.target)\n\t\t// the task's prey (a harass's worker) goes before the one kept\n\t\tconst prey = this.preyOf(squad, foes)\n\t\tif (current && ai.tick - kept.since < every && (!prey || prey.id === current.id)) {\n\t\t\tfight.target = current\n\t\t\treturn\n\t\t}\n\t\tconst target = this.target(squad, foes)\n\t\tif (!target) {\n\t\t\tdelete this.memory.focus[squad.name]\n\t\t\treturn\n\t\t}\n\t\tthis.memory.focus[squad.name] = { target: target.id, since: ai.tick }\n\t\tfight.target = target\n\t\t// chosen again as it was: what attacks already is left to it (told again, a unit at it stops and starts), and what\n\t\t// casts to its spell; the rest (idle, or walking on with the squad's errand) told\n\t\tconst again = kept?.target === target.id\n\t\t// the defend task picks one foe for the squad too: told whom, it sends only what stands idle after it\n\t\tif (squad.current?.kind === 'defend') squad.current.memory.foe = target.id\n\t\tconst { roles } = ai.view\n\t\tconst reach = FIGHT_REACH * FIGHT_REACH\n\t\t// what a unit is told, as a key: one at it already since another squad told it (its goal changed) is not told again\n\t\tconst told = orderKey({ type: 'attack', entities: [], point: point(target), target: target.id })\n\t\t// told it already: at it in the picture, or told since the picture was made (a pass of the fights over the same\n\t\t// picture, `ai.budget`), which the picture cannot show yet\n\t\tconst toldAlready = (unit: EntityState) => {\n\t\t\tconst sent = ai.sentTo(unit.id)\n\t\t\treturn !!sent && sent.key === told && (unit.own?.order === 'attack' || sent.tick >= ai.snapshot.tick)\n\t\t}\n\t\tconst hitters = units.filter(\n\t\t\t(unit) =>\n\t\t\t\tdistSq(unit, target) < reach &&\n\t\t\t\t!unit.own?.hidden &&\n\t\t\t\t!roles.has(unit.type, 'healer') &&\n\t\t\t\t!fight.kiting.includes(unit.id) &&\n\t\t\t\t!fight.siege.includes(unit.id) &&\n\t\t\t\t!(again && (unit.own?.order === 'attack' || unit.own?.order === 'cast')) &&\n\t\t\t\t!toldAlready(unit)\n\t\t)\n\t\tif (!hitters.length) return\n\t\tconst entities = hitters.map((unit) => unit.id)\n\t\tai.send({ type: 'attack', entities, point: point(target), target: target.id })\n\t\tconst on = ai.squads.whereOf(squad) ?? fight.middle\n\t\tai.send({ type: 'attack', entities, point: point(on), queue: true })\n\t}\n\n\t// ---- kiting\n\n\t/**\n\t * The ranged units of a squad closed on by melee they can outrun step back as far as their reach, within the squad's\n\t * spread, then go on with the fight: no more than once every few seconds each, and not when the squad is losing (it\n\t * falls back, or fights to the last)\n\t */\n\tprivate kite(fight: Fight): void {\n\t\tconst kite = this.options.kite ?? 'ranged'\n\t\tif (kite === false || fight.odds < KITE_ODDS) return\n\t\tconst { ai } = this\n\t\tconst { view } = ai\n\t\tconst { roles } = view\n\t\tconst every = KITE_EVERY * ai.session.tickRate\n\t\tconst melee = fight.foes.where((_, def) => def.kind === 'unit' && !!def.attacks?.length && !def.attacks.some((attack) => attack.projectileSpeed))\n\t\tif (!melee.length) return\n\t\tconst spread = fight.squad.spread() + KITE_LEASH\n\t\tconst { width, depth } = ai.session.terrain\n\t\tconst on = ai.squads.whereOf(fight.squad) ?? fight.middle\n\t\tfor (const unit of fight.units) {\n\t\t\tif (!roles.hasTag(unit.type, 'ranged') || unit.own?.hidden) continue\n\t\t\tconst last = this.memory.kited[unit.id]\n\t\t\tif (last !== undefined && ai.tick - last < every) continue\n\t\t\t// the melee foe nearest it, and whether it is upon it\n\t\t\tlet closest: EntityState | undefined\n\t\t\tlet closestAt = Infinity\n\t\t\tfor (const foe of melee) {\n\t\t\t\tconst d = distSq(unit, foe)\n\t\t\t\tif (d < closestAt) {\n\t\t\t\t\tclosestAt = d\n\t\t\t\t\tclosest = foe\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!closest) continue\n\t\t\tconst theirs = view.strength.statsOf(closest)\n\t\t\tconst close = farthestReach(view.def(closest), theirs) + KITE_CLOSE\n\t\t\tif (closestAt > close * close) continue\n\t\t\tconst mine = view.strength.statsOf(unit)\n\t\t\t// only from what it can outrun\n\t\t\tif (mine.moveSpeed < theirs.moveSpeed * KITE_FASTER) continue\n\t\t\tconst range = farthestReach(view.def(unit), mine)\n\t\t\tconst step = Math.max(2, range - 1)\n\t\t\tconst dx = unit.x - closest.x\n\t\t\tconst dz = unit.z - closest.z\n\t\t\tconst length = Math.sqrt(dx * dx + dz * dz) || 1\n\t\t\tlet to = { x: unit.x + (dx / length) * step, z: unit.z + (dz / length) * step }\n\t\t\t// no further from the squad than its spread: a squad that kites stays a squad\n\t\t\tconst fromMiddle = Math.sqrt(distSq(to, fight.middle))\n\t\t\tif (fromMiddle > spread) {\n\t\t\t\tto = {\n\t\t\t\t\tx: fight.middle.x + ((to.x - fight.middle.x) / fromMiddle) * spread,\n\t\t\t\t\tz: fight.middle.z + ((to.z - fight.middle.z) / fromMiddle) * spread\n\t\t\t\t}\n\t\t\t}\n\t\t\tto = { x: Math.min(width - 1, Math.max(1, to.x)), z: Math.min(depth - 1, Math.max(1, to.z)) }\n\t\t\tif (distSq(to, unit) < 1.5 * 1.5) continue\n\t\t\tthis.memory.kited[unit.id] = ai.tick\n\t\t\tfight.kiting.push(unit.id)\n\t\t\tai.send({ type: 'order', entities: [unit.id], order: { type: 'move', point: to } })\n\t\t\tai.send({ type: 'attack', entities: [unit.id], point: point(on), queue: true })\n\t\t}\n\t}\n\n\t// ---- siege\n\n\t/**\n\t * The siege units of a squad shoot buildings when there are any in their reach and no foe is upon them, and one\n\t * that got ahead of the squad's middle is sent behind it: artillery is for walls, and dies to whatever reaches it\n\t */\n\tprivate siegeOf(fight: Fight): void {\n\t\tif (this.options.smartArtillery === false) return\n\t\tconst { ai } = this\n\t\tconst { view } = ai\n\t\tconst siege = fight.units.withRole('siege')\n\t\tif (!siege.length) return\n\t\tconst every = SIEGE_EVERY * ai.session.tickRate\n\t\tconst threats = fight.foes.units()\n\t\tconst buildings = view.hostile.alive().buildings()\n\t\tconst on = ai.squads.whereOf(fight.squad) ?? fight.middle\n\t\tfor (const unit of siege) {\n\t\t\tif (unit.own?.hidden) continue\n\t\t\tconst kept = this.memory.siege[unit.id]\n\t\t\tconst threatened = threats.near(unit, SIEGE_THREATENED).length > 0\n\t\t\tif (threatened) {\n\t\t\t\tdelete this.memory.siege[unit.id]\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tconst range = farthestReach(view.def(unit), view.strength.statsOf(unit)) + 2\n\t\t\tconst near = buildings.near(unit, range).visible()\n\t\t\tconst current = kept && near.find((building) => building.id === kept.target)\n\t\t\tif (near.length && (!current || ai.tick - kept.since >= every)) {\n\t\t\t\t// a tower first: it shoots back; then the nearest\n\t\t\t\tconst target =\n\t\t\t\t\tnear.filter((building) => !!view.def(building).attacks?.length).sort((a, b) => distSq(a, unit) - distSq(b, unit))[0] ?? near.nearest(unit)!\n\t\t\t\tif (!current || current.id !== target.id) {\n\t\t\t\t\tthis.memory.siege[unit.id] = { target: target.id, since: ai.tick }\n\t\t\t\t\tai.send({ type: 'attack', entities: [unit.id], point: point(target), target: target.id })\n\t\t\t\t\tai.send({ type: 'attack', entities: [unit.id], point: point(on), queue: true })\n\t\t\t\t\tai.decide(`${unit.type} ${unit.id} turns to the ${target.type} at ${where(target)}`, { kind: 'micro' })\n\t\t\t\t} else this.memory.siege[unit.id].since = ai.tick\n\t\t\t\tfight.siege.push(unit.id)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif (current) fight.siege.push(unit.id)\n\t\t\t// ahead of the middle, towards the foes: back behind it\n\t\t\tconst foe = threats.nearest(unit)\n\t\t\tif (!foe) continue\n\t\t\tconst ahead = Math.sqrt(distSq(fight.middle, foe)) - Math.sqrt(distSq(unit, foe))\n\t\t\tif (ahead <= 2 || (kept && ai.tick - kept.since < every)) continue\n\t\t\tconst dx = fight.middle.x - foe.x\n\t\t\tconst dz = fight.middle.z - foe.z\n\t\t\tconst length = Math.sqrt(dx * dx + dz * dz) || 1\n\t\t\tconst to = { x: fight.middle.x + (dx / length) * SIEGE_BEHIND, z: fight.middle.z + (dz / length) * SIEGE_BEHIND }\n\t\t\tthis.memory.siege[unit.id] = { target: 0, since: ai.tick }\n\t\t\tfight.siege.push(unit.id)\n\t\t\tai.send({ type: 'order', entities: [unit.id], order: { type: 'move', point: to } })\n\t\t\tai.send({ type: 'attack', entities: [unit.id], point: point(on), queue: true })\n\t\t}\n\t}\n\n\t// ---- fleeing\n\n\t/** The share of its health under which a unit leaves a fight: heroes and units each their own; none for one that never does */\n\tprivate fleeAt(unit: EntityState): number | undefined {\n\t\tconst hero = this.ai.view.hasRole(unit, 'hero')\n\t\tconst at = hero ? (this.options.heroesFlee ?? 0.35) : (this.options.unitsFlee ?? 0.25)\n\t\treturn at === false || !(at > 0) ? undefined : at\n\t}\n\n\t/** How much of its health a unit has, 0 to 1 */\n\tprivate healthOf(unit: EntityState): number {\n\t\tconst stats = this.ai.view.strength.statsOf(unit)\n\t\treturn Math.max(0, Math.min(1, unit.health / Math.max(1, unit.maxHealth ?? stats.health)))\n\t}\n\n\t/** The units of a squad in a fight about to die leave it for safety */\n\tprivate flee(fight: Fight): void {\n\t\tfor (const unit of fight.units) {\n\t\t\tconst at = this.fleeAt(unit)\n\t\t\tif (at === undefined || unit.own?.hidden) continue\n\t\t\tif (this.healthOf(unit) >= at) continue\n\t\t\t// in the fight itself: a foe upon it\n\t\t\tif (!fight.foes.some((foe) => distSq(unit, foe) <= ENGAGED * ENGAGED)) continue\n\t\t\tthis.sendToSafety(unit, fight.squad, 'hurt')\n\t\t}\n\t}\n\n\t/** With `removeInjuries`, the hurt units with something to heal them go home between fights */\n\tprivate injured(): void {\n\t\tif (!this.options.removeInjuries) return\n\t\tconst { ai } = this\n\t\tconst { view } = ai\n\t\tconst back = this.options.returnAt ?? 0.8\n\t\tconst hostile = view.hostile.alive()\n\t\tfor (const squad of ai.squads.all()) {\n\t\t\tif (!this.manages(squad) || this.fights.some((fight) => fight.squad === squad)) continue\n\t\t\tfor (const unit of squad.units()) {\n\t\t\t\tif (unit.own?.hidden || this.healthOf(unit) >= back) continue\n\t\t\t\tif (view.strength.statsOf(unit).healthRegen <= 0) continue\n\t\t\t\tif (hostile.near(unit, FIGHT_REACH).length) continue\n\t\t\t\tthis.sendToSafety(unit, squad, 'injured')\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Where a unit is safe: the nearest of its own finished buildings that no enemy strength reaches, else any of them,\n\t * else home, else away from the foes\n\t */\n\tprivate safety(unit: EntityState, foes: UnitSet): Vec2 {\n\t\tconst { view } = this.ai\n\t\tconst buildings = view.mine.buildings().finished()\n\t\tlet best: EntityState | undefined\n\t\tlet bestAt = Infinity\n\t\tlet safe = false\n\t\tfor (const building of buildings) {\n\t\t\tconst quiet = view.threat.at(building).enemy === 0\n\t\t\tif (safe && !quiet) continue\n\t\t\tconst d = distSq(unit, building)\n\t\t\tif ((quiet && !safe) || d < bestAt) {\n\t\t\t\tbest = building\n\t\t\t\tbestAt = d\n\t\t\t\tsafe = quiet\n\t\t\t}\n\t\t}\n\t\tif (best) return point(best)\n\t\tconst home = view.home()\n\t\tif (home) return point(home)\n\t\tconst foe = foes.nearest(unit)\n\t\tconst dx = foe ? unit.x - foe.x : 1\n\t\tconst dz = foe ? unit.z - foe.z : 0\n\t\tconst length = Math.sqrt(dx * dx + dz * dz) || 1\n\t\tconst { width, depth } = this.ai.session.terrain\n\t\treturn {\n\t\t\tx: Math.min(width - 1, Math.max(1, unit.x + (dx / length) * FLEE_AWAY)),\n\t\t\tz: Math.min(depth - 1, Math.max(1, unit.z + (dz / length) * FLEE_AWAY))\n\t\t}\n\t}\n\n\t/** Takes a unit out of its squad into the `fleeing` squad and sends it to safety; the squad's task goes on without it */\n\tprivate sendToSafety(unit: EntityState, from: Squad, why: 'hurt' | 'injured'): void {\n\t\tconst { ai } = this\n\t\tconst to = this.safety(unit, ai.view.hostile.alive())\n\t\tconst fleeing = ai.squads.named(FLEEING) ?? ai.squads.make(FLEEING, [], { owner: OWNER, retreatAt: false, regroupWhen: false, micro: false })\n\t\tif (!fleeing.current) fleeing.task(FLEE.id)\n\t\tfleeing.add([unit.id], why === 'hurt' ? 'fled' : 'sent to heal')\n\t\tif (!fleeing.data.units.includes(unit.id)) return\n\t\tthis.memory.fled[unit.id] = { squad: from.name, since: ai.tick, to, why }\n\t\tconst state = fleeing.current!\n\t\tif (state.phase === 'starting') {\n\t\t\t// made empty, it began with no one to send: on its way now\n\t\t\tstate.phase = 'fleeing'\n\t\t\tstate.phaseSince = ai.tick\n\t\t}\n\t\t;(state.memory.to as Record<string, Vec2>) ??= {}\n\t\t;(state.memory.to as Record<string, Vec2>)[unit.id] = to\n\t\tai.send({ type: 'order', entities: [unit.id], order: { type: 'move', point: to } })\n\t\tai.decide(\n\t\t\twhy === 'hurt'\n\t\t\t\t? `${unit.type} ${unit.id} flees at ${percent(this.healthOf(unit))} to ${where(to)}`\n\t\t\t\t: `${unit.type} ${unit.id} goes to heal at ${where(to)}: ${percent(this.healthOf(unit))}`,\n\t\t\t{ kind: 'micro' }\n\t\t)\n\t}\n\n\t/**\n\t * Those that fled come back: at `returnAt` of their health, or, with nothing to heal them (or healing too slowly to\n\t * wait for: `HEAL_WAIT`) and `ignoreInjured` not set, once safe for a while, to the pool at home. Back to the squad they left when it is still there, sent to it; else to the pool\n\t */\n\tprivate back(): void {\n\t\tconst { ai } = this\n\t\tconst { view } = ai\n\t\tconst fleeing = ai.squads.named(FLEEING)\n\t\tif (!fleeing) {\n\t\t\tthis.memory.fled = {}\n\t\t\treturn\n\t\t}\n\t\tconst back = this.options.returnAt ?? 0.8\n\t\tconst hostile = view.hostile.alive()\n\t\tconst state = fleeing.current\n\t\tfor (const unit of fleeing.units()) {\n\t\t\tconst fled = this.memory.fled[unit.id]\n\t\t\tconst health = this.healthOf(unit)\n\t\t\tconst healed = health >= back\n\t\t\tconst stats = view.strength.statsOf(unit)\n\t\t\tconst slow = stats.healthRegen <= 0 || ((back - health) * stats.health) / stats.healthRegen > HEAL_WAIT\n\t\t\t// one nothing heals in good time is back once safe a while, but to the pool at home, not to the fight it fled\n\t\t\tlet safe = false\n\t\t\tif (!healed && !this.options.ignoreInjured && slow) {\n\t\t\t\tconst since = fled?.since ?? fleeing.current?.since ?? ai.tick\n\t\t\t\tsafe = ai.tick - since >= FLEE_SAFE * ai.session.tickRate && !hostile.near(unit, FIGHT_REACH).length\n\t\t\t}\n\t\t\tif (!healed && !safe) continue\n\t\t\tfleeing.remove([unit.id], 'back')\n\t\t\tif (state) delete (state.memory.to as Record<string, Vec2> | undefined)?.[unit.id]\n\t\t\tdelete this.memory.fled[unit.id]\n\t\t\tconst squad = healed && fled?.squad ? ai.squads.named(fled.squad) : undefined\n\t\t\tif (squad && squad.alive && !squad.idle) {\n\t\t\t\tsquad.add([unit.id], 'back from fleeing')\n\t\t\t\tconst join = squad.centre() ?? ai.squads.whereOf(squad)\n\t\t\t\tif (squad.data.units.includes(unit.id) && join) ai.send({ type: 'attack', entities: [unit.id], point: point(join) })\n\t\t\t\tai.decide(`${unit.type} ${unit.id} back with ${squad.name} at ${percent(health)}`, { kind: 'micro' })\n\t\t\t} else ai.decide(`${unit.type} ${unit.id} back at ${percent(health)}`, { kind: 'micro' })\n\t\t}\n\t\tif (!fleeing.data.units.length) fleeing.disband('no one fleeing')\n\t}\n\n\t// ---- spells\n\n\t/**\n\t * Has units use the abilities that have to be aimed, where there is a fight near them: the brain's say first\n\t * (`spells`), then the ability's own (`AbilityDef.ai`), then what the kit works out from the effects (`aim`). The\n\t * ones on autocast look after themselves\n\t */\n\tspells(): void {\n\t\tif (!this.begin('spells')) return\n\t\tthis.cast = 0\n\t\tif (this.options.spells === false) return\n\t\tconst { ai } = this\n\t\tconst { view } = ai\n\t\tconst { registry } = view\n\t\t// whatever fights it, creeps too: a spell is as good on a camp\n\t\tconst enemies = view.hostile.units().alive()\n\t\tif (!enemies.length) return\n\t\tconst friends = view.all\n\t\t\t.visible()\n\t\t\t.units()\n\t\t\t.where((entity, def) => !view.isHostile(entity) && !!def.attacks?.length)\n\t\tfor (const caster of view.mine) {\n\t\t\tif (!caster.own?.abilities?.length || caster.own.hidden || caster.own.order === 'cast') continue\n\t\t\tif (!enemies.near(caster, 12).length) continue\n\t\t\tfor (const state of caster.own.abilities) {\n\t\t\t\tconst ability = registry.ability(state.id)\n\t\t\t\tif (state.level < 1 || state.cooldown > 0 || state.charges === 0 || ability.target === 'passive' || state.autocast) continue\n\t\t\t\t// what pays with health (`BuffDef.paysWithHealth`) needs more health than that left, not mana\n\t\t\t\tconst rate = healthRate(registry, caster)\n\t\t\t\tconst cost = at(ability.manaCost, state.level)\n\t\t\t\tif (rate > 0 ? cost * rate >= caster.health : cost > (caster.mana ?? 0)) continue\n\t\t\t\t// some reach as far as the caster's attacks do\n\t\t\t\tconst attacks = ability.attackRange ? view.strength.statsOf(caster).attackRange : 0\n\t\t\t\tconst foes = enemies.near(caster, at(ability.range, state.level) + attacks + 4).items\n\t\t\t\tconst near = friends.near(caster, 12).items\n\t\t\t\tconst aim = this.aim(caster, ability, state.level, foes, near)\n\t\t\t\tif (!aim) continue\n\t\t\t\tai.send({ type: 'cast', entities: [caster.id], ability: ability.id, point: point(aim.point), target: aim.target, ...(aim.to && { to: point(aim.to) }) })\n\t\t\t\tthis.cast++\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Where to use an ability, or nothing when there is nothing worth it: the brain's `spells`, the ability's `ai`, then\n\t * from its effects (a heal on the friend hurt most, something harmful on the nearest, an area where it catches most)\n\t */\n\taim(\n\t\tcaster: EntityState,\n\t\tability: AbilityDef,\n\t\tlevel: number,\n\t\tenemies: readonly EntityState[],\n\t\tfriends: readonly EntityState[]\n\t): { point: Vec2; target?: number; to?: Vec2 } | undefined {\n\t\tconst { ai } = this\n\t\tconst { view } = ai\n\t\tconst { registry } = view\n\t\tconst own = this.options.spells && this.options.spells[ability.id]\n\t\tif (own) {\n\t\t\tconst decided = own(ai, caster, enemies, friends, level)\n\t\t\tif (decided !== undefined) return decided ?? undefined\n\t\t}\n\t\tif (ability.ai) {\n\t\t\tconst decided = ability.ai(\n\t\t\t\t{ snapshot: ai.snapshot, registry, playerId: ai.playerId, enemies: [...enemies], friends: [...friends] },\n\t\t\t\tcaster,\n\t\t\t\tlevel\n\t\t\t)\n\t\t\tif (decided !== undefined) return decided ?? undefined\n\t\t}\n\t\t// a game's own way of aiming: only what the brain's spells or the ability's own `ai` say\n\t\tif (!(AIM_KINDS as readonly string[]).includes(ability.target)) return undefined\n\t\tconst harmful = (id?: string) => !!id && !!registry.buff(id).harmful\n\t\t// what a missile does counts as what the ability does\n\t\tconst now = lowerChain(ability.effects)\n\t\tconst effects = now.flatMap((effect) => [effect, ...(anyEffect(effect).effects ?? [])])\n\t\tconst hurts = effects.some((effect) => effect.type === 'damage' || (effect.type === 'buff' && harmful(effect.buff)))\n\t\t// only those it can get at: on the ground, in the air\n\t\tconst layers = ability.targets?.layers ?? now.find((effect) => effect.layers)?.layers\n\t\tif (layers) enemies = enemies.filter((enemy) => layers.includes(view.def(enemy).flying ? 'air' : 'ground'))\n\t\tconst heals = now.find((effect) => effect.type === 'heal')\n\t\tconst area = now.reduce((max, effect) => Math.max(max, declaredAt(effect.radius, level)), 0)\n\t\tconst maxHp = (entity: EntityState) => entity.maxHealth ?? baseStats(view.def(entity), registry).health\n\t\tconst nearest = (candidates: readonly EntityState[]) => {\n\t\t\tlet best: EntityState | undefined\n\t\t\tlet bestAt = Infinity\n\t\t\tfor (const candidate of candidates) {\n\t\t\t\tconst d = distSq(caster, candidate)\n\t\t\t\tif (d < bestAt) {\n\t\t\t\t\tbestAt = d\n\t\t\t\t\tbest = candidate\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn best\n\t\t}\n\n\t\tif (ability.target === 'unit') {\n\t\t\tif (heals) {\n\t\t\t\t// not wasted on a scratch\n\t\t\t\tconst need = declaredAt(heals.amount, level) * 0.6\n\t\t\t\tconst hurt = friends\n\t\t\t\t\t.filter((friend) => friend.id !== caster.id && maxHp(friend) - friend.health >= need)\n\t\t\t\t\t.sort((a, b) => a.health / maxHp(a) - b.health / maxHp(b))[0]\n\t\t\t\treturn hurt && { point: hurt, target: hurt.id }\n\t\t\t}\n\t\t\tif (hurts) {\n\t\t\t\tconst target = nearest(enemies)\n\t\t\t\treturn target && { point: target, target: target.id }\n\t\t\t}\n\t\t\tconst buff = now.find((effect) => effect.type === 'buff')?.buff\n\t\t\tconst target = friends.find((friend) => !friend.buffs?.includes(buff ?? ''))\n\t\t\treturn target && { point: target, target: target.id }\n\t\t}\n\n\t\tif (ability.target === 'vector') {\n\t\t\t// from the nearest in reach, on away from the caster\n\t\t\tconst target = nearest(enemies)\n\t\t\tconst reach = at(ability.range, level)\n\t\t\tif (!target || distSq(caster, target) > reach * reach) return undefined\n\t\t\tconst gap = Math.sqrt(distSq(caster, target)) || 1\n\t\t\tconst on = { x: target.x + (target.x - caster.x) / gap, z: target.z + (target.z - caster.z) / gap }\n\t\t\treturn { point: { x: target.x, z: target.z }, to: on }\n\t\t}\n\n\t\tif (ability.target === 'direction') {\n\t\t\tconst missile = now.find((effect) => effect.type === 'missile')\n\t\t\tconst reach = at(missile?.distance, level, 10)\n\t\t\tconst target = nearest(enemies)\n\t\t\treturn target && distSq(caster, target) <= reach * reach ? { point: { x: target.x, z: target.z } } : undefined\n\t\t}\n\n\t\tif (hurts) {\n\t\t\t// an area is worth it when it catches a few\n\t\t\tconst centres = ability.target === 'none' ? [caster] : enemies\n\t\t\tconst reach = area || 3\n\t\t\tconst need = ability.ultimate || ability.requiresLevel ? 4 : 2\n\t\t\tlet best: EntityState | undefined\n\t\t\tlet most = need - 1\n\t\t\tfor (const centre of centres) {\n\t\t\t\tconst caught = enemies.filter((enemy) => distSq(centre, enemy) <= reach * reach).length\n\t\t\t\tif (caught > most) {\n\t\t\t\t\tmost = caught\n\t\t\t\t\tbest = centre\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn best && { point: { x: best.x, z: best.z } }\n\t\t}\n\t\t// something for the caster itself: when there is a fight\n\t\treturn enemies.some((enemy) => distSq(caster, enemy) < 64) ? { point: caster } : undefined\n\t}\n\n\t// ---- items\n\n\t/** Has units drink their potions when they need them, pick up what lies around, and heroes shop for what their list says */\n\titems(): void {\n\t\tif (!this.begin('items')) return\n\t\tconst { ai } = this\n\t\tconst { view } = ai\n\t\tconst { registry } = view\n\t\tconst potions = this.options.potions !== false\n\t\tconst takeItems = this.options.takeItems !== false\n\t\tconst hostile = view.hostile.alive()\n\t\tfor (const hero of view.mine) {\n\t\t\tconst inventory = hero.own && snapshotOf(hero, inventorySlots)?.slots\n\t\t\tif (!inventory || hero.own?.hidden) continue\n\t\t\tconst stats = view.strength.statsOf(hero)\n\t\t\tconst maxHp = hero.maxHealth ?? stats.health\n\t\t\tconst maxMana = hero.maxMana ?? stats.mana\n\t\t\tif (potions) {\n\t\t\t\tlet drank = false\n\t\t\t\tfor (const slot of inventory) {\n\t\t\t\t\tconst ability = slot && registry.item(slot.item).ability\n\t\t\t\t\t// one waiting, or with none of its uses left (GP5), is not to be drunk now\n\t\t\t\t\tif (!slot || !ability || slot.cooldown > 0 || slot.uses === 0) continue\n\t\t\t\t\tconst effects = registry.ability(ability).effects\n\t\t\t\t\tconst heals = effects.some((effect) => effect.type === 'heal')\n\t\t\t\t\tconst restores = effects.some((effect) => effect.type === 'mana')\n\t\t\t\t\tif ((heals && hero.health < maxHp * DRINK_HEALTH) || (restores && maxMana > 0 && (hero.mana ?? 0) < maxMana * DRINK_MANA)) {\n\t\t\t\t\t\tai.send({ type: 'order', entities: [hero.id], order: { type: 'cast', item: slot.id } })\n\t\t\t\t\t\tdrank = true\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (drank) continue\n\t\t\t}\n\t\t\tif (hero.own?.order) continue\n\t\t\tif (takeItems && inventory.includes(null)) {\n\t\t\t\tlet lying: (typeof view.items)[number] | undefined\n\t\t\t\tlet lyingAt = PICK_UP * PICK_UP\n\t\t\t\tfor (const item of view.items) {\n\t\t\t\t\tconst d = distSq(item, hero)\n\t\t\t\t\tif (d < lyingAt) {\n\t\t\t\t\t\tlyingAt = d\n\t\t\t\t\t\tlying = item\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (lying) {\n\t\t\t\t\tai.send({ type: 'order', entities: [hero.id], order: { type: 'pickUp', item: lying.id } })\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tthis.shop(hostile)\n\t\tthis.hire(hostile)\n\t}\n\n\t/** What a hero shops for: its plan's list, the brain's, or the kit's (the cheapest item whose ability heals, when it carries none) */\n\tprivate wanted(hero: EntityState): string | undefined {\n\t\tconst { ai } = this\n\t\tconst { registry } = ai.view\n\t\tconst plan = this.planOf(hero.type)\n\t\tconst list = plan?.items ?? this.options.shopping\n\t\tif (list === false) return undefined\n\t\tif (typeof list === 'function') return list(ai, hero)\n\t\tconst slots = snapshotOf(hero, inventorySlots)?.slots ?? []\n\t\tconst carried = (item: string) => slots.filter((slot) => slot?.item === item).length\n\t\tif (Array.isArray(list)) {\n\t\t\tfor (const line of list) {\n\t\t\t\tif (!registry.items.has(line.item)) continue\n\t\t\t\tif (carried(line.item) >= (line.count ?? 1)) continue\n\t\t\t\tif (line.when !== undefined && !evaluate(line.when, ai)) continue\n\t\t\t\treturn line.item\n\t\t\t}\n\t\t\treturn undefined\n\t\t}\n\t\t// the kit's: something that heals, one of it, the cheapest\n\t\tconst money = ai.purse.money\n\t\tconst heals = (def: { ability?: string }) =>\n\t\t\t!!def.ability && registry.abilities.has(def.ability) && registry.ability(def.ability).effects.some((effect) => effect.type === 'heal')\n\t\tif (slots.some((slot) => slot && heals(registry.item(slot.item)))) return undefined\n\t\tconst cheapest = registry.items\n\t\t\t.all()\n\t\t\t.filter((def) => heals(def) && (def.cost[money] ?? 0) > 0)\n\t\t\t.sort((a, b) => (a.cost[money] ?? 0) - (b.cost[money] ?? 0))[0]\n\t\treturn cheapest?.id\n\t}\n\n\t/**\n\t * Heroes with nothing to do walk to a shop in reach for what they want and buy it there: the money held in the purse\n\t * on the way, paid as the `buy` is sent. Not in a fight, not on an errand\n\t */\n\tprivate shop(hostile: UnitSet): void {\n\t\tif (this.options.buyItems === false) return\n\t\tconst { ai } = this\n\t\tconst { view } = ai\n\t\tconst { registry } = view\n\t\t// the types that sell first: no type looked up of every tree known\n\t\tconst selling = ai.cache('micro.selling', () => new Set(registry.units.all().flatMap((def) => (def.sells?.length ? [def.id] : []))))\n\t\tconst shops = new UnitSet(\n\t\t\tview,\n\t\t\tview.all.known().filter((entity) => selling.has(entity.type) && !!snapshotOf(entity, shopStock) && !view.isHostile(entity))\n\t\t)\n\t\tif (!shops.length) {\n\t\t\tthis.memory.shopping = {}\n\t\t\treturn\n\t\t}\n\t\tconst going = this.memory.shopping\n\t\tfor (const hero of view.mine.heroes()) {\n\t\t\tconst own = hero.own\n\t\t\tconst slots = own && snapshotOf(hero, inventorySlots)?.slots\n\t\t\tif (!own || !slots || own.hidden) continue\n\t\t\tconst squad = ai.squads.squadOf(hero)\n\t\t\tconst busy = (squad && !squad.idle) || hostile.near(hero, FIGHT_REACH).length > 0\n\t\t\tlet errand: MicroMemory['shopping'][string] | undefined = going[hero.id]\n\t\t\tif (errand && (busy || !slots.includes(null))) {\n\t\t\t\tdelete going[hero.id]\n\t\t\t\terrand = undefined\n\t\t\t}\n\t\t\tif (busy) continue\n\t\t\tif (!errand) {\n\t\t\t\tif (own.order || !slots.includes(null)) continue\n\t\t\t\tconst item = this.wanted(hero)\n\t\t\t\tif (!item || !registry.items.has(item)) continue\n\t\t\t\tconst def = registry.item(item)\n\t\t\t\tif (!ai.purse.affords(def.cost, 0, SHOPPING_PRIORITY)) continue\n\t\t\t\tconst selling = shops.where(\n\t\t\t\t\t(entity) => !!snapshotOf(entity, shopStock)!.find((stock) => stock.item === item && (stock.count === undefined || stock.count > 0))\n\t\t\t\t)\n\t\t\t\tconst shop = selling.near(hero, SHOP_REACH).nearest(hero)\n\t\t\t\tif (!shop) continue\n\t\t\t\terrand = going[hero.id] = { shop: shop.id, item, since: ai.tick }\n\t\t\t\tai.send({ type: 'order', entities: [hero.id], order: { type: 'move', point: point(shop) } })\n\t\t\t\tai.decide(`${hero.type} ${hero.id} goes to the ${shop.type} at ${where(shop)} for ${an(def.name || item)}`, { kind: 'micro' })\n\t\t\t}\n\t\t\tconst shop = view.byId(errand.shop)\n\t\t\tconst def = registry.item(errand.item)\n\t\t\tif (!shop || !snapshotOf(shop, shopStock)?.some((stock) => stock.item === errand!.item && (stock.count === undefined || stock.count > 0))) {\n\t\t\t\tdelete going[hero.id]\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tconst reach = AT_SHOP + view.def(shop).radius\n\t\t\tif (distSq(hero, shop) <= reach * reach) {\n\t\t\t\tdelete going[hero.id]\n\t\t\t\tif (!ai.purse.spend(def.cost, SHOPPING_PRIORITY)) continue\n\t\t\t\tai.send({ type: 'buy', shop: shop.id, item: errand.item, hero: hero.id })\n\t\t\t\tai.decide(`${hero.type} ${hero.id} buys ${an(def.name || errand.item)} at the ${shop.type}`, { kind: 'micro' })\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\t// on its way: the money kept for it, and a hero that stopped short sent on\n\t\t\tai.purse.reserve(`micro.shopping:${hero.id}`, def.cost, SHOPPING_PRIORITY)\n\t\t\tif (!own.order && ai.tick - errand.since >= FLEE_RESEND * ai.session.tickRate) {\n\t\t\t\terrand.since = ai.tick\n\t\t\t\tai.send({ type: 'order', entities: [hero.id], order: { type: 'move', point: point(shop) } })\n\t\t\t}\n\t\t}\n\t}\n\n\t/** What it would hire at a place now, of what the place offers: its list's next, the function's, or the kit's (the strongest soldier for its price) */\n\tprivate toHire(offered: readonly UnitTypeDef[]): UnitTypeDef | undefined {\n\t\tconst { ai } = this\n\t\tconst { view } = ai\n\t\tconst { hiring } = this.options\n\t\tif (hiring === false || !offered.length) return undefined\n\t\tif (typeof hiring === 'function') {\n\t\t\tconst id = hiring(ai, offered)\n\t\t\treturn id === undefined ? undefined : offered.find((def) => def.id === id)\n\t\t}\n\t\tif (Array.isArray(hiring)) {\n\t\t\tfor (const line of hiring) {\n\t\t\t\tconst def = offered.find((each) => each.id === line.unit)\n\t\t\t\tif (!def) continue\n\t\t\t\tif (view.mine.ofType(def.id).length >= (line.count ?? 1)) continue\n\t\t\t\tif (line.when !== undefined && !evaluate(line.when, ai)) continue\n\t\t\t\treturn def\n\t\t\t}\n\t\t\treturn undefined\n\t\t}\n\t\t// the kit's: no hero (the altar's), the strongest for its price, a few at the most, with money that would lie idle\n\t\tconst money = ai.purse.money\n\t\tconst soldiers = offered.filter((def) => !def.hero && view.hasRole(def.id, 'soldier'))\n\t\tconst hired = view.mine.where((entity) => soldiers.some((def) => def.id === entity.type)).length\n\t\tif (hired >= HIRING_MOST) return undefined\n\t\tconst worth = (def: UnitTypeDef) => view.strength.of(def) / Math.max(1, def.cost?.[money] ?? 0)\n\t\tconst best = [...soldiers].sort((a, b) => worth(b) - worth(a))[0]\n\t\treturn best && ai.purse.affords(best.cost ?? {}, HIRING_SPARE, HIRING_PRIORITY) ? best : undefined\n\t}\n\n\t/**\n\t * Mercenaries: with supply free, a hero with nothing to do (or else an idle fighter of no squad's) walks to a place\n\t * that hires in reach for what `toHire` says, the money held in the purse on the way and paid as the `hire` is sent.\n\t * Not in a fight, not on an errand\n\t */\n\tprivate hire(hostile: UnitSet): void {\n\t\tif (this.options.hireUnits === false || this.options.hiring === false) return\n\t\tconst { ai } = this\n\t\tconst { view } = ai\n\t\tconst { registry } = view\n\t\t// the types that hire first: no type looked up of every tree known\n\t\tconst hiring = ai.cache('micro.hiring', () => new Set(registry.units.all().flatMap((def) => (def.hires?.length ? [def.id] : []))))\n\t\tif (!hiring.size) return\n\t\tconst places = new UnitSet(\n\t\t\tview,\n\t\t\tview.all.known().filter((entity) => hiring.has(entity.type) && entity.health > 0 && !view.isHostile(entity))\n\t\t)\n\t\tconst going = (this.memory.hiring ??= {})\n\t\tif (!places.length) {\n\t\t\tthis.memory.hiring = {}\n\t\t\treturn\n\t\t}\n\t\tconst offeredAt = (place: EntityState) => (view.def(place).hires ?? []).filter((id) => registry.units.has(id)).map((id) => registry.unit(id))\n\t\tconst { me } = view\n\t\tconst busy = (unit: EntityState) => {\n\t\t\tconst squad = ai.squads.squadOf(unit)\n\t\t\treturn (squad && !squad.idle) || hostile.near(unit, FIGHT_REACH).length > 0\n\t\t}\n\t\t// errands under way: the money kept, the hire paid at the place, those that stopped short sent on\n\t\tfor (const [id, errand] of Object.entries(going)) {\n\t\t\tconst unit = view.byId(Number(id))\n\t\t\tconst place = view.byId(errand.place)\n\t\t\tif (!unit || !place || unit.health <= 0 || busy(unit) || !(view.def(place).hires ?? []).includes(errand.unit)) {\n\t\t\t\tdelete going[id]\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tconst def = registry.unit(errand.unit)\n\t\t\tconst reach = AT_SHOP + view.def(place).radius\n\t\t\tif (distSq(unit, place) <= reach * reach) {\n\t\t\t\tdelete going[id]\n\t\t\t\tconst supply = supplyOf(def)\n\t\t\t\tif ((supply > 0 && me.supplyUsed + supply > me.supplyCap) || !ai.purse.spend(def.cost ?? {}, HIRING_PRIORITY)) continue\n\t\t\t\tme.supplyUsed += supply\n\t\t\t\tai.send({ type: 'hire', shop: place.id, unit: errand.unit })\n\t\t\t\tai.decide(`hires ${an(def.name || errand.unit)} at the ${place.type}`, { kind: 'micro' })\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tai.purse.reserve(`micro.hiring:${id}`, def.cost ?? {}, HIRING_PRIORITY)\n\t\t\tif (!unit.own?.order && ai.tick - errand.since >= FLEE_RESEND * ai.session.tickRate) {\n\t\t\t\terrand.since = ai.tick\n\t\t\t\tai.send({ type: 'order', entities: [unit.id], order: { type: 'move', point: point(place) } })\n\t\t\t}\n\t\t}\n\t\t// one errand at a time\n\t\tif (Object.keys(going).length) return\n\t\tconst idle = (unit: EntityState) => !!unit.own && !unit.own.hidden && !unit.own.order && !busy(unit)\n\t\tconst runners = [\n\t\t\t...view.mine.heroes().where(idle),\n\t\t\t...view.mine.fighters().where((unit, def) => !def.hero && idle(unit) && !ai.squads.squadOf(unit))\n\t\t]\n\t\tfor (const runner of runners) {\n\t\t\tconst place = places.near(runner, SHOP_REACH).nearest(runner)\n\t\t\tif (!place) continue\n\t\t\tconst def = this.toHire(offeredAt(place))\n\t\t\tif (!def) return\n\t\t\tconst supply = supplyOf(def)\n\t\t\tif (supply > 0 && me.supplyUsed + supply > me.supplyCap) return\n\t\t\tif (!ai.purse.affords(def.cost ?? {}, 0, HIRING_PRIORITY)) return\n\t\t\tgoing[runner.id] = { place: place.id, unit: def.id, since: ai.tick }\n\t\t\tai.send({ type: 'order', entities: [runner.id], order: { type: 'move', point: point(place) } })\n\t\t\tai.decide(`${runner.type} ${runner.id} goes to the ${place.type} at ${where(place)} to hire ${an(def.name || def.id)}`, { kind: 'micro' })\n\t\t\treturn\n\t\t}\n\t}\n\n\t// ---- heroes\n\n\t/** The plan for a hero type, where the brain's `heroes` is a list */\n\tprivate planOf(type: string): HeroPlan | undefined {\n\t\treturn Array.isArray(this.options.heroes) ? this.options.heroes.find((plan) => plan.type === type) : undefined\n\t}\n\n\t/**\n\t * Which hero to make next of those that could be made (at an altar, of the player's race, not had): the first of the\n\t * brain's `heroes` that could be and whose chance came up, or what its function says; else the first candidate\n\t */\n\tnextHero(candidates: readonly UnitTypeDef[], had: readonly string[]): UnitTypeDef | undefined {\n\t\tconst free = candidates.filter((def) => !had.includes(def.id))\n\t\tif (!free.length) return undefined\n\t\tconst { heroes } = this.options\n\t\tif (typeof heroes === 'function') {\n\t\t\tconst picked = heroes(this.ai, free)\n\t\t\tif (picked === undefined) return undefined\n\t\t\treturn typeof picked === 'string' ? free.find((def) => def.id === picked) : picked\n\t\t}\n\t\tif (Array.isArray(heroes)) {\n\t\t\tfor (let i = 0; i < heroes.length; i++) {\n\t\t\t\tconst plan = heroes[i]\n\t\t\t\tconst def = free.find((each) => each.id === plan.type)\n\t\t\t\tif (!def) continue\n\t\t\t\tconst chance = plan.chance ?? 1\n\t\t\t\tif (chance < 1) {\n\t\t\t\t\t// rolled once, with the brain's numbers, and remembered: a save keeps the roll\n\t\t\t\t\tthis.memory.rolled[i] ??= this.ai.rng.next() < chance\n\t\t\t\t\tif (!this.memory.rolled[i]) continue\n\t\t\t\t}\n\t\t\t\treturn def\n\t\t\t}\n\t\t\treturn undefined\n\t\t}\n\t\treturn free[0]\n\t}\n\n\t/**\n\t * Which skill a hero learns next of those it may: its plan's order (the next line not yet learned to that level),\n\t * else the ultimate as soon as it can be had, else whatever is furthest behind\n\t */\n\tnextSkill(hero: EntityState, learnable: readonly LearnableInfo[], now = true): string | undefined {\n\t\tif (!learnable.length) return undefined\n\t\tconst plan = this.planOf(hero.type)\n\t\tif (typeof plan?.skills === 'function') return plan.skills(this.ai, hero, learnable)\n\t\tif (Array.isArray(plan?.skills)) {\n\t\t\tconst counted: Record<string, number> = {}\n\t\t\tfor (const id of plan.skills) {\n\t\t\t\tcounted[id] = (counted[id] ?? 0) + 1\n\t\t\t\tconst skill = learnable.find((each) => each.id === id)\n\t\t\t\t// learned to this line already: on to the next line\n\t\t\t\tif (!skill || skill.level >= counted[id]) continue\n\t\t\t\treturn skill.available || !now ? id : undefined\n\t\t\t}\n\t\t}\n\t\tconst may = now ? learnable.filter((skill) => skill.available) : [...learnable]\n\t\treturn may.sort((a, b) => a.maxLevel - b.maxLevel || a.level - b.level)[0]?.id\n\t}\n\n\t/** Has heroes put the points they have into their skills, in the order their plan says */\n\theroes(): void {\n\t\tif (!this.begin('heroes')) return\n\t\tconst { ai } = this\n\t\tfor (const hero of ai.view.mine.heroes()) {\n\t\t\tconst info = heroOfState(hero)\n\t\t\tif (!info?.points || !info.learnable || hero.own?.hidden) continue\n\t\t\tconst next = this.nextSkill(hero, info.learnable)\n\t\t\tif (!next) continue\n\t\t\tai.send({ type: 'learn', entity: hero.id, ability: next })\n\t\t\tai.decide(`${hero.type} ${hero.id} learns ${next}`, { kind: 'micro' })\n\t\t}\n\t}\n\n\t// ---- bookkeeping\n\n\t/** Whether a part of the think is still to be done this think: it is, once, for whoever asks first */\n\tprivate begin(part: Part): boolean {\n\t\tif (this.thoughtAt[part] === this.ai.tick) return false\n\t\tthis.thoughtAt[part] = this.ai.tick\n\t\treturn true\n\t}\n\n\t/** Marks a part of the think done: one a brain's own turn did itself, or left to the units (a slip) */\n\tdone(part: Part): void {\n\t\tthis.thoughtAt[part] = this.ai.tick\n\t}\n\n\t/** Drops what is remembered of units that are gone */\n\tprivate prune(): void {\n\t\tconst { view } = this.ai\n\t\tconst gone = (id: string) => !view.mine.has(Number(id))\n\t\tfor (const id in this.memory.kited) if (gone(id)) delete this.memory.kited[id]\n\t\tfor (const id in this.memory.siege) if (gone(id)) delete this.memory.siege[id]\n\t\tfor (const id in this.memory.fled) if (gone(id)) delete this.memory.fled[id]\n\t\tfor (const id in this.memory.shopping) if (gone(id)) delete this.memory.shopping[id]\n\t}\n\n\t/** The fights and the rest, as the report shows them */\n\treport(): MicroReport {\n\t\tconst { ai } = this\n\t\tconst { view } = ai\n\t\tconst fleeing = ai.squads.named(FLEEING)\n\t\tconst fled = this.memory.fled\n\t\treturn {\n\t\t\tfights: this.fights.map((fight) => {\n\t\t\t\tconst kept = this.memory.focus[fight.squad.name]\n\t\t\t\treturn {\n\t\t\t\t\tsquad: fight.squad.name,\n\t\t\t\t\tfoes: fight.foes.length,\n\t\t\t\t\todds: Math.round(fight.odds * 100) / 100,\n\t\t\t\t\t...(fight.target && kept && { target: { id: fight.target.id, type: fight.target.type, since: kept.since } }),\n\t\t\t\t\tkiting: [...fight.kiting],\n\t\t\t\t\tsiege: [...fight.siege]\n\t\t\t\t}\n\t\t\t}),\n\t\t\tfleeing: (fleeing?.units().items ?? []).map((unit) => ({\n\t\t\t\tunit: unit.id,\n\t\t\t\ttype: unit.type,\n\t\t\t\thealth: Math.round(this.healthOf(unit) * 100) / 100,\n\t\t\t\tto: pair(fled[unit.id]?.to ?? unit),\n\t\t\t\tsince: fled[unit.id]?.since ?? 0,\n\t\t\t\twhy: fled[unit.id]?.why ?? 'hurt'\n\t\t\t})),\n\t\t\theroes: view.mine.heroes().map((hero) => {\n\t\t\t\tconst info = heroOfState(hero)\n\t\t\t\tconst next = info?.learnable ? this.nextSkill(hero, info.learnable, false) : undefined\n\t\t\t\treturn { id: hero.id, type: hero.type, level: info?.level ?? 1, ...(next && { next }) }\n\t\t\t}),\n\t\t\tshopping: Object.entries(this.memory.shopping).map(([hero, errand]) => ({ hero: Number(hero), ...errand })),\n\t\t\thiring: Object.entries(this.memory.hiring ?? {}).map(([by, errand]) => ({ by: Number(by), ...errand })),\n\t\t\tcast: this.cast,\n\t\t\t...(this.slipped && { slipped: this.slipped })\n\t\t}\n\t}\n\n\t/** What it remembers, for a save: a copy */\n\t/** Whether it has anything to remember now: one that does not is left out of a save */\n\tremembers(): boolean {\n\t\treturn this.enabled\n\t}\n\n\t/** Its part of the brain's report */\n\treportTo(report: AiReport): void {\n\t\treport.micro = this.report()\n\t}\n\n\t/** Gives a copy of the micro's memory, for a save of the brain */\n\tsave(): MicroMemory {\n\t\treturn structuredClone(this.memory)\n\t}\n\n\t/** Takes back what `save` gave: whether it was read */\n\trestore(memory: unknown): boolean {\n\t\tconst given = memory as MicroMemory | undefined\n\t\tif (!given || typeof given !== 'object' || given.v !== 1) return false\n\t\tthis.memory = {\n\t\t\tv: 1,\n\t\t\tfocus: { ...(given.focus ?? {}) },\n\t\t\tkited: { ...(given.kited ?? {}) },\n\t\t\tfled: structuredClone(given.fled ?? {}),\n\t\t\tsiege: { ...(given.siege ?? {}) },\n\t\t\tshopping: structuredClone(given.shopping ?? {}),\n\t\t\t...(given.hiring && { hiring: structuredClone(given.hiring) }),\n\t\t\trolled: { ...(given.rolled ?? {}) }\n\t\t}\n\t\treturn true\n\t}\n}\n\n/**\n * The task of the `fleeing` squad: each of its units on its way to its own safety (`state.memory.to`, by unit id), those\n * that stopped short sent again; never over by itself: the micro module takes the units out as they heal\n */\nconst FLEE: TaskDef = defineTask({ id: 'flee', fighting: false,\n\tstart(ai, squad, state) {\n\t\tstate.phase = 'fleeing'\n\t\tstate.phaseSince = ai.tick\n\t\tconst to = (state.memory.to as Record<string, Vec2> | undefined) ?? {}\n\t\tfor (const id of squad.data.units) if (to[id]) squad.order({ type: 'move', point: to[id] }, [id])\n\t},\n\tthink(_ai, squad, state) {\n\t\tif (!squad.mayResend()) return\n\t\tconst to = (state.memory.to as Record<string, Vec2> | undefined) ?? {}\n\t\tfor (const unit of squad.idleUnits()) {\n\t\t\tconst there = to[unit.id]\n\t\t\tif (there && distSq(unit, there) > FLEE_ARRIVE * FLEE_ARRIVE) squad.order({ type: 'move', point: there }, [unit.id])\n\t\t}\n\t},\n\thandles: ['retreat', 'regroup', 'reinforce'] })\n\n/**\n * The micro module: the fights of the brain's squads each think, after the squads sent and watched their tasks\n * (`ai.micro.think`): focus fire, kiting, siege, fleeing and coming back, spells, items, the heroes' skills. With how it\n * fights where the brain's definition and the seat's options say nothing (`MicroOptions`)\n *\n * @beta\n */\nexport const micro = (options: MicroOptions = {}): AiModuleDef =>\n\tdefineModule({ id: 'micro', make: (ai: Brain): AiModule => {\n\t\tai.area(Micro).configure(options)\n\t\treturn {\n\t\t\tid: 'micro',\n\t\t\tphase: 'fight',\n\t\t\tthink: () => ai.area(Micro).think()\n\t\t}\n\t} })\n\ndeclare module './area' {\n\tinterface AreaMemories {\n\t\tmicro?: MicroMemory\n\t}\n}\n\n/** What a unit pays in health for each point of mana, by the buffs it carries (`BuffDef.paysWithHealth`): 0 for mana */\nfunction healthRate(registry: Registry, unit: EntityState): number {\n\tlet rate = 0\n\tfor (const buff of unit.buffs ?? []) {\n\t\tconst pays = registry.buffs.has(buff) ? registry.buff(buff).paysWithHealth : undefined\n\t\tif (pays) rate = Math.max(rate, pays === true ? 1 : pays)\n\t}\n\treturn rate\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AA6DA,IAAM,cAAc;;AAEpB,IAAM,aAAa;;AAEnB,IAAM,aAAa;;AAEnB,IAAM,cAAc;;AAEpB,IAAM,aAAa;;AAEnB,IAAM,YAAY;;AAElB,IAAM,cAAc;;AAEpB,IAAM,mBAAmB;;AAEzB,IAAM,eAAe;;AAErB,IAAM,YAAY;;;;;AAKlB,IAAM,YAAY;;AAElB,IAAM,YAAY;;AAIlB,IAAM,cAAc;;AAEpB,IAAM,aAAa;;AAEnB,IAAM,UAAU;;AAEhB,IAAM,oBAAoB;;AAE1B,IAAM,kBAAkB;;AAExB,IAAM,eAAe;;AAErB,IAAM,cAAc;;AAIpB,IAAM,eAAe;AACrB,IAAM,aAAa;;AAEnB,IAAM,UAAU;;AAEhB,IAAM,QAAQ;;AAyOd,IAAM,kBAAyC;CAC9C;EAAE,OAAO;EAAU,QAAQ;CAAE;CAC7B;EAAE,OAAO;EAAU,QAAQ;CAAE;CAC7B;EAAE,OAAO;EAAQ,QAAQ;CAAI;CAC7B;EAAE,OAAO;EAAS,QAAQ;CAAE;AAC7B;AAEA,IAAM,WAAW,UAAkB,GAAG,KAAK,MAAM,QAAQ,GAAG,EAAE;;;;;;;;AAwB9D,IAAa,QAAb,MAAa,MAAwB;CAyB1B;;CAvBV,OAAgB,KAAK;;CAErB,OAAO,KAAK,IAAkB;EAC7B,OAAO,IAAI,MAAM,EAAE;CACpB;;CAEA,KAAc;;CAEd,SAAkB;;CAGlB,aAAmC,CAAC;;CAEpC,UAAU;CACV,SAA8B;EAAE,GAAG;EAAG,OAAO,CAAC;EAAG,OAAO,CAAC;EAAG,MAAM,CAAC;EAAG,OAAO,CAAC;EAAG,UAAU,CAAC;EAAG,QAAQ,CAAC;CAAE;CAC1G,SAA0B,CAAC;CAC3B,OAAe;;CAEf,UAAkB;CAClB,YAAmD,CAAC;CAEpD,YAEC,IACC;EADQ,KAAA,KAAA;EAET,GAAG,OAAO,OAAO,IAAI;CACtB;;CAGA,UAAU,SAA6B;EACtC,KAAK,aAAa;EAClB,KAAK,UAAU;CAChB;;CAGA,IAAI,UAAwB;EAC3B,OAAO,KAAK,GAAG,MAAM,wBAAwB;GAAE,GAAG,KAAK;GAAY,GAAG,KAAK,GAAG,SAAS;EAAM,EAAE;CAChG;;CAGA,QAAQ,OAAuB;EAC9B,MAAM,QAAQ,MAAM;EACpB,OACC,KAAK,WAAW,MAAM,QAAQ,UAAU,SAAS,CAAC,CAAC,SAAS,MAAM,SAAS,KAAA,KAAa,KAAK,GAAG,OAAO,QAAQ,MAAM,IAAI,CAAC,EAAE,aAAa;CAE3I;;;;;CAMA,QAAc;EAGb,MAAM,WAAW,KAAK,GAAG,QAAQ,YAAY;EAC7C,IAAI,CAAC,KAAK,YAAY,WAAW,KAAK,KAAK,GAAG,IAAI,KAAK,IAAI,UAAU;GACpE,KAAK;GACL,KAAK,KAAK,QAAQ;EACnB;EACA,IAAI,CAAC,KAAK,MAAM,GAAG;EACnB,KAAK,OAAO;EACZ,KAAK,MAAM;EACX,KAAK,OAAO;CACb;;;;;;CAOA,QAAiB;EAChB,MAAM,EAAE,OAAO;EACf,MAAM,EAAE,SAAS;EACjB,IAAI,CAAC,KAAK,UAAU;GACnB,IAAI,CAAC,KAAK,MAAM,QAAQ,GAAG,OAAO;GAClC,KAAK,MAAM;GACX,KAAK,SAAS,CAAC;GAEf,MAAM,UAAU,KAAK,OAAO;GAC5B,KAAK,MAAM,QAAQ,SAAS;IAC3B,MAAM,QAAQ,GAAG,OAAO,MAAM,IAAI;IAClC,IAAI,CAAC,SAAS,CAAC,KAAK,QAAQ,KAAK,GAAG,OAAO,QAAQ;GACpD;GACA,KAAK,WAAW;IAAE,QAAQ,KAAK,QAAQ,MAAM,CAAC,CAAC,SAAS,CAAC,GAAG,GAAG,OAAO,IAAI,CAAC,CAAC,CAAC,QAAQ,UAAU,KAAK,QAAQ,KAAK,CAAC,IAAI,CAAC;IAAG,IAAI;GAAE;EACjI;EACA,MAAM,UAAU,KAAK,QAAQ,MAAM;EACnC,MAAM,EAAE,WAAW,KAAK;EACxB,OAAO,KAAK,SAAS,KAAK,OAAO,QAAQ,KAAK,SAAS,MAAM;GAC5D,MAAM,SAAS,KAAK,QAAQ,OAAO,KAAK,SAAS,KAAK,OAAO;GAC7D,IAAI,CAAC,GAAG,OAAO,MAAM,UAAU,CAAC,KAAK,KAAK,SAAS,KAAK,IAAI,OAAO,QAAQ;IAC1E,KAAK,SAAS;IACd,GAAG,OAAO,MAAM;IAChB,OAAO;GACR;EACD;EACA,KAAK,WAAW,KAAA;EAChB,KAAK,QAAQ;EACb,KAAK,KAAK;EACV,OAAO;CACR;;CAGA,QAAgB,OAAc,SAA0B;EACvD,MAAM,EAAE,SAAS,KAAK;EACtB,MAAM,UAAU,KAAK,OAAO;EAC5B,MAAM,QAAQ,MAAM,MAAM;EAC1B,MAAM,SAAS,MAAM,OAAO;EAC5B,IAAI,CAAC,QAAQ,OAAO;EAEpB,MAAM,OAAO,QAAQ,KAAK,QAAA,EAAmB,CAAC,CAAC,OAAO,QAAQ,QAAQ,CAAC,OAAO,WAAW,IAAI,SAAS,UAAU,CAAC,CAAC,IAAI,SAAS,OAAO;EACtI,IAAI,CAAC,KAAK,QAAQ;GACjB,OAAO,QAAQ,MAAM;GACrB,OAAO,MAAM;EACd;EACA,MAAM,QAAe;GAAE;GAAO;GAAO;GAAQ;GAAM,MAAM,KAAK,SAAS,KAAK,OAAO,IAAI;GAAG,QAAQ,CAAC;GAAG,OAAO,CAAC;EAAE;EAChH,KAAK,OAAO,KAAK,KAAK;EACtB,KAAK,KAAK,KAAK;EAEf,MAAM,QAAQ,MAAM,MAAM;EAC1B,IAAI,CAAC,MAAM,MAAM,QAAQ,OAAO,MAAM;EACtC,KAAK,QAAQ,KAAK;EAClB,KAAK,KAAK,KAAK;EACf,KAAK,MAAM,KAAK;EAChB,OAAO,MAAM;CACd;;CAGA;;;;;CAQA,SAAS,KAA0B;EAClC,MAAM,EAAE,SAAS,KAAK;EACtB,MAAM,MAAM,KAAK,IAAI,GAAG;EACxB,IAAI,QAAQ;EACZ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,OAAO,IAAI,KAAK,QAAQ,UAAU;EAC3E,KAAK,MAAM,QAAQ,OAAO;GACzB,IAAI,KAAK,UAAU,UAAU,KAAK,QAAQ,iBAAiB,SAAS,CAAC,MAAM,QAAQ,KAAK,QAAQ,OAAO,GAAG;GAC1G,IAAI,CAAC,KAAK,QAAQ,KAAK,OAAO,KAAK,GAAG,GAAG;GACzC,IAAI,KAAK,SAAS,KAAA,KAAa,CAAC,SAAS,KAAK,MAAM,KAAK,EAAE,GAAG;GAC9D,SAAS,KAAK,UAAU;EACzB;EACA,QAAQ,IAAI,IAAI,YAAY,KAAK;CAClC;;CAGA,QAAgB,OAAe,KAAkB,KAA2B;EAC3E,IAAI,UAAU,YAAY,OAAO,IAAI,SAAS;EAC9C,MAAM,EAAE,UAAU,KAAK,GAAG;EAC1B,OAAO,IAAI,SAAS,SAAS,MAAM,IAAI,IAAI,MAAM,KAAK,KAAK,MAAM,OAAO,IAAI,MAAM,KAAK;CACxF;;;;;CAMA,OAAO,OAAc,MAAwC;EAC5D,IAAI,OAAO,KAAK,QAAQ,YAAY,YAAY,OAAO,KAAK,QAAQ,QAAQ,KAAK,IAAI,OAAO,IAAI;EAChG,MAAM,OAAO,KAAK,OAAO,OAAO,IAAI;EACpC,IAAI,MAAM,OAAO;EACjB,MAAM,SAAS,MAAM,OAAO;EAC5B,IAAI,CAAC,UAAU,CAAC,KAAK,QAAQ,OAAO,KAAA;EACpC,IAAI;EACJ,IAAI,OAAO;EACX,KAAK,MAAM,OAAO,MAAM;GACvB,MAAM,QAAQ,KAAK,GAAG,KAAK,SAAS,QAAQ,GAAG;GAC/C,MAAM,SAAS,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,IAAI,SAAS,KAAK,IAAI,GAAG,IAAI,aAAa,MAAM,MAAM,CAAC,CAAC;GAE/F,MAAM,OAAO,IAAI,KAAM,KAAK,IAAI,GAAG,KAAK,KAAK,OAAO,KAAK,MAAM,CAAC,IAAA,EAAe;GAC/E,MAAM,QAAQ,KAAK,SAAS,GAAG,KAAK,IAAI,UAAU;GAClD,IAAI,QAAQ,MAAM;IACjB,OAAO;IACP,OAAO;GACR;EACD;EACA,OAAO;CACR;;;;;;CAOA,OAAe,OAAc,MAAwC;EACpE,MAAM,OAAO,MAAM,SAAS,OAAO;EACnC,OAAO,OAAO,SAAS,WAAW,KAAK,MAAM,QAAQ,IAAI,OAAO,IAAI,IAAI,KAAA;CACzE;;;;;;CAOA,MAAc,OAAoB;EACjC,MAAM,EAAE,OAAO;EACf,MAAM,EAAE,OAAO,MAAM,UAAU;EAC/B,MAAM,SAAS,KAAK,QAAQ,cAAc,eAAe,GAAG,QAAQ;EACpE,MAAM,OAAO,KAAK,OAAO,MAAM,MAAM;EACrC,MAAM,UAAU,QAAQ,KAAK,MAAM,QAAQ,IAAI,OAAO,KAAK,MAAM;EAEjE,MAAM,OAAO,KAAK,OAAO,OAAO,IAAI;EACpC,IAAI,WAAW,GAAG,OAAO,KAAK,QAAQ,UAAU,CAAC,QAAQ,KAAK,OAAO,QAAQ,KAAK;GACjF,MAAM,SAAS;GACf;EACD;EACA,MAAM,SAAS,KAAK,OAAO,OAAO,IAAI;EACtC,IAAI,CAAC,QAAQ;GACZ,OAAO,KAAK,OAAO,MAAM,MAAM;GAC/B;EACD;EACA,KAAK,OAAO,MAAM,MAAM,QAAQ;GAAE,QAAQ,OAAO;GAAI,OAAO,GAAG;EAAK;EACpE,MAAM,SAAS;EAGf,MAAM,QAAQ,MAAM,WAAW,OAAO;EAEtC,IAAI,MAAM,SAAS,SAAS,UAAU,MAAM,QAAQ,OAAO,MAAM,OAAO;EACxE,MAAM,EAAE,UAAU,GAAG;EACrB,MAAM,QAAA;EAEN,MAAM,OAAO,SAAS;GAAE,MAAM;GAAU,UAAU,CAAC;GAAG,OAAO,MAAM,MAAM;GAAG,QAAQ,OAAO;EAAG,CAAC;EAG/F,MAAM,eAAe,SAAsB;GAC1C,MAAM,OAAO,GAAG,OAAO,KAAK,EAAE;GAC9B,OAAO,CAAC,CAAC,QAAQ,KAAK,QAAQ,SAAS,KAAK,KAAK,UAAU,YAAY,KAAK,QAAQ,GAAG,SAAS;EACjG;EACA,MAAM,UAAU,MAAM,QACpB,SACA,OAAO,MAAM,MAAM,IAAI,SACvB,CAAC,KAAK,KAAK,UACX,CAAC,MAAM,IAAI,KAAK,MAAM,QAAQ,KAC9B,CAAC,MAAM,OAAO,SAAS,KAAK,EAAE,KAC9B,CAAC,MAAM,MAAM,SAAS,KAAK,EAAE,KAC7B,EAAE,UAAU,KAAK,KAAK,UAAU,YAAY,KAAK,KAAK,UAAU,YAChE,CAAC,YAAY,IAAI,CACnB;EACA,IAAI,CAAC,QAAQ,QAAQ;EACrB,MAAM,WAAW,QAAQ,KAAK,SAAS,KAAK,EAAE;EAC9C,GAAG,KAAK;GAAE,MAAM;GAAU;GAAU,OAAO,MAAM,MAAM;GAAG,QAAQ,OAAO;EAAG,CAAC;EAC7E,MAAM,KAAK,GAAG,OAAO,QAAQ,KAAK,KAAK,MAAM;EAC7C,GAAG,KAAK;GAAE,MAAM;GAAU;GAAU,OAAO,MAAM,EAAE;GAAG,OAAO;EAAK,CAAC;CACpE;;;;;;CASA,KAAa,OAAoB;EAEhC,KADa,KAAK,QAAQ,QAAQ,cACrB,SAAS,MAAM,OAAO,WAAW;EAC9C,MAAM,EAAE,OAAO;EACf,MAAM,EAAE,SAAS;EACjB,MAAM,EAAE,UAAU;EAClB,MAAM,QAAQ,aAAa,GAAG,QAAQ;EACtC,MAAM,QAAQ,MAAM,KAAK,OAAO,GAAG,QAAQ,IAAI,SAAS,UAAU,CAAC,CAAC,IAAI,SAAS,UAAU,CAAC,IAAI,QAAQ,MAAM,WAAW,OAAO,eAAe,CAAC;EAChJ,IAAI,CAAC,MAAM,QAAQ;EACnB,MAAM,SAAS,MAAM,MAAM,OAAO,IAAI;EACtC,MAAM,EAAE,OAAO,UAAU,GAAG,QAAQ;EACpC,MAAM,KAAK,GAAG,OAAO,QAAQ,MAAM,KAAK,KAAK,MAAM;EACnD,KAAK,MAAM,QAAQ,MAAM,OAAO;GAC/B,IAAI,CAAC,MAAM,OAAO,KAAK,MAAM,QAAQ,KAAK,KAAK,KAAK,QAAQ;GAC5D,MAAM,OAAO,KAAK,OAAO,MAAM,KAAK;GACpC,IAAI,SAAS,KAAA,KAAa,GAAG,OAAO,OAAO,OAAO;GAElD,IAAI;GACJ,IAAI,YAAY;GAChB,KAAK,MAAM,OAAO,OAAO;IACxB,MAAM,IAAI,OAAO,MAAM,GAAG;IAC1B,IAAI,IAAI,WAAW;KAClB,YAAY;KACZ,UAAU;IACX;GACD;GACA,IAAI,CAAC,SAAS;GACd,MAAM,SAAS,KAAK,SAAS,QAAQ,OAAO;GAC5C,MAAM,QAAQ,cAAc,KAAK,IAAI,OAAO,GAAG,MAAM,IAAI;GACzD,IAAI,YAAY,QAAQ,OAAO;GAC/B,MAAM,OAAO,KAAK,SAAS,QAAQ,IAAI;GAEvC,IAAI,KAAK,YAAY,OAAO,YAAY,aAAa;GACrD,MAAM,QAAQ,cAAc,KAAK,IAAI,IAAI,GAAG,IAAI;GAChD,MAAM,OAAO,KAAK,IAAI,GAAG,QAAQ,CAAC;GAClC,MAAM,KAAK,KAAK,IAAI,QAAQ;GAC5B,MAAM,KAAK,KAAK,IAAI,QAAQ;GAC5B,MAAM,SAAS,KAAK,KAAK,KAAK,KAAK,KAAK,EAAE,KAAK;GAC/C,IAAI,KAAK;IAAE,GAAG,KAAK,IAAK,KAAK,SAAU;IAAM,GAAG,KAAK,IAAK,KAAK,SAAU;GAAK;GAE9E,MAAM,aAAa,KAAK,KAAK,OAAO,IAAI,MAAM,MAAM,CAAC;GACrD,IAAI,aAAa,QAChB,KAAK;IACJ,GAAG,MAAM,OAAO,KAAM,GAAG,IAAI,MAAM,OAAO,KAAK,aAAc;IAC7D,GAAG,MAAM,OAAO,KAAM,GAAG,IAAI,MAAM,OAAO,KAAK,aAAc;GAC9D;GAED,KAAK;IAAE,GAAG,KAAK,IAAI,QAAQ,GAAG,KAAK,IAAI,GAAG,GAAG,CAAC,CAAC;IAAG,GAAG,KAAK,IAAI,QAAQ,GAAG,KAAK,IAAI,GAAG,GAAG,CAAC,CAAC;GAAE;GAC5F,IAAI,OAAO,IAAI,IAAI,IAAI,MAAW;GAClC,KAAK,OAAO,MAAM,KAAK,MAAM,GAAG;GAChC,MAAM,OAAO,KAAK,KAAK,EAAE;GACzB,GAAG,KAAK;IAAE,MAAM;IAAS,UAAU,CAAC,KAAK,EAAE;IAAG,OAAO;KAAE,MAAM;KAAQ,OAAO;IAAG;GAAE,CAAC;GAClF,GAAG,KAAK;IAAE,MAAM;IAAU,UAAU,CAAC,KAAK,EAAE;IAAG,OAAO,MAAM,EAAE;IAAG,OAAO;GAAK,CAAC;EAC/E;CACD;;;;;CAQA,QAAgB,OAAoB;EACnC,IAAI,KAAK,QAAQ,mBAAmB,OAAO;EAC3C,MAAM,EAAE,OAAO;EACf,MAAM,EAAE,SAAS;EACjB,MAAM,QAAQ,MAAM,MAAM,SAAS,OAAO;EAC1C,IAAI,CAAC,MAAM,QAAQ;EACnB,MAAM,QAAQ,cAAc,GAAG,QAAQ;EACvC,MAAM,UAAU,MAAM,KAAK,MAAM;EACjC,MAAM,YAAY,KAAK,QAAQ,MAAM,CAAC,CAAC,UAAU;EACjD,MAAM,KAAK,GAAG,OAAO,QAAQ,MAAM,KAAK,KAAK,MAAM;EACnD,KAAK,MAAM,QAAQ,OAAO;GACzB,IAAI,KAAK,KAAK,QAAQ;GACtB,MAAM,OAAO,KAAK,OAAO,MAAM,KAAK;GAEpC,IADmB,QAAQ,KAAK,MAAM,gBAAgB,CAAC,CAAC,SAAS,GACjD;IACf,OAAO,KAAK,OAAO,MAAM,KAAK;IAC9B;GACD;GACA,MAAM,QAAQ,cAAc,KAAK,IAAI,IAAI,GAAG,KAAK,SAAS,QAAQ,IAAI,CAAC,IAAI;GAC3E,MAAM,OAAO,UAAU,KAAK,MAAM,KAAK,CAAC,CAAC,QAAQ;GACjD,MAAM,UAAU,QAAQ,KAAK,MAAM,aAAa,SAAS,OAAO,KAAK,MAAM;GAC3E,IAAI,KAAK,WAAW,CAAC,WAAW,GAAG,OAAO,KAAK,SAAS,QAAQ;IAE/D,MAAM,SACL,KAAK,QAAQ,aAAa,CAAC,CAAC,KAAK,IAAI,QAAQ,CAAC,CAAC,SAAS,MAAM,CAAC,CAAC,MAAM,GAAG,MAAM,OAAO,GAAG,IAAI,IAAI,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,MAAM,KAAK,QAAQ,IAAI;IAC1I,IAAI,CAAC,WAAW,QAAQ,OAAO,OAAO,IAAI;KACzC,KAAK,OAAO,MAAM,KAAK,MAAM;MAAE,QAAQ,OAAO;MAAI,OAAO,GAAG;KAAK;KACjE,GAAG,KAAK;MAAE,MAAM;MAAU,UAAU,CAAC,KAAK,EAAE;MAAG,OAAO,MAAM,MAAM;MAAG,QAAQ,OAAO;KAAG,CAAC;KACxF,GAAG,KAAK;MAAE,MAAM;MAAU,UAAU,CAAC,KAAK,EAAE;MAAG,OAAO,MAAM,EAAE;MAAG,OAAO;KAAK,CAAC;KAC9E,GAAG,OAAO,GAAG,KAAK,KAAK,GAAG,KAAK,GAAG,gBAAgB,OAAO,KAAK,MAAM,MAAM,MAAM,KAAK,EAAE,MAAM,QAAQ,CAAC;IACvG,OAAO,KAAK,OAAO,MAAM,KAAK,GAAG,CAAC,QAAQ,GAAG;IAC7C,MAAM,MAAM,KAAK,KAAK,EAAE;IACxB;GACD;GACA,IAAI,SAAS,MAAM,MAAM,KAAK,KAAK,EAAE;GAErC,MAAM,MAAM,QAAQ,QAAQ,IAAI;GAChC,IAAI,CAAC,KAAK;GAEV,IADc,KAAK,KAAK,OAAO,MAAM,QAAQ,GAAG,CAAC,IAAI,KAAK,KAAK,OAAO,MAAM,GAAG,CAAC,KACnE,KAAM,QAAQ,GAAG,OAAO,KAAK,QAAQ,OAAQ;GAC1D,MAAM,KAAK,MAAM,OAAO,IAAI,IAAI;GAChC,MAAM,KAAK,MAAM,OAAO,IAAI,IAAI;GAChC,MAAM,SAAS,KAAK,KAAK,KAAK,KAAK,KAAK,EAAE,KAAK;GAC/C,MAAM,KAAK;IAAE,GAAG,MAAM,OAAO,IAAK,KAAK,SAAU;IAAc,GAAG,MAAM,OAAO,IAAK,KAAK,SAAU;GAAa;GAChH,KAAK,OAAO,MAAM,KAAK,MAAM;IAAE,QAAQ;IAAG,OAAO,GAAG;GAAK;GACzD,MAAM,MAAM,KAAK,KAAK,EAAE;GACxB,GAAG,KAAK;IAAE,MAAM;IAAS,UAAU,CAAC,KAAK,EAAE;IAAG,OAAO;KAAE,MAAM;KAAQ,OAAO;IAAG;GAAE,CAAC;GAClF,GAAG,KAAK;IAAE,MAAM;IAAU,UAAU,CAAC,KAAK,EAAE;IAAG,OAAO,MAAM,EAAE;IAAG,OAAO;GAAK,CAAC;EAC/E;CACD;;CAKA,OAAe,MAAuC;EAErD,MAAM,KADO,KAAK,GAAG,KAAK,QAAQ,MAAM,MAC7B,IAAQ,KAAK,QAAQ,cAAc,MAAS,KAAK,QAAQ,aAAa;EACjF,OAAO,OAAO,SAAS,EAAE,KAAK,KAAK,KAAA,IAAY;CAChD;;CAGA,SAAiB,MAA2B;EAC3C,MAAM,QAAQ,KAAK,GAAG,KAAK,SAAS,QAAQ,IAAI;EAChD,OAAO,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,KAAK,SAAS,KAAK,IAAI,GAAG,KAAK,aAAa,MAAM,MAAM,CAAC,CAAC;CAC1F;;CAGA,KAAa,OAAoB;EAChC,KAAK,MAAM,QAAQ,MAAM,OAAO;GAC/B,MAAM,KAAK,KAAK,OAAO,IAAI;GAC3B,IAAI,OAAO,KAAA,KAAa,KAAK,KAAK,QAAQ;GAC1C,IAAI,KAAK,SAAS,IAAI,KAAK,IAAI;GAE/B,IAAI,CAAC,MAAM,KAAK,MAAM,QAAQ,OAAO,MAAM,GAAG,KAAA,EAAsB,GAAG;GACvE,KAAK,aAAa,MAAM,MAAM,OAAO,MAAM;EAC5C;CACD;;CAGA,UAAwB;EACvB,IAAI,CAAC,KAAK,QAAQ,gBAAgB;EAClC,MAAM,EAAE,OAAO;EACf,MAAM,EAAE,SAAS;EACjB,MAAM,OAAO,KAAK,QAAQ,YAAY;EACtC,MAAM,UAAU,KAAK,QAAQ,MAAM;EACnC,KAAK,MAAM,SAAS,GAAG,OAAO,IAAI,GAAG;GACpC,IAAI,CAAC,KAAK,QAAQ,KAAK,KAAK,KAAK,OAAO,MAAM,UAAU,MAAM,UAAU,KAAK,GAAG;GAChF,KAAK,MAAM,QAAQ,MAAM,MAAM,GAAG;IACjC,IAAI,KAAK,KAAK,UAAU,KAAK,SAAS,IAAI,KAAK,MAAM;IACrD,IAAI,KAAK,SAAS,QAAQ,IAAI,CAAC,CAAC,eAAe,GAAG;IAClD,IAAI,QAAQ,KAAK,MAAA,EAAiB,CAAC,CAAC,QAAQ;IAC5C,KAAK,aAAa,MAAM,OAAO,SAAS;GACzC;EACD;CACD;;;;;CAMA,OAAe,MAAmB,MAAqB;EACtD,MAAM,EAAE,SAAS,KAAK;EACtB,MAAM,YAAY,KAAK,KAAK,UAAU,CAAC,CAAC,SAAS;EACjD,IAAI;EACJ,IAAI,SAAS;EACb,IAAI,OAAO;EACX,KAAK,MAAM,YAAY,WAAW;GACjC,MAAM,QAAQ,KAAK,OAAO,GAAG,QAAQ,CAAC,CAAC,UAAU;GACjD,IAAI,QAAQ,CAAC,OAAO;GACpB,MAAM,IAAI,OAAO,MAAM,QAAQ;GAC/B,IAAK,SAAS,CAAC,QAAS,IAAI,QAAQ;IACnC,OAAO;IACP,SAAS;IACT,OAAO;GACR;EACD;EACA,IAAI,MAAM,OAAO,MAAM,IAAI;EAC3B,MAAM,OAAO,KAAK,KAAK;EACvB,IAAI,MAAM,OAAO,MAAM,IAAI;EAC3B,MAAM,MAAM,KAAK,QAAQ,IAAI;EAC7B,MAAM,KAAK,MAAM,KAAK,IAAI,IAAI,IAAI;EAClC,MAAM,KAAK,MAAM,KAAK,IAAI,IAAI,IAAI;EAClC,MAAM,SAAS,KAAK,KAAK,KAAK,KAAK,KAAK,EAAE,KAAK;EAC/C,MAAM,EAAE,OAAO,UAAU,KAAK,GAAG,QAAQ;EACzC,OAAO;GACN,GAAG,KAAK,IAAI,QAAQ,GAAG,KAAK,IAAI,GAAG,KAAK,IAAK,KAAK,SAAU,SAAS,CAAC;GACtE,GAAG,KAAK,IAAI,QAAQ,GAAG,KAAK,IAAI,GAAG,KAAK,IAAK,KAAK,SAAU,SAAS,CAAC;EACvE;CACD;;CAGA,aAAqB,MAAmB,MAAa,KAA+B;EACnF,MAAM,EAAE,OAAO;EACf,MAAM,KAAK,KAAK,OAAO,MAAM,GAAG,KAAK,QAAQ,MAAM,CAAC;EACpD,MAAM,UAAU,GAAG,OAAO,MAAM,OAAO,KAAK,GAAG,OAAO,KAAK,SAAS,CAAC,GAAG;GAAE,OAAO;GAAO,WAAW;GAAO,aAAa;GAAO,OAAO;EAAM,CAAC;EAC5I,IAAI,CAAC,QAAQ,SAAS,QAAQ,KAAK,KAAK,EAAE;EAC1C,QAAQ,IAAI,CAAC,KAAK,EAAE,GAAG,QAAQ,SAAS,SAAS,cAAc;EAC/D,IAAI,CAAC,QAAQ,KAAK,MAAM,SAAS,KAAK,EAAE,GAAG;EAC3C,KAAK,OAAO,KAAK,KAAK,MAAM;GAAE,OAAO,KAAK;GAAM,OAAO,GAAG;GAAM;GAAI;EAAI;EACxE,MAAM,QAAQ,QAAQ;EACtB,IAAI,MAAM,UAAU,YAAY;GAE/B,MAAM,QAAQ;GACd,MAAM,aAAa,GAAG;EACvB;EACC,MAAO,OAAO,OAAgC,CAAC;EAC/C,MAAO,OAAO,GAA4B,KAAK,MAAM;EACtD,GAAG,KAAK;GAAE,MAAM;GAAS,UAAU,CAAC,KAAK,EAAE;GAAG,OAAO;IAAE,MAAM;IAAQ,OAAO;GAAG;EAAE,CAAC;EAClF,GAAG,OACF,QAAQ,SACL,GAAG,KAAK,KAAK,GAAG,KAAK,GAAG,YAAY,QAAQ,KAAK,SAAS,IAAI,CAAC,EAAE,MAAM,MAAM,EAAE,MAC/E,GAAG,KAAK,KAAK,GAAG,KAAK,GAAG,mBAAmB,MAAM,EAAE,EAAE,IAAI,QAAQ,KAAK,SAAS,IAAI,CAAC,KACvF,EAAE,MAAM,QAAQ,CACjB;CACD;;;;;CAMA,OAAqB;EACpB,MAAM,EAAE,OAAO;EACf,MAAM,EAAE,SAAS;EACjB,MAAM,UAAU,GAAG,OAAO,MAAM,OAAO;EACvC,IAAI,CAAC,SAAS;GACb,KAAK,OAAO,OAAO,CAAC;GACpB;EACD;EACA,MAAM,OAAO,KAAK,QAAQ,YAAY;EACtC,MAAM,UAAU,KAAK,QAAQ,MAAM;EACnC,MAAM,QAAQ,QAAQ;EACtB,KAAK,MAAM,QAAQ,QAAQ,MAAM,GAAG;GACnC,MAAM,OAAO,KAAK,OAAO,KAAK,KAAK;GACnC,MAAM,SAAS,KAAK,SAAS,IAAI;GACjC,MAAM,SAAS,UAAU;GACzB,MAAM,QAAQ,KAAK,SAAS,QAAQ,IAAI;GACxC,MAAM,OAAO,MAAM,eAAe,MAAO,OAAO,UAAU,MAAM,SAAU,MAAM,cAAc;GAE9F,IAAI,OAAO;GACX,IAAI,CAAC,UAAU,CAAC,KAAK,QAAQ,iBAAiB,MAAM;IACnD,MAAM,QAAQ,MAAM,SAAS,QAAQ,SAAS,SAAS,GAAG;IAC1D,OAAO,GAAG,OAAO,SAAS,YAAY,GAAG,QAAQ,YAAY,CAAC,QAAQ,KAAK,MAAA,EAAiB,CAAC,CAAC;GAC/F;GACA,IAAI,CAAC,UAAU,CAAC,MAAM;GACtB,QAAQ,OAAO,CAAC,KAAK,EAAE,GAAG,MAAM;GAChC,IAAI,OAAO,OAAQ,MAAM,OAAO,KAA0C,KAAK;GAC/E,OAAO,KAAK,OAAO,KAAK,KAAK;GAC7B,MAAM,QAAQ,UAAU,MAAM,QAAQ,GAAG,OAAO,MAAM,KAAK,KAAK,IAAI,KAAA;GACpE,IAAI,SAAS,MAAM,SAAS,CAAC,MAAM,MAAM;IACxC,MAAM,IAAI,CAAC,KAAK,EAAE,GAAG,mBAAmB;IACxC,MAAM,OAAO,MAAM,OAAO,KAAK,GAAG,OAAO,QAAQ,KAAK;IACtD,IAAI,MAAM,KAAK,MAAM,SAAS,KAAK,EAAE,KAAK,MAAM,GAAG,KAAK;KAAE,MAAM;KAAU,UAAU,CAAC,KAAK,EAAE;KAAG,OAAO,MAAM,IAAI;IAAE,CAAC;IACnH,GAAG,OAAO,GAAG,KAAK,KAAK,GAAG,KAAK,GAAG,aAAa,MAAM,KAAK,MAAM,QAAQ,MAAM,KAAK,EAAE,MAAM,QAAQ,CAAC;GACrG,OAAO,GAAG,OAAO,GAAG,KAAK,KAAK,GAAG,KAAK,GAAG,WAAW,QAAQ,MAAM,KAAK,EAAE,MAAM,QAAQ,CAAC;EACzF;EACA,IAAI,CAAC,QAAQ,KAAK,MAAM,QAAQ,QAAQ,QAAQ,gBAAgB;CACjE;;;;;;CASA,SAAe;EACd,IAAI,CAAC,KAAK,MAAM,QAAQ,GAAG;EAC3B,KAAK,OAAO;EACZ,IAAI,KAAK,QAAQ,WAAW,OAAO;EACnC,MAAM,EAAE,OAAO;EACf,MAAM,EAAE,SAAS;EACjB,MAAM,EAAE,aAAa;EAErB,MAAM,UAAU,KAAK,QAAQ,MAAM,CAAC,CAAC,MAAM;EAC3C,IAAI,CAAC,QAAQ,QAAQ;EACrB,MAAM,UAAU,KAAK,IACnB,QAAQ,CAAC,CACT,MAAM,CAAC,CACP,OAAO,QAAQ,QAAQ,CAAC,KAAK,UAAU,MAAM,KAAK,CAAC,CAAC,IAAI,SAAS,MAAM;EACzE,KAAK,MAAM,UAAU,KAAK,MAAM;GAC/B,IAAI,CAAC,OAAO,KAAK,WAAW,UAAU,OAAO,IAAI,UAAU,OAAO,IAAI,UAAU,QAAQ;GACxF,IAAI,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC,CAAC,QAAQ;GACtC,KAAK,MAAM,SAAS,OAAO,IAAI,WAAW;IACzC,MAAM,UAAU,SAAS,QAAQ,MAAM,EAAE;IACzC,IAAI,MAAM,QAAQ,KAAK,MAAM,WAAW,KAAK,MAAM,YAAY,KAAK,QAAQ,WAAW,aAAa,MAAM,UAAU;IAEpH,MAAM,OAAO,WAAW,UAAU,MAAM;IACxC,MAAM,OAAO,GAAG,QAAQ,UAAU,MAAM,KAAK;IAC7C,IAAI,OAAO,IAAI,OAAO,QAAQ,OAAO,SAAS,QAAQ,OAAO,QAAQ,IAAI;IAEzE,MAAM,UAAU,QAAQ,cAAc,KAAK,SAAS,QAAQ,MAAM,CAAC,CAAC,cAAc;IAClF,MAAM,OAAO,QAAQ,KAAK,QAAQ,GAAG,QAAQ,OAAO,MAAM,KAAK,IAAI,UAAU,CAAC,CAAC,CAAC;IAChF,MAAM,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC,CAAC;IACtC,MAAM,MAAM,KAAK,IAAI,QAAQ,SAAS,MAAM,OAAO,MAAM,IAAI;IAC7D,IAAI,CAAC,KAAK;IACV,GAAG,KAAK;KAAE,MAAM;KAAQ,UAAU,CAAC,OAAO,EAAE;KAAG,SAAS,QAAQ;KAAI,OAAO,MAAM,IAAI,KAAK;KAAG,QAAQ,IAAI;KAAQ,GAAI,IAAI,MAAM,EAAE,IAAI,MAAM,IAAI,EAAE,EAAE;IAAG,CAAC;IACvJ,KAAK;IACL;GACD;EACD;CACD;;;;;CAMA,IACC,QACA,SACA,OACA,SACA,SAC0D;EAC1D,MAAM,EAAE,OAAO;EACf,MAAM,EAAE,SAAS;EACjB,MAAM,EAAE,aAAa;EACrB,MAAM,MAAM,KAAK,QAAQ,UAAU,KAAK,QAAQ,OAAO,QAAQ;EAC/D,IAAI,KAAK;GACR,MAAM,UAAU,IAAI,IAAI,QAAQ,SAAS,SAAS,KAAK;GACvD,IAAI,YAAY,KAAA,GAAW,OAAO,WAAW,KAAA;EAC9C;EACA,IAAI,QAAQ,IAAI;GACf,MAAM,UAAU,QAAQ,GACvB;IAAE,UAAU,GAAG;IAAU;IAAU,UAAU,GAAG;IAAU,SAAS,CAAC,GAAG,OAAO;IAAG,SAAS,CAAC,GAAG,OAAO;GAAE,GACvG,QACA,KACD;GACA,IAAI,YAAY,KAAA,GAAW,OAAO,WAAW,KAAA;EAC9C;EAEA,IAAI,CAAE,UAAgC,SAAS,QAAQ,MAAM,GAAG,OAAO,KAAA;EACvE,MAAM,WAAW,OAAgB,CAAC,CAAC,MAAM,CAAC,CAAC,SAAS,KAAK,EAAE,CAAC,CAAC;EAE7D,MAAM,MAAM,WAAW,QAAQ,OAAO;EAEtC,MAAM,QADU,IAAI,SAAS,WAAW,CAAC,QAAQ,GAAI,UAAU,MAAM,CAAC,CAAC,WAAW,CAAC,CAAE,CACvE,CAAA,CAAQ,MAAM,WAAW,OAAO,SAAS,YAAa,OAAO,SAAS,UAAU,QAAQ,OAAO,IAAI,CAAE;EAEnH,MAAM,SAAS,QAAQ,SAAS,UAAU,IAAI,MAAM,WAAW,OAAO,MAAM,CAAC,EAAE;EAC/E,IAAI,QAAQ,UAAU,QAAQ,QAAQ,UAAU,OAAO,SAAS,KAAK,IAAI,KAAK,CAAC,CAAC,SAAS,QAAQ,QAAQ,CAAC;EAC1G,MAAM,QAAQ,IAAI,MAAM,WAAW,OAAO,SAAS,MAAM;EACzD,MAAM,OAAO,IAAI,QAAQ,KAAK,WAAW,KAAK,IAAI,KAAK,WAAW,OAAO,QAAQ,KAAK,CAAC,GAAG,CAAC;EAC3F,MAAM,SAAS,WAAwB,OAAO,aAAa,UAAU,KAAK,IAAI,MAAM,GAAG,QAAQ,CAAC,CAAC;EACjG,MAAM,WAAW,eAAuC;GACvD,IAAI;GACJ,IAAI,SAAS;GACb,KAAK,MAAM,aAAa,YAAY;IACnC,MAAM,IAAI,OAAO,QAAQ,SAAS;IAClC,IAAI,IAAI,QAAQ;KACf,SAAS;KACT,OAAO;IACR;GACD;GACA,OAAO;EACR;EAEA,IAAI,QAAQ,WAAW,QAAQ;GAC9B,IAAI,OAAO;IAEV,MAAM,OAAO,WAAW,MAAM,QAAQ,KAAK,IAAI;IAC/C,MAAM,OAAO,QACX,QAAQ,WAAW,OAAO,OAAO,OAAO,MAAM,MAAM,MAAM,IAAI,OAAO,UAAU,IAAI,CAAC,CACpF,MAAM,GAAG,MAAM,EAAE,SAAS,MAAM,CAAC,IAAI,EAAE,SAAS,MAAM,CAAC,CAAC,CAAC,CAAC;IAC5D,OAAO,QAAQ;KAAE,OAAO;KAAM,QAAQ,KAAK;IAAG;GAC/C;GACA,IAAI,OAAO;IACV,MAAM,SAAS,QAAQ,OAAO;IAC9B,OAAO,UAAU;KAAE,OAAO;KAAQ,QAAQ,OAAO;IAAG;GACrD;GACA,MAAM,OAAO,IAAI,MAAM,WAAW,OAAO,SAAS,MAAM,CAAC,EAAE;GAC3D,MAAM,SAAS,QAAQ,MAAM,WAAW,CAAC,OAAO,OAAO,SAAS,QAAQ,EAAE,CAAC;GAC3E,OAAO,UAAU;IAAE,OAAO;IAAQ,QAAQ,OAAO;GAAG;EACrD;EAEA,IAAI,QAAQ,WAAW,UAAU;GAEhC,MAAM,SAAS,QAAQ,OAAO;GAC9B,MAAM,QAAQ,GAAG,QAAQ,OAAO,KAAK;GACrC,IAAI,CAAC,UAAU,OAAO,QAAQ,MAAM,IAAI,QAAQ,OAAO,OAAO,KAAA;GAC9D,MAAM,MAAM,KAAK,KAAK,OAAO,QAAQ,MAAM,CAAC,KAAK;GACjD,MAAM,KAAK;IAAE,GAAG,OAAO,KAAK,OAAO,IAAI,OAAO,KAAK;IAAK,GAAG,OAAO,KAAK,OAAO,IAAI,OAAO,KAAK;GAAI;GAClG,OAAO;IAAE,OAAO;KAAE,GAAG,OAAO;KAAG,GAAG,OAAO;IAAE;IAAG,IAAI;GAAG;EACtD;EAEA,IAAI,QAAQ,WAAW,aAAa;GACnC,MAAM,UAAU,IAAI,MAAM,WAAW,OAAO,SAAS,SAAS;GAC9D,MAAM,QAAQ,GAAG,SAAS,UAAU,OAAO,EAAE;GAC7C,MAAM,SAAS,QAAQ,OAAO;GAC9B,OAAO,UAAU,OAAO,QAAQ,MAAM,KAAK,QAAQ,QAAQ,EAAE,OAAO;IAAE,GAAG,OAAO;IAAG,GAAG,OAAO;GAAE,EAAE,IAAI,KAAA;EACtG;EAEA,IAAI,OAAO;GAEV,MAAM,UAAU,QAAQ,WAAW,SAAS,CAAC,MAAM,IAAI;GACvD,MAAM,QAAQ,QAAQ;GACtB,MAAM,OAAO,QAAQ,YAAY,QAAQ,gBAAgB,IAAI;GAC7D,IAAI;GACJ,IAAI,OAAO,OAAO;GAClB,KAAK,MAAM,UAAU,SAAS;IAC7B,MAAM,SAAS,QAAQ,QAAQ,UAAU,OAAO,QAAQ,KAAK,KAAK,QAAQ,KAAK,CAAC,CAAC;IACjF,IAAI,SAAS,MAAM;KAClB,OAAO;KACP,OAAO;IACR;GACD;GACA,OAAO,QAAQ,EAAE,OAAO;IAAE,GAAG,KAAK;IAAG,GAAG,KAAK;GAAE,EAAE;EAClD;EAEA,OAAO,QAAQ,MAAM,UAAU,OAAO,QAAQ,KAAK,IAAI,EAAE,IAAI,EAAE,OAAO,OAAO,IAAI,KAAA;CAClF;;CAKA,QAAc;EACb,IAAI,CAAC,KAAK,MAAM,OAAO,GAAG;EAC1B,MAAM,EAAE,OAAO;EACf,MAAM,EAAE,SAAS;EACjB,MAAM,EAAE,aAAa;EACrB,MAAM,UAAU,KAAK,QAAQ,YAAY;EACzC,MAAM,YAAY,KAAK,QAAQ,cAAc;EAC7C,MAAM,UAAU,KAAK,QAAQ,MAAM;EACnC,KAAK,MAAM,QAAQ,KAAK,MAAM;GAC7B,MAAM,YAAY,KAAK,OAAO,WAAW,MAAM,cAAc,CAAC,EAAE;GAChE,IAAI,CAAC,aAAa,KAAK,KAAK,QAAQ;GACpC,MAAM,QAAQ,KAAK,SAAS,QAAQ,IAAI;GACxC,MAAM,QAAQ,KAAK,aAAa,MAAM;GACtC,MAAM,UAAU,KAAK,WAAW,MAAM;GACtC,IAAI,SAAS;IACZ,IAAI,QAAQ;IACZ,KAAK,MAAM,QAAQ,WAAW;KAC7B,MAAM,UAAU,QAAQ,SAAS,KAAK,KAAK,IAAI,CAAC,CAAC;KAEjD,IAAI,CAAC,QAAQ,CAAC,WAAW,KAAK,WAAW,KAAK,KAAK,SAAS,GAAG;KAC/D,MAAM,UAAU,SAAS,QAAQ,OAAO,CAAC,CAAC;KAC1C,MAAM,QAAQ,QAAQ,MAAM,WAAW,OAAO,SAAS,MAAM;KAC7D,MAAM,WAAW,QAAQ,MAAM,WAAW,OAAO,SAAS,MAAM;KAChE,IAAK,SAAS,KAAK,SAAS,QAAQ,gBAAkB,YAAY,UAAU,MAAM,KAAK,QAAQ,KAAK,UAAU,YAAa;MAC1H,GAAG,KAAK;OAAE,MAAM;OAAS,UAAU,CAAC,KAAK,EAAE;OAAG,OAAO;QAAE,MAAM;QAAQ,MAAM,KAAK;OAAG;MAAE,CAAC;MACtF,QAAQ;MACR;KACD;IACD;IACA,IAAI,OAAO;GACZ;GACA,IAAI,KAAK,KAAK,OAAO;GACrB,IAAI,aAAa,UAAU,SAAS,IAAI,GAAG;IAC1C,IAAI;IACJ,IAAI,UAAU;IACd,KAAK,MAAM,QAAQ,KAAK,OAAO;KAC9B,MAAM,IAAI,OAAO,MAAM,IAAI;KAC3B,IAAI,IAAI,SAAS;MAChB,UAAU;MACV,QAAQ;KACT;IACD;IACA,IAAI,OAAO;KACV,GAAG,KAAK;MAAE,MAAM;MAAS,UAAU,CAAC,KAAK,EAAE;MAAG,OAAO;OAAE,MAAM;OAAU,MAAM,MAAM;MAAG;KAAE,CAAC;KACzF;IACD;GACD;EACD;EACA,KAAK,KAAK,OAAO;EACjB,KAAK,KAAK,OAAO;CAClB;;CAGA,OAAe,MAAuC;EACrD,MAAM,EAAE,OAAO;EACf,MAAM,EAAE,aAAa,GAAG;EAExB,MAAM,OADO,KAAK,OAAO,KAAK,IACjB,CAAA,EAAM,SAAS,KAAK,QAAQ;EACzC,IAAI,SAAS,OAAO,OAAO,KAAA;EAC3B,IAAI,OAAO,SAAS,YAAY,OAAO,KAAK,IAAI,IAAI;EACpD,MAAM,QAAQ,WAAW,MAAM,cAAc,CAAC,EAAE,SAAS,CAAC;EAC1D,MAAM,WAAW,SAAiB,MAAM,QAAQ,SAAS,MAAM,SAAS,IAAI,CAAC,CAAC;EAC9E,IAAI,MAAM,QAAQ,IAAI,GAAG;GACxB,KAAK,MAAM,QAAQ,MAAM;IACxB,IAAI,CAAC,SAAS,MAAM,IAAI,KAAK,IAAI,GAAG;IACpC,IAAI,QAAQ,KAAK,IAAI,MAAM,KAAK,SAAS,IAAI;IAC7C,IAAI,KAAK,SAAS,KAAA,KAAa,CAAC,SAAS,KAAK,MAAM,EAAE,GAAG;IACzD,OAAO,KAAK;GACb;GACA;EACD;EAEA,MAAM,QAAQ,GAAG,MAAM;EACvB,MAAM,SAAS,QACd,CAAC,CAAC,IAAI,WAAW,SAAS,UAAU,IAAI,IAAI,OAAO,KAAK,SAAS,QAAQ,IAAI,OAAO,CAAC,CAAC,QAAQ,MAAM,WAAW,OAAO,SAAS,MAAM;EACtI,IAAI,MAAM,MAAM,SAAS,QAAQ,MAAM,SAAS,KAAK,KAAK,IAAI,CAAC,CAAC,GAAG,OAAO,KAAA;EAK1E,OAJiB,SAAS,MACxB,IAAI,CAAC,CACL,QAAQ,QAAQ,MAAM,GAAG,MAAM,IAAI,KAAK,UAAU,KAAK,CAAC,CAAC,CACzD,MAAM,GAAG,OAAO,EAAE,KAAK,UAAU,MAAM,EAAE,KAAK,UAAU,EAAE,CAAC,CAAC,EACvD,EAAU;CAClB;;;;;CAMA,KAAa,SAAwB;EACpC,IAAI,KAAK,QAAQ,aAAa,OAAO;EACrC,MAAM,EAAE,OAAO;EACf,MAAM,EAAE,SAAS;EACjB,MAAM,EAAE,aAAa;EAErB,MAAM,UAAU,GAAG,MAAM,uBAAuB,IAAI,IAAI,SAAS,MAAM,IAAI,CAAC,CAAC,SAAS,QAAS,IAAI,OAAO,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,CAAE,CAAC,CAAC;EACnI,MAAM,QAAQ,IAAI,QACjB,MACA,KAAK,IAAI,MAAM,CAAC,CAAC,QAAQ,WAAW,QAAQ,IAAI,OAAO,IAAI,KAAK,CAAC,CAAC,WAAW,QAAQ,SAAS,KAAK,CAAC,KAAK,UAAU,MAAM,CAAC,CAC3H;EACA,IAAI,CAAC,MAAM,QAAQ;GAClB,KAAK,OAAO,WAAW,CAAC;GACxB;EACD;EACA,MAAM,QAAQ,KAAK,OAAO;EAC1B,KAAK,MAAM,QAAQ,KAAK,KAAK,OAAO,GAAG;GACtC,MAAM,MAAM,KAAK;GACjB,MAAM,QAAQ,OAAO,WAAW,MAAM,cAAc,CAAC,EAAE;GACvD,IAAI,CAAC,OAAO,CAAC,SAAS,IAAI,QAAQ;GAClC,MAAM,QAAQ,GAAG,OAAO,QAAQ,IAAI;GACpC,MAAM,OAAQ,SAAS,CAAC,MAAM,QAAS,QAAQ,KAAK,MAAA,EAAiB,CAAC,CAAC,SAAS;GAChF,IAAI,SAAsD,MAAM,KAAK;GACrE,IAAI,WAAW,QAAQ,CAAC,MAAM,SAAS,IAAI,IAAI;IAC9C,OAAO,MAAM,KAAK;IAClB,SAAS,KAAA;GACV;GACA,IAAI,MAAM;GACV,IAAI,CAAC,QAAQ;IACZ,IAAI,IAAI,SAAS,CAAC,MAAM,SAAS,IAAI,GAAG;IACxC,MAAM,OAAO,KAAK,OAAO,IAAI;IAC7B,IAAI,CAAC,QAAQ,CAAC,SAAS,MAAM,IAAI,IAAI,GAAG;IACxC,MAAM,MAAM,SAAS,KAAK,IAAI;IAC9B,IAAI,CAAC,GAAG,MAAM,QAAQ,IAAI,MAAM,GAAG,iBAAiB,GAAG;IAIvD,MAAM,OAHU,MAAM,OACpB,WAAW,CAAC,CAAC,WAAW,QAAQ,SAAS,CAAC,CAAE,MAAM,UAAU,MAAM,SAAS,SAAS,MAAM,UAAU,KAAA,KAAa,MAAM,QAAQ,EAAE,CAEtH,CAAA,CAAQ,KAAK,MAAM,UAAU,CAAC,CAAC,QAAQ,IAAI;IACxD,IAAI,CAAC,MAAM;IACX,SAAS,MAAM,KAAK,MAAM;KAAE,MAAM,KAAK;KAAI;KAAM,OAAO,GAAG;IAAK;IAChE,GAAG,KAAK;KAAE,MAAM;KAAS,UAAU,CAAC,KAAK,EAAE;KAAG,OAAO;MAAE,MAAM;MAAQ,OAAO,MAAM,IAAI;KAAE;IAAE,CAAC;IAC3F,GAAG,OAAO,GAAG,KAAK,KAAK,GAAG,KAAK,GAAG,eAAe,KAAK,KAAK,MAAM,MAAM,IAAI,EAAE,OAAO,GAAG,IAAI,QAAQ,IAAI,KAAK,EAAE,MAAM,QAAQ,CAAC;GAC9H;GACA,MAAM,OAAO,KAAK,KAAK,OAAO,IAAI;GAClC,MAAM,MAAM,SAAS,KAAK,OAAO,IAAI;GACrC,IAAI,CAAC,QAAQ,CAAC,WAAW,MAAM,SAAS,CAAC,EAAE,MAAM,UAAU,MAAM,SAAS,OAAQ,SAAS,MAAM,UAAU,KAAA,KAAa,MAAM,QAAQ,EAAE,GAAG;IAC1I,OAAO,MAAM,KAAK;IAClB;GACD;GACA,MAAM,QAAQ,UAAU,KAAK,IAAI,IAAI,CAAC,CAAC;GACvC,IAAI,OAAO,MAAM,IAAI,KAAK,QAAQ,OAAO;IACxC,OAAO,MAAM,KAAK;IAClB,IAAI,CAAC,GAAG,MAAM,MAAM,IAAI,MAAM,iBAAiB,GAAG;IAClD,GAAG,KAAK;KAAE,MAAM;KAAO,MAAM,KAAK;KAAI,MAAM,OAAO;KAAM,MAAM,KAAK;IAAG,CAAC;IACxE,GAAG,OAAO,GAAG,KAAK,KAAK,GAAG,KAAK,GAAG,QAAQ,GAAG,IAAI,QAAQ,OAAO,IAAI,EAAE,UAAU,KAAK,QAAQ,EAAE,MAAM,QAAQ,CAAC;IAC9G;GACD;GAEA,GAAG,MAAM,QAAQ,kBAAkB,KAAK,MAAM,IAAI,MAAM,iBAAiB;GACzE,IAAI,CAAC,IAAI,SAAS,GAAG,OAAO,OAAO,SAAS,cAAc,GAAG,QAAQ,UAAU;IAC9E,OAAO,QAAQ,GAAG;IAClB,GAAG,KAAK;KAAE,MAAM;KAAS,UAAU,CAAC,KAAK,EAAE;KAAG,OAAO;MAAE,MAAM;MAAQ,OAAO,MAAM,IAAI;KAAE;IAAE,CAAC;GAC5F;EACD;CACD;;CAGA,OAAe,SAA0D;EACxE,MAAM,EAAE,OAAO;EACf,MAAM,EAAE,SAAS;EACjB,MAAM,EAAE,WAAW,KAAK;EACxB,IAAI,WAAW,SAAS,CAAC,QAAQ,QAAQ,OAAO,KAAA;EAChD,IAAI,OAAO,WAAW,YAAY;GACjC,MAAM,KAAK,OAAO,IAAI,OAAO;GAC7B,OAAO,OAAO,KAAA,IAAY,KAAA,IAAY,QAAQ,MAAM,QAAQ,IAAI,OAAO,EAAE;EAC1E;EACA,IAAI,MAAM,QAAQ,MAAM,GAAG;GAC1B,KAAK,MAAM,QAAQ,QAAQ;IAC1B,MAAM,MAAM,QAAQ,MAAM,SAAS,KAAK,OAAO,KAAK,IAAI;IACxD,IAAI,CAAC,KAAK;IACV,IAAI,KAAK,KAAK,OAAO,IAAI,EAAE,CAAC,CAAC,WAAW,KAAK,SAAS,IAAI;IAC1D,IAAI,KAAK,SAAS,KAAA,KAAa,CAAC,SAAS,KAAK,MAAM,EAAE,GAAG;IACzD,OAAO;GACR;GACA;EACD;EAEA,MAAM,QAAQ,GAAG,MAAM;EACvB,MAAM,WAAW,QAAQ,QAAQ,QAAQ,CAAC,IAAI,QAAQ,KAAK,QAAQ,IAAI,IAAI,SAAS,CAAC;EAErF,IADc,KAAK,KAAK,OAAO,WAAW,SAAS,MAAM,QAAQ,IAAI,OAAO,OAAO,IAAI,CAAC,CAAC,CAAC,UAC7E,aAAa,OAAO,KAAA;EACjC,MAAM,SAAS,QAAqB,KAAK,SAAS,GAAG,GAAG,IAAI,KAAK,IAAI,GAAG,IAAI,OAAO,UAAU,CAAC;EAC9F,MAAM,OAAO,CAAC,GAAG,QAAQ,CAAC,CAAC,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC;EAC/D,OAAO,QAAQ,GAAG,MAAM,QAAQ,KAAK,QAAQ,CAAC,GAAG,cAAc,eAAe,IAAI,OAAO,KAAA;CAC1F;;;;;;CAOA,KAAa,SAAwB;EACpC,IAAI,KAAK,QAAQ,cAAc,SAAS,KAAK,QAAQ,WAAW,OAAO;EACvE,MAAM,EAAE,OAAO;EACf,MAAM,EAAE,SAAS;EACjB,MAAM,EAAE,aAAa;EAErB,MAAM,SAAS,GAAG,MAAM,sBAAsB,IAAI,IAAI,SAAS,MAAM,IAAI,CAAC,CAAC,SAAS,QAAS,IAAI,OAAO,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,CAAE,CAAC,CAAC;EACjI,IAAI,CAAC,OAAO,MAAM;EAClB,MAAM,SAAS,IAAI,QAClB,MACA,KAAK,IAAI,MAAM,CAAC,CAAC,QAAQ,WAAW,OAAO,IAAI,OAAO,IAAI,KAAK,OAAO,SAAS,KAAK,CAAC,KAAK,UAAU,MAAM,CAAC,CAC5G;EACA,MAAM,QAAS,KAAK,OAAO,WAAW,CAAC;EACvC,IAAI,CAAC,OAAO,QAAQ;GACnB,KAAK,OAAO,SAAS,CAAC;GACtB;EACD;EACA,MAAM,aAAa,WAAwB,KAAK,IAAI,KAAK,CAAC,CAAC,SAAS,CAAC,EAAA,CAAG,QAAQ,OAAO,SAAS,MAAM,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,OAAO,SAAS,KAAK,EAAE,CAAC;EAC5I,MAAM,EAAE,OAAO;EACf,MAAM,QAAQ,SAAsB;GACnC,MAAM,QAAQ,GAAG,OAAO,QAAQ,IAAI;GACpC,OAAQ,SAAS,CAAC,MAAM,QAAS,QAAQ,KAAK,MAAA,EAAiB,CAAC,CAAC,SAAS;EAC3E;EAEA,KAAK,MAAM,CAAC,IAAI,WAAW,OAAO,QAAQ,KAAK,GAAG;GACjD,MAAM,OAAO,KAAK,KAAK,OAAO,EAAE,CAAC;GACjC,MAAM,QAAQ,KAAK,KAAK,OAAO,KAAK;GACpC,IAAI,CAAC,QAAQ,CAAC,SAAS,KAAK,UAAU,KAAK,KAAK,IAAI,KAAK,EAAE,KAAK,IAAI,KAAK,CAAC,CAAC,SAAS,CAAC,EAAA,CAAG,SAAS,OAAO,IAAI,GAAG;IAC9G,OAAO,MAAM;IACb;GACD;GACA,MAAM,MAAM,SAAS,KAAK,OAAO,IAAI;GACrC,MAAM,QAAQ,UAAU,KAAK,IAAI,KAAK,CAAC,CAAC;GACxC,IAAI,OAAO,MAAM,KAAK,KAAK,QAAQ,OAAO;IACzC,OAAO,MAAM;IACb,MAAM,SAAS,SAAS,GAAG;IAC3B,IAAK,SAAS,KAAK,GAAG,aAAa,SAAS,GAAG,aAAc,CAAC,GAAG,MAAM,MAAM,IAAI,QAAQ,CAAC,GAAG,eAAe,GAAG;IAC/G,GAAG,cAAc;IACjB,GAAG,KAAK;KAAE,MAAM;KAAQ,MAAM,MAAM;KAAI,MAAM,OAAO;IAAK,CAAC;IAC3D,GAAG,OAAO,SAAS,GAAG,IAAI,QAAQ,OAAO,IAAI,EAAE,UAAU,MAAM,QAAQ,EAAE,MAAM,QAAQ,CAAC;IACxF;GACD;GACA,GAAG,MAAM,QAAQ,gBAAgB,MAAM,IAAI,QAAQ,CAAC,GAAG,eAAe;GACtE,IAAI,CAAC,KAAK,KAAK,SAAS,GAAG,OAAO,OAAO,SAAS,cAAc,GAAG,QAAQ,UAAU;IACpF,OAAO,QAAQ,GAAG;IAClB,GAAG,KAAK;KAAE,MAAM;KAAS,UAAU,CAAC,KAAK,EAAE;KAAG,OAAO;MAAE,MAAM;MAAQ,OAAO,MAAM,KAAK;KAAE;IAAE,CAAC;GAC7F;EACD;EAEA,IAAI,OAAO,KAAK,KAAK,CAAC,CAAC,QAAQ;EAC/B,MAAM,QAAQ,SAAsB,CAAC,CAAC,KAAK,OAAO,CAAC,KAAK,IAAI,UAAU,CAAC,KAAK,IAAI,SAAS,CAAC,KAAK,IAAI;EACnG,MAAM,UAAU,CACf,GAAG,KAAK,KAAK,OAAO,CAAC,CAAC,MAAM,IAAI,GAChC,GAAG,KAAK,KAAK,SAAS,CAAC,CAAC,OAAO,MAAM,QAAQ,CAAC,IAAI,QAAQ,KAAK,IAAI,KAAK,CAAC,GAAG,OAAO,QAAQ,IAAI,CAAC,CACjG;EACA,KAAK,MAAM,UAAU,SAAS;GAC7B,MAAM,QAAQ,OAAO,KAAK,QAAQ,UAAU,CAAC,CAAC,QAAQ,MAAM;GAC5D,IAAI,CAAC,OAAO;GACZ,MAAM,MAAM,KAAK,OAAO,UAAU,KAAK,CAAC;GACxC,IAAI,CAAC,KAAK;GACV,MAAM,SAAS,SAAS,GAAG;GAC3B,IAAI,SAAS,KAAK,GAAG,aAAa,SAAS,GAAG,WAAW;GACzD,IAAI,CAAC,GAAG,MAAM,QAAQ,IAAI,QAAQ,CAAC,GAAG,GAAG,eAAe,GAAG;GAC3D,MAAM,OAAO,MAAM;IAAE,OAAO,MAAM;IAAI,MAAM,IAAI;IAAI,OAAO,GAAG;GAAK;GACnE,GAAG,KAAK;IAAE,MAAM;IAAS,UAAU,CAAC,OAAO,EAAE;IAAG,OAAO;KAAE,MAAM;KAAQ,OAAO,MAAM,KAAK;IAAE;GAAE,CAAC;GAC9F,GAAG,OAAO,GAAG,OAAO,KAAK,GAAG,OAAO,GAAG,eAAe,MAAM,KAAK,MAAM,MAAM,KAAK,EAAE,WAAW,GAAG,IAAI,QAAQ,IAAI,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;GACzI;EACD;CACD;;CAKA,OAAe,MAAoC;EAClD,OAAO,MAAM,QAAQ,KAAK,QAAQ,MAAM,IAAI,KAAK,QAAQ,OAAO,MAAM,SAAS,KAAK,SAAS,IAAI,IAAI,KAAA;CACtG;;;;;CAMA,SAAS,YAAoC,KAAiD;EAC7F,MAAM,OAAO,WAAW,QAAQ,QAAQ,CAAC,IAAI,SAAS,IAAI,EAAE,CAAC;EAC7D,IAAI,CAAC,KAAK,QAAQ,OAAO,KAAA;EACzB,MAAM,EAAE,WAAW,KAAK;EACxB,IAAI,OAAO,WAAW,YAAY;GACjC,MAAM,SAAS,OAAO,KAAK,IAAI,IAAI;GACnC,IAAI,WAAW,KAAA,GAAW,OAAO,KAAA;GACjC,OAAO,OAAO,WAAW,WAAW,KAAK,MAAM,QAAQ,IAAI,OAAO,MAAM,IAAI;EAC7E;EACA,IAAI,MAAM,QAAQ,MAAM,GAAG;GAC1B,KAAK,IAAI,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;IACvC,MAAM,OAAO,OAAO;IACpB,MAAM,MAAM,KAAK,MAAM,SAAS,KAAK,OAAO,KAAK,IAAI;IACrD,IAAI,CAAC,KAAK;IACV,MAAM,SAAS,KAAK,UAAU;IAC9B,IAAI,SAAS,GAAG;KAEf,KAAK,OAAO,OAAO,OAAO,KAAK,GAAG,IAAI,KAAK,IAAI;KAC/C,IAAI,CAAC,KAAK,OAAO,OAAO,IAAI;IAC7B;IACA,OAAO;GACR;GACA;EACD;EACA,OAAO,KAAK;CACb;;;;;CAMA,UAAU,MAAmB,WAAqC,MAAM,MAA0B;EACjG,IAAI,CAAC,UAAU,QAAQ,OAAO,KAAA;EAC9B,MAAM,OAAO,KAAK,OAAO,KAAK,IAAI;EAClC,IAAI,OAAO,MAAM,WAAW,YAAY,OAAO,KAAK,OAAO,KAAK,IAAI,MAAM,SAAS;EACnF,IAAI,MAAM,QAAQ,MAAM,MAAM,GAAG;GAChC,MAAM,UAAkC,CAAC;GACzC,KAAK,MAAM,MAAM,KAAK,QAAQ;IAC7B,QAAQ,OAAO,QAAQ,OAAO,KAAK;IACnC,MAAM,QAAQ,UAAU,MAAM,SAAS,KAAK,OAAO,EAAE;IAErD,IAAI,CAAC,SAAS,MAAM,SAAS,QAAQ,KAAK;IAC1C,OAAO,MAAM,aAAa,CAAC,MAAM,KAAK,KAAA;GACvC;EACD;EAEA,QADY,MAAM,UAAU,QAAQ,UAAU,MAAM,SAAS,IAAI,CAAC,GAAG,SAAS,EAAA,CACnE,MAAM,GAAG,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,EAAE,EAAE;CAC7E;;CAGA,SAAe;EACd,IAAI,CAAC,KAAK,MAAM,QAAQ,GAAG;EAC3B,MAAM,EAAE,OAAO;EACf,KAAK,MAAM,QAAQ,GAAG,KAAK,KAAK,OAAO,GAAG;GACzC,MAAM,OAAO,YAAY,IAAI;GAC7B,IAAI,CAAC,MAAM,UAAU,CAAC,KAAK,aAAa,KAAK,KAAK,QAAQ;GAC1D,MAAM,OAAO,KAAK,UAAU,MAAM,KAAK,SAAS;GAChD,IAAI,CAAC,MAAM;GACX,GAAG,KAAK;IAAE,MAAM;IAAS,QAAQ,KAAK;IAAI,SAAS;GAAK,CAAC;GACzD,GAAG,OAAO,GAAG,KAAK,KAAK,GAAG,KAAK,GAAG,UAAU,QAAQ,EAAE,MAAM,QAAQ,CAAC;EACtE;CACD;;CAKA,MAAc,MAAqB;EAClC,IAAI,KAAK,UAAU,UAAU,KAAK,GAAG,MAAM,OAAO;EAClD,KAAK,UAAU,QAAQ,KAAK,GAAG;EAC/B,OAAO;CACR;;CAGA,KAAK,MAAkB;EACtB,KAAK,UAAU,QAAQ,KAAK,GAAG;CAChC;;CAGA,QAAsB;EACrB,MAAM,EAAE,SAAS,KAAK;EACtB,MAAM,QAAQ,OAAe,CAAC,KAAK,KAAK,IAAI,OAAO,EAAE,CAAC;EACtD,KAAK,MAAM,MAAM,KAAK,OAAO,OAAO,IAAI,KAAK,EAAE,GAAG,OAAO,KAAK,OAAO,MAAM;EAC3E,KAAK,MAAM,MAAM,KAAK,OAAO,OAAO,IAAI,KAAK,EAAE,GAAG,OAAO,KAAK,OAAO,MAAM;EAC3E,KAAK,MAAM,MAAM,KAAK,OAAO,MAAM,IAAI,KAAK,EAAE,GAAG,OAAO,KAAK,OAAO,KAAK;EACzE,KAAK,MAAM,MAAM,KAAK,OAAO,UAAU,IAAI,KAAK,EAAE,GAAG,OAAO,KAAK,OAAO,SAAS;CAClF;;CAGA,SAAsB;EACrB,MAAM,EAAE,OAAO;EACf,MAAM,EAAE,SAAS;EACjB,MAAM,UAAU,GAAG,OAAO,MAAM,OAAO;EACvC,MAAM,OAAO,KAAK,OAAO;EACzB,OAAO;GACN,QAAQ,KAAK,OAAO,KAAK,UAAU;IAClC,MAAM,OAAO,KAAK,OAAO,MAAM,MAAM,MAAM;IAC3C,OAAO;KACN,OAAO,MAAM,MAAM;KACnB,MAAM,MAAM,KAAK;KACjB,MAAM,KAAK,MAAM,MAAM,OAAO,GAAG,IAAI;KACrC,GAAI,MAAM,UAAU,QAAQ,EAAE,QAAQ;MAAE,IAAI,MAAM,OAAO;MAAI,MAAM,MAAM,OAAO;MAAM,OAAO,KAAK;KAAM,EAAE;KAC1G,QAAQ,CAAC,GAAG,MAAM,MAAM;KACxB,OAAO,CAAC,GAAG,MAAM,KAAK;IACvB;GACD,CAAC;GACD,UAAU,SAAS,MAAM,CAAC,CAAC,SAAS,CAAC,EAAA,CAAG,KAAK,UAAU;IACtD,MAAM,KAAK;IACX,MAAM,KAAK;IACX,QAAQ,KAAK,MAAM,KAAK,SAAS,IAAI,IAAI,GAAG,IAAI;IAChD,IAAI,KAAK,KAAK,KAAK,GAAG,EAAE,MAAM,IAAI;IAClC,OAAO,KAAK,KAAK,GAAG,EAAE,SAAS;IAC/B,KAAK,KAAK,KAAK,GAAG,EAAE,OAAO;GAC5B,EAAE;GACF,QAAQ,KAAK,KAAK,OAAO,CAAC,CAAC,KAAK,SAAS;IACxC,MAAM,OAAO,YAAY,IAAI;IAC7B,MAAM,OAAO,MAAM,YAAY,KAAK,UAAU,MAAM,KAAK,WAAW,KAAK,IAAI,KAAA;IAC7E,OAAO;KAAE,IAAI,KAAK;KAAI,MAAM,KAAK;KAAM,OAAO,MAAM,SAAS;KAAG,GAAI,QAAQ,EAAE,KAAK;IAAG;GACvF,CAAC;GACD,UAAU,OAAO,QAAQ,KAAK,OAAO,QAAQ,CAAC,CAAC,KAAK,CAAC,MAAM,aAAa;IAAE,MAAM,OAAO,IAAI;IAAG,GAAG;GAAO,EAAE;GAC1G,QAAQ,OAAO,QAAQ,KAAK,OAAO,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,aAAa;IAAE,IAAI,OAAO,EAAE;IAAG,GAAG;GAAO,EAAE;GACtG,MAAM,KAAK;GACX,GAAI,KAAK,WAAW,EAAE,SAAS,KAAK,QAAQ;EAC7C;CACD;;;CAIA,YAAqB;EACpB,OAAO,KAAK;CACb;;CAGA,SAAS,QAAwB;EAChC,OAAO,QAAQ,KAAK,OAAO;CAC5B;;CAGA,OAAoB;EACnB,OAAO,gBAAgB,KAAK,MAAM;CACnC;;CAGA,QAAQ,QAA0B;EACjC,MAAM,QAAQ;EACd,IAAI,CAAC,SAAS,OAAO,UAAU,YAAY,MAAM,MAAM,GAAG,OAAO;EACjE,KAAK,SAAS;GACb,GAAG;GACH,OAAO,EAAE,GAAI,MAAM,SAAS,CAAC,EAAG;GAChC,OAAO,EAAE,GAAI,MAAM,SAAS,CAAC,EAAG;GAChC,MAAM,gBAAgB,MAAM,QAAQ,CAAC,CAAC;GACtC,OAAO,EAAE,GAAI,MAAM,SAAS,CAAC,EAAG;GAChC,UAAU,gBAAgB,MAAM,YAAY,CAAC,CAAC;GAC9C,GAAI,MAAM,UAAU,EAAE,QAAQ,gBAAgB,MAAM,MAAM,EAAE;GAC5D,QAAQ,EAAE,GAAI,MAAM,UAAU,CAAC,EAAG;EACnC;EACA,OAAO;CACR;AACD;;;;;AAMA,IAAM,OAAgB,WAAW;CAAE,IAAI;CAAQ,UAAU;CACxD,MAAM,IAAI,OAAO,OAAO;EACvB,MAAM,QAAQ;EACd,MAAM,aAAa,GAAG;EACtB,MAAM,KAAM,MAAM,OAAO,MAA2C,CAAC;EACrE,KAAK,MAAM,MAAM,MAAM,KAAK,OAAO,IAAI,GAAG,KAAK,MAAM,MAAM;GAAE,MAAM;GAAQ,OAAO,GAAG;EAAI,GAAG,CAAC,EAAE,CAAC;CACjG;CACA,MAAM,KAAK,OAAO,OAAO;EACxB,IAAI,CAAC,MAAM,UAAU,GAAG;EACxB,MAAM,KAAM,MAAM,OAAO,MAA2C,CAAC;EACrE,KAAK,MAAM,QAAQ,MAAM,UAAU,GAAG;GACrC,MAAM,QAAQ,GAAG,KAAK;GACtB,IAAI,SAAS,OAAO,MAAM,KAAK,IAAI,IAA2B,MAAM,MAAM;IAAE,MAAM;IAAQ,OAAO;GAAM,GAAG,CAAC,KAAK,EAAE,CAAC;EACpH;CACD;CACA,SAAS;EAAC;EAAW;EAAW;CAAW;AAAE,CAAC;;;;;;;;AAS/C,IAAa,SAAS,UAAwB,CAAC,MAC9C,aAAa;CAAE,IAAI;CAAS,OAAO,OAAwB;EAC1D,GAAG,KAAK,KAAK,CAAC,CAAC,UAAU,OAAO;EAChC,OAAO;GACN,IAAI;GACJ,OAAO;GACP,aAAa,GAAG,KAAK,KAAK,CAAC,CAAC,MAAM;EACnC;CACD;AAAE,CAAC;;AASJ,SAAS,WAAW,UAAoB,MAA2B;CAClE,IAAI,OAAO;CACX,KAAK,MAAM,QAAQ,KAAK,SAAS,CAAC,GAAG;EACpC,MAAM,OAAO,SAAS,MAAM,IAAI,IAAI,IAAI,SAAS,KAAK,IAAI,CAAC,CAAC,iBAAiB,KAAA;EAC7E,IAAI,MAAM,OAAO,KAAK,IAAI,MAAM,SAAS,OAAO,IAAI,IAAI;CACzD;CACA,OAAO;AACR"}
@@ -24,7 +24,9 @@ export interface MissionUnitsData {
24
24
  named?: string[];
25
25
  /** Of a type, or of any of a list */
26
26
  type?: string | string[];
27
+ /** Only units of this role; the role is inferred or declared for the unit type (`RoleTable`) */
27
28
  role?: AiRole;
29
+ /** Only units of a type with this tag */
28
30
  tag?: string;
29
31
  /** Near a place */
30
32
  near?: MissionPlace;
@@ -67,6 +69,7 @@ export interface MissionPartOptions {
67
69
  * @beta
68
70
  */
69
71
  export interface MissionPartMemory {
72
+ /** The version of the memory's format: 1 so far */
70
73
  v: 1;
71
74
  /** Whether it took its units yet: they are taken once */
72
75
  took: boolean;
@@ -74,21 +77,25 @@ export interface MissionPartMemory {
74
77
  units: number[];
75
78
  /** An ambush: the tick it sprang at, while sprung; how many times it sprang; whether its `then` was done */
76
79
  sprung?: number;
80
+ /** How many times the ambush sprang */
77
81
  times?: number;
82
+ /** Whether the ambush's `then` was carried out */
78
83
  acted?: boolean;
79
84
  /** A wave: how many were sent; the tick the last went at (or the part began at) */
80
85
  sent?: number;
86
+ /** The tick the last wave was sent at, or the part began at */
81
87
  last?: number;
82
88
  /** `surrenderWhen`: whether it gave up */
83
89
  done?: boolean;
84
90
  }
85
91
  /**
86
92
  * The mission brain's definition: a brain's (`BrainDef`) with the parts given as `modules`, after the ones every mission
87
- * has. Its `id` is what a save remembers the seat by: list the brain in `GameModule.brains`
93
+ * has. Its `id` is what a save remembers the seat by: list the brain in `Rules.brains`
88
94
  *
89
95
  * @beta
90
96
  */
91
97
  export interface MissionBrainDef extends BrainExtension {
98
+ /** The brain's id, which a save remembers the seat by and which `Rules.brains` lists it under */
92
99
  id: string;
93
100
  }
94
101
  /**
@@ -190,6 +197,6 @@ export declare function surrenderWhen(condition: AiCondition, options?: {
190
197
  * builds, trains, gathers, scouts or answers raids on its bases unless a module for it is given (`economy()`,
191
198
  * `scouting()`, `defence()`). Everything else of `BrainDef` as for any brain (`goals`, `micro`, `without`, `knowledge`)
192
199
  *
193
- * @beta
200
+ * @public
194
201
  */
195
202
  export declare function missionBrain(def: MissionBrainDef): BrainDef;