@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
package/dist/save.js ADDED
@@ -0,0 +1,532 @@
1
+ import { footprintOf } from "./defs.js";
2
+ import { Entity, moving } from "./entity.js";
3
+ import { plain as plain$1 } from "./plain.js";
4
+ import { effectRef, resolveEffect } from "./effectRefs.js";
5
+ import { waitingTimers } from "./timers.js";
6
+ import { coreTimers, runningSequences } from "./sequences.js";
7
+ import { redefinitions, restoreRedefinitions } from "./gameData.js";
8
+ import { savedGround } from "./ground.js";
9
+ import { sideKnowledge } from "./navigation/sidePaths.js";
10
+ //#region src/save.ts
11
+ /**
12
+ * The format saves are written in now: a save of another is refused. The engine keeps no steps up from an older one
13
+ * while it and its games are made (a game's own versions have `SaveRules.migrate`)
14
+ *
15
+ * @beta
16
+ */
17
+ var SAVE_FORMAT = 5;
18
+ /**
19
+ * What a save keeps of an entity besides its id, type and owner, field by field: nothing else is written, and a save
20
+ * that has anything else is refused. A field the engine adds is either here or among those it works out again
21
+ * (`ENTITY_DERIVED`): a test holds every field of an entity to one of the two
22
+ *
23
+ * @internal
24
+ */
25
+ var ENTITY_SAVE = [
26
+ "alive",
27
+ "hidden",
28
+ "scenery",
29
+ "pos",
30
+ "prevPos",
31
+ "facing",
32
+ "prevFacing",
33
+ "scale",
34
+ "look",
35
+ "likeness",
36
+ "velocity",
37
+ "health",
38
+ "seenBy",
39
+ "hurtAt",
40
+ "expires",
41
+ "lifetime",
42
+ "unseenIn",
43
+ "orders",
44
+ "maxHealth",
45
+ "mana",
46
+ "maxMana",
47
+ "asleep",
48
+ "reviving",
49
+ "abilities",
50
+ "buffs",
51
+ "on",
52
+ "cell",
53
+ "components"
54
+ ];
55
+ /**
56
+ * An entity's fields that are worked out again from the rest, or the engine's bookkeeping: never saved as they are.
57
+ * Its components' values and their order (`slots`, `held`) are saved by id, as `components`, and filed again as it is
58
+ * loaded
59
+ *
60
+ * @internal
61
+ */
62
+ var ENTITY_DERIVED = [
63
+ "id",
64
+ "def",
65
+ "owner",
66
+ "statsCache",
67
+ "told",
68
+ "buffFlags",
69
+ "buffFlagsOf",
70
+ "spatialStamp",
71
+ "index",
72
+ "slots",
73
+ "held"
74
+ ];
75
+ var SAVED_FIELDS = new Set(ENTITY_SAVE);
76
+ /**
77
+ * Saves a world, between two ticks. Throws, saying where, when something in it is not plain data
78
+ *
79
+ * @public
80
+ */
81
+ function saveWorld(world, options = {}) {
82
+ const detached = /* @__PURE__ */ new Map();
83
+ const ref = (entity) => {
84
+ if (world.entities.get(entity.id) !== entity) detached.set(entity.id, entity);
85
+ return entity.id;
86
+ };
87
+ const hitGroups = /* @__PURE__ */ new Map();
88
+ const missileHits = [];
89
+ const { terrain } = world;
90
+ const save = {
91
+ format: 5,
92
+ game: world.registry.game,
93
+ version: world.registry.saveVersion,
94
+ hash: world.registry.hash,
95
+ tickRate: world.tickRate,
96
+ tick: world.tick,
97
+ winner: world.winner,
98
+ ...world.disabled.size > 0 && { disabled: [...world.disabled.values()] },
99
+ ...world.failure && { failure: structuredClone(world.failure) },
100
+ rng: world.rng.save(),
101
+ internals: plain(world.internals(), "commands"),
102
+ cheats: { ...world.cheats },
103
+ ...world.fromMap.size > 0 && { fromMap: [...world.fromMap] },
104
+ terrain: savedGround(terrain, world.ground, world.registry.module?.maps, world.registry.module ?? {}),
105
+ players: [...world.players.values()].map((player) => ({
106
+ init: {
107
+ id: player.id,
108
+ name: player.name,
109
+ team: player.team,
110
+ color: [...player.color],
111
+ neutral: player.neutral,
112
+ creeps: player.creeps,
113
+ ...player.race !== void 0 && { race: player.race }
114
+ },
115
+ resources: { ...player.resources },
116
+ supplyUsed: player.supplyUsed,
117
+ supplyCap: player.supplyCap,
118
+ ...Object.keys(player.supplies).length > 0 && { supplies: structuredClone(player.supplies) },
119
+ established: player.established,
120
+ defeated: player.defeated,
121
+ upgrades: [...player.upgrades],
122
+ upgradesVersion: player.upgradesVersion,
123
+ researching: [...player.researching],
124
+ state: savedStates(world, player.states.values, `state of player ${player.id}`)
125
+ })),
126
+ fog: world.fog.save(),
127
+ navVersion: world.nav.version,
128
+ entities: [...world.entities.values()].map((entity) => saveEntity(world, entity)),
129
+ detached: [],
130
+ units: [...world.units.keys()],
131
+ sceneryInSight: Object.fromEntries([...world.sceneryInSight].map(([team, inSight]) => [team, [...inSight].map((entity) => entity.id)])),
132
+ projectiles: plain(world.projectiles, "projectiles"),
133
+ missiles: world.missiles.map((missile) => {
134
+ let group = hitGroups.get(missile.hit);
135
+ if (group === void 0) {
136
+ hitGroups.set(missile.hit, group = missileHits.length);
137
+ missileHits.push([...missile.hit]);
138
+ }
139
+ const { hit: _, effect, ...rest } = missile;
140
+ return {
141
+ ...plain(rest, `missile ${missile.id}`),
142
+ hit: group,
143
+ effect: effectRef(world.registry, missile.ability, effect)
144
+ };
145
+ }),
146
+ missileHits,
147
+ delayed: world.delayed.map((delayed) => {
148
+ const { caster, ability, effects, ...rest } = delayed;
149
+ return {
150
+ ...plain(rest, "delayed"),
151
+ caster: ref(caster),
152
+ ability: ability.id,
153
+ effects: effectRef(world.registry, ability.id, effects)
154
+ };
155
+ }),
156
+ zones: world.zones.map((zone) => {
157
+ const { caster, ability, effect, ...rest } = zone;
158
+ return {
159
+ ...plain(rest, `zone ${zone.id}`),
160
+ caster: ref(caster),
161
+ ability: ability.id,
162
+ effect: effectRef(world.registry, ability.id, effect)
163
+ };
164
+ }),
165
+ reveals: plain(world.reveals, "reveals"),
166
+ items: plain(world.items, "items"),
167
+ state: savedStates(world, world.states.values, "state")
168
+ };
169
+ const systems = {};
170
+ for (const system of world.systems) if (system.save) systems[system.name] = plain(system.save(world), `system ${system.name}`);
171
+ if (Object.keys(systems).length) save.systems = systems;
172
+ save.detached = [...detached.values()].map((entity) => saveEntity(world, entity));
173
+ if (options.reseat !== false) {
174
+ world.nav.settle(save.navVersion);
175
+ world.nav.reseat(save.entities.flatMap((saved) => saved.agent ? [[saved.id, saved.agent]] : []));
176
+ world.nav.settle(save.navVersion);
177
+ world.saved();
178
+ }
179
+ return save;
180
+ }
181
+ function saveEntity(world, entity) {
182
+ const where = `${entity.def.id}#${entity.id}`;
183
+ const save = {
184
+ id: entity.id,
185
+ type: entity.def.id,
186
+ owner: entity.owner
187
+ };
188
+ for (const key of ENTITY_SAVE) {
189
+ const value = entity[key];
190
+ if (value === void 0) continue;
191
+ if (key === "components") save.components = savedComponents(world, entity, where);
192
+ else save[key] = plain(value, `${where}.${key}`);
193
+ }
194
+ const agent = entity.alive && !entity.hidden && entity.get(moving) ? world.nav.saveAgent(entity.id) : void 0;
195
+ if (agent) save.agent = agent;
196
+ return save;
197
+ }
198
+ /** An entity's components as a save keeps them: each as its component says (`Component.save`), or as it is */
199
+ function savedComponents(world, entity, where) {
200
+ const saved = {};
201
+ for (const held of entity.heldComponents()) {
202
+ const { id } = held;
203
+ const value = entity.get(held);
204
+ const component = world.registry.component(id);
205
+ saved[id] = component?.save ? plain(component.save(value, world), `${where}.components.${id}`) : plain(value, `${where}.components.${id}`);
206
+ }
207
+ return saved;
208
+ }
209
+ /**
210
+ * A world's or a player's state as a save keeps it: each component as it says (`Component.save`), or as it is. The
211
+ * same hook as an entity's components, so that state kept in a form for the game as it runs (bytes, a `Map`) is
212
+ * written as plain data here and made again by `load` (`loadedStates`)
213
+ */
214
+ function savedStates(world, values, where) {
215
+ const saved = {};
216
+ for (const id in values) {
217
+ const component = world.registry.component(id);
218
+ saved[id] = component?.save ? component.save(values[id], world) : values[id];
219
+ }
220
+ return plain(saved, where);
221
+ }
222
+ /** A world's or a player's state from a save's copy of it: each component as its `load` makes it again (`savedStates`), in place */
223
+ function loadedStates(registry, saved) {
224
+ for (const id in saved) {
225
+ const component = registry.component(id);
226
+ if (component?.load) saved[id] = component.load(saved[id], registry);
227
+ }
228
+ return saved;
229
+ }
230
+ /**
231
+ * A copy of plain data: numbers, text, true and false, lists, and objects of those. Throws for anything else, saying
232
+ * where, since it would not come back the same from a save: a `Map`, a `Set`, an entity, a function
233
+ */
234
+ var plain = (value, where) => plain$1(value, where, "Save", "keep ids and plain objects in game state");
235
+ /** The players of a save, as a world is made with them */
236
+ var savedPlayers = (save) => save.players.map((player) => ({
237
+ ...player.init,
238
+ resources: { ...player.resources }
239
+ }));
240
+ /**
241
+ * Fills a world just made from the game module and the terrain and players of the save with the rest of it. The save
242
+ * is one of the format and the version read now: an older one goes through `updateSave` first, as `loadWorld` does
243
+ */
244
+ function restoreWorld(world, save) {
245
+ if (save.format !== 5) throw new SaveError(`Save: format ${save.format} is not one this game reads`, "notASave");
246
+ if (save.tickRate !== world.tickRate) throw new Error(`Save: made at ${save.tickRate} ticks a second, the world runs at ${world.tickRate}`);
247
+ const { registry } = world;
248
+ world.tick = save.tick;
249
+ world.winner = save.winner;
250
+ world.rng.restore(save.rng);
251
+ world.restoreInternals(save.internals);
252
+ restoreRedefinitions(registry, save.state[redefinitions.id]);
253
+ Object.assign(world.cheats, save.cheats);
254
+ for (const [object, entity] of save.fromMap ?? []) world.fromMap.set(object, entity);
255
+ for (const saved of save.players) {
256
+ const player = world.player(saved.init.id);
257
+ Object.assign(player.resources, saved.resources);
258
+ player.supplyUsed = saved.supplyUsed;
259
+ player.supplyCap = saved.supplyCap;
260
+ if (saved.supplies) player.supplies = structuredClone(saved.supplies);
261
+ player.established = saved.established;
262
+ player.defeated = saved.defeated;
263
+ for (const [upgrade, level] of saved.upgrades) player.setUpgrade(upgrade, level);
264
+ player.upgradesVersion = saved.upgradesVersion;
265
+ for (const upgrade of saved.researching) player.researching.add(upgrade);
266
+ Object.assign(player.states.values, loadedStates(registry, structuredClone(saved.state)));
267
+ }
268
+ world.fog.restore(save.fog);
269
+ const detached = new Map(save.detached.map((saved) => [saved.id, loadEntity(registry, saved)]));
270
+ world.nav.holdObstacles?.(true);
271
+ for (const saved of save.entities) {
272
+ const entity = loadEntity(registry, saved);
273
+ world.entities.set(entity.id, entity);
274
+ world.index.add(entity);
275
+ if (entity.isStructure && entity.alive) {
276
+ world.spatial.insertStatic(entity);
277
+ if (entity.cell) {
278
+ const fp = footprintOf(entity.def);
279
+ world.grid.occupy(entity.cell.x, entity.cell.z, fp.w, fp.d, entity.id);
280
+ if (!registry.standsOpen(entity) && !world.nav.addObstacle(entity.id, entity.rect)) world.log.warn("navigation", `There is no room for another obstacle: ${entity.def.id} does not block the way`, { entity: entity.id });
281
+ }
282
+ }
283
+ }
284
+ world.nav.holdObstacles?.(false);
285
+ world.restoreDead(save.internals.dead ?? []);
286
+ world.nav.settle(save.navVersion);
287
+ for (const saved of save.entities) if (saved.agent) world.nav.restoreAgent(saved.id, saved.agent);
288
+ world.nav.settle(save.navVersion);
289
+ for (const id of save.units) world.units.set(id, world.entities.get(id) ?? fail(`unit ${id} is not in the save`));
290
+ for (const [team, ids] of Object.entries(save.sceneryInSight)) world.sceneryInSight.set(Number(team), new Set(ids.map((id) => world.entities.get(id) ?? fail(`scenery ${id} is not in the save`))));
291
+ const entity = (id) => world.entities.get(id) ?? detached.get(id) ?? fail(`entity ${id} is not in the save`);
292
+ const ability = (id) => registry.ability(id);
293
+ world.projectiles.push(...structuredClone(save.projectiles));
294
+ const hits = save.missileHits.map((ids) => new Set(ids));
295
+ for (const missile of save.missiles) world.missiles.push({
296
+ ...structuredClone(missile),
297
+ hit: hits[missile.hit],
298
+ effect: resolveEffect(registry, missile.ability, missile.effect)
299
+ });
300
+ for (const delayed of save.delayed) {
301
+ const { caster, ability: id, effects, ...rest } = structuredClone(delayed);
302
+ world.delayed.push({
303
+ ...rest,
304
+ caster: entity(caster),
305
+ ability: ability(id),
306
+ effects: resolveEffect(registry, id, effects)
307
+ });
308
+ }
309
+ for (const zone of save.zones) {
310
+ const { caster, ability: id, effect, ...rest } = structuredClone(zone);
311
+ world.zones.push({
312
+ ...rest,
313
+ caster: entity(caster),
314
+ ability: ability(id),
315
+ effect: resolveEffect(registry, id, effect)
316
+ });
317
+ }
318
+ world.reveals.push(...structuredClone(save.reveals));
319
+ Object.assign(world.states.values, loadedStates(registry, structuredClone(save.state)));
320
+ world.sidePaths?.restore(world, world.states.has(sideKnowledge) ? world.state(sideKnowledge) : {});
321
+ world.items.push(...structuredClone(save.items));
322
+ world.restoreSystems(save.systems ?? {});
323
+ if (save.disabled) world.disable(save.disabled);
324
+ if (save.failure) world.failure = structuredClone(save.failure);
325
+ }
326
+ function loadEntity(registry, saved) {
327
+ const { id, type, owner, agent: _, pos, ...fields } = structuredClone(saved);
328
+ const entity = new Entity(id, registry.unit(type), owner, pos);
329
+ for (const key of Object.keys(fields)) if (!SAVED_FIELDS.has(key)) fail(`${type}#${id} has "${key}", which is not a field of an entity a save keeps`);
330
+ for (const [key, value] of Object.entries(fields)) if (key === "components") for (const [componentId, value] of Object.entries(fields.components)) {
331
+ const component = registry.component(componentId);
332
+ entity.set(component, component.load ? component.load(value, registry) : value);
333
+ }
334
+ else entity.restore(key, value);
335
+ return entity;
336
+ }
337
+ function fail(what) {
338
+ throw new Error(`Save: ${what}`);
339
+ }
340
+ /**
341
+ * A save that is not loaded, and why: for a list of saves to say, in words of its own
342
+ *
343
+ * @beta
344
+ */
345
+ var SaveError = class extends Error {
346
+ reason;
347
+ missing;
348
+ constructor(message, reason, missing) {
349
+ super(message);
350
+ this.reason = reason;
351
+ this.missing = missing;
352
+ this.name = "SaveError";
353
+ }
354
+ };
355
+ /**
356
+ * The header of a save
357
+ *
358
+ * @beta
359
+ */
360
+ var saveHeader = (save) => ({
361
+ format: save.format,
362
+ game: save.game,
363
+ version: save.version ?? 1,
364
+ hash: save.hash
365
+ });
366
+ var isCount = (value) => typeof value === "number" && Number.isInteger(value) && value >= 1;
367
+ /** What a game does about a save of its version made with other rules: what it says, else it loads when it declares `saves` at all */
368
+ var mismatchPolicy = (registry) => registry.module?.saves?.onMismatch ?? (registry.module?.saves ? "load" : "refuse");
369
+ function otherRules(header, registry) {
370
+ return new SaveError(`Save: made with another version of "${registry.game}" (${header.hash}, this is ${registry.hash}). Its rules or its mods changed since` + (registry.module?.saves ? "" : ": a game that declares Rules.saves loads it all the same"), "rules");
371
+ }
372
+ /** Why a save is refused that its header alone says: another game's, newer than this reads, or with no way up from its version */
373
+ function headerProblem(header, registry) {
374
+ const { format } = header;
375
+ const version = header.version ?? 1;
376
+ if (!isCount(format)) return new SaveError(`Save: format ${String(format)} is not one this game reads`, "notASave");
377
+ if (!isCount(version)) return new SaveError(`Save: version ${String(version)} is not one this game reads`, "notASave");
378
+ if (header.game !== registry.game) return new SaveError(`Save: made with the game "${header.game}", not "${registry.game}"`, "game");
379
+ if (format > 5) return new SaveError(`Save: format ${format} is newer than this game reads (5): it was saved by a newer version of the game`, "newer");
380
+ if (format < 5) return new SaveError(`Save: format ${format} is older than this game reads (5)`, "noWay");
381
+ const to = registry.saveVersion;
382
+ if (version > to) return new SaveError(`Save: version ${version} of the saves of "${registry.game}" is newer than this game reads (${to}): it was saved by a newer version of the game`, "newer");
383
+ const migrate = registry.module?.saves?.migrate;
384
+ if (typeof migrate === "function") return void 0;
385
+ for (let from = version; from < to; from++) if (!migrate?.[from]) return new SaveError(`Save: version ${version} of the saves of "${registry.game}", and the game has no way from ${from} to ${from + 1} (Rules.saves.migrate)`, "noWay");
386
+ }
387
+ /**
388
+ * Whether a game loads a save, as far as the save's header says (`saveHeader`): nothing, or why not. For a list of
389
+ * saves, which has no need to read each of them whole. What only the whole save says (something in it the game no
390
+ * longer has, a game that decides save by save) is found as it is loaded (`updateSave`, `loadWorld`)
391
+ *
392
+ * @beta
393
+ */
394
+ function saveProblem(header, registry) {
395
+ const refused = headerProblem(header, registry);
396
+ if (refused) return refused;
397
+ if ((header.version ?? 1) === registry.saveVersion && header.hash !== registry.hash && mismatchPolicy(registry) === "refuse") return otherRules(header, registry);
398
+ }
399
+ /**
400
+ * 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
401
+ * it; a tool that keeps saves up to date runs it by itself. The save handed in is not changed. Throws a `SaveError`,
402
+ * which says why, for one that cannot be read: another game's, newer than this game, of a version the game has no
403
+ * step from, made with other rules by a game that refuses those (`anyVersion` loads it all the same), or with
404
+ * something in it the game no longer has, all of which the error names
405
+ *
406
+ * @beta
407
+ */
408
+ function updateSave(data, registry, options = {}) {
409
+ if (typeof data !== "object" || data === null) throw new SaveError("Save: not a save", "notASave");
410
+ const header = data;
411
+ const refused = headerProblem(header, registry);
412
+ if (refused) throw refused;
413
+ const from = header.version ?? 1;
414
+ const to = registry.saveVersion;
415
+ let save = data;
416
+ if (from < to) {
417
+ save = structuredClone(data);
418
+ const migrate = registry.module?.saves?.migrate;
419
+ if (typeof migrate === "function") {
420
+ if (from < to) save = migrate(save, from, to) ?? save;
421
+ } else for (let version = from; version < to; version++) save = migrate[version](save) ?? save;
422
+ }
423
+ if (from === to && header.hash !== registry.hash && !options.anyVersion) {
424
+ const policy = mismatchPolicy(registry);
425
+ if ((typeof policy === "function" ? policy(save, registry.hash) : policy) === "refuse") throw otherRules(header, registry);
426
+ }
427
+ const missing = missingIn(save, registry);
428
+ if (missing) {
429
+ const said = Object.entries(missing).map(([kind, ids]) => `the ${KINDS[kind]} ${ids.map((id) => `"${id}"`).join(", ")}`);
430
+ throw new SaveError(`Save: it has what "${registry.game}" does not have: ${said.join("; ")}. A step of the game's (Rules.saves.migrate) says what becomes of them`, "missing", missing);
431
+ }
432
+ return {
433
+ ...save,
434
+ format: 5,
435
+ version: to,
436
+ hash: registry.hash
437
+ };
438
+ }
439
+ var KINDS = {
440
+ unit: "unit types",
441
+ ability: "abilities",
442
+ buff: "buffs",
443
+ item: "items",
444
+ upgrade: "upgrades",
445
+ order: "orders",
446
+ component: "components",
447
+ timer: "timers",
448
+ sequence: "sequences"
449
+ };
450
+ /**
451
+ * What a save names that the game does not have: found before a world is made of it, and said all at once, where
452
+ * each would otherwise throw by itself at the moment the game came to it, some of them minutes into the game loaded
453
+ */
454
+ function missingIn(save, registry) {
455
+ const missing = {};
456
+ const check = (kind, has) => (id) => {
457
+ if (typeof id === "string" && !has(id) && !missing[kind]?.includes(id)) (missing[kind] ??= []).push(id);
458
+ };
459
+ const kept = save.state[redefinitions.id] ?? {};
460
+ const defined = (kind) => (id) => registry.kinds[kind].has(id) || typeof kept[kind]?.[id]?.["copyOf"] === "string";
461
+ const unit = check("unit", defined("units"));
462
+ const ability = check("ability", defined("abilities"));
463
+ const buff = check("buff", defined("buffs"));
464
+ const item = check("item", defined("items"));
465
+ const upgrade = check("upgrade", defined("upgrades"));
466
+ const order = check("order", (id) => registry.orders.has(id));
467
+ const component = check("component", (id) => registry.component(id) !== void 0);
468
+ const named = {
469
+ units: unit,
470
+ abilities: ability,
471
+ buffs: buff,
472
+ items: item,
473
+ upgrades: upgrade
474
+ };
475
+ const components = (values) => {
476
+ for (const [id, value] of Object.entries(values ?? {})) {
477
+ component(id);
478
+ const refs = registry.component(id)?.refs?.(value);
479
+ if (refs) for (const kind of Object.keys(refs)) refs[kind]?.forEach(named[kind]);
480
+ }
481
+ };
482
+ const placed = (effect) => !!effect && "path" in effect;
483
+ components(save.state);
484
+ for (const player of save.players) {
485
+ components(player.state);
486
+ for (const [id] of player.upgrades) upgrade(id);
487
+ for (const id of player.researching) upgrade(id);
488
+ }
489
+ for (const entity of [...save.entities, ...save.detached]) {
490
+ unit(entity.type);
491
+ components(entity.components);
492
+ for (const state of entity.abilities ?? []) ability(state.id);
493
+ for (const instance of entity.buffs ?? []) buff(instance.id);
494
+ for (const given of entity.orders ?? []) {
495
+ order(given.type);
496
+ unit(given.init?.unitType);
497
+ }
498
+ }
499
+ for (const missile of save.missiles) if (placed(missile.effect)) ability(missile.ability);
500
+ for (const delayed of save.delayed) ability(delayed.ability);
501
+ for (const zone of save.zones) ability(zone.ability);
502
+ for (const dropped of save.items) item(dropped.item);
503
+ const game = registry.module;
504
+ if (game) {
505
+ const timers = new Set([...coreTimers, ...registry.assembly?.timers ?? game.timers ?? []].map((def) => def.id));
506
+ const sequences = new Set((game.sequences ?? []).map((def) => def.id));
507
+ waitingTimers(save.state).forEach(check("timer", (id) => timers.has(id)));
508
+ runningSequences(save.state).forEach(check("sequence", (id) => sequences.has(id)));
509
+ }
510
+ return Object.keys(missing).length > 0 ? missing : void 0;
511
+ }
512
+ /**
513
+ * A save as text. JSON, but for numbers JSON has no words for, which game state has: buffs that last forever
514
+ * (`Infinity`), something never hurt (`-Infinity`)
515
+ *
516
+ * @beta
517
+ */
518
+ function encodeSave(save) {
519
+ return JSON.stringify(save, (_key, value) => typeof value === "number" && !Number.isFinite(value) ? { $number: String(value) } : value);
520
+ }
521
+ /**
522
+ * Reads a save back from text written by `encodeSave`, turning the stored non-finite numbers into numbers again
523
+ *
524
+ * @beta
525
+ */
526
+ function decodeSave(text) {
527
+ return JSON.parse(text, (_key, value) => value && typeof value === "object" && Object.keys(value).length === 1 && typeof value.$number === "string" ? Number(value.$number) : value);
528
+ }
529
+ //#endregion
530
+ export { ENTITY_DERIVED, ENTITY_SAVE, SAVE_FORMAT, SaveError, decodeSave, encodeSave, restoreWorld, saveHeader, saveProblem, saveWorld, savedPlayers, updateSave };
531
+
532
+ //# sourceMappingURL=save.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"save.js","names":["plainData"],"sources":["../src/save.ts"],"sourcesContent":["import type { ErrorSite, WorldFailure } from './errors'\nimport { sideKnowledge } from './navigation/sidePaths'\nimport { COPY_OF, type DataKind, redefinitions, restoreRedefinitions } from './gameData'\nimport type { AbilityDef } from './defs'\nimport { footprintOf } from './defs'\nimport type { SavedRefs } from './components'\nimport { type AbilityState, type BuffInstance, Entity, type EntityId, moving, type Order } from './entity'\nimport type { FogSave } from './fog'\nimport type { GroundItem } from './items'\nimport type { AgentSave } from './navigation/navigation'\nimport { effectRef, type EffectRef, resolveEffect } from './effectRefs'\nimport { plain as plainData } from './plain'\nimport type { PlayerInit, Purse } from './player'\nimport type { Registry } from './registry'\nimport { coreTimers, runningSequences } from './sequences'\nimport { savedGround, type SavedGround } from './ground'\nimport { waitingTimers } from './timers'\nimport type { Delayed, Missile, Projectile, Reveal, World, WorldInternals, Zone } from './world'\n\n/**\n * A world saved: everything it takes to carry on with a game later, somewhere else, or from the same moment more\n * than once. Plain data, and with `encodeSave` text: what is in the world points to definitions by id, and to\n * other entities by id.\n *\n * What is not in it:\n * - the game module (`WorldSave.game` names it), which `loadWorld` is given again;\n * - navigation, which is built again from the terrain and the structures, with the agents put back where they were;\n * - systems added while the game ran (`World.addSystem`), like a computer player: whoever loads adds them again,\n * and what they keep in themselves (`System.save`) goes back into them as they are added;\n * - state a game module keeps outside the world, like in a `WeakMap` keyed by it. Keep it in components instead\n * (`World.state`, `Player.state`, `Entity.get`), which are in here.\n *\n * 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\n * itself, which the engine brings up to date by itself. `version` is the game's: what the game keeps in a save (its\n * unit types, its components), which the game brings up to date (`Rules.saves`). A save is read through both\n * (`updateSave`), the engine's first\n *\n * @beta\n */\nexport interface WorldSave {\n\t/** The shape of the save itself (`SAVE_FORMAT`): the engine's to change, and to bring an older one up to */\n\tformat: typeof SAVE_FORMAT\n\t/** Id of the game module the world was made with */\n\tgame: string\n\t/** The version of what the game keeps in a save (`Rules.saves.version`): 1 for a game that says none */\n\tversion: number\n\t/**\n\t * Which rules it was made with exactly, mods and code included (see `gameHash`): whether it can be loaded as it is.\n\t * What a game does about a save of other rules is its own to say (`Rules.saves.onMismatch`)\n\t */\n\thash: string\n\t/** Ticks per second the world was running at */\n\ttickRate: number\n\t/** The tick number the world was at when saved */\n\ttick: number\n\t/** The winning team, or null while the game has none */\n\twinner: number | null\n\t/** The parts of the game switched off for having thrown (`world.disabled`): off again in the world loaded. None when left out */\n\tdisabled?: ErrorSite[]\n\t/** Why the game ended on an error (`world.failure`), for a save taken of one that did */\n\tfailure?: WorldFailure\n\t/** The state of the world's random generator (`Rng.save`), so the loaded game draws the same numbers */\n\trng: number\n\t/** The world's own counters and bookkeeping that are not entities (`WorldInternals`) */\n\tinternals: WorldInternals\n\t/** The cheats switched on in the world (`World.cheats`) */\n\tcheats: World['cheats']\n\t/** The entity each object of the map became, by the object's id (`World.fromMap`): as `[object, entity]`. None when left out */\n\tfromMap?: [number, EntityId][]\n\t/** The ground: all of it, or the map the world was made from and what changed of it since (S36, format 3) */\n\tterrain: SavedGround\n\t/** Each player's state: resources, supply, upgrades and the state of modules */\n\tplayers: PlayerSave[]\n\t/** What the fog of war keeps of what was seen */\n\tfog: FogSave\n\t/** Where walkable space was at: movement looks for a new path when it changes */\n\tnavVersion: number\n\t/** Everything in the world, in the order it was put there */\n\tentities: EntitySave[]\n\t/** Entities that left the world but are still pointed at, like the caster of something that has yet to land */\n\tdetached: EntitySave[]\n\t/** Ids of the entities that act, in the order they are gone through: who goes first can decide what happens */\n\t/** The entities that act (`World.units`), by id */\n\tunits: EntityId[]\n\t/** Scenery each team sees, by team */\n\tsceneryInSight: Record<number, EntityId[]>\n\t/** Projectiles in flight */\n\tprojectiles: Projectile[]\n\t/** Missiles in flight */\n\tmissiles: MissileSave[]\n\t/** What missiles sent together have passed through, which they share */\n\tmissileHits: EntityId[][]\n\t/** Things scheduled to happen later (`World.after`), with the time left to each */\n\tdelayed: DelayedSave[]\n\t/** Zones that act on what stands in them for a time */\n\tzones: ZoneSave[]\n\t/** Patches of ground revealed to a team for a time */\n\treveals: Reveal[]\n\t/** Items lying on the ground */\n\titems: GroundItem[]\n\t/** State of game modules and mods for the whole game, by component id (see `World.state`) */\n\tstate: Record<string, unknown>\n\t/** What systems keep in themselves (`System.save`), by their name */\n\tsystems?: Record<string, unknown>\n}\n\n/**\n * The format saves are written in now: a save of another is refused. The engine keeps no steps up from an older one\n * while it and its games are made (a game's own versions have `SaveRules.migrate`)\n *\n * @beta\n */\nexport const SAVE_FORMAT = 5\n\ninterface PlayerSave {\n\tinit: PlayerInit\n\tresources: Purse\n\tsupplyUsed: number\n\tsupplyCap: number\n\t/** The game's other pools (`RuleSettings.supply.pools`): left out of a save made before there were any */\n\tsupplies?: Record<string, { used: number; cap: number }>\n\testablished: boolean\n\tdefeated: boolean\n\tupgrades: [string, number][]\n\tupgradesVersion: number\n\tresearching: string[]\n\t/** State of game modules and mods for the player, by component id */\n\tstate: Record<string, unknown>\n}\n\n/**\n * An entity: its type, and every field it has, as plain data. `agent` is how it moves, when it does\n *\n * @beta\n */\nexport type EntitySave = { id: EntityId; type: string; owner: number; agent?: AgentSave } & Record<string, unknown>\n\ntype MissileSave = Omit<Missile, 'hit' | 'effect'> & { hit: number; effect: EffectRef }\ntype DelayedSave = Omit<Delayed, 'caster' | 'ability' | 'effects'> & { caster: EntityId; ability: string; effects: EffectRef }\ntype ZoneSave = Omit<Zone, 'caster' | 'ability' | 'effect'> & { caster: EntityId; ability: string; effect: EffectRef }\n\n/**\n * What a save keeps of an entity besides its id, type and owner, field by field: nothing else is written, and a save\n * that has anything else is refused. A field the engine adds is either here or among those it works out again\n * (`ENTITY_DERIVED`): a test holds every field of an entity to one of the two\n *\n * @internal\n */\nexport const ENTITY_SAVE = [\n\t'alive',\n\t'hidden',\n\t'scenery',\n\t'pos',\n\t'prevPos',\n\t'facing',\n\t'prevFacing',\n\t'scale',\n\t'look',\n\t'likeness',\n\t'velocity',\n\t'health',\n\t'seenBy',\n\t'hurtAt',\n\t'expires',\n\t'lifetime',\n\t'unseenIn',\n\t'orders',\n\t'maxHealth',\n\t'mana',\n\t'maxMana',\n\t'asleep',\n\t'reviving',\n\t'abilities',\n\t'buffs',\n\t'on',\n\t'cell',\n\t'components'\n] as const satisfies readonly (keyof Entity)[]\n\n/**\n * An entity's fields that are worked out again from the rest, or the engine's bookkeeping: never saved as they are.\n * Its components' values and their order (`slots`, `held`) are saved by id, as `components`, and filed again as it is\n * loaded\n *\n * @internal\n */\nexport const ENTITY_DERIVED = [\n\t'id',\n\t'def',\n\t'owner',\n\t'statsCache',\n\t'told',\n\t'buffFlags',\n\t'buffFlagsOf',\n\t'spatialStamp',\n\t'index',\n\t'slots',\n\t'held'\n] as const satisfies readonly (keyof Entity)[]\n\nconst SAVED_FIELDS = new Set<string>(ENTITY_SAVE)\n\n// ---- Saving\n\n/**\n * How a world is saved (`saveWorld`)\n *\n * @beta\n */\nexport interface SaveWorldOptions {\n\t/**\n\t * Whether the world's crowd is put back from what the save keeps of it, as loading the save puts it (determinism\n\t * D2): the game saved and a game loaded from the save then go on exactly the same. A save keeps where each agent is\n\t * and where it goes, not the crowd's own working (the order it moves its agents in, the paths it is part way\n\t * along), which cannot be put back as it was. Yes when left out; `false` for a look at the state that leaves the\n\t * world as it was (`worldState`, `worldHash`)\n\t *\n\t * @beta\n\t */\n\treseat?: boolean\n}\n\n/**\n * Saves a world, between two ticks. Throws, saying where, when something in it is not plain data\n *\n * @public\n */\nexport function saveWorld(world: World, options: SaveWorldOptions = {}): WorldSave {\n\tconst detached = new Map<EntityId, Entity>()\n\tconst ref = (entity: Entity) => {\n\t\tif (world.entities.get(entity.id) !== entity) detached.set(entity.id, entity)\n\t\treturn entity.id\n\t}\n\tconst hitGroups = new Map<Set<EntityId>, number>()\n\tconst missileHits: EntityId[][] = []\n\tconst { terrain } = world\n\n\tconst save: WorldSave = {\n\t\tformat: SAVE_FORMAT,\n\t\tgame: world.registry.game,\n\t\tversion: world.registry.saveVersion,\n\t\thash: world.registry.hash,\n\t\ttickRate: world.tickRate,\n\t\ttick: world.tick,\n\t\twinner: world.winner,\n\t\t...(world.disabled.size > 0 && { disabled: [...world.disabled.values()] }),\n\t\t...(world.failure && { failure: structuredClone(world.failure) }),\n\t\trng: world.rng.save(),\n\t\tinternals: plain(world.internals(), 'commands') as WorldInternals,\n\t\tcheats: { ...world.cheats },\n\t\t...(world.fromMap.size > 0 && { fromMap: [...world.fromMap] }),\n\t\tterrain: savedGround(terrain, world.ground, world.registry.module?.maps, world.registry.module ?? {}),\n\t\tplayers: [...world.players.values()].map((player) => ({\n\t\t\tinit: {\n\t\t\t\tid: player.id,\n\t\t\t\tname: player.name,\n\t\t\t\tteam: player.team,\n\t\t\t\tcolor: [...player.color],\n\t\t\t\tneutral: player.neutral,\n\t\t\t\tcreeps: player.creeps,\n\t\t\t\t...(player.race !== undefined && { race: player.race })\n\t\t\t},\n\t\t\tresources: { ...player.resources },\n\t\t\tsupplyUsed: player.supplyUsed,\n\t\t\tsupplyCap: player.supplyCap,\n\t\t\t...(Object.keys(player.supplies).length > 0 && { supplies: structuredClone(player.supplies) }),\n\t\t\testablished: player.established,\n\t\t\tdefeated: player.defeated,\n\t\t\tupgrades: [...player.upgrades],\n\t\t\tupgradesVersion: player.upgradesVersion,\n\t\t\tresearching: [...player.researching],\n\t\t\tstate: savedStates(world, player.states.values, `state of player ${player.id}`)\n\t\t})),\n\t\tfog: world.fog.save(),\n\t\tnavVersion: world.nav.version,\n\t\tentities: [...world.entities.values()].map((entity) => saveEntity(world, entity)),\n\t\tdetached: [],\n\t\tunits: [...world.units.keys()],\n\t\tsceneryInSight: Object.fromEntries([...world.sceneryInSight].map(([team, inSight]) => [team, [...inSight].map((entity) => entity.id)])),\n\t\tprojectiles: plain(world.projectiles, 'projectiles') as Projectile[],\n\t\tmissiles: world.missiles.map((missile) => {\n\t\t\tlet group = hitGroups.get(missile.hit)\n\t\t\tif (group === undefined) {\n\t\t\t\thitGroups.set(missile.hit, (group = missileHits.length))\n\t\t\t\tmissileHits.push([...missile.hit])\n\t\t\t}\n\t\t\tconst { hit: _, effect, ...rest } = missile\n\t\t\treturn {\n\t\t\t\t...(plain(rest, `missile ${missile.id}`) as Omit<Missile, 'hit' | 'effect'>),\n\t\t\t\thit: group,\n\t\t\t\teffect: effectRef(world.registry, missile.ability, effect)\n\t\t\t}\n\t\t}),\n\t\tmissileHits,\n\t\tdelayed: world.delayed.map((delayed) => {\n\t\t\tconst { caster, ability, effects, ...rest } = delayed\n\t\t\treturn {\n\t\t\t\t...(plain(rest, 'delayed') as Omit<Delayed, 'caster' | 'ability' | 'effects'>),\n\t\t\t\tcaster: ref(caster),\n\t\t\t\tability: ability.id,\n\t\t\t\teffects: effectRef(world.registry, ability.id, effects)\n\t\t\t}\n\t\t}),\n\t\tzones: world.zones.map((zone) => {\n\t\t\tconst { caster, ability, effect, ...rest } = zone\n\t\t\treturn {\n\t\t\t\t...(plain(rest, `zone ${zone.id}`) as Omit<Zone, 'caster' | 'ability' | 'effect'>),\n\t\t\t\tcaster: ref(caster),\n\t\t\t\tability: ability.id,\n\t\t\t\teffect: effectRef(world.registry, ability.id, effect)\n\t\t\t}\n\t\t}),\n\t\treveals: plain(world.reveals, 'reveals') as Reveal[],\n\t\titems: plain(world.items, 'items') as GroundItem[],\n\t\tstate: savedStates(world, world.states.values, 'state')\n\t}\n\tconst systems: Record<string, unknown> = {}\n\tfor (const system of world.systems) if (system.save) systems[system.name] = plain(system.save(world), `system ${system.name}`)\n\tif (Object.keys(systems).length) save.systems = systems\n\tsave.detached = [...detached.values()].map((entity) => saveEntity(world, entity))\n\tif (options.reseat !== false) {\n\t\t// the crowd as a world loaded from this save will have it: these agents and no others, in this order, put back on\n\t\t// the ground with every structure in it (as a load puts them: an obstacle still waiting to be cut out would have\n\t\t// a target on a tile's edge snap to the other tile), settled\n\t\tworld.nav.settle(save.navVersion)\n\t\tworld.nav.reseat(save.entities.flatMap((saved) => (saved.agent ? [[saved.id, saved.agent] as const] : [])))\n\t\tworld.nav.settle(save.navVersion)\n\t\tworld.saved()\n\t}\n\treturn save\n}\n\nfunction saveEntity(world: World, entity: Entity): EntitySave {\n\tconst where = `${entity.def.id}#${entity.id}`\n\tconst save: EntitySave = { id: entity.id, type: entity.def.id, owner: entity.owner }\n\tfor (const key of ENTITY_SAVE) {\n\t\tconst value = entity[key]\n\t\tif (value === undefined) continue\n\t\tif (key === 'components') save.components = savedComponents(world, entity, where)\n\t\telse save[key] = plain(value, `${where}.${key}`)\n\t}\n\tconst agent = entity.alive && !entity.hidden && entity.get(moving) ? world.nav.saveAgent(entity.id) : undefined\n\tif (agent) save.agent = agent\n\treturn save\n}\n\n/** An entity's components as a save keeps them: each as its component says (`Component.save`), or as it is */\nfunction savedComponents(world: World, entity: Entity, where: string): Record<string, unknown> {\n\tconst saved: Record<string, unknown> = {}\n\tfor (const held of entity.heldComponents()) {\n\t\tconst { id } = held\n\t\tconst value = entity.get(held)\n\t\tconst component = world.registry.component(id)\n\t\tsaved[id] = component?.save\n\t\t\t? plain(component.save(value as never, world), `${where}.components.${id}`)\n\t\t\t: plain(value, `${where}.components.${id}`)\n\t}\n\treturn saved\n}\n\n/**\n * A world's or a player's state as a save keeps it: each component as it says (`Component.save`), or as it is. The\n * same hook as an entity's components, so that state kept in a form for the game as it runs (bytes, a `Map`) is\n * written as plain data here and made again by `load` (`loadedStates`)\n */\nfunction savedStates(world: World, values: Record<string, unknown>, where: string): Record<string, unknown> {\n\tconst saved: Record<string, unknown> = {}\n\tfor (const id in values) {\n\t\tconst component = world.registry.component(id)\n\t\tsaved[id] = component?.save ? component.save(values[id] as never, world) : values[id]\n\t}\n\treturn plain(saved, where) as Record<string, unknown>\n}\n\n/** A world's or a player's state from a save's copy of it: each component as its `load` makes it again (`savedStates`), in place */\nfunction loadedStates(registry: Registry, saved: Record<string, unknown>): Record<string, unknown> {\n\tfor (const id in saved) {\n\t\tconst component = registry.component(id)\n\t\tif (component?.load) saved[id] = component.load(saved[id], registry)\n\t}\n\treturn saved\n}\n\n/**\n * A copy of plain data: numbers, text, true and false, lists, and objects of those. Throws for anything else, saying\n * where, since it would not come back the same from a save: a `Map`, a `Set`, an entity, a function\n */\nconst plain = (value: unknown, where: string): unknown => plainData(value, where, 'Save', 'keep ids and plain objects in game state')\n\n// ---- Loading\n\n/** The players of a save, as a world is made with them */\nexport const savedPlayers = (save: WorldSave): PlayerInit[] => save.players.map((player) => ({ ...player.init, resources: { ...player.resources } }))\n\n/**\n * Fills a world just made from the game module and the terrain and players of the save with the rest of it. The save\n * is one of the format and the version read now: an older one goes through `updateSave` first, as `loadWorld` does\n */\nexport function restoreWorld(world: World, save: WorldSave): void {\n\tif (save.format !== SAVE_FORMAT) throw new SaveError(`Save: format ${save.format} is not one this game reads`, 'notASave')\n\tif (save.tickRate !== world.tickRate) throw new Error(`Save: made at ${save.tickRate} ticks a second, the world runs at ${world.tickRate}`)\n\tconst { registry } = world\n\tworld.tick = save.tick\n\tworld.winner = save.winner\n\tworld.rng.restore(save.rng)\n\tworld.restoreInternals(save.internals)\n\t// what the definitions were changed to while it ran, before anything is made of them\n\trestoreRedefinitions(registry, save.state[redefinitions.id])\n\tObject.assign(world.cheats, save.cheats)\n\tfor (const [object, entity] of save.fromMap ?? []) world.fromMap.set(object, entity)\n\n\tfor (const saved of save.players) {\n\t\tconst player = world.player(saved.init.id)\n\t\tObject.assign(player.resources, saved.resources)\n\t\tplayer.supplyUsed = saved.supplyUsed\n\t\tplayer.supplyCap = saved.supplyCap\n\t\tif (saved.supplies) player.supplies = structuredClone(saved.supplies)\n\t\tplayer.established = saved.established\n\t\tplayer.defeated = saved.defeated\n\t\tfor (const [upgrade, level] of saved.upgrades) player.setUpgrade(upgrade, level)\n\t\tplayer.upgradesVersion = saved.upgradesVersion\n\t\tfor (const upgrade of saved.researching) player.researching.add(upgrade)\n\t\tObject.assign(player.states.values, loadedStates(registry, structuredClone(saved.state)))\n\t}\n\tworld.fog.restore(save.fog)\n\n\tconst detached = new Map(save.detached.map((saved) => [saved.id, loadEntity(registry, saved)]))\n\t// every structure's obstacle made into the ground's tiles together: a wooded tile once, not once a tree (RV42)\n\tworld.nav.holdObstacles?.(true)\n\tfor (const saved of save.entities) {\n\t\tconst entity = loadEntity(registry, saved)\n\t\tworld.entities.set(entity.id, entity)\n\t\tworld.index.add(entity)\n\t\t// what is on the ground takes up its cells, and is in the way of who walks\n\t\tif (entity.isStructure && entity.alive) {\n\t\t\tworld.spatial.insertStatic(entity)\n\t\t\tif (entity.cell) {\n\t\t\t\t// (a gate standing open is in nobody's way: left out of the ways, as it was when the save was taken)\n\t\t\t\tconst fp = footprintOf(entity.def)\n\t\t\t\tworld.grid.occupy(entity.cell.x, entity.cell.z, fp.w, fp.d, entity.id)\n\t\t\t\tif (!registry.standsOpen(entity) && !world.nav.addObstacle(entity.id, entity.rect))\n\t\t\t\t\tworld.log.warn('navigation', `There is no room for another obstacle: ${entity.def.id} does not block the way`, { entity: entity.id })\n\t\t\t}\n\t\t}\n\t}\n\tworld.nav.holdObstacles?.(false)\n\tworld.restoreDead(save.internals.dead ?? [])\n\t// agents last, on walkable space with every structure in it, cut out first: where an agent and its target are\n\t// snapped to is the same as for the game the save was taken of\n\tworld.nav.settle(save.navVersion)\n\tfor (const saved of save.entities) if (saved.agent) world.nav.restoreAgent(saved.id, saved.agent)\n\tworld.nav.settle(save.navVersion)\n\tfor (const id of save.units) world.units.set(id, world.entities.get(id) ?? fail(`unit ${id} is not in the save`))\n\tfor (const [team, ids] of Object.entries(save.sceneryInSight)) {\n\t\tworld.sceneryInSight.set(Number(team), new Set(ids.map((id) => world.entities.get(id) ?? fail(`scenery ${id} is not in the save`))))\n\t}\n\n\tconst entity = (id: EntityId) => world.entities.get(id) ?? detached.get(id) ?? fail(`entity ${id} is not in the save`)\n\tconst ability = (id: string): AbilityDef => registry.ability(id)\n\tworld.projectiles.push(...(structuredClone(save.projectiles) as Projectile[]))\n\tconst hits = save.missileHits.map((ids) => new Set(ids))\n\tfor (const missile of save.missiles) {\n\t\tworld.missiles.push({ ...structuredClone(missile), hit: hits[missile.hit], effect: resolveEffect(registry, missile.ability, missile.effect) })\n\t}\n\tfor (const delayed of save.delayed) {\n\t\tconst { caster, ability: id, effects, ...rest } = structuredClone(delayed)\n\t\tworld.delayed.push({ ...rest, caster: entity(caster), ability: ability(id), effects: resolveEffect(registry, id, effects) })\n\t}\n\tfor (const zone of save.zones) {\n\t\tconst { caster, ability: id, effect, ...rest } = structuredClone(zone)\n\t\tworld.zones.push({ ...rest, caster: entity(caster), ability: ability(id), effect: resolveEffect(registry, id, effect) })\n\t}\n\tworld.reveals.push(...(structuredClone(save.reveals) as Reveal[]))\n\tObject.assign(world.states.values, loadedStates(registry, structuredClone(save.state)))\n\t// what each side knows of the buildings in its way, into the navigations it plans on (`Rules.paths: 'seen'`):\n\t// the world's as it is now, and what each had learned by sight\n\tworld.sidePaths?.restore(world, world.states.has(sideKnowledge) ? world.state(sideKnowledge) : {})\n\tworld.items.push(...(structuredClone(save.items) as GroundItem[]))\n\t// what systems kept, last: what they look up (an entity by its id, the world's state) is back by now. Into those\n\t// there are, and those still to be added\n\tworld.restoreSystems(save.systems ?? {})\n\tif (save.disabled) world.disable(save.disabled)\n\tif (save.failure) world.failure = structuredClone(save.failure)\n}\n\nfunction loadEntity(registry: Registry, saved: EntitySave): Entity {\n\tconst { id, type, owner, agent: _, pos, ...fields } = structuredClone(saved)\n\tconst entity = new Entity(id, registry.unit(type), owner, pos as Entity['pos'])\n\tfor (const key of Object.keys(fields))\n\t\tif (!SAVED_FIELDS.has(key)) fail(`${type}#${id} has \"${key}\", which is not a field of an entity a save keeps`)\n\tfor (const [key, value] of Object.entries(fields)) {\n\t\tif (key === 'components') {\n\t\t\tfor (const [componentId, value] of Object.entries(fields.components as Record<string, unknown>)) {\n\t\t\t\t// one the game has, by `missingIn`'s check before any entity is made\n\t\t\t\tconst component = registry.component(componentId)!\n\t\t\t\tentity.set(component, component.load ? component.load(value, registry) : value)\n\t\t\t}\n\t\t} else entity.restore(key, value)\n\t}\n\treturn entity\n}\n\nfunction fail(what: string): never {\n\tthrow new Error(`Save: ${what}`)\n}\n\n// ---- A save made before: by an older engine, by the game before a patch\n\n/**\n * How a game's saves outlive its patches (`Rules.saves`). Any change to a game's rules changes which rules they\n * are exactly (`registry.hash`), and most changes are nothing to a save: a number tuned, a bug fixed. A game that\n * declares this loads such a save as it is. A change a save cannot be read through (a unit type renamed, a component\n * of another shape) takes a new `version`, and a step that brings the saves made before up to it\n *\n * @beta\n */\nexport interface SaveRules {\n\t/**\n\t * The version of what the game keeps in a save: a whole number from 1, and 1 when left out. One more with every\n\t * patch that saves made before have to be changed for, together with the step that changes them (`migrate`). A save\n\t * says which it is of (`WorldSave.version`); one of a version newer than the game's is refused\n\t */\n\tversion?: number\n\t/**\n\t * What brings an older save up to date. A step for each version, by the version it starts from (`{ 3: … }` makes a\n\t * save of version 3 one of version 4), run one after the other; or one function for all of it, told the version the\n\t * save is of and the one it is to be of. A save of a version with no step after it is refused, saying so: a version\n\t * with nothing to change has the step `(save) => save`\n\t */\n\tmigrate?: Record<number, SaveMigration> | ((save: WorldSave, from: number, to: number) => WorldSave | void)\n\t/**\n\t * What becomes of a save of the game's version made with other rules, its code, its numbers or its mods having\n\t * changed since: `load` it as it is, `refuse` it, or a function that says which, given the save and the hash of the\n\t * rules now. `load` when left out\n\t */\n\tonMismatch?: 'load' | 'refuse' | ((save: WorldSave, hash: string) => 'load' | 'refuse')\n}\n\n/**\n * A step of a game's own, from one version of its saves to the next. The save is plain data in the engine's format\n * of now (the engine's own steps run first), and a copy: the step changes it in place, or gives another\n *\n * @beta\n */\nexport type SaveMigration = (save: WorldSave) => WorldSave | void\n\n/**\n * Why a save is not loaded:\n * - `notASave`: it is not a save, or says nothing readable of its format or its version\n * - `game`: it is another game's\n * - `newer`: it was made by a newer version of the game, or of the engine, than this one\n * - `noWay`: it is of an older version of the game's saves, and the game has no step from there (`SaveRules.migrate`)\n * - `rules`: it was made with other rules, and the game does not load those (`SaveRules.onMismatch`)\n * - `missing`: it has in it what the game no longer has (`SaveError.missing`)\n * - `ground`: its ground is a map of the game as it was, which the game no longer has as it was (S36)\n *\n * @beta\n */\nexport type SaveRefusal = 'notASave' | 'game' | 'newer' | 'noWay' | 'rules' | 'missing' | 'ground'\n\n/**\n * What a save has in it that the game does not have, by kind: their ids\n *\n * @beta\n */\nexport type SaveMissing = Partial<Record<'unit' | 'ability' | 'buff' | 'item' | 'upgrade' | 'order' | 'component' | 'timer' | 'sequence', string[]>>\n\n/**\n * A save that is not loaded, and why: for a list of saves to say, in words of its own\n *\n * @beta\n */\nexport class SaveError extends Error {\n\tconstructor(\n\t\tmessage: string,\n\t\t/** Why the save was refused, as a `SaveRefusal` */\n\t\treadonly reason: SaveRefusal,\n\t\t/** For `missing`: what the save has that the game does not */\n\t\treadonly missing?: SaveMissing\n\t) {\n\t\tsuper(message)\n\t\tthis.name = 'SaveError'\n\t}\n}\n\n/**\n * What of a save says whether a game reads it, the rest of it apart: kept beside a save, for a list of them to ask with\n *\n * @beta\n */\nexport interface SaveHeader {\n\t/** The save's format (`SAVE_FORMAT`) when it was written */\n\tformat: number\n\t/** The id of the game module the save was made with */\n\tgame: string\n\t/** 1 when left out, as in a save from before games had versions of their saves */\n\tversion?: number\n\t/** The hash of the rules the save was made with, as `WorldSave.hash` */\n\thash: string\n}\n\n/**\n * The header of a save\n *\n * @beta\n */\nexport const saveHeader = (save: SaveHeader): SaveHeader => ({ format: save.format, game: save.game, version: save.version ?? 1, hash: save.hash })\n\nconst isCount = (value: unknown): value is number => typeof value === 'number' && Number.isInteger(value) && value >= 1\n\n/** What a game does about a save of its version made with other rules: what it says, else it loads when it declares `saves` at all */\nconst mismatchPolicy = (registry: Registry) => registry.module?.saves?.onMismatch ?? (registry.module?.saves ? 'load' : 'refuse')\n\nfunction otherRules(header: SaveHeader, registry: Registry): SaveError {\n\treturn new SaveError(\n\t\t`Save: made with another version of \"${registry.game}\" (${header.hash}, this is ${registry.hash}). Its rules or its mods changed since` +\n\t\t\t(registry.module?.saves ? '' : ': a game that declares Rules.saves loads it all the same'),\n\t\t'rules'\n\t)\n}\n\n/** Why a save is refused that its header alone says: another game's, newer than this reads, or with no way up from its version */\nfunction headerProblem(header: SaveHeader, registry: Registry): SaveError | undefined {\n\tconst { format } = header\n\tconst version = header.version ?? 1\n\tif (!isCount(format)) return new SaveError(`Save: format ${String(format)} is not one this game reads`, 'notASave')\n\tif (!isCount(version)) return new SaveError(`Save: version ${String(version)} is not one this game reads`, 'notASave')\n\tif (header.game !== registry.game) return new SaveError(`Save: made with the game \"${header.game}\", not \"${registry.game}\"`, 'game')\n\tif (format > SAVE_FORMAT) {\n\t\treturn new SaveError(\n\t\t\t`Save: format ${format} is newer than this game reads (${SAVE_FORMAT}): it was saved by a newer version of the game`,\n\t\t\t'newer'\n\t\t)\n\t}\n\t// the engine keeps no way up from a format of its own before this one: the engine and its games change shape freely\n\tif (format < SAVE_FORMAT) return new SaveError(`Save: format ${format} is older than this game reads (${SAVE_FORMAT})`, 'noWay')\n\tconst to = registry.saveVersion\n\tif (version > to) {\n\t\treturn new SaveError(\n\t\t\t`Save: version ${version} of the saves of \"${registry.game}\" is newer than this game reads (${to}): it was saved by a newer version of the game`,\n\t\t\t'newer'\n\t\t)\n\t}\n\tconst migrate = registry.module?.saves?.migrate\n\tif (typeof migrate === 'function') return undefined\n\tfor (let from = version; from < to; from++) {\n\t\tif (!migrate?.[from]) {\n\t\t\treturn new SaveError(\n\t\t\t\t`Save: version ${version} of the saves of \"${registry.game}\", and the game has no way from ${from} to ${from + 1} (Rules.saves.migrate)`,\n\t\t\t\t'noWay'\n\t\t\t)\n\t\t}\n\t}\n\treturn undefined\n}\n\n/**\n * Whether a game loads a save, as far as the save's header says (`saveHeader`): nothing, or why not. For a list of\n * saves, which has no need to read each of them whole. What only the whole save says (something in it the game no\n * longer has, a game that decides save by save) is found as it is loaded (`updateSave`, `loadWorld`)\n *\n * @beta\n */\nexport function saveProblem(header: SaveHeader, registry: Registry): SaveError | undefined {\n\tconst refused = headerProblem(header, registry)\n\tif (refused) return refused\n\tconst sameVersion = (header.version ?? 1) === registry.saveVersion\n\tif (sameVersion && header.hash !== registry.hash && mismatchPolicy(registry) === 'refuse') return otherRules(header, registry)\n\treturn undefined\n}\n\n/**\n * 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\n * it; a tool that keeps saves up to date runs it by itself. The save handed in is not changed. Throws a `SaveError`,\n * which says why, for one that cannot be read: another game's, newer than this game, of a version the game has no\n * step from, made with other rules by a game that refuses those (`anyVersion` loads it all the same), or with\n * something in it the game no longer has, all of which the error names\n *\n * @beta\n */\nexport function updateSave(data: unknown, registry: Registry, options: { anyVersion?: boolean } = {}): WorldSave {\n\tif (typeof data !== 'object' || data === null) throw new SaveError('Save: not a save', 'notASave')\n\tconst header = data as SaveHeader\n\tconst refused = headerProblem(header, registry)\n\tif (refused) throw refused\n\tconst from = header.version ?? 1\n\tconst to = registry.saveVersion\n\tlet save = data as WorldSave\n\tif (from < to) {\n\t\t// a copy: the steps change what they are given, and the save handed in is its owner's\n\t\tsave = structuredClone(data) as WorldSave\n\t\tconst migrate = registry.module?.saves?.migrate\n\t\tif (typeof migrate === 'function') {\n\t\t\tif (from < to) save = migrate(save, from, to) ?? save\n\t\t} else {\n\t\t\tfor (let version = from; version < to; version++) save = migrate![version](save) ?? save\n\t\t}\n\t}\n\t// the same version, other rules: whether that is a save to load is the game's to say\n\tif (from === to && header.hash !== registry.hash && !options.anyVersion) {\n\t\tconst policy = mismatchPolicy(registry)\n\t\tif ((typeof policy === 'function' ? policy(save, registry.hash) : policy) === 'refuse') throw otherRules(header, registry)\n\t}\n\tconst missing = missingIn(save, registry)\n\tif (missing) {\n\t\tconst said = Object.entries(missing).map(([kind, ids]) => `the ${KINDS[kind as keyof SaveMissing]} ${ids.map((id) => `\"${id}\"`).join(', ')}`)\n\t\tthrow new SaveError(\n\t\t\t`Save: it has what \"${registry.game}\" does not have: ${said.join('; ')}. A step of the game's (Rules.saves.migrate) says what becomes of them`,\n\t\t\t'missing',\n\t\t\tmissing\n\t\t)\n\t}\n\t// the game's own now: its format, its version, its rules\n\treturn { ...save, format: SAVE_FORMAT, version: to, hash: registry.hash }\n}\n\nconst KINDS: Record<keyof SaveMissing, string> = {\n\tunit: 'unit types',\n\tability: 'abilities',\n\tbuff: 'buffs',\n\titem: 'items',\n\tupgrade: 'upgrades',\n\torder: 'orders',\n\tcomponent: 'components',\n\ttimer: 'timers',\n\tsequence: 'sequences'\n}\n\n/**\n * What a save names that the game does not have: found before a world is made of it, and said all at once, where\n * each would otherwise throw by itself at the moment the game came to it, some of them minutes into the game loaded\n */\nfunction missingIn(save: WorldSave, registry: Registry): SaveMissing | undefined {\n\tconst missing: SaveMissing = {}\n\tconst check = (kind: keyof SaveMissing, has: (id: string) => boolean) => (id: unknown) => {\n\t\tif (typeof id === 'string' && !has(id) && !missing[kind]?.includes(id)) (missing[kind] ??= []).push(id)\n\t}\n\t// copies made while it ran (`copyOf`, see `world.redefine`) are made again as it is loaded: the game has those then\n\tconst kept = (save.state[redefinitions.id] ?? {}) as Record<string, Record<string, Record<string, unknown>> | undefined>\n\tconst defined = (kind: DataKind) => (id: string) => registry.kinds[kind].has(id) || typeof kept[kind]?.[id]?.[COPY_OF] === 'string'\n\tconst unit = check('unit', defined('units'))\n\tconst ability = check('ability', defined('abilities'))\n\tconst buff = check('buff', defined('buffs'))\n\tconst item = check('item', defined('items'))\n\tconst upgrade = check('upgrade', defined('upgrades'))\n\tconst order = check('order', (id) => registry.orders.has(id))\n\t// one the game lists, or the engine's own\n\tconst component = check('component', (id) => registry.component(id) !== undefined)\n\t// each component's own say of what it names (`Component.refs`)\n\tconst named: Record<keyof SavedRefs, (id: unknown) => void> = { units: unit, abilities: ability, buffs: buff, items: item, upgrades: upgrade }\n\tconst components = (values: unknown) => {\n\t\tfor (const [id, value] of Object.entries((values as Record<string, unknown> | undefined) ?? {})) {\n\t\t\tcomponent(id)\n\t\t\tconst refs = registry.component(id)?.refs?.(value)\n\t\t\tif (refs) for (const kind of Object.keys(refs) as (keyof SavedRefs)[]) refs[kind]?.forEach(named[kind])\n\t\t}\n\t}\n\t// an effect made up on the spot is kept whole; one of an ability is found in it again, so the ability has to be there\n\tconst placed = (effect: EffectRef | undefined) => !!effect && 'path' in effect\n\n\tcomponents(save.state)\n\tfor (const player of save.players) {\n\t\tcomponents(player.state)\n\t\tfor (const [id] of player.upgrades) upgrade(id)\n\t\tfor (const id of player.researching) upgrade(id)\n\t}\n\tfor (const entity of [...save.entities, ...save.detached]) {\n\t\tunit(entity.type)\n\t\tcomponents(entity.components)\n\t\tfor (const state of (entity.abilities as AbilityState[] | undefined) ?? []) ability(state.id)\n\t\tfor (const instance of (entity.buffs as BuffInstance[] | undefined) ?? []) buff(instance.id)\n\t\tfor (const given of (entity.orders as Order[] | undefined) ?? []) {\n\t\t\torder(given.type)\n\t\t\tunit(given.init?.unitType)\n\t\t}\n\t}\n\tfor (const missile of save.missiles) if (placed(missile.effect)) ability(missile.ability)\n\tfor (const delayed of save.delayed) ability(delayed.ability)\n\tfor (const zone of save.zones) ability(zone.ability)\n\tfor (const dropped of save.items) item(dropped.item)\n\tconst game = registry.module\n\tif (game) {\n\t\tconst timers = new Set([...coreTimers, ...(registry.assembly?.timers ?? game.timers ?? [])].map((def) => def.id))\n\t\tconst sequences = new Set((game.sequences ?? []).map((def) => def.id))\n\t\twaitingTimers(save.state).forEach(check('timer', (id) => timers.has(id)))\n\t\trunningSequences(save.state).forEach(check('sequence', (id) => sequences.has(id)))\n\t}\n\treturn Object.keys(missing).length > 0 ? missing : undefined\n}\n\n// ---- As text\n\n/**\n * A save as text. JSON, but for numbers JSON has no words for, which game state has: buffs that last forever\n * (`Infinity`), something never hurt (`-Infinity`)\n *\n * @beta\n */\nexport function encodeSave(save: WorldSave): string {\n\treturn JSON.stringify(save, (_key, value) => (typeof value === 'number' && !Number.isFinite(value) ? { $number: String(value) } : value))\n}\n\n/**\n * Reads a save back from text written by `encodeSave`, turning the stored non-finite numbers into numbers again\n *\n * @beta\n */\nexport function decodeSave(text: string): WorldSave {\n\treturn JSON.parse(text, (_key, value) =>\n\t\tvalue && typeof value === 'object' && Object.keys(value).length === 1 && typeof value.$number === 'string' ? Number(value.$number) : value\n\t) as WorldSave\n}\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { type GameModule } from './game';
1
+ import { type Rules } from './game';
2
2
  import { type GameMap, type MapFile } from './map';
3
3
  import type { World } from './world';
4
4
  /**
@@ -53,4 +53,4 @@ export declare function scenarioOfWorld(world: World, name: string, description?
53
53
  *
54
54
  * @beta
55
55
  */
56
- export declare function scenarioWorld(scenario: ScenarioFile, game: GameModule): Promise<World>;
56
+ export declare function scenarioWorld(scenario: ScenarioFile, game: Rules): Promise<World>;