@v12-engine/engine 0.1.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (951) hide show
  1. package/dist/abilities/amounts.d.ts +28 -0
  2. package/dist/abilities/amounts.js +74 -0
  3. package/dist/abilities/amounts.js.map +1 -0
  4. package/dist/abilities/buffs.d.ts +106 -6
  5. package/dist/abilities/buffs.js +443 -0
  6. package/dist/abilities/buffs.js.map +1 -0
  7. package/dist/abilities/castTold.d.ts +2 -0
  8. package/dist/abilities/castTold.js +66 -0
  9. package/dist/abilities/castTold.js.map +1 -0
  10. package/dist/abilities/chance.d.ts +38 -0
  11. package/dist/abilities/chance.js +77 -0
  12. package/dist/abilities/chance.js.map +1 -0
  13. package/dist/abilities/charges.d.ts +18 -0
  14. package/dist/abilities/charges.js +101 -0
  15. package/dist/abilities/charges.js.map +1 -0
  16. package/dist/abilities/control.d.ts +28 -0
  17. package/dist/abilities/control.js +113 -0
  18. package/dist/abilities/control.js.map +1 -0
  19. package/dist/abilities/dispel.js +51 -0
  20. package/dist/abilities/dispel.js.map +1 -0
  21. package/dist/abilities/effectFields.d.ts +1 -1
  22. package/dist/abilities/effectFields.js +676 -0
  23. package/dist/abilities/effectFields.js.map +1 -0
  24. package/dist/abilities/effectIndex.d.ts +27 -0
  25. package/dist/abilities/effectIndex.js +64 -0
  26. package/dist/abilities/effectIndex.js.map +1 -0
  27. package/dist/abilities/effects/buff.d.ts +9 -3
  28. package/dist/abilities/effects/buff.js +84 -0
  29. package/dist/abilities/effects/buff.js.map +1 -0
  30. package/dist/abilities/effects/conditions.d.ts +2 -0
  31. package/dist/abilities/effects/conditions.js +41 -0
  32. package/dist/abilities/effects/conditions.js.map +1 -0
  33. package/dist/abilities/effects/core.js +54 -0
  34. package/dist/abilities/effects/core.js.map +1 -0
  35. package/dist/abilities/effects/damage.d.ts +1 -1
  36. package/dist/abilities/effects/damage.js +43 -0
  37. package/dist/abilities/effects/damage.js.map +1 -0
  38. package/dist/abilities/effects/heal.d.ts +2 -2
  39. package/dist/abilities/effects/heal.js +51 -0
  40. package/dist/abilities/effects/heal.js.map +1 -0
  41. package/dist/abilities/effects/missile.d.ts +13 -1
  42. package/dist/abilities/effects/missile.js +104 -0
  43. package/dist/abilities/effects/missile.js.map +1 -0
  44. package/dist/abilities/effects/morph.d.ts +5 -0
  45. package/dist/abilities/effects/morph.js +43 -0
  46. package/dist/abilities/effects/morph.js.map +1 -0
  47. package/dist/abilities/effects/moves.d.ts +16 -4
  48. package/dist/abilities/effects/moves.js +212 -0
  49. package/dist/abilities/effects/moves.js.map +1 -0
  50. package/dist/abilities/effects/passives.d.ts +19 -9
  51. package/dist/abilities/effects/passives.js +131 -0
  52. package/dist/abilities/effects/passives.js.map +1 -0
  53. package/dist/abilities/effects/proxy.d.ts +5 -0
  54. package/dist/abilities/effects/proxy.js +60 -0
  55. package/dist/abilities/effects/proxy.js.map +1 -0
  56. package/dist/abilities/effects/sight.d.ts +2 -2
  57. package/dist/abilities/effects/sight.js +39 -0
  58. package/dist/abilities/effects/sight.js.map +1 -0
  59. package/dist/abilities/effects/spawn.d.ts +5 -2
  60. package/dist/abilities/effects/spawn.js +40 -0
  61. package/dist/abilities/effects/spawn.js.map +1 -0
  62. package/dist/abilities/effects/timed.d.ts +2 -2
  63. package/dist/abilities/effects/timed.js +96 -0
  64. package/dist/abilities/effects/timed.js.map +1 -0
  65. package/dist/abilities/effects/trade.d.ts +1 -1
  66. package/dist/abilities/effects/trade.js +25 -0
  67. package/dist/abilities/effects/trade.js.map +1 -0
  68. package/dist/abilities/effects.d.ts +97 -23
  69. package/dist/abilities/effects.js +860 -0
  70. package/dist/abilities/effects.js.map +1 -0
  71. package/dist/abilities/land.d.ts +38 -4
  72. package/dist/abilities/land.js +189 -0
  73. package/dist/abilities/land.js.map +1 -0
  74. package/dist/abilities/recast.d.ts +45 -0
  75. package/dist/abilities/recast.js +118 -0
  76. package/dist/abilities/recast.js.map +1 -0
  77. package/dist/abilities/scaled.js +40 -0
  78. package/dist/abilities/scaled.js.map +1 -0
  79. package/dist/abilities/screen.d.ts +6 -0
  80. package/dist/abilities/screen.js +83 -0
  81. package/dist/abilities/screen.js.map +1 -0
  82. package/dist/abilities/shapes.d.ts +66 -0
  83. package/dist/abilities/shapes.js +122 -0
  84. package/dist/abilities/shapes.js.map +1 -0
  85. package/dist/abilities/text.d.ts +14 -2
  86. package/dist/abilities/text.js +204 -0
  87. package/dist/abilities/text.js.map +1 -0
  88. package/dist/abilities/triggers.d.ts +98 -0
  89. package/dist/abilities/triggers.js +351 -0
  90. package/dist/abilities/triggers.js.map +1 -0
  91. package/dist/abilityChanges.d.ts +131 -0
  92. package/dist/abilityChanges.js +345 -0
  93. package/dist/abilityChanges.js.map +1 -0
  94. package/dist/ai/area.d.ts +4 -1
  95. package/dist/ai/brain.d.ts +4 -1
  96. package/dist/ai/brain.js +844 -0
  97. package/dist/ai/brain.js.map +1 -0
  98. package/dist/ai/budget.js +74 -0
  99. package/dist/ai/budget.js.map +1 -0
  100. package/dist/ai/checks.d.ts +9 -1
  101. package/dist/ai/checks.js +242 -0
  102. package/dist/ai/checks.js.map +1 -0
  103. package/dist/ai/computer.d.ts +11 -4
  104. package/dist/ai/computer.js +251 -0
  105. package/dist/ai/computer.js.map +1 -0
  106. package/dist/ai/defence.d.ts +4 -0
  107. package/dist/ai/defence.js +430 -0
  108. package/dist/ai/defence.js.map +1 -0
  109. package/dist/ai/define.d.ts +3 -2
  110. package/dist/ai/define.js +31 -0
  111. package/dist/ai/define.js.map +1 -0
  112. package/dist/ai/economy.d.ts +10 -7
  113. package/dist/ai/economy.js +780 -0
  114. package/dist/ai/economy.js.map +1 -0
  115. package/dist/ai/geometry.js +38 -0
  116. package/dist/ai/geometry.js.map +1 -0
  117. package/dist/ai/goals.d.ts +1 -0
  118. package/dist/ai/goals.js +560 -0
  119. package/dist/ai/goals.js.map +1 -0
  120. package/dist/ai/knowledge.d.ts +72 -7
  121. package/dist/ai/knowledge.js +804 -0
  122. package/dist/ai/knowledge.js.map +1 -0
  123. package/dist/ai/lanes.d.ts +10 -2
  124. package/dist/ai/lanes.js +715 -0
  125. package/dist/ai/lanes.js.map +1 -0
  126. package/dist/ai/melee/build.js +264 -0
  127. package/dist/ai/melee/build.js.map +1 -0
  128. package/dist/ai/melee/goals.d.ts +7 -0
  129. package/dist/ai/melee/goals.js +720 -0
  130. package/dist/ai/melee/goals.js.map +1 -0
  131. package/dist/ai/melee/heroes.js +68 -0
  132. package/dist/ai/melee/heroes.js.map +1 -0
  133. package/dist/ai/melee/index.d.ts +1 -1
  134. package/dist/ai/melee/index.js +51 -0
  135. package/dist/ai/melee/index.js.map +1 -0
  136. package/dist/ai/melee/production.js +29 -0
  137. package/dist/ai/melee/production.js.map +1 -0
  138. package/dist/ai/melee/surrender.js +64 -0
  139. package/dist/ai/melee/surrender.js.map +1 -0
  140. package/dist/ai/micro.d.ts +9 -0
  141. package/dist/ai/micro.js +1316 -0
  142. package/dist/ai/micro.js.map +1 -0
  143. package/dist/ai/mission.d.ts +9 -2
  144. package/dist/ai/mission.js +538 -0
  145. package/dist/ai/mission.js.map +1 -0
  146. package/dist/ai/missionRules.d.ts +1 -1
  147. package/dist/ai/missionRules.js +26 -0
  148. package/dist/ai/missionRules.js.map +1 -0
  149. package/dist/ai/module.d.ts +6 -2
  150. package/dist/ai/module.js +37 -0
  151. package/dist/ai/module.js.map +1 -0
  152. package/dist/ai/options.d.ts +3 -3
  153. package/dist/ai/plans/build.d.ts +20 -1
  154. package/dist/ai/plans/build.js +608 -0
  155. package/dist/ai/plans/build.js.map +1 -0
  156. package/dist/ai/plans/placement.d.ts +4 -1
  157. package/dist/ai/plans/placement.js +295 -0
  158. package/dist/ai/plans/placement.js.map +1 -0
  159. package/dist/ai/plans/plans.d.ts +9 -0
  160. package/dist/ai/plans/plans.js +110 -0
  161. package/dist/ai/plans/plans.js.map +1 -0
  162. package/dist/ai/plans/production.d.ts +14 -2
  163. package/dist/ai/plans/production.js +434 -0
  164. package/dist/ai/plans/production.js.map +1 -0
  165. package/dist/ai/plans/purse.d.ts +6 -3
  166. package/dist/ai/plans/purse.js +139 -0
  167. package/dist/ai/plans/purse.js.map +1 -0
  168. package/dist/ai/plans/tech.d.ts +6 -0
  169. package/dist/ai/plans/tech.js +122 -0
  170. package/dist/ai/plans/tech.js.map +1 -0
  171. package/dist/ai/profiles.d.ts +4 -4
  172. package/dist/{profiles-B3NS9jwk.js → ai/profiles.js} +3 -98
  173. package/dist/ai/profiles.js.map +1 -0
  174. package/dist/ai/reach.js +54 -0
  175. package/dist/ai/reach.js.map +1 -0
  176. package/dist/ai/report.d.ts +8 -0
  177. package/dist/ai/report.js +87 -0
  178. package/dist/ai/report.js.map +1 -0
  179. package/dist/ai/roles.d.ts +4 -0
  180. package/dist/ai/roles.js +207 -0
  181. package/dist/ai/roles.js.map +1 -0
  182. package/dist/ai/rules.d.ts +8 -2
  183. package/dist/ai/rules.js +416 -0
  184. package/dist/ai/rules.js.map +1 -0
  185. package/dist/ai/scouting.d.ts +6 -0
  186. package/dist/ai/scouting.js +324 -0
  187. package/dist/ai/scouting.js.map +1 -0
  188. package/dist/ai/settings.js +99 -0
  189. package/dist/ai/settings.js.map +1 -0
  190. package/dist/ai/squads.d.ts +21 -2
  191. package/dist/ai/squads.js +916 -0
  192. package/dist/ai/squads.js.map +1 -0
  193. package/dist/ai/strength.js +320 -0
  194. package/dist/ai/strength.js.map +1 -0
  195. package/dist/ai/task.d.ts +3 -1
  196. package/dist/ai/task.js +17 -0
  197. package/dist/ai/task.js.map +1 -0
  198. package/dist/ai/tasks/attack.js +24 -0
  199. package/dist/ai/tasks/attack.js.map +1 -0
  200. package/dist/ai/tasks/capture.d.ts +3 -3
  201. package/dist/ai/tasks/capture.js +37 -0
  202. package/dist/ai/tasks/capture.js.map +1 -0
  203. package/dist/ai/tasks/creep.js +29 -0
  204. package/dist/ai/tasks/creep.js.map +1 -0
  205. package/dist/ai/tasks/defend.js +61 -0
  206. package/dist/ai/tasks/defend.js.map +1 -0
  207. package/dist/ai/tasks/drop.js +81 -0
  208. package/dist/ai/tasks/drop.js.map +1 -0
  209. package/dist/ai/tasks/escort.js +59 -0
  210. package/dist/ai/tasks/escort.js.map +1 -0
  211. package/dist/ai/tasks/gather.js +48 -0
  212. package/dist/ai/tasks/gather.js.map +1 -0
  213. package/dist/ai/tasks/harass.js +39 -0
  214. package/dist/ai/tasks/harass.js.map +1 -0
  215. package/dist/ai/tasks/hold.js +32 -0
  216. package/dist/ai/tasks/hold.js.map +1 -0
  217. package/dist/ai/tasks/index.js +34 -0
  218. package/dist/ai/tasks/index.js.map +1 -0
  219. package/dist/ai/tasks/move.js +26 -0
  220. package/dist/ai/tasks/move.js.map +1 -0
  221. package/dist/ai/tasks/patrol.js +59 -0
  222. package/dist/ai/tasks/patrol.js.map +1 -0
  223. package/dist/ai/tasks/retreat.js +28 -0
  224. package/dist/ai/tasks/retreat.js.map +1 -0
  225. package/dist/ai/tasks/scout.js +73 -0
  226. package/dist/ai/tasks/scout.js.map +1 -0
  227. package/dist/ai/tasks/shared.d.ts +1 -1
  228. package/dist/ai/tasks/shared.js +137 -0
  229. package/dist/ai/tasks/shared.js.map +1 -0
  230. package/dist/ai/team.d.ts +18 -1
  231. package/dist/ai/team.js +492 -0
  232. package/dist/ai/team.js.map +1 -0
  233. package/dist/ai/threat.d.ts +6 -0
  234. package/dist/ai/threat.js +206 -0
  235. package/dist/ai/threat.js.map +1 -0
  236. package/dist/ai/view.d.ts +21 -7
  237. package/dist/ai/view.js +677 -0
  238. package/dist/ai/view.js.map +1 -0
  239. package/dist/ai/waves.d.ts +6 -0
  240. package/dist/ai/waves.js +410 -0
  241. package/dist/ai/waves.js.map +1 -0
  242. package/dist/ai.js +54 -6239
  243. package/dist/aiTesting.d.ts +6 -3
  244. package/dist/aiTesting.js +229 -0
  245. package/dist/aiTesting.js.map +1 -0
  246. package/dist/areas.d.ts +4 -1
  247. package/dist/areas.js +295 -0
  248. package/dist/areas.js.map +1 -0
  249. package/dist/attacks.d.ts +3 -3
  250. package/dist/attacks.js +127 -0
  251. package/dist/attacks.js.map +1 -0
  252. package/dist/burning.d.ts +267 -0
  253. package/dist/burning.js +795 -0
  254. package/dist/burning.js.map +1 -0
  255. package/dist/bytes.js +21 -0
  256. package/dist/bytes.js.map +1 -0
  257. package/dist/callings.d.ts +71 -0
  258. package/dist/callings.js +157 -0
  259. package/dist/callings.js.map +1 -0
  260. package/dist/cameraOrders.d.ts +78 -0
  261. package/dist/cameraOrders.js +114 -0
  262. package/dist/cameraOrders.js.map +1 -0
  263. package/dist/camps.d.ts +70 -4
  264. package/dist/camps.js +501 -0
  265. package/dist/camps.js.map +1 -0
  266. package/dist/capture.d.ts +15 -3
  267. package/dist/capture.js +304 -0
  268. package/dist/capture.js.map +1 -0
  269. package/dist/cellLayers.d.ts +78 -13
  270. package/dist/cellLayers.js +275 -0
  271. package/dist/cellLayers.js.map +1 -0
  272. package/dist/cellPatches.d.ts +24 -0
  273. package/dist/cellPatches.js +73 -0
  274. package/dist/cellPatches.js.map +1 -0
  275. package/dist/cinematics.d.ts +10 -5
  276. package/dist/cinematics.js +161 -0
  277. package/dist/cinematics.js.map +1 -0
  278. package/dist/clock.d.ts +2 -2
  279. package/dist/clock.js +78 -0
  280. package/dist/clock.js.map +1 -0
  281. package/dist/commands.d.ts +36 -4
  282. package/dist/commands.js +636 -0
  283. package/dist/commands.js.map +1 -0
  284. package/dist/components.d.ts +31 -10
  285. package/dist/components.js +74 -0
  286. package/dist/components.js.map +1 -0
  287. package/dist/computers.d.ts +4 -4
  288. package/dist/computers.js +194 -0
  289. package/dist/computers.js.map +1 -0
  290. package/dist/concealment.d.ts +25 -2
  291. package/dist/concealment.js +409 -0
  292. package/dist/concealment.js.map +1 -0
  293. package/dist/coreComponents.js +130 -0
  294. package/dist/coreComponents.js.map +1 -0
  295. package/dist/createGame.d.ts +306 -0
  296. package/dist/createGame.js +405 -0
  297. package/dist/createGame.js.map +1 -0
  298. package/dist/dashing.d.ts +18 -2
  299. package/dist/dashing.js +41 -0
  300. package/dist/dashing.js.map +1 -0
  301. package/dist/debug.d.ts +8 -0
  302. package/dist/debug.js +5 -3
  303. package/dist/debug2.js +76 -0
  304. package/dist/debug2.js.map +1 -0
  305. package/dist/debugCommands.d.ts +6 -6
  306. package/dist/debugCommands.js +537 -0
  307. package/dist/debugCommands.js.map +1 -0
  308. package/dist/debugging.d.ts +1 -0
  309. package/dist/defaultSets.d.ts +183 -0
  310. package/dist/defaultSets.js +216 -0
  311. package/dist/defaultSets.js.map +1 -0
  312. package/dist/definitions.d.ts +6 -0
  313. package/dist/definitions.js +78 -0
  314. package/dist/definitions.js.map +1 -0
  315. package/dist/defs.d.ts +1895 -165
  316. package/dist/defs.js +380 -0
  317. package/dist/defs.js.map +1 -0
  318. package/dist/denying.d.ts +4 -4
  319. package/dist/denying.js +106 -0
  320. package/dist/denying.js.map +1 -0
  321. package/dist/destructibles.d.ts +2 -2
  322. package/dist/destructibles.js +36 -0
  323. package/dist/destructibles.js.map +1 -0
  324. package/dist/determinism.d.ts +4 -4
  325. package/dist/determinism.js +247 -0
  326. package/dist/determinism.js.map +1 -0
  327. package/dist/dialog.d.ts +17 -2
  328. package/dist/dialog.js +108 -0
  329. package/dist/dialog.js.map +1 -0
  330. package/dist/effectRefs.js +28 -0
  331. package/dist/effectRefs.js.map +1 -0
  332. package/dist/effects.d.ts +27 -11
  333. package/dist/effects.js +110 -0
  334. package/dist/effects.js.map +1 -0
  335. package/dist/endings.d.ts +1 -1
  336. package/dist/endings.js +78 -0
  337. package/dist/endings.js.map +1 -0
  338. package/dist/engagement.d.ts +40 -6
  339. package/dist/engagement.js +530 -0
  340. package/dist/engagement.js.map +1 -0
  341. package/dist/engineEvents.d.ts +72 -9
  342. package/dist/engineEvents.js +520 -0
  343. package/dist/engineEvents.js.map +1 -0
  344. package/dist/entity.d.ts +275 -26
  345. package/dist/entity.js +441 -0
  346. package/dist/entity.js.map +1 -0
  347. package/dist/entityIndex.d.ts +10 -3
  348. package/dist/entityIndex.js +149 -0
  349. package/dist/entityIndex.js.map +1 -0
  350. package/dist/errors.d.ts +6 -2
  351. package/dist/errors.js +59 -0
  352. package/dist/errors.js.map +1 -0
  353. package/dist/events.d.ts +11 -5
  354. package/dist/events.js +158 -0
  355. package/dist/events.js.map +1 -0
  356. package/dist/exactMath.js +273 -0
  357. package/dist/exactMath.js.map +1 -0
  358. package/dist/features.d.ts +1 -1
  359. package/dist/features.js +127 -0
  360. package/dist/features.js.map +1 -0
  361. package/dist/fields.d.ts +25 -5
  362. package/dist/fields.js +140 -0
  363. package/dist/fields.js.map +1 -0
  364. package/dist/fixture.d.ts +3 -3
  365. package/dist/fixture.js +512 -0
  366. package/dist/fixture.js.map +1 -0
  367. package/dist/fog.d.ts +26 -3
  368. package/dist/fog.js +333 -0
  369. package/dist/fog.js.map +1 -0
  370. package/dist/foliage.d.ts +476 -0
  371. package/dist/foliage.js +1478 -0
  372. package/dist/foliage.js.map +1 -0
  373. package/dist/foliageDebug.d.ts +57 -0
  374. package/dist/foliageDebug.js +172 -0
  375. package/dist/foliageDebug.js.map +1 -0
  376. package/dist/foliageRegrowth.d.ts +20 -0
  377. package/dist/foliageRegrowth.js +332 -0
  378. package/dist/foliageRegrowth.js.map +1 -0
  379. package/dist/formState.d.ts +67 -0
  380. package/dist/formState.js +65 -0
  381. package/dist/formState.js.map +1 -0
  382. package/dist/formation.d.ts +46 -8
  383. package/dist/formation.js +297 -0
  384. package/dist/formation.js.map +1 -0
  385. package/dist/forms.d.ts +58 -0
  386. package/dist/forms.js +146 -0
  387. package/dist/forms.js.map +1 -0
  388. package/dist/friendlyFire.d.ts +2 -2
  389. package/dist/friendlyFire.js +37 -0
  390. package/dist/friendlyFire.js.map +1 -0
  391. package/dist/game.d.ts +141 -48
  392. package/dist/game.js +834 -0
  393. package/dist/game.js.map +1 -0
  394. package/dist/gameData.d.ts +96 -22
  395. package/dist/gameData.js +1690 -0
  396. package/dist/gameData.js.map +1 -0
  397. package/dist/gameFiles.d.ts +3 -3
  398. package/dist/gameFiles.js +14 -0
  399. package/dist/gameFiles.js.map +1 -0
  400. package/dist/gates.js +92 -0
  401. package/dist/gates.js.map +1 -0
  402. package/dist/generate.d.ts +28 -1
  403. package/dist/generate.js +1062 -0
  404. package/dist/generate.js.map +1 -0
  405. package/dist/generateWorker.d.ts +7 -3
  406. package/dist/generateWorker.js +86 -0
  407. package/dist/generateWorker.js.map +1 -0
  408. package/dist/grid.d.ts +9 -0
  409. package/dist/grid.js +102 -0
  410. package/dist/grid.js.map +1 -0
  411. package/dist/ground.d.ts +17 -1
  412. package/dist/ground.js +375 -0
  413. package/dist/ground.js.map +1 -0
  414. package/dist/groundObjects.d.ts +70 -0
  415. package/dist/groundObjects.js +371 -0
  416. package/dist/groundObjects.js.map +1 -0
  417. package/dist/groundSpeed.d.ts +20 -3
  418. package/dist/groundSpeed.js +117 -0
  419. package/dist/groundSpeed.js.map +1 -0
  420. package/dist/hero.d.ts +126 -10
  421. package/dist/hero.js +432 -0
  422. package/dist/hero.js.map +1 -0
  423. package/dist/holds.d.ts +94 -0
  424. package/dist/holds.js +305 -0
  425. package/dist/holds.js.map +1 -0
  426. package/dist/home.d.ts +1 -1
  427. package/dist/home.js +30 -0
  428. package/dist/home.js.map +1 -0
  429. package/dist/hooks.d.ts +339 -57
  430. package/dist/hooks.js +105 -0
  431. package/dist/hooks.js.map +1 -0
  432. package/dist/hotReload.d.ts +6 -5
  433. package/dist/hotReload.js +145 -0
  434. package/dist/hotReload.js.map +1 -0
  435. package/dist/ids.d.ts +3 -3
  436. package/dist/ids.js +30 -0
  437. package/dist/ids.js.map +1 -0
  438. package/dist/idsFile.d.ts +36 -0
  439. package/dist/idsFile.js +134 -0
  440. package/dist/idsFile.js.map +1 -0
  441. package/dist/index.d.ts +105 -68
  442. package/dist/index.js +194 -4701
  443. package/dist/inspect.d.ts +29 -2
  444. package/dist/{inspect-D9dWHmZ0.js → inspect.js} +21 -12
  445. package/dist/inspect.js.map +1 -0
  446. package/dist/inventory.d.ts +14 -1
  447. package/dist/inventory.js +84 -0
  448. package/dist/inventory.js.map +1 -0
  449. package/dist/items.d.ts +136 -8
  450. package/dist/items.js +585 -0
  451. package/dist/items.js.map +1 -0
  452. package/dist/lanes.d.ts +12 -3
  453. package/dist/lanes.js +496 -0
  454. package/dist/lanes.js.map +1 -0
  455. package/dist/life.d.ts +6 -2
  456. package/dist/life.js +287 -0
  457. package/dist/life.js.map +1 -0
  458. package/dist/log.d.ts +26 -3
  459. package/dist/log.js +192 -0
  460. package/dist/log.js.map +1 -0
  461. package/dist/manaBurn.d.ts +2 -2
  462. package/dist/manaBurn.js +75 -0
  463. package/dist/manaBurn.js.map +1 -0
  464. package/dist/map/file.d.ts +56 -3
  465. package/dist/map/file.js +264 -0
  466. package/dist/map/file.js.map +1 -0
  467. package/dist/map/images.js +61 -0
  468. package/dist/map/images.js.map +1 -0
  469. package/dist/map/look.d.ts +1 -1
  470. package/dist/map/look.js +30 -0
  471. package/dist/map/look.js.map +1 -0
  472. package/dist/map/pathProfile.js +183 -0
  473. package/dist/map/pathProfile.js.map +1 -0
  474. package/dist/map/resize.d.ts +4 -0
  475. package/dist/map/resize.js +136 -0
  476. package/dist/map/resize.js.map +1 -0
  477. package/dist/map/schema.js +257 -0
  478. package/dist/map/schema.js.map +1 -0
  479. package/dist/map/terrain.js +214 -0
  480. package/dist/map/terrain.js.map +1 -0
  481. package/dist/map/types.d.ts +92 -13
  482. package/dist/map/types.js +251 -0
  483. package/dist/map/types.js.map +1 -0
  484. package/dist/mapCheck/cells.js +94 -0
  485. package/dist/mapCheck/cells.js.map +1 -0
  486. package/dist/mapCheck/rules/foliage.d.ts +9 -0
  487. package/dist/mapCheck/rules/foliage.js +83 -0
  488. package/dist/mapCheck/rules/foliage.js.map +1 -0
  489. package/dist/mapCheck/rules/names.js +39 -0
  490. package/dist/mapCheck/rules/names.js.map +1 -0
  491. package/dist/mapCheck/rules/objects.d.ts +1 -1
  492. package/dist/mapCheck/rules/objects.js +56 -0
  493. package/dist/mapCheck/rules/objects.js.map +1 -0
  494. package/dist/mapCheck/rules/paths.js +32 -0
  495. package/dist/mapCheck/rules/paths.js.map +1 -0
  496. package/dist/mapCheck/rules/players.js +20 -0
  497. package/dist/mapCheck/rules/players.js.map +1 -0
  498. package/dist/mapCheck/rules/races.js +56 -0
  499. package/dist/mapCheck/rules/races.js.map +1 -0
  500. package/dist/mapCheck/rules/random.js +47 -0
  501. package/dist/mapCheck/rules/random.js.map +1 -0
  502. package/dist/mapCheck/rules/regions.js +30 -0
  503. package/dist/mapCheck/rules/regions.js.map +1 -0
  504. package/dist/mapCheck/rules/targets.js +31 -0
  505. package/dist/mapCheck/rules/targets.js.map +1 -0
  506. package/dist/mapCheck/rules/walking.js +45 -0
  507. package/dist/mapCheck/rules/walking.js.map +1 -0
  508. package/dist/mapCheck.d.ts +2 -2
  509. package/dist/mapCheck.js +63 -0
  510. package/dist/mapCheck.js.map +1 -0
  511. package/dist/mapFields.d.ts +25 -2
  512. package/dist/mapFields.js +134 -0
  513. package/dist/mapFields.js.map +1 -0
  514. package/dist/mapFile.js +176 -0
  515. package/dist/mapFile.js.map +1 -0
  516. package/dist/mapMeasure.d.ts +8 -0
  517. package/dist/mapMeasure.js +283 -0
  518. package/dist/mapMeasure.js.map +1 -0
  519. package/dist/mapMerge.d.ts +1 -0
  520. package/dist/mapMerge.js +172 -0
  521. package/dist/mapMerge.js.map +1 -0
  522. package/dist/mapObjectives.js +138 -0
  523. package/dist/mapObjectives.js.map +1 -0
  524. package/dist/mapObjects.js +80 -0
  525. package/dist/mapObjects.js.map +1 -0
  526. package/dist/math.d.ts +37 -7
  527. package/dist/math.js +155 -0
  528. package/dist/math.js.map +1 -0
  529. package/dist/messages.d.ts +71 -4
  530. package/dist/messages.js +29 -0
  531. package/dist/messages.js.map +1 -0
  532. package/dist/missionRules.d.ts +10 -2
  533. package/dist/{missionRules-C-bGxm0Q.js → missionRules.js} +30 -150
  534. package/dist/missionRules.js.map +1 -0
  535. package/dist/mods.d.ts +39 -20
  536. package/dist/mods.js +271 -0
  537. package/dist/mods.js.map +1 -0
  538. package/dist/moves.d.ts +87 -0
  539. package/dist/moves.js +539 -0
  540. package/dist/moves.js.map +1 -0
  541. package/dist/names.d.ts +7 -0
  542. package/dist/names.js +122 -0
  543. package/dist/names.js.map +1 -0
  544. package/dist/navigation/agentParams.js +14 -0
  545. package/dist/navigation/agentParams.js.map +1 -0
  546. package/dist/navigation/air.d.ts +7 -3
  547. package/dist/navigation/air.js +401 -0
  548. package/dist/navigation/air.js.map +1 -0
  549. package/dist/navigation/builds.d.ts +34 -2
  550. package/dist/navigation/builds.js +287 -0
  551. package/dist/navigation/builds.js.map +1 -0
  552. package/dist/navigation/groundAreas.d.ts +59 -1
  553. package/dist/navigation/groundAreas.js +407 -0
  554. package/dist/navigation/groundAreas.js.map +1 -0
  555. package/dist/navigation/navigation.d.ts +98 -9
  556. package/dist/navigation/recast.d.ts +194 -18
  557. package/dist/navigation/recast.js +1379 -0
  558. package/dist/navigation/recast.js.map +1 -0
  559. package/dist/navigation/sidePaths.d.ts +8 -3
  560. package/dist/navigation/sidePaths.js +241 -0
  561. package/dist/navigation/sidePaths.js.map +1 -0
  562. package/dist/navigation/sized.js +243 -0
  563. package/dist/navigation/sized.js.map +1 -0
  564. package/dist/nearest.js +32 -0
  565. package/dist/nearest.js.map +1 -0
  566. package/dist/noise.js +59 -0
  567. package/dist/noise.js.map +1 -0
  568. package/dist/objectives.d.ts +12 -3
  569. package/dist/objectives.js +144 -0
  570. package/dist/objectives.js.map +1 -0
  571. package/dist/orders/basic.d.ts +5 -5
  572. package/dist/orders/basic.js +417 -0
  573. package/dist/orders/basic.js.map +1 -0
  574. package/dist/orders/build.js +278 -0
  575. package/dist/orders/build.js.map +1 -0
  576. package/dist/orders/cast.d.ts +13 -3
  577. package/dist/orders/cast.js +558 -0
  578. package/dist/orders/cast.js.map +1 -0
  579. package/dist/orders/facts.js +16 -0
  580. package/dist/orders/facts.js.map +1 -0
  581. package/dist/orders/harvest.d.ts +21 -5
  582. package/dist/orders/harvest.js +540 -0
  583. package/dist/orders/harvest.js.map +1 -0
  584. package/dist/orders/idle.d.ts +3 -1
  585. package/dist/orders/idle.js +234 -0
  586. package/dist/orders/idle.js.map +1 -0
  587. package/dist/orders/items.js +92 -0
  588. package/dist/orders/items.js.map +1 -0
  589. package/dist/orders/queue.js +108 -0
  590. package/dist/orders/queue.js.map +1 -0
  591. package/dist/orders/waiting.d.ts +39 -0
  592. package/dist/orders/waiting.js +149 -0
  593. package/dist/orders/waiting.js.map +1 -0
  594. package/dist/pack.schema.js +13 -0
  595. package/dist/pack.schema.js.map +1 -0
  596. package/dist/pack.schema.json +7622 -841
  597. package/dist/packs/director/index.d.ts +13 -5
  598. package/dist/packs/director/index.js +204 -0
  599. package/dist/packs/director/index.js.map +1 -0
  600. package/dist/packs/heroes/campaign.d.ts +3 -2
  601. package/dist/packs/heroes/campaign.js +241 -0
  602. package/dist/packs/heroes/campaign.js.map +1 -0
  603. package/dist/packs/heroes/carry.d.ts +6 -0
  604. package/dist/packs/heroes/carry.js +112 -0
  605. package/dist/packs/heroes/carry.js.map +1 -0
  606. package/dist/packs/heroes/commands.js +115 -0
  607. package/dist/packs/heroes/commands.js.map +1 -0
  608. package/dist/packs/heroes/fallen.d.ts +43 -0
  609. package/dist/packs/heroes/fallen.js +61 -0
  610. package/dist/packs/heroes/fallen.js.map +1 -0
  611. package/dist/packs/heroes/hire.js +60 -0
  612. package/dist/packs/heroes/hire.js.map +1 -0
  613. package/dist/packs/heroes/index.d.ts +7 -6
  614. package/dist/packs/heroes/index.js +130 -0
  615. package/dist/packs/heroes/index.js.map +1 -0
  616. package/dist/packs/heroes/loop.d.ts +95 -0
  617. package/dist/packs/heroes/loop.js +250 -0
  618. package/dist/packs/heroes/loop.js.map +1 -0
  619. package/dist/packs/heroes/making.d.ts +6 -3
  620. package/dist/packs/heroes/making.js +55 -0
  621. package/dist/packs/heroes/making.js.map +1 -0
  622. package/dist/packs/heroes/respawn.d.ts +3 -3
  623. package/dist/packs/heroes/respawn.js +87 -0
  624. package/dist/packs/heroes/respawn.js.map +1 -0
  625. package/dist/packs/heroes/sets.d.ts +32 -0
  626. package/dist/packs/heroes/sets.js +51 -0
  627. package/dist/packs/heroes/sets.js.map +1 -0
  628. package/dist/packs/heroes/spells.d.ts +16 -0
  629. package/dist/packs/heroes/spells.js +269 -0
  630. package/dist/packs/heroes/spells.js.map +1 -0
  631. package/dist/packs/items/defaults.d.ts +43 -0
  632. package/dist/packs/items/defaults.js +1504 -0
  633. package/dist/packs/items/defaults.js.map +1 -0
  634. package/dist/packs/items/index.d.ts +27 -0
  635. package/dist/packs/items/index.js +214 -0
  636. package/dist/packs/items/index.js.map +1 -0
  637. package/dist/packs/moba/index.d.ts +3 -3
  638. package/dist/packs/moba/index.js +174 -0
  639. package/dist/packs/moba/index.js.map +1 -0
  640. package/dist/packs/pack.d.ts +15 -15
  641. package/dist/packs/pack.js +14 -0
  642. package/dist/packs/pack.js.map +1 -0
  643. package/dist/packs.d.ts +15 -7
  644. package/dist/packs.js +222 -0
  645. package/dist/packs.js.map +1 -0
  646. package/dist/paths.d.ts +2 -0
  647. package/dist/paths.js +109 -0
  648. package/dist/paths.js.map +1 -0
  649. package/dist/plain.js +57 -0
  650. package/dist/plain.js.map +1 -0
  651. package/dist/player.d.ts +33 -10
  652. package/dist/player.js +159 -0
  653. package/dist/player.js.map +1 -0
  654. package/dist/portals.d.ts +1 -1
  655. package/dist/portals.js +194 -0
  656. package/dist/portals.js.map +1 -0
  657. package/dist/prefabs.d.ts +25 -2
  658. package/dist/prefabs.js +239 -0
  659. package/dist/prefabs.js.map +1 -0
  660. package/dist/presetBuildings.js +58 -0
  661. package/dist/presetBuildings.js.map +1 -0
  662. package/dist/presetFoliage.d.ts +27 -0
  663. package/dist/presetFoliage.js +98 -0
  664. package/dist/presetFoliage.js.map +1 -0
  665. package/dist/presetGround.js +65 -0
  666. package/dist/presetGround.js.map +1 -0
  667. package/dist/proxies.d.ts +12 -0
  668. package/dist/proxies.js +79 -0
  669. package/dist/proxies.js.map +1 -0
  670. package/dist/query.d.ts +56 -0
  671. package/dist/query.js +88 -0
  672. package/dist/query.js.map +1 -0
  673. package/dist/races.d.ts +15 -14
  674. package/dist/races.js +172 -0
  675. package/dist/races.js.map +1 -0
  676. package/dist/randomGroups.js +91 -0
  677. package/dist/randomGroups.js.map +1 -0
  678. package/dist/registry.d.ts +117 -53
  679. package/dist/registry.js +323 -0
  680. package/dist/registry.js.map +1 -0
  681. package/dist/remains.d.ts +11 -9
  682. package/dist/remains.js +188 -0
  683. package/dist/remains.js.map +1 -0
  684. package/dist/replication.d.ts +12 -7
  685. package/dist/replication.js +100 -0
  686. package/dist/replication.js.map +1 -0
  687. package/dist/rng.d.ts +2 -0
  688. package/dist/rng.js +40 -0
  689. package/dist/rng.js.map +1 -0
  690. package/dist/rules.d.ts +186 -99
  691. package/dist/rules.js +179 -0
  692. package/dist/rules.js.map +1 -0
  693. package/dist/rulesCheck.d.ts +5 -4
  694. package/dist/rulesCheck.js +693 -0
  695. package/dist/rulesCheck.js.map +1 -0
  696. package/dist/runes.d.ts +2 -2
  697. package/dist/runes.js +80 -0
  698. package/dist/runes.js.map +1 -0
  699. package/dist/save.d.ts +37 -12
  700. package/dist/save.js +532 -0
  701. package/dist/save.js.map +1 -0
  702. package/dist/scenario.d.ts +2 -2
  703. package/dist/scenario.js +99 -0
  704. package/dist/scenario.js.map +1 -0
  705. package/dist/scheduler.d.ts +3 -0
  706. package/dist/scheduler.js +156 -0
  707. package/dist/scheduler.js.map +1 -0
  708. package/dist/score.d.ts +19 -19
  709. package/dist/score.js +709 -0
  710. package/dist/score.js.map +1 -0
  711. package/dist/sequences.d.ts +10 -6
  712. package/dist/sequences.js +206 -0
  713. package/dist/sequences.js.map +1 -0
  714. package/dist/server/doorman.js +154 -0
  715. package/dist/server/doorman.js.map +1 -0
  716. package/dist/server/gameServer.d.ts +16 -1
  717. package/dist/server/gameServer.js +643 -0
  718. package/dist/server/gameServer.js.map +1 -0
  719. package/dist/server/index.d.ts +1 -1
  720. package/dist/server/lobby.js +199 -0
  721. package/dist/server/lobby.js.map +1 -0
  722. package/dist/server/log.js +18 -0
  723. package/dist/server/log.js.map +1 -0
  724. package/dist/server/match.js +267 -0
  725. package/dist/server/match.js.map +1 -0
  726. package/dist/server/mode.d.ts +18 -9
  727. package/dist/server/mode.js +220 -0
  728. package/dist/server/mode.js.map +1 -0
  729. package/dist/{navigation-worker.js → server/navigation-worker.js} +1 -1
  730. package/dist/server/navigation-worker.js.map +1 -0
  731. package/dist/server/navigation.js +39 -0
  732. package/dist/server/navigation.js.map +1 -0
  733. package/dist/server/ops.d.ts +4 -0
  734. package/dist/server/ops.js +137 -0
  735. package/dist/server/ops.js.map +1 -0
  736. package/dist/server/packs.d.ts +3 -3
  737. package/dist/server/packs.js +32 -0
  738. package/dist/server/packs.js.map +1 -0
  739. package/dist/server/ratings.d.ts +5 -0
  740. package/dist/server/ratings.js +104 -0
  741. package/dist/server/ratings.js.map +1 -0
  742. package/dist/server/relay.d.ts +12 -2
  743. package/dist/server/relay.js +144 -0
  744. package/dist/server/relay.js.map +1 -0
  745. package/dist/server/rooms.d.ts +9 -2
  746. package/dist/server/rooms.js +442 -0
  747. package/dist/server/rooms.js.map +1 -0
  748. package/dist/server/seat.js +116 -0
  749. package/dist/server/seat.js.map +1 -0
  750. package/dist/server/seatSettings.d.ts +3 -3
  751. package/dist/server/seatSettings.js +63 -0
  752. package/dist/server/seatSettings.js.map +1 -0
  753. package/dist/server/secret.js +13 -0
  754. package/dist/server/secret.js.map +1 -0
  755. package/dist/server/start.d.ts +13 -6
  756. package/dist/server/start.js +76 -0
  757. package/dist/server/start.js.map +1 -0
  758. package/dist/server/websocket.d.ts +9 -1
  759. package/dist/server/websocket.js +306 -0
  760. package/dist/server/websocket.js.map +1 -0
  761. package/dist/server.js +15 -2861
  762. package/dist/session/can.js +26 -0
  763. package/dist/session/can.js.map +1 -0
  764. package/dist/session/commandReplay.d.ts +8 -2
  765. package/dist/session/commandReplay.js +293 -0
  766. package/dist/session/commandReplay.js.map +1 -0
  767. package/dist/session/debug.js +151 -0
  768. package/dist/session/debug.js.map +1 -0
  769. package/dist/session/delay.js +62 -0
  770. package/dist/session/delay.js.map +1 -0
  771. package/dist/session/delta.d.ts +14 -1
  772. package/dist/session/delta.js +407 -0
  773. package/dist/session/delta.js.map +1 -0
  774. package/dist/session/entityState.js +415 -0
  775. package/dist/session/entityState.js.map +1 -0
  776. package/dist/session/local.d.ts +47 -5
  777. package/dist/session/local.js +670 -0
  778. package/dist/session/local.js.map +1 -0
  779. package/dist/session/memory.d.ts +20 -2
  780. package/dist/session/memory.js +131 -0
  781. package/dist/session/memory.js.map +1 -0
  782. package/dist/session/protocol.d.ts +325 -31
  783. package/dist/session/protocol.js +55 -0
  784. package/dist/session/protocol.js.map +1 -0
  785. package/dist/session/remote.d.ts +74 -12
  786. package/dist/session/remote.js +1394 -0
  787. package/dist/session/remote.js.map +1 -0
  788. package/dist/session/replay.d.ts +11 -2
  789. package/dist/session/replay.js +160 -0
  790. package/dist/session/replay.js.map +1 -0
  791. package/dist/session/seed.js +12 -0
  792. package/dist/session/seed.js.map +1 -0
  793. package/dist/session/share.d.ts +5 -1
  794. package/dist/session/share.js +94 -0
  795. package/dist/session/share.js.map +1 -0
  796. package/dist/session/socket.d.ts +1 -1
  797. package/dist/session/socket.js +29 -0
  798. package/dist/session/socket.js.map +1 -0
  799. package/dist/session/wire.d.ts +5 -0
  800. package/dist/session/wire.js +84 -0
  801. package/dist/session/wire.js.map +1 -0
  802. package/dist/session/worker.d.ts +77 -12
  803. package/dist/session/worker.js +499 -0
  804. package/dist/session/worker.js.map +1 -0
  805. package/dist/shared.d.ts +31 -5
  806. package/dist/shared.js +166 -0
  807. package/dist/shared.js.map +1 -0
  808. package/dist/sides.d.ts +9 -3
  809. package/dist/sides.js +149 -0
  810. package/dist/sides.js.map +1 -0
  811. package/dist/sight.js +85 -0
  812. package/dist/sight.js.map +1 -0
  813. package/dist/simulate-worker.js +1 -1
  814. package/dist/simulate.d.ts +12 -8
  815. package/dist/{simulate-oXBiw1Ff.js → simulate.js} +10 -11
  816. package/dist/simulate.js.map +1 -0
  817. package/dist/smart.js +77 -0
  818. package/dist/smart.js.map +1 -0
  819. package/dist/spatial.d.ts +32 -16
  820. package/dist/spatial.js +234 -0
  821. package/dist/spatial.js.map +1 -0
  822. package/dist/spawning.d.ts +1 -0
  823. package/dist/spawning.js +224 -0
  824. package/dist/spawning.js.map +1 -0
  825. package/dist/stances.d.ts +6 -3
  826. package/dist/stances.js +169 -0
  827. package/dist/stances.js.map +1 -0
  828. package/dist/start.d.ts +10 -10
  829. package/dist/start.js +75 -0
  830. package/dist/start.js.map +1 -0
  831. package/dist/stats.d.ts +42 -16
  832. package/dist/stats.js +290 -0
  833. package/dist/stats.js.map +1 -0
  834. package/dist/summoned.d.ts +52 -0
  835. package/dist/summoned.js +38 -0
  836. package/dist/summoned.js.map +1 -0
  837. package/dist/summons.d.ts +10 -13
  838. package/dist/summons.js +271 -0
  839. package/dist/summons.js.map +1 -0
  840. package/dist/systems/abilities.js +224 -0
  841. package/dist/systems/abilities.js.map +1 -0
  842. package/dist/systems/combat.d.ts +35 -1
  843. package/dist/systems/combat.js +677 -0
  844. package/dist/systems/combat.js.map +1 -0
  845. package/dist/systems/combatTold.d.ts +3 -1
  846. package/dist/systems/combatTold.js +85 -0
  847. package/dist/systems/combatTold.js.map +1 -0
  848. package/dist/systems/construction.js +80 -0
  849. package/dist/systems/construction.js.map +1 -0
  850. package/dist/systems/economy.d.ts +0 -6
  851. package/dist/systems/economy.js +128 -0
  852. package/dist/systems/economy.js.map +1 -0
  853. package/dist/systems/fog.d.ts +1 -1
  854. package/dist/systems/fog.js +120 -0
  855. package/dist/systems/fog.js.map +1 -0
  856. package/dist/systems/life.js +32 -0
  857. package/dist/systems/life.js.map +1 -0
  858. package/dist/systems/movement.d.ts +24 -12
  859. package/dist/systems/movement.js +1247 -0
  860. package/dist/systems/movement.js.map +1 -0
  861. package/dist/systems/orders.js +64 -0
  862. package/dist/systems/orders.js.map +1 -0
  863. package/dist/systems/production.js +322 -0
  864. package/dist/systems/production.js.map +1 -0
  865. package/dist/systems/productionQueue.js +120 -0
  866. package/dist/systems/productionQueue.js.map +1 -0
  867. package/dist/systems/victory.d.ts +1 -1
  868. package/dist/systems/victory.js +56 -0
  869. package/dist/systems/victory.js.map +1 -0
  870. package/dist/talk.d.ts +6 -6
  871. package/dist/talk.js +153 -0
  872. package/dist/talk.js.map +1 -0
  873. package/dist/targeting.d.ts +142 -0
  874. package/dist/targeting.js +49 -0
  875. package/dist/targeting.js.map +1 -0
  876. package/dist/tech.d.ts +20 -3
  877. package/dist/tech.js +239 -0
  878. package/dist/tech.js.map +1 -0
  879. package/dist/techTree.d.ts +7 -0
  880. package/dist/techTree.js +90 -0
  881. package/dist/techTree.js.map +1 -0
  882. package/dist/terrain.d.ts +59 -7
  883. package/dist/terrain.js +389 -0
  884. package/dist/terrain.js.map +1 -0
  885. package/dist/terrainSave.d.ts +6 -0
  886. package/dist/terrainSave.js +74 -0
  887. package/dist/terrainSave.js.map +1 -0
  888. package/dist/testing.d.ts +8 -7
  889. package/dist/testing.js +13 -739
  890. package/dist/testing.js.map +1 -1
  891. package/dist/tiles.d.ts +1 -1
  892. package/dist/tiles.js +43 -0
  893. package/dist/tiles.js.map +1 -0
  894. package/dist/timers.d.ts +29 -4
  895. package/dist/timers.js +242 -0
  896. package/dist/timers.js.map +1 -0
  897. package/dist/tomes.d.ts +4 -4
  898. package/dist/tomes.js +94 -0
  899. package/dist/tomes.js.map +1 -0
  900. package/dist/trade.js +103 -0
  901. package/dist/trade.js.map +1 -0
  902. package/dist/transport.d.ts +6 -1
  903. package/dist/transport.js +281 -0
  904. package/dist/transport.js.map +1 -0
  905. package/dist/tunables.d.ts +10 -3
  906. package/dist/tunables.js +56 -0
  907. package/dist/tunables.js.map +1 -0
  908. package/dist/unitResources.d.ts +67 -0
  909. package/dist/unitResources.js +266 -0
  910. package/dist/unitResources.js.map +1 -0
  911. package/dist/upkeep.d.ts +6 -1
  912. package/dist/upkeep.js +26 -0
  913. package/dist/upkeep.js.map +1 -0
  914. package/dist/veterancy.d.ts +8 -3
  915. package/dist/veterancy.js +131 -0
  916. package/dist/veterancy.js.map +1 -0
  917. package/dist/vision.d.ts +36 -0
  918. package/dist/vision.js +133 -0
  919. package/dist/vision.js.map +1 -0
  920. package/dist/walls.d.ts +1 -1
  921. package/dist/walls.js +278 -0
  922. package/dist/walls.js.map +1 -0
  923. package/dist/world.d.ts +606 -88
  924. package/dist/world.js +1263 -0
  925. package/dist/world.js.map +1 -0
  926. package/package.json +2 -2
  927. package/dist/ai.js.map +0 -1
  928. package/dist/attributes.d.ts +0 -66
  929. package/dist/brain-BvVdUhX8.js +0 -7659
  930. package/dist/brain-BvVdUhX8.js.map +0 -1
  931. package/dist/builds-C6LfgvEU.js +0 -460
  932. package/dist/builds-C6LfgvEU.js.map +0 -1
  933. package/dist/coreComponents-syuh2fPG.js +0 -5149
  934. package/dist/coreComponents-syuh2fPG.js.map +0 -1
  935. package/dist/debugCommands-CzjrSm66.js +0 -14739
  936. package/dist/debugCommands-CzjrSm66.js.map +0 -1
  937. package/dist/determinism-BCymQwiE.js +0 -518
  938. package/dist/determinism-BCymQwiE.js.map +0 -1
  939. package/dist/game-DiJEN-Ks.js +0 -5800
  940. package/dist/game-DiJEN-Ks.js.map +0 -1
  941. package/dist/index.js.map +0 -1
  942. package/dist/inspect-D9dWHmZ0.js.map +0 -1
  943. package/dist/local-Dkovq42k.js +0 -1379
  944. package/dist/local-Dkovq42k.js.map +0 -1
  945. package/dist/missionRules-C-bGxm0Q.js.map +0 -1
  946. package/dist/navigation-worker.js.map +0 -1
  947. package/dist/packs-g5thvmGn.js +0 -3199
  948. package/dist/packs-g5thvmGn.js.map +0 -1
  949. package/dist/profiles-B3NS9jwk.js.map +0 -1
  950. package/dist/server.js.map +0 -1
  951. package/dist/simulate-oXBiw1Ff.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rulesCheck.js","names":[],"sources":["../src/rulesCheck.ts"],"sourcesContent":["import { type CallingDef, callingsOf } from './callings'\nimport { type AbilityDef, anyEffect, type Cleave, EFFECT_MOMENTS, type EffectDef, type EffectShape, lowerChain, type Scaled, upgradesOf } from './defs'\nimport { AIM_KINDS } from './targeting'\nimport { DATA_KINDS, type DataKind } from './gameData'\nimport { coreEffects } from './abilities/effects/core'\nimport { coreComponents } from './coreComponents'\nimport { dispelEffects } from './abilities/dispel'\nimport type { Rules } from './game'\nimport { nearestId } from './nearest'\nimport { summonEffects } from './summons'\nimport { BUFF_BREAKS, TRIGGER_TYPES } from './abilities/triggers'\nimport { CONTROL_KINDS } from './abilities/control'\n\n/** The sizes each shape of an effect reads, without which it covers nothing (`EffectCommon.shape`) */\nconst SHAPE_SIZES: Readonly<Record<EffectShape, readonly ('radius' | 'length' | 'angle')[]>> = {\n\tcircle: ['radius'],\n\tcone: ['length', 'angle'],\n\tline: ['length'],\n\trect: ['length'],\n\tring: ['radius'],\n\tarc: ['radius', 'angle'],\n\tcross: ['length']\n}\n\n/** Which way a knockback may throw (`KnockbackDirection`, the moves pack's) */\nconst KNOCKBACK_DIRECTIONS: readonly string[] = ['away', 'aim', 'over', 'towards']\n\n/** The fields the moves pack reads (AB12), and of which effects */\nconst MOVES_FIELDS = {\n\tthrough: ['dash'],\n\tcollide: ['dash', 'knockback'],\n\tstops: ['dash', 'knockback'],\n\tdirection: ['knockback'],\n\trider: ['attach']\n} as const satisfies Record<string, readonly string[]>\n\n/** The moves pack's id (`MOVES`), said here so that the check does not bring the pack in with it */\nconst MOVES = 'core.moves'\n\n/** The ground objects pack's id (`GROUND_OBJECTS`), likewise */\nconst GROUND_OBJECTS = 'core.groundObjects'\n\n/** The resources pack's id (`RESOURCES`), likewise */\nconst RESOURCES = 'core.resources'\n\n/** The holds pack's id (`HOLDS`), likewise */\nconst HOLDS = 'core.holds'\n\n/** The ability changes pack's id (`ABILITY_CHANGES`), likewise */\nconst ABILITY_CHANGES = 'core.abilityChanges'\n\n/** The vision pack's id (`VISION`), likewise */\nconst VISION = 'core.vision'\n\n/**\n * What of a game's rules does not fit together (`checkRules`): an id that names nothing (an ability's buff, a unit's\n * `trains`, an upgrade's `requires`, a shop's items), an effect of a type nobody handles, requirements that wait on\n * each other, and, as warnings, what nothing makes, abilities nothing has, and numbers that do not do what they are\n * there for (an `arc` or a `bounce` not of a missile, or of nothing, `charges` of none). Ids are text to the compiler, so a slip\n * in one shows only when the game runs into it (\"Unknown unit type\") or never (a button that is not there)\n *\n * @beta\n */\nexport interface RulesProblem {\n\t/** `error`: the game will throw or misbehave when it gets there; `warning`: likely a slip, possibly meant */\n\tlevel: 'error' | 'warning'\n\t/** Where in the rules: `units.footman.trains`, `abilities.holy-light.effects[0].buff` */\n\twhere: string\n\t/** The id that is wrong, or the definition the warning is about */\n\tid: string\n\t/** What is wrong, in words for the person writing the rules */\n\tmessage: string\n\t/**\n\t * The definition it is in and the field, as the editor's Data panel names them (`{ kind: 'abilities', id:\n\t * 'holy-light', path: 'effects.0.buff' }`), where it is in one\n\t */\n\tat?: { kind: DataKind; id: string; path: string }\n}\n\n/**\n * Checks a game's rules against themselves (`RulesProblem`): run by a game's `check()` and as a page fetches its view, and in a\n * game's tests (`expect(checkRules(rules).filter((p) => p.level === 'error')).toEqual([])`). Nothing is thrown\n *\n * @public\n */\nexport function checkRules(rules: Rules): RulesProblem[] {\n\tconst problems: RulesProblem[] = []\n\tconst ids = (list: readonly { id: string }[] | undefined) => new Set((list ?? []).map((def) => def.id))\n\tconst units = ids(rules.units)\n\tconst abilities = ids(rules.abilities)\n\tconst buffs = ids(rules.buffs)\n\tconst items = ids(rules.items)\n\tconst upgrades = ids(rules.upgrades)\n\tconst resources = ids(rules.resources)\n\t/** The callings heroes may have: the heroes pack's, or the engine's (`callingsOf`) */\n\tconst callings = ids(callingsOf(rules) as readonly CallingDef[])\n\t/** The components something can be given by id: the engine's own, its packs' and the game's */\n\tconst components = ids([...coreComponents(), ...(rules.packs ?? []).flatMap((pack) => pack.components ?? []), ...(rules.components ?? [])])\n\t/** The types of effect something handles: the engine's own, its packs' (`GamePack.effects`) and the game's (`Rules.effects`) */\n\tconst handled = new Set<string>(\n\t\t[...coreEffects, ...summonEffects, ...dispelEffects, ...(rules.packs ?? []).flatMap((pack) => pack.effects ?? []), ...(rules.effects ?? [])].map(\n\t\t\t(kind) => kind.type\n\t\t)\n\t)\n\tconst effectTypes = (type: string) => handled.has(type)\n\t/** Whether the game has the moves pack (AB12), which reads the fields of `MOVES_FIELDS` */\n\tconst moves = (rules.packs ?? []).some((pack) => pack.id === MOVES)\n\t/** Whether the game has the ground objects pack (AB13) */\n\tconst groundObjects = (rules.packs ?? []).some((pack) => pack.id === GROUND_OBJECTS)\n\t/** Whether the game has the resources pack (AB14), and the pools its unit types have */\n\tconst resourcesOn = (rules.packs ?? []).some((pack) => pack.id === RESOURCES)\n\tconst poolIds = new Set(rules.units.flatMap((unit) => Object.keys(unit.pools ?? {})))\n\t/** A pool named that no unit type has: what costs or gives it does nothing */\n\tconst pool = (where: string, id: string) => {\n\t\tif (!poolIds.has(id)) odd(where, id, `${where} names the pool \"${id}\", which no unit type has (UnitTypeDef.pools): it does nothing`)\n\t}\n\t/** Whether the game has the holds pack (AB15) */\n\tconst holdsOn = (rules.packs ?? []).some((pack) => pack.id === HOLDS)\n\t/** A field the resources pack reads, in a game without it */\n\tconst needsResources = (where: string, id: string) => {\n\t\tif (!resourcesOn) odd(where, id, `${where} is read in a game with the resources pack (resourcesPack) alone: without it nothing reads it`)\n\t}\n\t/** Whether the game has the vision pack (AB18) */\n\tconst vision = (rules.packs ?? []).some((pack) => pack.id === VISION)\n\n\tconst known = (where: string, id: string | undefined, set: Set<string>, what: string) => {\n\t\tif (id === undefined || set.has(id)) return\n\t\tconst meant = nearestId(id, set)\n\t\tproblems.push({\n\t\t\tlevel: 'error',\n\t\t\twhere,\n\t\t\tid,\n\t\t\tmessage: `${where} names \"${id}\", which is no ${what} of the rules${meant ? `. Did you mean \"${meant}\"?` : ''}`\n\t\t})\n\t}\n\t/** A number that does not do what it is there for: said as a warning, the engine making do with it */\n\tconst odd = (where: string, id: string, message: string) => problems.push({ level: 'warning', where, id, message })\n\t/** Whether a number, or any of its levels (`Scaled`), is under a bound: at `least`, or above it where `above` */\n\tconst under = (value: Scaled | undefined, least: number, above = false) =>\n\t\tvalue !== undefined && (Array.isArray(value) ? value : [value]).some((each) => (above ? each <= least : each < least))\n\n\tconst all = (where: string, list: readonly string[] | undefined, set: Set<string>, what: string) =>\n\t\tlist?.forEach((id, index) => known(`${where}[${index}]`, id, set, what))\n\n\t/** The tags the unit types have (`UnitTypeDef.tags`): one named that none has is likely a slip (AB6) */\n\tconst tagged = new Set(rules.units.flatMap((unit) => unit.tags ?? []))\n\tconst tags = (where: string, list: readonly string[] | undefined) =>\n\t\tlist?.forEach((tag, index) => {\n\t\t\tif (!tagged.has(tag))\n\t\t\t\todd(`${where}[${index}]`, tag, `${where}[${index}] is \"${tag}\", a tag no unit type has (UnitTypeDef.tags)${nearestId(tag, tagged) ? `. Did you mean \"${nearestId(tag, tagged)}\"?` : ''}`)\n\t\t})\n\n\t/** A cleave (`AttackDef.cleave`, `BuffDef.cleave`) that reaches nobody or takes away */\n\tconst cleave = (where: string, id: string, value: Cleave | undefined) => {\n\t\tif (!value) return\n\t\tif (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`)\n\t\tif (!(value.radius > 0)) odd(`${where}.radius`, id, `${where}.radius is not above 0: it reaches nobody around the target`)\n\t\tif (value.angle !== undefined && !(value.angle > 0)) odd(`${where}.angle`, id, `${where}.angle is not above 0: its cone reaches nobody`)\n\t}\n\n\t/** What a requirement names: a unit type (a building to have) or an upgrade */\n\tconst requirable = new Set([...units, ...upgrades])\n\n\tfor (const unit of rules.units) {\n\t\tconst at = `units.${unit.id}`\n\t\tall(`${at}.trains`, unit.trains, units, 'unit type')\n\t\tall(`${at}.targetableBy`, unit.targetableBy, abilities, 'ability')\n\t\tif (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)')\n\t\tall(`${at}.builds`, unit.builds, units, 'unit type')\n\t\tall(`${at}.hires`, unit.hires, units, 'unit type')\n\t\tall(`${at}.researches`, unit.researches, upgrades, 'upgrade')\n\t\tall(`${at}.requires`, unit.requires, requirable, 'unit type or upgrade')\n\t\tall(`${at}.sells`, unit.sells, items, 'item')\n\t\tall(`${at}.abilities`, unit.abilities, abilities, 'ability')\n\t\tif (typeof unit.upgradesTo === 'string') known(`${at}.upgradesTo`, unit.upgradesTo, units, 'unit type')\n\t\telse all(`${at}.upgradesTo`, unit.upgradesTo, units, 'unit type')\n\t\tif (Array.isArray(unit.drops)) unit.drops.forEach((drop, index) => known(`${at}.drops[${index}].item`, drop.item, items, 'item'))\n\t\t// what the ground objects pack makes of a unit type (AB13): abilities there are, in a game with the pack\n\t\tknown(`${at}.trigger.ability`, unit.trigger?.ability, abilities, 'ability')\n\t\tknown(`${at}.use.ability`, unit.use?.ability, abilities, 'ability')\n\t\tknown(`${at}.burst.ability`, unit.burst?.ability, abilities, 'ability')\n\t\tif (unit.trueSight !== undefined && !vision)\n\t\t\todd(`${at}.trueSight`, unit.id, `${at}.trueSight is read in a game with the vision pack (visionPack) alone: without it it finds nothing`)\n\t\tfor (const field of ['trigger', 'use', 'blocksMissiles', 'burst'] as const)\n\t\t\tif (unit[field] !== undefined && !groundObjects)\n\t\t\t\todd(`${at}.${field}`, unit.id, `${at}.${field} is read in a game with the ground objects pack (groundObjectsPack) alone: without it nothing reads it`)\n\t\tif (unit.trigger?.by !== undefined && !['enemies', 'allies', 'all', 'maker'].includes(unit.trigger.by))\n\t\t\todd(`${at}.trigger.by`, unit.id, `${at}.trigger.by is enemies, allies, all or maker: \"${unit.trigger.by}\" is none, enemies are`)\n\t\tif (unit.use?.by !== undefined && !['enemies', 'allies', 'all'].includes(unit.use.by))\n\t\t\todd(`${at}.use.by`, unit.id, `${at}.use.by is enemies, allies or all: \"${unit.use.by}\" is none, allies are`)\n\t\tif (unit.blocksMissiles !== undefined && !['enemies', 'all'].includes(unit.blocksMissiles))\n\t\t\todd(`${at}.blocksMissiles`, unit.id, `${at}.blocksMissiles is enemies or all: \"${unit.blocksMissiles}\" stops nothing`)\n\t\t// the resources pack's (AB14): pools and what an attack costs of them\n\t\tif (unit.pools) {\n\t\t\tneedsResources(`${at}.pools`, unit.id)\n\t\t\tfor (const [id, def] of Object.entries(unit.pools)) {\n\t\t\t\tif (!(def.max > 0)) odd(`${at}.pools.${id}.max`, unit.id, `${at}.pools.${id}.max is not above 0: it never holds anything`)\n\t\t\t\tdef.thresholds?.forEach((threshold, index) => {\n\t\t\t\t\tknown(`${at}.pools.${id}.thresholds[${index}].buff`, threshold.buff, buffs, 'buff')\n\t\t\t\t\tif (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`)\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\t\tunit.attacks?.forEach((attack, index) => {\n\t\t\tcleave(`${at}.attacks[${index}].cleave`, unit.id, attack.cleave)\n\t\t\tif (attack.cleave && attack.projectileSpeed)\n\t\t\t\todd(`${at}.attacks[${index}].cleave`, unit.id, `${at}.attacks[${index}] flies (projectileSpeed): only a blow from up close cleaves, so it never does`)\n\t\t})\n\t\tif (unit.attackCost) {\n\t\t\tneedsResources(`${at}.attackCost`, unit.id)\n\t\t\tfor (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`)\n\t\t}\n\t\tif (unit.hero) {\n\t\t\tall(`${at}.hero.learns`, unit.hero.learns, abilities, 'ability')\n\t\t\tall(`${at}.hero.spells`, unit.hero.spells, abilities, 'ability')\n\t\t\tknown(`${at}.hero.innate`, unit.hero.innate, abilities, 'ability')\n\t\t\tif (unit.hero.innate && unit.hero.learns.includes(unit.hero.innate))\n\t\t\t\todd(`${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`)\n\t\t\tknown(`${at}.hero.meter`, unit.hero.meter, buffs, 'buff')\n\t\t\t// its callings (items-and-spells phase 4): the game's, each 1 to 3\n\t\t\tfor (const [calling, strength] of Object.entries(unit.hero.callings ?? {})) {\n\t\t\t\tknown(`${at}.hero.callings`, calling, callings, 'calling')\n\t\t\t\tif (![1, 2, 3].includes(strength))\n\t\t\t\t\todd(`${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)}`)\n\t\t\t}\n\t\t\tfor (const [into, form] of Object.entries(unit.hero.forms ?? {})) {\n\t\t\t\tknown(`${at}.hero.forms`, into, units, 'unit type')\n\t\t\t\tall(`${at}.hero.forms.${into}.learns`, form.learns, abilities, 'ability')\n\t\t\t\tif (form.cooldowns !== undefined && !['keep', 'reset', 'shared'].includes(form.cooldowns))\n\t\t\t\t\todd(`${at}.hero.forms.${into}.cooldowns`, String(form.cooldowns), `cooldowns is keep, reset or shared: ${String(form.cooldowns)} is none, the default is used`)\n\t\t\t\tif (form.cooldowns === 'shared' && !Object.values(form.levels ?? {}).some((by) => typeof by === 'string') && (form.levels !== undefined || form.keeps !== undefined))\n\t\t\t\t\todd(`${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')\n\t\t\t\tall(`${at}.hero.forms.${into}.keeps`, form.keeps, abilities, 'ability')\n\t\t\t\t// what a form keeps or takes a level from is the hero's own\n\t\t\t\tconst own = new Set([...unit.hero.learns, ...(unit.hero.spells ?? []), ...(unit.abilities ?? [])])\n\t\t\t\tfor (const id of form.keeps ?? [])\n\t\t\t\t\tif (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`)\n\t\t\t\tfor (const [id, by] of Object.entries(form.levels ?? {})) {\n\t\t\t\t\tif (!(form.learns ?? []).includes(id)) odd(`${at}.hero.forms.${into}.levels`, id, `${id} is not one the form learns (its learns)`)\n\t\t\t\t\tif (typeof by !== 'string') continue\n\t\t\t\t\tknown(`${at}.hero.forms.${into}.levels.${id}`, by, abilities, 'ability')\n\t\t\t\t\tif (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`)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tconst effects = (where: string, list: readonly EffectDef[] | undefined) => {\n\t\t// what waits for a moment (`when`) has something before it in its list that comes to it, or it never happens\n\t\tif (list)\n\t\t\tlowerChain(list, (index, effect) => {\n\t\t\t\tconst at = `${where}[${index}].when`\n\t\t\t\tconst moment = Object.hasOwn(EFFECT_MOMENTS, effect.when!) ? EFFECT_MOMENTS[effect.when!] : undefined\n\t\t\t\tproblems.push({\n\t\t\t\t\tlevel: 'error',\n\t\t\t\t\twhere: at,\n\t\t\t\t\tid: effect.type,\n\t\t\t\t\tmessage: moment\n\t\t\t\t\t\t? `${at} is \"${effect.when}\", but nothing before it in its list comes to that (${moment.types.join(' or ')}): it never happens`\n\t\t\t\t\t\t: `${at} is \"${effect.when}\", which is no moment (${Object.keys(EFFECT_MOMENTS).join(', ')}): it never happens`\n\t\t\t\t})\n\t\t\t})\n\t\tlist?.map(anyEffect).forEach((effect, index) => {\n\t\t\tconst at = `${where}[${index}]`\n\t\t\tif (!effectTypes(effect.type)) {\n\t\t\t\tproblems.push({\n\t\t\t\t\tlevel: 'error',\n\t\t\t\t\twhere: `${at}.type`,\n\t\t\t\t\tid: effect.type,\n\t\t\t\t\tmessage: `${at} is of the type \"${effect.type}\", which nothing handles (Rules.effects)`\n\t\t\t\t})\n\t\t\t}\n\t\t\tknown(`${at}.buff`, effect.buff, buffs, 'buff')\n\t\t\tknown(`${at}.ifBuff`, effect.ifBuff, buffs, 'buff')\n\t\t\t// conditions and chance (AB6): what an `if` asks, of an `if` alone, buffs and tags there are, a share\n\t\t\ttags(`${at}.tags`, effect.tags)\n\t\t\tfor (const who of ['caster', 'target', 'where'] as const) {\n\t\t\t\tconst condition = effect[who]\n\t\t\t\tif (condition === undefined) continue\n\t\t\t\tif (who !== 'where' && effect.type !== 'if') odd(`${at}.${who}`, effect.type, `${at}.${who} is read of an if alone, not of ${effect.type}`)\n\t\t\t\tif (typeof condition === 'function') continue\n\t\t\t\tknown(`${at}.${who}.buff`, condition.buff, buffs, 'buff')\n\t\t\t\tknown(`${at}.${who}.noBuff`, condition.noBuff, buffs, 'buff')\n\t\t\t\ttags(`${at}.${who}.tags`, condition.tags)\n\t\t\t\ttags(`${at}.${who}.notTags`, condition.notTags)\n\t\t\t\tif (condition.is !== undefined && condition.is !== 'enemy' && condition.is !== 'ally')\n\t\t\t\t\todd(`${at}.${who}.is`, String(condition.is), `${at}.${who}.is is enemy or ally: \"${String(condition.is)}\" never holds`)\n\t\t\t}\n\t\t\t// cheat death and the dead brought back (AB9)\n\t\t\tif (effect.as !== undefined && effect.as !== 'themselves') odd(`${at}.as`, String(effect.as), `${at}.as is \"themselves\" or left out: \"${String(effect.as)}\" is none, its unit rises`)\n\t\t\tif (effect.type === 'raiseDead' && effect.unit === undefined && effect.as !== 'themselves')\n\t\t\t\tproblems.push({ level: 'error', where: `${at}.unit`, id: effect.type, message: `${at} raises no unit and not the dead as themselves (as): nothing rises` })\n\t\t\tif (effect.health !== undefined && !(effect.health > 0 && effect.health <= 1))\n\t\t\t\todd(`${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`)\n\t\t\tif (effect.type === 'if' && effect.caster === undefined && effect.target === undefined && effect.chance === undefined)\n\t\t\t\todd(`${at}`, effect.type, `${at} asks nothing (caster, target, chance): its effects always happen`)\n\t\t\tif (effect.chance !== undefined && typeof effect.chance !== 'function' && [effect.chance].flat().some((share) => !(share >= 0 && share <= 1)))\n\t\t\t\todd(`${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`)\n\t\t\t// a few of what it reaches (world queries): of an area alone, at least one\n\t\t\tif ((effect.sort !== undefined || effect.limit !== undefined) && effect.radius === undefined && effect.shape === undefined)\n\t\t\t\todd(`${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`)\n\t\t\tif (effect.limit !== undefined && [effect.limit].flat().some((count) => !(count >= 1)))\n\t\t\t\todd(`${at}.limit`, effect.type, `${at}.limit is how many it hits, 1 or more: under 1 it hits nothing`)\n\t\t\tknown(`${at}.whileBuff`, effect.whileBuff, buffs, 'buff')\n\t\t\t// what a `gain` fills (AB14): a pool some unit type has\n\t\t\tif (effect.pool !== undefined) pool(`${at}.pool`, effect.pool)\n\t\t\t// what a swap gives way (AB16): an ability there is\n\t\t\tknown(`${at}.from`, effect.from, abilities, 'ability')\n\t\t\tfor (const field of ['from', 'uses', 'atLevel', 'pick'] as const)\n\t\t\t\tif (effect[field] !== undefined && !['grantAbility', 'swapAbility', 'stealAbility'].includes(effect.type))\n\t\t\t\t\todd(`${at}.${field}`, effect.type, `${at}.${field} is read of grantAbility, swapAbility and stealAbility alone, not of ${effect.type}`)\n\t\t\tif (effect.pick !== undefined && !['ultimate', 'first', 'random'].includes(effect.pick))\n\t\t\t\todd(`${at}.pick`, effect.type, `${at}.pick is ultimate, first or random: \"${effect.pick}\" is none, the ultimate is taken`)\n\t\t\tknown(`${at}.unit`, effect.unit, units, 'unit type')\n\t\t\tknown(`${at}.into`, effect.into, units, 'unit type')\n\t\t\tif (effect.data) for (const id of Object.keys(effect.data)) known(`${at}.data.${id}`, id, components, 'component')\n\t\t\tknown(`${at}.ability`, effect.ability, abilities, 'ability')\n\t\t\tknown(`${at}.sell`, effect.sell, resources, 'resource')\n\t\t\tknown(`${at}.buy`, effect.buy, resources, 'resource')\n\t\t\t// what a missile is thrown and springs by (GP5), and how it behaves (AB11): of a missile alone, and of numbers that do something\n\t\t\tfor (const field of ['arc', 'bounce', 'falloff', 'hitsOnReturn', 'seek', 'split', 'steer'] as const)\n\t\t\t\tif (effect[field] !== undefined && effect.type !== 'missile')\n\t\t\t\t\todd(`${at}.${field}`, effect.type, `${at}.${field} is read of a missile alone, not of ${effect.type}`)\n\t\t\tif (effect.onWall !== undefined && !['missile', 'dash', 'knockback'].includes(effect.type))\n\t\t\t\todd(`${at}.onWall`, effect.type, `${at}.onWall is read of a missile, a dash and a knockback alone, not of ${effect.type}`)\n\t\t\t// the moves pack's (AB12): of the effects that read them, in a game with the pack\n\t\t\tfor (const field of ['through', 'collide', 'stops', 'direction', 'rider'] as const) {\n\t\t\t\tif (effect[field] === undefined) continue\n\t\t\t\tconst of = MOVES_FIELDS[field]\n\t\t\t\tif (!(of as readonly string[]).includes(effect.type)) odd(`${at}.${field}`, effect.type, `${at}.${field} is read of ${of.join(' and ')} alone, not of ${effect.type}`)\n\t\t\t\telse 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`)\n\t\t\t}\n\t\t\tif ((effect.type === 'dash' && (effect.to === 'target' || effect.onWall)) && !moves)\n\t\t\t\todd(`${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`)\n\t\t\tif (effect.type === 'knockback' && effect.onWall && !moves)\n\t\t\t\todd(`${at}.onWall`, effect.type, `${at}.onWall is read of a knockback in a game with the moves pack (movesPack) alone`)\n\t\t\tif (effect.direction !== undefined && !KNOCKBACK_DIRECTIONS.includes(effect.direction))\n\t\t\t\tproblems.push({\n\t\t\t\t\tlevel: 'error',\n\t\t\t\t\twhere: `${at}.direction`,\n\t\t\t\t\tid: effect.direction,\n\t\t\t\t\tmessage: `${at}.direction is \"${effect.direction}\", which is no way to throw (${KNOCKBACK_DIRECTIONS.join(', ')})`\n\t\t\t\t})\n\t\t\tif (effect.through !== undefined && effect.to !== 'target')\n\t\t\t\todd(`${at}.through`, effect.type, `${at}.through is there, but it does not rush to a unit (to: 'target'): it goes through nobody`)\n\t\t\t// the ground objects pack's (AB13): of a spawn, in a game with the pack\n\t\t\tfor (const field of ['line', 'ring'] as const) {\n\t\t\t\tif (effect[field] === undefined) continue\n\t\t\t\tif (effect.type !== 'spawn') odd(`${at}.${field}`, effect.type, `${at}.${field} is read of a spawn alone, not of ${effect.type}`)\n\t\t\t\telse if (!groundObjects)\n\t\t\t\t\todd(`${at}.${field}`, effect.type, `${at}.${field} is read in a game with the ground objects pack (groundObjectsPack) alone: without it one is made`)\n\t\t\t\telse if (!(effect[field]!.count >= 1)) odd(`${at}.${field}.count`, effect.type, `${at}.${field}.count is under 1: one is made`)\n\t\t\t}\n\t\t\tif (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`)\n\t\t\t// how a zone goes with a unit and sees to who comes and goes (AB11): of a zone alone, with ground of its own\n\t\t\tfor (const field of ['follow', 'onEnter', 'onLeave', 'edge'] as const)\n\t\t\t\tif (effect[field] !== undefined && effect.type !== 'zone')\n\t\t\t\t\todd(`${at}.${field}`, effect.type, `${at}.${field} is read of a zone alone, not of ${effect.type}`)\n\t\t\tif (effect.type === 'zone' && (effect.onEnter || effect.onLeave || effect.edge) && !effect.radius && !effect.shape)\n\t\t\t\todd(`${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`)\n\t\t\tif (effect.hitsOnReturn && !effect.returns)\n\t\t\t\todd(`${at}.hitsOnReturn`, effect.type, `${at}.hitsOnReturn is there, but it does not come back (returns): it never hits on a way back`)\n\t\t\tif (effect.seek !== undefined && !(effect.seek > 0))\n\t\t\t\todd(`${at}.seek`, effect.type, `${at}.seek is not above 0: it finds nobody`)\n\t\t\tif (typeof effect.pierce === 'number' && !(effect.pierce >= 0))\n\t\t\t\todd(`${at}.pierce`, effect.type, `${at}.pierce is under 0: it is used up by the first it hits`)\n\t\t\tif (effect.arc && !(effect.arc.height > 0)) odd(`${at}.arc.height`, effect.type, `${at}.arc.height is not above 0: it is thrown flat`)\n\t\t\tif (effect.arc?.time !== undefined && !(effect.arc.time > 0))\n\t\t\t\todd(`${at}.arc.time`, effect.type, `${at}.arc.time is not above 0: it flies at its speed`)\n\t\t\tif (effect.bounce && under(effect.bounce.count, 1))\n\t\t\t\todd(`${at}.bounce.count`, effect.type, `${at}.bounce.count is under 1 at a level: it does not spring on there`)\n\t\t\tif (effect.bounce && !(effect.bounce.range > 0))\n\t\t\t\todd(`${at}.bounce.range`, effect.type, `${at}.bounce.range is not above 0: it finds nothing to spring to`)\n\t\t\t// the ground it covers (AB10): a shape there is, with the sizes it reads\n\t\t\tif (effect.shape !== undefined) {\n\t\t\t\tconst sizes = SHAPE_SIZES[effect.shape]\n\t\t\t\tif (!sizes) {\n\t\t\t\t\tconst meant = nearestId(effect.shape, new Set(Object.keys(SHAPE_SIZES)))\n\t\t\t\t\tproblems.push({\n\t\t\t\t\t\tlevel: 'error',\n\t\t\t\t\t\twhere: `${at}.shape`,\n\t\t\t\t\t\tid: effect.shape,\n\t\t\t\t\t\tmessage: `${at}.shape is \"${effect.shape}\", which is no shape (${Object.keys(SHAPE_SIZES).join(', ')}): it covers nothing${meant ? `. Did you mean \"${meant}\"?` : ''}`\n\t\t\t\t\t})\n\t\t\t\t} else\n\t\t\t\t\tfor (const size of sizes)\n\t\t\t\t\t\tif (effect[size] === undefined) odd(`${at}.${size}`, effect.type, `${at} is a ${effect.shape} with no ${size}: it covers nothing`)\n\t\t\t}\n\t\t\t// from units of the caster's (AB17): of a type there is, picked in a way there is\n\t\t\tif (effect.origin) {\n\t\t\t\tconst { origin } = effect\n\t\t\t\tknown(`${at}.origin.proxy`, origin.proxy, units, 'unit type')\n\t\t\t\tif (origin.pick !== undefined && !['nearest', 'all', 'newest', 'oldest'].includes(origin.pick))\n\t\t\t\t\todd(`${at}.origin.pick`, effect.type, `${at}.origin.pick is nearest, all, newest or oldest: \"${origin.pick}\" is none, the nearest is picked`)\n\t\t\t\tif (origin.at !== undefined && !['aim', 'proxy'].includes(origin.at))\n\t\t\t\t\todd(`${at}.origin.at`, effect.type, `${at}.origin.at is aim or proxy: \"${origin.at}\" is none, it lands where it was aimed`)\n\t\t\t\tif (origin.caster !== undefined && origin.caster !== true && origin.caster !== false && origin.caster !== 'otherwise')\n\t\t\t\t\todd(`${at}.origin.caster`, effect.type, `${at}.origin.caster is true, false or otherwise: \"${String(origin.caster)}\" is none`)\n\t\t\t}\n\t\t\tif (effect.type === 'sendProxy' && !effect.origin)\n\t\t\t\todd(`${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`)\n\t\t\teffects(`${at}.effects`, effect.effects)\n\t\t\teffects(`${at}.onEnd`, effect.onEnd)\n\t\t\teffects(`${at}.otherwise`, effect.otherwise)\n\t\t\tfor (const list of ['onWall', 'split', 'onEnter', 'onLeave', 'edge', 'collide'] as const) effects(`${at}.${list}`, effect[list])\n\t\t})\n\t}\n\t/** The ways an ability may be aimed: the engine's (`AimKind`) and the game's own (`Rules.targetings`) */\n\tconst aimings = new Set<string>([...AIM_KINDS, ...(rules.targetings ?? []).map((targeting) => targeting.id)])\n\tfor (const ability of rules.abilities ?? []) {\n\t\tconst at = `abilities.${ability.id}`\n\t\tknown(`${at}.target`, ability.target, aimings, 'way of aiming')\n\t\tknown(`${at}.charge`, ability.charge, buffs, 'buff')\n\t\ttags(`${at}.targets.tags`, ability.targets?.tags)\n\t\t// its window to be cast again (AB8): one there is, a way of aiming, a buff that marks, a cooldown that is one of the two\n\t\tconst { recast } = ability\n\t\tif (recast) {\n\t\t\tif (ability.target === 'passive') odd(`${at}.recast`, ability.id, `${at} is passive: it is never cast, nor cast again`)\n\t\t\tif (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`)\n\t\t\tif (recast.count !== undefined && !(recast.count >= 1)) odd(`${at}.recast.count`, ability.id, `${at}.recast.count is under 1: it is cast again once`)\n\t\t\tknown(`${at}.recast.target`, recast.target, aimings, 'way of aiming')\n\t\t\tknown(`${at}.recast.mark`, recast.mark, buffs, 'buff')\n\t\t\tif (recast.cooldown !== undefined && recast.cooldown !== 'after' && recast.cooldown !== 'first')\n\t\t\t\todd(`${at}.recast.cooldown`, String(recast.cooldown), `${at}.recast.cooldown is after or first: \"${String(recast.cooldown)}\" is none, after is taken`)\n\t\t\teffects(`${at}.recast.effects`, recast.effects)\n\t\t}\n\t\t// the uses it holds (GP5): at least one, and one that comes back after a time\n\t\tif (ability.charges && under(ability.charges.count, 1))\n\t\t\todd(`${at}.charges.count`, ability.id, `${at}.charges.count is under 1 at a level: it holds 1 there`)\n\t\tif (ability.charges && under(ability.charges.refill, 0, true))\n\t\t\todd(`${at}.charges.refill`, ability.id, `${at}.charges.refill is not above 0 at a level: a use comes back at once there`)\n\t\teffects(`${at}.effects`, ability.effects)\n\t\teffects(`${at}.passive`, ability.passive)\n\t\t// what it costs and gives of pools (AB14)\n\t\tfor (const field of ['cost', 'gain'] as const) {\n\t\t\tif (!ability[field]) continue\n\t\t\tneedsResources(`${at}.${field}`, ability.id)\n\t\t\tfor (const id in ability[field]) pool(`${at}.${field}.${id}`, id)\n\t\t}\n\t\tif (ability.costGrowth) {\n\t\t\tneedsResources(`${at}.costGrowth`, ability.id)\n\t\t\tknown(`${at}.costGrowth.buff`, ability.costGrowth.buff, buffs, 'buff')\n\t\t}\n\t\t// held to charge, and channels aimed or walking (AB15): in a game with the holds pack\n\t\tconst withHolds = (where: string) => {\n\t\t\tif (!holdsOn) odd(where, ability.id, `${where} is read in a game with the holds pack (holdsPack) alone: without it nothing reads it`)\n\t\t}\n\t\tif (ability.hold) {\n\t\t\twithHolds(`${at}.hold`)\n\t\t\tknown(`${at}.hold.buff`, ability.hold.buff, buffs, 'buff')\n\t\t\teffects(`${at}.hold.tap.effects`, ability.hold.tap?.effects)\n\t\t\tif (!(ability.hold.max > 0)) odd(`${at}.hold.max`, ability.id, `${at}.hold.max is not above 0: it is full at once`)\n\t\t\tif (ability.target === 'unit' || ability.target === 'passive' || ability.target === 'vector')\n\t\t\t\todd(`${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`)\n\t\t\tif (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`)\n\t\t}\n\t\t// what it may be made into (AB16): abilities there are, in a game with the ability changes pack\n\t\tall(`${at}.upgrades`, ability.upgrades, abilities, 'ability')\n\t\tif (ability.upgrades && !(rules.packs ?? []).some((pack) => pack.id === ABILITY_CHANGES))\n\t\t\todd(`${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`)\n\t\tif (ability.channel?.aimed) withHolds(`${at}.channel.aimed`)\n\t\tif (ability.channel?.walks) withHolds(`${at}.channel.walks`)\n\t\tif (ability.channel?.leash !== undefined && ability.target !== 'unit')\n\t\t\todd(`${at}.channel.leash`, ability.id, `${at}.channel.leash is there, but it is not cast on a unit: it is tied to nobody`)\n\t}\n\tfor (const buff of rules.buffs ?? []) {\n\t\tconst at = `buffs.${buff.id}`\n\t\tif (buff.drain) {\n\t\t\tneedsResources(`${at}.drain`, buff.id)\n\t\t\tfor (const id in buff.drain) if (id !== 'mana') pool(`${at}.drain.${id}`, id)\n\t\t}\n\t\tif (Array.isArray(buff.onApply)) effects(`${at}.onApply`, buff.onApply)\n\t\teffects(`${at}.onTick.effects`, buff.onTick?.effects)\n\t\teffects(`${at}.passive`, buff.passive)\n\t\teffects(`${at}.onCarrierDeath`, buff.onCarrierDeath)\n\t\teffects(`${at}.onMaxStacks`, buff.onMaxStacks)\n\t\t// a buff's passive is its triggers (AB7): anything else there never goes off\n\t\tbuff.passive?.forEach((effect, index) => {\n\t\t\tif (!(TRIGGER_TYPES as readonly string[]).includes(effect.type))\n\t\t\t\todd(`${at}.passive[${index}]`, effect.type, `${at}.passive[${index}] is a ${effect.type}: only triggers go off from a buff's passive (${TRIGGER_TYPES.join(', ')})`)\n\t\t})\n\t\tbuff.breaksOn?.forEach((by, index) => {\n\t\t\tif (!BUFF_BREAKS.includes(by))\n\t\t\t\todd(`${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`)\n\t\t})\n\t\tif (typeof buff.control === 'string' && !CONTROL_KINDS.includes(buff.control))\n\t\t\todd(`${at}.control`, String(buff.control), `${at}.control is \"${String(buff.control)}\", which is no control (${CONTROL_KINDS.join(', ')}): it takes no orders`)\n\t\tif (buff.minHealth !== undefined && typeof buff.minHealth !== 'function' && under(buff.minHealth, 0))\n\t\t\todd(`${at}.minHealth`, buff.id, `${at}.minHealth is under 0 at a level: it keeps its carrier at nothing there`)\n\t\tif (buff.onMaxStacks && buff.maxStacks === undefined)\n\t\t\todd(`${at}.onMaxStacks`, buff.id, `${at}.onMaxStacks needs a maxStacks to come to: it never happens`)\n\t\t// what is seen (AB18): read in a game with the vision pack\n\t\tfor (const field of ['revealed', 'camouflage', 'trueSight'] as const)\n\t\t\tif (buff[field] !== undefined && buff[field] !== false && !vision)\n\t\t\t\todd(`${at}.${field}`, buff.id, `${at}.${field} is read in a game with the vision pack (visionPack) alone: without it nothing reads it`)\n\t\tcleave(`${at}.cleave`, buff.id, buff.cleave)\n\t\tif (buff.overheal) {\n\t\t\tknown(`${at}.overheal.buff`, buff.overheal.buff, buffs, 'buff')\n\t\t\tif (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`)\n\t\t\tif (buff.overheal.most !== undefined && !(buff.overheal.most > 0))\n\t\t\t\todd(`${at}.overheal.most`, buff.id, `${at}.overheal.most is not above 0: the shield it makes holds nothing`)\n\t\t\tif (buff.overheal.of !== undefined && !['given', 'taken'].includes(buff.overheal.of))\n\t\t\t\todd(`${at}.overheal.of`, buff.id, `${at}.overheal.of is given or taken: \"${String(buff.overheal.of)}\" is neither, given is meant`)\n\t\t}\n\t\tif (typeof buff.paysWithHealth === 'number' && !(buff.paysWithHealth > 0))\n\t\t\todd(`${at}.paysWithHealth`, buff.id, `${at}.paysWithHealth is not above 0: its carrier pays nothing for its abilities, of health or mana`)\n\t\tif (typeof buff.camouflage === 'number' && !(buff.camouflage >= 0))\n\t\t\todd(`${at}.camouflage`, buff.id, `${at}.camouflage is under 0: its enemies never see it, even from up close`)\n\t}\n\tfor (const race of rules.races ?? []) {\n\t\tconst start = race.startingBase\n\t\tif (!start || 'spawn' in start) continue\n\t\tconst at = `races.${race.id}.startingBase`\n\t\tknown(`${at}.hall`, start.hall, units, 'unit type')\n\t\tknown(`${at}.workers.type`, start.workers?.type, units, 'unit type')\n\t\tknown(`${at}.onMine`, start.onMine, units, 'unit type')\n\t\tstart.units?.forEach((each, index) => known(`${at}.units[${index}].type`, each.type, units, 'unit type'))\n\t}\n\tfor (const item of rules.items ?? []) {\n\t\tconst at = `items.${item.id}`\n\t\tknown(`${at}.ability`, item.ability, abilities, 'ability')\n\t\tknown(`${at}.passive`, item.passive, abilities, 'ability')\n\t\tall(`${at}.from`, item.from, items, 'item')\n\t}\n\titemProblems(rules, problems, odd)\n\tfor (const upgrade of rules.upgrades ?? []) {\n\t\tconst at = `upgrades.${upgrade.id}`\n\t\tupgrade.requires?.forEach((level, index) => all(`${at}.requires[${index}]`, level, requirable, 'unit type or upgrade'))\n\t\tupgrade.effects.forEach((effect, index) => {\n\t\t\tif (Array.isArray(effect.units)) all(`${at}.effects[${index}].units`, effect.units, units, 'unit type')\n\t\t})\n\t}\n\n\t// requirements that wait on each other: none of them can ever be had\n\tconst needs = new Map<string, string[]>()\n\tfor (const unit of rules.units) if (unit.requires?.length) needs.set(unit.id, unit.requires)\n\tfor (const upgrade of rules.upgrades ?? []) if (upgrade.requires?.[0]?.length) needs.set(upgrade.id, upgrade.requires[0])\n\tconst reported = new Set<string>()\n\tfor (const start of needs.keys()) {\n\t\tconst loop = cycleFrom(start, needs)\n\t\tif (!loop) continue\n\t\tconst key = [...loop].sort().join(',')\n\t\tif (reported.has(key)) continue\n\t\treported.add(key)\n\t\tproblems.push({\n\t\t\tlevel: 'error',\n\t\t\twhere: `requires`,\n\t\t\tid: start,\n\t\t\tmessage: `What is required waits on itself: ${[...loop, loop[0]].join(' → ')}. None of them can be had`\n\t\t})\n\t}\n\n\t// what has a cost and nothing makes: likely a slip (a unit forgotten in a building's trains)\n\tconst made = new Set<string>()\n\tfor (const unit of rules.units) {\n\t\tfor (const id of [...(unit.trains ?? []), ...(unit.builds ?? []), ...(unit.hires ?? []), ...(unit.researches ?? [])]) made.add(id)\n\t\tfor (const id of upgradesOf(unit)) made.add(id)\n\t}\n\tfor (const unit of rules.units) {\n\t\tif (!unit.cost || made.has(unit.id)) continue\n\t\tproblems.push({\n\t\t\tlevel: 'warning',\n\t\t\twhere: `units.${unit.id}`,\n\t\t\tid: unit.id,\n\t\t\tmessage: `units.${unit.id} has a cost, and nothing trains, builds or hires it`\n\t\t})\n\t}\n\tfor (const upgrade of rules.upgrades ?? []) {\n\t\tif (made.has(upgrade.id)) continue\n\t\tproblems.push({\n\t\t\tlevel: 'warning',\n\t\t\twhere: `upgrades.${upgrade.id}`,\n\t\t\tid: upgrade.id,\n\t\t\tmessage: `upgrades.${upgrade.id} is researched nowhere (UnitTypeDef.researches)`\n\t\t})\n\t}\n\n\t// abilities nothing has: no unit, hero, item or other ability names them\n\tconst had = new Set<string>()\n\tfor (const unit of rules.units)\n\t\tfor (const id of [\n\t\t\t...(unit.abilities ?? []),\n\t\t\t...(unit.hero?.learns ?? []),\n\t\t\t...(unit.hero?.spells ?? []),\n\t\t\t// its innate passive (`HeroDef.innate`)\n\t\t\t...(unit.hero?.innate ? [unit.hero.innate] : []),\n\t\t\t...Object.values(unit.hero?.forms ?? {}).flatMap((form) => form.learns ?? [])\n\t\t])\n\t\t\thad.add(id)\n\tfor (const item of rules.items ?? []) for (const id of [item.ability, item.passive]) if (id) had.add(id)\n\tconst named = (ability: AbilityDef) => {\n\t\tconst walk = (list: readonly EffectDef[] | undefined) =>\n\t\t\tlist?.map(anyEffect).forEach((effect) => (effect.ability && had.add(effect.ability), walk(effect.otherwise)))\n\t\twalk(ability.effects)\n\t\twalk(ability.passive)\n\t}\n\tfor (const ability of rules.abilities ?? []) named(ability)\n\t// what a default set put in (`useDefaults`: the hero spells a game took whole) is there to pick from, not forgotten\n\tconst offered = new Set(rules.defaults?.added.abilities ?? [])\n\tfor (const ability of rules.abilities ?? []) {\n\t\tif (had.has(ability.id) || offered.has(ability.id)) continue\n\t\tproblems.push({\n\t\t\tlevel: 'warning',\n\t\t\twhere: `abilities.${ability.id}`,\n\t\t\tid: ability.id,\n\t\t\tmessage: `abilities.${ability.id} is on no unit, hero or item`\n\t\t})\n\t}\n\treturn problems.map((problem) => {\n\t\tconst at = locate(rules, problem.where)\n\t\treturn at ? { ...problem, at } : problem\n\t})\n}\n\n/** The engine's limits of groups of items (`ItemSettings.groups`), said here so that the check loads none of the rules */\nconst GROUP_LIMITS: Readonly<Record<string, number>> = { boots: 1 }\n\n/**\n * 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\n * 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\n * warnings a price under its parts', an item nothing sells or drops (in a game that sells or drops any), numbers that\n * do nothing, callings no hero has\n */\nfunction itemProblems(rules: Rules, problems: RulesProblem[], odd: (where: string, id: string, message: string) => void): void {\n\tconst list = rules.items ?? []\n\tconst byId = new Map(list.map((item) => [item.id, item]))\n\tconst currency = rules.currency ?? rules.resources?.[0]?.id\n\tconst price = (id: string) => (currency ? (byId.get(id)?.cost[currency] ?? 0) : 0)\n\tconst groups = { ...GROUP_LIMITS, ...(rules.settings?.items?.groups as Record<string, number> | undefined) }\n\tconst limitOf = (group: string, own?: number) => own ?? groups[group] ?? 1\n\n\t// a loop in the build tree: none of it can be priced\n\tconst parts = new Map(list.filter((item) => item.from?.length).map((item) => [item.id, item.from!.filter((part) => byId.has(part))]))\n\tconst looped = new Set<string>()\n\tfor (const start of parts.keys()) {\n\t\tconst loop = cycleFrom(start, parts)\n\t\tif (!loop) continue\n\t\tconst key = [...loop].sort().join(',')\n\t\tif (looped.has(key)) continue\n\t\tlooped.add(key)\n\t\tproblems.push({\n\t\t\tlevel: 'error',\n\t\t\twhere: `items.${start}.from`,\n\t\t\tid: start,\n\t\t\tmessage: `The build tree goes round: ${[...loop, loop[0]].join(' → ')}. None of them can be priced or bought`\n\t\t})\n\t}\n\tconst inLoop = new Set([...looped].flatMap((key) => key.split(',')))\n\n\t// who sells, and what drops: the rest nobody gets but by code or a map\n\tconst sold = new Set(rules.units.flatMap((unit) => unit.sells ?? []))\n\tconst dropped = new Set(rules.units.flatMap((unit) => (Array.isArray(unit.drops) ? unit.drops.map((drop) => drop.item) : [])))\n\t// a game without shops or loot hands its items out by code or a map: nothing to say of what none sells\n\tconst dealt = sold.size > 0 || dropped.size > 0\n\tconst dropsInCode = rules.units.some((unit) => typeof unit.drops === 'function')\n\tconst callings = suitedCallings(rules)\n\n\tfor (const item of list) {\n\t\tconst at = `items.${item.id}`\n\t\tconst from = item.from?.filter((part) => byId.has(part)) ?? []\n\t\tif (from.length && currency && !inLoop.has(item.id)) {\n\t\t\tconst sum = from.reduce((total, part) => total + price(part), 0)\n\t\t\tif (price(item.id) < sum)\n\t\t\t\todd(`${at}.cost`, item.id, `${at}.cost (${price(item.id)} ${currency}) is under what its parts cost together (${sum}): building it pays the buyer`)\n\t\t}\n\t\t// a recipe of more of its group than may be carried: never all of it at once\n\t\tfor (const group of new Set(from.map((part) => byId.get(part)!.group).filter((group): group is string => group !== undefined))) {\n\t\t\tconst count = from.filter((part) => byId.get(part)!.group === group).length\n\t\t\tconst limit = limitOf(group, from.map((part) => byId.get(part)!).find((part) => part.group === group)?.groupLimit)\n\t\t\tif (count > limit)\n\t\t\t\tproblems.push({\n\t\t\t\t\tlevel: 'error',\n\t\t\t\t\twhere: `${at}.from`,\n\t\t\t\t\tid: item.id,\n\t\t\t\t\tmessage: `${at}.from has ${count} of the group \"${group}\", and a hero carries ${limit} at most: its parts are never all carried`\n\t\t\t\t})\n\t\t}\n\t\tif (dealt && !item.powerUp && !sold.has(item.id) && !dropped.has(item.id) && !dropsInCode)\n\t\t\todd(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`)\n\t\tif (item.group !== undefined && item.groupLimit !== undefined && !(item.groupLimit >= 1))\n\t\t\todd(`${at}.groupLimit`, item.id, `${at}.groupLimit is under 1: nobody may carry it`)\n\t\tif (item.groupLimit !== undefined && item.group === undefined) odd(`${at}.groupLimit`, item.id, `${at}.groupLimit is there, but it is of no group: nothing limits it`)\n\t\tif (item.stack !== undefined && !item.charges) odd(`${at}.stack`, item.id, `${at}.stack is there, but it has no charges: what stacks is its charges, so nothing does`)\n\t\tif (item.stack !== undefined && !(item.stack >= 1)) odd(`${at}.stack`, item.id, `${at}.stack is under 1: one goes in a slot`)\n\t\tif (item.refill !== undefined && !item.charges) odd(`${at}.refill`, item.id, `${at}.refill is there, but it has no charges to come back`)\n\t\tif (item.sellRate !== undefined && !(item.sellRate >= 0)) odd(`${at}.sellRate`, item.id, `${at}.sellRate is under 0: selling it costs its seller`)\n\t\tif (item.unique !== undefined && !item.passive) odd(`${at}.unique`, item.id, `${at}.unique names its passive, and it has none (passive): it does nothing`)\n\t\t// callings, where the game has them: a calling none of its heroes can have\n\t\tif (callings)\n\t\t\titem.suits?.forEach((calling, index) => {\n\t\t\t\tif (!callings.has(calling))\n\t\t\t\t\todd(`${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)}\"?` : ''}`)\n\t\t\t})\n\t}\n}\n\n/**\n * The callings of a game's heroes, where it has them: the rules' (`callings`) or a pack's that keeps them\n * (`heroesPack({ callings })`). None for a game without, whose items' `suits` go unchecked\n */\nfunction suitedCallings(rules: Rules): Set<string> | undefined {\n\t// the rules' own list first: a game that says its callings means those, not the heroes pack's default ones\n\tconst own = (rules as { callings?: unknown }).callings\n\tconst lists = Array.isArray(own) ? [own] : (rules.packs ?? []).map((each) => (each as { callings?: unknown }).callings)\n\tconst ids = lists.flatMap((list) => (Array.isArray(list) ? list.flatMap((def) => (typeof def === 'string' ? [def] : typeof def?.id === 'string' ? [def.id as string] : [])) : []))\n\treturn ids.length ? new Set(ids) : undefined\n}\n\n/**\n * The definition and field a place in the rules is (`abilities.holy-light.effects[0].buff`): the kind, the longest id\n * 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`)\n */\nfunction locate(rules: Rules, where: string): RulesProblem['at'] {\n\tconst dot = where.indexOf('.')\n\tconst kind = where.slice(0, dot) as DataKind\n\tif (dot < 0 || !DATA_KINDS.includes(kind)) return undefined\n\tconst rest = where.slice(dot + 1)\n\tconst ids = ((rules[kind] ?? []) as readonly { id: string }[]).map((def) => def.id)\n\tconst id = ids.filter((each) => rest === each || rest.startsWith(`${each}.`)).sort((a, b) => b.length - a.length)[0]\n\tif (id === undefined) return undefined\n\treturn { kind, id, path: rest.slice(id.length + 1).replace(/\\[(\\d+)\\]/g, '.$1') }\n}\n\n/** A loop of requirements through `start`, in order, or none */\nfunction cycleFrom(start: string, needs: Map<string, string[]>): string[] | undefined {\n\tconst path: string[] = []\n\tconst seen = new Set<string>()\n\tconst visit = (id: string): string[] | undefined => {\n\t\tif (id === start && path.length) return [...path]\n\t\tif (seen.has(id)) return undefined\n\t\tseen.add(id)\n\t\tpath.push(id)\n\t\tfor (const next of needs.get(id) ?? []) {\n\t\t\tconst found = visit(next)\n\t\t\tif (found) return found\n\t\t}\n\t\tpath.pop()\n\t\treturn undefined\n\t}\n\treturn visit(start)\n}\n\nexport { editDistance } from './nearest'\n"],"mappings":"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"}
package/dist/runes.d.ts CHANGED
@@ -10,7 +10,7 @@ import type { World } from './world';
10
10
  */
11
11
  export declare const RUNES = "core.runes";
12
12
  /**
13
- * What the runes pack is made with (`withRunes`)
13
+ * What the runes pack is made with (`runesPack`)
14
14
  *
15
15
  * @beta
16
16
  */
@@ -38,4 +38,4 @@ export declare function usePowerUp(world: World, entity: Entity, groundId: numbe
38
38
  *
39
39
  * @beta
40
40
  */
41
- export declare function withRunes(options?: RunesOptions): GamePack;
41
+ export declare function runesPack(options?: RunesOptions): GamePack;
package/dist/runes.js ADDED
@@ -0,0 +1,80 @@
1
+ import { itemPicked } from "./engineEvents.js";
2
+ import { distanceToEdge } from "./entity.js";
3
+ import { defineHook } from "./hooks.js";
4
+ import { REACH, createItem } from "./items.js";
5
+ import { fire } from "./orders/cast.js";
6
+ //#region src/runes.ts
7
+ /**
8
+ * The runes pack's id
9
+ *
10
+ * @beta
11
+ */
12
+ var RUNES = "core.runes";
13
+ /**
14
+ * Uses an item on the ground as a rune is used: whoever picked it casts its ability (where it stands, no mana), and it
15
+ * is gone from the ground, told as an item picked (`itemPicked`). What the runes pack does as a unit walks over one;
16
+ * false for an item not on the ground
17
+ *
18
+ * @beta
19
+ */
20
+ function usePowerUp(world, entity, groundId) {
21
+ const index = world.items.findIndex((item) => item.id === groundId);
22
+ if (index < 0) return false;
23
+ const [item] = world.items.splice(index, 1);
24
+ const instance = createItem(world, item.item, item.charges);
25
+ instance.id = item.id;
26
+ world.events.emit(itemPicked, {
27
+ entity,
28
+ item: instance
29
+ });
30
+ const ability = world.registry.item(item.item).ability;
31
+ if (ability) fire(world, entity, world.registry.ability(ability), void 0, instance);
32
+ return true;
33
+ }
34
+ /**
35
+ * Runes, as in classic RTS games: an item that is a power-up (`ItemDef.powerUp`, `RunesOptions.powerUp` in code) is used as
36
+ * it is picked up, by a unit that walks over it (`RunesOptions.takes`) or is told to pick it up, and never carried:
37
+ * whoever picked it casts its ability where it stands. A rune of healing is an item whose ability heals around; a tome
38
+ * one whose ability has the tomes pack's `tome` effect. `usePowerUp` does it in code
39
+ *
40
+ * @beta
41
+ */
42
+ function runesPack(options = {}) {
43
+ const powerUp = options.powerUp ?? ((item) => !!item.powerUp);
44
+ const takes = options.takes ?? ((world, entity) => entity.isUnit && !entity.hidden && !world.player(entity.owner).neutral && !entity.def.invulnerable);
45
+ const walkedOver = {
46
+ name: "runes",
47
+ phase: "cleanup",
48
+ every: Math.max(1, Math.round(options.every ?? 3)),
49
+ update(world) {
50
+ if (!world.items.length) return;
51
+ for (const item of [...world.items]) {
52
+ if (!powerUp(world.registry.item(item.item))) continue;
53
+ for (const entity of world.spatial.query(item.x, item.z, REACH)) {
54
+ if (!entity.alive || distanceToEdge(item, entity) > 1.2 || !takes(world, entity, item)) continue;
55
+ usePowerUp(world, entity, item.id);
56
+ break;
57
+ }
58
+ }
59
+ }
60
+ };
61
+ const ordered = defineHook({
62
+ hook: "beforePickUp",
63
+ id: "runes",
64
+ run(world, event) {
65
+ if (!powerUp(world.registry.item(event.item))) return;
66
+ event.cancelled = true;
67
+ usePowerUp(world, event.entity, event.ground);
68
+ }
69
+ });
70
+ return {
71
+ id: RUNES,
72
+ options,
73
+ systems: [walkedOver],
74
+ hooks: [ordered]
75
+ };
76
+ }
77
+ //#endregion
78
+ export { RUNES, runesPack, usePowerUp };
79
+
80
+ //# sourceMappingURL=runes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runes.js","names":[],"sources":["../src/runes.ts"],"sourcesContent":["import type { ItemDef } from './defs'\nimport { itemPicked } from './engineEvents'\nimport type { Entity } from './entity'\nimport { defineHook } from './hooks'\nimport { createItem, type GroundItem, REACH } from './items'\nimport { distanceToEdge } from './entity'\nimport { fire } from './orders/cast'\nimport type { GamePack } from './packs/pack'\nimport type { System } from './registry'\nimport type { World } from './world'\n\n/*\n * Runes, an opt-in pack (review RV95): items used as they are picked up, by walking over them as by the order, and\n * never carried (`ItemDef.powerUp`): a rune of healing, a tome\n */\n\n/**\n * The runes pack's id\n *\n * @beta\n */\nexport const RUNES = 'core.runes'\n\n/**\n * What the runes pack is made with (`runesPack`)\n *\n * @beta\n */\nexport interface RunesOptions {\n\t/** Whether an item is used as it is picked up, in code: its `powerUp` when left out */\n\tpowerUp?: (item: ItemDef) => boolean\n\t/** Who picks one up by walking over it: any unit of a player's, not hidden, when left out */\n\ttakes?: (world: World, entity: Entity, item: GroundItem) => boolean\n\t/** How many ticks apart the ground is looked over for who walked onto a rune: 3 when left out */\n\tevery?: number\n}\n\n/**\n * Uses an item on the ground as a rune is used: whoever picked it casts its ability (where it stands, no mana), and it\n * is gone from the ground, told as an item picked (`itemPicked`). What the runes pack does as a unit walks over one;\n * false for an item not on the ground\n *\n * @beta\n */\nexport function usePowerUp(world: World, entity: Entity, groundId: number): boolean {\n\tconst index = world.items.findIndex((item) => item.id === groundId)\n\tif (index < 0) return false\n\tconst [item] = world.items.splice(index, 1)\n\tconst instance = createItem(world, item.item, item.charges)\n\tinstance.id = item.id\n\tworld.events.emit(itemPicked, { entity, item: instance })\n\tconst ability = world.registry.item(item.item).ability\n\tif (ability) fire(world, entity, world.registry.ability(ability), undefined, instance)\n\treturn true\n}\n\n/**\n * Runes, as in classic RTS games: an item that is a power-up (`ItemDef.powerUp`, `RunesOptions.powerUp` in code) is used as\n * it is picked up, by a unit that walks over it (`RunesOptions.takes`) or is told to pick it up, and never carried:\n * whoever picked it casts its ability where it stands. A rune of healing is an item whose ability heals around; a tome\n * one whose ability has the tomes pack's `tome` effect. `usePowerUp` does it in code\n *\n * @beta\n */\nexport function runesPack(options: RunesOptions = {}): GamePack {\n\tconst powerUp = options.powerUp ?? ((item: ItemDef) => !!item.powerUp)\n\tconst takes =\n\t\toptions.takes ??\n\t\t((world: World, entity: Entity) => entity.isUnit && !entity.hidden && !world.player(entity.owner).neutral && !entity.def.invulnerable)\n\tconst walkedOver: System = {\n\t\tname: 'runes',\n\t\tphase: 'cleanup',\n\t\tevery: Math.max(1, Math.round(options.every ?? 3)),\n\t\tupdate(world) {\n\t\t\tif (!world.items.length) return\n\t\t\t// a copy: a rune used takes itself off the ground\n\t\t\tfor (const item of [...world.items]) {\n\t\t\t\tif (!powerUp(world.registry.item(item.item))) continue\n\t\t\t\tfor (const entity of world.spatial.query(item.x, item.z, REACH)) {\n\t\t\t\t\tif (!entity.alive || distanceToEdge(item, entity) > REACH || !takes(world, entity, item)) continue\n\t\t\t\t\tusePowerUp(world, entity, item.id)\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t// told to pick one up: used at once, not carried\n\tconst ordered = defineHook({\n\t\thook: 'beforePickUp',\n\t\tid: 'runes',\n\t\trun(world, event) {\n\t\t\tif (!powerUp(world.registry.item(event.item))) return\n\t\t\tevent.cancelled = true\n\t\t\tusePowerUp(world, event.entity, event.ground)\n\t\t}\n\t})\n\treturn { id: RUNES, options, systems: [walkedOver], hooks: [ordered] }\n}\n"],"mappings":";;;;;;;;;;;AAqBA,IAAa,QAAQ;;;;;;;;AAuBrB,SAAgB,WAAW,OAAc,QAAgB,UAA2B;CACnF,MAAM,QAAQ,MAAM,MAAM,WAAW,SAAS,KAAK,OAAO,QAAQ;CAClE,IAAI,QAAQ,GAAG,OAAO;CACtB,MAAM,CAAC,QAAQ,MAAM,MAAM,OAAO,OAAO,CAAC;CAC1C,MAAM,WAAW,WAAW,OAAO,KAAK,MAAM,KAAK,OAAO;CAC1D,SAAS,KAAK,KAAK;CACnB,MAAM,OAAO,KAAK,YAAY;EAAE;EAAQ,MAAM;CAAS,CAAC;CACxD,MAAM,UAAU,MAAM,SAAS,KAAK,KAAK,IAAI,CAAC,CAAC;CAC/C,IAAI,SAAS,KAAK,OAAO,QAAQ,MAAM,SAAS,QAAQ,OAAO,GAAG,KAAA,GAAW,QAAQ;CACrF,OAAO;AACR;;;;;;;;;AAUA,SAAgB,UAAU,UAAwB,CAAC,GAAa;CAC/D,MAAM,UAAU,QAAQ,aAAa,SAAkB,CAAC,CAAC,KAAK;CAC9D,MAAM,QACL,QAAQ,WACN,OAAc,WAAmB,OAAO,UAAU,CAAC,OAAO,UAAU,CAAC,MAAM,OAAO,OAAO,KAAK,CAAC,CAAC,WAAW,CAAC,OAAO,IAAI;CAC1H,MAAM,aAAqB;EAC1B,MAAM;EACN,OAAO;EACP,OAAO,KAAK,IAAI,GAAG,KAAK,MAAM,QAAQ,SAAS,CAAC,CAAC;EACjD,OAAO,OAAO;GACb,IAAI,CAAC,MAAM,MAAM,QAAQ;GAEzB,KAAK,MAAM,QAAQ,CAAC,GAAG,MAAM,KAAK,GAAG;IACpC,IAAI,CAAC,QAAQ,MAAM,SAAS,KAAK,KAAK,IAAI,CAAC,GAAG;IAC9C,KAAK,MAAM,UAAU,MAAM,QAAQ,MAAM,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG;KAChE,IAAI,CAAC,OAAO,SAAS,eAAe,MAAM,MAAM,IAAA,OAAa,CAAC,MAAM,OAAO,QAAQ,IAAI,GAAG;KAC1F,WAAW,OAAO,QAAQ,KAAK,EAAE;KACjC;IACD;GACD;EACD;CACD;CAEA,MAAM,UAAU,WAAW;EAC1B,MAAM;EACN,IAAI;EACJ,IAAI,OAAO,OAAO;GACjB,IAAI,CAAC,QAAQ,MAAM,SAAS,KAAK,MAAM,IAAI,CAAC,GAAG;GAC/C,MAAM,YAAY;GAClB,WAAW,OAAO,MAAM,QAAQ,MAAM,MAAM;EAC7C;CACD,CAAC;CACD,OAAO;EAAE,IAAI;EAAO;EAAS,SAAS,CAAC,UAAU;EAAG,OAAO,CAAC,OAAO;CAAE;AACtE"}
package/dist/save.d.ts CHANGED
@@ -23,7 +23,7 @@ import type { Delayed, Missile, Projectile, Reveal, World, WorldInternals, Zone
23
23
  *
24
24
  * Two numbers say how old a save is, and they are not the same thing. `format` is the engine's: the shape of the save
25
25
  * itself, which the engine brings up to date by itself. `version` is the game's: what the game keeps in a save (its
26
- * unit types, its components), which the game brings up to date (`GameModule.saves`). A save is read through both
26
+ * unit types, its components), which the game brings up to date (`Rules.saves`). A save is read through both
27
27
  * (`updateSave`), the engine's first
28
28
  *
29
29
  * @beta
@@ -33,28 +33,36 @@ export interface WorldSave {
33
33
  format: typeof SAVE_FORMAT;
34
34
  /** Id of the game module the world was made with */
35
35
  game: string;
36
- /** The version of what the game keeps in a save (`GameModule.saves.version`): 1 for a game that says none */
36
+ /** The version of what the game keeps in a save (`Rules.saves.version`): 1 for a game that says none */
37
37
  version: number;
38
38
  /**
39
39
  * Which rules it was made with exactly, mods and code included (see `gameHash`): whether it can be loaded as it is.
40
- * What a game does about a save of other rules is its own to say (`GameModule.saves.onMismatch`)
40
+ * What a game does about a save of other rules is its own to say (`Rules.saves.onMismatch`)
41
41
  */
42
42
  hash: string;
43
+ /** Ticks per second the world was running at */
43
44
  tickRate: number;
45
+ /** The tick number the world was at when saved */
44
46
  tick: number;
47
+ /** The winning team, or null while the game has none */
45
48
  winner: number | null;
46
49
  /** The parts of the game switched off for having thrown (`world.disabled`): off again in the world loaded. None when left out */
47
50
  disabled?: ErrorSite[];
48
51
  /** Why the game ended on an error (`world.failure`), for a save taken of one that did */
49
52
  failure?: WorldFailure;
53
+ /** The state of the world's random generator (`Rng.save`), so the loaded game draws the same numbers */
50
54
  rng: number;
55
+ /** The world's own counters and bookkeeping that are not entities (`WorldInternals`) */
51
56
  internals: WorldInternals;
57
+ /** The cheats switched on in the world (`World.cheats`) */
52
58
  cheats: World['cheats'];
53
- /** The entity each object of the map became, by the object's id (`World.mapEntities`): as `[object, entity]`. None when left out */
54
- mapEntities?: [number, EntityId][];
59
+ /** The entity each object of the map became, by the object's id (`World.fromMap`): as `[object, entity]`. None when left out */
60
+ fromMap?: [number, EntityId][];
55
61
  /** The ground: all of it, or the map the world was made from and what changed of it since (S36, format 3) */
56
62
  terrain: SavedGround;
63
+ /** Each player's state: resources, supply, upgrades and the state of modules */
57
64
  players: PlayerSave[];
65
+ /** What the fog of war keeps of what was seen */
58
66
  fog: FogSave;
59
67
  /** Where walkable space was at: movement looks for a new path when it changes */
60
68
  navVersion: number;
@@ -63,16 +71,23 @@ export interface WorldSave {
63
71
  /** Entities that left the world but are still pointed at, like the caster of something that has yet to land */
64
72
  detached: EntitySave[];
65
73
  /** Ids of the entities that act, in the order they are gone through: who goes first can decide what happens */
66
- actors: EntityId[];
74
+ /** The entities that act (`World.units`), by id */
75
+ units: EntityId[];
67
76
  /** Scenery each team sees, by team */
68
77
  sceneryInSight: Record<number, EntityId[]>;
78
+ /** Projectiles in flight */
69
79
  projectiles: Projectile[];
80
+ /** Missiles in flight */
70
81
  missiles: MissileSave[];
71
82
  /** What missiles sent together have passed through, which they share */
72
83
  missileHits: EntityId[][];
84
+ /** Things scheduled to happen later (`World.after`), with the time left to each */
73
85
  delayed: DelayedSave[];
86
+ /** Zones that act on what stands in them for a time */
74
87
  zones: ZoneSave[];
88
+ /** Patches of ground revealed to a team for a time */
75
89
  reveals: Reveal[];
90
+ /** Items lying on the ground */
76
91
  items: GroundItem[];
77
92
  /** State of game modules and mods for the whole game, by component id (see `World.state`) */
78
93
  state: Record<string, unknown>;
@@ -91,7 +106,7 @@ interface PlayerSave {
91
106
  resources: Purse;
92
107
  supplyUsed: number;
93
108
  supplyCap: number;
94
- /** The game's other pools (`GameRules.supply.pools`): left out of a save made before there were any */
109
+ /** The game's other pools (`RuleSettings.supply.pools`): left out of a save made before there were any */
95
110
  supplies?: Record<string, {
96
111
  used: number;
97
112
  cap: number;
@@ -149,7 +164,7 @@ export interface SaveWorldOptions {
149
164
  /**
150
165
  * Saves a world, between two ticks. Throws, saying where, when something in it is not plain data
151
166
  *
152
- * @beta
167
+ * @public
153
168
  */
154
169
  export declare function saveWorld(world: World, options?: SaveWorldOptions): WorldSave;
155
170
  /** The players of a save, as a world is made with them */
@@ -160,7 +175,7 @@ export declare const savedPlayers: (save: WorldSave) => PlayerInit[];
160
175
  */
161
176
  export declare function restoreWorld(world: World, save: WorldSave): void;
162
177
  /**
163
- * How a game's saves outlive its patches (`GameModule.saves`). Any change to a game's rules changes which rules they
178
+ * How a game's saves outlive its patches (`Rules.saves`). Any change to a game's rules changes which rules they
164
179
  * are exactly (`registry.hash`), and most changes are nothing to a save: a number tuned, a bug fixed. A game that
165
180
  * declares this loads such a save as it is. A change a save cannot be read through (a unit type renamed, a component
166
181
  * of another shape) takes a new `version`, and a step that brings the saves made before up to it
@@ -220,10 +235,13 @@ export type SaveMissing = Partial<Record<'unit' | 'ability' | 'buff' | 'item' |
220
235
  * @beta
221
236
  */
222
237
  export declare class SaveError extends Error {
238
+ /** Why the save was refused, as a `SaveRefusal` */
223
239
  readonly reason: SaveRefusal;
224
240
  /** For `missing`: what the save has that the game does not */
225
241
  readonly missing?: SaveMissing | undefined;
226
- constructor(message: string, reason: SaveRefusal,
242
+ constructor(message: string,
243
+ /** Why the save was refused, as a `SaveRefusal` */
244
+ reason: SaveRefusal,
227
245
  /** For `missing`: what the save has that the game does not */
228
246
  missing?: SaveMissing | undefined);
229
247
  }
@@ -233,10 +251,13 @@ export declare class SaveError extends Error {
233
251
  * @beta
234
252
  */
235
253
  export interface SaveHeader {
254
+ /** The save's format (`SAVE_FORMAT`) when it was written */
236
255
  format: number;
256
+ /** The id of the game module the save was made with */
237
257
  game: string;
238
258
  /** 1 when left out, as in a save from before games had versions of their saves */
239
259
  version?: number;
260
+ /** The hash of the rules the save was made with, as `WorldSave.hash` */
240
261
  hash: string;
241
262
  }
242
263
  /**
@@ -254,7 +275,7 @@ export declare const saveHeader: (save: SaveHeader) => SaveHeader;
254
275
  */
255
276
  export declare function saveProblem(header: SaveHeader, registry: Registry): SaveError | undefined;
256
277
  /**
257
- * A save as the game reads it now, whatever it was saved by: brought up from an older version by the game's (`GameModule.saves.migrate`), each one version at a time. `loadWorld` runs
278
+ * A save as the game reads it now, whatever it was saved by: brought up from an older version by the game's (`Rules.saves.migrate`), each one version at a time. `loadWorld` runs
258
279
  * it; a tool that keeps saves up to date runs it by itself. The save handed in is not changed. Throws a `SaveError`,
259
280
  * which says why, for one that cannot be read: another game's, newer than this game, of a version the game has no
260
281
  * step from, made with other rules by a game that refuses those (`anyVersion` loads it all the same), or with
@@ -272,6 +293,10 @@ export declare function updateSave(data: unknown, registry: Registry, options?:
272
293
  * @beta
273
294
  */
274
295
  export declare function encodeSave(save: WorldSave): string;
275
- /** @beta */
296
+ /**
297
+ * Reads a save back from text written by `encodeSave`, turning the stored non-finite numbers into numbers again
298
+ *
299
+ * @beta
300
+ */
276
301
  export declare function decodeSave(text: string): WorldSave;
277
302
  export {};