@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,538 @@
1
+ import { distSq } from "../math.js";
2
+ import { shapeBounds } from "../areas.js";
3
+ import { defineModule } from "./module.js";
4
+ import { consider, curve, defineGoal, goals } from "./goals.js";
5
+ import { evaluate, rules, words } from "./rules.js";
6
+ import { point, where } from "./geometry.js";
7
+ import { squads } from "./squads.js";
8
+ import { defineBrain } from "./define.js";
9
+ import { micro } from "./micro.js";
10
+ //#region src/ai/mission.ts
11
+ /** How far a part reaches round its place, where neither it nor a region says: what holds a camp holds this much round it */
12
+ var REACH = 10;
13
+ /** How much past its reach a part's units are looked for as it first takes them */
14
+ var TAKE_PAST = 8;
15
+ /** How near a spawner a unit has come out of it */
16
+ var SPAWN_REACH = 10;
17
+ /** How far a unit with nowhere to run to runs from the nearest rival */
18
+ var FLEE_AWAY = 20;
19
+ /** A place as an id writes it */
20
+ var nameOf = (place) => typeof place === "string" ? place : `${Math.round(place.x)},${Math.round(place.z)}`;
21
+ /**
22
+ * Where a place is for the player: a point as it is; a name, the entity it names where the player knows of it, else the
23
+ * middle of the region of that name. Nothing for a name it does not know
24
+ */
25
+ function placeOf(ai, place) {
26
+ if (typeof place !== "string") return point(place);
27
+ const named = ai.view.named(place);
28
+ if (named) return point(named);
29
+ const region = ai.view.region(place);
30
+ return region && {
31
+ x: region.shape.x,
32
+ z: region.shape.z
33
+ };
34
+ }
35
+ /** How far a part reaches round its place: what it was given, else a region's size, else `REACH` */
36
+ function reachOf(ai, place, given) {
37
+ if (given !== void 0) return given;
38
+ if (typeof place === "string" && !ai.view.named(place)) {
39
+ const shape = ai.view.region(place)?.shape;
40
+ if (shape) {
41
+ const { x0, z0, x1, z1 } = shapeBounds(shape);
42
+ return Math.max(x1 - x0, z1 - z0) / 2;
43
+ }
44
+ }
45
+ return REACH;
46
+ }
47
+ /** The part's `when`, as a consideration that vetoes it while the condition does not hold */
48
+ var whenOf = (condition) => condition === void 0 ? [] : [consider("its condition holds", (ai) => evaluate(condition, ai) ? 1 : 0, curve.step(1))];
49
+ /** Does an action: a function of the brain, or a word it tells itself (`{ say, data }`) */
50
+ function act(ai, action) {
51
+ if (typeof action === "function") action(ai);
52
+ else ai.tell(action.say, action.data, ai.tick);
53
+ }
54
+ /**
55
+ * The units a part's `units` choose of those it may have: the data form read (named, type, role, tag, near, count), or
56
+ * the function asked; its fighters at its place where `fallback` says so
57
+ */
58
+ function choose(ai, units, available, around, reach) {
59
+ if (typeof units === "function") return [...units(ai, available)];
60
+ let set = available.units().alive();
61
+ if (units.named) {
62
+ const names = units.named;
63
+ set = set.where((entity) => entity.name !== void 0 && names.includes(entity.name));
64
+ } else if (units.type === void 0 && units.role === void 0 && units.tag === void 0) set = set.fighters();
65
+ if (units.type !== void 0) {
66
+ const types = Array.isArray(units.type) ? units.type : [units.type];
67
+ set = set.where((entity) => types.includes(entity.type));
68
+ }
69
+ if (units.role !== void 0) set = set.withRole(units.role);
70
+ if (units.tag !== void 0) set = set.withTag(units.tag);
71
+ if (units.near !== void 0) {
72
+ const near = placeOf(ai, units.near);
73
+ if (!near) return [];
74
+ set = set.near(near, units.within ?? reach);
75
+ }
76
+ const chosen = [...set];
77
+ if (units.count !== void 0 && around) {
78
+ chosen.sort((a, b) => distSq(a, around) - distSq(b, around) || a.id - b.id);
79
+ return chosen.slice(0, Math.max(0, units.count));
80
+ }
81
+ return units.count !== void 0 ? chosen.slice(0, Math.max(0, units.count)) : chosen;
82
+ }
83
+ /**
84
+ * A part of a mission: a module (its id the part's) that puts its goal on the brain's picker and keeps its memory. A
85
+ * brain without a `goals()` module (or the melee brain's) never runs the goal: the log says so once
86
+ */
87
+ function part(id, kind, make) {
88
+ return defineModule({
89
+ id,
90
+ make: (ai) => {
91
+ const memory = {
92
+ v: 1,
93
+ took: false,
94
+ units: []
95
+ };
96
+ const made = make(ai, memory);
97
+ if (made.goal) ai.goals.add(made.goal);
98
+ let warned = false;
99
+ return {
100
+ id,
101
+ version: 1,
102
+ phase: "decide",
103
+ think: () => {
104
+ if (made.goal && !warned && !ai.module("goals")) {
105
+ warned = true;
106
+ ai.log.warn("ai", `the mission's part "${id}" is a goal, and the brain "${ai.def.id}" has no goals() module to pick it`);
107
+ }
108
+ made.think?.();
109
+ },
110
+ save: () => structuredClone(memory),
111
+ restore: (data) => {
112
+ const kept = data && typeof data === "object" ? data : void 0;
113
+ for (const key of Object.keys(memory)) delete memory[key];
114
+ Object.assign(memory, {
115
+ v: 1,
116
+ took: false,
117
+ units: []
118
+ }, structuredClone(kept ?? {}));
119
+ },
120
+ inspect: () => ({
121
+ part: kind,
122
+ units: [...memory.units],
123
+ ...made.inspect?.()
124
+ })
125
+ };
126
+ }
127
+ });
128
+ }
129
+ /**
130
+ * The claim of a part that keeps its own units (`MissionPartMemory.units`): those it took, wherever they are, as it is
131
+ * picked again; the first time (and with `refill`, each time) what its `units` choose
132
+ */
133
+ function ownUnits(memory, options, fallback, around, reach) {
134
+ return (ai, available) => {
135
+ const kept = available.where((entity) => memory.units.includes(entity.id)).items;
136
+ if (memory.took && !options.refill) return kept;
137
+ const more = choose(ai, options.units ?? fallback(ai), available, around(ai), reach(ai));
138
+ return [...kept, ...more.filter((entity) => !memory.units.includes(entity.id))];
139
+ };
140
+ }
141
+ /**
142
+ * A part's run, as each think begins: what it holds is its own from now on (`memory.units`, the dead let go of), and its
143
+ * own units back in the pool (a word that had them is over) are taken back into its squad. The squad: made where there is
144
+ * none. Those that came into it this think, by id
145
+ */
146
+ function muster(ai, id, memory, held, options, choosing) {
147
+ const { mine } = ai.view;
148
+ memory.took = true;
149
+ const own = new Set(memory.units.filter((unit) => mine.has(unit)));
150
+ for (const unit of held) own.add(unit.id);
151
+ const pool = ai.goals.pool();
152
+ const back = [...own].filter((unit) => pool.has(unit));
153
+ if (options.refill && choosing) {
154
+ for (const entity of choosing()) if (pool.has(entity.id)) back.push(entity.id);
155
+ }
156
+ let squad = ai.squads.named(id);
157
+ const before = new Set(squad?.data.units ?? []);
158
+ if (!squad || squad.owner !== id) squad = ai.squads.make(id, [...held.ids(), ...back], { owner: id });
159
+ else squad.add([...[...held.ids()].filter((unit) => !before.has(unit)), ...back], "back at its post");
160
+ for (const unit of squad.data.units) own.add(unit);
161
+ memory.units = [...own].filter((unit) => mine.has(unit)).sort((a, b) => a - b);
162
+ return {
163
+ squad,
164
+ came: squad.data.units.filter((unit) => !before.has(unit))
165
+ };
166
+ }
167
+ /**
168
+ * Its units hold a place: they go there, fight what comes within its reach (`radius`, or the region's size, else 10),
169
+ * and go back once it is gone. Its units: those at the place as it is first picked (within its reach and a little), or
170
+ * what `units` say
171
+ *
172
+ * @beta
173
+ */
174
+ function holdPosition(place, options = {}) {
175
+ const id = options.id ?? `mission.hold:${nameOf(place)}`;
176
+ return part(id, "hold", (_ai, memory) => {
177
+ const reach = (ai) => reachOf(ai, place, options.radius);
178
+ const at = (ai) => placeOf(ai, place);
179
+ const claim = ownUnits(memory, options, (ai) => ({
180
+ near: place,
181
+ within: reach(ai) + TAKE_PAST
182
+ }), at, reach);
183
+ return {
184
+ goal: defineGoal({
185
+ id,
186
+ weight: options.weight,
187
+ considerations: [...whenOf(options.when), consider("it knows where the place is", (ai) => at(ai) ? 1 : 0, curve.step(1))],
188
+ claims: { units: claim },
189
+ run: (ai, claimed) => {
190
+ const { squad } = muster(ai, id, memory, claimed.units, options, () => claim(ai, ai.goals.pool()));
191
+ if (squad.idle) squad.defend(at(ai), reach(ai));
192
+ }
193
+ }),
194
+ inspect: () => ({ place: typeof place === "string" ? place : point(place) })
195
+ };
196
+ });
197
+ }
198
+ /**
199
+ * Its units walk a round of places, one after the other and back to the first, fighting what they meet on the way. Its
200
+ * units: those near the first place as it is first picked, or what `units` say. Places it does not know are passed over
201
+ *
202
+ * @beta
203
+ */
204
+ function patrol(points, options = {}) {
205
+ if (!points.length) throw new Error("A patrol needs a place at least");
206
+ const id = options.id ?? `mission.patrol:${points.map(nameOf).join(">")}`;
207
+ return part(id, "patrol", (_ai, memory) => {
208
+ const round = (ai) => points.map((each) => placeOf(ai, each)).filter((each) => !!each);
209
+ const first = (ai) => round(ai)[0];
210
+ const claim = ownUnits(memory, options, () => ({
211
+ near: points[0],
212
+ within: 18
213
+ }), first, () => REACH);
214
+ return {
215
+ goal: defineGoal({
216
+ id,
217
+ weight: options.weight,
218
+ considerations: [...whenOf(options.when), consider("places it knows", (ai) => round(ai).length, curve.step(1))],
219
+ claims: { units: claim },
220
+ run: (ai, claimed) => {
221
+ const { squad } = muster(ai, id, memory, claimed.units, options, () => claim(ai, ai.goals.pool()));
222
+ if (squad.idle) squad.patrol(round(ai));
223
+ }
224
+ }),
225
+ inspect: () => ({ points: points.map((each) => typeof each === "string" ? each : point(each)) })
226
+ };
227
+ });
228
+ }
229
+ /**
230
+ * Its units stay by an entity, by its name (`world.named`) or its id: a unit they follow, a building they hold round
231
+ * (within `radius`, 12 when left out), fighting what comes near it. While the entity stands: once it is gone, its units
232
+ * are let go of. Its units: those near it as it is first picked (within 20), or what `units` say
233
+ *
234
+ * @beta
235
+ */
236
+ function guard(entity, options = {}) {
237
+ const id = options.id ?? `mission.guard:${entity}`;
238
+ return part(id, "guard", (_ai, memory) => {
239
+ const target = (ai) => {
240
+ const found = typeof entity === "string" ? ai.view.named(entity) : ai.view.byId(entity);
241
+ return found && found.health > 0 ? found : void 0;
242
+ };
243
+ const at = (ai) => {
244
+ const found = target(ai);
245
+ return found && point(found);
246
+ };
247
+ const radius = options.radius ?? 12;
248
+ const claim = ownUnits(memory, options, () => ({
249
+ near: typeof entity === "string" ? entity : void 0,
250
+ within: 20
251
+ }), at, () => 20);
252
+ return {
253
+ goal: defineGoal({
254
+ id,
255
+ weight: options.weight,
256
+ considerations: [...whenOf(options.when), consider("what it guards stands", (ai) => target(ai) ? 1 : 0, curve.step(1))],
257
+ claims: { units: (ai, available) => {
258
+ if (typeof entity === "number" && !options.units && !memory.took) {
259
+ const found = target(ai);
260
+ return found ? available.units().alive().fighters().near(found, 20).items : [];
261
+ }
262
+ return claim(ai, available);
263
+ } },
264
+ run: (ai, claimed) => {
265
+ const { squad } = muster(ai, id, memory, claimed.units, options, () => claim(ai, ai.goals.pool()));
266
+ const guarded = target(ai);
267
+ const moves = ai.view.def(guarded).kind === "unit" && (ai.view.strength.statsOf(guarded).moveSpeed ?? 0) > 0;
268
+ if (!squad.idle) return;
269
+ if (moves) squad.escort(guarded.id);
270
+ else squad.defend(point(guarded), radius);
271
+ }
272
+ }),
273
+ inspect: () => ({ guards: entity })
274
+ };
275
+ });
276
+ }
277
+ /**
278
+ * Its units wait at a place on hold (they hit what walks into reach and move for nothing), and spring once a rival's
279
+ * unit comes within `radius` of it (or once `trigger` holds): they go for the intruders, fighting what they meet. Once
280
+ * that fight is over, `then` (`AmbushThen`). `once`: it springs the first time only. Its units: those at the place as it
281
+ * is first picked, or what `units` say
282
+ *
283
+ * @beta
284
+ */
285
+ function ambush(place, options = {}) {
286
+ const id = options.id ?? `mission.ambush:${nameOf(place)}`;
287
+ const then = options.then ?? "return";
288
+ return part(id, "ambush", (_ai, memory) => {
289
+ const reach = (ai) => reachOf(ai, place, options.radius);
290
+ const at = (ai) => placeOf(ai, place);
291
+ const claim = ownUnits(memory, options, (ai) => ({
292
+ near: place,
293
+ within: reach(ai) + TAKE_PAST
294
+ }), at, reach);
295
+ /** The rivals' units in reach of the place: what springs it, and what it goes for */
296
+ const intruders = (ai, there) => ai.view.enemies.units().alive().near(there, reach(ai));
297
+ const wait = (squad, there, came) => {
298
+ if (squad.current?.kind !== "hold" || squad.idle) squad.hold(there);
299
+ else if (came.length) {
300
+ squad.order({
301
+ type: "move",
302
+ point: there
303
+ }, came);
304
+ squad.order({ type: "hold" }, came, true);
305
+ }
306
+ };
307
+ return {
308
+ goal: defineGoal({
309
+ id,
310
+ weight: options.weight,
311
+ considerations: [...whenOf(options.when), consider("it knows where the place is", (ai) => at(ai) ? 1 : 0, curve.step(1))],
312
+ claims: { units: claim },
313
+ run: (ai, claimed) => {
314
+ const { squad, came } = muster(ai, id, memory, claimed.units, options, () => claim(ai, ai.goals.pool()));
315
+ const there = at(ai);
316
+ if (memory.sprung === void 0) {
317
+ if (options.once && (memory.times ?? 0) > 0) {
318
+ if (squad.idle) squad.hold();
319
+ return;
320
+ }
321
+ const coming = intruders(ai, there);
322
+ if (!(options.trigger !== void 0 ? evaluate(options.trigger, ai) : coming.length > 0)) return wait(squad, there, came);
323
+ memory.sprung = ai.tick;
324
+ memory.times = (memory.times ?? 0) + 1;
325
+ const target = coming.centre() ?? ai.view.enemies.units().alive().nearest(there) ?? there;
326
+ ai.decide(`${id} springs: ${coming.length} in reach, at ${where(target)}`, { kind: "mission" });
327
+ squad.attack(point(target));
328
+ return;
329
+ }
330
+ if (!squad.idle) return;
331
+ memory.sprung = void 0;
332
+ if (then === "return" && !options.once) {
333
+ ai.decide(`${id} goes back to wait`, { kind: "mission" });
334
+ return wait(squad, there, []);
335
+ }
336
+ if (then !== "return" && then !== "stay" && !memory.acted) {
337
+ memory.acted = true;
338
+ act(ai, then);
339
+ }
340
+ squad.hold();
341
+ }
342
+ }),
343
+ inspect: () => ({
344
+ place: typeof place === "string" ? place : point(place),
345
+ ...memory.sprung !== void 0 && { sprung: memory.sprung },
346
+ times: memory.times ?? 0
347
+ })
348
+ };
349
+ });
350
+ }
351
+ /** Where a wave goes from a place */
352
+ function targetOf(ai, target, from) {
353
+ if (typeof target === "function") return target(ai);
354
+ if (target !== void 0) return placeOf(ai, target);
355
+ const known = ai.view.enemies.known().buildings().nearest(from) ?? ai.view.enemies.units().alive().nearest(from);
356
+ if (known) return point(known);
357
+ const told = ai.options.enemyBases?.[0];
358
+ return told && point(told);
359
+ }
360
+ /**
361
+ * The units that come out of a spawner (what the mission's own rules spawn there, or what a building there trains),
362
+ * gathered there and sent as a wave: once there are as many as `group` says (a number, or so many of each type or
363
+ * role: `{ footman: 4, caster: 1 }`; 4 when left out), or, with `every`, every so many seconds with what has gathered
364
+ * (at least `minForces` of the group: a share, any when left out). A wave goes for `target` (`MissionTarget`) and, once
365
+ * that is cleared, for the next it knows of. `first`: seconds before the first wave may go (`every`, else none). Nothing
366
+ * is trained or built: a mission with no economy feeds it
367
+ *
368
+ * @beta
369
+ */
370
+ function waveFrom(source, options = {}) {
371
+ const id = options.id ?? `mission.wave:${nameOf(source)}`;
372
+ const group = options.group ?? 4;
373
+ const size = typeof group === "number" ? group : Object.values(group).reduce((sum, n) => sum + n, 0);
374
+ return part(id, "wave", (_ai, memory) => {
375
+ const from = (ai) => placeOf(ai, source);
376
+ const reach = (ai) => reachOf(ai, source, options.radius ?? SPAWN_REACH);
377
+ /** Whether a unit is of the group: any fighter for a number, else of a type or role it names */
378
+ const fits = (ai, entity) => typeof group === "number" ? ai.view.hasRole(entity, "soldier") || ai.view.hasRole(entity, "hero") : Object.keys(group).some((kind) => entity.type === kind || ai.view.hasRole(entity, kind));
379
+ /** What came out of the spawner and no one holds yet */
380
+ const come = (ai, available) => {
381
+ const at = from(ai);
382
+ if (!at) return [];
383
+ const held = new Set(ai.squads.of(id).squads.flatMap((squad) => squad.data.units));
384
+ return available.units().alive().near(at, reach(ai)).where((entity) => !held.has(entity.id) && !ai.goals.holder(entity.id) && fits(ai, entity)).items;
385
+ };
386
+ /** Whether the gathered make a wave now: the group whole, or the time come with enough of it */
387
+ const ready = (ai, gathered) => {
388
+ if (!gathered.length) return false;
389
+ const whole = typeof group === "number" ? gathered.length >= group : Object.entries(group).every(([kind, n]) => gathered.filter((entity) => entity.type === kind || ai.view.hasRole(entity, kind)).length >= n);
390
+ const last = memory.last ?? ai.tick;
391
+ const wait = (memory.sent ?? 0) === 0 ? options.first ?? options.every ?? 0 : options.every ?? 0;
392
+ if (!(ai.tick - last >= Math.round(wait * ai.session.tickRate))) return false;
393
+ if (whole) return true;
394
+ return options.every !== void 0 && gathered.length >= Math.max(1, Math.ceil(size * (options.minForces ?? 0)));
395
+ };
396
+ return {
397
+ goal: defineGoal({
398
+ id,
399
+ weight: options.weight,
400
+ considerations: [...whenOf(options.when), consider("it knows where the spawner is", (ai) => from(ai) ? 1 : 0, curve.step(1))],
401
+ claims: { units: (ai, available) => come(ai, available) },
402
+ run: (ai, claimed) => {
403
+ memory.last ??= ai.tick;
404
+ memory.took = true;
405
+ const at = from(ai);
406
+ const fresh = come(ai, ai.goals.pool());
407
+ let gathering = ai.squads.named(id);
408
+ const waves = ai.squads.of(id).squads.filter((squad) => squad !== gathering);
409
+ const sent = new Set(waves.flatMap((squad) => squad.data.units));
410
+ const waiting = [...[...claimed.units.ids()].filter((unit) => !sent.has(unit)), ...fresh.map((entity) => entity.id)];
411
+ if (waiting.length) {
412
+ if (!gathering) gathering = claimed.squad(id, waiting).hold();
413
+ else gathering.add(waiting, "came out");
414
+ }
415
+ memory.units = [.../* @__PURE__ */ new Set([...sent, ...gathering?.data.units ?? []])].sort((a, b) => a - b);
416
+ for (const wave of waves) {
417
+ if (!wave.idle || !wave.centre()) continue;
418
+ const next = targetOf(ai, options.target, wave.centre());
419
+ if (next) wave.attack(next);
420
+ else wave.hold();
421
+ }
422
+ const gathered = gathering?.units().items ?? [];
423
+ if (!gathering || !ready(ai, gathered)) return;
424
+ const target = targetOf(ai, options.target, at);
425
+ if (!target) return;
426
+ const n = (memory.sent ?? 0) + 1;
427
+ memory.sent = n;
428
+ memory.last = ai.tick;
429
+ claimed.squad(`${id} ${n}`, gathered).attack(target);
430
+ ai.decide(`${id} sends wave ${n} of ${gathered.length} at ${where(target)}`, { kind: "mission" });
431
+ }
432
+ }),
433
+ inspect: () => ({
434
+ source: typeof source === "string" ? source : point(source),
435
+ sent: memory.sent ?? 0,
436
+ last: memory.last
437
+ })
438
+ };
439
+ });
440
+ }
441
+ /**
442
+ * When the condition holds, its units run: to `to` (a place), else home, else away from the nearest rival; and stand
443
+ * there while it holds. Once it no longer does, they are let go of, and the parts that had them take them back. An
444
+ * urgent goal worth 10: it takes its units from any other. Its units: its fighters, or what `units` say
445
+ *
446
+ * @beta
447
+ */
448
+ function fleeWhen(condition, options = {}) {
449
+ const id = options.id ?? "mission.flee";
450
+ return part(id, "flee", () => {
451
+ /** Where to run: the place, home, or away from the nearest rival, on the map */
452
+ const refuge = (ai, squad) => {
453
+ const to = options.to !== void 0 ? placeOf(ai, options.to) : void 0;
454
+ if (to) return to;
455
+ const home = ai.view.home();
456
+ if (home) return point(home);
457
+ const middle = squad.centre();
458
+ const foe = middle && ai.view.enemies.units().alive().nearest(middle);
459
+ if (!middle || !foe) return void 0;
460
+ const dx = middle.x - foe.x;
461
+ const dz = middle.z - foe.z;
462
+ const length = Math.sqrt(dx * dx + dz * dz) || 1;
463
+ const { width, depth } = ai.session.terrain;
464
+ return {
465
+ x: Math.min(width - 1, Math.max(1, middle.x + dx / length * FLEE_AWAY)),
466
+ z: Math.min(depth - 1, Math.max(1, middle.z + dz / length * FLEE_AWAY))
467
+ };
468
+ };
469
+ return { goal: defineGoal({
470
+ id,
471
+ weight: options.weight ?? 10,
472
+ urgent: true,
473
+ considerations: [consider("it is time to run", (ai) => evaluate(condition, ai) ? 1 : 0, curve.step(1)), ...whenOf(options.when)],
474
+ claims: { units: (ai, available) => choose(ai, options.units ?? {}, available, ai.view.home(), REACH) },
475
+ commitment: 0,
476
+ run: (ai, claimed) => {
477
+ if (!claimed.first) {
478
+ const squad = ai.squads.named(id);
479
+ if (squad?.idle) squad.hold();
480
+ return;
481
+ }
482
+ const squad = claimed.squad(id, claimed.units);
483
+ const to = refuge(ai, squad);
484
+ ai.decide(`${id}: ${claimed.units.length} run${to ? ` to ${where(to)}` : ""}`, { kind: "mission" });
485
+ if (to) squad.retreat(to, "told to run");
486
+ else squad.hold();
487
+ }
488
+ }) };
489
+ });
490
+ }
491
+ /**
492
+ * When the condition holds, the computer gives up: the engine's `surrender` command, as a player's, once. Out of the
493
+ * game as if beaten
494
+ *
495
+ * @beta
496
+ */
497
+ function surrenderWhen(condition, options = {}) {
498
+ const id = options.id ?? "mission.surrender";
499
+ return part(id, "surrender", (ai, memory) => ({
500
+ think: () => {
501
+ if (memory.done || !evaluate(condition, ai)) return;
502
+ memory.done = true;
503
+ ai.decide(`${id}: gives up`, { kind: "mission" });
504
+ ai.send({ type: "surrender" });
505
+ },
506
+ inspect: () => ({ done: !!memory.done })
507
+ }));
508
+ }
509
+ /**
510
+ * A computer player for a mission: a brain (`defineBrain`) of what every mission's computer has (its rules, the words
511
+ * every brain may be told, the goals' picker, squads, micro) and the parts it is given (`modules`: `holdPosition`,
512
+ * `patrol`, `guard`, `ambush`, `waveFrom`, `fleeWhen`, `surrenderWhen`, any module of the kit's or of its own). Nothing
513
+ * builds, trains, gathers, scouts or answers raids on its bases unless a module for it is given (`economy()`,
514
+ * `scouting()`, `defence()`). Everything else of `BrainDef` as for any brain (`goals`, `micro`, `without`, `knowledge`)
515
+ *
516
+ * @public
517
+ */
518
+ function missionBrain(def) {
519
+ const { modules = [], ...rest } = def;
520
+ return defineBrain({
521
+ ...rest,
522
+ modules: [
523
+ defineModule({
524
+ id: "rules",
525
+ make: (ai) => rules(ai.def.rules ?? [])(ai)
526
+ }),
527
+ words(),
528
+ ...modules,
529
+ goals(),
530
+ squads(),
531
+ micro()
532
+ ]
533
+ });
534
+ }
535
+ //#endregion
536
+ export { ambush, fleeWhen, guard, holdPosition, missionBrain, patrol, surrenderWhen, waveFrom };
537
+
538
+ //# sourceMappingURL=mission.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mission.js","names":[],"sources":["../../src/ai/mission.ts"],"sourcesContent":["import { shapeBounds } from '#engine/areas'\nimport { distSq, type Vec2 } from '#engine/math'\nimport type { EntityState } from '#engine/session/protocol'\nimport { type Brain, type BrainDef, type BrainExtension } from './brain'\nimport { type AiModule, type AiModuleDef, defineModule } from './module'\nimport { defineBrain } from './define'\nimport { consider, type Consideration, curve, defineGoal, type GoalDef, goals } from './goals'\nimport { micro } from './micro'\nimport type { AiRole } from './roles'\nimport { type AiAction, type AiCondition, evaluate, rules, words } from './rules'\nimport { type Squad, squads } from './squads'\nimport type { UnitSet } from './view'\nimport { point, where } from './geometry'\n\n/*\n * The mission brain (AI plan, D4): a computer player for a mission, made of the few parts a mission needs. Before it, a\n * mission had the whole melee player (which builds, trains, scouts and sends waves on its own clock: rarely what a\n * story wants) or wrote everything itself in a system beside the computer. Now it lists parts:\n *\n * missionBrain({\n * id: 'campaign.redHand',\n * modules: [holdPosition('camp'), guard('camp hall'), patrol(['ford', 'mill'])],\n * rules: [when.told('raid').do({ say: 'attack', data: { at: 'hall' } })]\n * })\n *\n * `missionBrain` is `defineBrain` with what every mission's computer has: its rules (`BrainDef.rules`) and the words\n * every brain may be told (B2), the goals' picker (B1), squads (C1) and micro (C2). Nothing builds, trains, gathers,\n * scouts or defends its bases the melee player's way (C4's `defence()` calls whole squads home to a raid, a guard and a\n * patrol with them): a mission says who holds what with its parts, and adds the kit's module for anything more.\n *\n * **The parts.** Each is a module that puts one goal on the picker (a goal holds units, so the parts, the words and a\n * rule's orders never fight over a unit: B1's \"who may move a unit\"), and remembers what it needs in the brain's memory:\n *\n * - `holdPosition(place)`: the units there hold it, fighting what comes within its reach and going back after.\n * - `patrol(points)`: a round of places walked again and again, fighting what is met.\n * - `guard(entity)`: units stay by a unit (they follow it) or a building (they hold round it) and fight what comes.\n * - `ambush(place, { then })`: units wait on hold, and spring once a rival walks into reach; then go back to wait,\n * stay, or do what `then` says (a word, a function).\n * - `waveFrom(place, { group, every })`: the units that come out of a spawner (what the mission's own rules spawn, or a\n * building that trains them) are gathered there and sent as a wave once there are enough, or every so often.\n * - `fleeWhen(condition)`: when it holds, the army runs (home, or to a place), and comes back when it no longer does.\n * - `surrenderWhen(condition)`: when it holds, the computer gives up (the engine's `surrender` command).\n *\n * **Its own units.** A part takes its units once, as it is first picked (those at its place, or those its `units`\n * say), and remembers them by id: a word that took them for a while (`attack`) gives them back to it after, and they\n * walk back to their post, wherever the word took them. With `refill`, units that come later and fit are taken too.\n *\n * Every part has a data form (places by name, conditions as data) and a function form (`units` as a function, a target\n * as a function, `then` as a function): a mission's JSON can hold the first.\n */\n\n/**\n * Where a mission's part is: a point, or a name the map or the rules gave an entity (`world.named`) or a region of the\n * map\n *\n * @beta\n */\nexport type MissionPlace = Vec2 | string\n\n/**\n * Which of its units a part takes, as data: those named (`named`), of a type, a role or a tag, near a place (`near`,\n * `within`), at most so many (`count`, the nearest the part's place first). Its fighters (soldiers and heroes) where\n * none of `named`, `type`, `role`, `tag` is given\n *\n * @beta\n */\nexport interface MissionUnitsData {\n\t/** Entities the map or the rules named (`world.named`): those of them that are its own */\n\tnamed?: string[]\n\t/** Of a type, or of any of a list */\n\ttype?: string | string[]\n\t/** Only units of this role; the role is inferred or declared for the unit type (`RoleTable`) */\n\trole?: AiRole\n\t/** Only units of a type with this tag */\n\ttag?: string\n\t/** Near a place */\n\tnear?: MissionPlace\n\t/** How near `near` (the part's reach when left out) */\n\twithin?: number\n\t/** At most so many, the nearest the part's place first */\n\tcount?: number\n}\n\n/**\n * Which of its units a part takes: data (`MissionUnitsData`), or a function choosing from those it may have\n * (`available`: what no goal holds, and what goals it may take from hold)\n *\n * @beta\n */\nexport type MissionUnits = MissionUnitsData | ((ai: Brain, available: UnitSet) => Iterable<EntityState>)\n\n/**\n * What every part of a mission takes\n *\n * @beta\n */\nexport interface MissionPartOptions {\n\t/**\n\t * Its id: the module's, the goal's and the squad's, what the report and the log name it by. `mission.<part>:<place>`\n\t * when left out (`mission.hold:camp`); give one where two parts of a kind share a place\n\t */\n\tid?: string\n\t/** Which of its units it takes, once, as it is first picked: those at its place when left out (its fighters for `fleeWhen`) */\n\tunits?: MissionUnits\n\t/** Whether units that come later and fit `units` are taken too: no when left out (`waveFrom` always takes what comes) */\n\trefill?: boolean\n\t/** Only while this holds: the part lets go of its units while it does not (a condition, as data or a function) */\n\twhen?: AiCondition\n\t/** What it is worth against the brain's other goals: 1 when left out (10 for `fleeWhen`) */\n\tweight?: number\n}\n\n/**\n * What a part remembers between thinks, as a save keeps it: its own units, and what its kind adds (an ambush's spring,\n * a wave's count)\n *\n * @beta\n */\nexport interface MissionPartMemory {\n\t/** The version of the memory's format: 1 so far */\n\tv: 1\n\t/** Whether it took its units yet: they are taken once */\n\ttook: boolean\n\t/** Its own units, by id: what it takes back after a word or a rule had them */\n\tunits: number[]\n\t/** An ambush: the tick it sprang at, while sprung; how many times it sprang; whether its `then` was done */\n\tsprung?: number\n\t/** How many times the ambush sprang */\n\ttimes?: number\n\t/** Whether the ambush's `then` was carried out */\n\tacted?: boolean\n\t/** A wave: how many were sent; the tick the last went at (or the part began at) */\n\tsent?: number\n\t/** The tick the last wave was sent at, or the part began at */\n\tlast?: number\n\t/** `surrenderWhen`: whether it gave up */\n\tdone?: boolean\n}\n\n/**\n * The mission brain's definition: a brain's (`BrainDef`) with the parts given as `modules`, after the ones every mission\n * has. Its `id` is what a save remembers the seat by: list the brain in `Rules.brains`\n *\n * @beta\n */\nexport interface MissionBrainDef extends BrainExtension {\n\t/** The brain's id, which a save remembers the seat by and which `Rules.brains` lists it under */\n\tid: string\n}\n\n/** How far a part reaches round its place, where neither it nor a region says: what holds a camp holds this much round it */\nconst REACH = 10\n/** How much past its reach a part's units are looked for as it first takes them */\nconst TAKE_PAST = 8\n/** How near a spawner a unit has come out of it */\nconst SPAWN_REACH = 10\n/** How far a unit with nowhere to run to runs from the nearest rival */\nconst FLEE_AWAY = 20\n\n/** A place as an id writes it */\nconst nameOf = (place: MissionPlace) => (typeof place === 'string' ? place : `${Math.round(place.x)},${Math.round(place.z)}`)\n\n/**\n * Where a place is for the player: a point as it is; a name, the entity it names where the player knows of it, else the\n * middle of the region of that name. Nothing for a name it does not know\n */\nfunction placeOf(ai: Brain, place: MissionPlace): Vec2 | undefined {\n\tif (typeof place !== 'string') return point(place)\n\tconst named = ai.view.named(place)\n\tif (named) return point(named)\n\tconst region = ai.view.region(place)\n\treturn region && { x: region.shape.x, z: region.shape.z }\n}\n\n/** How far a part reaches round its place: what it was given, else a region's size, else `REACH` */\nfunction reachOf(ai: Brain, place: MissionPlace, given: number | undefined): number {\n\tif (given !== undefined) return given\n\tif (typeof place === 'string' && !ai.view.named(place)) {\n\t\tconst shape = ai.view.region(place)?.shape\n\t\tif (shape) {\n\t\t\tconst { x0, z0, x1, z1 } = shapeBounds(shape)\n\t\t\treturn Math.max(x1 - x0, z1 - z0) / 2\n\t\t}\n\t}\n\treturn REACH\n}\n\n/** The part's `when`, as a consideration that vetoes it while the condition does not hold */\nconst whenOf = (condition: AiCondition | undefined): Consideration[] =>\n\tcondition === undefined ? [] : [consider('its condition holds', (ai) => (evaluate(condition, ai) ? 1 : 0), curve.step(1))]\n\n/** Does an action: a function of the brain, or a word it tells itself (`{ say, data }`) */\nfunction act(ai: Brain, action: AiAction): void {\n\tif (typeof action === 'function') action(ai)\n\telse ai.tell(action.say, action.data, ai.tick)\n}\n\n/**\n * The units a part's `units` choose of those it may have: the data form read (named, type, role, tag, near, count), or\n * the function asked; its fighters at its place where `fallback` says so\n */\nfunction choose(ai: Brain, units: MissionUnits, available: UnitSet, around: Vec2 | undefined, reach: number): EntityState[] {\n\tif (typeof units === 'function') return [...units(ai, available)]\n\tlet set = available.units().alive()\n\tif (units.named) {\n\t\tconst names = units.named\n\t\tset = set.where((entity) => entity.name !== undefined && names.includes(entity.name))\n\t} else if (units.type === undefined && units.role === undefined && units.tag === undefined) set = set.fighters()\n\tif (units.type !== undefined) {\n\t\tconst types = Array.isArray(units.type) ? units.type : [units.type]\n\t\tset = set.where((entity) => types.includes(entity.type))\n\t}\n\tif (units.role !== undefined) set = set.withRole(units.role)\n\tif (units.tag !== undefined) set = set.withTag(units.tag)\n\tif (units.near !== undefined) {\n\t\tconst near = placeOf(ai, units.near)\n\t\tif (!near) return []\n\t\tset = set.near(near, units.within ?? reach)\n\t}\n\tconst chosen = [...set]\n\tif (units.count !== undefined && around) {\n\t\tchosen.sort((a, b) => distSq(a, around) - distSq(b, around) || a.id - b.id)\n\t\treturn chosen.slice(0, Math.max(0, units.count))\n\t}\n\treturn units.count !== undefined ? chosen.slice(0, Math.max(0, units.count)) : chosen\n}\n\n/** What a part is made of, for each brain: its goal, and what of a module it has beside */\ninterface PartMade {\n\tgoal?: GoalDef\n\tthink?(): void\n\tinspect?(): Record<string, unknown>\n}\n\n/**\n * A part of a mission: a module (its id the part's) that puts its goal on the brain's picker and keeps its memory. A\n * brain without a `goals()` module (or the melee brain's) never runs the goal: the log says so once\n */\nfunction part(id: string, kind: string, make: (ai: Brain, memory: MissionPartMemory) => PartMade): AiModuleDef {\n\treturn defineModule({ id, make: (ai: Brain): AiModule => {\n\t\tconst memory: MissionPartMemory = { v: 1, took: false, units: [] }\n\t\tconst made = make(ai, memory)\n\t\tif (made.goal) ai.goals.add(made.goal)\n\t\tlet warned = false\n\t\treturn {\n\t\t\tid,\n\t\t\tversion: 1,\n\t\t\tphase: 'decide',\n\t\t\tthink: () => {\n\t\t\t\tif (made.goal && !warned && !ai.module('goals')) {\n\t\t\t\t\twarned = true\n\t\t\t\t\tai.log.warn('ai', `the mission's part \"${id}\" is a goal, and the brain \"${ai.def.id}\" has no goals() module to pick it`)\n\t\t\t\t}\n\t\t\t\tmade.think?.()\n\t\t\t},\n\t\t\tsave: () => structuredClone(memory),\n\t\t\t// written into the same object: the goal's closures read it\n\t\t\trestore: (data) => {\n\t\t\t\tconst kept = data && typeof data === 'object' ? (data as MissionPartMemory) : undefined\n\t\t\t\tfor (const key of Object.keys(memory)) delete (memory as unknown as Record<string, unknown>)[key]\n\t\t\t\tObject.assign(memory, { v: 1, took: false, units: [] }, structuredClone(kept ?? {}))\n\t\t\t},\n\t\t\tinspect: () => ({ part: kind, units: [...memory.units], ...made.inspect?.() })\n\t\t}\n\t} })\n}\n\n/**\n * The claim of a part that keeps its own units (`MissionPartMemory.units`): those it took, wherever they are, as it is\n * picked again; the first time (and with `refill`, each time) what its `units` choose\n */\nfunction ownUnits(\n\tmemory: MissionPartMemory,\n\toptions: MissionPartOptions,\n\tfallback: (ai: Brain) => MissionUnitsData,\n\taround: (ai: Brain) => Vec2 | undefined,\n\treach: (ai: Brain) => number\n): (ai: Brain, available: UnitSet) => readonly EntityState[] {\n\treturn (ai, available) => {\n\t\tconst kept = available.where((entity) => memory.units.includes(entity.id)).items\n\t\tif (memory.took && !options.refill) return kept\n\t\tconst more = choose(ai, options.units ?? fallback(ai), available, around(ai), reach(ai))\n\t\treturn [...kept, ...more.filter((entity) => !memory.units.includes(entity.id))]\n\t}\n}\n\n/**\n * A part's run, as each think begins: what it holds is its own from now on (`memory.units`, the dead let go of), and its\n * own units back in the pool (a word that had them is over) are taken back into its squad. The squad: made where there is\n * none. Those that came into it this think, by id\n */\nfunction muster(\n\tai: Brain,\n\tid: string,\n\tmemory: MissionPartMemory,\n\theld: UnitSet,\n\toptions: MissionPartOptions,\n\tchoosing?: () => readonly EntityState[]\n): {\n\tsquad: Squad\n\tcame: number[]\n} {\n\tconst { mine } = ai.view\n\tmemory.took = true\n\tconst own = new Set(memory.units.filter((unit) => mine.has(unit)))\n\tfor (const unit of held) own.add(unit.id)\n\t// its own, back from a word or a rule: what nothing holds now is given to it\n\tconst pool = ai.goals.pool()\n\tconst back = [...own].filter((unit) => pool.has(unit))\n\tif (options.refill && choosing) for (const entity of choosing()) if (pool.has(entity.id)) back.push(entity.id)\n\tlet squad = ai.squads.named(id)\n\tconst before = new Set(squad?.data.units ?? [])\n\tif (!squad || squad.owner !== id) squad = ai.squads.make(id, [...held.ids(), ...back], { owner: id })\n\telse squad.add([...[...held.ids()].filter((unit) => !before.has(unit)), ...back], 'back at its post')\n\tfor (const unit of squad.data.units) own.add(unit)\n\tmemory.units = [...own].filter((unit) => mine.has(unit)).sort((a, b) => a - b)\n\treturn { squad, came: squad.data.units.filter((unit) => !before.has(unit)) }\n}\n\n/**\n * Its units hold a place: they go there, fight what comes within its reach (`radius`, or the region's size, else 10),\n * and go back once it is gone. Its units: those at the place as it is first picked (within its reach and a little), or\n * what `units` say\n *\n * @beta\n */\nexport function holdPosition(place: MissionPlace, options: MissionPartOptions & { radius?: number } = {}): AiModuleDef {\n\tconst id = options.id ?? `mission.hold:${nameOf(place)}`\n\treturn part(id, 'hold', (_ai, memory) => {\n\t\tconst reach = (ai: Brain) => reachOf(ai, place, options.radius)\n\t\tconst at = (ai: Brain) => placeOf(ai, place)\n\t\tconst claim = ownUnits(memory, options, (ai) => ({ near: place, within: reach(ai) + TAKE_PAST }), at, reach)\n\t\treturn {\n\t\t\tgoal: defineGoal({\n\t\t\t\tid,\n\t\t\t\tweight: options.weight,\n\t\t\t\tconsiderations: [...whenOf(options.when), consider('it knows where the place is', (ai) => (at(ai) ? 1 : 0), curve.step(1))],\n\t\t\t\tclaims: { units: claim },\n\t\t\t\trun: (ai, claimed) => {\n\t\t\t\t\tconst { squad } = muster(ai, id, memory, claimed.units, options, () => claim(ai, ai.goals.pool()))\n\t\t\t\t\t// given its task as made, and again once a task of its own is over (a fall back on the odds): never over another\n\t\t\t\t\tif (squad.idle) squad.defend(at(ai)!, reach(ai))\n\t\t\t\t}\n\t\t\t}),\n\t\t\tinspect: () => ({ place: typeof place === 'string' ? place : point(place) })\n\t\t}\n\t})\n}\n\n/**\n * Its units walk a round of places, one after the other and back to the first, fighting what they meet on the way. Its\n * units: those near the first place as it is first picked, or what `units` say. Places it does not know are passed over\n *\n * @beta\n */\nexport function patrol(points: readonly MissionPlace[], options: MissionPartOptions = {}): AiModuleDef {\n\tif (!points.length) throw new Error('A patrol needs a place at least')\n\tconst id = options.id ?? `mission.patrol:${points.map(nameOf).join('>')}`\n\treturn part(id, 'patrol', (_ai, memory) => {\n\t\tconst round = (ai: Brain) => points.map((each) => placeOf(ai, each)).filter((each): each is Vec2 => !!each)\n\t\tconst first = (ai: Brain) => round(ai)[0]\n\t\tconst claim = ownUnits(\n\t\t\tmemory,\n\t\t\toptions,\n\t\t\t() => ({ near: points[0], within: REACH + TAKE_PAST }),\n\t\t\tfirst,\n\t\t\t() => REACH\n\t\t)\n\t\treturn {\n\t\t\tgoal: defineGoal({\n\t\t\t\tid,\n\t\t\t\tweight: options.weight,\n\t\t\t\tconsiderations: [...whenOf(options.when), consider('places it knows', (ai) => round(ai).length, curve.step(1))],\n\t\t\t\tclaims: { units: claim },\n\t\t\t\trun: (ai, claimed) => {\n\t\t\t\t\tconst { squad } = muster(ai, id, memory, claimed.units, options, () => claim(ai, ai.goals.pool()))\n\t\t\t\t\tif (squad.idle) squad.patrol(round(ai))\n\t\t\t\t}\n\t\t\t}),\n\t\t\tinspect: () => ({ points: points.map((each) => (typeof each === 'string' ? each : point(each))) })\n\t\t}\n\t})\n}\n\n/**\n * Its units stay by an entity, by its name (`world.named`) or its id: a unit they follow, a building they hold round\n * (within `radius`, 12 when left out), fighting what comes near it. While the entity stands: once it is gone, its units\n * are let go of. Its units: those near it as it is first picked (within 20), or what `units` say\n *\n * @beta\n */\nexport function guard(entity: string | number, options: MissionPartOptions & { radius?: number } = {}): AiModuleDef {\n\tconst id = options.id ?? `mission.guard:${entity}`\n\treturn part(id, 'guard', (_ai, memory) => {\n\t\tconst target = (ai: Brain): EntityState | undefined => {\n\t\t\tconst found = typeof entity === 'string' ? ai.view.named(entity) : ai.view.byId(entity)\n\t\t\treturn found && found.health > 0 ? found : undefined\n\t\t}\n\t\tconst at = (ai: Brain) => {\n\t\t\tconst found = target(ai)\n\t\t\treturn found && point(found)\n\t\t}\n\t\tconst radius = options.radius ?? 12\n\t\tconst claim = ownUnits(\n\t\t\tmemory,\n\t\t\toptions,\n\t\t\t() => ({ near: typeof entity === 'string' ? entity : undefined, within: 20 }),\n\t\t\tat,\n\t\t\t() => 20\n\t\t)\n\t\treturn {\n\t\t\tgoal: defineGoal({\n\t\t\t\tid,\n\t\t\t\tweight: options.weight,\n\t\t\t\tconsiderations: [...whenOf(options.when), consider('what it guards stands', (ai) => (target(ai) ? 1 : 0), curve.step(1))],\n\t\t\t\tclaims: {\n\t\t\t\t\tunits: (ai, available) => {\n\t\t\t\t\t\t// by id, with no name to look near: the nearest fighters to it, as data with `near` would\n\t\t\t\t\t\tif (typeof entity === 'number' && !options.units && !memory.took) {\n\t\t\t\t\t\t\tconst found = target(ai)\n\t\t\t\t\t\t\treturn found ? available.units().alive().fighters().near(found, 20).items : []\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn claim(ai, available)\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\trun: (ai, claimed) => {\n\t\t\t\t\tconst { squad } = muster(ai, id, memory, claimed.units, options, () => claim(ai, ai.goals.pool()))\n\t\t\t\t\tconst guarded = target(ai)!\n\t\t\t\t\tconst moves = ai.view.def(guarded).kind === 'unit' && (ai.view.strength.statsOf(guarded).moveSpeed ?? 0) > 0\n\t\t\t\t\t// a unit it follows; a building it holds round. Given again once a task of its own is over\n\t\t\t\t\tif (!squad.idle) return\n\t\t\t\t\tif (moves) squad.escort(guarded.id)\n\t\t\t\t\telse squad.defend(point(guarded), radius)\n\t\t\t\t}\n\t\t\t}),\n\t\t\tinspect: () => ({ guards: entity })\n\t\t}\n\t})\n}\n\n/**\n * What an ambush does once the fight it sprang is over: `return` to its place and wait again (the default), `stay`\n * where it is, or an action (a word it tells itself, `{ say: 'attack' }`, or a function of the brain), done once\n *\n * @beta\n */\nexport type AmbushThen = 'return' | 'stay' | AiAction\n\n/**\n * Its units wait at a place on hold (they hit what walks into reach and move for nothing), and spring once a rival's\n * unit comes within `radius` of it (or once `trigger` holds): they go for the intruders, fighting what they meet. Once\n * that fight is over, `then` (`AmbushThen`). `once`: it springs the first time only. Its units: those at the place as it\n * is first picked, or what `units` say\n *\n * @beta\n */\nexport function ambush(\n\tplace: MissionPlace,\n\toptions: MissionPartOptions & { radius?: number; trigger?: AiCondition; then?: AmbushThen; once?: boolean } = {}\n): AiModuleDef {\n\tconst id = options.id ?? `mission.ambush:${nameOf(place)}`\n\tconst then = options.then ?? 'return'\n\treturn part(id, 'ambush', (_ai, memory) => {\n\t\tconst reach = (ai: Brain) => reachOf(ai, place, options.radius)\n\t\tconst at = (ai: Brain) => placeOf(ai, place)\n\t\tconst claim = ownUnits(memory, options, (ai) => ({ near: place, within: reach(ai) + TAKE_PAST }), at, reach)\n\t\t/** The rivals' units in reach of the place: what springs it, and what it goes for */\n\t\tconst intruders = (ai: Brain, there: Vec2) => ai.view.enemies.units().alive().near(there, reach(ai))\n\t\tconst wait = (squad: Squad, there: Vec2, came: number[]) => {\n\t\t\tif (squad.current?.kind !== 'hold' || squad.idle) squad.hold(there)\n\t\t\t// its own back from elsewhere: to the place, and on hold there (the hold of the task holds where a unit stands)\n\t\t\telse if (came.length) {\n\t\t\t\tsquad.order({ type: 'move', point: there }, came)\n\t\t\t\tsquad.order({ type: 'hold' }, came, true)\n\t\t\t}\n\t\t}\n\t\treturn {\n\t\t\tgoal: defineGoal({\n\t\t\t\tid,\n\t\t\t\tweight: options.weight,\n\t\t\t\tconsiderations: [...whenOf(options.when), consider('it knows where the place is', (ai) => (at(ai) ? 1 : 0), curve.step(1))],\n\t\t\t\tclaims: { units: claim },\n\t\t\t\trun: (ai, claimed) => {\n\t\t\t\t\tconst { squad, came } = muster(ai, id, memory, claimed.units, options, () => claim(ai, ai.goals.pool()))\n\t\t\t\t\tconst there = at(ai)!\n\t\t\t\t\tif (memory.sprung === undefined) {\n\t\t\t\t\t\tconst done = options.once && (memory.times ?? 0) > 0\n\t\t\t\t\t\tif (done) {\n\t\t\t\t\t\t\tif (squad.idle) squad.hold()\n\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst coming = intruders(ai, there)\n\t\t\t\t\t\tconst sprung = options.trigger !== undefined ? evaluate(options.trigger, ai) : coming.length > 0\n\t\t\t\t\t\tif (!sprung) return wait(squad, there, came)\n\t\t\t\t\t\tmemory.sprung = ai.tick\n\t\t\t\t\t\tmemory.times = (memory.times ?? 0) + 1\n\t\t\t\t\t\t// for the intruders where it sees them; else (a trigger of its own) the nearest rival it sees, else its place\n\t\t\t\t\t\tconst target = coming.centre() ?? ai.view.enemies.units().alive().nearest(there) ?? there\n\t\t\t\t\t\tai.decide(`${id} springs: ${coming.length} in reach, at ${where(target)}`, { kind: 'mission' })\n\t\t\t\t\t\tsquad.attack(point(target))\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t\t// sprung: the fight goes on while its task does; once over, what then\n\t\t\t\t\tif (!squad.idle) return\n\t\t\t\t\tmemory.sprung = undefined\n\t\t\t\t\tif (then === 'return' && !options.once) {\n\t\t\t\t\t\tai.decide(`${id} goes back to wait`, { kind: 'mission' })\n\t\t\t\t\t\treturn wait(squad, there, [])\n\t\t\t\t\t}\n\t\t\t\t\tif (then !== 'return' && then !== 'stay' && !memory.acted) {\n\t\t\t\t\t\tmemory.acted = true\n\t\t\t\t\t\tact(ai, then)\n\t\t\t\t\t}\n\t\t\t\t\tsquad.hold()\n\t\t\t\t}\n\t\t\t}),\n\t\t\tinspect: () => ({\n\t\t\t\tplace: typeof place === 'string' ? place : point(place),\n\t\t\t\t...(memory.sprung !== undefined && { sprung: memory.sprung }),\n\t\t\t\ttimes: memory.times ?? 0\n\t\t\t})\n\t\t}\n\t})\n}\n\n/**\n * Where a wave goes: a place (a point, or a name), or a function of the brain. The nearest building of a rival's it\n * knows of when left out, else the nearest rival it sees, else the first base the seat was told (`AiOptions.enemyBases`)\n *\n * @beta\n */\nexport type MissionTarget = MissionPlace | ((ai: Brain) => Vec2 | undefined)\n\n/** Where a wave goes from a place */\nfunction targetOf(ai: Brain, target: MissionTarget | undefined, from: Vec2): Vec2 | undefined {\n\tif (typeof target === 'function') return target(ai)\n\tif (target !== undefined) return placeOf(ai, target)\n\tconst known = ai.view.enemies.known().buildings().nearest(from) ?? ai.view.enemies.units().alive().nearest(from)\n\tif (known) return point(known)\n\tconst told = ai.options.enemyBases?.[0]\n\treturn told && point(told)\n}\n\n/**\n * The units that come out of a spawner (what the mission's own rules spawn there, or what a building there trains),\n * gathered there and sent as a wave: once there are as many as `group` says (a number, or so many of each type or\n * role: `{ footman: 4, caster: 1 }`; 4 when left out), or, with `every`, every so many seconds with what has gathered\n * (at least `minForces` of the group: a share, any when left out). A wave goes for `target` (`MissionTarget`) and, once\n * that is cleared, for the next it knows of. `first`: seconds before the first wave may go (`every`, else none). Nothing\n * is trained or built: a mission with no economy feeds it\n *\n * @beta\n */\nexport function waveFrom(\n\tsource: MissionPlace,\n\toptions: Omit<MissionPartOptions, 'units' | 'refill'> & {\n\t\tgroup?: number | Record<string, number>\n\t\tevery?: number\n\t\tminForces?: number\n\t\tfirst?: number\n\t\ttarget?: MissionTarget\n\t\tradius?: number\n\t} = {}\n): AiModuleDef {\n\tconst id = options.id ?? `mission.wave:${nameOf(source)}`\n\tconst group = options.group ?? 4\n\tconst size = typeof group === 'number' ? group : Object.values(group).reduce((sum, n) => sum + n, 0)\n\treturn part(id, 'wave', (_ai, memory) => {\n\t\tconst from = (ai: Brain) => placeOf(ai, source)\n\t\tconst reach = (ai: Brain) => reachOf(ai, source, options.radius ?? SPAWN_REACH)\n\t\t/** Whether a unit is of the group: any fighter for a number, else of a type or role it names */\n\t\tconst fits = (ai: Brain, entity: EntityState) =>\n\t\t\ttypeof group === 'number'\n\t\t\t\t? ai.view.hasRole(entity, 'soldier') || ai.view.hasRole(entity, 'hero')\n\t\t\t\t: Object.keys(group).some((kind) => entity.type === kind || ai.view.hasRole(entity, kind as AiRole))\n\t\t/** What came out of the spawner and no one holds yet */\n\t\tconst come = (ai: Brain, available: UnitSet) => {\n\t\t\tconst at = from(ai)\n\t\t\tif (!at) return []\n\t\t\tconst held = new Set(ai.squads.of(id).squads.flatMap((squad) => squad.data.units))\n\t\t\treturn available\n\t\t\t\t.units()\n\t\t\t\t.alive()\n\t\t\t\t.near(at, reach(ai))\n\t\t\t\t.where((entity) => !held.has(entity.id) && !ai.goals.holder(entity.id) && fits(ai, entity)).items\n\t\t}\n\t\t/** Whether the gathered make a wave now: the group whole, or the time come with enough of it */\n\t\tconst ready = (ai: Brain, gathered: readonly EntityState[]) => {\n\t\t\tif (!gathered.length) return false\n\t\t\tconst whole =\n\t\t\t\ttypeof group === 'number'\n\t\t\t\t\t? gathered.length >= group\n\t\t\t\t\t: Object.entries(group).every(\n\t\t\t\t\t\t\t([kind, n]) => gathered.filter((entity) => entity.type === kind || ai.view.hasRole(entity, kind as AiRole)).length >= n\n\t\t\t\t\t\t)\n\t\t\tconst last = memory.last ?? ai.tick\n\t\t\tconst wait = (memory.sent ?? 0) === 0 ? (options.first ?? options.every ?? 0) : (options.every ?? 0)\n\t\t\tconst time = ai.tick - last >= Math.round(wait * ai.session.tickRate)\n\t\t\tif (!time) return false\n\t\t\tif (whole) return true\n\t\t\treturn options.every !== undefined && gathered.length >= Math.max(1, Math.ceil(size * (options.minForces ?? 0)))\n\t\t}\n\t\treturn {\n\t\t\tgoal: defineGoal({\n\t\t\t\tid,\n\t\t\t\tweight: options.weight,\n\t\t\t\tconsiderations: [...whenOf(options.when), consider('it knows where the spawner is', (ai) => (from(ai) ? 1 : 0), curve.step(1))],\n\t\t\t\tclaims: { units: (ai, available) => come(ai, available) },\n\t\t\t\trun: (ai, claimed) => {\n\t\t\t\t\tmemory.last ??= ai.tick\n\t\t\t\t\tmemory.took = true\n\t\t\t\t\tconst at = from(ai)!\n\t\t\t\t\t// what came out since: into the gathering, on hold where it stands\n\t\t\t\t\tconst fresh = come(ai, ai.goals.pool())\n\t\t\t\t\tlet gathering = ai.squads.named(id)\n\t\t\t\t\tconst waves = ai.squads.of(id).squads.filter((squad) => squad !== gathering)\n\t\t\t\t\tconst sent = new Set(waves.flatMap((squad) => squad.data.units))\n\t\t\t\t\tconst waiting = [...[...claimed.units.ids()].filter((unit) => !sent.has(unit)), ...fresh.map((entity) => entity.id)]\n\t\t\t\t\tif (waiting.length) {\n\t\t\t\t\t\tif (!gathering) gathering = claimed.squad(id, waiting).hold()\n\t\t\t\t\t\telse gathering.add(waiting, 'came out')\n\t\t\t\t\t}\n\t\t\t\t\tmemory.units = [...new Set([...sent, ...(gathering?.data.units ?? [])])].sort((a, b) => a - b)\n\t\t\t\t\t// a wave that cleared what it went for goes for the next; with nothing known, it stands where it is\n\t\t\t\t\tfor (const wave of waves) {\n\t\t\t\t\t\tif (!wave.idle || !wave.centre()) continue\n\t\t\t\t\t\tconst next = targetOf(ai, options.target, wave.centre()!)\n\t\t\t\t\t\tif (next) wave.attack(next)\n\t\t\t\t\t\telse wave.hold()\n\t\t\t\t\t}\n\t\t\t\t\tconst gathered = gathering?.units().items ?? []\n\t\t\t\t\tif (!gathering || !ready(ai, gathered)) return\n\t\t\t\t\tconst target = targetOf(ai, options.target, at)\n\t\t\t\t\tif (!target) return\n\t\t\t\t\tconst n = (memory.sent ?? 0) + 1\n\t\t\t\t\tmemory.sent = n\n\t\t\t\t\tmemory.last = ai.tick\n\t\t\t\t\tclaimed.squad(`${id} ${n}`, gathered).attack(target)\n\t\t\t\t\tai.decide(`${id} sends wave ${n} of ${gathered.length} at ${where(target)}`, { kind: 'mission' })\n\t\t\t\t}\n\t\t\t}),\n\t\t\tinspect: () => ({ source: typeof source === 'string' ? source : point(source), sent: memory.sent ?? 0, last: memory.last })\n\t\t}\n\t})\n}\n\n/**\n * When the condition holds, its units run: to `to` (a place), else home, else away from the nearest rival; and stand\n * there while it holds. Once it no longer does, they are let go of, and the parts that had them take them back. An\n * urgent goal worth 10: it takes its units from any other. Its units: its fighters, or what `units` say\n *\n * @beta\n */\nexport function fleeWhen(condition: AiCondition, options: Omit<MissionPartOptions, 'refill'> & { to?: MissionPlace } = {}): AiModuleDef {\n\tconst id = options.id ?? 'mission.flee'\n\treturn part(id, 'flee', () => {\n\t\t/** Where to run: the place, home, or away from the nearest rival, on the map */\n\t\tconst refuge = (ai: Brain, squad: Squad): Vec2 | undefined => {\n\t\t\tconst to = options.to !== undefined ? placeOf(ai, options.to) : undefined\n\t\t\tif (to) return to\n\t\t\tconst home = ai.view.home()\n\t\t\tif (home) return point(home)\n\t\t\tconst middle = squad.centre()\n\t\t\tconst foe = middle && ai.view.enemies.units().alive().nearest(middle)\n\t\t\tif (!middle || !foe) return undefined\n\t\t\tconst dx = middle.x - foe.x\n\t\t\tconst dz = middle.z - foe.z\n\t\t\tconst length = Math.sqrt(dx * dx + dz * dz) || 1\n\t\t\tconst { width, depth } = ai.session.terrain\n\t\t\treturn {\n\t\t\t\tx: Math.min(width - 1, Math.max(1, middle.x + (dx / length) * FLEE_AWAY)),\n\t\t\t\tz: Math.min(depth - 1, Math.max(1, middle.z + (dz / length) * FLEE_AWAY))\n\t\t\t}\n\t\t}\n\t\treturn {\n\t\t\tgoal: defineGoal({\n\t\t\t\tid,\n\t\t\t\tweight: options.weight ?? 10,\n\t\t\t\turgent: true,\n\t\t\t\tconsiderations: [consider('it is time to run', (ai) => (evaluate(condition, ai) ? 1 : 0), curve.step(1)), ...whenOf(options.when)],\n\t\t\t\tclaims: { units: (ai, available) => choose(ai, options.units ?? {}, available, ai.view.home(), REACH) },\n\t\t\t\tcommitment: 0,\n\t\t\t\trun: (ai, claimed) => {\n\t\t\t\t\tif (!claimed.first) {\n\t\t\t\t\t\t// those that ran and stand there now: on hold\n\t\t\t\t\t\tconst squad = ai.squads.named(id)\n\t\t\t\t\t\tif (squad?.idle) squad.hold()\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t\tconst squad = claimed.squad(id, claimed.units)\n\t\t\t\t\tconst to = refuge(ai, squad)\n\t\t\t\t\tai.decide(`${id}: ${claimed.units.length} run${to ? ` to ${where(to)}` : ''}`, { kind: 'mission' })\n\t\t\t\t\tif (to) squad.retreat(to, 'told to run')\n\t\t\t\t\telse squad.hold()\n\t\t\t\t}\n\t\t\t})\n\t\t}\n\t})\n}\n\n/**\n * When the condition holds, the computer gives up: the engine's `surrender` command, as a player's, once. Out of the\n * game as if beaten\n *\n * @beta\n */\nexport function surrenderWhen(condition: AiCondition, options: { id?: string } = {}): AiModuleDef {\n\tconst id = options.id ?? 'mission.surrender'\n\treturn part(id, 'surrender', (ai, memory) => ({\n\t\tthink: () => {\n\t\t\tif (memory.done || !evaluate(condition, ai)) return\n\t\t\tmemory.done = true\n\t\t\tai.decide(`${id}: gives up`, { kind: 'mission' })\n\t\t\tai.send({ type: 'surrender' })\n\t\t},\n\t\tinspect: () => ({ done: !!memory.done })\n\t}))\n}\n\n/**\n * A computer player for a mission: a brain (`defineBrain`) of what every mission's computer has (its rules, the words\n * every brain may be told, the goals' picker, squads, micro) and the parts it is given (`modules`: `holdPosition`,\n * `patrol`, `guard`, `ambush`, `waveFrom`, `fleeWhen`, `surrenderWhen`, any module of the kit's or of its own). Nothing\n * builds, trains, gathers, scouts or answers raids on its bases unless a module for it is given (`economy()`,\n * `scouting()`, `defence()`). Everything else of `BrainDef` as for any brain (`goals`, `micro`, `without`, `knowledge`)\n *\n * @public\n */\nexport function missionBrain(def: MissionBrainDef): BrainDef {\n\tconst { modules = [], ...rest } = def\n\treturn defineBrain({\n\t\t...rest,\n\t\tmodules: [\n\t\t\t// its own rules first, as the melee brain's: what a rule takes is not given orders by the rest\n\t\t\tdefineModule({ id: 'rules', make: (ai: Brain) => (rules(ai.def.rules ?? []) as (ai: Brain) => AiModule)(ai) }),\n\t\t\twords(),\n\t\t\t...modules,\n\t\t\tgoals(),\n\t\t\tsquads(),\n\t\t\tmicro()\n\t\t]\n\t})\n}\n"],"mappings":"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"}
@@ -3,7 +3,7 @@ import type { GamePack } from '#engine/packs/pack';
3
3
  /**
4
4
  * Mission rules as data (campaign plan MS1): the rules a map keeps (`MissionRule`, under `GameMap.data.rules`, written
5
5
  * in the editor's Rules panel) run as the game plays, `rules` of the game's own code beside them. Each `when` a
6
- * condition of the computer players' language holds (`docs/ai.md`), asked as a player, `do`es its actions
6
+ * condition of the computer players' language holds (`docs/ai/scripting.md`), asked as a player, `do`es its actions
7
7
  * (`MissionActionData`: an objective of the map's given, done or failed, a line said, a cinematic played, a prefab
8
8
  * spawned, a computer told, a relation set, a timer started, win, lose). Checked once a second; what the rules
9
9
  * remember is in the world's state, so a save mid-mission has it. The code reaches the rules with `tellRules` and hears