@v12-engine/engine 0.1.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (951) hide show
  1. package/dist/abilities/amounts.d.ts +28 -0
  2. package/dist/abilities/amounts.js +74 -0
  3. package/dist/abilities/amounts.js.map +1 -0
  4. package/dist/abilities/buffs.d.ts +106 -6
  5. package/dist/abilities/buffs.js +443 -0
  6. package/dist/abilities/buffs.js.map +1 -0
  7. package/dist/abilities/castTold.d.ts +2 -0
  8. package/dist/abilities/castTold.js +66 -0
  9. package/dist/abilities/castTold.js.map +1 -0
  10. package/dist/abilities/chance.d.ts +38 -0
  11. package/dist/abilities/chance.js +77 -0
  12. package/dist/abilities/chance.js.map +1 -0
  13. package/dist/abilities/charges.d.ts +18 -0
  14. package/dist/abilities/charges.js +101 -0
  15. package/dist/abilities/charges.js.map +1 -0
  16. package/dist/abilities/control.d.ts +28 -0
  17. package/dist/abilities/control.js +113 -0
  18. package/dist/abilities/control.js.map +1 -0
  19. package/dist/abilities/dispel.js +51 -0
  20. package/dist/abilities/dispel.js.map +1 -0
  21. package/dist/abilities/effectFields.d.ts +1 -1
  22. package/dist/abilities/effectFields.js +676 -0
  23. package/dist/abilities/effectFields.js.map +1 -0
  24. package/dist/abilities/effectIndex.d.ts +27 -0
  25. package/dist/abilities/effectIndex.js +64 -0
  26. package/dist/abilities/effectIndex.js.map +1 -0
  27. package/dist/abilities/effects/buff.d.ts +9 -3
  28. package/dist/abilities/effects/buff.js +84 -0
  29. package/dist/abilities/effects/buff.js.map +1 -0
  30. package/dist/abilities/effects/conditions.d.ts +2 -0
  31. package/dist/abilities/effects/conditions.js +41 -0
  32. package/dist/abilities/effects/conditions.js.map +1 -0
  33. package/dist/abilities/effects/core.js +54 -0
  34. package/dist/abilities/effects/core.js.map +1 -0
  35. package/dist/abilities/effects/damage.d.ts +1 -1
  36. package/dist/abilities/effects/damage.js +43 -0
  37. package/dist/abilities/effects/damage.js.map +1 -0
  38. package/dist/abilities/effects/heal.d.ts +2 -2
  39. package/dist/abilities/effects/heal.js +51 -0
  40. package/dist/abilities/effects/heal.js.map +1 -0
  41. package/dist/abilities/effects/missile.d.ts +13 -1
  42. package/dist/abilities/effects/missile.js +104 -0
  43. package/dist/abilities/effects/missile.js.map +1 -0
  44. package/dist/abilities/effects/morph.d.ts +5 -0
  45. package/dist/abilities/effects/morph.js +43 -0
  46. package/dist/abilities/effects/morph.js.map +1 -0
  47. package/dist/abilities/effects/moves.d.ts +16 -4
  48. package/dist/abilities/effects/moves.js +212 -0
  49. package/dist/abilities/effects/moves.js.map +1 -0
  50. package/dist/abilities/effects/passives.d.ts +19 -9
  51. package/dist/abilities/effects/passives.js +131 -0
  52. package/dist/abilities/effects/passives.js.map +1 -0
  53. package/dist/abilities/effects/proxy.d.ts +5 -0
  54. package/dist/abilities/effects/proxy.js +60 -0
  55. package/dist/abilities/effects/proxy.js.map +1 -0
  56. package/dist/abilities/effects/sight.d.ts +2 -2
  57. package/dist/abilities/effects/sight.js +39 -0
  58. package/dist/abilities/effects/sight.js.map +1 -0
  59. package/dist/abilities/effects/spawn.d.ts +5 -2
  60. package/dist/abilities/effects/spawn.js +40 -0
  61. package/dist/abilities/effects/spawn.js.map +1 -0
  62. package/dist/abilities/effects/timed.d.ts +2 -2
  63. package/dist/abilities/effects/timed.js +96 -0
  64. package/dist/abilities/effects/timed.js.map +1 -0
  65. package/dist/abilities/effects/trade.d.ts +1 -1
  66. package/dist/abilities/effects/trade.js +25 -0
  67. package/dist/abilities/effects/trade.js.map +1 -0
  68. package/dist/abilities/effects.d.ts +97 -23
  69. package/dist/abilities/effects.js +860 -0
  70. package/dist/abilities/effects.js.map +1 -0
  71. package/dist/abilities/land.d.ts +38 -4
  72. package/dist/abilities/land.js +189 -0
  73. package/dist/abilities/land.js.map +1 -0
  74. package/dist/abilities/recast.d.ts +45 -0
  75. package/dist/abilities/recast.js +118 -0
  76. package/dist/abilities/recast.js.map +1 -0
  77. package/dist/abilities/scaled.js +40 -0
  78. package/dist/abilities/scaled.js.map +1 -0
  79. package/dist/abilities/screen.d.ts +6 -0
  80. package/dist/abilities/screen.js +83 -0
  81. package/dist/abilities/screen.js.map +1 -0
  82. package/dist/abilities/shapes.d.ts +66 -0
  83. package/dist/abilities/shapes.js +122 -0
  84. package/dist/abilities/shapes.js.map +1 -0
  85. package/dist/abilities/text.d.ts +14 -2
  86. package/dist/abilities/text.js +204 -0
  87. package/dist/abilities/text.js.map +1 -0
  88. package/dist/abilities/triggers.d.ts +98 -0
  89. package/dist/abilities/triggers.js +351 -0
  90. package/dist/abilities/triggers.js.map +1 -0
  91. package/dist/abilityChanges.d.ts +131 -0
  92. package/dist/abilityChanges.js +345 -0
  93. package/dist/abilityChanges.js.map +1 -0
  94. package/dist/ai/area.d.ts +4 -1
  95. package/dist/ai/brain.d.ts +4 -1
  96. package/dist/ai/brain.js +844 -0
  97. package/dist/ai/brain.js.map +1 -0
  98. package/dist/ai/budget.js +74 -0
  99. package/dist/ai/budget.js.map +1 -0
  100. package/dist/ai/checks.d.ts +9 -1
  101. package/dist/ai/checks.js +242 -0
  102. package/dist/ai/checks.js.map +1 -0
  103. package/dist/ai/computer.d.ts +11 -4
  104. package/dist/ai/computer.js +251 -0
  105. package/dist/ai/computer.js.map +1 -0
  106. package/dist/ai/defence.d.ts +4 -0
  107. package/dist/ai/defence.js +430 -0
  108. package/dist/ai/defence.js.map +1 -0
  109. package/dist/ai/define.d.ts +3 -2
  110. package/dist/ai/define.js +31 -0
  111. package/dist/ai/define.js.map +1 -0
  112. package/dist/ai/economy.d.ts +10 -7
  113. package/dist/ai/economy.js +780 -0
  114. package/dist/ai/economy.js.map +1 -0
  115. package/dist/ai/geometry.js +38 -0
  116. package/dist/ai/geometry.js.map +1 -0
  117. package/dist/ai/goals.d.ts +1 -0
  118. package/dist/ai/goals.js +560 -0
  119. package/dist/ai/goals.js.map +1 -0
  120. package/dist/ai/knowledge.d.ts +72 -7
  121. package/dist/ai/knowledge.js +804 -0
  122. package/dist/ai/knowledge.js.map +1 -0
  123. package/dist/ai/lanes.d.ts +10 -2
  124. package/dist/ai/lanes.js +715 -0
  125. package/dist/ai/lanes.js.map +1 -0
  126. package/dist/ai/melee/build.js +264 -0
  127. package/dist/ai/melee/build.js.map +1 -0
  128. package/dist/ai/melee/goals.d.ts +7 -0
  129. package/dist/ai/melee/goals.js +720 -0
  130. package/dist/ai/melee/goals.js.map +1 -0
  131. package/dist/ai/melee/heroes.js +68 -0
  132. package/dist/ai/melee/heroes.js.map +1 -0
  133. package/dist/ai/melee/index.d.ts +1 -1
  134. package/dist/ai/melee/index.js +51 -0
  135. package/dist/ai/melee/index.js.map +1 -0
  136. package/dist/ai/melee/production.js +29 -0
  137. package/dist/ai/melee/production.js.map +1 -0
  138. package/dist/ai/melee/surrender.js +64 -0
  139. package/dist/ai/melee/surrender.js.map +1 -0
  140. package/dist/ai/micro.d.ts +9 -0
  141. package/dist/ai/micro.js +1316 -0
  142. package/dist/ai/micro.js.map +1 -0
  143. package/dist/ai/mission.d.ts +9 -2
  144. package/dist/ai/mission.js +538 -0
  145. package/dist/ai/mission.js.map +1 -0
  146. package/dist/ai/missionRules.d.ts +1 -1
  147. package/dist/ai/missionRules.js +26 -0
  148. package/dist/ai/missionRules.js.map +1 -0
  149. package/dist/ai/module.d.ts +6 -2
  150. package/dist/ai/module.js +37 -0
  151. package/dist/ai/module.js.map +1 -0
  152. package/dist/ai/options.d.ts +3 -3
  153. package/dist/ai/plans/build.d.ts +20 -1
  154. package/dist/ai/plans/build.js +608 -0
  155. package/dist/ai/plans/build.js.map +1 -0
  156. package/dist/ai/plans/placement.d.ts +4 -1
  157. package/dist/ai/plans/placement.js +295 -0
  158. package/dist/ai/plans/placement.js.map +1 -0
  159. package/dist/ai/plans/plans.d.ts +9 -0
  160. package/dist/ai/plans/plans.js +110 -0
  161. package/dist/ai/plans/plans.js.map +1 -0
  162. package/dist/ai/plans/production.d.ts +14 -2
  163. package/dist/ai/plans/production.js +434 -0
  164. package/dist/ai/plans/production.js.map +1 -0
  165. package/dist/ai/plans/purse.d.ts +6 -3
  166. package/dist/ai/plans/purse.js +139 -0
  167. package/dist/ai/plans/purse.js.map +1 -0
  168. package/dist/ai/plans/tech.d.ts +6 -0
  169. package/dist/ai/plans/tech.js +122 -0
  170. package/dist/ai/plans/tech.js.map +1 -0
  171. package/dist/ai/profiles.d.ts +4 -4
  172. package/dist/{profiles-B3NS9jwk.js → ai/profiles.js} +3 -98
  173. package/dist/ai/profiles.js.map +1 -0
  174. package/dist/ai/reach.js +54 -0
  175. package/dist/ai/reach.js.map +1 -0
  176. package/dist/ai/report.d.ts +8 -0
  177. package/dist/ai/report.js +87 -0
  178. package/dist/ai/report.js.map +1 -0
  179. package/dist/ai/roles.d.ts +4 -0
  180. package/dist/ai/roles.js +207 -0
  181. package/dist/ai/roles.js.map +1 -0
  182. package/dist/ai/rules.d.ts +8 -2
  183. package/dist/ai/rules.js +416 -0
  184. package/dist/ai/rules.js.map +1 -0
  185. package/dist/ai/scouting.d.ts +6 -0
  186. package/dist/ai/scouting.js +324 -0
  187. package/dist/ai/scouting.js.map +1 -0
  188. package/dist/ai/settings.js +99 -0
  189. package/dist/ai/settings.js.map +1 -0
  190. package/dist/ai/squads.d.ts +21 -2
  191. package/dist/ai/squads.js +916 -0
  192. package/dist/ai/squads.js.map +1 -0
  193. package/dist/ai/strength.js +320 -0
  194. package/dist/ai/strength.js.map +1 -0
  195. package/dist/ai/task.d.ts +3 -1
  196. package/dist/ai/task.js +17 -0
  197. package/dist/ai/task.js.map +1 -0
  198. package/dist/ai/tasks/attack.js +24 -0
  199. package/dist/ai/tasks/attack.js.map +1 -0
  200. package/dist/ai/tasks/capture.d.ts +3 -3
  201. package/dist/ai/tasks/capture.js +37 -0
  202. package/dist/ai/tasks/capture.js.map +1 -0
  203. package/dist/ai/tasks/creep.js +29 -0
  204. package/dist/ai/tasks/creep.js.map +1 -0
  205. package/dist/ai/tasks/defend.js +61 -0
  206. package/dist/ai/tasks/defend.js.map +1 -0
  207. package/dist/ai/tasks/drop.js +81 -0
  208. package/dist/ai/tasks/drop.js.map +1 -0
  209. package/dist/ai/tasks/escort.js +59 -0
  210. package/dist/ai/tasks/escort.js.map +1 -0
  211. package/dist/ai/tasks/gather.js +48 -0
  212. package/dist/ai/tasks/gather.js.map +1 -0
  213. package/dist/ai/tasks/harass.js +39 -0
  214. package/dist/ai/tasks/harass.js.map +1 -0
  215. package/dist/ai/tasks/hold.js +32 -0
  216. package/dist/ai/tasks/hold.js.map +1 -0
  217. package/dist/ai/tasks/index.js +34 -0
  218. package/dist/ai/tasks/index.js.map +1 -0
  219. package/dist/ai/tasks/move.js +26 -0
  220. package/dist/ai/tasks/move.js.map +1 -0
  221. package/dist/ai/tasks/patrol.js +59 -0
  222. package/dist/ai/tasks/patrol.js.map +1 -0
  223. package/dist/ai/tasks/retreat.js +28 -0
  224. package/dist/ai/tasks/retreat.js.map +1 -0
  225. package/dist/ai/tasks/scout.js +73 -0
  226. package/dist/ai/tasks/scout.js.map +1 -0
  227. package/dist/ai/tasks/shared.d.ts +1 -1
  228. package/dist/ai/tasks/shared.js +137 -0
  229. package/dist/ai/tasks/shared.js.map +1 -0
  230. package/dist/ai/team.d.ts +18 -1
  231. package/dist/ai/team.js +492 -0
  232. package/dist/ai/team.js.map +1 -0
  233. package/dist/ai/threat.d.ts +6 -0
  234. package/dist/ai/threat.js +206 -0
  235. package/dist/ai/threat.js.map +1 -0
  236. package/dist/ai/view.d.ts +21 -7
  237. package/dist/ai/view.js +677 -0
  238. package/dist/ai/view.js.map +1 -0
  239. package/dist/ai/waves.d.ts +6 -0
  240. package/dist/ai/waves.js +410 -0
  241. package/dist/ai/waves.js.map +1 -0
  242. package/dist/ai.js +54 -6239
  243. package/dist/aiTesting.d.ts +6 -3
  244. package/dist/aiTesting.js +229 -0
  245. package/dist/aiTesting.js.map +1 -0
  246. package/dist/areas.d.ts +4 -1
  247. package/dist/areas.js +295 -0
  248. package/dist/areas.js.map +1 -0
  249. package/dist/attacks.d.ts +3 -3
  250. package/dist/attacks.js +127 -0
  251. package/dist/attacks.js.map +1 -0
  252. package/dist/burning.d.ts +267 -0
  253. package/dist/burning.js +795 -0
  254. package/dist/burning.js.map +1 -0
  255. package/dist/bytes.js +21 -0
  256. package/dist/bytes.js.map +1 -0
  257. package/dist/callings.d.ts +71 -0
  258. package/dist/callings.js +157 -0
  259. package/dist/callings.js.map +1 -0
  260. package/dist/cameraOrders.d.ts +78 -0
  261. package/dist/cameraOrders.js +114 -0
  262. package/dist/cameraOrders.js.map +1 -0
  263. package/dist/camps.d.ts +70 -4
  264. package/dist/camps.js +501 -0
  265. package/dist/camps.js.map +1 -0
  266. package/dist/capture.d.ts +15 -3
  267. package/dist/capture.js +304 -0
  268. package/dist/capture.js.map +1 -0
  269. package/dist/cellLayers.d.ts +78 -13
  270. package/dist/cellLayers.js +275 -0
  271. package/dist/cellLayers.js.map +1 -0
  272. package/dist/cellPatches.d.ts +24 -0
  273. package/dist/cellPatches.js +73 -0
  274. package/dist/cellPatches.js.map +1 -0
  275. package/dist/cinematics.d.ts +10 -5
  276. package/dist/cinematics.js +161 -0
  277. package/dist/cinematics.js.map +1 -0
  278. package/dist/clock.d.ts +2 -2
  279. package/dist/clock.js +78 -0
  280. package/dist/clock.js.map +1 -0
  281. package/dist/commands.d.ts +36 -4
  282. package/dist/commands.js +636 -0
  283. package/dist/commands.js.map +1 -0
  284. package/dist/components.d.ts +31 -10
  285. package/dist/components.js +74 -0
  286. package/dist/components.js.map +1 -0
  287. package/dist/computers.d.ts +4 -4
  288. package/dist/computers.js +194 -0
  289. package/dist/computers.js.map +1 -0
  290. package/dist/concealment.d.ts +25 -2
  291. package/dist/concealment.js +409 -0
  292. package/dist/concealment.js.map +1 -0
  293. package/dist/coreComponents.js +130 -0
  294. package/dist/coreComponents.js.map +1 -0
  295. package/dist/createGame.d.ts +306 -0
  296. package/dist/createGame.js +405 -0
  297. package/dist/createGame.js.map +1 -0
  298. package/dist/dashing.d.ts +18 -2
  299. package/dist/dashing.js +41 -0
  300. package/dist/dashing.js.map +1 -0
  301. package/dist/debug.d.ts +8 -0
  302. package/dist/debug.js +5 -3
  303. package/dist/debug2.js +76 -0
  304. package/dist/debug2.js.map +1 -0
  305. package/dist/debugCommands.d.ts +6 -6
  306. package/dist/debugCommands.js +537 -0
  307. package/dist/debugCommands.js.map +1 -0
  308. package/dist/debugging.d.ts +1 -0
  309. package/dist/defaultSets.d.ts +183 -0
  310. package/dist/defaultSets.js +216 -0
  311. package/dist/defaultSets.js.map +1 -0
  312. package/dist/definitions.d.ts +6 -0
  313. package/dist/definitions.js +78 -0
  314. package/dist/definitions.js.map +1 -0
  315. package/dist/defs.d.ts +1895 -165
  316. package/dist/defs.js +380 -0
  317. package/dist/defs.js.map +1 -0
  318. package/dist/denying.d.ts +4 -4
  319. package/dist/denying.js +106 -0
  320. package/dist/denying.js.map +1 -0
  321. package/dist/destructibles.d.ts +2 -2
  322. package/dist/destructibles.js +36 -0
  323. package/dist/destructibles.js.map +1 -0
  324. package/dist/determinism.d.ts +4 -4
  325. package/dist/determinism.js +247 -0
  326. package/dist/determinism.js.map +1 -0
  327. package/dist/dialog.d.ts +17 -2
  328. package/dist/dialog.js +108 -0
  329. package/dist/dialog.js.map +1 -0
  330. package/dist/effectRefs.js +28 -0
  331. package/dist/effectRefs.js.map +1 -0
  332. package/dist/effects.d.ts +27 -11
  333. package/dist/effects.js +110 -0
  334. package/dist/effects.js.map +1 -0
  335. package/dist/endings.d.ts +1 -1
  336. package/dist/endings.js +78 -0
  337. package/dist/endings.js.map +1 -0
  338. package/dist/engagement.d.ts +40 -6
  339. package/dist/engagement.js +530 -0
  340. package/dist/engagement.js.map +1 -0
  341. package/dist/engineEvents.d.ts +72 -9
  342. package/dist/engineEvents.js +520 -0
  343. package/dist/engineEvents.js.map +1 -0
  344. package/dist/entity.d.ts +275 -26
  345. package/dist/entity.js +441 -0
  346. package/dist/entity.js.map +1 -0
  347. package/dist/entityIndex.d.ts +10 -3
  348. package/dist/entityIndex.js +149 -0
  349. package/dist/entityIndex.js.map +1 -0
  350. package/dist/errors.d.ts +6 -2
  351. package/dist/errors.js +59 -0
  352. package/dist/errors.js.map +1 -0
  353. package/dist/events.d.ts +11 -5
  354. package/dist/events.js +158 -0
  355. package/dist/events.js.map +1 -0
  356. package/dist/exactMath.js +273 -0
  357. package/dist/exactMath.js.map +1 -0
  358. package/dist/features.d.ts +1 -1
  359. package/dist/features.js +127 -0
  360. package/dist/features.js.map +1 -0
  361. package/dist/fields.d.ts +25 -5
  362. package/dist/fields.js +140 -0
  363. package/dist/fields.js.map +1 -0
  364. package/dist/fixture.d.ts +3 -3
  365. package/dist/fixture.js +512 -0
  366. package/dist/fixture.js.map +1 -0
  367. package/dist/fog.d.ts +26 -3
  368. package/dist/fog.js +333 -0
  369. package/dist/fog.js.map +1 -0
  370. package/dist/foliage.d.ts +476 -0
  371. package/dist/foliage.js +1478 -0
  372. package/dist/foliage.js.map +1 -0
  373. package/dist/foliageDebug.d.ts +57 -0
  374. package/dist/foliageDebug.js +172 -0
  375. package/dist/foliageDebug.js.map +1 -0
  376. package/dist/foliageRegrowth.d.ts +20 -0
  377. package/dist/foliageRegrowth.js +332 -0
  378. package/dist/foliageRegrowth.js.map +1 -0
  379. package/dist/formState.d.ts +67 -0
  380. package/dist/formState.js +65 -0
  381. package/dist/formState.js.map +1 -0
  382. package/dist/formation.d.ts +46 -8
  383. package/dist/formation.js +297 -0
  384. package/dist/formation.js.map +1 -0
  385. package/dist/forms.d.ts +58 -0
  386. package/dist/forms.js +146 -0
  387. package/dist/forms.js.map +1 -0
  388. package/dist/friendlyFire.d.ts +2 -2
  389. package/dist/friendlyFire.js +37 -0
  390. package/dist/friendlyFire.js.map +1 -0
  391. package/dist/game.d.ts +141 -48
  392. package/dist/game.js +834 -0
  393. package/dist/game.js.map +1 -0
  394. package/dist/gameData.d.ts +96 -22
  395. package/dist/gameData.js +1690 -0
  396. package/dist/gameData.js.map +1 -0
  397. package/dist/gameFiles.d.ts +3 -3
  398. package/dist/gameFiles.js +14 -0
  399. package/dist/gameFiles.js.map +1 -0
  400. package/dist/gates.js +92 -0
  401. package/dist/gates.js.map +1 -0
  402. package/dist/generate.d.ts +28 -1
  403. package/dist/generate.js +1062 -0
  404. package/dist/generate.js.map +1 -0
  405. package/dist/generateWorker.d.ts +7 -3
  406. package/dist/generateWorker.js +86 -0
  407. package/dist/generateWorker.js.map +1 -0
  408. package/dist/grid.d.ts +9 -0
  409. package/dist/grid.js +102 -0
  410. package/dist/grid.js.map +1 -0
  411. package/dist/ground.d.ts +17 -1
  412. package/dist/ground.js +375 -0
  413. package/dist/ground.js.map +1 -0
  414. package/dist/groundObjects.d.ts +70 -0
  415. package/dist/groundObjects.js +371 -0
  416. package/dist/groundObjects.js.map +1 -0
  417. package/dist/groundSpeed.d.ts +20 -3
  418. package/dist/groundSpeed.js +117 -0
  419. package/dist/groundSpeed.js.map +1 -0
  420. package/dist/hero.d.ts +126 -10
  421. package/dist/hero.js +432 -0
  422. package/dist/hero.js.map +1 -0
  423. package/dist/holds.d.ts +94 -0
  424. package/dist/holds.js +305 -0
  425. package/dist/holds.js.map +1 -0
  426. package/dist/home.d.ts +1 -1
  427. package/dist/home.js +30 -0
  428. package/dist/home.js.map +1 -0
  429. package/dist/hooks.d.ts +339 -57
  430. package/dist/hooks.js +105 -0
  431. package/dist/hooks.js.map +1 -0
  432. package/dist/hotReload.d.ts +6 -5
  433. package/dist/hotReload.js +145 -0
  434. package/dist/hotReload.js.map +1 -0
  435. package/dist/ids.d.ts +3 -3
  436. package/dist/ids.js +30 -0
  437. package/dist/ids.js.map +1 -0
  438. package/dist/idsFile.d.ts +36 -0
  439. package/dist/idsFile.js +134 -0
  440. package/dist/idsFile.js.map +1 -0
  441. package/dist/index.d.ts +105 -68
  442. package/dist/index.js +194 -4701
  443. package/dist/inspect.d.ts +29 -2
  444. package/dist/{inspect-D9dWHmZ0.js → inspect.js} +21 -12
  445. package/dist/inspect.js.map +1 -0
  446. package/dist/inventory.d.ts +14 -1
  447. package/dist/inventory.js +84 -0
  448. package/dist/inventory.js.map +1 -0
  449. package/dist/items.d.ts +136 -8
  450. package/dist/items.js +585 -0
  451. package/dist/items.js.map +1 -0
  452. package/dist/lanes.d.ts +12 -3
  453. package/dist/lanes.js +496 -0
  454. package/dist/lanes.js.map +1 -0
  455. package/dist/life.d.ts +6 -2
  456. package/dist/life.js +287 -0
  457. package/dist/life.js.map +1 -0
  458. package/dist/log.d.ts +26 -3
  459. package/dist/log.js +192 -0
  460. package/dist/log.js.map +1 -0
  461. package/dist/manaBurn.d.ts +2 -2
  462. package/dist/manaBurn.js +75 -0
  463. package/dist/manaBurn.js.map +1 -0
  464. package/dist/map/file.d.ts +56 -3
  465. package/dist/map/file.js +264 -0
  466. package/dist/map/file.js.map +1 -0
  467. package/dist/map/images.js +61 -0
  468. package/dist/map/images.js.map +1 -0
  469. package/dist/map/look.d.ts +1 -1
  470. package/dist/map/look.js +30 -0
  471. package/dist/map/look.js.map +1 -0
  472. package/dist/map/pathProfile.js +183 -0
  473. package/dist/map/pathProfile.js.map +1 -0
  474. package/dist/map/resize.d.ts +4 -0
  475. package/dist/map/resize.js +136 -0
  476. package/dist/map/resize.js.map +1 -0
  477. package/dist/map/schema.js +257 -0
  478. package/dist/map/schema.js.map +1 -0
  479. package/dist/map/terrain.js +214 -0
  480. package/dist/map/terrain.js.map +1 -0
  481. package/dist/map/types.d.ts +92 -13
  482. package/dist/map/types.js +251 -0
  483. package/dist/map/types.js.map +1 -0
  484. package/dist/mapCheck/cells.js +94 -0
  485. package/dist/mapCheck/cells.js.map +1 -0
  486. package/dist/mapCheck/rules/foliage.d.ts +9 -0
  487. package/dist/mapCheck/rules/foliage.js +83 -0
  488. package/dist/mapCheck/rules/foliage.js.map +1 -0
  489. package/dist/mapCheck/rules/names.js +39 -0
  490. package/dist/mapCheck/rules/names.js.map +1 -0
  491. package/dist/mapCheck/rules/objects.d.ts +1 -1
  492. package/dist/mapCheck/rules/objects.js +56 -0
  493. package/dist/mapCheck/rules/objects.js.map +1 -0
  494. package/dist/mapCheck/rules/paths.js +32 -0
  495. package/dist/mapCheck/rules/paths.js.map +1 -0
  496. package/dist/mapCheck/rules/players.js +20 -0
  497. package/dist/mapCheck/rules/players.js.map +1 -0
  498. package/dist/mapCheck/rules/races.js +56 -0
  499. package/dist/mapCheck/rules/races.js.map +1 -0
  500. package/dist/mapCheck/rules/random.js +47 -0
  501. package/dist/mapCheck/rules/random.js.map +1 -0
  502. package/dist/mapCheck/rules/regions.js +30 -0
  503. package/dist/mapCheck/rules/regions.js.map +1 -0
  504. package/dist/mapCheck/rules/targets.js +31 -0
  505. package/dist/mapCheck/rules/targets.js.map +1 -0
  506. package/dist/mapCheck/rules/walking.js +45 -0
  507. package/dist/mapCheck/rules/walking.js.map +1 -0
  508. package/dist/mapCheck.d.ts +2 -2
  509. package/dist/mapCheck.js +63 -0
  510. package/dist/mapCheck.js.map +1 -0
  511. package/dist/mapFields.d.ts +25 -2
  512. package/dist/mapFields.js +134 -0
  513. package/dist/mapFields.js.map +1 -0
  514. package/dist/mapFile.js +176 -0
  515. package/dist/mapFile.js.map +1 -0
  516. package/dist/mapMeasure.d.ts +8 -0
  517. package/dist/mapMeasure.js +283 -0
  518. package/dist/mapMeasure.js.map +1 -0
  519. package/dist/mapMerge.d.ts +1 -0
  520. package/dist/mapMerge.js +172 -0
  521. package/dist/mapMerge.js.map +1 -0
  522. package/dist/mapObjectives.js +138 -0
  523. package/dist/mapObjectives.js.map +1 -0
  524. package/dist/mapObjects.js +80 -0
  525. package/dist/mapObjects.js.map +1 -0
  526. package/dist/math.d.ts +37 -7
  527. package/dist/math.js +155 -0
  528. package/dist/math.js.map +1 -0
  529. package/dist/messages.d.ts +71 -4
  530. package/dist/messages.js +29 -0
  531. package/dist/messages.js.map +1 -0
  532. package/dist/missionRules.d.ts +10 -2
  533. package/dist/{missionRules-C-bGxm0Q.js → missionRules.js} +30 -150
  534. package/dist/missionRules.js.map +1 -0
  535. package/dist/mods.d.ts +39 -20
  536. package/dist/mods.js +271 -0
  537. package/dist/mods.js.map +1 -0
  538. package/dist/moves.d.ts +87 -0
  539. package/dist/moves.js +539 -0
  540. package/dist/moves.js.map +1 -0
  541. package/dist/names.d.ts +7 -0
  542. package/dist/names.js +122 -0
  543. package/dist/names.js.map +1 -0
  544. package/dist/navigation/agentParams.js +14 -0
  545. package/dist/navigation/agentParams.js.map +1 -0
  546. package/dist/navigation/air.d.ts +7 -3
  547. package/dist/navigation/air.js +401 -0
  548. package/dist/navigation/air.js.map +1 -0
  549. package/dist/navigation/builds.d.ts +34 -2
  550. package/dist/navigation/builds.js +287 -0
  551. package/dist/navigation/builds.js.map +1 -0
  552. package/dist/navigation/groundAreas.d.ts +59 -1
  553. package/dist/navigation/groundAreas.js +407 -0
  554. package/dist/navigation/groundAreas.js.map +1 -0
  555. package/dist/navigation/navigation.d.ts +98 -9
  556. package/dist/navigation/recast.d.ts +194 -18
  557. package/dist/navigation/recast.js +1379 -0
  558. package/dist/navigation/recast.js.map +1 -0
  559. package/dist/navigation/sidePaths.d.ts +8 -3
  560. package/dist/navigation/sidePaths.js +241 -0
  561. package/dist/navigation/sidePaths.js.map +1 -0
  562. package/dist/navigation/sized.js +243 -0
  563. package/dist/navigation/sized.js.map +1 -0
  564. package/dist/nearest.js +32 -0
  565. package/dist/nearest.js.map +1 -0
  566. package/dist/noise.js +59 -0
  567. package/dist/noise.js.map +1 -0
  568. package/dist/objectives.d.ts +12 -3
  569. package/dist/objectives.js +144 -0
  570. package/dist/objectives.js.map +1 -0
  571. package/dist/orders/basic.d.ts +5 -5
  572. package/dist/orders/basic.js +417 -0
  573. package/dist/orders/basic.js.map +1 -0
  574. package/dist/orders/build.js +278 -0
  575. package/dist/orders/build.js.map +1 -0
  576. package/dist/orders/cast.d.ts +13 -3
  577. package/dist/orders/cast.js +558 -0
  578. package/dist/orders/cast.js.map +1 -0
  579. package/dist/orders/facts.js +16 -0
  580. package/dist/orders/facts.js.map +1 -0
  581. package/dist/orders/harvest.d.ts +21 -5
  582. package/dist/orders/harvest.js +540 -0
  583. package/dist/orders/harvest.js.map +1 -0
  584. package/dist/orders/idle.d.ts +3 -1
  585. package/dist/orders/idle.js +234 -0
  586. package/dist/orders/idle.js.map +1 -0
  587. package/dist/orders/items.js +92 -0
  588. package/dist/orders/items.js.map +1 -0
  589. package/dist/orders/queue.js +108 -0
  590. package/dist/orders/queue.js.map +1 -0
  591. package/dist/orders/waiting.d.ts +39 -0
  592. package/dist/orders/waiting.js +149 -0
  593. package/dist/orders/waiting.js.map +1 -0
  594. package/dist/pack.schema.js +13 -0
  595. package/dist/pack.schema.js.map +1 -0
  596. package/dist/pack.schema.json +7622 -841
  597. package/dist/packs/director/index.d.ts +13 -5
  598. package/dist/packs/director/index.js +204 -0
  599. package/dist/packs/director/index.js.map +1 -0
  600. package/dist/packs/heroes/campaign.d.ts +3 -2
  601. package/dist/packs/heroes/campaign.js +241 -0
  602. package/dist/packs/heroes/campaign.js.map +1 -0
  603. package/dist/packs/heroes/carry.d.ts +6 -0
  604. package/dist/packs/heroes/carry.js +112 -0
  605. package/dist/packs/heroes/carry.js.map +1 -0
  606. package/dist/packs/heroes/commands.js +115 -0
  607. package/dist/packs/heroes/commands.js.map +1 -0
  608. package/dist/packs/heroes/fallen.d.ts +43 -0
  609. package/dist/packs/heroes/fallen.js +61 -0
  610. package/dist/packs/heroes/fallen.js.map +1 -0
  611. package/dist/packs/heroes/hire.js +60 -0
  612. package/dist/packs/heroes/hire.js.map +1 -0
  613. package/dist/packs/heroes/index.d.ts +7 -6
  614. package/dist/packs/heroes/index.js +130 -0
  615. package/dist/packs/heroes/index.js.map +1 -0
  616. package/dist/packs/heroes/loop.d.ts +95 -0
  617. package/dist/packs/heroes/loop.js +250 -0
  618. package/dist/packs/heroes/loop.js.map +1 -0
  619. package/dist/packs/heroes/making.d.ts +6 -3
  620. package/dist/packs/heroes/making.js +55 -0
  621. package/dist/packs/heroes/making.js.map +1 -0
  622. package/dist/packs/heroes/respawn.d.ts +3 -3
  623. package/dist/packs/heroes/respawn.js +87 -0
  624. package/dist/packs/heroes/respawn.js.map +1 -0
  625. package/dist/packs/heroes/sets.d.ts +32 -0
  626. package/dist/packs/heroes/sets.js +51 -0
  627. package/dist/packs/heroes/sets.js.map +1 -0
  628. package/dist/packs/heroes/spells.d.ts +16 -0
  629. package/dist/packs/heroes/spells.js +269 -0
  630. package/dist/packs/heroes/spells.js.map +1 -0
  631. package/dist/packs/items/defaults.d.ts +43 -0
  632. package/dist/packs/items/defaults.js +1504 -0
  633. package/dist/packs/items/defaults.js.map +1 -0
  634. package/dist/packs/items/index.d.ts +27 -0
  635. package/dist/packs/items/index.js +214 -0
  636. package/dist/packs/items/index.js.map +1 -0
  637. package/dist/packs/moba/index.d.ts +3 -3
  638. package/dist/packs/moba/index.js +174 -0
  639. package/dist/packs/moba/index.js.map +1 -0
  640. package/dist/packs/pack.d.ts +15 -15
  641. package/dist/packs/pack.js +14 -0
  642. package/dist/packs/pack.js.map +1 -0
  643. package/dist/packs.d.ts +15 -7
  644. package/dist/packs.js +222 -0
  645. package/dist/packs.js.map +1 -0
  646. package/dist/paths.d.ts +2 -0
  647. package/dist/paths.js +109 -0
  648. package/dist/paths.js.map +1 -0
  649. package/dist/plain.js +57 -0
  650. package/dist/plain.js.map +1 -0
  651. package/dist/player.d.ts +33 -10
  652. package/dist/player.js +159 -0
  653. package/dist/player.js.map +1 -0
  654. package/dist/portals.d.ts +1 -1
  655. package/dist/portals.js +194 -0
  656. package/dist/portals.js.map +1 -0
  657. package/dist/prefabs.d.ts +25 -2
  658. package/dist/prefabs.js +239 -0
  659. package/dist/prefabs.js.map +1 -0
  660. package/dist/presetBuildings.js +58 -0
  661. package/dist/presetBuildings.js.map +1 -0
  662. package/dist/presetFoliage.d.ts +27 -0
  663. package/dist/presetFoliage.js +98 -0
  664. package/dist/presetFoliage.js.map +1 -0
  665. package/dist/presetGround.js +65 -0
  666. package/dist/presetGround.js.map +1 -0
  667. package/dist/proxies.d.ts +12 -0
  668. package/dist/proxies.js +79 -0
  669. package/dist/proxies.js.map +1 -0
  670. package/dist/query.d.ts +56 -0
  671. package/dist/query.js +88 -0
  672. package/dist/query.js.map +1 -0
  673. package/dist/races.d.ts +15 -14
  674. package/dist/races.js +172 -0
  675. package/dist/races.js.map +1 -0
  676. package/dist/randomGroups.js +91 -0
  677. package/dist/randomGroups.js.map +1 -0
  678. package/dist/registry.d.ts +117 -53
  679. package/dist/registry.js +323 -0
  680. package/dist/registry.js.map +1 -0
  681. package/dist/remains.d.ts +11 -9
  682. package/dist/remains.js +188 -0
  683. package/dist/remains.js.map +1 -0
  684. package/dist/replication.d.ts +12 -7
  685. package/dist/replication.js +100 -0
  686. package/dist/replication.js.map +1 -0
  687. package/dist/rng.d.ts +2 -0
  688. package/dist/rng.js +40 -0
  689. package/dist/rng.js.map +1 -0
  690. package/dist/rules.d.ts +186 -99
  691. package/dist/rules.js +179 -0
  692. package/dist/rules.js.map +1 -0
  693. package/dist/rulesCheck.d.ts +5 -4
  694. package/dist/rulesCheck.js +693 -0
  695. package/dist/rulesCheck.js.map +1 -0
  696. package/dist/runes.d.ts +2 -2
  697. package/dist/runes.js +80 -0
  698. package/dist/runes.js.map +1 -0
  699. package/dist/save.d.ts +37 -12
  700. package/dist/save.js +532 -0
  701. package/dist/save.js.map +1 -0
  702. package/dist/scenario.d.ts +2 -2
  703. package/dist/scenario.js +99 -0
  704. package/dist/scenario.js.map +1 -0
  705. package/dist/scheduler.d.ts +3 -0
  706. package/dist/scheduler.js +156 -0
  707. package/dist/scheduler.js.map +1 -0
  708. package/dist/score.d.ts +19 -19
  709. package/dist/score.js +709 -0
  710. package/dist/score.js.map +1 -0
  711. package/dist/sequences.d.ts +10 -6
  712. package/dist/sequences.js +206 -0
  713. package/dist/sequences.js.map +1 -0
  714. package/dist/server/doorman.js +154 -0
  715. package/dist/server/doorman.js.map +1 -0
  716. package/dist/server/gameServer.d.ts +16 -1
  717. package/dist/server/gameServer.js +643 -0
  718. package/dist/server/gameServer.js.map +1 -0
  719. package/dist/server/index.d.ts +1 -1
  720. package/dist/server/lobby.js +199 -0
  721. package/dist/server/lobby.js.map +1 -0
  722. package/dist/server/log.js +18 -0
  723. package/dist/server/log.js.map +1 -0
  724. package/dist/server/match.js +267 -0
  725. package/dist/server/match.js.map +1 -0
  726. package/dist/server/mode.d.ts +18 -9
  727. package/dist/server/mode.js +220 -0
  728. package/dist/server/mode.js.map +1 -0
  729. package/dist/{navigation-worker.js → server/navigation-worker.js} +1 -1
  730. package/dist/server/navigation-worker.js.map +1 -0
  731. package/dist/server/navigation.js +39 -0
  732. package/dist/server/navigation.js.map +1 -0
  733. package/dist/server/ops.d.ts +4 -0
  734. package/dist/server/ops.js +137 -0
  735. package/dist/server/ops.js.map +1 -0
  736. package/dist/server/packs.d.ts +3 -3
  737. package/dist/server/packs.js +32 -0
  738. package/dist/server/packs.js.map +1 -0
  739. package/dist/server/ratings.d.ts +5 -0
  740. package/dist/server/ratings.js +104 -0
  741. package/dist/server/ratings.js.map +1 -0
  742. package/dist/server/relay.d.ts +12 -2
  743. package/dist/server/relay.js +144 -0
  744. package/dist/server/relay.js.map +1 -0
  745. package/dist/server/rooms.d.ts +9 -2
  746. package/dist/server/rooms.js +442 -0
  747. package/dist/server/rooms.js.map +1 -0
  748. package/dist/server/seat.js +116 -0
  749. package/dist/server/seat.js.map +1 -0
  750. package/dist/server/seatSettings.d.ts +3 -3
  751. package/dist/server/seatSettings.js +63 -0
  752. package/dist/server/seatSettings.js.map +1 -0
  753. package/dist/server/secret.js +13 -0
  754. package/dist/server/secret.js.map +1 -0
  755. package/dist/server/start.d.ts +13 -6
  756. package/dist/server/start.js +76 -0
  757. package/dist/server/start.js.map +1 -0
  758. package/dist/server/websocket.d.ts +9 -1
  759. package/dist/server/websocket.js +306 -0
  760. package/dist/server/websocket.js.map +1 -0
  761. package/dist/server.js +15 -2861
  762. package/dist/session/can.js +26 -0
  763. package/dist/session/can.js.map +1 -0
  764. package/dist/session/commandReplay.d.ts +8 -2
  765. package/dist/session/commandReplay.js +293 -0
  766. package/dist/session/commandReplay.js.map +1 -0
  767. package/dist/session/debug.js +151 -0
  768. package/dist/session/debug.js.map +1 -0
  769. package/dist/session/delay.js +62 -0
  770. package/dist/session/delay.js.map +1 -0
  771. package/dist/session/delta.d.ts +14 -1
  772. package/dist/session/delta.js +407 -0
  773. package/dist/session/delta.js.map +1 -0
  774. package/dist/session/entityState.js +415 -0
  775. package/dist/session/entityState.js.map +1 -0
  776. package/dist/session/local.d.ts +47 -5
  777. package/dist/session/local.js +670 -0
  778. package/dist/session/local.js.map +1 -0
  779. package/dist/session/memory.d.ts +20 -2
  780. package/dist/session/memory.js +131 -0
  781. package/dist/session/memory.js.map +1 -0
  782. package/dist/session/protocol.d.ts +325 -31
  783. package/dist/session/protocol.js +55 -0
  784. package/dist/session/protocol.js.map +1 -0
  785. package/dist/session/remote.d.ts +74 -12
  786. package/dist/session/remote.js +1394 -0
  787. package/dist/session/remote.js.map +1 -0
  788. package/dist/session/replay.d.ts +11 -2
  789. package/dist/session/replay.js +160 -0
  790. package/dist/session/replay.js.map +1 -0
  791. package/dist/session/seed.js +12 -0
  792. package/dist/session/seed.js.map +1 -0
  793. package/dist/session/share.d.ts +5 -1
  794. package/dist/session/share.js +94 -0
  795. package/dist/session/share.js.map +1 -0
  796. package/dist/session/socket.d.ts +1 -1
  797. package/dist/session/socket.js +29 -0
  798. package/dist/session/socket.js.map +1 -0
  799. package/dist/session/wire.d.ts +5 -0
  800. package/dist/session/wire.js +84 -0
  801. package/dist/session/wire.js.map +1 -0
  802. package/dist/session/worker.d.ts +77 -12
  803. package/dist/session/worker.js +499 -0
  804. package/dist/session/worker.js.map +1 -0
  805. package/dist/shared.d.ts +31 -5
  806. package/dist/shared.js +166 -0
  807. package/dist/shared.js.map +1 -0
  808. package/dist/sides.d.ts +9 -3
  809. package/dist/sides.js +149 -0
  810. package/dist/sides.js.map +1 -0
  811. package/dist/sight.js +85 -0
  812. package/dist/sight.js.map +1 -0
  813. package/dist/simulate-worker.js +1 -1
  814. package/dist/simulate.d.ts +12 -8
  815. package/dist/{simulate-oXBiw1Ff.js → simulate.js} +10 -11
  816. package/dist/simulate.js.map +1 -0
  817. package/dist/smart.js +77 -0
  818. package/dist/smart.js.map +1 -0
  819. package/dist/spatial.d.ts +32 -16
  820. package/dist/spatial.js +234 -0
  821. package/dist/spatial.js.map +1 -0
  822. package/dist/spawning.d.ts +1 -0
  823. package/dist/spawning.js +224 -0
  824. package/dist/spawning.js.map +1 -0
  825. package/dist/stances.d.ts +6 -3
  826. package/dist/stances.js +169 -0
  827. package/dist/stances.js.map +1 -0
  828. package/dist/start.d.ts +10 -10
  829. package/dist/start.js +75 -0
  830. package/dist/start.js.map +1 -0
  831. package/dist/stats.d.ts +42 -16
  832. package/dist/stats.js +290 -0
  833. package/dist/stats.js.map +1 -0
  834. package/dist/summoned.d.ts +52 -0
  835. package/dist/summoned.js +38 -0
  836. package/dist/summoned.js.map +1 -0
  837. package/dist/summons.d.ts +10 -13
  838. package/dist/summons.js +271 -0
  839. package/dist/summons.js.map +1 -0
  840. package/dist/systems/abilities.js +224 -0
  841. package/dist/systems/abilities.js.map +1 -0
  842. package/dist/systems/combat.d.ts +35 -1
  843. package/dist/systems/combat.js +677 -0
  844. package/dist/systems/combat.js.map +1 -0
  845. package/dist/systems/combatTold.d.ts +3 -1
  846. package/dist/systems/combatTold.js +85 -0
  847. package/dist/systems/combatTold.js.map +1 -0
  848. package/dist/systems/construction.js +80 -0
  849. package/dist/systems/construction.js.map +1 -0
  850. package/dist/systems/economy.d.ts +0 -6
  851. package/dist/systems/economy.js +128 -0
  852. package/dist/systems/economy.js.map +1 -0
  853. package/dist/systems/fog.d.ts +1 -1
  854. package/dist/systems/fog.js +120 -0
  855. package/dist/systems/fog.js.map +1 -0
  856. package/dist/systems/life.js +32 -0
  857. package/dist/systems/life.js.map +1 -0
  858. package/dist/systems/movement.d.ts +24 -12
  859. package/dist/systems/movement.js +1247 -0
  860. package/dist/systems/movement.js.map +1 -0
  861. package/dist/systems/orders.js +64 -0
  862. package/dist/systems/orders.js.map +1 -0
  863. package/dist/systems/production.js +322 -0
  864. package/dist/systems/production.js.map +1 -0
  865. package/dist/systems/productionQueue.js +120 -0
  866. package/dist/systems/productionQueue.js.map +1 -0
  867. package/dist/systems/victory.d.ts +1 -1
  868. package/dist/systems/victory.js +56 -0
  869. package/dist/systems/victory.js.map +1 -0
  870. package/dist/talk.d.ts +6 -6
  871. package/dist/talk.js +153 -0
  872. package/dist/talk.js.map +1 -0
  873. package/dist/targeting.d.ts +142 -0
  874. package/dist/targeting.js +49 -0
  875. package/dist/targeting.js.map +1 -0
  876. package/dist/tech.d.ts +20 -3
  877. package/dist/tech.js +239 -0
  878. package/dist/tech.js.map +1 -0
  879. package/dist/techTree.d.ts +7 -0
  880. package/dist/techTree.js +90 -0
  881. package/dist/techTree.js.map +1 -0
  882. package/dist/terrain.d.ts +59 -7
  883. package/dist/terrain.js +389 -0
  884. package/dist/terrain.js.map +1 -0
  885. package/dist/terrainSave.d.ts +6 -0
  886. package/dist/terrainSave.js +74 -0
  887. package/dist/terrainSave.js.map +1 -0
  888. package/dist/testing.d.ts +8 -7
  889. package/dist/testing.js +13 -739
  890. package/dist/testing.js.map +1 -1
  891. package/dist/tiles.d.ts +1 -1
  892. package/dist/tiles.js +43 -0
  893. package/dist/tiles.js.map +1 -0
  894. package/dist/timers.d.ts +29 -4
  895. package/dist/timers.js +242 -0
  896. package/dist/timers.js.map +1 -0
  897. package/dist/tomes.d.ts +4 -4
  898. package/dist/tomes.js +94 -0
  899. package/dist/tomes.js.map +1 -0
  900. package/dist/trade.js +103 -0
  901. package/dist/trade.js.map +1 -0
  902. package/dist/transport.d.ts +6 -1
  903. package/dist/transport.js +281 -0
  904. package/dist/transport.js.map +1 -0
  905. package/dist/tunables.d.ts +10 -3
  906. package/dist/tunables.js +56 -0
  907. package/dist/tunables.js.map +1 -0
  908. package/dist/unitResources.d.ts +67 -0
  909. package/dist/unitResources.js +266 -0
  910. package/dist/unitResources.js.map +1 -0
  911. package/dist/upkeep.d.ts +6 -1
  912. package/dist/upkeep.js +26 -0
  913. package/dist/upkeep.js.map +1 -0
  914. package/dist/veterancy.d.ts +8 -3
  915. package/dist/veterancy.js +131 -0
  916. package/dist/veterancy.js.map +1 -0
  917. package/dist/vision.d.ts +36 -0
  918. package/dist/vision.js +133 -0
  919. package/dist/vision.js.map +1 -0
  920. package/dist/walls.d.ts +1 -1
  921. package/dist/walls.js +278 -0
  922. package/dist/walls.js.map +1 -0
  923. package/dist/world.d.ts +606 -88
  924. package/dist/world.js +1263 -0
  925. package/dist/world.js.map +1 -0
  926. package/package.json +2 -2
  927. package/dist/ai.js.map +0 -1
  928. package/dist/attributes.d.ts +0 -66
  929. package/dist/brain-BvVdUhX8.js +0 -7659
  930. package/dist/brain-BvVdUhX8.js.map +0 -1
  931. package/dist/builds-C6LfgvEU.js +0 -460
  932. package/dist/builds-C6LfgvEU.js.map +0 -1
  933. package/dist/coreComponents-syuh2fPG.js +0 -5149
  934. package/dist/coreComponents-syuh2fPG.js.map +0 -1
  935. package/dist/debugCommands-CzjrSm66.js +0 -14739
  936. package/dist/debugCommands-CzjrSm66.js.map +0 -1
  937. package/dist/determinism-BCymQwiE.js +0 -518
  938. package/dist/determinism-BCymQwiE.js.map +0 -1
  939. package/dist/game-DiJEN-Ks.js +0 -5800
  940. package/dist/game-DiJEN-Ks.js.map +0 -1
  941. package/dist/index.js.map +0 -1
  942. package/dist/inspect-D9dWHmZ0.js.map +0 -1
  943. package/dist/local-Dkovq42k.js +0 -1379
  944. package/dist/local-Dkovq42k.js.map +0 -1
  945. package/dist/missionRules-C-bGxm0Q.js.map +0 -1
  946. package/dist/navigation-worker.js.map +0 -1
  947. package/dist/packs-g5thvmGn.js +0 -3199
  948. package/dist/packs-g5thvmGn.js.map +0 -1
  949. package/dist/profiles-B3NS9jwk.js.map +0 -1
  950. package/dist/server.js.map +0 -1
  951. package/dist/simulate-oXBiw1Ff.js.map +0 -1
@@ -0,0 +1,693 @@
1
+ import { EFFECT_MOMENTS, anyEffect, lowerChain, upgradesOf } from "./defs.js";
2
+ import { callingsOf } from "./callings.js";
3
+ import { BUFF_BREAKS, TRIGGER_TYPES } from "./abilities/triggers.js";
4
+ import { AIM_KINDS } from "./targeting.js";
5
+ import { editDistance, nearestId } from "./nearest.js";
6
+ import { CONTROL_KINDS } from "./abilities/control.js";
7
+ import { summonEffects } from "./summons.js";
8
+ import { dispelEffects } from "./abilities/dispel.js";
9
+ import { coreEffects } from "./abilities/effects/core.js";
10
+ import { DATA_KINDS } from "./gameData.js";
11
+ import { coreComponents } from "./coreComponents.js";
12
+ //#region src/rulesCheck.ts
13
+ /** The sizes each shape of an effect reads, without which it covers nothing (`EffectCommon.shape`) */
14
+ var SHAPE_SIZES = {
15
+ circle: ["radius"],
16
+ cone: ["length", "angle"],
17
+ line: ["length"],
18
+ rect: ["length"],
19
+ ring: ["radius"],
20
+ arc: ["radius", "angle"],
21
+ cross: ["length"]
22
+ };
23
+ /** Which way a knockback may throw (`KnockbackDirection`, the moves pack's) */
24
+ var KNOCKBACK_DIRECTIONS = [
25
+ "away",
26
+ "aim",
27
+ "over",
28
+ "towards"
29
+ ];
30
+ /** The fields the moves pack reads (AB12), and of which effects */
31
+ var MOVES_FIELDS = {
32
+ through: ["dash"],
33
+ collide: ["dash", "knockback"],
34
+ stops: ["dash", "knockback"],
35
+ direction: ["knockback"],
36
+ rider: ["attach"]
37
+ };
38
+ /** The moves pack's id (`MOVES`), said here so that the check does not bring the pack in with it */
39
+ var MOVES = "core.moves";
40
+ /** The ground objects pack's id (`GROUND_OBJECTS`), likewise */
41
+ var GROUND_OBJECTS = "core.groundObjects";
42
+ /** The resources pack's id (`RESOURCES`), likewise */
43
+ var RESOURCES = "core.resources";
44
+ /** The holds pack's id (`HOLDS`), likewise */
45
+ var HOLDS = "core.holds";
46
+ /** The ability changes pack's id (`ABILITY_CHANGES`), likewise */
47
+ var ABILITY_CHANGES = "core.abilityChanges";
48
+ /** The vision pack's id (`VISION`), likewise */
49
+ var VISION = "core.vision";
50
+ /**
51
+ * Checks a game's rules against themselves (`RulesProblem`): run by a game's `check()` and as a page fetches its view, and in a
52
+ * game's tests (`expect(checkRules(rules).filter((p) => p.level === 'error')).toEqual([])`). Nothing is thrown
53
+ *
54
+ * @public
55
+ */
56
+ function checkRules(rules) {
57
+ const problems = [];
58
+ const ids = (list) => new Set((list ?? []).map((def) => def.id));
59
+ const units = ids(rules.units);
60
+ const abilities = ids(rules.abilities);
61
+ const buffs = ids(rules.buffs);
62
+ const items = ids(rules.items);
63
+ const upgrades = ids(rules.upgrades);
64
+ const resources = ids(rules.resources);
65
+ /** The callings heroes may have: the heroes pack's, or the engine's (`callingsOf`) */
66
+ const callings = ids(callingsOf(rules));
67
+ /** The components something can be given by id: the engine's own, its packs' and the game's */
68
+ const components = ids([
69
+ ...coreComponents(),
70
+ ...(rules.packs ?? []).flatMap((pack) => pack.components ?? []),
71
+ ...rules.components ?? []
72
+ ]);
73
+ /** The types of effect something handles: the engine's own, its packs' (`GamePack.effects`) and the game's (`Rules.effects`) */
74
+ const handled = new Set([
75
+ ...coreEffects,
76
+ ...summonEffects,
77
+ ...dispelEffects,
78
+ ...(rules.packs ?? []).flatMap((pack) => pack.effects ?? []),
79
+ ...rules.effects ?? []
80
+ ].map((kind) => kind.type));
81
+ const effectTypes = (type) => handled.has(type);
82
+ /** Whether the game has the moves pack (AB12), which reads the fields of `MOVES_FIELDS` */
83
+ const moves = (rules.packs ?? []).some((pack) => pack.id === MOVES);
84
+ /** Whether the game has the ground objects pack (AB13) */
85
+ const groundObjects = (rules.packs ?? []).some((pack) => pack.id === GROUND_OBJECTS);
86
+ /** Whether the game has the resources pack (AB14), and the pools its unit types have */
87
+ const resourcesOn = (rules.packs ?? []).some((pack) => pack.id === RESOURCES);
88
+ const poolIds = new Set(rules.units.flatMap((unit) => Object.keys(unit.pools ?? {})));
89
+ /** A pool named that no unit type has: what costs or gives it does nothing */
90
+ const pool = (where, id) => {
91
+ if (!poolIds.has(id)) odd(where, id, `${where} names the pool "${id}", which no unit type has (UnitTypeDef.pools): it does nothing`);
92
+ };
93
+ /** Whether the game has the holds pack (AB15) */
94
+ const holdsOn = (rules.packs ?? []).some((pack) => pack.id === HOLDS);
95
+ /** A field the resources pack reads, in a game without it */
96
+ const needsResources = (where, id) => {
97
+ if (!resourcesOn) odd(where, id, `${where} is read in a game with the resources pack (resourcesPack) alone: without it nothing reads it`);
98
+ };
99
+ /** Whether the game has the vision pack (AB18) */
100
+ const vision = (rules.packs ?? []).some((pack) => pack.id === VISION);
101
+ const known = (where, id, set, what) => {
102
+ if (id === void 0 || set.has(id)) return;
103
+ const meant = nearestId(id, set);
104
+ problems.push({
105
+ level: "error",
106
+ where,
107
+ id,
108
+ message: `${where} names "${id}", which is no ${what} of the rules${meant ? `. Did you mean "${meant}"?` : ""}`
109
+ });
110
+ };
111
+ /** A number that does not do what it is there for: said as a warning, the engine making do with it */
112
+ const odd = (where, id, message) => problems.push({
113
+ level: "warning",
114
+ where,
115
+ id,
116
+ message
117
+ });
118
+ /** Whether a number, or any of its levels (`Scaled`), is under a bound: at `least`, or above it where `above` */
119
+ const under = (value, least, above = false) => value !== void 0 && (Array.isArray(value) ? value : [value]).some((each) => above ? each <= least : each < least);
120
+ const all = (where, list, set, what) => list?.forEach((id, index) => known(`${where}[${index}]`, id, set, what));
121
+ /** The tags the unit types have (`UnitTypeDef.tags`): one named that none has is likely a slip (AB6) */
122
+ const tagged = new Set(rules.units.flatMap((unit) => unit.tags ?? []));
123
+ const tags = (where, list) => list?.forEach((tag, index) => {
124
+ if (!tagged.has(tag)) odd(`${where}[${index}]`, tag, `${where}[${index}] is "${tag}", a tag no unit type has (UnitTypeDef.tags)${nearestId(tag, tagged) ? `. Did you mean "${nearestId(tag, tagged)}"?` : ""}`);
125
+ });
126
+ /** A cleave (`AttackDef.cleave`, `BuffDef.cleave`) that reaches nobody or takes away */
127
+ const cleave = (where, id, value) => {
128
+ if (!value) return;
129
+ if (under(value.part, 0, true)) odd(`${where}.part`, id, `${where}.part is not above 0 at a level: it deals nothing to those around the target there`);
130
+ if (!(value.radius > 0)) odd(`${where}.radius`, id, `${where}.radius is not above 0: it reaches nobody around the target`);
131
+ if (value.angle !== void 0 && !(value.angle > 0)) odd(`${where}.angle`, id, `${where}.angle is not above 0: its cone reaches nobody`);
132
+ };
133
+ /** What a requirement names: a unit type (a building to have) or an upgrade */
134
+ const requirable = /* @__PURE__ */ new Set([...units, ...upgrades]);
135
+ for (const unit of rules.units) {
136
+ const at = `units.${unit.id}`;
137
+ all(`${at}.trains`, unit.trains, units, "unit type");
138
+ all(`${at}.targetableBy`, unit.targetableBy, abilities, "ability");
139
+ if (unit.targetableBy?.length === 0) odd(`${at}.targetableBy`, unit.id, "an empty list: nothing may target it, so no ability takes it (leave targetableBy out, or name one)");
140
+ all(`${at}.builds`, unit.builds, units, "unit type");
141
+ all(`${at}.hires`, unit.hires, units, "unit type");
142
+ all(`${at}.researches`, unit.researches, upgrades, "upgrade");
143
+ all(`${at}.requires`, unit.requires, requirable, "unit type or upgrade");
144
+ all(`${at}.sells`, unit.sells, items, "item");
145
+ all(`${at}.abilities`, unit.abilities, abilities, "ability");
146
+ if (typeof unit.upgradesTo === "string") known(`${at}.upgradesTo`, unit.upgradesTo, units, "unit type");
147
+ else all(`${at}.upgradesTo`, unit.upgradesTo, units, "unit type");
148
+ if (Array.isArray(unit.drops)) unit.drops.forEach((drop, index) => known(`${at}.drops[${index}].item`, drop.item, items, "item"));
149
+ known(`${at}.trigger.ability`, unit.trigger?.ability, abilities, "ability");
150
+ known(`${at}.use.ability`, unit.use?.ability, abilities, "ability");
151
+ known(`${at}.burst.ability`, unit.burst?.ability, abilities, "ability");
152
+ if (unit.trueSight !== void 0 && !vision) odd(`${at}.trueSight`, unit.id, `${at}.trueSight is read in a game with the vision pack (visionPack) alone: without it it finds nothing`);
153
+ for (const field of [
154
+ "trigger",
155
+ "use",
156
+ "blocksMissiles",
157
+ "burst"
158
+ ]) if (unit[field] !== void 0 && !groundObjects) odd(`${at}.${field}`, unit.id, `${at}.${field} is read in a game with the ground objects pack (groundObjectsPack) alone: without it nothing reads it`);
159
+ if (unit.trigger?.by !== void 0 && ![
160
+ "enemies",
161
+ "allies",
162
+ "all",
163
+ "maker"
164
+ ].includes(unit.trigger.by)) odd(`${at}.trigger.by`, unit.id, `${at}.trigger.by is enemies, allies, all or maker: "${unit.trigger.by}" is none, enemies are`);
165
+ if (unit.use?.by !== void 0 && ![
166
+ "enemies",
167
+ "allies",
168
+ "all"
169
+ ].includes(unit.use.by)) odd(`${at}.use.by`, unit.id, `${at}.use.by is enemies, allies or all: "${unit.use.by}" is none, allies are`);
170
+ if (unit.blocksMissiles !== void 0 && !["enemies", "all"].includes(unit.blocksMissiles)) odd(`${at}.blocksMissiles`, unit.id, `${at}.blocksMissiles is enemies or all: "${unit.blocksMissiles}" stops nothing`);
171
+ if (unit.pools) {
172
+ needsResources(`${at}.pools`, unit.id);
173
+ for (const [id, def] of Object.entries(unit.pools)) {
174
+ if (!(def.max > 0)) odd(`${at}.pools.${id}.max`, unit.id, `${at}.pools.${id}.max is not above 0: it never holds anything`);
175
+ def.thresholds?.forEach((threshold, index) => {
176
+ known(`${at}.pools.${id}.thresholds[${index}].buff`, threshold.buff, buffs, "buff");
177
+ if (threshold.at > def.max) odd(`${at}.pools.${id}.thresholds[${index}].at`, unit.id, `${at}.pools.${id}.thresholds[${index}].at is over its max (${def.max}): it is never reached`);
178
+ });
179
+ }
180
+ }
181
+ unit.attacks?.forEach((attack, index) => {
182
+ cleave(`${at}.attacks[${index}].cleave`, unit.id, attack.cleave);
183
+ if (attack.cleave && attack.projectileSpeed) odd(`${at}.attacks[${index}].cleave`, unit.id, `${at}.attacks[${index}] flies (projectileSpeed): only a blow from up close cleaves, so it never does`);
184
+ });
185
+ if (unit.attackCost) {
186
+ needsResources(`${at}.attackCost`, unit.id);
187
+ for (const id in unit.attackCost) if (!unit.pools?.[id]) odd(`${at}.attackCost.${id}`, id, `${at}.attackCost names the pool "${id}", which it has not (pools): it never attacks`);
188
+ }
189
+ if (unit.hero) {
190
+ all(`${at}.hero.learns`, unit.hero.learns, abilities, "ability");
191
+ all(`${at}.hero.spells`, unit.hero.spells, abilities, "ability");
192
+ known(`${at}.hero.innate`, unit.hero.innate, abilities, "ability");
193
+ if (unit.hero.innate && unit.hero.learns.includes(unit.hero.innate)) odd(`${at}.hero.innate`, unit.hero.innate, `${unit.hero.innate} is its innate and one it learns: points put into it are lost as the innate keeps its own level`);
194
+ known(`${at}.hero.meter`, unit.hero.meter, buffs, "buff");
195
+ for (const [calling, strength] of Object.entries(unit.hero.callings ?? {})) {
196
+ known(`${at}.hero.callings`, calling, callings, "calling");
197
+ if (![
198
+ 1,
199
+ 2,
200
+ 3
201
+ ].includes(strength)) odd(`${at}.hero.callings.${calling}`, calling, `a calling's strength is 1, 2 or 3: ${String(strength)} is shown as ${Math.min(Math.max(Math.round(Number(strength) || 1), 1), 3)}`);
202
+ }
203
+ for (const [into, form] of Object.entries(unit.hero.forms ?? {})) {
204
+ known(`${at}.hero.forms`, into, units, "unit type");
205
+ all(`${at}.hero.forms.${into}.learns`, form.learns, abilities, "ability");
206
+ if (form.cooldowns !== void 0 && ![
207
+ "keep",
208
+ "reset",
209
+ "shared"
210
+ ].includes(form.cooldowns)) odd(`${at}.hero.forms.${into}.cooldowns`, String(form.cooldowns), `cooldowns is keep, reset or shared: ${String(form.cooldowns)} is none, the default is used`);
211
+ if (form.cooldowns === "shared" && !Object.values(form.levels ?? {}).some((by) => typeof by === "string") && (form.levels !== void 0 || form.keeps !== void 0)) odd(`${at}.hero.forms.${into}.cooldowns`, "shared", "shared needs an ability of the form whose level is one of the hero’s own (levels): nothing is shared");
212
+ all(`${at}.hero.forms.${into}.keeps`, form.keeps, abilities, "ability");
213
+ const own = /* @__PURE__ */ new Set([
214
+ ...unit.hero.learns,
215
+ ...unit.hero.spells ?? [],
216
+ ...unit.abilities ?? []
217
+ ]);
218
+ for (const id of form.keeps ?? []) if (abilities.has(id) && !own.has(id)) odd(`${at}.hero.forms.${into}.keeps`, id, `${id} is not ${unit.id}'s own: the form keeps nothing of it`);
219
+ for (const [id, by] of Object.entries(form.levels ?? {})) {
220
+ if (!(form.learns ?? []).includes(id)) odd(`${at}.hero.forms.${into}.levels`, id, `${id} is not one the form learns (its learns)`);
221
+ if (typeof by !== "string") continue;
222
+ known(`${at}.hero.forms.${into}.levels.${id}`, by, abilities, "ability");
223
+ if (abilities.has(by) && !own.has(by)) odd(`${at}.hero.forms.${into}.levels.${id}`, by, `${by} is not ${unit.id}'s own: ${id} starts at 0`);
224
+ }
225
+ }
226
+ }
227
+ }
228
+ const effects = (where, list) => {
229
+ if (list) lowerChain(list, (index, effect) => {
230
+ const at = `${where}[${index}].when`;
231
+ const moment = Object.hasOwn(EFFECT_MOMENTS, effect.when) ? EFFECT_MOMENTS[effect.when] : void 0;
232
+ problems.push({
233
+ level: "error",
234
+ where: at,
235
+ id: effect.type,
236
+ message: moment ? `${at} is "${effect.when}", but nothing before it in its list comes to that (${moment.types.join(" or ")}): it never happens` : `${at} is "${effect.when}", which is no moment (${Object.keys(EFFECT_MOMENTS).join(", ")}): it never happens`
237
+ });
238
+ });
239
+ list?.map(anyEffect).forEach((effect, index) => {
240
+ const at = `${where}[${index}]`;
241
+ if (!effectTypes(effect.type)) problems.push({
242
+ level: "error",
243
+ where: `${at}.type`,
244
+ id: effect.type,
245
+ message: `${at} is of the type "${effect.type}", which nothing handles (Rules.effects)`
246
+ });
247
+ known(`${at}.buff`, effect.buff, buffs, "buff");
248
+ known(`${at}.ifBuff`, effect.ifBuff, buffs, "buff");
249
+ tags(`${at}.tags`, effect.tags);
250
+ for (const who of [
251
+ "caster",
252
+ "target",
253
+ "where"
254
+ ]) {
255
+ const condition = effect[who];
256
+ if (condition === void 0) continue;
257
+ if (who !== "where" && effect.type !== "if") odd(`${at}.${who}`, effect.type, `${at}.${who} is read of an if alone, not of ${effect.type}`);
258
+ if (typeof condition === "function") continue;
259
+ known(`${at}.${who}.buff`, condition.buff, buffs, "buff");
260
+ known(`${at}.${who}.noBuff`, condition.noBuff, buffs, "buff");
261
+ tags(`${at}.${who}.tags`, condition.tags);
262
+ tags(`${at}.${who}.notTags`, condition.notTags);
263
+ if (condition.is !== void 0 && condition.is !== "enemy" && condition.is !== "ally") odd(`${at}.${who}.is`, String(condition.is), `${at}.${who}.is is enemy or ally: "${String(condition.is)}" never holds`);
264
+ }
265
+ if (effect.as !== void 0 && effect.as !== "themselves") odd(`${at}.as`, String(effect.as), `${at}.as is "themselves" or left out: "${String(effect.as)}" is none, its unit rises`);
266
+ if (effect.type === "raiseDead" && effect.unit === void 0 && effect.as !== "themselves") problems.push({
267
+ level: "error",
268
+ where: `${at}.unit`,
269
+ id: effect.type,
270
+ message: `${at} raises no unit and not the dead as themselves (as): nothing rises`
271
+ });
272
+ if (effect.health !== void 0 && !(effect.health > 0 && effect.health <= 1)) odd(`${at}.health`, effect.type, `${at}.health is a share of its max health above 0 and at most 1: it is left with 1 health`);
273
+ if (effect.type === "if" && effect.caster === void 0 && effect.target === void 0 && effect.chance === void 0) odd(`${at}`, effect.type, `${at} asks nothing (caster, target, chance): its effects always happen`);
274
+ if (effect.chance !== void 0 && typeof effect.chance !== "function" && [effect.chance].flat().some((share) => !(share >= 0 && share <= 1))) odd(`${at}.chance`, effect.type, `${at}.chance is a share from 0 to 1 (0.25: one in four): under 0 it never happens, over 1 always`);
275
+ if ((effect.sort !== void 0 || effect.limit !== void 0) && effect.radius === void 0 && effect.shape === void 0) odd(`${at}.limit`, effect.type, `${at}.sort and .limit choose of what an area reaches: with no radius or shape it hits its one target anyway`);
276
+ if (effect.limit !== void 0 && [effect.limit].flat().some((count) => !(count >= 1))) odd(`${at}.limit`, effect.type, `${at}.limit is how many it hits, 1 or more: under 1 it hits nothing`);
277
+ known(`${at}.whileBuff`, effect.whileBuff, buffs, "buff");
278
+ if (effect.pool !== void 0) pool(`${at}.pool`, effect.pool);
279
+ known(`${at}.from`, effect.from, abilities, "ability");
280
+ for (const field of [
281
+ "from",
282
+ "uses",
283
+ "atLevel",
284
+ "pick"
285
+ ]) if (effect[field] !== void 0 && ![
286
+ "grantAbility",
287
+ "swapAbility",
288
+ "stealAbility"
289
+ ].includes(effect.type)) odd(`${at}.${field}`, effect.type, `${at}.${field} is read of grantAbility, swapAbility and stealAbility alone, not of ${effect.type}`);
290
+ if (effect.pick !== void 0 && ![
291
+ "ultimate",
292
+ "first",
293
+ "random"
294
+ ].includes(effect.pick)) odd(`${at}.pick`, effect.type, `${at}.pick is ultimate, first or random: "${effect.pick}" is none, the ultimate is taken`);
295
+ known(`${at}.unit`, effect.unit, units, "unit type");
296
+ known(`${at}.into`, effect.into, units, "unit type");
297
+ if (effect.data) for (const id of Object.keys(effect.data)) known(`${at}.data.${id}`, id, components, "component");
298
+ known(`${at}.ability`, effect.ability, abilities, "ability");
299
+ known(`${at}.sell`, effect.sell, resources, "resource");
300
+ known(`${at}.buy`, effect.buy, resources, "resource");
301
+ for (const field of [
302
+ "arc",
303
+ "bounce",
304
+ "falloff",
305
+ "hitsOnReturn",
306
+ "seek",
307
+ "split",
308
+ "steer"
309
+ ]) if (effect[field] !== void 0 && effect.type !== "missile") odd(`${at}.${field}`, effect.type, `${at}.${field} is read of a missile alone, not of ${effect.type}`);
310
+ if (effect.onWall !== void 0 && ![
311
+ "missile",
312
+ "dash",
313
+ "knockback"
314
+ ].includes(effect.type)) odd(`${at}.onWall`, effect.type, `${at}.onWall is read of a missile, a dash and a knockback alone, not of ${effect.type}`);
315
+ for (const field of [
316
+ "through",
317
+ "collide",
318
+ "stops",
319
+ "direction",
320
+ "rider"
321
+ ]) {
322
+ if (effect[field] === void 0) continue;
323
+ const of = MOVES_FIELDS[field];
324
+ if (!of.includes(effect.type)) odd(`${at}.${field}`, effect.type, `${at}.${field} is read of ${of.join(" and ")} alone, not of ${effect.type}`);
325
+ else if (!moves) odd(`${at}.${field}`, effect.type, `${at}.${field} is read in a game with the moves pack (movesPack) alone: without it nothing reads it`);
326
+ }
327
+ if (effect.type === "dash" && (effect.to === "target" || effect.onWall) && !moves) odd(`${at}.${effect.to === "target" ? "to" : "onWall"}`, effect.type, `${at} rushes to a unit or sees to a wall, which a dash does in a game with the moves pack (movesPack) alone`);
328
+ if (effect.type === "knockback" && effect.onWall && !moves) odd(`${at}.onWall`, effect.type, `${at}.onWall is read of a knockback in a game with the moves pack (movesPack) alone`);
329
+ if (effect.direction !== void 0 && !KNOCKBACK_DIRECTIONS.includes(effect.direction)) problems.push({
330
+ level: "error",
331
+ where: `${at}.direction`,
332
+ id: effect.direction,
333
+ message: `${at}.direction is "${effect.direction}", which is no way to throw (${KNOCKBACK_DIRECTIONS.join(", ")})`
334
+ });
335
+ if (effect.through !== void 0 && effect.to !== "target") odd(`${at}.through`, effect.type, `${at}.through is there, but it does not rush to a unit (to: 'target'): it goes through nobody`);
336
+ for (const field of ["line", "ring"]) {
337
+ if (effect[field] === void 0) continue;
338
+ if (effect.type !== "spawn") odd(`${at}.${field}`, effect.type, `${at}.${field} is read of a spawn alone, not of ${effect.type}`);
339
+ else if (!groundObjects) odd(`${at}.${field}`, effect.type, `${at}.${field} is read in a game with the ground objects pack (groundObjectsPack) alone: without it one is made`);
340
+ else if (!(effect[field].count >= 1)) odd(`${at}.${field}.count`, effect.type, `${at}.${field}.count is under 1: one is made`);
341
+ }
342
+ if (effect.stops && !effect.collide?.length) odd(`${at}.stops`, effect.type, `${at}.stops is there, but nothing happens to who it meets (collide): it never stops`);
343
+ for (const field of [
344
+ "follow",
345
+ "onEnter",
346
+ "onLeave",
347
+ "edge"
348
+ ]) if (effect[field] !== void 0 && effect.type !== "zone") odd(`${at}.${field}`, effect.type, `${at}.${field} is read of a zone alone, not of ${effect.type}`);
349
+ if (effect.type === "zone" && (effect.onEnter || effect.onLeave || effect.edge) && !effect.radius && !effect.shape) odd(`${at}.radius`, effect.type, `${at} sees to who comes and goes, but has no radius or shape of its own: nobody is ever in it`);
350
+ if (effect.hitsOnReturn && !effect.returns) odd(`${at}.hitsOnReturn`, effect.type, `${at}.hitsOnReturn is there, but it does not come back (returns): it never hits on a way back`);
351
+ if (effect.seek !== void 0 && !(effect.seek > 0)) odd(`${at}.seek`, effect.type, `${at}.seek is not above 0: it finds nobody`);
352
+ if (typeof effect.pierce === "number" && !(effect.pierce >= 0)) odd(`${at}.pierce`, effect.type, `${at}.pierce is under 0: it is used up by the first it hits`);
353
+ if (effect.arc && !(effect.arc.height > 0)) odd(`${at}.arc.height`, effect.type, `${at}.arc.height is not above 0: it is thrown flat`);
354
+ if (effect.arc?.time !== void 0 && !(effect.arc.time > 0)) odd(`${at}.arc.time`, effect.type, `${at}.arc.time is not above 0: it flies at its speed`);
355
+ if (effect.bounce && under(effect.bounce.count, 1)) odd(`${at}.bounce.count`, effect.type, `${at}.bounce.count is under 1 at a level: it does not spring on there`);
356
+ if (effect.bounce && !(effect.bounce.range > 0)) odd(`${at}.bounce.range`, effect.type, `${at}.bounce.range is not above 0: it finds nothing to spring to`);
357
+ if (effect.shape !== void 0) {
358
+ const sizes = SHAPE_SIZES[effect.shape];
359
+ if (!sizes) {
360
+ const meant = nearestId(effect.shape, new Set(Object.keys(SHAPE_SIZES)));
361
+ problems.push({
362
+ level: "error",
363
+ where: `${at}.shape`,
364
+ id: effect.shape,
365
+ message: `${at}.shape is "${effect.shape}", which is no shape (${Object.keys(SHAPE_SIZES).join(", ")}): it covers nothing${meant ? `. Did you mean "${meant}"?` : ""}`
366
+ });
367
+ } else for (const size of sizes) if (effect[size] === void 0) odd(`${at}.${size}`, effect.type, `${at} is a ${effect.shape} with no ${size}: it covers nothing`);
368
+ }
369
+ if (effect.origin) {
370
+ const { origin } = effect;
371
+ known(`${at}.origin.proxy`, origin.proxy, units, "unit type");
372
+ if (origin.pick !== void 0 && ![
373
+ "nearest",
374
+ "all",
375
+ "newest",
376
+ "oldest"
377
+ ].includes(origin.pick)) odd(`${at}.origin.pick`, effect.type, `${at}.origin.pick is nearest, all, newest or oldest: "${origin.pick}" is none, the nearest is picked`);
378
+ if (origin.at !== void 0 && !["aim", "proxy"].includes(origin.at)) odd(`${at}.origin.at`, effect.type, `${at}.origin.at is aim or proxy: "${origin.at}" is none, it lands where it was aimed`);
379
+ if (origin.caster !== void 0 && origin.caster !== true && origin.caster !== false && origin.caster !== "otherwise") odd(`${at}.origin.caster`, effect.type, `${at}.origin.caster is true, false or otherwise: "${String(origin.caster)}" is none`);
380
+ }
381
+ if (effect.type === "sendProxy" && !effect.origin) odd(`${at}.origin`, effect.type, `${at} sends the unit it goes off from, but has no origin: it goes off from the caster, and sends nothing`);
382
+ effects(`${at}.effects`, effect.effects);
383
+ effects(`${at}.onEnd`, effect.onEnd);
384
+ effects(`${at}.otherwise`, effect.otherwise);
385
+ for (const list of [
386
+ "onWall",
387
+ "split",
388
+ "onEnter",
389
+ "onLeave",
390
+ "edge",
391
+ "collide"
392
+ ]) effects(`${at}.${list}`, effect[list]);
393
+ });
394
+ };
395
+ /** The ways an ability may be aimed: the engine's (`AimKind`) and the game's own (`Rules.targetings`) */
396
+ const aimings = /* @__PURE__ */ new Set([...AIM_KINDS, ...(rules.targetings ?? []).map((targeting) => targeting.id)]);
397
+ for (const ability of rules.abilities ?? []) {
398
+ const at = `abilities.${ability.id}`;
399
+ known(`${at}.target`, ability.target, aimings, "way of aiming");
400
+ known(`${at}.charge`, ability.charge, buffs, "buff");
401
+ tags(`${at}.targets.tags`, ability.targets?.tags);
402
+ const { recast } = ability;
403
+ if (recast) {
404
+ if (ability.target === "passive") odd(`${at}.recast`, ability.id, `${at} is passive: it is never cast, nor cast again`);
405
+ if (under(recast.window, 0, true)) odd(`${at}.recast.window`, ability.id, `${at}.recast.window is not above 0 at a level: it is never cast again there`);
406
+ if (recast.count !== void 0 && !(recast.count >= 1)) odd(`${at}.recast.count`, ability.id, `${at}.recast.count is under 1: it is cast again once`);
407
+ known(`${at}.recast.target`, recast.target, aimings, "way of aiming");
408
+ known(`${at}.recast.mark`, recast.mark, buffs, "buff");
409
+ if (recast.cooldown !== void 0 && recast.cooldown !== "after" && recast.cooldown !== "first") odd(`${at}.recast.cooldown`, String(recast.cooldown), `${at}.recast.cooldown is after or first: "${String(recast.cooldown)}" is none, after is taken`);
410
+ effects(`${at}.recast.effects`, recast.effects);
411
+ }
412
+ if (ability.charges && under(ability.charges.count, 1)) odd(`${at}.charges.count`, ability.id, `${at}.charges.count is under 1 at a level: it holds 1 there`);
413
+ if (ability.charges && under(ability.charges.refill, 0, true)) odd(`${at}.charges.refill`, ability.id, `${at}.charges.refill is not above 0 at a level: a use comes back at once there`);
414
+ effects(`${at}.effects`, ability.effects);
415
+ effects(`${at}.passive`, ability.passive);
416
+ for (const field of ["cost", "gain"]) {
417
+ if (!ability[field]) continue;
418
+ needsResources(`${at}.${field}`, ability.id);
419
+ for (const id in ability[field]) pool(`${at}.${field}.${id}`, id);
420
+ }
421
+ if (ability.costGrowth) {
422
+ needsResources(`${at}.costGrowth`, ability.id);
423
+ known(`${at}.costGrowth.buff`, ability.costGrowth.buff, buffs, "buff");
424
+ }
425
+ const withHolds = (where) => {
426
+ if (!holdsOn) odd(where, ability.id, `${where} is read in a game with the holds pack (holdsPack) alone: without it nothing reads it`);
427
+ };
428
+ if (ability.hold) {
429
+ withHolds(`${at}.hold`);
430
+ known(`${at}.hold.buff`, ability.hold.buff, buffs, "buff");
431
+ effects(`${at}.hold.tap.effects`, ability.hold.tap?.effects);
432
+ if (!(ability.hold.max > 0)) odd(`${at}.hold.max`, ability.id, `${at}.hold.max is not above 0: it is full at once`);
433
+ if (ability.target === "unit" || ability.target === "passive" || ability.target === "vector") odd(`${at}.hold`, ability.id, `${at}.hold is there, but it is aimed at ${ability.target === "passive" ? "nothing (passive)" : `a ${ability.target}`}: a hold is let go at a point, a way or on the spot`);
434
+ if (ability.channel) odd(`${at}.hold`, ability.id, `${at}.hold and a channel: the hold goes off as it is let go, and its channel after`);
435
+ }
436
+ all(`${at}.upgrades`, ability.upgrades, abilities, "ability");
437
+ if (ability.upgrades && !(rules.packs ?? []).some((pack) => pack.id === ABILITY_CHANGES)) odd(`${at}.upgrades`, ability.id, `${at}.upgrades is read in a game with the ability changes pack (abilityChangesPack) alone: nothing makes it into them without it`);
438
+ if (ability.channel?.aimed) withHolds(`${at}.channel.aimed`);
439
+ if (ability.channel?.walks) withHolds(`${at}.channel.walks`);
440
+ if (ability.channel?.leash !== void 0 && ability.target !== "unit") odd(`${at}.channel.leash`, ability.id, `${at}.channel.leash is there, but it is not cast on a unit: it is tied to nobody`);
441
+ }
442
+ for (const buff of rules.buffs ?? []) {
443
+ const at = `buffs.${buff.id}`;
444
+ if (buff.drain) {
445
+ needsResources(`${at}.drain`, buff.id);
446
+ for (const id in buff.drain) if (id !== "mana") pool(`${at}.drain.${id}`, id);
447
+ }
448
+ if (Array.isArray(buff.onApply)) effects(`${at}.onApply`, buff.onApply);
449
+ effects(`${at}.onTick.effects`, buff.onTick?.effects);
450
+ effects(`${at}.passive`, buff.passive);
451
+ effects(`${at}.onCarrierDeath`, buff.onCarrierDeath);
452
+ effects(`${at}.onMaxStacks`, buff.onMaxStacks);
453
+ buff.passive?.forEach((effect, index) => {
454
+ if (!TRIGGER_TYPES.includes(effect.type)) odd(`${at}.passive[${index}]`, effect.type, `${at}.passive[${index}] is a ${effect.type}: only triggers go off from a buff's passive (${TRIGGER_TYPES.join(", ")})`);
455
+ });
456
+ buff.breaksOn?.forEach((by, index) => {
457
+ if (!BUFF_BREAKS.includes(by)) odd(`${at}.breaksOn[${index}]`, String(by), `${at}.breaksOn[${index}] is "${String(by)}", which is no way a buff breaks (${BUFF_BREAKS.join(", ")}): it never breaks on it`);
458
+ });
459
+ if (typeof buff.control === "string" && !CONTROL_KINDS.includes(buff.control)) odd(`${at}.control`, String(buff.control), `${at}.control is "${String(buff.control)}", which is no control (${CONTROL_KINDS.join(", ")}): it takes no orders`);
460
+ if (buff.minHealth !== void 0 && typeof buff.minHealth !== "function" && under(buff.minHealth, 0)) odd(`${at}.minHealth`, buff.id, `${at}.minHealth is under 0 at a level: it keeps its carrier at nothing there`);
461
+ if (buff.onMaxStacks && buff.maxStacks === void 0) odd(`${at}.onMaxStacks`, buff.id, `${at}.onMaxStacks needs a maxStacks to come to: it never happens`);
462
+ for (const field of [
463
+ "revealed",
464
+ "camouflage",
465
+ "trueSight"
466
+ ]) if (buff[field] !== void 0 && buff[field] !== false && !vision) odd(`${at}.${field}`, buff.id, `${at}.${field} is read in a game with the vision pack (visionPack) alone: without it nothing reads it`);
467
+ cleave(`${at}.cleave`, buff.id, buff.cleave);
468
+ if (buff.overheal) {
469
+ known(`${at}.overheal.buff`, buff.overheal.buff, buffs, "buff");
470
+ if (under(buff.overheal.part, 0, true)) odd(`${at}.overheal.part`, buff.id, `${at}.overheal.part is not above 0 at a level: no healing past full health becomes a shield there`);
471
+ if (buff.overheal.most !== void 0 && !(buff.overheal.most > 0)) odd(`${at}.overheal.most`, buff.id, `${at}.overheal.most is not above 0: the shield it makes holds nothing`);
472
+ if (buff.overheal.of !== void 0 && !["given", "taken"].includes(buff.overheal.of)) odd(`${at}.overheal.of`, buff.id, `${at}.overheal.of is given or taken: "${String(buff.overheal.of)}" is neither, given is meant`);
473
+ }
474
+ if (typeof buff.paysWithHealth === "number" && !(buff.paysWithHealth > 0)) odd(`${at}.paysWithHealth`, buff.id, `${at}.paysWithHealth is not above 0: its carrier pays nothing for its abilities, of health or mana`);
475
+ if (typeof buff.camouflage === "number" && !(buff.camouflage >= 0)) odd(`${at}.camouflage`, buff.id, `${at}.camouflage is under 0: its enemies never see it, even from up close`);
476
+ }
477
+ for (const race of rules.races ?? []) {
478
+ const start = race.startingBase;
479
+ if (!start || "spawn" in start) continue;
480
+ const at = `races.${race.id}.startingBase`;
481
+ known(`${at}.hall`, start.hall, units, "unit type");
482
+ known(`${at}.workers.type`, start.workers?.type, units, "unit type");
483
+ known(`${at}.onMine`, start.onMine, units, "unit type");
484
+ start.units?.forEach((each, index) => known(`${at}.units[${index}].type`, each.type, units, "unit type"));
485
+ }
486
+ for (const item of rules.items ?? []) {
487
+ const at = `items.${item.id}`;
488
+ known(`${at}.ability`, item.ability, abilities, "ability");
489
+ known(`${at}.passive`, item.passive, abilities, "ability");
490
+ all(`${at}.from`, item.from, items, "item");
491
+ }
492
+ itemProblems(rules, problems, odd);
493
+ for (const upgrade of rules.upgrades ?? []) {
494
+ const at = `upgrades.${upgrade.id}`;
495
+ upgrade.requires?.forEach((level, index) => all(`${at}.requires[${index}]`, level, requirable, "unit type or upgrade"));
496
+ upgrade.effects.forEach((effect, index) => {
497
+ if (Array.isArray(effect.units)) all(`${at}.effects[${index}].units`, effect.units, units, "unit type");
498
+ });
499
+ }
500
+ const needs = /* @__PURE__ */ new Map();
501
+ for (const unit of rules.units) if (unit.requires?.length) needs.set(unit.id, unit.requires);
502
+ for (const upgrade of rules.upgrades ?? []) if (upgrade.requires?.[0]?.length) needs.set(upgrade.id, upgrade.requires[0]);
503
+ const reported = /* @__PURE__ */ new Set();
504
+ for (const start of needs.keys()) {
505
+ const loop = cycleFrom(start, needs);
506
+ if (!loop) continue;
507
+ const key = [...loop].sort().join(",");
508
+ if (reported.has(key)) continue;
509
+ reported.add(key);
510
+ problems.push({
511
+ level: "error",
512
+ where: `requires`,
513
+ id: start,
514
+ message: `What is required waits on itself: ${[...loop, loop[0]].join(" → ")}. None of them can be had`
515
+ });
516
+ }
517
+ const made = /* @__PURE__ */ new Set();
518
+ for (const unit of rules.units) {
519
+ for (const id of [
520
+ ...unit.trains ?? [],
521
+ ...unit.builds ?? [],
522
+ ...unit.hires ?? [],
523
+ ...unit.researches ?? []
524
+ ]) made.add(id);
525
+ for (const id of upgradesOf(unit)) made.add(id);
526
+ }
527
+ for (const unit of rules.units) {
528
+ if (!unit.cost || made.has(unit.id)) continue;
529
+ problems.push({
530
+ level: "warning",
531
+ where: `units.${unit.id}`,
532
+ id: unit.id,
533
+ message: `units.${unit.id} has a cost, and nothing trains, builds or hires it`
534
+ });
535
+ }
536
+ for (const upgrade of rules.upgrades ?? []) {
537
+ if (made.has(upgrade.id)) continue;
538
+ problems.push({
539
+ level: "warning",
540
+ where: `upgrades.${upgrade.id}`,
541
+ id: upgrade.id,
542
+ message: `upgrades.${upgrade.id} is researched nowhere (UnitTypeDef.researches)`
543
+ });
544
+ }
545
+ const had = /* @__PURE__ */ new Set();
546
+ for (const unit of rules.units) for (const id of [
547
+ ...unit.abilities ?? [],
548
+ ...unit.hero?.learns ?? [],
549
+ ...unit.hero?.spells ?? [],
550
+ ...unit.hero?.innate ? [unit.hero.innate] : [],
551
+ ...Object.values(unit.hero?.forms ?? {}).flatMap((form) => form.learns ?? [])
552
+ ]) had.add(id);
553
+ for (const item of rules.items ?? []) for (const id of [item.ability, item.passive]) if (id) had.add(id);
554
+ const named = (ability) => {
555
+ const walk = (list) => list?.map(anyEffect).forEach((effect) => (effect.ability && had.add(effect.ability), walk(effect.otherwise)));
556
+ walk(ability.effects);
557
+ walk(ability.passive);
558
+ };
559
+ for (const ability of rules.abilities ?? []) named(ability);
560
+ const offered = new Set(rules.defaults?.added.abilities ?? []);
561
+ for (const ability of rules.abilities ?? []) {
562
+ if (had.has(ability.id) || offered.has(ability.id)) continue;
563
+ problems.push({
564
+ level: "warning",
565
+ where: `abilities.${ability.id}`,
566
+ id: ability.id,
567
+ message: `abilities.${ability.id} is on no unit, hero or item`
568
+ });
569
+ }
570
+ return problems.map((problem) => {
571
+ const at = locate(rules, problem.where);
572
+ return at ? {
573
+ ...problem,
574
+ at
575
+ } : problem;
576
+ });
577
+ }
578
+ /** The engine's limits of groups of items (`ItemSettings.groups`), said here so that the check loads none of the rules */
579
+ var GROUP_LIMITS = { boots: 1 };
580
+ /**
581
+ * What does not fit in a game's items (items-and-spells plan, phase 5): a build tree that loops (an error: no price can
582
+ * be worked out), a recipe of more of a group than a hero may carry (an error: its parts are never all carried), and as
583
+ * warnings a price under its parts', an item nothing sells or drops (in a game that sells or drops any), numbers that
584
+ * do nothing, callings no hero has
585
+ */
586
+ function itemProblems(rules, problems, odd) {
587
+ const list = rules.items ?? [];
588
+ const byId = new Map(list.map((item) => [item.id, item]));
589
+ const currency = rules.currency ?? rules.resources?.[0]?.id;
590
+ const price = (id) => currency ? byId.get(id)?.cost[currency] ?? 0 : 0;
591
+ const groups = {
592
+ ...GROUP_LIMITS,
593
+ ...rules.settings?.items?.groups
594
+ };
595
+ const limitOf = (group, own) => own ?? groups[group] ?? 1;
596
+ const parts = new Map(list.filter((item) => item.from?.length).map((item) => [item.id, item.from.filter((part) => byId.has(part))]));
597
+ const looped = /* @__PURE__ */ new Set();
598
+ for (const start of parts.keys()) {
599
+ const loop = cycleFrom(start, parts);
600
+ if (!loop) continue;
601
+ const key = [...loop].sort().join(",");
602
+ if (looped.has(key)) continue;
603
+ looped.add(key);
604
+ problems.push({
605
+ level: "error",
606
+ where: `items.${start}.from`,
607
+ id: start,
608
+ message: `The build tree goes round: ${[...loop, loop[0]].join(" → ")}. None of them can be priced or bought`
609
+ });
610
+ }
611
+ const inLoop = new Set([...looped].flatMap((key) => key.split(",")));
612
+ const sold = new Set(rules.units.flatMap((unit) => unit.sells ?? []));
613
+ const dropped = new Set(rules.units.flatMap((unit) => Array.isArray(unit.drops) ? unit.drops.map((drop) => drop.item) : []));
614
+ const dealt = sold.size > 0 || dropped.size > 0;
615
+ const dropsInCode = rules.units.some((unit) => typeof unit.drops === "function");
616
+ const callings = suitedCallings(rules);
617
+ for (const item of list) {
618
+ const at = `items.${item.id}`;
619
+ const from = item.from?.filter((part) => byId.has(part)) ?? [];
620
+ if (from.length && currency && !inLoop.has(item.id)) {
621
+ const sum = from.reduce((total, part) => total + price(part), 0);
622
+ if (price(item.id) < sum) odd(`${at}.cost`, item.id, `${at}.cost (${price(item.id)} ${currency}) is under what its parts cost together (${sum}): building it pays the buyer`);
623
+ }
624
+ for (const group of new Set(from.map((part) => byId.get(part).group).filter((group) => group !== void 0))) {
625
+ const count = from.filter((part) => byId.get(part).group === group).length;
626
+ const limit = limitOf(group, from.map((part) => byId.get(part)).find((part) => part.group === group)?.groupLimit);
627
+ if (count > limit) problems.push({
628
+ level: "error",
629
+ where: `${at}.from`,
630
+ id: item.id,
631
+ message: `${at}.from has ${count} of the group "${group}", and a hero carries ${limit} at most: its parts are never all carried`
632
+ });
633
+ }
634
+ if (dealt && !item.powerUp && !sold.has(item.id) && !dropped.has(item.id) && !dropsInCode) odd(at, item.id, `${at} is sold by no shop and dropped by nothing (UnitTypeDef.sells, drops): nobody gets it but by code or a map`);
635
+ if (item.group !== void 0 && item.groupLimit !== void 0 && !(item.groupLimit >= 1)) odd(`${at}.groupLimit`, item.id, `${at}.groupLimit is under 1: nobody may carry it`);
636
+ if (item.groupLimit !== void 0 && item.group === void 0) odd(`${at}.groupLimit`, item.id, `${at}.groupLimit is there, but it is of no group: nothing limits it`);
637
+ if (item.stack !== void 0 && !item.charges) odd(`${at}.stack`, item.id, `${at}.stack is there, but it has no charges: what stacks is its charges, so nothing does`);
638
+ if (item.stack !== void 0 && !(item.stack >= 1)) odd(`${at}.stack`, item.id, `${at}.stack is under 1: one goes in a slot`);
639
+ if (item.refill !== void 0 && !item.charges) odd(`${at}.refill`, item.id, `${at}.refill is there, but it has no charges to come back`);
640
+ if (item.sellRate !== void 0 && !(item.sellRate >= 0)) odd(`${at}.sellRate`, item.id, `${at}.sellRate is under 0: selling it costs its seller`);
641
+ if (item.unique !== void 0 && !item.passive) odd(`${at}.unique`, item.id, `${at}.unique names its passive, and it has none (passive): it does nothing`);
642
+ if (callings) item.suits?.forEach((calling, index) => {
643
+ if (!callings.has(calling)) odd(`${at}.suits[${index}]`, calling, `${at}.suits[${index}] is "${calling}", which is no calling of the game${nearestId(calling, callings) ? `. Did you mean "${nearestId(calling, callings)}"?` : ""}`);
644
+ });
645
+ }
646
+ }
647
+ /**
648
+ * The callings of a game's heroes, where it has them: the rules' (`callings`) or a pack's that keeps them
649
+ * (`heroesPack({ callings })`). None for a game without, whose items' `suits` go unchecked
650
+ */
651
+ function suitedCallings(rules) {
652
+ const own = rules.callings;
653
+ const ids = (Array.isArray(own) ? [own] : (rules.packs ?? []).map((each) => each.callings)).flatMap((list) => Array.isArray(list) ? list.flatMap((def) => typeof def === "string" ? [def] : typeof def?.id === "string" ? [def.id] : []) : []);
654
+ return ids.length ? new Set(ids) : void 0;
655
+ }
656
+ /**
657
+ * The definition and field a place in the rules is (`abilities.holy-light.effects[0].buff`): the kind, the longest id
658
+ * of it the place begins with (an id may have dots), and the rest as a path of the Data panel's (`effects.0.buff`)
659
+ */
660
+ function locate(rules, where) {
661
+ const dot = where.indexOf(".");
662
+ const kind = where.slice(0, dot);
663
+ if (dot < 0 || !DATA_KINDS.includes(kind)) return void 0;
664
+ const rest = where.slice(dot + 1);
665
+ const id = (rules[kind] ?? []).map((def) => def.id).filter((each) => rest === each || rest.startsWith(`${each}.`)).sort((a, b) => b.length - a.length)[0];
666
+ if (id === void 0) return void 0;
667
+ return {
668
+ kind,
669
+ id,
670
+ path: rest.slice(id.length + 1).replace(/\[(\d+)\]/g, ".$1")
671
+ };
672
+ }
673
+ /** A loop of requirements through `start`, in order, or none */
674
+ function cycleFrom(start, needs) {
675
+ const path = [];
676
+ const seen = /* @__PURE__ */ new Set();
677
+ const visit = (id) => {
678
+ if (id === start && path.length) return [...path];
679
+ if (seen.has(id)) return void 0;
680
+ seen.add(id);
681
+ path.push(id);
682
+ for (const next of needs.get(id) ?? []) {
683
+ const found = visit(next);
684
+ if (found) return found;
685
+ }
686
+ path.pop();
687
+ };
688
+ return visit(start);
689
+ }
690
+ //#endregion
691
+ export { checkRules, editDistance };
692
+
693
+ //# sourceMappingURL=rulesCheck.js.map