@v12-engine/engine 0.1.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (951) hide show
  1. package/dist/abilities/amounts.d.ts +28 -0
  2. package/dist/abilities/amounts.js +74 -0
  3. package/dist/abilities/amounts.js.map +1 -0
  4. package/dist/abilities/buffs.d.ts +106 -6
  5. package/dist/abilities/buffs.js +443 -0
  6. package/dist/abilities/buffs.js.map +1 -0
  7. package/dist/abilities/castTold.d.ts +2 -0
  8. package/dist/abilities/castTold.js +66 -0
  9. package/dist/abilities/castTold.js.map +1 -0
  10. package/dist/abilities/chance.d.ts +38 -0
  11. package/dist/abilities/chance.js +77 -0
  12. package/dist/abilities/chance.js.map +1 -0
  13. package/dist/abilities/charges.d.ts +18 -0
  14. package/dist/abilities/charges.js +101 -0
  15. package/dist/abilities/charges.js.map +1 -0
  16. package/dist/abilities/control.d.ts +28 -0
  17. package/dist/abilities/control.js +113 -0
  18. package/dist/abilities/control.js.map +1 -0
  19. package/dist/abilities/dispel.js +51 -0
  20. package/dist/abilities/dispel.js.map +1 -0
  21. package/dist/abilities/effectFields.d.ts +1 -1
  22. package/dist/abilities/effectFields.js +676 -0
  23. package/dist/abilities/effectFields.js.map +1 -0
  24. package/dist/abilities/effectIndex.d.ts +27 -0
  25. package/dist/abilities/effectIndex.js +64 -0
  26. package/dist/abilities/effectIndex.js.map +1 -0
  27. package/dist/abilities/effects/buff.d.ts +9 -3
  28. package/dist/abilities/effects/buff.js +84 -0
  29. package/dist/abilities/effects/buff.js.map +1 -0
  30. package/dist/abilities/effects/conditions.d.ts +2 -0
  31. package/dist/abilities/effects/conditions.js +41 -0
  32. package/dist/abilities/effects/conditions.js.map +1 -0
  33. package/dist/abilities/effects/core.js +54 -0
  34. package/dist/abilities/effects/core.js.map +1 -0
  35. package/dist/abilities/effects/damage.d.ts +1 -1
  36. package/dist/abilities/effects/damage.js +43 -0
  37. package/dist/abilities/effects/damage.js.map +1 -0
  38. package/dist/abilities/effects/heal.d.ts +2 -2
  39. package/dist/abilities/effects/heal.js +51 -0
  40. package/dist/abilities/effects/heal.js.map +1 -0
  41. package/dist/abilities/effects/missile.d.ts +13 -1
  42. package/dist/abilities/effects/missile.js +104 -0
  43. package/dist/abilities/effects/missile.js.map +1 -0
  44. package/dist/abilities/effects/morph.d.ts +5 -0
  45. package/dist/abilities/effects/morph.js +43 -0
  46. package/dist/abilities/effects/morph.js.map +1 -0
  47. package/dist/abilities/effects/moves.d.ts +16 -4
  48. package/dist/abilities/effects/moves.js +212 -0
  49. package/dist/abilities/effects/moves.js.map +1 -0
  50. package/dist/abilities/effects/passives.d.ts +19 -9
  51. package/dist/abilities/effects/passives.js +131 -0
  52. package/dist/abilities/effects/passives.js.map +1 -0
  53. package/dist/abilities/effects/proxy.d.ts +5 -0
  54. package/dist/abilities/effects/proxy.js +60 -0
  55. package/dist/abilities/effects/proxy.js.map +1 -0
  56. package/dist/abilities/effects/sight.d.ts +2 -2
  57. package/dist/abilities/effects/sight.js +39 -0
  58. package/dist/abilities/effects/sight.js.map +1 -0
  59. package/dist/abilities/effects/spawn.d.ts +5 -2
  60. package/dist/abilities/effects/spawn.js +40 -0
  61. package/dist/abilities/effects/spawn.js.map +1 -0
  62. package/dist/abilities/effects/timed.d.ts +2 -2
  63. package/dist/abilities/effects/timed.js +96 -0
  64. package/dist/abilities/effects/timed.js.map +1 -0
  65. package/dist/abilities/effects/trade.d.ts +1 -1
  66. package/dist/abilities/effects/trade.js +25 -0
  67. package/dist/abilities/effects/trade.js.map +1 -0
  68. package/dist/abilities/effects.d.ts +97 -23
  69. package/dist/abilities/effects.js +860 -0
  70. package/dist/abilities/effects.js.map +1 -0
  71. package/dist/abilities/land.d.ts +38 -4
  72. package/dist/abilities/land.js +189 -0
  73. package/dist/abilities/land.js.map +1 -0
  74. package/dist/abilities/recast.d.ts +45 -0
  75. package/dist/abilities/recast.js +118 -0
  76. package/dist/abilities/recast.js.map +1 -0
  77. package/dist/abilities/scaled.js +40 -0
  78. package/dist/abilities/scaled.js.map +1 -0
  79. package/dist/abilities/screen.d.ts +6 -0
  80. package/dist/abilities/screen.js +83 -0
  81. package/dist/abilities/screen.js.map +1 -0
  82. package/dist/abilities/shapes.d.ts +66 -0
  83. package/dist/abilities/shapes.js +122 -0
  84. package/dist/abilities/shapes.js.map +1 -0
  85. package/dist/abilities/text.d.ts +14 -2
  86. package/dist/abilities/text.js +204 -0
  87. package/dist/abilities/text.js.map +1 -0
  88. package/dist/abilities/triggers.d.ts +98 -0
  89. package/dist/abilities/triggers.js +351 -0
  90. package/dist/abilities/triggers.js.map +1 -0
  91. package/dist/abilityChanges.d.ts +131 -0
  92. package/dist/abilityChanges.js +345 -0
  93. package/dist/abilityChanges.js.map +1 -0
  94. package/dist/ai/area.d.ts +4 -1
  95. package/dist/ai/brain.d.ts +4 -1
  96. package/dist/ai/brain.js +844 -0
  97. package/dist/ai/brain.js.map +1 -0
  98. package/dist/ai/budget.js +74 -0
  99. package/dist/ai/budget.js.map +1 -0
  100. package/dist/ai/checks.d.ts +9 -1
  101. package/dist/ai/checks.js +242 -0
  102. package/dist/ai/checks.js.map +1 -0
  103. package/dist/ai/computer.d.ts +11 -4
  104. package/dist/ai/computer.js +251 -0
  105. package/dist/ai/computer.js.map +1 -0
  106. package/dist/ai/defence.d.ts +4 -0
  107. package/dist/ai/defence.js +430 -0
  108. package/dist/ai/defence.js.map +1 -0
  109. package/dist/ai/define.d.ts +3 -2
  110. package/dist/ai/define.js +31 -0
  111. package/dist/ai/define.js.map +1 -0
  112. package/dist/ai/economy.d.ts +10 -7
  113. package/dist/ai/economy.js +780 -0
  114. package/dist/ai/economy.js.map +1 -0
  115. package/dist/ai/geometry.js +38 -0
  116. package/dist/ai/geometry.js.map +1 -0
  117. package/dist/ai/goals.d.ts +1 -0
  118. package/dist/ai/goals.js +560 -0
  119. package/dist/ai/goals.js.map +1 -0
  120. package/dist/ai/knowledge.d.ts +72 -7
  121. package/dist/ai/knowledge.js +804 -0
  122. package/dist/ai/knowledge.js.map +1 -0
  123. package/dist/ai/lanes.d.ts +10 -2
  124. package/dist/ai/lanes.js +715 -0
  125. package/dist/ai/lanes.js.map +1 -0
  126. package/dist/ai/melee/build.js +264 -0
  127. package/dist/ai/melee/build.js.map +1 -0
  128. package/dist/ai/melee/goals.d.ts +7 -0
  129. package/dist/ai/melee/goals.js +720 -0
  130. package/dist/ai/melee/goals.js.map +1 -0
  131. package/dist/ai/melee/heroes.js +68 -0
  132. package/dist/ai/melee/heroes.js.map +1 -0
  133. package/dist/ai/melee/index.d.ts +1 -1
  134. package/dist/ai/melee/index.js +51 -0
  135. package/dist/ai/melee/index.js.map +1 -0
  136. package/dist/ai/melee/production.js +29 -0
  137. package/dist/ai/melee/production.js.map +1 -0
  138. package/dist/ai/melee/surrender.js +64 -0
  139. package/dist/ai/melee/surrender.js.map +1 -0
  140. package/dist/ai/micro.d.ts +9 -0
  141. package/dist/ai/micro.js +1316 -0
  142. package/dist/ai/micro.js.map +1 -0
  143. package/dist/ai/mission.d.ts +9 -2
  144. package/dist/ai/mission.js +538 -0
  145. package/dist/ai/mission.js.map +1 -0
  146. package/dist/ai/missionRules.d.ts +1 -1
  147. package/dist/ai/missionRules.js +26 -0
  148. package/dist/ai/missionRules.js.map +1 -0
  149. package/dist/ai/module.d.ts +6 -2
  150. package/dist/ai/module.js +37 -0
  151. package/dist/ai/module.js.map +1 -0
  152. package/dist/ai/options.d.ts +3 -3
  153. package/dist/ai/plans/build.d.ts +20 -1
  154. package/dist/ai/plans/build.js +608 -0
  155. package/dist/ai/plans/build.js.map +1 -0
  156. package/dist/ai/plans/placement.d.ts +4 -1
  157. package/dist/ai/plans/placement.js +295 -0
  158. package/dist/ai/plans/placement.js.map +1 -0
  159. package/dist/ai/plans/plans.d.ts +9 -0
  160. package/dist/ai/plans/plans.js +110 -0
  161. package/dist/ai/plans/plans.js.map +1 -0
  162. package/dist/ai/plans/production.d.ts +14 -2
  163. package/dist/ai/plans/production.js +434 -0
  164. package/dist/ai/plans/production.js.map +1 -0
  165. package/dist/ai/plans/purse.d.ts +6 -3
  166. package/dist/ai/plans/purse.js +139 -0
  167. package/dist/ai/plans/purse.js.map +1 -0
  168. package/dist/ai/plans/tech.d.ts +6 -0
  169. package/dist/ai/plans/tech.js +122 -0
  170. package/dist/ai/plans/tech.js.map +1 -0
  171. package/dist/ai/profiles.d.ts +4 -4
  172. package/dist/{profiles-B3NS9jwk.js → ai/profiles.js} +3 -98
  173. package/dist/ai/profiles.js.map +1 -0
  174. package/dist/ai/reach.js +54 -0
  175. package/dist/ai/reach.js.map +1 -0
  176. package/dist/ai/report.d.ts +8 -0
  177. package/dist/ai/report.js +87 -0
  178. package/dist/ai/report.js.map +1 -0
  179. package/dist/ai/roles.d.ts +4 -0
  180. package/dist/ai/roles.js +207 -0
  181. package/dist/ai/roles.js.map +1 -0
  182. package/dist/ai/rules.d.ts +8 -2
  183. package/dist/ai/rules.js +416 -0
  184. package/dist/ai/rules.js.map +1 -0
  185. package/dist/ai/scouting.d.ts +6 -0
  186. package/dist/ai/scouting.js +324 -0
  187. package/dist/ai/scouting.js.map +1 -0
  188. package/dist/ai/settings.js +99 -0
  189. package/dist/ai/settings.js.map +1 -0
  190. package/dist/ai/squads.d.ts +21 -2
  191. package/dist/ai/squads.js +916 -0
  192. package/dist/ai/squads.js.map +1 -0
  193. package/dist/ai/strength.js +320 -0
  194. package/dist/ai/strength.js.map +1 -0
  195. package/dist/ai/task.d.ts +3 -1
  196. package/dist/ai/task.js +17 -0
  197. package/dist/ai/task.js.map +1 -0
  198. package/dist/ai/tasks/attack.js +24 -0
  199. package/dist/ai/tasks/attack.js.map +1 -0
  200. package/dist/ai/tasks/capture.d.ts +3 -3
  201. package/dist/ai/tasks/capture.js +37 -0
  202. package/dist/ai/tasks/capture.js.map +1 -0
  203. package/dist/ai/tasks/creep.js +29 -0
  204. package/dist/ai/tasks/creep.js.map +1 -0
  205. package/dist/ai/tasks/defend.js +61 -0
  206. package/dist/ai/tasks/defend.js.map +1 -0
  207. package/dist/ai/tasks/drop.js +81 -0
  208. package/dist/ai/tasks/drop.js.map +1 -0
  209. package/dist/ai/tasks/escort.js +59 -0
  210. package/dist/ai/tasks/escort.js.map +1 -0
  211. package/dist/ai/tasks/gather.js +48 -0
  212. package/dist/ai/tasks/gather.js.map +1 -0
  213. package/dist/ai/tasks/harass.js +39 -0
  214. package/dist/ai/tasks/harass.js.map +1 -0
  215. package/dist/ai/tasks/hold.js +32 -0
  216. package/dist/ai/tasks/hold.js.map +1 -0
  217. package/dist/ai/tasks/index.js +34 -0
  218. package/dist/ai/tasks/index.js.map +1 -0
  219. package/dist/ai/tasks/move.js +26 -0
  220. package/dist/ai/tasks/move.js.map +1 -0
  221. package/dist/ai/tasks/patrol.js +59 -0
  222. package/dist/ai/tasks/patrol.js.map +1 -0
  223. package/dist/ai/tasks/retreat.js +28 -0
  224. package/dist/ai/tasks/retreat.js.map +1 -0
  225. package/dist/ai/tasks/scout.js +73 -0
  226. package/dist/ai/tasks/scout.js.map +1 -0
  227. package/dist/ai/tasks/shared.d.ts +1 -1
  228. package/dist/ai/tasks/shared.js +137 -0
  229. package/dist/ai/tasks/shared.js.map +1 -0
  230. package/dist/ai/team.d.ts +18 -1
  231. package/dist/ai/team.js +492 -0
  232. package/dist/ai/team.js.map +1 -0
  233. package/dist/ai/threat.d.ts +6 -0
  234. package/dist/ai/threat.js +206 -0
  235. package/dist/ai/threat.js.map +1 -0
  236. package/dist/ai/view.d.ts +21 -7
  237. package/dist/ai/view.js +677 -0
  238. package/dist/ai/view.js.map +1 -0
  239. package/dist/ai/waves.d.ts +6 -0
  240. package/dist/ai/waves.js +410 -0
  241. package/dist/ai/waves.js.map +1 -0
  242. package/dist/ai.js +54 -6239
  243. package/dist/aiTesting.d.ts +6 -3
  244. package/dist/aiTesting.js +229 -0
  245. package/dist/aiTesting.js.map +1 -0
  246. package/dist/areas.d.ts +4 -1
  247. package/dist/areas.js +295 -0
  248. package/dist/areas.js.map +1 -0
  249. package/dist/attacks.d.ts +3 -3
  250. package/dist/attacks.js +127 -0
  251. package/dist/attacks.js.map +1 -0
  252. package/dist/burning.d.ts +267 -0
  253. package/dist/burning.js +795 -0
  254. package/dist/burning.js.map +1 -0
  255. package/dist/bytes.js +21 -0
  256. package/dist/bytes.js.map +1 -0
  257. package/dist/callings.d.ts +71 -0
  258. package/dist/callings.js +157 -0
  259. package/dist/callings.js.map +1 -0
  260. package/dist/cameraOrders.d.ts +78 -0
  261. package/dist/cameraOrders.js +114 -0
  262. package/dist/cameraOrders.js.map +1 -0
  263. package/dist/camps.d.ts +70 -4
  264. package/dist/camps.js +501 -0
  265. package/dist/camps.js.map +1 -0
  266. package/dist/capture.d.ts +15 -3
  267. package/dist/capture.js +304 -0
  268. package/dist/capture.js.map +1 -0
  269. package/dist/cellLayers.d.ts +78 -13
  270. package/dist/cellLayers.js +275 -0
  271. package/dist/cellLayers.js.map +1 -0
  272. package/dist/cellPatches.d.ts +24 -0
  273. package/dist/cellPatches.js +73 -0
  274. package/dist/cellPatches.js.map +1 -0
  275. package/dist/cinematics.d.ts +10 -5
  276. package/dist/cinematics.js +161 -0
  277. package/dist/cinematics.js.map +1 -0
  278. package/dist/clock.d.ts +2 -2
  279. package/dist/clock.js +78 -0
  280. package/dist/clock.js.map +1 -0
  281. package/dist/commands.d.ts +36 -4
  282. package/dist/commands.js +636 -0
  283. package/dist/commands.js.map +1 -0
  284. package/dist/components.d.ts +31 -10
  285. package/dist/components.js +74 -0
  286. package/dist/components.js.map +1 -0
  287. package/dist/computers.d.ts +4 -4
  288. package/dist/computers.js +194 -0
  289. package/dist/computers.js.map +1 -0
  290. package/dist/concealment.d.ts +25 -2
  291. package/dist/concealment.js +409 -0
  292. package/dist/concealment.js.map +1 -0
  293. package/dist/coreComponents.js +130 -0
  294. package/dist/coreComponents.js.map +1 -0
  295. package/dist/createGame.d.ts +306 -0
  296. package/dist/createGame.js +405 -0
  297. package/dist/createGame.js.map +1 -0
  298. package/dist/dashing.d.ts +18 -2
  299. package/dist/dashing.js +41 -0
  300. package/dist/dashing.js.map +1 -0
  301. package/dist/debug.d.ts +8 -0
  302. package/dist/debug.js +5 -3
  303. package/dist/debug2.js +76 -0
  304. package/dist/debug2.js.map +1 -0
  305. package/dist/debugCommands.d.ts +6 -6
  306. package/dist/debugCommands.js +537 -0
  307. package/dist/debugCommands.js.map +1 -0
  308. package/dist/debugging.d.ts +1 -0
  309. package/dist/defaultSets.d.ts +183 -0
  310. package/dist/defaultSets.js +216 -0
  311. package/dist/defaultSets.js.map +1 -0
  312. package/dist/definitions.d.ts +6 -0
  313. package/dist/definitions.js +78 -0
  314. package/dist/definitions.js.map +1 -0
  315. package/dist/defs.d.ts +1895 -165
  316. package/dist/defs.js +380 -0
  317. package/dist/defs.js.map +1 -0
  318. package/dist/denying.d.ts +4 -4
  319. package/dist/denying.js +106 -0
  320. package/dist/denying.js.map +1 -0
  321. package/dist/destructibles.d.ts +2 -2
  322. package/dist/destructibles.js +36 -0
  323. package/dist/destructibles.js.map +1 -0
  324. package/dist/determinism.d.ts +4 -4
  325. package/dist/determinism.js +247 -0
  326. package/dist/determinism.js.map +1 -0
  327. package/dist/dialog.d.ts +17 -2
  328. package/dist/dialog.js +108 -0
  329. package/dist/dialog.js.map +1 -0
  330. package/dist/effectRefs.js +28 -0
  331. package/dist/effectRefs.js.map +1 -0
  332. package/dist/effects.d.ts +27 -11
  333. package/dist/effects.js +110 -0
  334. package/dist/effects.js.map +1 -0
  335. package/dist/endings.d.ts +1 -1
  336. package/dist/endings.js +78 -0
  337. package/dist/endings.js.map +1 -0
  338. package/dist/engagement.d.ts +40 -6
  339. package/dist/engagement.js +530 -0
  340. package/dist/engagement.js.map +1 -0
  341. package/dist/engineEvents.d.ts +72 -9
  342. package/dist/engineEvents.js +520 -0
  343. package/dist/engineEvents.js.map +1 -0
  344. package/dist/entity.d.ts +275 -26
  345. package/dist/entity.js +441 -0
  346. package/dist/entity.js.map +1 -0
  347. package/dist/entityIndex.d.ts +10 -3
  348. package/dist/entityIndex.js +149 -0
  349. package/dist/entityIndex.js.map +1 -0
  350. package/dist/errors.d.ts +6 -2
  351. package/dist/errors.js +59 -0
  352. package/dist/errors.js.map +1 -0
  353. package/dist/events.d.ts +11 -5
  354. package/dist/events.js +158 -0
  355. package/dist/events.js.map +1 -0
  356. package/dist/exactMath.js +273 -0
  357. package/dist/exactMath.js.map +1 -0
  358. package/dist/features.d.ts +1 -1
  359. package/dist/features.js +127 -0
  360. package/dist/features.js.map +1 -0
  361. package/dist/fields.d.ts +25 -5
  362. package/dist/fields.js +140 -0
  363. package/dist/fields.js.map +1 -0
  364. package/dist/fixture.d.ts +3 -3
  365. package/dist/fixture.js +512 -0
  366. package/dist/fixture.js.map +1 -0
  367. package/dist/fog.d.ts +26 -3
  368. package/dist/fog.js +333 -0
  369. package/dist/fog.js.map +1 -0
  370. package/dist/foliage.d.ts +476 -0
  371. package/dist/foliage.js +1478 -0
  372. package/dist/foliage.js.map +1 -0
  373. package/dist/foliageDebug.d.ts +57 -0
  374. package/dist/foliageDebug.js +172 -0
  375. package/dist/foliageDebug.js.map +1 -0
  376. package/dist/foliageRegrowth.d.ts +20 -0
  377. package/dist/foliageRegrowth.js +332 -0
  378. package/dist/foliageRegrowth.js.map +1 -0
  379. package/dist/formState.d.ts +67 -0
  380. package/dist/formState.js +65 -0
  381. package/dist/formState.js.map +1 -0
  382. package/dist/formation.d.ts +46 -8
  383. package/dist/formation.js +297 -0
  384. package/dist/formation.js.map +1 -0
  385. package/dist/forms.d.ts +58 -0
  386. package/dist/forms.js +146 -0
  387. package/dist/forms.js.map +1 -0
  388. package/dist/friendlyFire.d.ts +2 -2
  389. package/dist/friendlyFire.js +37 -0
  390. package/dist/friendlyFire.js.map +1 -0
  391. package/dist/game.d.ts +141 -48
  392. package/dist/game.js +834 -0
  393. package/dist/game.js.map +1 -0
  394. package/dist/gameData.d.ts +96 -22
  395. package/dist/gameData.js +1690 -0
  396. package/dist/gameData.js.map +1 -0
  397. package/dist/gameFiles.d.ts +3 -3
  398. package/dist/gameFiles.js +14 -0
  399. package/dist/gameFiles.js.map +1 -0
  400. package/dist/gates.js +92 -0
  401. package/dist/gates.js.map +1 -0
  402. package/dist/generate.d.ts +28 -1
  403. package/dist/generate.js +1062 -0
  404. package/dist/generate.js.map +1 -0
  405. package/dist/generateWorker.d.ts +7 -3
  406. package/dist/generateWorker.js +86 -0
  407. package/dist/generateWorker.js.map +1 -0
  408. package/dist/grid.d.ts +9 -0
  409. package/dist/grid.js +102 -0
  410. package/dist/grid.js.map +1 -0
  411. package/dist/ground.d.ts +17 -1
  412. package/dist/ground.js +375 -0
  413. package/dist/ground.js.map +1 -0
  414. package/dist/groundObjects.d.ts +70 -0
  415. package/dist/groundObjects.js +371 -0
  416. package/dist/groundObjects.js.map +1 -0
  417. package/dist/groundSpeed.d.ts +20 -3
  418. package/dist/groundSpeed.js +117 -0
  419. package/dist/groundSpeed.js.map +1 -0
  420. package/dist/hero.d.ts +126 -10
  421. package/dist/hero.js +432 -0
  422. package/dist/hero.js.map +1 -0
  423. package/dist/holds.d.ts +94 -0
  424. package/dist/holds.js +305 -0
  425. package/dist/holds.js.map +1 -0
  426. package/dist/home.d.ts +1 -1
  427. package/dist/home.js +30 -0
  428. package/dist/home.js.map +1 -0
  429. package/dist/hooks.d.ts +339 -57
  430. package/dist/hooks.js +105 -0
  431. package/dist/hooks.js.map +1 -0
  432. package/dist/hotReload.d.ts +6 -5
  433. package/dist/hotReload.js +145 -0
  434. package/dist/hotReload.js.map +1 -0
  435. package/dist/ids.d.ts +3 -3
  436. package/dist/ids.js +30 -0
  437. package/dist/ids.js.map +1 -0
  438. package/dist/idsFile.d.ts +36 -0
  439. package/dist/idsFile.js +134 -0
  440. package/dist/idsFile.js.map +1 -0
  441. package/dist/index.d.ts +105 -68
  442. package/dist/index.js +194 -4701
  443. package/dist/inspect.d.ts +29 -2
  444. package/dist/{inspect-D9dWHmZ0.js → inspect.js} +21 -12
  445. package/dist/inspect.js.map +1 -0
  446. package/dist/inventory.d.ts +14 -1
  447. package/dist/inventory.js +84 -0
  448. package/dist/inventory.js.map +1 -0
  449. package/dist/items.d.ts +136 -8
  450. package/dist/items.js +585 -0
  451. package/dist/items.js.map +1 -0
  452. package/dist/lanes.d.ts +12 -3
  453. package/dist/lanes.js +496 -0
  454. package/dist/lanes.js.map +1 -0
  455. package/dist/life.d.ts +6 -2
  456. package/dist/life.js +287 -0
  457. package/dist/life.js.map +1 -0
  458. package/dist/log.d.ts +26 -3
  459. package/dist/log.js +192 -0
  460. package/dist/log.js.map +1 -0
  461. package/dist/manaBurn.d.ts +2 -2
  462. package/dist/manaBurn.js +75 -0
  463. package/dist/manaBurn.js.map +1 -0
  464. package/dist/map/file.d.ts +56 -3
  465. package/dist/map/file.js +264 -0
  466. package/dist/map/file.js.map +1 -0
  467. package/dist/map/images.js +61 -0
  468. package/dist/map/images.js.map +1 -0
  469. package/dist/map/look.d.ts +1 -1
  470. package/dist/map/look.js +30 -0
  471. package/dist/map/look.js.map +1 -0
  472. package/dist/map/pathProfile.js +183 -0
  473. package/dist/map/pathProfile.js.map +1 -0
  474. package/dist/map/resize.d.ts +4 -0
  475. package/dist/map/resize.js +136 -0
  476. package/dist/map/resize.js.map +1 -0
  477. package/dist/map/schema.js +257 -0
  478. package/dist/map/schema.js.map +1 -0
  479. package/dist/map/terrain.js +214 -0
  480. package/dist/map/terrain.js.map +1 -0
  481. package/dist/map/types.d.ts +92 -13
  482. package/dist/map/types.js +251 -0
  483. package/dist/map/types.js.map +1 -0
  484. package/dist/mapCheck/cells.js +94 -0
  485. package/dist/mapCheck/cells.js.map +1 -0
  486. package/dist/mapCheck/rules/foliage.d.ts +9 -0
  487. package/dist/mapCheck/rules/foliage.js +83 -0
  488. package/dist/mapCheck/rules/foliage.js.map +1 -0
  489. package/dist/mapCheck/rules/names.js +39 -0
  490. package/dist/mapCheck/rules/names.js.map +1 -0
  491. package/dist/mapCheck/rules/objects.d.ts +1 -1
  492. package/dist/mapCheck/rules/objects.js +56 -0
  493. package/dist/mapCheck/rules/objects.js.map +1 -0
  494. package/dist/mapCheck/rules/paths.js +32 -0
  495. package/dist/mapCheck/rules/paths.js.map +1 -0
  496. package/dist/mapCheck/rules/players.js +20 -0
  497. package/dist/mapCheck/rules/players.js.map +1 -0
  498. package/dist/mapCheck/rules/races.js +56 -0
  499. package/dist/mapCheck/rules/races.js.map +1 -0
  500. package/dist/mapCheck/rules/random.js +47 -0
  501. package/dist/mapCheck/rules/random.js.map +1 -0
  502. package/dist/mapCheck/rules/regions.js +30 -0
  503. package/dist/mapCheck/rules/regions.js.map +1 -0
  504. package/dist/mapCheck/rules/targets.js +31 -0
  505. package/dist/mapCheck/rules/targets.js.map +1 -0
  506. package/dist/mapCheck/rules/walking.js +45 -0
  507. package/dist/mapCheck/rules/walking.js.map +1 -0
  508. package/dist/mapCheck.d.ts +2 -2
  509. package/dist/mapCheck.js +63 -0
  510. package/dist/mapCheck.js.map +1 -0
  511. package/dist/mapFields.d.ts +25 -2
  512. package/dist/mapFields.js +134 -0
  513. package/dist/mapFields.js.map +1 -0
  514. package/dist/mapFile.js +176 -0
  515. package/dist/mapFile.js.map +1 -0
  516. package/dist/mapMeasure.d.ts +8 -0
  517. package/dist/mapMeasure.js +283 -0
  518. package/dist/mapMeasure.js.map +1 -0
  519. package/dist/mapMerge.d.ts +1 -0
  520. package/dist/mapMerge.js +172 -0
  521. package/dist/mapMerge.js.map +1 -0
  522. package/dist/mapObjectives.js +138 -0
  523. package/dist/mapObjectives.js.map +1 -0
  524. package/dist/mapObjects.js +80 -0
  525. package/dist/mapObjects.js.map +1 -0
  526. package/dist/math.d.ts +37 -7
  527. package/dist/math.js +155 -0
  528. package/dist/math.js.map +1 -0
  529. package/dist/messages.d.ts +71 -4
  530. package/dist/messages.js +29 -0
  531. package/dist/messages.js.map +1 -0
  532. package/dist/missionRules.d.ts +10 -2
  533. package/dist/{missionRules-C-bGxm0Q.js → missionRules.js} +30 -150
  534. package/dist/missionRules.js.map +1 -0
  535. package/dist/mods.d.ts +39 -20
  536. package/dist/mods.js +271 -0
  537. package/dist/mods.js.map +1 -0
  538. package/dist/moves.d.ts +87 -0
  539. package/dist/moves.js +539 -0
  540. package/dist/moves.js.map +1 -0
  541. package/dist/names.d.ts +7 -0
  542. package/dist/names.js +122 -0
  543. package/dist/names.js.map +1 -0
  544. package/dist/navigation/agentParams.js +14 -0
  545. package/dist/navigation/agentParams.js.map +1 -0
  546. package/dist/navigation/air.d.ts +7 -3
  547. package/dist/navigation/air.js +401 -0
  548. package/dist/navigation/air.js.map +1 -0
  549. package/dist/navigation/builds.d.ts +34 -2
  550. package/dist/navigation/builds.js +287 -0
  551. package/dist/navigation/builds.js.map +1 -0
  552. package/dist/navigation/groundAreas.d.ts +59 -1
  553. package/dist/navigation/groundAreas.js +407 -0
  554. package/dist/navigation/groundAreas.js.map +1 -0
  555. package/dist/navigation/navigation.d.ts +98 -9
  556. package/dist/navigation/recast.d.ts +194 -18
  557. package/dist/navigation/recast.js +1379 -0
  558. package/dist/navigation/recast.js.map +1 -0
  559. package/dist/navigation/sidePaths.d.ts +8 -3
  560. package/dist/navigation/sidePaths.js +241 -0
  561. package/dist/navigation/sidePaths.js.map +1 -0
  562. package/dist/navigation/sized.js +243 -0
  563. package/dist/navigation/sized.js.map +1 -0
  564. package/dist/nearest.js +32 -0
  565. package/dist/nearest.js.map +1 -0
  566. package/dist/noise.js +59 -0
  567. package/dist/noise.js.map +1 -0
  568. package/dist/objectives.d.ts +12 -3
  569. package/dist/objectives.js +144 -0
  570. package/dist/objectives.js.map +1 -0
  571. package/dist/orders/basic.d.ts +5 -5
  572. package/dist/orders/basic.js +417 -0
  573. package/dist/orders/basic.js.map +1 -0
  574. package/dist/orders/build.js +278 -0
  575. package/dist/orders/build.js.map +1 -0
  576. package/dist/orders/cast.d.ts +13 -3
  577. package/dist/orders/cast.js +558 -0
  578. package/dist/orders/cast.js.map +1 -0
  579. package/dist/orders/facts.js +16 -0
  580. package/dist/orders/facts.js.map +1 -0
  581. package/dist/orders/harvest.d.ts +21 -5
  582. package/dist/orders/harvest.js +540 -0
  583. package/dist/orders/harvest.js.map +1 -0
  584. package/dist/orders/idle.d.ts +3 -1
  585. package/dist/orders/idle.js +234 -0
  586. package/dist/orders/idle.js.map +1 -0
  587. package/dist/orders/items.js +92 -0
  588. package/dist/orders/items.js.map +1 -0
  589. package/dist/orders/queue.js +108 -0
  590. package/dist/orders/queue.js.map +1 -0
  591. package/dist/orders/waiting.d.ts +39 -0
  592. package/dist/orders/waiting.js +149 -0
  593. package/dist/orders/waiting.js.map +1 -0
  594. package/dist/pack.schema.js +13 -0
  595. package/dist/pack.schema.js.map +1 -0
  596. package/dist/pack.schema.json +7622 -841
  597. package/dist/packs/director/index.d.ts +13 -5
  598. package/dist/packs/director/index.js +204 -0
  599. package/dist/packs/director/index.js.map +1 -0
  600. package/dist/packs/heroes/campaign.d.ts +3 -2
  601. package/dist/packs/heroes/campaign.js +241 -0
  602. package/dist/packs/heroes/campaign.js.map +1 -0
  603. package/dist/packs/heroes/carry.d.ts +6 -0
  604. package/dist/packs/heroes/carry.js +112 -0
  605. package/dist/packs/heroes/carry.js.map +1 -0
  606. package/dist/packs/heroes/commands.js +115 -0
  607. package/dist/packs/heroes/commands.js.map +1 -0
  608. package/dist/packs/heroes/fallen.d.ts +43 -0
  609. package/dist/packs/heroes/fallen.js +61 -0
  610. package/dist/packs/heroes/fallen.js.map +1 -0
  611. package/dist/packs/heroes/hire.js +60 -0
  612. package/dist/packs/heroes/hire.js.map +1 -0
  613. package/dist/packs/heroes/index.d.ts +7 -6
  614. package/dist/packs/heroes/index.js +130 -0
  615. package/dist/packs/heroes/index.js.map +1 -0
  616. package/dist/packs/heroes/loop.d.ts +95 -0
  617. package/dist/packs/heroes/loop.js +250 -0
  618. package/dist/packs/heroes/loop.js.map +1 -0
  619. package/dist/packs/heroes/making.d.ts +6 -3
  620. package/dist/packs/heroes/making.js +55 -0
  621. package/dist/packs/heroes/making.js.map +1 -0
  622. package/dist/packs/heroes/respawn.d.ts +3 -3
  623. package/dist/packs/heroes/respawn.js +87 -0
  624. package/dist/packs/heroes/respawn.js.map +1 -0
  625. package/dist/packs/heroes/sets.d.ts +32 -0
  626. package/dist/packs/heroes/sets.js +51 -0
  627. package/dist/packs/heroes/sets.js.map +1 -0
  628. package/dist/packs/heroes/spells.d.ts +16 -0
  629. package/dist/packs/heroes/spells.js +269 -0
  630. package/dist/packs/heroes/spells.js.map +1 -0
  631. package/dist/packs/items/defaults.d.ts +43 -0
  632. package/dist/packs/items/defaults.js +1504 -0
  633. package/dist/packs/items/defaults.js.map +1 -0
  634. package/dist/packs/items/index.d.ts +27 -0
  635. package/dist/packs/items/index.js +214 -0
  636. package/dist/packs/items/index.js.map +1 -0
  637. package/dist/packs/moba/index.d.ts +3 -3
  638. package/dist/packs/moba/index.js +174 -0
  639. package/dist/packs/moba/index.js.map +1 -0
  640. package/dist/packs/pack.d.ts +15 -15
  641. package/dist/packs/pack.js +14 -0
  642. package/dist/packs/pack.js.map +1 -0
  643. package/dist/packs.d.ts +15 -7
  644. package/dist/packs.js +222 -0
  645. package/dist/packs.js.map +1 -0
  646. package/dist/paths.d.ts +2 -0
  647. package/dist/paths.js +109 -0
  648. package/dist/paths.js.map +1 -0
  649. package/dist/plain.js +57 -0
  650. package/dist/plain.js.map +1 -0
  651. package/dist/player.d.ts +33 -10
  652. package/dist/player.js +159 -0
  653. package/dist/player.js.map +1 -0
  654. package/dist/portals.d.ts +1 -1
  655. package/dist/portals.js +194 -0
  656. package/dist/portals.js.map +1 -0
  657. package/dist/prefabs.d.ts +25 -2
  658. package/dist/prefabs.js +239 -0
  659. package/dist/prefabs.js.map +1 -0
  660. package/dist/presetBuildings.js +58 -0
  661. package/dist/presetBuildings.js.map +1 -0
  662. package/dist/presetFoliage.d.ts +27 -0
  663. package/dist/presetFoliage.js +98 -0
  664. package/dist/presetFoliage.js.map +1 -0
  665. package/dist/presetGround.js +65 -0
  666. package/dist/presetGround.js.map +1 -0
  667. package/dist/proxies.d.ts +12 -0
  668. package/dist/proxies.js +79 -0
  669. package/dist/proxies.js.map +1 -0
  670. package/dist/query.d.ts +56 -0
  671. package/dist/query.js +88 -0
  672. package/dist/query.js.map +1 -0
  673. package/dist/races.d.ts +15 -14
  674. package/dist/races.js +172 -0
  675. package/dist/races.js.map +1 -0
  676. package/dist/randomGroups.js +91 -0
  677. package/dist/randomGroups.js.map +1 -0
  678. package/dist/registry.d.ts +117 -53
  679. package/dist/registry.js +323 -0
  680. package/dist/registry.js.map +1 -0
  681. package/dist/remains.d.ts +11 -9
  682. package/dist/remains.js +188 -0
  683. package/dist/remains.js.map +1 -0
  684. package/dist/replication.d.ts +12 -7
  685. package/dist/replication.js +100 -0
  686. package/dist/replication.js.map +1 -0
  687. package/dist/rng.d.ts +2 -0
  688. package/dist/rng.js +40 -0
  689. package/dist/rng.js.map +1 -0
  690. package/dist/rules.d.ts +186 -99
  691. package/dist/rules.js +179 -0
  692. package/dist/rules.js.map +1 -0
  693. package/dist/rulesCheck.d.ts +5 -4
  694. package/dist/rulesCheck.js +693 -0
  695. package/dist/rulesCheck.js.map +1 -0
  696. package/dist/runes.d.ts +2 -2
  697. package/dist/runes.js +80 -0
  698. package/dist/runes.js.map +1 -0
  699. package/dist/save.d.ts +37 -12
  700. package/dist/save.js +532 -0
  701. package/dist/save.js.map +1 -0
  702. package/dist/scenario.d.ts +2 -2
  703. package/dist/scenario.js +99 -0
  704. package/dist/scenario.js.map +1 -0
  705. package/dist/scheduler.d.ts +3 -0
  706. package/dist/scheduler.js +156 -0
  707. package/dist/scheduler.js.map +1 -0
  708. package/dist/score.d.ts +19 -19
  709. package/dist/score.js +709 -0
  710. package/dist/score.js.map +1 -0
  711. package/dist/sequences.d.ts +10 -6
  712. package/dist/sequences.js +206 -0
  713. package/dist/sequences.js.map +1 -0
  714. package/dist/server/doorman.js +154 -0
  715. package/dist/server/doorman.js.map +1 -0
  716. package/dist/server/gameServer.d.ts +16 -1
  717. package/dist/server/gameServer.js +643 -0
  718. package/dist/server/gameServer.js.map +1 -0
  719. package/dist/server/index.d.ts +1 -1
  720. package/dist/server/lobby.js +199 -0
  721. package/dist/server/lobby.js.map +1 -0
  722. package/dist/server/log.js +18 -0
  723. package/dist/server/log.js.map +1 -0
  724. package/dist/server/match.js +267 -0
  725. package/dist/server/match.js.map +1 -0
  726. package/dist/server/mode.d.ts +18 -9
  727. package/dist/server/mode.js +220 -0
  728. package/dist/server/mode.js.map +1 -0
  729. package/dist/{navigation-worker.js → server/navigation-worker.js} +1 -1
  730. package/dist/server/navigation-worker.js.map +1 -0
  731. package/dist/server/navigation.js +39 -0
  732. package/dist/server/navigation.js.map +1 -0
  733. package/dist/server/ops.d.ts +4 -0
  734. package/dist/server/ops.js +137 -0
  735. package/dist/server/ops.js.map +1 -0
  736. package/dist/server/packs.d.ts +3 -3
  737. package/dist/server/packs.js +32 -0
  738. package/dist/server/packs.js.map +1 -0
  739. package/dist/server/ratings.d.ts +5 -0
  740. package/dist/server/ratings.js +104 -0
  741. package/dist/server/ratings.js.map +1 -0
  742. package/dist/server/relay.d.ts +12 -2
  743. package/dist/server/relay.js +144 -0
  744. package/dist/server/relay.js.map +1 -0
  745. package/dist/server/rooms.d.ts +9 -2
  746. package/dist/server/rooms.js +442 -0
  747. package/dist/server/rooms.js.map +1 -0
  748. package/dist/server/seat.js +116 -0
  749. package/dist/server/seat.js.map +1 -0
  750. package/dist/server/seatSettings.d.ts +3 -3
  751. package/dist/server/seatSettings.js +63 -0
  752. package/dist/server/seatSettings.js.map +1 -0
  753. package/dist/server/secret.js +13 -0
  754. package/dist/server/secret.js.map +1 -0
  755. package/dist/server/start.d.ts +13 -6
  756. package/dist/server/start.js +76 -0
  757. package/dist/server/start.js.map +1 -0
  758. package/dist/server/websocket.d.ts +9 -1
  759. package/dist/server/websocket.js +306 -0
  760. package/dist/server/websocket.js.map +1 -0
  761. package/dist/server.js +15 -2861
  762. package/dist/session/can.js +26 -0
  763. package/dist/session/can.js.map +1 -0
  764. package/dist/session/commandReplay.d.ts +8 -2
  765. package/dist/session/commandReplay.js +293 -0
  766. package/dist/session/commandReplay.js.map +1 -0
  767. package/dist/session/debug.js +151 -0
  768. package/dist/session/debug.js.map +1 -0
  769. package/dist/session/delay.js +62 -0
  770. package/dist/session/delay.js.map +1 -0
  771. package/dist/session/delta.d.ts +14 -1
  772. package/dist/session/delta.js +407 -0
  773. package/dist/session/delta.js.map +1 -0
  774. package/dist/session/entityState.js +415 -0
  775. package/dist/session/entityState.js.map +1 -0
  776. package/dist/session/local.d.ts +47 -5
  777. package/dist/session/local.js +670 -0
  778. package/dist/session/local.js.map +1 -0
  779. package/dist/session/memory.d.ts +20 -2
  780. package/dist/session/memory.js +131 -0
  781. package/dist/session/memory.js.map +1 -0
  782. package/dist/session/protocol.d.ts +325 -31
  783. package/dist/session/protocol.js +55 -0
  784. package/dist/session/protocol.js.map +1 -0
  785. package/dist/session/remote.d.ts +74 -12
  786. package/dist/session/remote.js +1394 -0
  787. package/dist/session/remote.js.map +1 -0
  788. package/dist/session/replay.d.ts +11 -2
  789. package/dist/session/replay.js +160 -0
  790. package/dist/session/replay.js.map +1 -0
  791. package/dist/session/seed.js +12 -0
  792. package/dist/session/seed.js.map +1 -0
  793. package/dist/session/share.d.ts +5 -1
  794. package/dist/session/share.js +94 -0
  795. package/dist/session/share.js.map +1 -0
  796. package/dist/session/socket.d.ts +1 -1
  797. package/dist/session/socket.js +29 -0
  798. package/dist/session/socket.js.map +1 -0
  799. package/dist/session/wire.d.ts +5 -0
  800. package/dist/session/wire.js +84 -0
  801. package/dist/session/wire.js.map +1 -0
  802. package/dist/session/worker.d.ts +77 -12
  803. package/dist/session/worker.js +499 -0
  804. package/dist/session/worker.js.map +1 -0
  805. package/dist/shared.d.ts +31 -5
  806. package/dist/shared.js +166 -0
  807. package/dist/shared.js.map +1 -0
  808. package/dist/sides.d.ts +9 -3
  809. package/dist/sides.js +149 -0
  810. package/dist/sides.js.map +1 -0
  811. package/dist/sight.js +85 -0
  812. package/dist/sight.js.map +1 -0
  813. package/dist/simulate-worker.js +1 -1
  814. package/dist/simulate.d.ts +12 -8
  815. package/dist/{simulate-oXBiw1Ff.js → simulate.js} +10 -11
  816. package/dist/simulate.js.map +1 -0
  817. package/dist/smart.js +77 -0
  818. package/dist/smart.js.map +1 -0
  819. package/dist/spatial.d.ts +32 -16
  820. package/dist/spatial.js +234 -0
  821. package/dist/spatial.js.map +1 -0
  822. package/dist/spawning.d.ts +1 -0
  823. package/dist/spawning.js +224 -0
  824. package/dist/spawning.js.map +1 -0
  825. package/dist/stances.d.ts +6 -3
  826. package/dist/stances.js +169 -0
  827. package/dist/stances.js.map +1 -0
  828. package/dist/start.d.ts +10 -10
  829. package/dist/start.js +75 -0
  830. package/dist/start.js.map +1 -0
  831. package/dist/stats.d.ts +42 -16
  832. package/dist/stats.js +290 -0
  833. package/dist/stats.js.map +1 -0
  834. package/dist/summoned.d.ts +52 -0
  835. package/dist/summoned.js +38 -0
  836. package/dist/summoned.js.map +1 -0
  837. package/dist/summons.d.ts +10 -13
  838. package/dist/summons.js +271 -0
  839. package/dist/summons.js.map +1 -0
  840. package/dist/systems/abilities.js +224 -0
  841. package/dist/systems/abilities.js.map +1 -0
  842. package/dist/systems/combat.d.ts +35 -1
  843. package/dist/systems/combat.js +677 -0
  844. package/dist/systems/combat.js.map +1 -0
  845. package/dist/systems/combatTold.d.ts +3 -1
  846. package/dist/systems/combatTold.js +85 -0
  847. package/dist/systems/combatTold.js.map +1 -0
  848. package/dist/systems/construction.js +80 -0
  849. package/dist/systems/construction.js.map +1 -0
  850. package/dist/systems/economy.d.ts +0 -6
  851. package/dist/systems/economy.js +128 -0
  852. package/dist/systems/economy.js.map +1 -0
  853. package/dist/systems/fog.d.ts +1 -1
  854. package/dist/systems/fog.js +120 -0
  855. package/dist/systems/fog.js.map +1 -0
  856. package/dist/systems/life.js +32 -0
  857. package/dist/systems/life.js.map +1 -0
  858. package/dist/systems/movement.d.ts +24 -12
  859. package/dist/systems/movement.js +1247 -0
  860. package/dist/systems/movement.js.map +1 -0
  861. package/dist/systems/orders.js +64 -0
  862. package/dist/systems/orders.js.map +1 -0
  863. package/dist/systems/production.js +322 -0
  864. package/dist/systems/production.js.map +1 -0
  865. package/dist/systems/productionQueue.js +120 -0
  866. package/dist/systems/productionQueue.js.map +1 -0
  867. package/dist/systems/victory.d.ts +1 -1
  868. package/dist/systems/victory.js +56 -0
  869. package/dist/systems/victory.js.map +1 -0
  870. package/dist/talk.d.ts +6 -6
  871. package/dist/talk.js +153 -0
  872. package/dist/talk.js.map +1 -0
  873. package/dist/targeting.d.ts +142 -0
  874. package/dist/targeting.js +49 -0
  875. package/dist/targeting.js.map +1 -0
  876. package/dist/tech.d.ts +20 -3
  877. package/dist/tech.js +239 -0
  878. package/dist/tech.js.map +1 -0
  879. package/dist/techTree.d.ts +7 -0
  880. package/dist/techTree.js +90 -0
  881. package/dist/techTree.js.map +1 -0
  882. package/dist/terrain.d.ts +59 -7
  883. package/dist/terrain.js +389 -0
  884. package/dist/terrain.js.map +1 -0
  885. package/dist/terrainSave.d.ts +6 -0
  886. package/dist/terrainSave.js +74 -0
  887. package/dist/terrainSave.js.map +1 -0
  888. package/dist/testing.d.ts +8 -7
  889. package/dist/testing.js +13 -739
  890. package/dist/testing.js.map +1 -1
  891. package/dist/tiles.d.ts +1 -1
  892. package/dist/tiles.js +43 -0
  893. package/dist/tiles.js.map +1 -0
  894. package/dist/timers.d.ts +29 -4
  895. package/dist/timers.js +242 -0
  896. package/dist/timers.js.map +1 -0
  897. package/dist/tomes.d.ts +4 -4
  898. package/dist/tomes.js +94 -0
  899. package/dist/tomes.js.map +1 -0
  900. package/dist/trade.js +103 -0
  901. package/dist/trade.js.map +1 -0
  902. package/dist/transport.d.ts +6 -1
  903. package/dist/transport.js +281 -0
  904. package/dist/transport.js.map +1 -0
  905. package/dist/tunables.d.ts +10 -3
  906. package/dist/tunables.js +56 -0
  907. package/dist/tunables.js.map +1 -0
  908. package/dist/unitResources.d.ts +67 -0
  909. package/dist/unitResources.js +266 -0
  910. package/dist/unitResources.js.map +1 -0
  911. package/dist/upkeep.d.ts +6 -1
  912. package/dist/upkeep.js +26 -0
  913. package/dist/upkeep.js.map +1 -0
  914. package/dist/veterancy.d.ts +8 -3
  915. package/dist/veterancy.js +131 -0
  916. package/dist/veterancy.js.map +1 -0
  917. package/dist/vision.d.ts +36 -0
  918. package/dist/vision.js +133 -0
  919. package/dist/vision.js.map +1 -0
  920. package/dist/walls.d.ts +1 -1
  921. package/dist/walls.js +278 -0
  922. package/dist/walls.js.map +1 -0
  923. package/dist/world.d.ts +606 -88
  924. package/dist/world.js +1263 -0
  925. package/dist/world.js.map +1 -0
  926. package/package.json +2 -2
  927. package/dist/ai.js.map +0 -1
  928. package/dist/attributes.d.ts +0 -66
  929. package/dist/brain-BvVdUhX8.js +0 -7659
  930. package/dist/brain-BvVdUhX8.js.map +0 -1
  931. package/dist/builds-C6LfgvEU.js +0 -460
  932. package/dist/builds-C6LfgvEU.js.map +0 -1
  933. package/dist/coreComponents-syuh2fPG.js +0 -5149
  934. package/dist/coreComponents-syuh2fPG.js.map +0 -1
  935. package/dist/debugCommands-CzjrSm66.js +0 -14739
  936. package/dist/debugCommands-CzjrSm66.js.map +0 -1
  937. package/dist/determinism-BCymQwiE.js +0 -518
  938. package/dist/determinism-BCymQwiE.js.map +0 -1
  939. package/dist/game-DiJEN-Ks.js +0 -5800
  940. package/dist/game-DiJEN-Ks.js.map +0 -1
  941. package/dist/index.js.map +0 -1
  942. package/dist/inspect-D9dWHmZ0.js.map +0 -1
  943. package/dist/local-Dkovq42k.js +0 -1379
  944. package/dist/local-Dkovq42k.js.map +0 -1
  945. package/dist/missionRules-C-bGxm0Q.js.map +0 -1
  946. package/dist/navigation-worker.js.map +0 -1
  947. package/dist/packs-g5thvmGn.js +0 -3199
  948. package/dist/packs-g5thvmGn.js.map +0 -1
  949. package/dist/profiles-B3NS9jwk.js.map +0 -1
  950. package/dist/server.js.map +0 -1
  951. package/dist/simulate-oXBiw1Ff.js.map +0 -1
@@ -0,0 +1,55 @@
1
+ //#region src/session/protocol.ts
2
+ /**
3
+ * Whether a command is one of the engine's of a kind, narrowed to its shape (`isCommand(sent, 'order')`: its units and
4
+ * its order): what reads a command it did not write, a game's own (`ModCommand`) passed over
5
+ *
6
+ * @beta
7
+ */
8
+ function isCommand(command, type) {
9
+ return command.type === type;
10
+ }
11
+ /**
12
+ * The version of what goes over the wire between a host and its players: the messages here and in `session/remote.ts`,
13
+ * and how deltas are made (`session/delta.ts`). The host says it in its welcome and a player says it when joining a
14
+ * server; a player of another version is refused with a reason, not left to fail somewhere strange. Raised by one on
15
+ * any change of their shape, which a game's own data (`Registry.dataHash`) does not show
16
+ *
17
+ * @beta
18
+ */
19
+ var PROTOCOL_VERSION = 13;
20
+ /**
21
+ * What a player is told when the host's version of the wire is not its own (`PROTOCOL_VERSION`)
22
+ *
23
+ * @internal
24
+ */
25
+ function protocolMismatch(host, player = 13) {
26
+ return `The host runs another version of the engine (protocol ${typeof host === "number" ? host : "unknown"}, this player's is ${player}): update the game`;
27
+ }
28
+ /**
29
+ * Reads a message that came over a wire: an object with a `type` that is a string, or nothing. What is not JSON, or is
30
+ * JSON of another shape (`null`, a number, a list), is nothing, so that a peer that sends anything at all makes whoever
31
+ * reads it drop the message, not fall over. The other fields are still the sender's word: check each before it is used
32
+ *
33
+ * @internal
34
+ */
35
+ function readMessage(text) {
36
+ let message;
37
+ try {
38
+ message = JSON.parse(text);
39
+ } catch {
40
+ return;
41
+ }
42
+ if (typeof message !== "object" || message === null || Array.isArray(message)) return void 0;
43
+ const { type } = message;
44
+ return typeof type === "string" ? message : void 0;
45
+ }
46
+ /**
47
+ * A number that is a number: not `NaN`, not infinite, not a string of digits
48
+ *
49
+ * @internal
50
+ */
51
+ var isFiniteNumber = (value) => typeof value === "number" && Number.isFinite(value);
52
+ //#endregion
53
+ export { PROTOCOL_VERSION, isCommand, isFiniteNumber, protocolMismatch, readMessage };
54
+
55
+ //# sourceMappingURL=protocol.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol.js","names":[],"sources":["../../src/session/protocol.ts"],"sourcesContent":["import type { CameraOrder, SeatCamera } from '#engine/cameraOrders'\nimport type { SystemTiming } from '#engine/scheduler'\nimport type { DataKind, DataValues } from '#engine/gameData'\nimport type { Logger } from '#engine/log'\nimport type { Command, ModCommand } from '#engine/commands'\nimport type { ChatAudience, PingId } from '#engine/talk'\nimport type { Cost, DamageType, EffectShape, ResourceId, Stats } from '#engine/defs'\nimport type { EntityId, PlayerId } from '#engine/entity'\nimport type { FormationUnit } from '#engine/formation'\nimport type { Vec2 } from '#engine/math'\nimport type { SaidLine } from '#engine/dialog'\nimport type { Message } from '#engine/messages'\nimport type { ObjectiveState, ObjectiveStatus } from '#engine/objectives'\nimport type { ShownTimer } from '#engine/timers'\nimport type { WorldSave } from '#engine/save'\nimport type { Registry } from '#engine/registry'\nimport type { Inspection, InspectTarget, LoggedEvent, WorldListing } from '#engine/inspect'\nimport type { Lane } from '#engine/lanes'\nimport type { MapCamera, MapDoodad, MapEnvironment, MapPath, MapRegion } from '#engine/map'\nimport type { Terrain } from '#engine/terrain'\nimport type { TerrainPatch } from '#engine/ground'\nimport type { MessageKind } from '#engine/world'\nimport type { ScoreLineState, ScoreState } from '#engine/score'\n\n/**\n * What travels between the simulation and a player's screen.\n *\n * A client never touches the world. It gets snapshots of what its player is allowed\n * to know and sends commands back. Today both ends live in the same page, later the\n * simulation runs on a server, and nothing on the client has to change for that.\n * Everything in here is plain data for that reason: it has to survive being sent.\n */\n\n/**\n * An item in a building's production queue, as the screen is told of it\n *\n * @beta\n */\nexport interface QueueItemState {\n\t/** What the item is: a unit being trained, an upgrade researched, a hero revived or a morph into another type */\n\tkind: 'unit' | 'upgrade' | 'revive' | 'morph'\n\t/** The id of the unit type, upgrade or hero the item makes */\n\tid: string\n\t/** 0..1 */\n\tprogress: number\n}\n\n/**\n * An ability of the player's own unit as the owner's screen is told of it: level, cooldown, charges and autocast\n *\n * @beta\n */\nexport interface AbilityInfo {\n\t/** The ability's id */\n\tid: string\n\t/** The ability's level, from 1 */\n\tlevel: number\n\t/** Seconds until it can be used again */\n\tcooldown: number\n\t/** Uses left, of an ability with charges, while it holds fewer than it can (all of them when left out: `chargesLeft`) */\n\tcharges?: number\n\t/** Seconds until the next use is back, while it holds fewer than it can */\n\trefill?: number\n\t/** Whether the ability is set to cast by itself */\n\tautocast: boolean\n\t/**\n\t * What the game's `canCast` hook decided, where it is not what the declared costs say: a reason it cannot be used\n\t * now, or null for one it can be used for all that (\"free while Clearcasting\"). Left out when there is nothing to add\n\t */\n\tdecided?: Message | null\n\t/** The game's own state of the ability (`AbilityState.data`), where it has any */\n\tdata?: Record<string, unknown>\n\t/**\n\t * Its window to be cast again, while it is open (`AbilityDef.recast`): seconds `left` of `total`, and how many\n\t * recasts are left in it (`count`)\n\t *\n\t * @beta\n\t */\n\trecast?: { left: number; total: number; count: number }\n}\n\n/**\n * An ability of a unit as everyone who sees it may be told (`RuleSettings.hud.shareAbilities`): what it is and its\n * level, and how much of its cooldown is left where the rules share that too\n *\n * @beta\n */\nexport interface SharedAbility {\n\t/** The ability's id */\n\tid: string\n\t/** Its level: 1 and up, those not learned are not told */\n\tlevel: number\n\t/**\n\t * Seconds until it can be used again: with `shareAbilities: 'cooldowns'` alone. Whole seconds, rounded up, from a\n\t * host (`quantize`): the plate counts down between\n\t */\n\tcooldown?: number\n}\n\n/**\n * Something a unit carries\n *\n * @beta\n */\nexport interface CarriedItem {\n\t/** Which one of the unit's items, for commands */\n\tid: number\n\t/** The item type's id */\n\titem: string\n\t/** Uses left of the item */\n\tcharges: number\n\t/** Seconds until it can be used again */\n\tcooldown: number\n\t/**\n\t * Uses left of the ability it casts, where that has charges (`AbilityDef.charges`) and holds fewer than it can: all\n\t * of them when left out. None, and it cannot be used until one comes back\n\t */\n\tuses?: number\n}\n\n/**\n * What everyone who sees a unit is told of its items (`inventorySlots`' snapshot): what it carries; its owner and their\n * allies the slots too, for commands\n *\n * @beta\n */\nexport interface InventoryInfo {\n\t/** The items it carries, by id: anyone who sees the unit sees that */\n\titems: string[]\n\t/** One entry per slot, null for the empty ones: for its owner and their allies */\n\tslots?: (CarriedItem | null)[]\n}\n\n/**\n * What a worker's owner and their allies are told of what it carries (`gathering`'s snapshot)\n *\n * @beta\n */\nexport interface GatheringInfo {\n\t/** How much of it */\n\tcarrying: number\n\t/** What it is that it carries, or last gathered. Null for a worker that has not gathered anything yet */\n\tkind: ResourceId | null\n}\n\n/**\n * What a building's owner and their allies are told of what it makes (`productionQueue`'s snapshot): its queue and where\n * what comes out goes; and everyone who sees it, how far it is in turning into another type\n *\n * @beta\n */\nexport interface ProductionInfo {\n\t/** What it makes, the first being made: for its owner and their allies */\n\tqueue?: QueueItemState[]\n\t/** Where what it makes goes once out: for its owner and their allies */\n\trally?: Vec2\n\t/** 0..1 while it turns into another type (`upgradeTo`, `UnitTypeDef.upgradesTo`): what every player who sees it sees */\n\tupgrade?: number\n\t/** The type it turns into, while it does */\n\tupgradeTo?: string\n}\n\n/**\n * An item lying on the ground\n *\n * @beta\n */\nexport interface GroundItemState {\n\t/** The ground item's id, which a pick-up order names */\n\tid: number\n\t/** The item type's id */\n\titem: string\n\t/** Where it lies, east-west */\n\tx: number\n\t/** Where it lies, north-south */\n\tz: number\n}\n\n/**\n * One item type a shop has for sale, with how many are left and how far the next is\n *\n * @beta\n */\nexport interface StockInfo {\n\t/** The item type's id */\n\titem: string\n\t/** How many are left. Left out for what a shop never runs out of */\n\tcount?: number\n\t/** 0..1 towards the next one, when the shop is not full */\n\trestock: number\n}\n\n/**\n * A purchase of a hero's that its player may still undo (`purchases`, `undoBuy`), with the seconds left to\n *\n * @beta\n */\nexport interface PurchaseInfo {\n\t/** The purchase's id, what the `undoBuy` command names it by */\n\tid: number\n\t/** The item type's id */\n\titem: string\n\t/** Whole seconds left to undo it */\n\tleft: number\n}\n\n/**\n * An ability a hero can put points into\n *\n * @beta\n */\nexport interface LearnableInfo {\n\t/** The ability's id */\n\tid: string\n\t/** The level it is at now, 0 when not learned */\n\tlevel: number\n\t/** The highest level the ability can be taken to */\n\tmaxLevel: number\n\t/** Hero level needed for the next level of the ability */\n\tneeds: number\n\t/** Whether a point can go into it right now */\n\tavailable: boolean\n}\n\n/**\n * A hero's experience: what it has, at what the level it is at started and at what the next one does (`HeroSent.xp`)\n *\n * @beta\n */\nexport interface XpInfo {\n\t/** Experience in total, whole */\n\txp: number\n\t/** What the level it is at took */\n\tlevelXp: number\n\t/** What the next level takes */\n\tnextXp: number\n}\n\n/**\n * A hero of the player, for the row of portraits. Fallen ones are in here too\n *\n * @beta\n */\nexport interface HeroSummary {\n\t/** The hero's entity id */\n\tid: number\n\t/** The hero's unit type id */\n\ttype: string\n\t/** The hero's level */\n\tlevel: number\n\t/** Whether the hero is alive; a fallen one is in the row all the same */\n\talive: boolean\n\t/** 0..1 */\n\thealth: number\n\t/** The hero's mana now */\n\tmana: number\n\t/** Skill points the hero has not spent */\n\tpoints: number\n\t/** 0..1 while being brought back: at an altar, or coming back by itself (`respawnPack`) */\n\treviving?: number\n\t/** Seconds until it comes back by itself, while it waits to (`respawnPack`) */\n\trespawnIn?: number\n\t/** What bringing it back would cost */\n\treviveCost?: Cost\n}\n\n/**\n * The part of an entity only its owner and their allies get to know\n *\n * @beta\n */\nexport interface OwnEntityState {\n\t/** Another player's, which this one may command: its owner shares control with them (`world.shareControl`) */\n\tshared?: boolean\n\t/** Inside something, like a worker in a mine */\n\thidden: boolean\n\t/** Type of the order being carried out */\n\torder: string | null\n\t/** What it is about to build, for a build order */\n\tbuild?: string\n\t/** Orders in the queue, the current one included */\n\torders: number\n\t/** Whether the unit is set not to fight back or chase (passive stance) */\n\tpassive: boolean\n\t/** Whether the unit is in a fight now */\n\tfighting: boolean\n\t/** Where it is walking to right now */\n\tgoal?: Vec2\n\t/** Destinations of the orders waiting in the queue: none while nothing waits */\n\twaypoints?: Vec2[]\n\t/** The unit's abilities with their cooldowns and charges, for its owner's command card */\n\tabilities?: AbilityInfo[]\n}\n\n/**\n * A unit, building, resource or other entity as the screen is told of it\n *\n * @beta\n */\nexport interface EntityState {\n\t/** The entity's id, which commands and orders name it by */\n\tid: number\n\t/** The id of its unit type */\n\ttype: string\n\t/** The player who owns it */\n\towner: PlayerId\n\t/** Where it stands, east-west, in world units */\n\tx: number\n\t/** Where it stands, north-south, in world units */\n\tz: number\n\t/** The way it faces, in radians; 0 is along +z */\n\tfacing: number\n\t/** Its health now */\n\thealth: number\n\t/** The stats that are not what its type starts with. Whoever sees a unit can tell what it is capable of */\n\tstats?: Partial<Stats>\n\t/** What its shields still hold */\n\tshield?: number\n\t/** On its way through the air: from where to where, and how high it rises in between */\n\tleap?: { from: Vec2; to: Vec2; height: number }\n\t/** False for a structure that is out of sight and shown the way it was last seen */\n\tvisible: boolean\n\t/** Left out when it is what the unit type says */\n\tmaxHealth?: number\n\t/** Its mana now; left out when it has none */\n\tmana?: number\n\t/** Its largest mana when that is not what its type says */\n\tmaxMana?: number\n\t/** Ids of the buffs on it */\n\tbuffs?: string[]\n\t/** How many of each of its buffs that stack it carries, for the ones it carries any of */\n\tstacks?: Record<string, number>\n\t/**\n\t * Seconds left of each of its `buffs`, in their order (whole seconds, rounded up, from a host: the plate counts\n\t * down between); -1 for one kept up by an aura or a passive (`BuffInstance.kept`) or that lasts until it is\n\t * taken off. Where the rules share them (`RuleSettings.hud.shareBuffTimes`)\n\t *\n\t * @beta\n\t */\n\tbuffTimes?: number[]\n\t/**\n\t * The abilities it has learned, for whoever sees it, its side's or not, where the rules share them\n\t * (`RuleSettings.hud.shareAbilities`). Its side has them in `own.abilities` all the same\n\t *\n\t * @beta\n\t */\n\tabilities?: SharedAbility[]\n\t/** What is left in a resource */\n\tresource?: number\n\t/** The resource it stands on (`UnitTypeDef.builtOn`, a cursed mine on a gold mine), by id */\n\ton?: number\n\t/** Doing nothing until woken, like a creep sleeping through the night */\n\tasleep?: boolean\n\t/**\n\t * It has an order to carry out: left out while it stands idle. What a cinematic's waits go by (`arrived`), for any\n\t * unit it directs; anyone in sight of it can see it walk or swing\n\t */\n\tbusy?: boolean\n\t/** How big it is drawn, when that is not 1 */\n\tscale?: number\n\t/** Which of the models of its type it is drawn with, when the map says */\n\tlook?: string\n\t/** Drawn as this type, in this owner's colour, while it is what its own type and owner say (`SpawnOptions.looksLike`) */\n\tlikeness?: { type: string; owner: PlayerId }\n\t/** Seconds left and seconds in all, for what is gone by itself after a while, like a ward */\n\tlifetime?: { left: number; total: number }\n\t/**\n\t * Invisible to enemies right now, or camouflaged (`BuffDef.camouflage`: seen by them only from near). Whoever gets this\n\t * sees it all the same: it is theirs, or they found it, or they are near\n\t */\n\tunseen?: boolean\n\t/** Components of game modules and mods that are sent to this player (see `Component.replicate`), by id */\n\tcomponents?: Record<string, unknown>\n\t/** The name the map or the rules gave it (`world.named`), for whoever knows of it: \"the gate\", \"the hero\" */\n\tname?: string\n\t/** What only its owner and their allies are told of it */\n\town?: OwnEntityState\n}\n\n/**\n * A player as the screen is told of them: name, team, colour, resources and their standing to the player it is for\n *\n * @beta\n */\nexport interface PlayerState {\n\t/** The player's id */\n\tid: PlayerId\n\t/** The name shown for the player */\n\tname: string\n\t/** The player's team number; players on one team are allies */\n\tteam: number\n\t/** The player's colour as RGB, each 0..1 */\n\tcolor: [number, number, number]\n\t/** Whether the player is a neutral one, owner of mines and the like */\n\tneutral: boolean\n\t/** Whether they are the creeps: hostile to everyone, but no one's rival */\n\tcreeps?: boolean\n\t/** The race they play (`raceOf`): left out in a game without races */\n\trace?: string\n\t/** Whether the player is out of the game */\n\tdefeated: boolean\n\t/** What they are to the player the snapshot is for: by their teams, or as the rules set it (`setRelation`) */\n\trelation: 'self' | 'ally' | 'enemy' | 'neutral'\n\t/**\n\t * What the player the snapshot is for shares with this ally (`shareWith`): their units' control, and their team's\n\t * sight (always, for an ally of their team). Left out for who is not an ally\n\t */\n\tshared?: { control: boolean; vision: boolean }\n\t/** Only filled in for the player the snapshot is for */\n\town?: {\n\t\t/** What the player has of each resource, by resource id */\n\t\tresources: Record<ResourceId, number>\n\t\tsupplyUsed: number\n\t\tsupplyCap: number\n\t\t/** The game's other pools of supply, by name (`RuleSettings.supply.pools`): left out in a game with none */\n\t\tsupplies?: Record<string, { used: number; cap: number }>\n\t\t/** What the size of the army costs in income */\n\t\tupkeep: { tier: number; name: string; income: number }\n\t\tupgrades: Record<string, number>\n\t\tresearching: string[]\n\t\t/** Types of the finished buildings the player has, with what those count as */\n\t\ttech: string[]\n\t\theroes: HeroSummary[]\n\t\t/** What the player is set to do, in a mission. Empty in a game without objectives */\n\t\tobjectives: ObjectiveState[]\n\t\t/** The timers the rules show the player (`world.timers.show`): their words and the tick each goes off at */\n\t\ttimers?: ShownTimer[]\n\t\t/**\n\t\t * What the game's `requirement` hook decided, where it differs from what the requirements say (see\n\t\t * `PlayerFacts.unlocks`): by unit or structure type, and `upgrade:<id>` for the next level. Left out without one\n\t\t */\n\t\tunlocks?: Record<string, Message | null>\n\t\t/**\n\t\t * What the game's `available` hook decided, where it differs from what their race says (see\n\t\t * `PlayerFacts.availability`): by unit or structure type, and `upgrade:<id>`. Left out without one\n\t\t */\n\t\tavailability?: Record<string, boolean>\n\t}\n}\n\n/**\n * A projectile in flight as the screen is told of it: where it is, who shot it and what kind of damage it carries\n *\n * @beta\n */\nexport interface ProjectileState {\n\t/** The projectile's id */\n\tid: number\n\t/** Where it is, east-west, in world units */\n\tx: number\n\t/** Where it is, north-south, in world units */\n\tz: number\n\t/** The type of what shot it, known even when the shooter is out of sight: what it looks like */\n\tkind: string\n\t/** The player whose unit shot it */\n\towner: PlayerId\n\t/** Whether the hit it carries is a critical one */\n\tcrit: boolean\n\t/** The type of damage it deals on landing */\n\tdamageType: DamageType\n\t/** A look the rules gave it (see `Projectile.look`) */\n\tlook?: string\n\t/** Entity it was fired by, when that one is known to the player */\n\tsource?: number\n\t/** Entity it is after, when that one is known to the player */\n\ttarget?: number\n\t/** Where it was fired from and where it comes down, for shots that are lobbed at a spot */\n\tfrom?: Vec2\n\t/** Where a lobbed shot comes down */\n\tto?: Vec2\n}\n\n/**\n * What an ability sent on its way, like a tornado\n *\n * @beta\n */\nexport interface MissileState {\n\t/** The missile's id */\n\tid: number\n\t/** The id of the ability that sent it */\n\tability: string\n\t/** The level of the ability when it was sent */\n\tlevel: number\n\t/** Entity that sent it, when that one is known to the player */\n\tsource?: number\n\t/** Where it is, east-west, in world units */\n\tx: number\n\t/** Where it is, north-south, in world units */\n\tz: number\n\t/** How far from its centre it hits things, in world units */\n\tradius: number\n\t/** The way it is heading, in radians */\n\theading: number\n\t/** How far it is with taking shape, 0..1, while it has not set off yet */\n\tforming?: number\n\t/** How much of its way it has come, 0..1, for the ones that go a known way */\n\tprogress?: number\n\t/** How high above the ground its arc carries it now, for what is thrown in one (`EffectFields.arc`) */\n\tarc?: number\n\t/** On its way back to the caster (`EffectFields.returns`): what is drawn of it may face the way it went out */\n\treturning?: boolean\n\t/** Its owner turns it as it flies (`EffectFields.steer`): told to its side alone, whose screen steers it (the `steer` command) */\n\tsteered?: boolean\n\t/**\n\t * Which effect of the ability it is, by its place there (`effectIndex`): what the screen draws it with\n\t * (`AbilityLook.effects`). Left out for one not written in the ability\n\t *\n\t * @beta\n\t */\n\teffect?: number\n}\n\n/**\n * An area of an ability on the ground the player is told of (`Snapshot.areas`): a zone for its life, or a delayed blast\n * until it goes off (a telegraph), with its shape (`EffectArea`), its place and the seconds left\n *\n * @beta\n */\nexport interface AreaState {\n\t/** A zone (`zone`), or effects that wait to go off there (`after`): `delayed` */\n\tkind: 'zone' | 'delayed'\n\t/** A zone's id, the same as long as it lasts. None for a delayed blast */\n\tid?: number\n\t/** The ability whose it is */\n\tability: string\n\t/** The ability's level */\n\tlevel: number\n\t/** Which effect of the ability it is (the `zone`, the `after`), by its place there (`effectIndex`) */\n\teffect?: number\n\t/** Who cast it, where the player knows them */\n\tsource?: number\n\t/** Its shape: circle, cone, line, rect, ring, arc or cross (`EffectCommon.shape`) */\n\tshape: EffectShape\n\t/** Where it is laid: its middle (circle, ring, rect, cross), or where it goes off from (cone, line, arc) */\n\tx: number\n\t/** Where it is laid along z */\n\tz: number\n\t/** The way it faces, radians as a unit's `facing` */\n\theading: number\n\t/** Of a circle, a ring and an arc: how far out it reaches */\n\tradius: number\n\t/** Of a cone, a line, a rect and a cross: how long it is */\n\tlength?: number\n\t/** Of a line, a rect and a cross: how far out on either side; of a ring and an arc, how thick */\n\twidth?: number\n\t/** Of a cone and an arc: how wide it opens, in radians */\n\tangle?: number\n\t/** Seconds left: of a zone, until it ends; of a delayed blast, until it goes off */\n\tleft: number\n\t/** Of the player's side */\n\tours?: boolean\n\t/** The unit a zone goes with (`follow`) */\n\tfollows?: number\n\t/** The name a delayed blast's arrival goes by (`impact`) */\n\timpact?: string\n}\n\n/**\n * What the players are told happened during a tick, which cannot be read from the state afterwards: each kind by its\n * `type` (design review E7). The engine's are told by its replications (`replicateEvent(key, type, tell)`, typed by\n * this entry); a pack's or a game's own added by declaration merging, as `OrderStates` is. A screen's handlers are\n * keyed by the same names (`SessionEventOf`)\n *\n * @beta\n */\nexport interface SessionEvents {\n\t/**\n\t * Something died. What killed it (`killer`, `killerType`, `from`, where it stood) when the player sees it; how:\n\t * an attack of the killer's, the blow's damage type, the ability, how much too much, a critical strike, and what\n\t * the rules made of it (`how`, set in the `death` hook: `'exploded'`). For the screen to show it its way\n\t */\n\tdeath: {\n\t\ttype: 'death'\n\t\tid: number\n\t\tfrom?: Vec2\n\t\tkiller?: number\n\t\tkillerType?: string\n\t\tattack: boolean\n\t\tdamageType?: DamageType\n\t\tability?: string\n\t\toverkill?: number\n\t\tcrit?: boolean\n\t\thow?: string\n\t\t/** Why, when it was not of damage (`DeathReason`): `cancelled`, `expired`, a game's own word */\n\t\treason?: string\n\t\t/** The blow's words of the game's own (`DamageOptions.tags`) */\n\t\ttags?: string[]\n\t}\n\t/**\n\t * Cells of one of the game's layers (`Terrain.cells`) were set to `value` (`world.setCells`): the session's ground has\n\t * it already, for the screen to draw again. Told where the player's team sees the cells, and as they come into its sight\n\t * where it does not (`TeamMemory.cells`): an observer is told of all. `over`: the seconds it eases into the value\n\t * over, where the rules said (grass growing back); not said as cells come into sight. `seen`: they came into sight\n\t * as they are, changed out of it before (a fire that burnt there a while): not as they change now\n\t */\n\tcells: { type: 'cells'; layer: string; at: number[]; value: number; over?: number; seen?: true }\n\t/**\n\t * A part of the ground was reshaped (`world.reshapeGround`, the editor's Play here): the session's ground has it\n\t * already, for the screen to draw again. Told to everyone\n\t */\n\tground: { type: 'ground'; patch: TerrainPatch }\n\t/**\n\t * Something the player does not see moved in a layer of cells where the player sees the ground (`ConcealmentOptions.rustle`):\n\t * where, and whether it stepped in. Not who: for the screen to shake the bushes there\n\t *\n\t * @beta\n\t */\n\trustle: { type: 'rustle'; layer: string; x: number; z: number; entered?: boolean }\n\t/**\n\t * A gust of wind the rules blew at a place the player sees (`gust`, `WindGust`): where, how far around, how hard,\n\t * which way (outwards from its middle when left out) and for how long. For the screen to bend the grass and bushes\n\t * there (`client.gust`)\n\t *\n\t * @beta\n\t */\n\tgust: { type: 'gust'; x: number; z: number; radius: number; strength: number; around?: number; lasts?: number }\n\t/** What the map looks like beyond its ground, as it is now (`world.setEnvironment`), and the seconds to ease into it over */\n\tenvironment: { type: 'environment'; environment: MapEnvironment; over?: number }\n\t/**\n\t * A definition changed while the game runs (`world.redefine`), a copy made with `copyOf`: a screen with a registry of\n\t * its own puts it in. Told to everyone\n\t */\n\tredefined: { type: 'redefined'; kind: DataKind; definition: string; values: DataValues }\n\t/** An attack started, at `target` when the player sees it */\n\t/** `weapon`: which of its attacks swings, by place (`UnitTypeDef.attacks`); the first when left out */\n\tattack: { type: 'attack'; id: number; target?: number; weapon?: number }\n\t/** An attack called off before its blow, of a unit the player sees (`swingCancelled`): the screen cuts it to the walk */\n\tattackCancelled: { type: 'attackCancelled'; id: number }\n\t/** Damage dealt to an entity the player sees: by whom when the player sees that too, with what, how much */\n\tdamage: {\n\t\ttype: 'damage'\n\t\tid: number\n\t\tamount: number\n\t\tdamageType: DamageType\n\t\tsource?: number\n\t\tsourceType?: string\n\t\tattack: boolean\n\t\tcrit: boolean\n\t\t/** The ability that dealt it, where the player sees the source (`source`) */\n\t\tability?: string\n\t\ttags?: string[]\n\t}\n\t/** Health given back to an entity the player sees */\n\theal: { type: 'heal'; id: number; amount: number; source?: number }\n\t/**\n\t * A buff put on an entity the player sees (`on`), put on again at another level (`renewed`), or taken off or run\n\t * out. Once as it begins and once as it ends: a renewal at the same level is not told\n\t */\n\tbuff: { type: 'buff'; id: number; buff: string; on: boolean; level?: number; renewed?: boolean; source?: number }\n\t/** A unit came out of `building`, where the player sees that too */\n\ttrained: { type: 'trained'; id: number; building?: number }\n\t/** A structure was put down to be built, to go up over `buildTime` seconds as builders work (`EntityState.construction`) */\n\tconstructionStarted: { type: 'constructionStarted'; id: number; buildTime: number }\n\t/** A structure was finished (or put down whole, `UnitTypeDef.construction: 'instant'`) */\n\tbuilt: { type: 'built'; id: number }\n\t/** A construction was called off by its owner: it dies next, its death's reason `cancelled` */\n\tconstructionCancelled: { type: 'constructionCancelled'; id: number }\n\t/** A building started to turn into another type (`to`) over `time` seconds (`EntityState.upgrade`) */\n\tupgradeStarted: { type: 'upgradeStarted'; id: number; to: string; time: number }\n\t/** That was called off */\n\tupgradeCancelled: { type: 'upgradeCancelled'; id: number; to: string }\n\t/** An entity became another type (`from`: what it was): an upgrade done, a morph */\n\tmorphed: { type: 'morphed'; id: number; from: string }\n\t/** A hero was brought back */\n\trevived: { type: 'revived'; id: number }\n\t/** An entity picked an item up */\n\tpicked: { type: 'picked'; id: number; item: string }\n\t/** Research of the player or an ally finished */\n\tresearched: { type: 'researched'; upgrade: string; level: number; building: number }\n\t/** A shot arrived: at its target when it had one, missing (`miss`), or struck critically */\n\tshot: { type: 'shot'; id: number; x: number; z: number; target?: number; miss: boolean; crit: boolean }\n\t/** A channelled ability started to be kept up (`on`, for `duration` seconds), or ended: done, or `interrupted` */\n\tchannel: { type: 'channel'; id: number; ability: string; on: boolean; duration?: number; interrupted?: boolean }\n\t/** What an ability sent on its way struck an entity */\n\tmissileHit: { type: 'missileHit'; missile: number; target: number }\n\t/** A critical strike landed on the entity */\n\tcrit: { type: 'crit'; id: number; amount: number }\n\t/** An attack up a cliff went wide, at this spot */\n\tmiss: { type: 'miss'; x: number; z: number }\n\t/** A shot that hits an area came down */\n\timpact: { type: 'impact'; x: number; z: number; radius: number }\n\t/** A worker struck what it is mending */\n\twork: { type: 'work'; id: number }\n\t/** A worker struck what it is gathering from */\n\tchop: { type: 'chop'; id: number; target: number }\n\t/** An ability went off. `radius` is there for the ones that hit an area */\n\tlevelUp: { type: 'levelUp'; id: number; level: number }\n\t/** Experience a hero of the player's or an ally's earned, and the level it is at after it */\n\txp: { type: 'xp'; id: number; amount: number; level: number }\n\t/**\n\t * Mana of a unit of the player's or an ally's spent on a cast (`amount` below 0, `ability` the one cast) or given by\n\t * an effect (above 0). Not regeneration\n\t */\n\tmana: { type: 'mana'; id: number; amount: number; ability?: string }\n\t/** A pool of the game's own on a unit of the player's or an ally's changed (`resourceChanged`) */\n\tresource: { type: 'resource'; id: number; kind: string; amount: number; reason?: string }\n\t/** Gold for a kill */\n\tbounty: { type: 'bounty'; x: number; z: number; amount: number }\n\t/** Someone started to cast. `duration` is how long until it goes off */\n\twindup: { type: 'windup'; id: number; ability: string; level: number; x: number; z: number; duration: number }\n\t/** A wind-up called off before it went off (stunned, killed, ordered elsewhere): what it showed goes. `ability` where known */\n\tcastCancelled: { type: 'castCancelled'; id: number; ability?: string }\n\t/** `id`: the caster, where the player sees it (not where only the spot is seen). `charged`: it went off charged, see `charge` on the ability */\n\tcast: { type: 'cast'; id?: number; ability: string; level: number; x: number; z: number; target?: number; radius?: number; charged?: boolean }\n\t/**\n\t * What an ability set off arrived somewhere: a missile hit, a rush ended, the time was up. `id`: the caster, where the\n\t * player sees it. `from`: where it went off from, when not the caster (a ball, a shadow: `EffectContext.origin`)\n\t */\n\tstrike: {\n\t\ttype: 'strike'\n\t\tid?: number\n\t\tability: string\n\t\tlevel: number\n\t\tx: number\n\t\tz: number\n\t\ttarget?: number\n\t\tradius?: number\n\t\timpact?: string\n\t\tfrom?: { x: number; z: number }\n\t\t/** Which effect of the ability arrived (a missile, a delay, a zone at its end), by its place there (`effectIndex`) */\n\t\teffect?: number\n\t}\n\t/** Something to tell the player. The client finds the words for it, see `Message` */\n\tmessage: { type: 'message'; message: Message; kind: MessageKind; seconds?: number }\n\t/** A command the player sent (`seq`, what `send` gave) was carried out: refused, with why, or not */\n\tcommand: { type: 'command'; seq: number; refusal?: Message }\n\t/** An objective of the player was given (`was` undefined), got further along, or was done or failed */\n\tobjective: { type: 'objective'; objective: ObjectiveState; was?: ObjectiveStatus }\n\t/** Someone says a line to the player: who, what, and for how long (see `world.dialog`) */\n\tline: { type: 'line'; line: SaidLine }\n\t/** The line was skipped: it ends now */\n\tlineEnded: { type: 'lineEnded'; id: number }\n\t/** One of the view's cinematics plays (see `playCinematic`) */\n\tcinematic: { type: 'cinematic'; cinematic: string; hold: boolean; skippable: boolean; params?: Record<string, unknown> }\n\t/** The rules cue the cinematic playing (see `cueCinematic`) */\n\tcinematicCue: { type: 'cinematicCue'; cue: string; params?: Record<string, unknown> }\n\t/** The rules pan or shake this player's camera (see `cameraFor`) */\n\tcamera: { type: 'camera' } & Pick<CameraOrder, 'pan' | 'shake'>\n\t/**\n\t * One of the view's effects plays, as the rules said (`world.fx`): `id` is the rules' handle on it, `fx` its name,\n\t * at a place (`x`, `y`, `z`) or on an entity (`on`, at a `point`), its knobs, the seed of its random parts\n\t */\n\tfx: {\n\t\ttype: 'fx'\n\t\tid: number\n\t\tfx: string\n\t\tx?: number\n\t\ty?: number\n\t\tz?: number\n\t\ton?: number\n\t\tpoint?: string\n\t\tparams?: Record<string, unknown>\n\t\tseed: number\n\t\toverFog?: boolean\n\t\t/** The other end, for one drawn between two (`FxOptions.toward`): an entity, where the player knows it */\n\t\ttoward?: number\n\t\t/** Or a place, east-west */\n\t\ttx?: number\n\t\t/** And north-south */\n\t\ttz?: number\n\t}\n\t/** An effect the rules played stops (`world.stopFx`) */\n\tfxStop: { type: 'fxStop'; id: number; fade?: number }\n\t/** A player of the side marked a spot of the map, or any player for everyone (`to`, see `ping`) */\n\t/** `by`: the name of who watches, for one of theirs (`to: 'observers'`) */\n\tping: { type: 'ping'; player: PlayerId; x: number; z: number; kind: PingId; to: ChatAudience; by?: string }\n\t/** A line of chat for the player: of their side, or to everyone (see `chat`) */\n\t/** `by`: the name of who watches, for a line of theirs (`to: 'observers'`) */\n\tchat: { type: 'chat'; player: PlayerId; text: string; to: ChatAudience; by?: string }\n\t/** An event of the game's own that goes to the screen (see `defineEvent`): its id, and what it says */\n\tgame: { type: 'game'; event: string; payload: unknown }\n}\n\n/**\n * Things that happened during a tick and cannot be read from the state afterwards: one of `SessionEvents`\n *\n * @beta\n */\nexport type SessionEvent = SessionEvents[keyof SessionEvents]\n\n/**\n * How the game stands for the player\n *\n * @beta\n */\nexport type Outcome = 'playing' | 'victory' | 'defeat'\n\n/**\n * Everything one player knows about the game at the end of a tick\n *\n * @beta\n */\nexport interface Snapshot {\n\t/** The tick number the snapshot was taken at */\n\ttick: number\n\t/**\n\t * The switches of the debug tools as they stand, for a player who may use them (`world.debugPlayers`): `explored`,\n\t * the whole map explored (`debug.explore`)\n\t */\n\tdebug?: { noCooldowns: boolean; noManaCosts: boolean; invulnerable: boolean; speed: number; explored?: boolean }\n\t/** Hour of the day, 0..24, in a game with days and nights */\n\thour?: number\n\t/** How the game stands for the player: still playing, a victory or a defeat */\n\toutcome: Outcome\n\t/** The entities the player may know of, as of this tick */\n\tentities: EntityState[]\n\t/** Every player of the game, with what the receiving player may know of each */\n\tplayers: PlayerState[]\n\t/** Projectiles in flight the player can see */\n\tprojectiles: ProjectileState[]\n\t/** Missiles in flight the player can see */\n\tmissiles: MissileState[]\n\t/** Items on the ground, where the player can see the ground */\n\titems: GroundItemState[]\n\t/** Spots someone sees for a while. Everyone can tell, not only whoever it is */\n\treveals: RevealState[]\n\t/**\n\t * The areas of abilities on the ground the player is told of: zones and delayed blasts, their side's and others' where\n\t * they see them. None when left out\n\t *\n\t * @beta\n\t */\n\tareas?: AreaState[]\n\t/** Corpses where the player can see the ground, by the id of who died there (see `raiseDead`). None when left out */\n\tcorpses?: CorpseState[]\n\t/** What happened since the last snapshot that the player is told of, oldest first */\n\tevents: SessionEvent[]\n\t/** What the rules said of the player's camera that lasts, a part of the map it stays in (see `cameraFor`). None when they said none */\n\tcamera?: SeatCamera\n\t/** What the game tells the player about itself, see `Rules.report` */\n\treport?: Record<string, unknown>\n\t/**\n\t * The score of the players the player is told of (`RuleSettings.score`: `live`, then `end`), told again at most once\n\t * in `refresh` seconds. None in a game that counts nothing\n\t *\n\t * @beta\n\t */\n\tscore?: ScoreState\n\t/**\n\t * The score's timeline, of the same players: told again at each point of it (`ScoreSettings.every`)\n\t *\n\t * @beta\n\t */\n\tscoreLine?: ScoreLineState\n}\n\n/**\n * A corpse as the player sees it: the id the unit had, of what type, where\n *\n * @beta\n */\nexport interface CorpseState {\n\t/** The id the unit had when alive */\n\tid: number\n\t/** The unit type it was */\n\ttype: string\n\t/** Where it lies, east-west */\n\tx: number\n\t/** Where it lies, north-south */\n\tz: number\n}\n\n/**\n * A spot revealed to a team for a while, as the screen is told of it\n *\n * @beta\n */\nexport interface RevealState {\n\t/** The reveal's id */\n\tid: number\n\t/** Centre of the revealed spot, east-west */\n\tx: number\n\t/** Centre of the revealed spot, north-south */\n\tz: number\n\t/** How far from the centre it reveals, in world units */\n\tradius: number\n\t/** Seconds it goes on */\n\tleft: number\n\t/** The player's team is the one that sees it */\n\tours: boolean\n}\n\n/** A creep camp. Where they are is part of the map, which everyone knows */\n/**\n * A deposit of the game's money, as the map shows it (`GameSession.mines`)\n *\n * @beta\n */\nexport interface MineInfo {\n\t/** The mine's entity id */\n\tid: number\n\t/** Where it stands, east-west */\n\tx: number\n\t/** Where it stands, north-south */\n\tz: number\n}\n\n/**\n * A camp of creeps as the player knows it: where, how strong and whether it is cleared\n *\n * @beta\n */\nexport interface CampInfo {\n\t/** The camp's id */\n\tid: number\n\t/** Where its middle is, east-west */\n\tx: number\n\t/** Where its middle is, north-south */\n\tz: number\n\t/** Levels of its creeps added up */\n\tlevel: number\n\t/** Whether the player has seen that the camp is empty */\n\tcleared: boolean\n}\n\n/**\n * What the player's team sees of the map. The arrays are per cell, row by row\n *\n * @beta\n */\nexport interface FogState {\n\t/** Cells across the map, east-west */\n\twidth: number\n\t/** Cells across the map, north-south */\n\tdepth: number\n\t/** Changes whenever the arrays did */\n\tversion: number\n\t/** The whole map is lit, a debug switch */\n\trevealed: boolean\n\t/** Per cell, row by row: non-zero where the team sees the cell now */\n\tvisible: Uint8Array\n\t/** Per cell, row by row: non-zero where the team has seen the cell at some time */\n\texplored: Uint8Array\n}\n\ntype WithoutPlayer<T> = T extends unknown ? Omit<T, 'player'> : never\n\n/**\n * A command as the client writes it. Who it comes from is decided by the session, never by the sender\n *\n * @beta\n */\nexport type PlayerCommand = WithoutPlayer<Command> | ModCommand\n\n/**\n * Whether a command is one of the engine's of a kind, narrowed to its shape (`isCommand(sent, 'order')`: its units and\n * its order): what reads a command it did not write, a game's own (`ModCommand`) passed over\n *\n * @beta\n */\nexport function isCommand<K extends Command['type']>(command: PlayerCommand, type: K): command is Extract<WithoutPlayer<Command>, { type: K }> {\n\treturn command.type === type\n}\n\n/**\n * What the debug tools of a client see of the simulation: an entity as the rules have it, and the events and hooks of\n * the last seconds. Plain data, as the snapshots are, so that it works the same with a simulation somewhere else: the\n * client says what it wants to follow, and reads what came back last\n *\n * @beta\n */\nexport interface SessionDebug {\n\t/** Follows an entity, a player or the world, or nothing. Its inspection comes back from then on */\n\tinspect(target: InspectTarget | null): void\n\t/** What is followed, as it stood when last heard of. Null when nothing is followed, or it is gone */\n\treadonly inspection: Inspection | null\n\t/** Changes a number, or a switch (a boolean), of what is followed, where its inspection shows it (`InspectedSection.path` and the key) */\n\tset(path: (string | number)[], value: number | boolean): void\n\t/** Whether the list of everything in the world comes back. Off until asked for: the world can be big */\n\tlisting: boolean\n\t/** Every player and entity of the world, out of sight, hidden and scenery too, as when last heard of. Null while not listing */\n\treadonly world: WorldListing | null\n\t/** Whether the events and hooks are logged. Off until asked for: logging costs a little */\n\tlogging: boolean\n\t/** The events and hooks of the last seconds, oldest first */\n\tlog(): readonly LoggedEvent[]\n\t/** Forgets what was logged so far */\n\tclearLog(): void\n}\n\n/**\n * What a session can do besides being a seat, each where it can (`GameSession.can`): a game played in this page holds\n * its pace and saves, a game in a worker of it says its timing too, a seat a computer plays from serves its brain. Asked\n * for as `session.can.pace?.advance()`: there or not\n *\n * @beta\n */\nexport interface SessionCan {\n\t/** The pace, where it is this player's to set: a game played in this page, in its thread or in a worker of it */\n\treadonly pace?: SessionPace\n\t/** Saves of the world as it stands, and the last checkpoint: a game played in this page */\n\treadonly saves?: SessionSaves\n\t/** The debug tools' view of the simulation, where the session allows it */\n\treadonly inspect?: SessionDebug\n\t/** Where the time of a simulation run elsewhere in this page went of late: a worker (S54) */\n\treadonly timing?: SessionTiming\n\t/** What a computer player's brain reads besides the snapshot: a seat in the simulation's own thread */\n\treadonly computer?: SessionComputer\n}\n\n/**\n * The pace a session holds the game at (`SessionCan.pace`)\n *\n * @beta\n */\nexport interface SessionPace {\n\t/** 1 as it goes, 0 held (a pause menu, a cinematic that has the game wait) */\n\tspeed: number\n\t/** Moves a held game on by `ticks` (one when left out): a step */\n\tadvance(ticks?: number): void\n}\n\n/**\n * Saves of the world a session plays (`SessionCan.saves`)\n *\n * @beta\n */\nexport interface SessionSaves {\n\t/** A save of the world as it stands: at once in this thread, a message there and back in a worker */\n\tsave(): Promise<WorldSave>\n\t/**\n\t * The last moment the rules marked to start again from (`world.checkpoint`), with what it is called, and a save of\n\t * the world as it stood: a scene can load it for \"Retry from wave 6\"\n\t */\n\treadonly checkpoint?: { label: Message; save: WorldSave }\n}\n\n/**\n * Where the time of a simulation run elsewhere went of late (`SessionCan.timing`)\n *\n * @beta\n */\nexport interface SessionTiming {\n\t/**\n\t * Milliseconds a tick took, evened out, the longest, what sending the page what changed took, what the page took to\n\t * take it in, and each system's share (`world.scheduler.timing()`) while they are measured (`profile`)\n\t */\n\ttiming(): { tick: number; tickMax: number; send: number; receive?: number; systems?: SystemTiming[] } | undefined\n\t/** Measures the simulation's systems, or stops (it costs a little): what the stats window asks while it is open */\n\tprofile?(on: boolean): void\n}\n\n/**\n * What a computer player's seat gives its brain besides the snapshot (`SessionCan.computer`)\n *\n * @beta\n */\nexport interface SessionComputer {\n\t/**\n\t * Where the game's money is mined (a resource of `Registry.currency`: gold mines), as a player knows from the map,\n\t * under the fog too: what a computer player looks to for another hall\n\t */\n\tmines(): readonly MineInfo[]\n\t/** The lanes of the map (`lanesOf`), as everyone knows them from the map: what a computer player of lanes walks with its waves */\n\tlanes(): readonly Lane[]\n\t/**\n\t * What happened since the last snapshot, not yet given in one: a copy. The brain's save keeps what it heard since it\n\t * last thought (`restoreEvents`), so that a game loaded from the save hears it too\n\t */\n\tpendingEvents(): SessionEvent[]\n\t/** Takes back what `pendingEvents` gave, ahead of what has happened since: in a game loaded from a save */\n\trestoreEvents(events: readonly SessionEvent[]): void\n}\n\n/**\n * A seat in a game: the only thing a client needs to play\n *\n * @beta\n */\nexport interface GameSession {\n\t/** The player this seat plays, or watches from the side of */\n\treadonly playerId: PlayerId\n\t/** The team of that player */\n\treadonly team: number\n\t/** The map and the game data are the same for everyone and known up front */\n\treadonly terrain: Terrain\n\t/**\n\t * What the map looks like beyond its ground, for the screen: its water, sky, weather. Nothing when it does not say.\n\t * As it was when the session began: what the rules change after comes as `environment` events\n\t */\n\treadonly environment?: MapEnvironment\n\t/** The scenery of the map, for the screen: none when it has none (see `MapDoodad`) */\n\treadonly doodads: readonly MapDoodad[]\n\t/** The regions of the map, for the screen: what mist in places lies over by name (see `MapRegion`, `AreaRef`) */\n\treadonly regions: readonly MapRegion[]\n\t/** The views of the map saved under names, for cinematics and a player's first view (see `MapCamera`) */\n\treadonly cameras: readonly MapCamera[]\n\t/** The paths of the map (a road), for the screen: a cinematic's camera on a rail along one (see `MapPath`) */\n\treadonly paths: readonly MapPath[]\n\t/** The definitions of the game the session runs, the same for everyone */\n\treadonly registry: Registry\n\t/** Simulation ticks per second */\n\treadonly tickRate: number\n\t/**\n\t * What the game says about what it does (`World.log`), where the session has it: a game played in the page. A\n\t * server's game says it on the server, and a player is not given it\n\t */\n\treadonly log?: Logger\n\t/**\n\t * Why the game ended on an error in its rules, once it has (`World.failure`): what the player is told. A game that\n\t * failed does not go on; a client says so, and offers what there is to offer\n\t */\n\treadonly failure?: { message: string } | null\n\t/** How far the current frame is between the last two snapshots, 0..1 */\n\treadonly alpha: number\n\n\t/** State to start from */\n\tsnapshot(): Snapshot\n\t/** Lets time pass. Returns the snapshots that came in since the last call, oldest first */\n\tupdate(dt: number): Snapshot[]\n\t/** Sends a command, to be carried out at the next tick. What it gives is told back with how it went (a `command` event) */\n\tsend(command: PlayerCommand): number\n\t/** The player's team's fog now, per cell */\n\tfog(): FogState\n\t/** The creep camps the player knows of, with whether each is cleared */\n\tcamps(): readonly CampInfo[]\n\n\t/** Whether the player could build this here, as far as they can tell */\n\tcanPlace(unitType: string, point: Vec2): boolean\n\t/**\n\t * Which cells of the ground a building would cover there are in the way, as far as the player can tell, row by row\n\t * from its corner (`placementCells`): what a preview draws cell by cell. None for one built on a resource, or where\n\t * the session does not say @beta\n\t */\n\tplaceCells?(unitType: string, point: Vec2): readonly boolean[] | undefined\n\t/**\n\t * Where a group of units would stand if sent to a point in a formation, turned to face a way (`facing`: the way a\n\t * right-click was dragged): the ghosts of that drag. By the formation's id, or the one the rules would pick (the\n\t * session's own where it knows the rules, `rows` where not). Worked out from what the player's screen knows, over the\n\t * ground the player knows; the `formation` hook does not run in it @beta\n\t */\n\tformationPlaces?(\n\t\tunits: readonly (FormationUnit & { readonly flying?: boolean })[],\n\t\tpoint: Vec2,\n\t\tfacing?: number,\n\t\tformation?: string\n\t): Map<EntityId, Vec2>\n\t/** Route a unit would take, over the ground the player knows */\n\tfindPath(from: Vec2, to: Vec2, flying?: boolean): Vec2[] | null\n\n\t/**\n\t * What this kind of session can do besides being a seat (`SessionCan`): hold the pace, save, show the debug tools,\n\t * tell its timing, serve a computer player. A seat over a wire can none of it; a game in this page most of it\n\t */\n\treadonly can: SessionCan\n\n\t/** Whether the player only watches, and sees everything (every player's resources among it): see `LocalSession.observer` */\n\treadonly observer?: boolean\n\t/** Milliseconds a message takes to the simulation and back, where it runs elsewhere. Nothing in the page */\n\treadonly ping?: number\n\n\t/** Stops the session and lets go of what it holds */\n\tdispose(): void\n}\n\n/**\n * The version of what goes over the wire between a host and its players: the messages here and in `session/remote.ts`,\n * and how deltas are made (`session/delta.ts`). The host says it in its welcome and a player says it when joining a\n * server; a player of another version is refused with a reason, not left to fail somewhere strange. Raised by one on\n * any change of their shape, which a game's own data (`Registry.dataHash`) does not show\n *\n * @beta\n */\nexport const PROTOCOL_VERSION = 13\n\n/**\n * What a player is told when the host's version of the wire is not its own (`PROTOCOL_VERSION`)\n *\n * @internal\n */\nexport function protocolMismatch(host: unknown, player: number = PROTOCOL_VERSION): string {\n\treturn `The host runs another version of the engine (protocol ${typeof host === 'number' ? host : 'unknown'}, this player's is ${player}): update the game`\n}\n\n/**\n * Reads a message that came over a wire: an object with a `type` that is a string, or nothing. What is not JSON, or is\n * JSON of another shape (`null`, a number, a list), is nothing, so that a peer that sends anything at all makes whoever\n * reads it drop the message, not fall over. The other fields are still the sender's word: check each before it is used\n *\n * @internal\n */\nexport function readMessage(text: string): ({ type: string } & Record<string, unknown>) | undefined {\n\tlet message: unknown\n\ttry {\n\t\tmessage = JSON.parse(text)\n\t} catch {\n\t\treturn undefined\n\t}\n\tif (typeof message !== 'object' || message === null || Array.isArray(message)) return undefined\n\tconst { type } = message as { type?: unknown }\n\treturn typeof type === 'string' ? (message as { type: string } & Record<string, unknown>) : undefined\n}\n\n/**\n * A number that is a number: not `NaN`, not infinite, not a string of digits\n *\n * @internal\n */\nexport const isFiniteNumber = (value: unknown): value is number => typeof value === 'number' && Number.isFinite(value)\n\n/**\n * A game of a server, as its list says it (`GET /games`): its room (what to connect to, `ws://host:port/<room>`; none for\n * a server of one game), the game and mode, where it is at, its seats taken and free, who watches, and its settings\n * (the map, among them, where the mode offers one)\n *\n * @beta\n */\nexport interface GameListing {\n\t/** The room name to connect to (`ws://host:port/<room>`); empty for a server of one game */\n\troom: string\n\t/** The id of the game module the room runs */\n\tgame: string\n\t/** The id of the mode the game runs */\n\tmode: string\n\t/** Where the game is: in its lobby, on, or ended */\n\tphase: 'lobby' | 'game' | 'ended'\n\t/** Seats players hold, seats nobody holds a player could, seats the computer plays */\n\tplayers: number\n\t/** Seats nobody holds that a player could take */\n\tfree: number\n\t/** Seats the computer plays */\n\tcomputer: number\n\t/** Connections watching without a seat */\n\twatchers: number\n\t/** The game's settings now, by name, such as the map */\n\tsettings: Record<string, string>\n\t/** Whether it takes no new games: stopping */\n\tdraining: boolean\n\t/** How its players are rated, on average, where the server keeps ratings (`Ratings`) */\n\trating?: number\n}\n\n/**\n * A kind of game a server lets players make a room of, as its list says it (`GET /games`'s `kinds`): what to ask\n * `POST /games` for (`{ kind: id, settings }`), what it is called, and the settings it offers (a map, among them)\n *\n * @beta\n */\nexport interface GameKindListing {\n\t/** The kind's id, which `POST /games` is asked for as `kind` */\n\tid: string\n\t/** What the kind is called for players */\n\tname: string\n\t/** Where to wait to be matched with others for it (`ws://host:port/<queue>`), and how many wait now, of how many it takes. None without matchmaking */\n\tqueue?: string\n\t/** How many players wait in the queue for this kind now */\n\twaiting?: number\n\t/** How many players it takes to make a room of this kind */\n\tneeded?: number\n\t/** The settings the kind offers by name, each with its label, its options and its default */\n\tsettings: Record<string, { label: string; options: string[]; default: string }>\n}\n"],"mappings":";;;;;;;AAu7BA,SAAgB,UAAqC,SAAwB,MAAkE;CAC9I,OAAO,QAAQ,SAAS;AACzB;;;;;;;;;AAmNA,IAAa,mBAAmB;;;;;;AAOhC,SAAgB,iBAAiB,MAAe,SAAA,IAA2C;CAC1F,OAAO,yDAAyD,OAAO,SAAS,WAAW,OAAO,UAAU,qBAAqB,OAAO;AACzI;;;;;;;;AASA,SAAgB,YAAY,MAAwE;CACnG,IAAI;CACJ,IAAI;EACH,UAAU,KAAK,MAAM,IAAI;CAC1B,QAAQ;EACP;CACD;CACA,IAAI,OAAO,YAAY,YAAY,YAAY,QAAQ,MAAM,QAAQ,OAAO,GAAG,OAAO,KAAA;CACtF,MAAM,EAAE,SAAS;CACjB,OAAO,OAAO,SAAS,WAAY,UAAyD,KAAA;AAC7F;;;;;;AAOA,IAAa,kBAAkB,UAAoC,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK"}
@@ -1,7 +1,8 @@
1
1
  import { type GameHostMessage, type HostToPlayer, type ServerToPlayer } from './wire';
2
2
  import type { GameMap, MapCamera, MapDoodad, MapEnvironment, MapPath, MapRegion } from '#engine/map';
3
- import type { PlayerId } from '#engine/entity';
4
- import type { GameModule } from '#engine/game';
3
+ import type { EntityId, PlayerId } from '#engine/entity';
4
+ import { type FormationUnit } from '#engine/formation';
5
+ import type { Rules } from '#engine/game';
5
6
  import { BuildGrid } from '#engine/grid';
6
7
  import type { Vec2 } from '#engine/math';
7
8
  import type { Navigation } from '#engine/navigation/navigation';
@@ -17,11 +18,13 @@ import { type CampInfo, type FogState, type GameSession, type PlayerCommand, typ
17
18
  * @beta
18
19
  */
19
20
  export interface Transport {
21
+ /** Sends one text message to the other end */
20
22
  send(message: string): void;
21
23
  /** What comes in from the other end. One handler: a later one takes the place of the one before */
22
24
  onMessage(handler: (message: string) => void): void;
23
25
  /** Told when the other end closes */
24
26
  onClose(handler: () => void): void;
27
+ /** Closes the connection; the other end's `onClose` handler is told */
25
28
  close(): void;
26
29
  }
27
30
  /**
@@ -32,6 +35,7 @@ export interface Transport {
32
35
  export interface LoopbackEnd extends Transport {
33
36
  /** Characters sent, a byte each as the JSON goes over a WebSocket of mostly ASCII */
34
37
  readonly bytesSent: number;
38
+ /** How many messages have been sent through this end */
35
39
  readonly messagesSent: number;
36
40
  }
37
41
  /**
@@ -85,13 +89,17 @@ export interface PlayerLimits {
85
89
  export interface HostTiming {
86
90
  /** When the counting started, `performance.now()` */
87
91
  since: number;
92
+ /** How many simulation ticks were stepped in the period */
88
93
  ticks: number;
89
94
  /** Milliseconds the ticks took, added up, and the longest */
90
95
  tickTime: number;
96
+ /** The longest a single tick took, in milliseconds */
91
97
  tickMax: number;
92
98
  /** Rounds of sending everyone what changed */
93
99
  sends: number;
100
+ /** Milliseconds the rounds of sending took, added up */
94
101
  sendTime: number;
102
+ /** The longest a single round of sending took, in milliseconds */
95
103
  sendMax: number;
96
104
  /**
97
105
  * Where the sending's milliseconds went, added up over the seats: what each player may know taken from the world
@@ -115,14 +123,18 @@ export interface HostTiming {
115
123
  bytes: number;
116
124
  /**
117
125
  * Those characters by what they carry, when the host counts them (`SessionHostOptions.bytesByKey`): each field of
118
- * the entities added and changed (`entity.hp`, `entity.own.abilities`), the other parts (`rest.players`, `rest.fog`),
126
+ * the entities added and changed (`entity.health`, `entity.own.abilities`), the other parts (`rest.players`, `rest.fog`),
119
127
  * `events`, `removed`, and the rest (ids, brackets) as `other`. They add up to `bytes`
120
128
  *
121
129
  * @beta
122
130
  */
123
131
  keys?: Record<string, number>;
124
132
  }
125
- /** @beta */
133
+ /**
134
+ * What a `SessionHost` is made with: its send rate, catching-up limit, watchdog and error callbacks and whether it owns its world
135
+ *
136
+ * @beta
137
+ */
126
138
  export interface SessionHostOptions {
127
139
  /** Snapshots a second sent to each player, at most: the simulation runs at its tick rate all the same. 20 when left out */
128
140
  sendRate?: number;
@@ -199,6 +211,7 @@ export interface SessionHostOptions {
199
211
  * @beta
200
212
  */
201
213
  export declare class SessionHost {
214
+ /** The world the host steps and sends its players views of */
202
215
  readonly world: World;
203
216
  private readonly seats;
204
217
  private accumulator;
@@ -208,7 +221,9 @@ export declare class SessionHost {
208
221
  private readonly sendEvery;
209
222
  /** Simulation speed multiplier, 0 pauses */
210
223
  speed: number;
211
- constructor(world: World, options?: SessionHostOptions);
224
+ constructor(
225
+ /** The world the host steps and sends its players views of */
226
+ world: World, options?: SessionHostOptions);
212
227
  private readonly onError?;
213
228
  private readonly stopFailed;
214
229
  private readonly dropSilentAfter;
@@ -227,13 +242,16 @@ export declare class SessionHost {
227
242
  * of chat and their pings, which go to who watches alone (`observers`, said by `name`); and with `observer` they see
228
243
  * everything, from `player`'s side. `allow` decides on each command before it goes in: a limit of how many, a game
229
244
  * paused. One it lets go is answered, refused (the `command` event of its `seq`): with what it gives for why, or
230
- * `cannotDoThat` for `false`
245
+ * `cannotDoThat` for `false`. `inOrder` for a transport that loses nothing and keeps the order (a worker's messages):
246
+ * each frame is the base of the next once it went, with no answer waited for, so the player always gets what changed
247
+ * since the frame it has, and takes it in without looking over the rest
231
248
  */
232
249
  connect(player: PlayerId, transport: Transport, options?: {
233
250
  readOnly?: boolean;
234
251
  observer?: boolean;
235
252
  allow?: () => boolean | MessageRef;
236
253
  name?: string;
254
+ inOrder?: boolean;
237
255
  }): void;
238
256
  /** The ground the world started as, whole, in parts small enough to go one at a time: made the first time one is asked for */
239
257
  private groundParts;
@@ -300,6 +318,7 @@ export declare class SessionHost {
300
318
  private forget;
301
319
  /** Runs the world by the clock, `rate` updates a second, until `stop` or `dispose` */
302
320
  start(rate?: number): void;
321
+ /** Stops stepping the world by the clock; does nothing if it was not started */
303
322
  stop(): void;
304
323
  /** Whether it runs by the clock */
305
324
  get running(): boolean;
@@ -330,6 +349,18 @@ export declare class ClientWorld {
330
349
  resourceAt(kind: string, cellX: number, cellZ: number, w: number, d: number): boolean;
331
350
  /** Brings the structures up to date with a snapshot: those in it stand, those no longer in it are gone */
332
351
  sync(snapshot: Snapshot): void;
352
+ /**
353
+ * Brings the structures up to date with a snapshot made on the one before it, from what came and went alone: the
354
+ * last `added` of its entities (`apply` puts those that came after the rest), and the ids of those `removed`. What
355
+ * `sync` does, without looking over every entity of the map
356
+ */
357
+ change(snapshot: Snapshot, added: number, removed: readonly number[]): void;
358
+ /** Puts a structure on the map, where it is not on it yet: whether it was put */
359
+ private stand;
360
+ /** Takes a structure off the map */
361
+ private release;
362
+ /** Takes off those gone, gives the ground back to what stood on them, and has the navmesh take in what changed */
363
+ private settle;
333
364
  }
334
365
  /**
335
366
  * The host said no, with why: to come back to a game that is over, or a player let go. Trying again does not help
@@ -337,8 +368,11 @@ export declare class ClientWorld {
337
368
  * @beta
338
369
  */
339
370
  export declare class SessionRefused extends Error {
371
+ /** Why the host refused, in words */
340
372
  readonly reason: string;
341
- constructor(reason: string);
373
+ constructor(
374
+ /** Why the host refused, in words */
375
+ reason: string);
342
376
  }
343
377
  /**
344
378
  * A player's seat at a world that runs elsewhere, over a transport (see `connect`). It rebuilds what the host sends
@@ -361,16 +395,27 @@ export declare class RemoteSession implements GameSession {
361
395
  /** The debug tools' view of the world, for a player the host lets use them (the welcome's `debug`) */
362
396
  protected get debugView(): SessionDebug | undefined;
363
397
  private readonly remoteDebug?;
398
+ /** The player this seat plays, as the host welcomed it */
364
399
  readonly playerId: PlayerId;
400
+ /** The team of that player; updated when a snapshot says it changed */
365
401
  team: number;
402
+ /** The ground, built from the welcome and the parts the host sent */
366
403
  readonly terrain: Terrain;
404
+ /** The map's look (sky, mist, light) from the welcome, when it has one */
367
405
  readonly environment?: MapEnvironment;
406
+ /** The map's scenery objects from the welcome */
368
407
  readonly doodads: readonly MapDoodad[];
408
+ /** The map's named regions from the welcome */
369
409
  readonly regions: readonly MapRegion[];
410
+ /** The map's named camera positions from the welcome */
370
411
  readonly cameras: readonly MapCamera[];
412
+ /** The map's named paths from the welcome */
371
413
  readonly paths: readonly MapPath[];
414
+ /** The definitions of the game, from the rules the player connected with */
372
415
  readonly registry: Registry;
416
+ /** Simulation ticks per second the host runs at, from the welcome */
373
417
  readonly tickRate: number;
418
+ /** How far, 0..1, the shown tick is between the last two snapshots, for blending the drawing */
374
419
  alpha: number;
375
420
  /** What the player knows by tick, for the deltas to come: from the base of the last one on */
376
421
  private readonly frames;
@@ -391,6 +436,8 @@ export declare class RemoteSession implements GameSession {
391
436
  protected interval: number;
392
437
  /** How far off the time snapshots arrive at is from the ticks between them, in seconds, evened out */
393
438
  protected jitter: number;
439
+ /** Seconds between two snapshots' arrivals, evened out: a seek's come as often as any, their ticks far apart */
440
+ private gap;
394
441
  /** When the last snapshot arrived, and its tick */
395
442
  private arrival?;
396
443
  constructor(transport: Transport, welcome: Extract<GameHostMessage, {
@@ -422,7 +469,7 @@ export declare class RemoteSession implements GameSession {
422
469
  * Takes a new version of the game into this screen's registry (hot reload, a game in a worker): its definitions as
423
470
  * the new version has them, what the host changed of them while it ran over them again
424
471
  */
425
- takeGame(game: GameModule): void;
472
+ takeGame(game: Rules): void;
426
473
  /** Takes in a message of the host's: what the transport hands it, and what came in while the session was made */
427
474
  receive(message: HostToPlayer): void;
428
475
  /**
@@ -470,6 +517,7 @@ export declare class RemoteSession implements GameSession {
470
517
  */
471
518
  get waiting(): number;
472
519
  private takeFog;
520
+ /** The newest snapshot the host sent */
473
521
  snapshot(): Snapshot;
474
522
  /** The tick the screen is shown at, between two snapshots: behind the newest by `delay` */
475
523
  get shownAt(): number;
@@ -482,10 +530,13 @@ export declare class RemoteSession implements GameSession {
482
530
  * between the last two (`alpha`). The time is the host's: the clock follows the snapshots, not the other way around
483
531
  */
484
532
  update(dt: number): Snapshot[];
533
+ /** Sends a command to the host and returns the number it was given, which the host's answer names; does nothing once closed */
485
534
  send(command: PlayerCommand): number;
486
535
  /** The number of the last command sent */
487
536
  private lastSeq;
537
+ /** The team's fog as built from what the host sent */
488
538
  fog(): FogState;
539
+ /** The creep camps as the newest frame has them */
489
540
  camps(): readonly CampInfo[];
490
541
  /**
491
542
  * Whether the player could build this here, as far as they can tell: on their copy of the map, with the structures
@@ -495,18 +546,29 @@ export declare class RemoteSession implements GameSession {
495
546
  /** Which cells of a building's ground are in the way, as `canPlace` sees them: on the player's copy of the map, explored */
496
547
  placeCells(unitType: string, point: Vec2): readonly boolean[] | undefined;
497
548
  /** The way a unit would walk, on the player's copy of the map: around the structures they know, and no others */
549
+ /** Where a group would stand sent to a point in a formation, `rows` when none is named: the rules are the host's (`GameSession.formationPlaces`) */
550
+ formationPlaces(units: readonly (FormationUnit & {
551
+ readonly flying?: boolean;
552
+ })[], point: Vec2, facing?: number, formation?: string): Map<EntityId, Vec2>;
553
+ /** A path over the ground the player has, on the air layer when `flying`; null when there is none */
498
554
  findPath(from: Vec2, to: Vec2, flying?: boolean): Vec2[] | null;
555
+ /** Stops pinging, closes the connection and frees the navigation made from the ground */
499
556
  dispose(): void;
500
557
  }
501
- /** @beta */
558
+ /**
559
+ * What `connect` is given: the rules, navigation settings, maps, limits and a handler for the host's other messages
560
+ *
561
+ * @beta
562
+ */
502
563
  export interface ConnectOptions {
503
564
  /**
504
565
  * The game module the host runs: the player's side needs its data, and checks it is the very same version. Or the
505
566
  * games the player has, by id, for a host that says which it runs
506
567
  */
507
- game: GameModule | Record<string, GameModule>;
568
+ rules: Rules | Record<string, Rules>;
569
+ /** Settings for the navigation the player's side builds of the ground */
508
570
  navigation?: RecastNavigationOptions;
509
- /** The maps the welcome's ground may be one of (S36): the game's own (`GameModule.maps`) when left out */
571
+ /** The maps the welcome's ground may be one of (S36): the game's own (`Rules.maps`) when left out */
510
572
  maps?: readonly GameMap[];
511
573
  /**
512
574
  * What the player's side keeps and how often it asks: `pingEvery`, `maxJitter`, `keptSnapshots`,
@@ -523,7 +585,7 @@ export interface ConnectOptions {
523
585
  * made of. Fails when the host runs another version of the game, or of the engine's wire (`PROTOCOL_VERSION`), and
524
586
  * when the connection closes before the session is made: while the map is made from the welcome too
525
587
  *
526
- * @beta
588
+ * @public
527
589
  */
528
590
  export declare function connect(transport: Transport, options: ConnectOptions): Promise<RemoteSession>;
529
591
  /** `connect`, for a session of a kind of its own: `make` is given what a `RemoteSession` is made of */