@v12-engine/engine 0.1.1 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (951) hide show
  1. package/dist/abilities/amounts.d.ts +28 -0
  2. package/dist/abilities/amounts.js +74 -0
  3. package/dist/abilities/amounts.js.map +1 -0
  4. package/dist/abilities/buffs.d.ts +106 -6
  5. package/dist/abilities/buffs.js +443 -0
  6. package/dist/abilities/buffs.js.map +1 -0
  7. package/dist/abilities/castTold.d.ts +2 -0
  8. package/dist/abilities/castTold.js +66 -0
  9. package/dist/abilities/castTold.js.map +1 -0
  10. package/dist/abilities/chance.d.ts +38 -0
  11. package/dist/abilities/chance.js +77 -0
  12. package/dist/abilities/chance.js.map +1 -0
  13. package/dist/abilities/charges.d.ts +18 -0
  14. package/dist/abilities/charges.js +101 -0
  15. package/dist/abilities/charges.js.map +1 -0
  16. package/dist/abilities/control.d.ts +28 -0
  17. package/dist/abilities/control.js +113 -0
  18. package/dist/abilities/control.js.map +1 -0
  19. package/dist/abilities/dispel.js +51 -0
  20. package/dist/abilities/dispel.js.map +1 -0
  21. package/dist/abilities/effectFields.d.ts +1 -1
  22. package/dist/abilities/effectFields.js +676 -0
  23. package/dist/abilities/effectFields.js.map +1 -0
  24. package/dist/abilities/effectIndex.d.ts +27 -0
  25. package/dist/abilities/effectIndex.js +64 -0
  26. package/dist/abilities/effectIndex.js.map +1 -0
  27. package/dist/abilities/effects/buff.d.ts +9 -3
  28. package/dist/abilities/effects/buff.js +84 -0
  29. package/dist/abilities/effects/buff.js.map +1 -0
  30. package/dist/abilities/effects/conditions.d.ts +2 -0
  31. package/dist/abilities/effects/conditions.js +41 -0
  32. package/dist/abilities/effects/conditions.js.map +1 -0
  33. package/dist/abilities/effects/core.js +54 -0
  34. package/dist/abilities/effects/core.js.map +1 -0
  35. package/dist/abilities/effects/damage.d.ts +1 -1
  36. package/dist/abilities/effects/damage.js +43 -0
  37. package/dist/abilities/effects/damage.js.map +1 -0
  38. package/dist/abilities/effects/heal.d.ts +2 -2
  39. package/dist/abilities/effects/heal.js +51 -0
  40. package/dist/abilities/effects/heal.js.map +1 -0
  41. package/dist/abilities/effects/missile.d.ts +13 -1
  42. package/dist/abilities/effects/missile.js +104 -0
  43. package/dist/abilities/effects/missile.js.map +1 -0
  44. package/dist/abilities/effects/morph.d.ts +5 -0
  45. package/dist/abilities/effects/morph.js +43 -0
  46. package/dist/abilities/effects/morph.js.map +1 -0
  47. package/dist/abilities/effects/moves.d.ts +16 -4
  48. package/dist/abilities/effects/moves.js +212 -0
  49. package/dist/abilities/effects/moves.js.map +1 -0
  50. package/dist/abilities/effects/passives.d.ts +19 -9
  51. package/dist/abilities/effects/passives.js +131 -0
  52. package/dist/abilities/effects/passives.js.map +1 -0
  53. package/dist/abilities/effects/proxy.d.ts +5 -0
  54. package/dist/abilities/effects/proxy.js +60 -0
  55. package/dist/abilities/effects/proxy.js.map +1 -0
  56. package/dist/abilities/effects/sight.d.ts +2 -2
  57. package/dist/abilities/effects/sight.js +39 -0
  58. package/dist/abilities/effects/sight.js.map +1 -0
  59. package/dist/abilities/effects/spawn.d.ts +5 -2
  60. package/dist/abilities/effects/spawn.js +40 -0
  61. package/dist/abilities/effects/spawn.js.map +1 -0
  62. package/dist/abilities/effects/timed.d.ts +2 -2
  63. package/dist/abilities/effects/timed.js +96 -0
  64. package/dist/abilities/effects/timed.js.map +1 -0
  65. package/dist/abilities/effects/trade.d.ts +1 -1
  66. package/dist/abilities/effects/trade.js +25 -0
  67. package/dist/abilities/effects/trade.js.map +1 -0
  68. package/dist/abilities/effects.d.ts +97 -23
  69. package/dist/abilities/effects.js +860 -0
  70. package/dist/abilities/effects.js.map +1 -0
  71. package/dist/abilities/land.d.ts +38 -4
  72. package/dist/abilities/land.js +189 -0
  73. package/dist/abilities/land.js.map +1 -0
  74. package/dist/abilities/recast.d.ts +45 -0
  75. package/dist/abilities/recast.js +118 -0
  76. package/dist/abilities/recast.js.map +1 -0
  77. package/dist/abilities/scaled.js +40 -0
  78. package/dist/abilities/scaled.js.map +1 -0
  79. package/dist/abilities/screen.d.ts +6 -0
  80. package/dist/abilities/screen.js +83 -0
  81. package/dist/abilities/screen.js.map +1 -0
  82. package/dist/abilities/shapes.d.ts +66 -0
  83. package/dist/abilities/shapes.js +122 -0
  84. package/dist/abilities/shapes.js.map +1 -0
  85. package/dist/abilities/text.d.ts +14 -2
  86. package/dist/abilities/text.js +204 -0
  87. package/dist/abilities/text.js.map +1 -0
  88. package/dist/abilities/triggers.d.ts +98 -0
  89. package/dist/abilities/triggers.js +351 -0
  90. package/dist/abilities/triggers.js.map +1 -0
  91. package/dist/abilityChanges.d.ts +131 -0
  92. package/dist/abilityChanges.js +345 -0
  93. package/dist/abilityChanges.js.map +1 -0
  94. package/dist/ai/area.d.ts +4 -1
  95. package/dist/ai/brain.d.ts +4 -1
  96. package/dist/ai/brain.js +844 -0
  97. package/dist/ai/brain.js.map +1 -0
  98. package/dist/ai/budget.js +74 -0
  99. package/dist/ai/budget.js.map +1 -0
  100. package/dist/ai/checks.d.ts +9 -1
  101. package/dist/ai/checks.js +242 -0
  102. package/dist/ai/checks.js.map +1 -0
  103. package/dist/ai/computer.d.ts +11 -4
  104. package/dist/ai/computer.js +251 -0
  105. package/dist/ai/computer.js.map +1 -0
  106. package/dist/ai/defence.d.ts +4 -0
  107. package/dist/ai/defence.js +430 -0
  108. package/dist/ai/defence.js.map +1 -0
  109. package/dist/ai/define.d.ts +3 -2
  110. package/dist/ai/define.js +31 -0
  111. package/dist/ai/define.js.map +1 -0
  112. package/dist/ai/economy.d.ts +10 -7
  113. package/dist/ai/economy.js +780 -0
  114. package/dist/ai/economy.js.map +1 -0
  115. package/dist/ai/geometry.js +38 -0
  116. package/dist/ai/geometry.js.map +1 -0
  117. package/dist/ai/goals.d.ts +1 -0
  118. package/dist/ai/goals.js +560 -0
  119. package/dist/ai/goals.js.map +1 -0
  120. package/dist/ai/knowledge.d.ts +72 -7
  121. package/dist/ai/knowledge.js +804 -0
  122. package/dist/ai/knowledge.js.map +1 -0
  123. package/dist/ai/lanes.d.ts +10 -2
  124. package/dist/ai/lanes.js +715 -0
  125. package/dist/ai/lanes.js.map +1 -0
  126. package/dist/ai/melee/build.js +264 -0
  127. package/dist/ai/melee/build.js.map +1 -0
  128. package/dist/ai/melee/goals.d.ts +7 -0
  129. package/dist/ai/melee/goals.js +720 -0
  130. package/dist/ai/melee/goals.js.map +1 -0
  131. package/dist/ai/melee/heroes.js +68 -0
  132. package/dist/ai/melee/heroes.js.map +1 -0
  133. package/dist/ai/melee/index.d.ts +1 -1
  134. package/dist/ai/melee/index.js +51 -0
  135. package/dist/ai/melee/index.js.map +1 -0
  136. package/dist/ai/melee/production.js +29 -0
  137. package/dist/ai/melee/production.js.map +1 -0
  138. package/dist/ai/melee/surrender.js +64 -0
  139. package/dist/ai/melee/surrender.js.map +1 -0
  140. package/dist/ai/micro.d.ts +9 -0
  141. package/dist/ai/micro.js +1316 -0
  142. package/dist/ai/micro.js.map +1 -0
  143. package/dist/ai/mission.d.ts +9 -2
  144. package/dist/ai/mission.js +538 -0
  145. package/dist/ai/mission.js.map +1 -0
  146. package/dist/ai/missionRules.d.ts +1 -1
  147. package/dist/ai/missionRules.js +26 -0
  148. package/dist/ai/missionRules.js.map +1 -0
  149. package/dist/ai/module.d.ts +6 -2
  150. package/dist/ai/module.js +37 -0
  151. package/dist/ai/module.js.map +1 -0
  152. package/dist/ai/options.d.ts +3 -3
  153. package/dist/ai/plans/build.d.ts +20 -1
  154. package/dist/ai/plans/build.js +608 -0
  155. package/dist/ai/plans/build.js.map +1 -0
  156. package/dist/ai/plans/placement.d.ts +4 -1
  157. package/dist/ai/plans/placement.js +295 -0
  158. package/dist/ai/plans/placement.js.map +1 -0
  159. package/dist/ai/plans/plans.d.ts +9 -0
  160. package/dist/ai/plans/plans.js +110 -0
  161. package/dist/ai/plans/plans.js.map +1 -0
  162. package/dist/ai/plans/production.d.ts +14 -2
  163. package/dist/ai/plans/production.js +434 -0
  164. package/dist/ai/plans/production.js.map +1 -0
  165. package/dist/ai/plans/purse.d.ts +6 -3
  166. package/dist/ai/plans/purse.js +139 -0
  167. package/dist/ai/plans/purse.js.map +1 -0
  168. package/dist/ai/plans/tech.d.ts +6 -0
  169. package/dist/ai/plans/tech.js +122 -0
  170. package/dist/ai/plans/tech.js.map +1 -0
  171. package/dist/ai/profiles.d.ts +4 -4
  172. package/dist/{profiles-B3NS9jwk.js → ai/profiles.js} +3 -98
  173. package/dist/ai/profiles.js.map +1 -0
  174. package/dist/ai/reach.js +54 -0
  175. package/dist/ai/reach.js.map +1 -0
  176. package/dist/ai/report.d.ts +8 -0
  177. package/dist/ai/report.js +87 -0
  178. package/dist/ai/report.js.map +1 -0
  179. package/dist/ai/roles.d.ts +4 -0
  180. package/dist/ai/roles.js +207 -0
  181. package/dist/ai/roles.js.map +1 -0
  182. package/dist/ai/rules.d.ts +8 -2
  183. package/dist/ai/rules.js +416 -0
  184. package/dist/ai/rules.js.map +1 -0
  185. package/dist/ai/scouting.d.ts +6 -0
  186. package/dist/ai/scouting.js +324 -0
  187. package/dist/ai/scouting.js.map +1 -0
  188. package/dist/ai/settings.js +99 -0
  189. package/dist/ai/settings.js.map +1 -0
  190. package/dist/ai/squads.d.ts +21 -2
  191. package/dist/ai/squads.js +916 -0
  192. package/dist/ai/squads.js.map +1 -0
  193. package/dist/ai/strength.js +320 -0
  194. package/dist/ai/strength.js.map +1 -0
  195. package/dist/ai/task.d.ts +3 -1
  196. package/dist/ai/task.js +17 -0
  197. package/dist/ai/task.js.map +1 -0
  198. package/dist/ai/tasks/attack.js +24 -0
  199. package/dist/ai/tasks/attack.js.map +1 -0
  200. package/dist/ai/tasks/capture.d.ts +3 -3
  201. package/dist/ai/tasks/capture.js +37 -0
  202. package/dist/ai/tasks/capture.js.map +1 -0
  203. package/dist/ai/tasks/creep.js +29 -0
  204. package/dist/ai/tasks/creep.js.map +1 -0
  205. package/dist/ai/tasks/defend.js +61 -0
  206. package/dist/ai/tasks/defend.js.map +1 -0
  207. package/dist/ai/tasks/drop.js +81 -0
  208. package/dist/ai/tasks/drop.js.map +1 -0
  209. package/dist/ai/tasks/escort.js +59 -0
  210. package/dist/ai/tasks/escort.js.map +1 -0
  211. package/dist/ai/tasks/gather.js +48 -0
  212. package/dist/ai/tasks/gather.js.map +1 -0
  213. package/dist/ai/tasks/harass.js +39 -0
  214. package/dist/ai/tasks/harass.js.map +1 -0
  215. package/dist/ai/tasks/hold.js +32 -0
  216. package/dist/ai/tasks/hold.js.map +1 -0
  217. package/dist/ai/tasks/index.js +34 -0
  218. package/dist/ai/tasks/index.js.map +1 -0
  219. package/dist/ai/tasks/move.js +26 -0
  220. package/dist/ai/tasks/move.js.map +1 -0
  221. package/dist/ai/tasks/patrol.js +59 -0
  222. package/dist/ai/tasks/patrol.js.map +1 -0
  223. package/dist/ai/tasks/retreat.js +28 -0
  224. package/dist/ai/tasks/retreat.js.map +1 -0
  225. package/dist/ai/tasks/scout.js +73 -0
  226. package/dist/ai/tasks/scout.js.map +1 -0
  227. package/dist/ai/tasks/shared.d.ts +1 -1
  228. package/dist/ai/tasks/shared.js +137 -0
  229. package/dist/ai/tasks/shared.js.map +1 -0
  230. package/dist/ai/team.d.ts +18 -1
  231. package/dist/ai/team.js +492 -0
  232. package/dist/ai/team.js.map +1 -0
  233. package/dist/ai/threat.d.ts +6 -0
  234. package/dist/ai/threat.js +206 -0
  235. package/dist/ai/threat.js.map +1 -0
  236. package/dist/ai/view.d.ts +21 -7
  237. package/dist/ai/view.js +677 -0
  238. package/dist/ai/view.js.map +1 -0
  239. package/dist/ai/waves.d.ts +6 -0
  240. package/dist/ai/waves.js +410 -0
  241. package/dist/ai/waves.js.map +1 -0
  242. package/dist/ai.js +54 -6239
  243. package/dist/aiTesting.d.ts +6 -3
  244. package/dist/aiTesting.js +229 -0
  245. package/dist/aiTesting.js.map +1 -0
  246. package/dist/areas.d.ts +4 -1
  247. package/dist/areas.js +295 -0
  248. package/dist/areas.js.map +1 -0
  249. package/dist/attacks.d.ts +3 -3
  250. package/dist/attacks.js +127 -0
  251. package/dist/attacks.js.map +1 -0
  252. package/dist/burning.d.ts +267 -0
  253. package/dist/burning.js +795 -0
  254. package/dist/burning.js.map +1 -0
  255. package/dist/bytes.js +21 -0
  256. package/dist/bytes.js.map +1 -0
  257. package/dist/callings.d.ts +71 -0
  258. package/dist/callings.js +157 -0
  259. package/dist/callings.js.map +1 -0
  260. package/dist/cameraOrders.d.ts +78 -0
  261. package/dist/cameraOrders.js +114 -0
  262. package/dist/cameraOrders.js.map +1 -0
  263. package/dist/camps.d.ts +70 -4
  264. package/dist/camps.js +501 -0
  265. package/dist/camps.js.map +1 -0
  266. package/dist/capture.d.ts +15 -3
  267. package/dist/capture.js +304 -0
  268. package/dist/capture.js.map +1 -0
  269. package/dist/cellLayers.d.ts +78 -13
  270. package/dist/cellLayers.js +275 -0
  271. package/dist/cellLayers.js.map +1 -0
  272. package/dist/cellPatches.d.ts +24 -0
  273. package/dist/cellPatches.js +73 -0
  274. package/dist/cellPatches.js.map +1 -0
  275. package/dist/cinematics.d.ts +10 -5
  276. package/dist/cinematics.js +161 -0
  277. package/dist/cinematics.js.map +1 -0
  278. package/dist/clock.d.ts +2 -2
  279. package/dist/clock.js +78 -0
  280. package/dist/clock.js.map +1 -0
  281. package/dist/commands.d.ts +36 -4
  282. package/dist/commands.js +636 -0
  283. package/dist/commands.js.map +1 -0
  284. package/dist/components.d.ts +31 -10
  285. package/dist/components.js +74 -0
  286. package/dist/components.js.map +1 -0
  287. package/dist/computers.d.ts +4 -4
  288. package/dist/computers.js +194 -0
  289. package/dist/computers.js.map +1 -0
  290. package/dist/concealment.d.ts +25 -2
  291. package/dist/concealment.js +409 -0
  292. package/dist/concealment.js.map +1 -0
  293. package/dist/coreComponents.js +130 -0
  294. package/dist/coreComponents.js.map +1 -0
  295. package/dist/createGame.d.ts +306 -0
  296. package/dist/createGame.js +405 -0
  297. package/dist/createGame.js.map +1 -0
  298. package/dist/dashing.d.ts +18 -2
  299. package/dist/dashing.js +41 -0
  300. package/dist/dashing.js.map +1 -0
  301. package/dist/debug.d.ts +8 -0
  302. package/dist/debug.js +5 -3
  303. package/dist/debug2.js +76 -0
  304. package/dist/debug2.js.map +1 -0
  305. package/dist/debugCommands.d.ts +6 -6
  306. package/dist/debugCommands.js +537 -0
  307. package/dist/debugCommands.js.map +1 -0
  308. package/dist/debugging.d.ts +1 -0
  309. package/dist/defaultSets.d.ts +183 -0
  310. package/dist/defaultSets.js +216 -0
  311. package/dist/defaultSets.js.map +1 -0
  312. package/dist/definitions.d.ts +6 -0
  313. package/dist/definitions.js +78 -0
  314. package/dist/definitions.js.map +1 -0
  315. package/dist/defs.d.ts +1895 -165
  316. package/dist/defs.js +380 -0
  317. package/dist/defs.js.map +1 -0
  318. package/dist/denying.d.ts +4 -4
  319. package/dist/denying.js +106 -0
  320. package/dist/denying.js.map +1 -0
  321. package/dist/destructibles.d.ts +2 -2
  322. package/dist/destructibles.js +36 -0
  323. package/dist/destructibles.js.map +1 -0
  324. package/dist/determinism.d.ts +4 -4
  325. package/dist/determinism.js +247 -0
  326. package/dist/determinism.js.map +1 -0
  327. package/dist/dialog.d.ts +17 -2
  328. package/dist/dialog.js +108 -0
  329. package/dist/dialog.js.map +1 -0
  330. package/dist/effectRefs.js +28 -0
  331. package/dist/effectRefs.js.map +1 -0
  332. package/dist/effects.d.ts +27 -11
  333. package/dist/effects.js +110 -0
  334. package/dist/effects.js.map +1 -0
  335. package/dist/endings.d.ts +1 -1
  336. package/dist/endings.js +78 -0
  337. package/dist/endings.js.map +1 -0
  338. package/dist/engagement.d.ts +40 -6
  339. package/dist/engagement.js +530 -0
  340. package/dist/engagement.js.map +1 -0
  341. package/dist/engineEvents.d.ts +72 -9
  342. package/dist/engineEvents.js +520 -0
  343. package/dist/engineEvents.js.map +1 -0
  344. package/dist/entity.d.ts +275 -26
  345. package/dist/entity.js +441 -0
  346. package/dist/entity.js.map +1 -0
  347. package/dist/entityIndex.d.ts +10 -3
  348. package/dist/entityIndex.js +149 -0
  349. package/dist/entityIndex.js.map +1 -0
  350. package/dist/errors.d.ts +6 -2
  351. package/dist/errors.js +59 -0
  352. package/dist/errors.js.map +1 -0
  353. package/dist/events.d.ts +11 -5
  354. package/dist/events.js +158 -0
  355. package/dist/events.js.map +1 -0
  356. package/dist/exactMath.js +273 -0
  357. package/dist/exactMath.js.map +1 -0
  358. package/dist/features.d.ts +1 -1
  359. package/dist/features.js +127 -0
  360. package/dist/features.js.map +1 -0
  361. package/dist/fields.d.ts +25 -5
  362. package/dist/fields.js +140 -0
  363. package/dist/fields.js.map +1 -0
  364. package/dist/fixture.d.ts +3 -3
  365. package/dist/fixture.js +512 -0
  366. package/dist/fixture.js.map +1 -0
  367. package/dist/fog.d.ts +26 -3
  368. package/dist/fog.js +333 -0
  369. package/dist/fog.js.map +1 -0
  370. package/dist/foliage.d.ts +476 -0
  371. package/dist/foliage.js +1478 -0
  372. package/dist/foliage.js.map +1 -0
  373. package/dist/foliageDebug.d.ts +57 -0
  374. package/dist/foliageDebug.js +172 -0
  375. package/dist/foliageDebug.js.map +1 -0
  376. package/dist/foliageRegrowth.d.ts +20 -0
  377. package/dist/foliageRegrowth.js +332 -0
  378. package/dist/foliageRegrowth.js.map +1 -0
  379. package/dist/formState.d.ts +67 -0
  380. package/dist/formState.js +65 -0
  381. package/dist/formState.js.map +1 -0
  382. package/dist/formation.d.ts +46 -8
  383. package/dist/formation.js +297 -0
  384. package/dist/formation.js.map +1 -0
  385. package/dist/forms.d.ts +58 -0
  386. package/dist/forms.js +146 -0
  387. package/dist/forms.js.map +1 -0
  388. package/dist/friendlyFire.d.ts +2 -2
  389. package/dist/friendlyFire.js +37 -0
  390. package/dist/friendlyFire.js.map +1 -0
  391. package/dist/game.d.ts +141 -48
  392. package/dist/game.js +834 -0
  393. package/dist/game.js.map +1 -0
  394. package/dist/gameData.d.ts +96 -22
  395. package/dist/gameData.js +1690 -0
  396. package/dist/gameData.js.map +1 -0
  397. package/dist/gameFiles.d.ts +3 -3
  398. package/dist/gameFiles.js +14 -0
  399. package/dist/gameFiles.js.map +1 -0
  400. package/dist/gates.js +92 -0
  401. package/dist/gates.js.map +1 -0
  402. package/dist/generate.d.ts +28 -1
  403. package/dist/generate.js +1062 -0
  404. package/dist/generate.js.map +1 -0
  405. package/dist/generateWorker.d.ts +7 -3
  406. package/dist/generateWorker.js +86 -0
  407. package/dist/generateWorker.js.map +1 -0
  408. package/dist/grid.d.ts +9 -0
  409. package/dist/grid.js +102 -0
  410. package/dist/grid.js.map +1 -0
  411. package/dist/ground.d.ts +17 -1
  412. package/dist/ground.js +375 -0
  413. package/dist/ground.js.map +1 -0
  414. package/dist/groundObjects.d.ts +70 -0
  415. package/dist/groundObjects.js +371 -0
  416. package/dist/groundObjects.js.map +1 -0
  417. package/dist/groundSpeed.d.ts +20 -3
  418. package/dist/groundSpeed.js +117 -0
  419. package/dist/groundSpeed.js.map +1 -0
  420. package/dist/hero.d.ts +126 -10
  421. package/dist/hero.js +432 -0
  422. package/dist/hero.js.map +1 -0
  423. package/dist/holds.d.ts +94 -0
  424. package/dist/holds.js +305 -0
  425. package/dist/holds.js.map +1 -0
  426. package/dist/home.d.ts +1 -1
  427. package/dist/home.js +30 -0
  428. package/dist/home.js.map +1 -0
  429. package/dist/hooks.d.ts +339 -57
  430. package/dist/hooks.js +105 -0
  431. package/dist/hooks.js.map +1 -0
  432. package/dist/hotReload.d.ts +6 -5
  433. package/dist/hotReload.js +145 -0
  434. package/dist/hotReload.js.map +1 -0
  435. package/dist/ids.d.ts +3 -3
  436. package/dist/ids.js +30 -0
  437. package/dist/ids.js.map +1 -0
  438. package/dist/idsFile.d.ts +36 -0
  439. package/dist/idsFile.js +134 -0
  440. package/dist/idsFile.js.map +1 -0
  441. package/dist/index.d.ts +105 -68
  442. package/dist/index.js +194 -4701
  443. package/dist/inspect.d.ts +29 -2
  444. package/dist/{inspect-D9dWHmZ0.js → inspect.js} +21 -12
  445. package/dist/inspect.js.map +1 -0
  446. package/dist/inventory.d.ts +14 -1
  447. package/dist/inventory.js +84 -0
  448. package/dist/inventory.js.map +1 -0
  449. package/dist/items.d.ts +136 -8
  450. package/dist/items.js +585 -0
  451. package/dist/items.js.map +1 -0
  452. package/dist/lanes.d.ts +12 -3
  453. package/dist/lanes.js +496 -0
  454. package/dist/lanes.js.map +1 -0
  455. package/dist/life.d.ts +6 -2
  456. package/dist/life.js +287 -0
  457. package/dist/life.js.map +1 -0
  458. package/dist/log.d.ts +26 -3
  459. package/dist/log.js +192 -0
  460. package/dist/log.js.map +1 -0
  461. package/dist/manaBurn.d.ts +2 -2
  462. package/dist/manaBurn.js +75 -0
  463. package/dist/manaBurn.js.map +1 -0
  464. package/dist/map/file.d.ts +56 -3
  465. package/dist/map/file.js +264 -0
  466. package/dist/map/file.js.map +1 -0
  467. package/dist/map/images.js +61 -0
  468. package/dist/map/images.js.map +1 -0
  469. package/dist/map/look.d.ts +1 -1
  470. package/dist/map/look.js +30 -0
  471. package/dist/map/look.js.map +1 -0
  472. package/dist/map/pathProfile.js +183 -0
  473. package/dist/map/pathProfile.js.map +1 -0
  474. package/dist/map/resize.d.ts +4 -0
  475. package/dist/map/resize.js +136 -0
  476. package/dist/map/resize.js.map +1 -0
  477. package/dist/map/schema.js +257 -0
  478. package/dist/map/schema.js.map +1 -0
  479. package/dist/map/terrain.js +214 -0
  480. package/dist/map/terrain.js.map +1 -0
  481. package/dist/map/types.d.ts +92 -13
  482. package/dist/map/types.js +251 -0
  483. package/dist/map/types.js.map +1 -0
  484. package/dist/mapCheck/cells.js +94 -0
  485. package/dist/mapCheck/cells.js.map +1 -0
  486. package/dist/mapCheck/rules/foliage.d.ts +9 -0
  487. package/dist/mapCheck/rules/foliage.js +83 -0
  488. package/dist/mapCheck/rules/foliage.js.map +1 -0
  489. package/dist/mapCheck/rules/names.js +39 -0
  490. package/dist/mapCheck/rules/names.js.map +1 -0
  491. package/dist/mapCheck/rules/objects.d.ts +1 -1
  492. package/dist/mapCheck/rules/objects.js +56 -0
  493. package/dist/mapCheck/rules/objects.js.map +1 -0
  494. package/dist/mapCheck/rules/paths.js +32 -0
  495. package/dist/mapCheck/rules/paths.js.map +1 -0
  496. package/dist/mapCheck/rules/players.js +20 -0
  497. package/dist/mapCheck/rules/players.js.map +1 -0
  498. package/dist/mapCheck/rules/races.js +56 -0
  499. package/dist/mapCheck/rules/races.js.map +1 -0
  500. package/dist/mapCheck/rules/random.js +47 -0
  501. package/dist/mapCheck/rules/random.js.map +1 -0
  502. package/dist/mapCheck/rules/regions.js +30 -0
  503. package/dist/mapCheck/rules/regions.js.map +1 -0
  504. package/dist/mapCheck/rules/targets.js +31 -0
  505. package/dist/mapCheck/rules/targets.js.map +1 -0
  506. package/dist/mapCheck/rules/walking.js +45 -0
  507. package/dist/mapCheck/rules/walking.js.map +1 -0
  508. package/dist/mapCheck.d.ts +2 -2
  509. package/dist/mapCheck.js +63 -0
  510. package/dist/mapCheck.js.map +1 -0
  511. package/dist/mapFields.d.ts +25 -2
  512. package/dist/mapFields.js +134 -0
  513. package/dist/mapFields.js.map +1 -0
  514. package/dist/mapFile.js +176 -0
  515. package/dist/mapFile.js.map +1 -0
  516. package/dist/mapMeasure.d.ts +8 -0
  517. package/dist/mapMeasure.js +283 -0
  518. package/dist/mapMeasure.js.map +1 -0
  519. package/dist/mapMerge.d.ts +1 -0
  520. package/dist/mapMerge.js +172 -0
  521. package/dist/mapMerge.js.map +1 -0
  522. package/dist/mapObjectives.js +138 -0
  523. package/dist/mapObjectives.js.map +1 -0
  524. package/dist/mapObjects.js +80 -0
  525. package/dist/mapObjects.js.map +1 -0
  526. package/dist/math.d.ts +37 -7
  527. package/dist/math.js +155 -0
  528. package/dist/math.js.map +1 -0
  529. package/dist/messages.d.ts +71 -4
  530. package/dist/messages.js +29 -0
  531. package/dist/messages.js.map +1 -0
  532. package/dist/missionRules.d.ts +10 -2
  533. package/dist/{missionRules-C-bGxm0Q.js → missionRules.js} +30 -150
  534. package/dist/missionRules.js.map +1 -0
  535. package/dist/mods.d.ts +39 -20
  536. package/dist/mods.js +271 -0
  537. package/dist/mods.js.map +1 -0
  538. package/dist/moves.d.ts +87 -0
  539. package/dist/moves.js +539 -0
  540. package/dist/moves.js.map +1 -0
  541. package/dist/names.d.ts +7 -0
  542. package/dist/names.js +122 -0
  543. package/dist/names.js.map +1 -0
  544. package/dist/navigation/agentParams.js +14 -0
  545. package/dist/navigation/agentParams.js.map +1 -0
  546. package/dist/navigation/air.d.ts +7 -3
  547. package/dist/navigation/air.js +401 -0
  548. package/dist/navigation/air.js.map +1 -0
  549. package/dist/navigation/builds.d.ts +34 -2
  550. package/dist/navigation/builds.js +287 -0
  551. package/dist/navigation/builds.js.map +1 -0
  552. package/dist/navigation/groundAreas.d.ts +59 -1
  553. package/dist/navigation/groundAreas.js +407 -0
  554. package/dist/navigation/groundAreas.js.map +1 -0
  555. package/dist/navigation/navigation.d.ts +98 -9
  556. package/dist/navigation/recast.d.ts +194 -18
  557. package/dist/navigation/recast.js +1379 -0
  558. package/dist/navigation/recast.js.map +1 -0
  559. package/dist/navigation/sidePaths.d.ts +8 -3
  560. package/dist/navigation/sidePaths.js +241 -0
  561. package/dist/navigation/sidePaths.js.map +1 -0
  562. package/dist/navigation/sized.js +243 -0
  563. package/dist/navigation/sized.js.map +1 -0
  564. package/dist/nearest.js +32 -0
  565. package/dist/nearest.js.map +1 -0
  566. package/dist/noise.js +59 -0
  567. package/dist/noise.js.map +1 -0
  568. package/dist/objectives.d.ts +12 -3
  569. package/dist/objectives.js +144 -0
  570. package/dist/objectives.js.map +1 -0
  571. package/dist/orders/basic.d.ts +5 -5
  572. package/dist/orders/basic.js +417 -0
  573. package/dist/orders/basic.js.map +1 -0
  574. package/dist/orders/build.js +278 -0
  575. package/dist/orders/build.js.map +1 -0
  576. package/dist/orders/cast.d.ts +13 -3
  577. package/dist/orders/cast.js +558 -0
  578. package/dist/orders/cast.js.map +1 -0
  579. package/dist/orders/facts.js +16 -0
  580. package/dist/orders/facts.js.map +1 -0
  581. package/dist/orders/harvest.d.ts +21 -5
  582. package/dist/orders/harvest.js +540 -0
  583. package/dist/orders/harvest.js.map +1 -0
  584. package/dist/orders/idle.d.ts +3 -1
  585. package/dist/orders/idle.js +234 -0
  586. package/dist/orders/idle.js.map +1 -0
  587. package/dist/orders/items.js +92 -0
  588. package/dist/orders/items.js.map +1 -0
  589. package/dist/orders/queue.js +108 -0
  590. package/dist/orders/queue.js.map +1 -0
  591. package/dist/orders/waiting.d.ts +39 -0
  592. package/dist/orders/waiting.js +149 -0
  593. package/dist/orders/waiting.js.map +1 -0
  594. package/dist/pack.schema.js +13 -0
  595. package/dist/pack.schema.js.map +1 -0
  596. package/dist/pack.schema.json +7622 -841
  597. package/dist/packs/director/index.d.ts +13 -5
  598. package/dist/packs/director/index.js +204 -0
  599. package/dist/packs/director/index.js.map +1 -0
  600. package/dist/packs/heroes/campaign.d.ts +3 -2
  601. package/dist/packs/heroes/campaign.js +241 -0
  602. package/dist/packs/heroes/campaign.js.map +1 -0
  603. package/dist/packs/heroes/carry.d.ts +6 -0
  604. package/dist/packs/heroes/carry.js +112 -0
  605. package/dist/packs/heroes/carry.js.map +1 -0
  606. package/dist/packs/heroes/commands.js +115 -0
  607. package/dist/packs/heroes/commands.js.map +1 -0
  608. package/dist/packs/heroes/fallen.d.ts +43 -0
  609. package/dist/packs/heroes/fallen.js +61 -0
  610. package/dist/packs/heroes/fallen.js.map +1 -0
  611. package/dist/packs/heroes/hire.js +60 -0
  612. package/dist/packs/heroes/hire.js.map +1 -0
  613. package/dist/packs/heroes/index.d.ts +7 -6
  614. package/dist/packs/heroes/index.js +130 -0
  615. package/dist/packs/heroes/index.js.map +1 -0
  616. package/dist/packs/heroes/loop.d.ts +95 -0
  617. package/dist/packs/heroes/loop.js +250 -0
  618. package/dist/packs/heroes/loop.js.map +1 -0
  619. package/dist/packs/heroes/making.d.ts +6 -3
  620. package/dist/packs/heroes/making.js +55 -0
  621. package/dist/packs/heroes/making.js.map +1 -0
  622. package/dist/packs/heroes/respawn.d.ts +3 -3
  623. package/dist/packs/heroes/respawn.js +87 -0
  624. package/dist/packs/heroes/respawn.js.map +1 -0
  625. package/dist/packs/heroes/sets.d.ts +32 -0
  626. package/dist/packs/heroes/sets.js +51 -0
  627. package/dist/packs/heroes/sets.js.map +1 -0
  628. package/dist/packs/heroes/spells.d.ts +16 -0
  629. package/dist/packs/heroes/spells.js +269 -0
  630. package/dist/packs/heroes/spells.js.map +1 -0
  631. package/dist/packs/items/defaults.d.ts +43 -0
  632. package/dist/packs/items/defaults.js +1504 -0
  633. package/dist/packs/items/defaults.js.map +1 -0
  634. package/dist/packs/items/index.d.ts +27 -0
  635. package/dist/packs/items/index.js +214 -0
  636. package/dist/packs/items/index.js.map +1 -0
  637. package/dist/packs/moba/index.d.ts +3 -3
  638. package/dist/packs/moba/index.js +174 -0
  639. package/dist/packs/moba/index.js.map +1 -0
  640. package/dist/packs/pack.d.ts +15 -15
  641. package/dist/packs/pack.js +14 -0
  642. package/dist/packs/pack.js.map +1 -0
  643. package/dist/packs.d.ts +15 -7
  644. package/dist/packs.js +222 -0
  645. package/dist/packs.js.map +1 -0
  646. package/dist/paths.d.ts +2 -0
  647. package/dist/paths.js +109 -0
  648. package/dist/paths.js.map +1 -0
  649. package/dist/plain.js +57 -0
  650. package/dist/plain.js.map +1 -0
  651. package/dist/player.d.ts +33 -10
  652. package/dist/player.js +159 -0
  653. package/dist/player.js.map +1 -0
  654. package/dist/portals.d.ts +1 -1
  655. package/dist/portals.js +194 -0
  656. package/dist/portals.js.map +1 -0
  657. package/dist/prefabs.d.ts +25 -2
  658. package/dist/prefabs.js +239 -0
  659. package/dist/prefabs.js.map +1 -0
  660. package/dist/presetBuildings.js +58 -0
  661. package/dist/presetBuildings.js.map +1 -0
  662. package/dist/presetFoliage.d.ts +27 -0
  663. package/dist/presetFoliage.js +98 -0
  664. package/dist/presetFoliage.js.map +1 -0
  665. package/dist/presetGround.js +65 -0
  666. package/dist/presetGround.js.map +1 -0
  667. package/dist/proxies.d.ts +12 -0
  668. package/dist/proxies.js +79 -0
  669. package/dist/proxies.js.map +1 -0
  670. package/dist/query.d.ts +56 -0
  671. package/dist/query.js +88 -0
  672. package/dist/query.js.map +1 -0
  673. package/dist/races.d.ts +15 -14
  674. package/dist/races.js +172 -0
  675. package/dist/races.js.map +1 -0
  676. package/dist/randomGroups.js +91 -0
  677. package/dist/randomGroups.js.map +1 -0
  678. package/dist/registry.d.ts +117 -53
  679. package/dist/registry.js +323 -0
  680. package/dist/registry.js.map +1 -0
  681. package/dist/remains.d.ts +11 -9
  682. package/dist/remains.js +188 -0
  683. package/dist/remains.js.map +1 -0
  684. package/dist/replication.d.ts +12 -7
  685. package/dist/replication.js +100 -0
  686. package/dist/replication.js.map +1 -0
  687. package/dist/rng.d.ts +2 -0
  688. package/dist/rng.js +40 -0
  689. package/dist/rng.js.map +1 -0
  690. package/dist/rules.d.ts +186 -99
  691. package/dist/rules.js +179 -0
  692. package/dist/rules.js.map +1 -0
  693. package/dist/rulesCheck.d.ts +5 -4
  694. package/dist/rulesCheck.js +693 -0
  695. package/dist/rulesCheck.js.map +1 -0
  696. package/dist/runes.d.ts +2 -2
  697. package/dist/runes.js +80 -0
  698. package/dist/runes.js.map +1 -0
  699. package/dist/save.d.ts +37 -12
  700. package/dist/save.js +532 -0
  701. package/dist/save.js.map +1 -0
  702. package/dist/scenario.d.ts +2 -2
  703. package/dist/scenario.js +99 -0
  704. package/dist/scenario.js.map +1 -0
  705. package/dist/scheduler.d.ts +3 -0
  706. package/dist/scheduler.js +156 -0
  707. package/dist/scheduler.js.map +1 -0
  708. package/dist/score.d.ts +19 -19
  709. package/dist/score.js +709 -0
  710. package/dist/score.js.map +1 -0
  711. package/dist/sequences.d.ts +10 -6
  712. package/dist/sequences.js +206 -0
  713. package/dist/sequences.js.map +1 -0
  714. package/dist/server/doorman.js +154 -0
  715. package/dist/server/doorman.js.map +1 -0
  716. package/dist/server/gameServer.d.ts +16 -1
  717. package/dist/server/gameServer.js +643 -0
  718. package/dist/server/gameServer.js.map +1 -0
  719. package/dist/server/index.d.ts +1 -1
  720. package/dist/server/lobby.js +199 -0
  721. package/dist/server/lobby.js.map +1 -0
  722. package/dist/server/log.js +18 -0
  723. package/dist/server/log.js.map +1 -0
  724. package/dist/server/match.js +267 -0
  725. package/dist/server/match.js.map +1 -0
  726. package/dist/server/mode.d.ts +18 -9
  727. package/dist/server/mode.js +220 -0
  728. package/dist/server/mode.js.map +1 -0
  729. package/dist/{navigation-worker.js → server/navigation-worker.js} +1 -1
  730. package/dist/server/navigation-worker.js.map +1 -0
  731. package/dist/server/navigation.js +39 -0
  732. package/dist/server/navigation.js.map +1 -0
  733. package/dist/server/ops.d.ts +4 -0
  734. package/dist/server/ops.js +137 -0
  735. package/dist/server/ops.js.map +1 -0
  736. package/dist/server/packs.d.ts +3 -3
  737. package/dist/server/packs.js +32 -0
  738. package/dist/server/packs.js.map +1 -0
  739. package/dist/server/ratings.d.ts +5 -0
  740. package/dist/server/ratings.js +104 -0
  741. package/dist/server/ratings.js.map +1 -0
  742. package/dist/server/relay.d.ts +12 -2
  743. package/dist/server/relay.js +144 -0
  744. package/dist/server/relay.js.map +1 -0
  745. package/dist/server/rooms.d.ts +9 -2
  746. package/dist/server/rooms.js +442 -0
  747. package/dist/server/rooms.js.map +1 -0
  748. package/dist/server/seat.js +116 -0
  749. package/dist/server/seat.js.map +1 -0
  750. package/dist/server/seatSettings.d.ts +3 -3
  751. package/dist/server/seatSettings.js +63 -0
  752. package/dist/server/seatSettings.js.map +1 -0
  753. package/dist/server/secret.js +13 -0
  754. package/dist/server/secret.js.map +1 -0
  755. package/dist/server/start.d.ts +13 -6
  756. package/dist/server/start.js +76 -0
  757. package/dist/server/start.js.map +1 -0
  758. package/dist/server/websocket.d.ts +9 -1
  759. package/dist/server/websocket.js +306 -0
  760. package/dist/server/websocket.js.map +1 -0
  761. package/dist/server.js +15 -2861
  762. package/dist/session/can.js +26 -0
  763. package/dist/session/can.js.map +1 -0
  764. package/dist/session/commandReplay.d.ts +8 -2
  765. package/dist/session/commandReplay.js +293 -0
  766. package/dist/session/commandReplay.js.map +1 -0
  767. package/dist/session/debug.js +151 -0
  768. package/dist/session/debug.js.map +1 -0
  769. package/dist/session/delay.js +62 -0
  770. package/dist/session/delay.js.map +1 -0
  771. package/dist/session/delta.d.ts +14 -1
  772. package/dist/session/delta.js +407 -0
  773. package/dist/session/delta.js.map +1 -0
  774. package/dist/session/entityState.js +415 -0
  775. package/dist/session/entityState.js.map +1 -0
  776. package/dist/session/local.d.ts +47 -5
  777. package/dist/session/local.js +670 -0
  778. package/dist/session/local.js.map +1 -0
  779. package/dist/session/memory.d.ts +20 -2
  780. package/dist/session/memory.js +131 -0
  781. package/dist/session/memory.js.map +1 -0
  782. package/dist/session/protocol.d.ts +325 -31
  783. package/dist/session/protocol.js +55 -0
  784. package/dist/session/protocol.js.map +1 -0
  785. package/dist/session/remote.d.ts +74 -12
  786. package/dist/session/remote.js +1394 -0
  787. package/dist/session/remote.js.map +1 -0
  788. package/dist/session/replay.d.ts +11 -2
  789. package/dist/session/replay.js +160 -0
  790. package/dist/session/replay.js.map +1 -0
  791. package/dist/session/seed.js +12 -0
  792. package/dist/session/seed.js.map +1 -0
  793. package/dist/session/share.d.ts +5 -1
  794. package/dist/session/share.js +94 -0
  795. package/dist/session/share.js.map +1 -0
  796. package/dist/session/socket.d.ts +1 -1
  797. package/dist/session/socket.js +29 -0
  798. package/dist/session/socket.js.map +1 -0
  799. package/dist/session/wire.d.ts +5 -0
  800. package/dist/session/wire.js +84 -0
  801. package/dist/session/wire.js.map +1 -0
  802. package/dist/session/worker.d.ts +77 -12
  803. package/dist/session/worker.js +499 -0
  804. package/dist/session/worker.js.map +1 -0
  805. package/dist/shared.d.ts +31 -5
  806. package/dist/shared.js +166 -0
  807. package/dist/shared.js.map +1 -0
  808. package/dist/sides.d.ts +9 -3
  809. package/dist/sides.js +149 -0
  810. package/dist/sides.js.map +1 -0
  811. package/dist/sight.js +85 -0
  812. package/dist/sight.js.map +1 -0
  813. package/dist/simulate-worker.js +1 -1
  814. package/dist/simulate.d.ts +12 -8
  815. package/dist/{simulate-oXBiw1Ff.js → simulate.js} +10 -11
  816. package/dist/simulate.js.map +1 -0
  817. package/dist/smart.js +77 -0
  818. package/dist/smart.js.map +1 -0
  819. package/dist/spatial.d.ts +32 -16
  820. package/dist/spatial.js +234 -0
  821. package/dist/spatial.js.map +1 -0
  822. package/dist/spawning.d.ts +1 -0
  823. package/dist/spawning.js +224 -0
  824. package/dist/spawning.js.map +1 -0
  825. package/dist/stances.d.ts +6 -3
  826. package/dist/stances.js +169 -0
  827. package/dist/stances.js.map +1 -0
  828. package/dist/start.d.ts +10 -10
  829. package/dist/start.js +75 -0
  830. package/dist/start.js.map +1 -0
  831. package/dist/stats.d.ts +42 -16
  832. package/dist/stats.js +290 -0
  833. package/dist/stats.js.map +1 -0
  834. package/dist/summoned.d.ts +52 -0
  835. package/dist/summoned.js +38 -0
  836. package/dist/summoned.js.map +1 -0
  837. package/dist/summons.d.ts +10 -13
  838. package/dist/summons.js +271 -0
  839. package/dist/summons.js.map +1 -0
  840. package/dist/systems/abilities.js +224 -0
  841. package/dist/systems/abilities.js.map +1 -0
  842. package/dist/systems/combat.d.ts +35 -1
  843. package/dist/systems/combat.js +677 -0
  844. package/dist/systems/combat.js.map +1 -0
  845. package/dist/systems/combatTold.d.ts +3 -1
  846. package/dist/systems/combatTold.js +85 -0
  847. package/dist/systems/combatTold.js.map +1 -0
  848. package/dist/systems/construction.js +80 -0
  849. package/dist/systems/construction.js.map +1 -0
  850. package/dist/systems/economy.d.ts +0 -6
  851. package/dist/systems/economy.js +128 -0
  852. package/dist/systems/economy.js.map +1 -0
  853. package/dist/systems/fog.d.ts +1 -1
  854. package/dist/systems/fog.js +120 -0
  855. package/dist/systems/fog.js.map +1 -0
  856. package/dist/systems/life.js +32 -0
  857. package/dist/systems/life.js.map +1 -0
  858. package/dist/systems/movement.d.ts +24 -12
  859. package/dist/systems/movement.js +1247 -0
  860. package/dist/systems/movement.js.map +1 -0
  861. package/dist/systems/orders.js +64 -0
  862. package/dist/systems/orders.js.map +1 -0
  863. package/dist/systems/production.js +322 -0
  864. package/dist/systems/production.js.map +1 -0
  865. package/dist/systems/productionQueue.js +120 -0
  866. package/dist/systems/productionQueue.js.map +1 -0
  867. package/dist/systems/victory.d.ts +1 -1
  868. package/dist/systems/victory.js +56 -0
  869. package/dist/systems/victory.js.map +1 -0
  870. package/dist/talk.d.ts +6 -6
  871. package/dist/talk.js +153 -0
  872. package/dist/talk.js.map +1 -0
  873. package/dist/targeting.d.ts +142 -0
  874. package/dist/targeting.js +49 -0
  875. package/dist/targeting.js.map +1 -0
  876. package/dist/tech.d.ts +20 -3
  877. package/dist/tech.js +239 -0
  878. package/dist/tech.js.map +1 -0
  879. package/dist/techTree.d.ts +7 -0
  880. package/dist/techTree.js +90 -0
  881. package/dist/techTree.js.map +1 -0
  882. package/dist/terrain.d.ts +59 -7
  883. package/dist/terrain.js +389 -0
  884. package/dist/terrain.js.map +1 -0
  885. package/dist/terrainSave.d.ts +6 -0
  886. package/dist/terrainSave.js +74 -0
  887. package/dist/terrainSave.js.map +1 -0
  888. package/dist/testing.d.ts +8 -7
  889. package/dist/testing.js +13 -739
  890. package/dist/testing.js.map +1 -1
  891. package/dist/tiles.d.ts +1 -1
  892. package/dist/tiles.js +43 -0
  893. package/dist/tiles.js.map +1 -0
  894. package/dist/timers.d.ts +29 -4
  895. package/dist/timers.js +242 -0
  896. package/dist/timers.js.map +1 -0
  897. package/dist/tomes.d.ts +4 -4
  898. package/dist/tomes.js +94 -0
  899. package/dist/tomes.js.map +1 -0
  900. package/dist/trade.js +103 -0
  901. package/dist/trade.js.map +1 -0
  902. package/dist/transport.d.ts +6 -1
  903. package/dist/transport.js +281 -0
  904. package/dist/transport.js.map +1 -0
  905. package/dist/tunables.d.ts +10 -3
  906. package/dist/tunables.js +56 -0
  907. package/dist/tunables.js.map +1 -0
  908. package/dist/unitResources.d.ts +67 -0
  909. package/dist/unitResources.js +266 -0
  910. package/dist/unitResources.js.map +1 -0
  911. package/dist/upkeep.d.ts +6 -1
  912. package/dist/upkeep.js +26 -0
  913. package/dist/upkeep.js.map +1 -0
  914. package/dist/veterancy.d.ts +8 -3
  915. package/dist/veterancy.js +131 -0
  916. package/dist/veterancy.js.map +1 -0
  917. package/dist/vision.d.ts +36 -0
  918. package/dist/vision.js +133 -0
  919. package/dist/vision.js.map +1 -0
  920. package/dist/walls.d.ts +1 -1
  921. package/dist/walls.js +278 -0
  922. package/dist/walls.js.map +1 -0
  923. package/dist/world.d.ts +606 -88
  924. package/dist/world.js +1263 -0
  925. package/dist/world.js.map +1 -0
  926. package/package.json +2 -2
  927. package/dist/ai.js.map +0 -1
  928. package/dist/attributes.d.ts +0 -66
  929. package/dist/brain-BvVdUhX8.js +0 -7659
  930. package/dist/brain-BvVdUhX8.js.map +0 -1
  931. package/dist/builds-C6LfgvEU.js +0 -460
  932. package/dist/builds-C6LfgvEU.js.map +0 -1
  933. package/dist/coreComponents-syuh2fPG.js +0 -5149
  934. package/dist/coreComponents-syuh2fPG.js.map +0 -1
  935. package/dist/debugCommands-CzjrSm66.js +0 -14739
  936. package/dist/debugCommands-CzjrSm66.js.map +0 -1
  937. package/dist/determinism-BCymQwiE.js +0 -518
  938. package/dist/determinism-BCymQwiE.js.map +0 -1
  939. package/dist/game-DiJEN-Ks.js +0 -5800
  940. package/dist/game-DiJEN-Ks.js.map +0 -1
  941. package/dist/index.js.map +0 -1
  942. package/dist/inspect-D9dWHmZ0.js.map +0 -1
  943. package/dist/local-Dkovq42k.js +0 -1379
  944. package/dist/local-Dkovq42k.js.map +0 -1
  945. package/dist/missionRules-C-bGxm0Q.js.map +0 -1
  946. package/dist/navigation-worker.js.map +0 -1
  947. package/dist/packs-g5thvmGn.js +0 -3199
  948. package/dist/packs-g5thvmGn.js.map +0 -1
  949. package/dist/profiles-B3NS9jwk.js.map +0 -1
  950. package/dist/server.js.map +0 -1
  951. package/dist/simulate-oXBiw1Ff.js.map +0 -1
@@ -0,0 +1,26 @@
1
+ //#region src/session/can.ts
2
+ /** A session's pace, as `SessionCan.pace`: its own `speed` and `advance` */
3
+ function paceOf(session) {
4
+ return {
5
+ get speed() {
6
+ return session.speed;
7
+ },
8
+ set speed(speed) {
9
+ session.speed = speed;
10
+ },
11
+ advance: (ticks) => session.advance(ticks)
12
+ };
13
+ }
14
+ /** A session's saves, as `SessionCan.saves`: its own `save` and `checkpoint` */
15
+ function savesOf(session) {
16
+ return {
17
+ save: () => session.save(),
18
+ get checkpoint() {
19
+ return session.checkpoint;
20
+ }
21
+ };
22
+ }
23
+ //#endregion
24
+ export { paceOf, savesOf };
25
+
26
+ //# sourceMappingURL=can.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"can.js","names":[],"sources":["../../src/session/can.ts"],"sourcesContent":["/**\n * What a session can do besides being a seat (`SessionCan`), made of its own members: what a game played in this page\n * gives, in its thread (`LocalSession`) or in a worker (`WorkerSession`)\n */\nimport type { WorldSave } from '#engine/save'\nimport type { Message } from '#engine/messages'\nimport type { SessionPace, SessionSaves } from './protocol'\n\n/** A session's pace, as `SessionCan.pace`: its own `speed` and `advance` */\nexport function paceOf(session: { speed: number; advance(ticks?: number): void }): SessionPace {\n\treturn {\n\t\tget speed() {\n\t\t\treturn session.speed\n\t\t},\n\t\tset speed(speed: number) {\n\t\t\tsession.speed = speed\n\t\t},\n\t\tadvance: (ticks) => session.advance(ticks)\n\t}\n}\n\n/** A session's saves, as `SessionCan.saves`: its own `save` and `checkpoint` */\nexport function savesOf(session: { save(): Promise<WorldSave>; readonly checkpoint?: { label: Message; save: WorldSave } }): SessionSaves {\n\treturn {\n\t\tsave: () => session.save(),\n\t\tget checkpoint() {\n\t\t\treturn session.checkpoint\n\t\t}\n\t}\n}\n"],"mappings":";;AASA,SAAgB,OAAO,SAAwE;CAC9F,OAAO;EACN,IAAI,QAAQ;GACX,OAAO,QAAQ;EAChB;EACA,IAAI,MAAM,OAAe;GACxB,QAAQ,QAAQ;EACjB;EACA,UAAU,UAAU,QAAQ,QAAQ,KAAK;CAC1C;AACD;;AAGA,SAAgB,QAAQ,SAAkH;CACzI,OAAO;EACN,YAAY,QAAQ,KAAK;EACzB,IAAI,aAAa;GAChB,OAAO,QAAQ;EAChB;CACD;AACD"}
@@ -1,5 +1,5 @@
1
1
  import { type Apart } from '#engine/determinism';
2
- import { type GameModule } from '#engine/game';
2
+ import { type Rules } from '#engine/game';
3
3
  import type { Component } from '#engine/components';
4
4
  import type { IssuedCommand } from '#engine/commands';
5
5
  import type { PlayerId } from '#engine/entity';
@@ -10,7 +10,9 @@ import type { World } from '#engine/world';
10
10
  * @beta
11
11
  */
12
12
  export interface CommandReplay {
13
+ /** The replay's file format, always 2; another is not read */
13
14
  format: 2;
15
+ /** Marks this replay as one of commands, as opposed to a recording of snapshots */
14
16
  kind: 'commands';
15
17
  /** The game it is of, by id: a page plays back what it has */
16
18
  game: string;
@@ -18,9 +20,11 @@ export interface CommandReplay {
18
20
  rules: string;
19
21
  /** Whose side it is seen from when played back; any side can be, as all of the game is in it */
20
22
  player: PlayerId;
23
+ /** Ticks per second the game ran at, for the replay to run at again */
21
24
  tickRate: number;
22
25
  /** The tick it started and ended at */
23
26
  from: number;
27
+ /** The tick the recording ended at */
24
28
  to: number;
25
29
  /** The world as it was at `from`, as a save (`encodeSave`) */
26
30
  start: string;
@@ -48,7 +52,9 @@ export interface CommandReplay {
48
52
  * @beta
49
53
  */
50
54
  export interface CommandRecorder {
55
+ /** How many ticks have been recorded so far */
51
56
  readonly ticks: number;
57
+ /** Ends the recording and gives back the `CommandReplay` of what was recorded */
52
58
  stop(): CommandReplay;
53
59
  }
54
60
  /**
@@ -74,7 +80,7 @@ export declare function recordCommands(world: World, options: {
74
80
  * @beta
75
81
  */
76
82
  export declare function runReplay(replay: CommandReplay, options: {
77
- game: GameModule;
83
+ rules: Rules;
78
84
  to?: number;
79
85
  from?: number;
80
86
  components?: readonly Component<unknown, unknown>[];
@@ -0,0 +1,293 @@
1
+ import { decodeSave, encodeSave, saveWorld } from "../save.js";
2
+ import { loadWorld } from "../game.js";
3
+ import { SessionHost, connect } from "./remote.js";
4
+ import { saveDifference, worldFingerprint } from "../determinism.js";
5
+ //#region src/session/commandReplay.ts
6
+ /**
7
+ * Replays of commands (determinism D4): a game kept as where it started and what its players told it, tick by tick,
8
+ * and played back by running it again. A world comes out the same from the same start and the same commands (D1–D3),
9
+ * so this is the whole game, from every side, in a few kilobytes where the frames a watcher was sent are megabytes.
10
+ * Its hash every few seconds is kept with it: played back, a hash that differs says the game came apart there (rules
11
+ * changed since, or a system a save does not bring back), and from then it is the game the rules make now
12
+ */
13
+ /**
14
+ * Records a world from now as its start and the commands given to it from outside a tick (the players', by a
15
+ * session or a server; a computer player's are its system's, which runs again), with its hash every `every` ticks
16
+ * (300, ten seconds at 30 a second, when left out). Starting takes a save of the world, as saving does (it puts the
17
+ * crowd back as a load does)
18
+ *
19
+ * @beta
20
+ */
21
+ function recordCommands(world, options) {
22
+ const every = options.every ?? 300;
23
+ const checkpointEvery = options.checkpoints ?? 0;
24
+ const checkpoints = [];
25
+ const from = world.tick;
26
+ const start = encodeSave(saveWorld(world));
27
+ const commands = [];
28
+ const saves = [];
29
+ const hashes = [];
30
+ const unwatch = world.watch({
31
+ command: (command) => void commands.push([world.tick, structuredClone(command)]),
32
+ saved: () => void saves.push(world.tick),
33
+ stepped: () => {
34
+ if ((world.tick - from) % every === 0) hashes.push([world.tick, worldFingerprint(world)]);
35
+ if (checkpointEvery > 0 && (world.tick - from) % checkpointEvery === 0) checkpoints.push([world.tick, encodeSave(saveWorld(world))]);
36
+ }
37
+ });
38
+ let replay;
39
+ return {
40
+ get ticks() {
41
+ return world.tick - from;
42
+ },
43
+ stop() {
44
+ if (replay) return replay;
45
+ unwatch();
46
+ replay = {
47
+ format: 2,
48
+ kind: "commands",
49
+ game: world.registry.game,
50
+ rules: world.registry.hash,
51
+ player: options.player,
52
+ tickRate: world.tickRate,
53
+ from,
54
+ to: world.tick,
55
+ start,
56
+ commands,
57
+ saves,
58
+ hashes,
59
+ ...checkpoints.length && { checkpoints },
60
+ ...world.debugPlayers.size > 0 && { debug: [...world.debugPlayers] }
61
+ };
62
+ return replay;
63
+ }
64
+ };
65
+ }
66
+ /**
67
+ * A replay of commands run again, to its end or a tick, with no screen: the world as it is then, the first tick whose
68
+ * hash differs from the one kept (none when all were the same), and what differed first at the first checkpoint
69
+ * (`recordCommands`' `checkpoints`) where the world was not the one recorded: the entity and its field
70
+ * (`entities[id 11].pos.x`), and what each held. A replay with no checkpoints says the tick alone. What a test of a
71
+ * replay, and a server checking one, use
72
+ *
73
+ * @beta
74
+ */
75
+ async function runReplay(replay, options) {
76
+ const run = await replayRun(replay, options.rules, options.from, options.components);
77
+ run.stepTo(options.to ?? replay.to);
78
+ return {
79
+ world: run.world,
80
+ apart: run.apart,
81
+ difference: run.difference
82
+ };
83
+ }
84
+ /**
85
+ * `components`: those the app kept in the world recorded beside the game's (`CreateWorldOptions.components`: where the
86
+ * screen was played from), without which its saves do not load
87
+ */
88
+ async function replayRun(replay, game, at = replay.from, components, navigation) {
89
+ let checkpoint = [replay.from, replay.start];
90
+ for (const kept of replay.checkpoints ?? []) if (kept[0] <= at && kept[0] > checkpoint[0]) checkpoint = kept;
91
+ const [startTick, save0] = checkpoint;
92
+ const world = await loadWorld(decodeSave(save0), {
93
+ rules: game,
94
+ anyVersion: true,
95
+ components,
96
+ ...navigation && { navigation: { builds: navigation } }
97
+ });
98
+ for (const player of replay.debug ?? []) world.debugPlayers.add(player);
99
+ let command = replay.commands.findIndex(([tick]) => tick >= startTick);
100
+ if (command < 0) command = replay.commands.length;
101
+ let save = replay.saves.findIndex((tick) => tick > startTick);
102
+ if (save < 0) save = replay.saves.length;
103
+ let hash = replay.hashes.findIndex(([tick]) => tick > startTick);
104
+ if (hash < 0) hash = replay.hashes.length;
105
+ const ahead = (replay.checkpoints ?? []).filter(([tick]) => tick > startTick);
106
+ let next = 0;
107
+ let apart = null;
108
+ let difference = null;
109
+ const cameApart = (tick, what) => {
110
+ if (apart === null) apart = tick;
111
+ world.log.warn("replay", `The replay comes apart at tick ${tick}${what ?? ""}: the game is played on as these rules play it`, { tick });
112
+ };
113
+ return {
114
+ world,
115
+ get apart() {
116
+ return apart;
117
+ },
118
+ get difference() {
119
+ return difference;
120
+ },
121
+ stepTo(target, deadline = Infinity) {
122
+ let steps = 0;
123
+ while (world.tick < Math.min(target, replay.to) && !world.failure) {
124
+ if (++steps % 8 === 0 && performance.now() > deadline) return false;
125
+ while (command < replay.commands.length && replay.commands[command][0] <= world.tick) world.issue(structuredClone(replay.commands[command++][1]));
126
+ while (save < replay.saves.length && replay.saves[save] <= world.tick) {
127
+ saveWorld(world);
128
+ save++;
129
+ }
130
+ world.step();
131
+ while (hash < replay.hashes.length && replay.hashes[hash][0] < world.tick) hash++;
132
+ if (hash < replay.hashes.length && replay.hashes[hash][0] === world.tick) {
133
+ if (apart === null && worldFingerprint(world) !== replay.hashes[hash][1]) cameApart(world.tick);
134
+ hash++;
135
+ }
136
+ while (next < ahead.length && ahead[next][0] < world.tick) next++;
137
+ if (difference === null && next < ahead.length && ahead[next][0] === world.tick) {
138
+ const now = decodeSave(encodeSave(saveWorld(world, { reseat: false })));
139
+ const found = saveDifference(decodeSave(ahead[next][1]), now, world.registry);
140
+ if (found) {
141
+ difference = {
142
+ tick: world.tick,
143
+ ...found
144
+ };
145
+ cameApart(world.tick, `, first at ${found.path} (${JSON.stringify(found.a)} recorded, ${JSON.stringify(found.b)} now)`);
146
+ }
147
+ next++;
148
+ }
149
+ }
150
+ return true;
151
+ }
152
+ };
153
+ }
154
+ /**
155
+ * Two ends of a connection in the page, each message given to the other end once what runs now is done (a microtask):
156
+ * in order, with no clock, and never inside the call that sent it
157
+ */
158
+ function pair() {
159
+ const end = () => {
160
+ let handler = () => {};
161
+ let open = true;
162
+ const transport = {
163
+ send: (message) => {
164
+ if (open) queueMicrotask(() => other(transport).deliver(message));
165
+ },
166
+ onMessage: (on) => void (handler = on),
167
+ onClose: () => {},
168
+ close: () => void (open = false),
169
+ deliver: (message) => {
170
+ if (open) handler(message);
171
+ }
172
+ };
173
+ return transport;
174
+ };
175
+ const a = end();
176
+ const b = end();
177
+ const other = (one) => one === a ? b : a;
178
+ return [a, b];
179
+ }
180
+ /** How often a replay being played looks whether its game is due a tick, a second */
181
+ var LOOKS = 30;
182
+ /**
183
+ * Milliseconds of a look a replay being played spends running its game on, at most: what a seek has to catch up on
184
+ * (minute 15 is 27,000 ticks from the start) is run a slice a look, the page drawn between them
185
+ *
186
+ * @beta
187
+ */
188
+ var REPLAY_SLICE = 12;
189
+ /**
190
+ * Plays a replay of commands as a watcher's session: its world run again, `speed` times as fast, and served to the
191
+ * session as a host serves one who watches (`SessionHost`), from `player`'s side, or `options.player`'s. A moment
192
+ * asked for (`at`, `skipTo`) is run to a slice a look (`REPLAY_SLICE`), from the last checkpoint before it
193
+ * (`recordCommands`' `checkpoints`) where it is behind: going back starts the world again from there, and the session
194
+ * takes it up where it is (`RemoteSession.resume`). `behind` is how many ticks are still to run to it. `apart` is the
195
+ * tick it came apart from the game recorded at, if it did, and `difference` what differed first at the first
196
+ * checkpoint the world was not the one recorded (`runReplay`)
197
+ *
198
+ * @internal
199
+ */
200
+ function playCommands(replay, options) {
201
+ let run;
202
+ let host;
203
+ let timer;
204
+ let stopped = false;
205
+ const within = (tick) => Math.min(Math.max(tick, replay.from), replay.to);
206
+ let due = within(options.at ?? replay.from);
207
+ /** The world made again for a moment behind it, while it is made */
208
+ let going;
209
+ const watcher = options.player ?? replay.player;
210
+ /** A host for a world, with the watcher's end of a connection to it: the welcome goes out at once */
211
+ const serve = (world) => {
212
+ const [served, watching] = pair();
213
+ const serving = new SessionHost(world, {
214
+ sendRate: 10,
215
+ dropSilentAfter: Infinity
216
+ });
217
+ serving.connect(watcher, served, {
218
+ readOnly: true,
219
+ observer: true
220
+ });
221
+ return {
222
+ serving,
223
+ watching
224
+ };
225
+ };
226
+ const made = replayRun(replay, options.rules, due, options.components, options.navigation).then((first) => {
227
+ run = first;
228
+ const { serving, watching } = serve(first.world);
229
+ host = serving;
230
+ return connect(watching, { rules: options.rules });
231
+ });
232
+ /** Back to a moment before the world: made again from the last checkpoint before it, and the session taken there */
233
+ const rewind = (session, to) => {
234
+ going = replayRun(replay, options.rules, to, options.components, options.navigation).then((again) => {
235
+ if (stopped) return again.world.dispose();
236
+ const { serving, watching } = serve(again.world);
237
+ const resumed = session.resume(watching);
238
+ host?.dispose();
239
+ run?.world.dispose();
240
+ run = again;
241
+ host = serving;
242
+ return resumed;
243
+ }).catch((error) => run?.world.log.warn("replay", "The replay could not go back", { error: String(error) })).finally(() => going = void 0);
244
+ };
245
+ const player = {
246
+ session: made.then((session) => {
247
+ if (stopped) return session;
248
+ let last = performance.now();
249
+ timer = setInterval(() => {
250
+ const now = performance.now();
251
+ const seconds = (now - last) / 1e3;
252
+ last = now;
253
+ if (going || !run) return;
254
+ if (Math.floor(due) < run.world.tick) return rewind(session, Math.floor(due));
255
+ if (run.world.tick >= Math.floor(due)) due = Math.min(due + seconds * replay.tickRate * player.speed, replay.to);
256
+ run.stepTo(Math.floor(due), now + 12);
257
+ host.publish(seconds);
258
+ }, 1e3 / LOOKS);
259
+ return session;
260
+ }),
261
+ get tick() {
262
+ return run?.world.tick ?? replay.from;
263
+ },
264
+ speed: 1,
265
+ skipTo(tick) {
266
+ due = within(tick);
267
+ },
268
+ get behind() {
269
+ if (going) return Math.max(Math.floor(due) - replay.from, 1);
270
+ return Math.max(Math.floor(due) - (run?.world.tick ?? replay.from), 0);
271
+ },
272
+ get ended() {
273
+ return (run?.world.tick ?? replay.from) >= replay.to;
274
+ },
275
+ get apart() {
276
+ return run?.apart ?? null;
277
+ },
278
+ get difference() {
279
+ return run?.difference ?? null;
280
+ },
281
+ stop() {
282
+ stopped = true;
283
+ clearInterval(timer);
284
+ host?.dispose();
285
+ run?.world.dispose();
286
+ }
287
+ };
288
+ return player;
289
+ }
290
+ //#endregion
291
+ export { REPLAY_SLICE, playCommands, recordCommands, runReplay };
292
+
293
+ //# sourceMappingURL=commandReplay.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commandReplay.js","names":[],"sources":["../../src/session/commandReplay.ts"],"sourcesContent":["/**\n * Replays of commands (determinism D4): a game kept as where it started and what its players told it, tick by tick,\n * and played back by running it again. A world comes out the same from the same start and the same commands (D1–D3),\n * so this is the whole game, from every side, in a few kilobytes where the frames a watcher was sent are megabytes.\n * Its hash every few seconds is kept with it: played back, a hash that differs says the game came apart there (rules\n * changed since, or a system a save does not bring back), and from then it is the game the rules make now\n */\nimport { decodeSave, encodeSave, saveWorld } from '#engine/save'\nimport { type Apart, saveDifference, worldFingerprint } from '#engine/determinism'\nimport { type Rules, loadWorld } from '#engine/game'\nimport type { NavigationBuilds } from '#engine/navigation/builds'\nimport type { Component } from '#engine/components'\nimport type { IssuedCommand } from '#engine/commands'\nimport type { PlayerId } from '#engine/entity'\nimport type { World } from '#engine/world'\nimport { connect, type RemoteSession, SessionHost, type Transport } from './remote'\n\n/**\n * A game recorded as its start and its commands (`recordGame`'s `kind: 'commands'`), to run again (`playReplay`)\n *\n * @beta\n */\nexport interface CommandReplay {\n\t/** The replay's file format, always 2; another is not read */\n\tformat: 2\n\t/** Marks this replay as one of commands, as opposed to a recording of snapshots */\n\tkind: 'commands'\n\t/** The game it is of, by id: a page plays back what it has */\n\tgame: string\n\t/** The rules it was played with exactly (`registry.hash`): other rules may play it otherwise */\n\trules: string\n\t/** Whose side it is seen from when played back; any side can be, as all of the game is in it */\n\tplayer: PlayerId\n\t/** Ticks per second the game ran at, for the replay to run at again */\n\ttickRate: number\n\t/** The tick it started and ended at */\n\tfrom: number\n\t/** The tick the recording ended at */\n\tto: number\n\t/** The world as it was at `from`, as a save (`encodeSave`) */\n\tstart: string\n\t/** What its players told it, each at the tick it was given at, before that tick ran */\n\tcommands: [tick: number, command: IssuedCommand][]\n\t/** The ticks it was saved at: a save puts the crowd back as a load does (D2), so playing back does it there too */\n\tsaves: number[]\n\t/** The world's fingerprint (`worldFingerprint`) every `every` ticks, to tell where a game played back came apart */\n\thashes: [tick: number, hash: string][]\n\t/**\n\t * The world as it was every so many ticks (`recordCommands`' `checkpoints`), as saves: a replay played from a moment\n\t * starts from the last one before it, not from its start. None in a replay made before there were any @beta\n\t */\n\tcheckpoints?: [tick: number, save: string][]\n\t/**\n\t * The players who could use the debug commands as it was recorded (`World.debugPlayers`, which no save keeps): played\n\t * back, they may again, so a game whose cheats were used (the editor's Play here, its map edits pushed) comes to the\n\t * same. None when left out\n\t */\n\tdebug?: PlayerId[]\n}\n\n/**\n * A game being recorded as its commands\n *\n * @beta\n */\nexport interface CommandRecorder {\n\t/** How many ticks have been recorded so far */\n\treadonly ticks: number\n\t/** Ends the recording and gives back the `CommandReplay` of what was recorded */\n\tstop(): CommandReplay\n}\n\n/**\n * Records a world from now as its start and the commands given to it from outside a tick (the players', by a\n * session or a server; a computer player's are its system's, which runs again), with its hash every `every` ticks\n * (300, ten seconds at 30 a second, when left out). Starting takes a save of the world, as saving does (it puts the\n * crowd back as a load does)\n *\n * @beta\n */\nexport function recordCommands(world: World, options: { player: PlayerId; every?: number; checkpoints?: number }): CommandRecorder {\n\tconst every = options.every ?? 300\n\t// a save of the world every so many ticks, to play from a moment without running all before it: none when not asked\n\t// (a save of a full melee is a megabyte, where the whole replay without is a few hundred kilobytes)\n\tconst checkpointEvery = options.checkpoints ?? 0\n\tconst checkpoints: [tick: number, save: string][] = []\n\tconst from = world.tick\n\t// a save to start from: it puts the crowd back as loading it does, so the two go on the same from here\n\tconst start = encodeSave(saveWorld(world))\n\tconst commands: CommandReplay['commands'] = []\n\tconst saves: number[] = []\n\tconst hashes: CommandReplay['hashes'] = []\n\tconst unwatch = world.watch({\n\t\tcommand: (command) => void commands.push([world.tick, structuredClone(command)]),\n\t\tsaved: () => void saves.push(world.tick),\n\t\tstepped: () => {\n\t\t\tif ((world.tick - from) % every === 0) hashes.push([world.tick, worldFingerprint(world)])\n\t\t\t// taken as a save is: played back, a save is taken at that tick too, so the game goes on the same\n\t\t\tif (checkpointEvery > 0 && (world.tick - from) % checkpointEvery === 0) checkpoints.push([world.tick, encodeSave(saveWorld(world))])\n\t\t}\n\t})\n\tlet replay: CommandReplay | undefined\n\treturn {\n\t\tget ticks() {\n\t\t\treturn world.tick - from\n\t\t},\n\t\tstop() {\n\t\t\tif (replay) return replay\n\t\t\tunwatch()\n\t\t\treplay = {\n\t\t\t\tformat: 2,\n\t\t\t\tkind: 'commands',\n\t\t\t\tgame: world.registry.game,\n\t\t\t\trules: world.registry.hash,\n\t\t\t\tplayer: options.player,\n\t\t\t\ttickRate: world.tickRate,\n\t\t\t\tfrom,\n\t\t\t\tto: world.tick,\n\t\t\t\tstart,\n\t\t\t\tcommands,\n\t\t\t\tsaves,\n\t\t\t\thashes,\n\t\t\t\t...(checkpoints.length && { checkpoints }),\n\t\t\t\t...(world.debugPlayers.size > 0 && { debug: [...world.debugPlayers] })\n\t\t\t}\n\t\t\treturn replay\n\t\t}\n\t}\n}\n\n/**\n * A replay of commands run again, to its end or a tick, with no screen: the world as it is then, the first tick whose\n * hash differs from the one kept (none when all were the same), and what differed first at the first checkpoint\n * (`recordCommands`' `checkpoints`) where the world was not the one recorded: the entity and its field\n * (`entities[id 11].pos.x`), and what each held. A replay with no checkpoints says the tick alone. What a test of a\n * replay, and a server checking one, use\n *\n * @beta\n */\nexport async function runReplay(\n\treplay: CommandReplay,\n\toptions: { rules: Rules; to?: number; from?: number; components?: readonly Component<unknown, unknown>[] }\n): Promise<{ world: World; apart: number | null; difference: Apart | null }> {\n\tconst run = await replayRun(replay, options.rules, options.from, options.components)\n\trun.stepTo(options.to ?? replay.to)\n\treturn { world: run.world, apart: run.apart, difference: run.difference }\n}\n\n/** A replay of commands being run: its world, stepped on to a tick with what the replay says given at each */\ninterface ReplayRun {\n\treadonly world: World\n\t/** The first tick whose hash differed from the replay's, or whose checkpoint did, or null */\n\treadonly apart: number | null\n\t/** What differed first at the first checkpoint the world was not the one recorded at, or null */\n\treadonly difference: Apart | null\n\t/** Runs the world on to a tick, or until `deadline` (`performance.now()`'s) is past: whether it got there */\n\tstepTo(tick: number, deadline?: number): boolean\n}\n\n/**\n * `components`: those the app kept in the world recorded beside the game's (`CreateWorldOptions.components`: where the\n * screen was played from), without which its saves do not load\n */\nasync function replayRun(\n\treplay: CommandReplay,\n\tgame: Rules,\n\tat = replay.from,\n\tcomponents?: readonly Component<unknown, unknown>[],\n\tnavigation?: NavigationBuilds\n): Promise<ReplayRun> {\n\t// from the last checkpoint at or before the moment asked for, else from the start\n\tlet checkpoint: [number, string] = [replay.from, replay.start]\n\tfor (const kept of replay.checkpoints ?? []) if (kept[0] <= at && kept[0] > checkpoint[0]) checkpoint = kept\n\tconst [startTick, save0] = checkpoint\n\tconst world = await loadWorld(decodeSave(save0), { rules: game, anyVersion: true, components, ...(navigation && { navigation: { builds: navigation } }) })\n\t// who could use the debug tools as it was recorded may again: what they did is done the same\n\tfor (const player of replay.debug ?? []) world.debugPlayers.add(player)\n\t// what came before it is in it: the commands given at its tick are still to come (it was taken after the step to it)\n\tlet command = replay.commands.findIndex(([tick]) => tick >= startTick)\n\tif (command < 0) command = replay.commands.length\n\tlet save = replay.saves.findIndex((tick) => tick > startTick)\n\tif (save < 0) save = replay.saves.length\n\tlet hash = replay.hashes.findIndex(([tick]) => tick > startTick)\n\tif (hash < 0) hash = replay.hashes.length\n\t// the checkpoints after the one started from, to compare the whole world with: the hash says when, these say what\n\tconst ahead = (replay.checkpoints ?? []).filter(([tick]) => tick > startTick)\n\tlet next = 0\n\tlet apart: number | null = null\n\tlet difference: Apart | null = null\n\tconst cameApart = (tick: number, what?: string) => {\n\t\tif (apart === null) apart = tick\n\t\tworld.log.warn('replay', `The replay comes apart at tick ${tick}${what ?? ''}: the game is played on as these rules play it`, { tick })\n\t}\n\treturn {\n\t\tworld,\n\t\tget apart() {\n\t\t\treturn apart\n\t\t},\n\t\tget difference() {\n\t\t\treturn difference\n\t\t},\n\t\tstepTo(target, deadline = Infinity) {\n\t\t\tlet steps = 0\n\t\t\twhile (world.tick < Math.min(target, replay.to) && !world.failure) {\n\t\t\t\t// the clock looked at every few steps: a step is a fraction of a millisecond, a look is not free\n\t\t\t\tif (++steps % 8 === 0 && performance.now() > deadline) return false\n\t\t\t\t// what was given before this tick ran, and a save taken then, as they were\n\t\t\t\twhile (command < replay.commands.length && replay.commands[command][0] <= world.tick)\n\t\t\t\t\tworld.issue(structuredClone(replay.commands[command++][1]))\n\t\t\t\twhile (save < replay.saves.length && replay.saves[save] <= world.tick) {\n\t\t\t\t\tsaveWorld(world)\n\t\t\t\t\tsave++\n\t\t\t\t}\n\t\t\t\tworld.step()\n\t\t\t\twhile (hash < replay.hashes.length && replay.hashes[hash][0] < world.tick) hash++\n\t\t\t\tif (hash < replay.hashes.length && replay.hashes[hash][0] === world.tick) {\n\t\t\t\t\tif (apart === null && worldFingerprint(world) !== replay.hashes[hash][1]) cameApart(world.tick)\n\t\t\t\t\thash++\n\t\t\t\t}\n\t\t\t\twhile (next < ahead.length && ahead[next][0] < world.tick) next++\n\t\t\t\tif (difference === null && next < ahead.length && ahead[next][0] === world.tick) {\n\t\t\t\t\t// the world as a file keeps it, beside the one recorded: the first thing they differ in, by entity and field\n\t\t\t\t\tconst now = decodeSave(encodeSave(saveWorld(world, { reseat: false })))\n\t\t\t\t\tconst found = saveDifference(decodeSave(ahead[next][1]), now, world.registry)\n\t\t\t\t\tif (found) {\n\t\t\t\t\t\tdifference = { tick: world.tick, ...found }\n\t\t\t\t\t\tcameApart(world.tick, `, first at ${found.path} (${JSON.stringify(found.a)} recorded, ${JSON.stringify(found.b)} now)`)\n\t\t\t\t\t}\n\t\t\t\t\tnext++\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true\n\t\t}\n\t}\n}\n\n/**\n * Two ends of a connection in the page, each message given to the other end once what runs now is done (a microtask):\n * in order, with no clock, and never inside the call that sent it\n */\nfunction pair(): [Transport, Transport] {\n\tconst end = () => {\n\t\tlet handler: (message: string) => void = () => {}\n\t\tlet open = true\n\t\tconst transport: Transport & { deliver(message: string): void } = {\n\t\t\tsend: (message) => {\n\t\t\t\tif (open) queueMicrotask(() => other(transport).deliver(message))\n\t\t\t},\n\t\t\tonMessage: (on) => void (handler = on),\n\t\t\tonClose: () => {},\n\t\t\tclose: () => void (open = false),\n\t\t\tdeliver: (message) => {\n\t\t\t\tif (open) handler(message)\n\t\t\t}\n\t\t}\n\t\treturn transport\n\t}\n\tconst a = end()\n\tconst b = end()\n\tconst other = (one: typeof a) => (one === a ? b : a)\n\treturn [a, b]\n}\n\n/** How often a replay being played looks whether its game is due a tick, a second */\nconst LOOKS = 30\n\n/**\n * Milliseconds of a look a replay being played spends running its game on, at most: what a seek has to catch up on\n * (minute 15 is 27,000 ticks from the start) is run a slice a look, the page drawn between them\n *\n * @beta\n */\nexport const REPLAY_SLICE = 12\n\n/**\n * Plays a replay of commands as a watcher's session: its world run again, `speed` times as fast, and served to the\n * session as a host serves one who watches (`SessionHost`), from `player`'s side, or `options.player`'s. A moment\n * asked for (`at`, `skipTo`) is run to a slice a look (`REPLAY_SLICE`), from the last checkpoint before it\n * (`recordCommands`' `checkpoints`) where it is behind: going back starts the world again from there, and the session\n * takes it up where it is (`RemoteSession.resume`). `behind` is how many ticks are still to run to it. `apart` is the\n * tick it came apart from the game recorded at, if it did, and `difference` what differed first at the first\n * checkpoint the world was not the one recorded (`runReplay`)\n *\n * @internal\n */\nexport function playCommands(\n\treplay: CommandReplay,\n\toptions: { rules: Rules; at?: number; player?: PlayerId; components?: readonly Component<unknown, unknown>[]; navigation?: NavigationBuilds }\n): {\n\tsession: Promise<RemoteSession>\n\treadonly tick: number\n\tspeed: number\n\tskipTo(tick: number): void\n\treadonly behind: number\n\treadonly ended: boolean\n\treadonly apart: number | null\n\treadonly difference: Apart | null\n\tstop(): void\n} {\n\tlet run: ReplayRun | undefined\n\tlet host: SessionHost | undefined\n\tlet timer: ReturnType<typeof setInterval> | undefined\n\tlet stopped = false\n\tconst within = (tick: number) => Math.min(Math.max(tick, replay.from), replay.to)\n\tlet due = within(options.at ?? replay.from)\n\t/** The world made again for a moment behind it, while it is made */\n\tlet going: Promise<void> | undefined\n\tconst watcher = options.player ?? replay.player\n\t/** A host for a world, with the watcher's end of a connection to it: the welcome goes out at once */\n\tconst serve = (world: World) => {\n\t\tconst [served, watching] = pair()\n\t\t// its watcher is in this page and answers as the page draws: a seek runs on faster than frames come, and is no line gone silent\n\t\tconst serving = new SessionHost(world, { sendRate: 10, dropSilentAfter: Infinity })\n\t\tserving.connect(watcher, served, { readOnly: true, observer: true })\n\t\treturn { serving, watching }\n\t}\n\tconst made = replayRun(replay, options.rules, due, options.components, options.navigation).then((first) => {\n\t\trun = first\n\t\tconst { serving, watching } = serve(first.world)\n\t\thost = serving\n\t\treturn connect(watching, { rules: options.rules })\n\t})\n\t/** Back to a moment before the world: made again from the last checkpoint before it, and the session taken there */\n\tconst rewind = (session: RemoteSession, to: number) => {\n\t\tgoing = replayRun(replay, options.rules, to, options.components, options.navigation)\n\t\t\t.then((again) => {\n\t\t\t\tif (stopped) return again.world.dispose()\n\t\t\t\tconst { serving, watching } = serve(again.world)\n\t\t\t\t// the welcome is on its way: the session hears it as it takes the new end up\n\t\t\t\tconst resumed = session.resume(watching)\n\t\t\t\thost?.dispose()\n\t\t\t\trun?.world.dispose()\n\t\t\t\trun = again\n\t\t\t\thost = serving\n\t\t\t\treturn resumed\n\t\t\t})\n\t\t\t.catch((error: unknown) => run?.world.log.warn('replay', 'The replay could not go back', { error: String(error) }))\n\t\t\t.finally(() => (going = undefined))\n\t}\n\tconst player = {\n\t\tsession: made.then((session) => {\n\t\t\tif (stopped) return session\n\t\t\tlet last = performance.now()\n\t\t\ttimer = setInterval(() => {\n\t\t\t\tconst now = performance.now()\n\t\t\t\tconst seconds = (now - last) / 1000\n\t\t\t\tlast = now\n\t\t\t\tif (going || !run) return\n\t\t\t\t// a moment behind the world: it is made again for it\n\t\t\t\tif (Math.floor(due) < run.world.tick) return rewind(session, Math.floor(due))\n\t\t\t\t// played on from where it is once it is where it was asked to be; what is still to run, a slice a look\n\t\t\t\tif (run.world.tick >= Math.floor(due)) due = Math.min(due + seconds * replay.tickRate * player.speed, replay.to)\n\t\t\t\trun.stepTo(Math.floor(due), now + REPLAY_SLICE)\n\t\t\t\thost!.publish(seconds)\n\t\t\t}, 1000 / LOOKS)\n\t\t\treturn session\n\t\t}),\n\t\tget tick() {\n\t\t\treturn run?.world.tick ?? replay.from\n\t\t},\n\t\tspeed: 1,\n\t\tskipTo(tick: number) {\n\t\t\tdue = within(tick)\n\t\t},\n\t\tget behind() {\n\t\t\tif (going) return Math.max(Math.floor(due) - replay.from, 1)\n\t\t\treturn Math.max(Math.floor(due) - (run?.world.tick ?? replay.from), 0)\n\t\t},\n\t\tget ended() {\n\t\t\treturn (run?.world.tick ?? replay.from) >= replay.to\n\t\t},\n\t\tget apart() {\n\t\t\treturn run?.apart ?? null\n\t\t},\n\t\tget difference() {\n\t\t\treturn run?.difference ?? null\n\t\t},\n\t\tstop() {\n\t\t\tstopped = true\n\t\t\tclearInterval(timer)\n\t\t\thost?.dispose()\n\t\t\trun?.world.dispose()\n\t\t}\n\t}\n\treturn player\n}\n"],"mappings":"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"}
@@ -0,0 +1,151 @@
1
+ import { isFiniteNumber } from "./protocol.js";
2
+ import { EventLog, inspect, listWorld, setInspected } from "../inspect.js";
3
+ //#region src/session/debug.ts
4
+ /** Ticks between two lists of everything in the world: thousands of trees need not be listed every tick */
5
+ var LIST_EVERY = 10;
6
+ /**
7
+ * The debug tools' view of a world running in the same page. What it hands out is worked out again whenever a
8
+ * snapshot is, and at once when the client asks for something else: a remote one would wait for the answer instead
9
+ */
10
+ var LocalDebug = class {
11
+ simulation;
12
+ inspection = null;
13
+ world = null;
14
+ target = null;
15
+ listedAt = -Infinity;
16
+ events = new EventLog();
17
+ constructor(simulation) {
18
+ this.simulation = simulation;
19
+ }
20
+ inspect(target) {
21
+ this.target = target;
22
+ this.refresh();
23
+ }
24
+ set(path, value) {
25
+ if (!this.target) return;
26
+ setInspected(this.simulation, this.target, path, value);
27
+ this.refresh();
28
+ }
29
+ get listing() {
30
+ return this.world !== null;
31
+ }
32
+ set listing(on) {
33
+ this.listedAt = -Infinity;
34
+ this.world = on ? listWorld(this.simulation) : null;
35
+ }
36
+ get logging() {
37
+ return this.events.attached;
38
+ }
39
+ set logging(on) {
40
+ if (on === this.logging) return;
41
+ if (on) this.events.attach(this.simulation);
42
+ else this.events.detach();
43
+ }
44
+ log() {
45
+ return this.events.entries;
46
+ }
47
+ clearLog() {
48
+ this.events.clear();
49
+ }
50
+ /** Works what is handed out again. The session does when a tick went by */
51
+ refresh() {
52
+ const world = this.simulation;
53
+ this.inspection = this.target && inspect(world, this.target);
54
+ if (this.world && world.tick - this.listedAt >= LIST_EVERY) {
55
+ this.world = listWorld(world);
56
+ this.listedAt = world.tick;
57
+ }
58
+ }
59
+ dispose() {
60
+ this.events.detach();
61
+ }
62
+ };
63
+ /** What is followed, as the wire says it: an entity, a player or the world, or nothing; anything else is not */
64
+ function targetOf(value) {
65
+ if (value === null) return null;
66
+ if (typeof value !== "object") return void 0;
67
+ const target = value;
68
+ if (isFiniteNumber(target.entity)) return { entity: target.entity };
69
+ if (isFiniteNumber(target.player)) return { player: target.player };
70
+ if (target.world === true) return { world: true };
71
+ }
72
+ /**
73
+ * Does what the debug tools of a screen asked of a world here (`DebugAsk`), each field checked first: it comes from
74
+ * anyone who can send anything
75
+ */
76
+ function askDebug(view, ask) {
77
+ const target = targetOf(ask.inspect);
78
+ if (target !== void 0) view.inspect(target);
79
+ const set = ask.set;
80
+ if (set && Array.isArray(set.path) && set.path.every((key) => typeof key === "string" || isFiniteNumber(key)) && (isFiniteNumber(set.value) || typeof set.value === "boolean")) view.set(set.path, set.value);
81
+ if (typeof ask.listing === "boolean") view.listing = ask.listing;
82
+ if (typeof ask.logging === "boolean") view.logging = ask.logging;
83
+ if (ask.clearLog === true) view.clearLog();
84
+ }
85
+ /**
86
+ * The debug tools' view of a world elsewhere, a server's or a worker's: what it asked to follow, said over the wire
87
+ * (`DebugAsk`), and what came back last (`take`)
88
+ */
89
+ var RemoteDebug = class {
90
+ ask;
91
+ inspection = null;
92
+ world = null;
93
+ listed = false;
94
+ logged = false;
95
+ target = null;
96
+ events = [];
97
+ constructor(ask) {
98
+ this.ask = ask;
99
+ }
100
+ inspect(target) {
101
+ this.target = target;
102
+ if (!target) this.inspection = null;
103
+ this.ask({ inspect: target });
104
+ }
105
+ /** Asks again for all it follows: of a world it is served from anew (a session resumed, a replay gone back) */
106
+ askAgain() {
107
+ if (this.target || this.listed || this.logged) this.ask({
108
+ inspect: this.target,
109
+ listing: this.listed,
110
+ logging: this.logged
111
+ });
112
+ }
113
+ set(path, value) {
114
+ this.ask({ set: {
115
+ path,
116
+ value
117
+ } });
118
+ }
119
+ get listing() {
120
+ return this.listed;
121
+ }
122
+ set listing(on) {
123
+ this.listed = on;
124
+ if (!on) this.world = null;
125
+ this.ask({ listing: on });
126
+ }
127
+ get logging() {
128
+ return this.logged;
129
+ }
130
+ set logging(on) {
131
+ this.logged = on;
132
+ this.ask({ logging: on });
133
+ }
134
+ log() {
135
+ return this.events;
136
+ }
137
+ clearLog() {
138
+ this.events = [];
139
+ this.ask({ clearLog: true });
140
+ }
141
+ /** What the world's side said of what is followed */
142
+ take(said) {
143
+ this.inspection = said.inspection;
144
+ this.world = this.listed ? said.world : null;
145
+ if (this.logged) this.events = said.log;
146
+ }
147
+ };
148
+ //#endregion
149
+ export { LocalDebug, RemoteDebug, askDebug };
150
+
151
+ //# sourceMappingURL=debug.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"debug.js","names":[],"sources":["../../src/session/debug.ts"],"sourcesContent":["import { EventLog, inspect, type Inspection, type InspectTarget, listWorld, type LoggedEvent, setInspected, type WorldListing } from '#engine/inspect'\nimport type { World } from '#engine/world'\nimport { isFiniteNumber, type SessionDebug } from './protocol'\nimport type { DebugAsk } from './wire'\n\n/** Milliseconds between two words of the debug tools' view of a world elsewhere: a server's, a worker's */\nexport const DEBUG_EVERY = 100\n\n/** Ticks between two lists of everything in the world: thousands of trees need not be listed every tick */\nconst LIST_EVERY = 10\n\n/**\n * The debug tools' view of a world running in the same page. What it hands out is worked out again whenever a\n * snapshot is, and at once when the client asks for something else: a remote one would wait for the answer instead\n */\nexport class LocalDebug implements SessionDebug {\n\tinspection: Inspection | null = null\n\tworld: WorldListing | null = null\n\tprivate target: InspectTarget | null = null\n\tprivate listedAt = -Infinity\n\tprivate readonly events = new EventLog()\n\n\tconstructor(private readonly simulation: World) {}\n\n\tinspect(target: InspectTarget | null): void {\n\t\tthis.target = target\n\t\tthis.refresh()\n\t}\n\n\tset(path: (string | number)[], value: number | boolean): void {\n\t\tif (!this.target) return\n\t\tsetInspected(this.simulation, this.target, path, value)\n\t\tthis.refresh()\n\t}\n\n\tget listing(): boolean {\n\t\treturn this.world !== null\n\t}\n\n\tset listing(on: boolean) {\n\t\tthis.listedAt = -Infinity\n\t\tthis.world = on ? listWorld(this.simulation) : null\n\t}\n\n\tget logging(): boolean {\n\t\treturn this.events.attached\n\t}\n\n\tset logging(on: boolean) {\n\t\tif (on === this.logging) return\n\t\tif (on) this.events.attach(this.simulation)\n\t\telse this.events.detach()\n\t}\n\n\tlog(): readonly LoggedEvent[] {\n\t\treturn this.events.entries\n\t}\n\n\tclearLog(): void {\n\t\tthis.events.clear()\n\t}\n\n\t/** Works what is handed out again. The session does when a tick went by */\n\trefresh(): void {\n\t\tconst world = this.simulation\n\t\tthis.inspection = this.target && inspect(world, this.target)\n\t\tif (this.world && world.tick - this.listedAt >= LIST_EVERY) {\n\t\t\tthis.world = listWorld(world)\n\t\t\tthis.listedAt = world.tick\n\t\t}\n\t}\n\n\tdispose(): void {\n\t\tthis.events.detach()\n\t}\n}\n\n/** What is followed, as the wire says it: an entity, a player or the world, or nothing; anything else is not */\nfunction targetOf(value: unknown): InspectTarget | null | undefined {\n\tif (value === null) return null\n\tif (typeof value !== 'object') return undefined\n\tconst target = value as Record<string, unknown>\n\tif (isFiniteNumber(target.entity)) return { entity: target.entity }\n\tif (isFiniteNumber(target.player)) return { player: target.player }\n\tif (target.world === true) return { world: true }\n\treturn undefined\n}\n\n/**\n * Does what the debug tools of a screen asked of a world here (`DebugAsk`), each field checked first: it comes from\n * anyone who can send anything\n */\nexport function askDebug(view: SessionDebug, ask: Record<string, unknown>): void {\n\tconst target = targetOf(ask.inspect)\n\tif (target !== undefined) view.inspect(target)\n\tconst set = ask.set as { path?: unknown; value?: unknown } | undefined\n\tif (\n\t\tset &&\n\t\tArray.isArray(set.path) &&\n\t\tset.path.every((key) => typeof key === 'string' || isFiniteNumber(key)) &&\n\t\t(isFiniteNumber(set.value) || typeof set.value === 'boolean')\n\t)\n\t\tview.set(set.path as (string | number)[], set.value)\n\tif (typeof ask.listing === 'boolean') view.listing = ask.listing\n\tif (typeof ask.logging === 'boolean') view.logging = ask.logging\n\tif (ask.clearLog === true) view.clearLog()\n}\n\n/**\n * The debug tools' view of a world elsewhere, a server's or a worker's: what it asked to follow, said over the wire\n * (`DebugAsk`), and what came back last (`take`)\n */\nexport class RemoteDebug implements SessionDebug {\n\tinspection: Inspection | null = null\n\tworld: WorldListing | null = null\n\tprivate listed = false\n\tprivate logged = false\n\tprivate target: InspectTarget | null = null\n\tprivate events: readonly LoggedEvent[] = []\n\n\tconstructor(private readonly ask: (ask: DebugAsk) => void) {}\n\n\tinspect(target: InspectTarget | null): void {\n\t\tthis.target = target\n\t\tif (!target) this.inspection = null\n\t\tthis.ask({ inspect: target })\n\t}\n\n\t/** Asks again for all it follows: of a world it is served from anew (a session resumed, a replay gone back) */\n\taskAgain(): void {\n\t\tif (this.target || this.listed || this.logged) this.ask({ inspect: this.target, listing: this.listed, logging: this.logged })\n\t}\n\n\tset(path: (string | number)[], value: number | boolean): void {\n\t\tthis.ask({ set: { path, value } })\n\t}\n\n\tget listing(): boolean {\n\t\treturn this.listed\n\t}\n\n\tset listing(on: boolean) {\n\t\tthis.listed = on\n\t\tif (!on) this.world = null\n\t\tthis.ask({ listing: on })\n\t}\n\n\tget logging(): boolean {\n\t\treturn this.logged\n\t}\n\n\tset logging(on: boolean) {\n\t\tthis.logged = on\n\t\tthis.ask({ logging: on })\n\t}\n\n\tlog(): readonly LoggedEvent[] {\n\t\treturn this.events\n\t}\n\n\tclearLog(): void {\n\t\tthis.events = []\n\t\tthis.ask({ clearLog: true })\n\t}\n\n\t/** What the world's side said of what is followed */\n\ttake(said: { inspection: Inspection | null; world: WorldListing | null; log: readonly LoggedEvent[] }): void {\n\t\tthis.inspection = said.inspection\n\t\tthis.world = this.listed ? said.world : null\n\t\tif (this.logged) this.events = said.log\n\t}\n}\n"],"mappings":"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"}
@@ -0,0 +1,62 @@
1
+ //#region src/session/delay.ts
2
+ /** The tick a message to a player says it brings: of a delta from the head of its text, of the welcome from the frame it carries */
3
+ var tickOf = (message) => {
4
+ const found = /^\{"type":"delta","tick":(\d+)/.exec(message) ?? (message.startsWith("{\"type\":\"welcome\"") ? /"first":\{"tick":(\d+)/.exec(message) : null);
5
+ return found ? Number(found[1]) : void 0;
6
+ };
7
+ /** How often what is held is looked at, to send on what is due: a second's tenth is near enough for a delay of seconds */
8
+ var LOOK_EVERY = 100;
9
+ /**
10
+ * The host's end of a watcher's transport, with what goes to the watcher held for `seconds` (see the top of this
11
+ * file). Closing it closes the watcher's, and what is held goes with it
12
+ *
13
+ * @beta
14
+ */
15
+ function delayed(transport, seconds) {
16
+ const held = [];
17
+ let hostHears = () => {};
18
+ let hostClosed = () => {};
19
+ const timer = setInterval(() => {
20
+ const now = performance.now();
21
+ let due = 0;
22
+ while (due < held.length && held[due].at <= now) due++;
23
+ for (const { text } of held.splice(0, due)) transport.send(text);
24
+ }, LOOK_EVERY);
25
+ transport.onMessage((text) => {
26
+ if (text.startsWith("{\"type\":\"ack\"")) return;
27
+ hostHears(text);
28
+ });
29
+ transport.onClose(() => {
30
+ clearInterval(timer);
31
+ held.length = 0;
32
+ hostClosed();
33
+ });
34
+ return {
35
+ send(text) {
36
+ held.push({
37
+ at: performance.now() + seconds * 1e3,
38
+ text
39
+ });
40
+ const tick = tickOf(text);
41
+ if (tick !== void 0) queueMicrotask(() => hostHears(JSON.stringify({
42
+ type: "ack",
43
+ tick
44
+ })));
45
+ },
46
+ onMessage(handler) {
47
+ hostHears = handler;
48
+ },
49
+ onClose(handler) {
50
+ hostClosed = handler;
51
+ },
52
+ close() {
53
+ clearInterval(timer);
54
+ held.length = 0;
55
+ transport.close();
56
+ }
57
+ };
58
+ }
59
+ //#endregion
60
+ export { delayed };
61
+
62
+ //# sourceMappingURL=delay.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delay.js","names":[],"sources":["../../src/session/delay.ts"],"sourcesContent":["/**\n * A watcher shown the game some seconds behind it (RV86): what the host sends goes on after the delay, so that who\n * watches a game being played cannot tell a side where the other is now. The host is answered at once on the\n * watcher's behalf (`ack`), as one who missed nothing: it goes on making each frame against the one before, and keeps\n * nothing more for the delay; the watcher's own answers are not passed on, as they come late. The rest of what the\n * watcher says (a line, a ping) goes as it is said\n */\nimport type { Transport } from './remote'\n\n/** The tick a message to a player says it brings: of a delta from the head of its text, of the welcome from the frame it carries */\nconst tickOf = (message: string): number | undefined => {\n\tconst found =\n\t\t/^\\{\"type\":\"delta\",\"tick\":(\\d+)/.exec(message) ?? (message.startsWith('{\"type\":\"welcome\"') ? /\"first\":\\{\"tick\":(\\d+)/.exec(message) : null)\n\treturn found ? Number(found[1]) : undefined\n}\n\n/** How often what is held is looked at, to send on what is due: a second's tenth is near enough for a delay of seconds */\nconst LOOK_EVERY = 100\n\n/**\n * The host's end of a watcher's transport, with what goes to the watcher held for `seconds` (see the top of this\n * file). Closing it closes the watcher's, and what is held goes with it\n *\n * @beta\n */\nexport function delayed(transport: Transport, seconds: number): Transport {\n\tconst held: { at: number; text: string }[] = []\n\tlet hostHears: (text: string) => void = () => {}\n\tlet hostClosed: () => void = () => {}\n\tconst timer = setInterval(() => {\n\t\tconst now = performance.now()\n\t\tlet due = 0\n\t\twhile (due < held.length && held[due].at <= now) due++\n\t\tfor (const { text } of held.splice(0, due)) transport.send(text)\n\t}, LOOK_EVERY)\n\ttransport.onMessage((text) => {\n\t\t// the watcher's own answers come late: the host had them at once\n\t\tif (text.startsWith('{\"type\":\"ack\"')) return\n\t\thostHears(text)\n\t})\n\t// one handler on the watcher's end (a server's keeps one): told on to the host's\n\ttransport.onClose(() => {\n\t\tclearInterval(timer)\n\t\theld.length = 0\n\t\thostClosed()\n\t})\n\treturn {\n\t\tsend(text) {\n\t\t\theld.push({ at: performance.now() + seconds * 1000, text })\n\t\t\tconst tick = tickOf(text)\n\t\t\t// answered as one who missed nothing, once what the host does now is done\n\t\t\tif (tick !== undefined) queueMicrotask(() => hostHears(JSON.stringify({ type: 'ack', tick })))\n\t\t},\n\t\tonMessage(handler) {\n\t\t\thostHears = handler\n\t\t},\n\t\tonClose(handler) {\n\t\t\thostClosed = handler\n\t\t},\n\t\tclose() {\n\t\t\tclearInterval(timer)\n\t\t\theld.length = 0\n\t\t\ttransport.close()\n\t\t}\n\t}\n}\n"],"mappings":";;AAUA,IAAM,UAAU,YAAwC;CACvD,MAAM,QACL,iCAAiC,KAAK,OAAO,MAAM,QAAQ,WAAW,uBAAmB,IAAI,yBAAyB,KAAK,OAAO,IAAI;CACvI,OAAO,QAAQ,OAAO,MAAM,EAAE,IAAI,KAAA;AACnC;;AAGA,IAAM,aAAa;;;;;;;AAQnB,SAAgB,QAAQ,WAAsB,SAA4B;CACzE,MAAM,OAAuC,CAAC;CAC9C,IAAI,kBAA0C,CAAC;CAC/C,IAAI,mBAA+B,CAAC;CACpC,MAAM,QAAQ,kBAAkB;EAC/B,MAAM,MAAM,YAAY,IAAI;EAC5B,IAAI,MAAM;EACV,OAAO,MAAM,KAAK,UAAU,KAAK,IAAI,CAAC,MAAM,KAAK;EACjD,KAAK,MAAM,EAAE,UAAU,KAAK,OAAO,GAAG,GAAG,GAAG,UAAU,KAAK,IAAI;CAChE,GAAG,UAAU;CACb,UAAU,WAAW,SAAS;EAE7B,IAAI,KAAK,WAAW,mBAAe,GAAG;EACtC,UAAU,IAAI;CACf,CAAC;CAED,UAAU,cAAc;EACvB,cAAc,KAAK;EACnB,KAAK,SAAS;EACd,WAAW;CACZ,CAAC;CACD,OAAO;EACN,KAAK,MAAM;GACV,KAAK,KAAK;IAAE,IAAI,YAAY,IAAI,IAAI,UAAU;IAAM;GAAK,CAAC;GAC1D,MAAM,OAAO,OAAO,IAAI;GAExB,IAAI,SAAS,KAAA,GAAW,qBAAqB,UAAU,KAAK,UAAU;IAAE,MAAM;IAAO;GAAK,CAAC,CAAC,CAAC;EAC9F;EACA,UAAU,SAAS;GAClB,YAAY;EACb;EACA,QAAQ,SAAS;GAChB,aAAa;EACd;EACA,QAAQ;GACP,cAAc,KAAK;GACnB,KAAK,SAAS;GACd,UAAU,MAAM;EACjB;CACD;AACD"}