@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
@@ -1,1379 +0,0 @@
1
- import { Ao as assertPlainData, Fd as orderSays, Jl as checkpoint, Ki as declaredRefusal, Ol as SessionView, Vn as illusion, Xi as notReady, Zs as shieldOf, _i as decidedUnlocks, cl as fighting, gi as decidedAvailability, ii as placementCells, ll as moving, rl as deposit, ro as dashing, sd as changedStats, ti as canPlaceStructure, uc as heroSummaries, xi as techOf, yd as baseStats } from "./debugCommands-CzjrSm66.js";
2
- import { Bt as minesFor, Ct as campsFor, an as shownEffects, ct as saveWorld, k as lanesOf, zt as names } from "./coreComponents-syuh2fPG.js";
3
- import { i as setInspected, n as inspect, r as listWorld, t as EventLog } from "./inspect-D9dWHmZ0.js";
4
- //#region src/session/protocol.ts
5
- /**
6
- * Whether a command is one of the engine's of a kind, narrowed to its shape (`isCommand(sent, 'order')`: its units and
7
- * its order): what reads a command it did not write, a game's own (`ModCommand`) passed over
8
- *
9
- * @beta
10
- */
11
- function isCommand(command, type) {
12
- return command.type === type;
13
- }
14
- /**
15
- * The version of what goes over the wire between a host and its players: the messages here and in `session/remote.ts`,
16
- * and how deltas are made (`session/delta.ts`). The host says it in its welcome and a player says it when joining a
17
- * server; a player of another version is refused with a reason, not left to fail somewhere strange. Raised by one on
18
- * any change of their shape, which a game's own data (`Registry.dataHash`) does not show
19
- *
20
- * @beta
21
- */
22
- var PROTOCOL_VERSION = 13;
23
- /**
24
- * What a player is told when the host's version of the wire is not its own (`PROTOCOL_VERSION`)
25
- *
26
- * @internal
27
- */
28
- function protocolMismatch(host, player = 13) {
29
- return `The host runs another version of the engine (protocol ${typeof host === "number" ? host : "unknown"}, this player's is ${player}): update the game`;
30
- }
31
- /**
32
- * 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
33
- * JSON of another shape (`null`, a number, a list), is nothing, so that a peer that sends anything at all makes whoever
34
- * reads it drop the message, not fall over. The other fields are still the sender's word: check each before it is used
35
- *
36
- * @internal
37
- */
38
- function readMessage(text) {
39
- let message;
40
- try {
41
- message = JSON.parse(text);
42
- } catch {
43
- return;
44
- }
45
- if (typeof message !== "object" || message === null || Array.isArray(message)) return void 0;
46
- const { type } = message;
47
- return typeof type === "string" ? message : void 0;
48
- }
49
- /**
50
- * A number that is a number: not `NaN`, not infinite, not a string of digits
51
- *
52
- * @internal
53
- */
54
- var isFiniteNumber = (value) => typeof value === "number" && Number.isFinite(value);
55
- //#endregion
56
- //#region src/session/can.ts
57
- /** A session's pace, as `SessionCan.pace`: its own `speed` and `advance` */
58
- function paceOf(session) {
59
- return {
60
- get speed() {
61
- return session.speed;
62
- },
63
- set speed(speed) {
64
- session.speed = speed;
65
- },
66
- advance: (ticks) => session.advance(ticks)
67
- };
68
- }
69
- /** A session's saves, as `SessionCan.saves`: its own `save` and `checkpoint` */
70
- function savesOf(session) {
71
- return {
72
- save: () => session.save(),
73
- get checkpoint() {
74
- return session.checkpoint;
75
- }
76
- };
77
- }
78
- //#endregion
79
- //#region src/session/delta.ts
80
- /** Rounded to `step` */
81
- var round = (value, step) => Math.round(value / step) * step;
82
- /**
83
- * Seconds rounded up to whole ones, a hair over one (what floating point leaves over) not counted: what a plate
84
- * sweeps changes once a second on the wire, not every round (the plate counts down between)
85
- */
86
- var secondsUp = (value) => Math.ceil(value - 1e-6);
87
- /** Positions on the wire, in 256ths of a unit, and the facing in 256ths of a turn: whole numbers, short to write */
88
- var POSITION = 256;
89
- var TURN = 256 / (Math.PI * 2);
90
- /** An entity's numbers as they go over the wire: whole numbers where they can be. `decode` takes them back */
91
- function encode(state) {
92
- const out = { ...state };
93
- if (out.x !== void 0) out.x = Math.round(out.x * POSITION);
94
- if (out.z !== void 0) out.z = Math.round(out.z * POSITION);
95
- if (out.facing !== void 0) out.facing = (Math.round(out.facing * TURN) % 256 + 256) % 256;
96
- return out;
97
- }
98
- function decode(state) {
99
- const out = { ...state };
100
- if (out.x !== void 0) out.x /= POSITION;
101
- if (out.z !== void 0) out.z /= POSITION;
102
- if (out.facing !== void 0) out.facing /= TURN;
103
- return out;
104
- }
105
- /**
106
- * An entity's state with its numbers rounded for the wire: positions to 1/256 of a unit (16 bits over a map of 256),
107
- * the facing to a 256th of a turn, health and shield up to whole points (what is alive keeps at least one), mana down
108
- * (an ability is never shown ready that the simulation would refuse), what is under way to hundredths, the seconds
109
- * left of buffs and of shared cooldowns up to whole seconds
110
- *
111
- * @beta
112
- */
113
- function quantize(state) {
114
- const out = { ...state };
115
- out.x = Math.round(state.x * POSITION) / POSITION;
116
- out.z = Math.round(state.z * POSITION) / POSITION;
117
- out.facing = (Math.round(state.facing * TURN) % 256 + 256) % 256 / TURN;
118
- out.hp = Math.ceil(state.hp);
119
- if (state.shield !== void 0) out.shield = Math.ceil(state.shield);
120
- if (state.mana !== void 0) out.mana = Math.floor(state.mana);
121
- if (state.buffTimes) out.buffTimes = state.buffTimes.map((left) => left < 0 ? left : secondsUp(left));
122
- if (state.abilities?.some((ability) => ability.cooldown)) out.abilities = state.abilities.map((ability) => ability.cooldown ? {
123
- ...ability,
124
- cooldown: secondsUp(ability.cooldown)
125
- } : ability);
126
- if (state.lifetime) out.lifetime = {
127
- left: round(state.lifetime.left, .1),
128
- total: state.lifetime.total
129
- };
130
- return out;
131
- }
132
- /**
133
- * Whether two values of a field are the same: the very same, or equal as data. Two flat objects (an entity's `stats`, a
134
- * `lifetime`, a `leap`'s points) are compared field by field; what nests deeper as text
135
- */
136
- function same(a, b) {
137
- if (a === b) return true;
138
- if (typeof a !== "object" || typeof b !== "object" || a === null || b === null) return false;
139
- if (Array.isArray(a) || Array.isArray(b)) {
140
- if (!Array.isArray(a) || !Array.isArray(b) || a.length !== b.length) return false;
141
- for (let i = 0; i < a.length; i++) if (!same(a[i], b[i])) return false;
142
- return true;
143
- }
144
- const left = a;
145
- const right = b;
146
- for (const key in left) {
147
- if (!(key in right)) return false;
148
- const x = left[key];
149
- const y = right[key];
150
- if (x === y) continue;
151
- if (typeof x !== "object" || typeof y !== "object" || x === null || y === null) return false;
152
- if (!same(x, y)) return false;
153
- }
154
- for (const key in right) if (!(key in left)) return false;
155
- return true;
156
- }
157
- /** How deep a patch goes into lists and objects: past it, what changed is sent whole */
158
- var PATCH_DEPTH = 4;
159
- var isObject = (value) => typeof value === "object" && value !== null;
160
- /**
161
- * What to send of a value that changed (`same` said so) to whoever has `before`: the parts of a list or an object
162
- * that changed (`WirePatch`), or `after` whole where every part did, or where it is not the same kind of thing
163
- */
164
- function patchOf(before, after, depth = PATCH_DEPTH) {
165
- if (depth === 0 || !isObject(before) || !isObject(after) || Array.isArray(before) !== Array.isArray(after)) return after;
166
- const parts = {};
167
- let changed = 0;
168
- if (Array.isArray(before)) {
169
- const list = after;
170
- if (list.length !== before.length) return after;
171
- for (let i = 0; i < list.length; i++) {
172
- if (same(before[i], list[i])) continue;
173
- parts[i] = patchOf(before[i], list[i], depth - 1);
174
- changed++;
175
- }
176
- return changed === list.length ? after : { $patch: parts };
177
- }
178
- const left = before;
179
- const right = after;
180
- let fields = 0;
181
- let unset;
182
- for (const key in right) {
183
- if (right[key] === void 0) continue;
184
- fields++;
185
- if (same(left[key], right[key])) continue;
186
- parts[key] = patchOf(left[key], right[key], depth - 1);
187
- changed++;
188
- }
189
- for (const key in left) if (left[key] !== void 0 && right[key] === void 0) (unset ??= []).push(key);
190
- if (changed === fields && !unset) return after;
191
- return unset ? {
192
- $patch: parts,
193
- $unset: unset
194
- } : { $patch: parts };
195
- }
196
- var isPatch = (value) => isObject(value) && !Array.isArray(value) && "$patch" in value;
197
- /** A value a patch was made against, with the patch put in: new lists and objects where it says, the very parts it does not */
198
- function patched(base, patch) {
199
- const made = Array.isArray(base) ? [...base] : { ...base };
200
- for (const [key, part] of Object.entries(patch.$patch)) made[key] = isPatch(part) ? patched(base[key], part) : part;
201
- for (const key of patch.$unset ?? []) delete made[key];
202
- return made;
203
- }
204
- /** Whether two entities' components say the same: each as it knows how (`Component.same`), or as text */
205
- function sameComponents(registry, a, b) {
206
- if (a === b) return true;
207
- if (!a || !b) return false;
208
- for (const id in a) if (!(id in b)) return false;
209
- for (const id in b) {
210
- if (!(id in a)) return false;
211
- const compare = registry?.component(id)?.same;
212
- if (compare ? !compare(a[id], b[id]) : !same(a[id], b[id])) return false;
213
- }
214
- return true;
215
- }
216
- /**
217
- * The fields of an object that changed, and those that are gone, or nothing when none did. A field named in `skip` is
218
- * left to the caller (an entity's `own` part goes field by field on its own)
219
- */
220
- function fieldsOf(registry, before, after, skip) {
221
- let set;
222
- let unset;
223
- for (const key in after) {
224
- if (key === skip || after[key] === void 0) continue;
225
- if (key === "components" ? !sameComponents(registry, before[key], after[key]) : !same(before[key], after[key])) (set ??= {})[key] = after[key];
226
- }
227
- for (const key in before) if (key !== skip && before[key] !== void 0 && after[key] === void 0) (unset ??= []).push(key);
228
- return set || unset ? {
229
- set: set ?? {},
230
- ...unset ? { unset } : {}
231
- } : void 0;
232
- }
233
- /** What changed of an entity, or nothing when nothing did. What only its owner is told goes field by field too */
234
- function changeOf(registry, before, after) {
235
- const ownBefore = before.own;
236
- const ownAfter = after.own;
237
- const fields = fieldsOf(registry, before, after, "own");
238
- let own;
239
- let ownPatch;
240
- let unsetOwn = false;
241
- if (ownBefore && ownAfter) {
242
- own = fieldsOf(registry, ownBefore, ownAfter);
243
- if (own) for (const key in own.set) {
244
- const field = key;
245
- if (!isObject(ownBefore[field])) continue;
246
- const patch = patchOf(ownBefore[field], own.set[field]);
247
- if (!isPatch(patch)) continue;
248
- (ownPatch ??= {})[field] = patch;
249
- delete own.set[field];
250
- }
251
- } else if (ownAfter) own = { set: ownAfter };
252
- else if (ownBefore) unsetOwn = true;
253
- if (!fields && !own && !unsetOwn) return void 0;
254
- const unset = [...fields?.unset ?? [], ...unsetOwn ? ["own"] : []];
255
- const set = fields?.set ?? {};
256
- if (set.x !== void 0) set.x = Math.round(set.x * POSITION);
257
- if (set.z !== void 0) set.z = Math.round(set.z * POSITION);
258
- if (set.facing !== void 0) set.facing = (Math.round(set.facing * TURN) % 256 + 256) % 256;
259
- const change = [after.id, set];
260
- if (unset.length || own) change.push(unset.length ? unset : 0);
261
- if (own) {
262
- change.push(Object.keys(own.set).length || !ownPatch ? own.set : 0);
263
- if (own.unset || ownPatch) change.push(own.unset ?? 0);
264
- if (ownPatch) change.push(ownPatch);
265
- }
266
- return change;
267
- }
268
- /**
269
- * Every part of a frame besides its tick, its entities and its events: the snapshot's parts, the engine's and a pack's
270
- * (`SnapshotPart`), and the fog, the camps and the team
271
- */
272
- var restOf = (frame) => {
273
- const { snapshot, fog, camps, team } = frame;
274
- const { tick: _tick, entities: _entities, events: _events, ...parts } = snapshot;
275
- return {
276
- ...parts,
277
- fog,
278
- camps,
279
- team
280
- };
281
- };
282
- /** A frame's entities by id, worked out once: a base is diffed against round after round while the player's answer is on its way */
283
- var BY_ID = /* @__PURE__ */ new WeakMap();
284
- function entitiesById(frame) {
285
- let byId = BY_ID.get(frame);
286
- if (!byId) {
287
- byId = /* @__PURE__ */ new Map();
288
- for (const entity of frame.snapshot.entities) byId.set(entity.id, entity);
289
- BY_ID.set(frame, byId);
290
- }
291
- return byId;
292
- }
293
- var entityDiffs = /* @__PURE__ */ new WeakMap();
294
- var wholeDiffs = /* @__PURE__ */ new WeakMap();
295
- function entitiesDiff(then, now, base, registry) {
296
- let byBase = then && entityDiffs.get(then);
297
- const known = then ? byBase?.get(now) : wholeDiffs.get(now);
298
- if (known) return known;
299
- const made = {
300
- added: [],
301
- changed: [],
302
- removed: []
303
- };
304
- const before = base ? entitiesById(base) : void 0;
305
- const seen = before && before.size ? /* @__PURE__ */ new Set() : void 0;
306
- for (const entity of now) {
307
- const old = before?.get(entity.id);
308
- if (old) seen.add(entity.id);
309
- if (!old || old.type !== entity.type) {
310
- if (old) made.removed.push(old.id);
311
- made.added.push(encode(entity));
312
- continue;
313
- }
314
- const change = changeOf(registry, old, entity);
315
- if (change) made.changed.push(change);
316
- }
317
- if (before) {
318
- for (const id of before.keys()) if (!seen.has(id)) made.removed.push(id);
319
- }
320
- if (then) {
321
- if (!byBase) entityDiffs.set(then, byBase = /* @__PURE__ */ new WeakMap());
322
- byBase.set(now, made);
323
- } else wholeDiffs.set(now, made);
324
- return made;
325
- }
326
- /**
327
- * A frame as what changed since `base`, or all of it without one. Events are the caller's to add. `registry`: the game's, whose
328
- * components say how a change of theirs is found (`Component.same`); without it, as text
329
- *
330
- * @internal
331
- */
332
- function diff(base, next, registry) {
333
- const delta = {
334
- tick: next.snapshot.tick,
335
- base: base ? base.snapshot.tick : null,
336
- added: [],
337
- changed: [],
338
- removed: [],
339
- rest: {}
340
- };
341
- const { added, changed, removed } = entitiesDiff(base?.snapshot.entities, next.snapshot.entities, base, registry);
342
- delta.added = added;
343
- delta.changed = changed;
344
- delta.removed = removed;
345
- const now = restOf(next);
346
- const then = base && restOf(base);
347
- const keys = then ? /* @__PURE__ */ new Set([...Object.keys(now), ...Object.keys(then)]) : Object.keys(now);
348
- for (const key of keys) {
349
- const before = then?.[key];
350
- const after = now[key];
351
- if (then && same(before, after)) continue;
352
- const patch = then && key !== "fog" ? patchOf(before, after) : after;
353
- if (isPatch(patch)) (delta.restPatch ??= {})[key] = patch;
354
- else delta.rest[key] = after;
355
- }
356
- return delta;
357
- }
358
- /**
359
- * The frame a delta makes of the one at its base (none, for a whole one). Entities that did not change are the very
360
- * objects they were, so that whoever compares them by identity knows they did not. That is the frame before
361
- * (`latest`) whose object is the same as what is made, which is not always the base: the base is the last frame the
362
- * host heard was got, a frame or two behind, and the frames in between have objects of their own
363
- *
364
- * @internal
365
- */
366
- function apply(base, delta, latest) {
367
- const removed = new Set(delta.removed);
368
- const changed = /* @__PURE__ */ new Map();
369
- for (const change of delta.changed) changed.set(change[0], change);
370
- const before = /* @__PURE__ */ new Map();
371
- if (latest && latest !== base) for (const entity of latest.snapshot.entities) before.set(entity.id, entity);
372
- /** The frame before's object for what is made, where it is the same as it; else what is made */
373
- const kept = (made) => {
374
- const was = before.get(made.id);
375
- return was && (was === made || sameEntity(was, made)) ? was : made;
376
- };
377
- const entities = [];
378
- for (const entity of base?.snapshot.entities ?? []) {
379
- if (removed.has(entity.id)) continue;
380
- const change = changed.get(entity.id);
381
- if (!change) {
382
- entities.push(kept(entity));
383
- continue;
384
- }
385
- const [, set, unset, ownSet, ownUnset, ownPatch] = change;
386
- const next = {
387
- ...entity,
388
- ...decode(set)
389
- };
390
- for (const field of unset || []) delete next[field];
391
- if (ownSet || ownUnset || ownPatch) {
392
- const own = {
393
- ...entity.own,
394
- ...ownSet || {}
395
- };
396
- for (const field of ownUnset || []) delete own[field];
397
- for (const [field, patch] of Object.entries(ownPatch ?? {})) own[field] = patched(entity.own?.[field], patch);
398
- next.own = own;
399
- }
400
- entities.push(kept(next));
401
- }
402
- for (const added of delta.added) entities.push(kept(decode(added)));
403
- const rest = {
404
- ...base ? restOf(base) : {},
405
- ...delta.rest
406
- };
407
- for (const [key, patch] of Object.entries(delta.restPatch ?? {})) rest[key] = patched(base && restOf(base)[key], patch);
408
- const { fog, camps, team, ...parts } = rest;
409
- return {
410
- snapshot: {
411
- tick: delta.tick,
412
- ...parts,
413
- entities,
414
- events: []
415
- },
416
- fog,
417
- camps,
418
- team
419
- };
420
- }
421
- /**
422
- * Whether two states of an entity say the same, field by field
423
- *
424
- * @internal
425
- */
426
- function sameEntity(a, b) {
427
- if (a.type !== b.type) return false;
428
- return fieldsOf(void 0, a, b) === void 0;
429
- }
430
- /**
431
- * Characters of a delta's text by what they carry, added to `into`: each field of an entity, of those added and those
432
- * changed together (`entity.hp`; of what only its owner is told, `entity.own.abilities`), the other parts (`rest.fog`),
433
- * `events`, `removed`, and what is left (ids, brackets, the tick) as `other`, so that they add up to `text`'s length.
434
- * A field is its key, its value and the comma between, as `JSON.stringify` writes them
435
- */
436
- function bytesByKey(delta, text, into) {
437
- let counted = 0;
438
- const add = (key, characters) => {
439
- into[key] = (into[key] ?? 0) + characters;
440
- counted += characters;
441
- };
442
- const fields = (prefix, values) => {
443
- for (const [key, value] of Object.entries(values)) {
444
- if (value === void 0) continue;
445
- if (key === "own" && prefix === "entity." && value && typeof value === "object") {
446
- add("entity.own", key.length + 5);
447
- fields("entity.own.", value);
448
- } else add(prefix + key, key.length + 4 + JSON.stringify(value).length);
449
- }
450
- };
451
- for (const entity of delta.added) fields("entity.", entity);
452
- for (const [, set, unset, ownSet, ownUnset, ownPatch] of delta.changed) {
453
- fields("entity.", set);
454
- if (unset) add("entity.unset", JSON.stringify(unset).length + 1);
455
- if (ownSet) fields("entity.own.", ownSet);
456
- if (ownUnset) add("entity.own.unset", JSON.stringify(ownUnset).length + 1);
457
- if (ownPatch) fields("entity.own.", ownPatch);
458
- }
459
- for (const part of [delta.rest, delta.restPatch ?? {}]) for (const [key, value] of Object.entries(part)) if (value !== void 0) add(`rest.${key}`, key.length + 4 + JSON.stringify(value).length);
460
- if (delta.events.length) add("events", JSON.stringify(delta.events).length);
461
- if (delta.removed.length) add("removed", JSON.stringify(delta.removed).length);
462
- add("other", text.length - counted);
463
- }
464
- //#endregion
465
- //#region src/session/debug.ts
466
- /** Ticks between two lists of everything in the world: thousands of trees need not be listed every tick */
467
- var LIST_EVERY = 10;
468
- /**
469
- * The debug tools' view of a world running in the same page. What it hands out is worked out again whenever a
470
- * snapshot is, and at once when the client asks for something else: a remote one would wait for the answer instead
471
- */
472
- var LocalDebug = class {
473
- simulation;
474
- inspection = null;
475
- world = null;
476
- target = null;
477
- listedAt = -Infinity;
478
- events = new EventLog();
479
- constructor(simulation) {
480
- this.simulation = simulation;
481
- }
482
- inspect(target) {
483
- this.target = target;
484
- this.refresh();
485
- }
486
- set(path, value) {
487
- if (!this.target) return;
488
- setInspected(this.simulation, this.target, path, value);
489
- this.refresh();
490
- }
491
- get listing() {
492
- return this.world !== null;
493
- }
494
- set listing(on) {
495
- this.listedAt = -Infinity;
496
- this.world = on ? listWorld(this.simulation) : null;
497
- }
498
- get logging() {
499
- return this.events.attached;
500
- }
501
- set logging(on) {
502
- if (on === this.logging) return;
503
- if (on) this.events.attach(this.simulation);
504
- else this.events.detach();
505
- }
506
- log() {
507
- return this.events.entries;
508
- }
509
- clearLog() {
510
- this.events.clear();
511
- }
512
- /** Works what is handed out again. The session does when a tick went by */
513
- refresh() {
514
- const world = this.simulation;
515
- this.inspection = this.target && inspect(world, this.target);
516
- if (this.world && world.tick - this.listedAt >= LIST_EVERY) {
517
- this.world = listWorld(world);
518
- this.listedAt = world.tick;
519
- }
520
- }
521
- dispose() {
522
- this.events.detach();
523
- }
524
- };
525
- /** What is followed, as the wire says it: an entity, a player or the world, or nothing; anything else is not */
526
- function targetOf(value) {
527
- if (value === null) return null;
528
- if (typeof value !== "object") return void 0;
529
- const target = value;
530
- if (isFiniteNumber(target.entity)) return { entity: target.entity };
531
- if (isFiniteNumber(target.player)) return { player: target.player };
532
- if (target.world === true) return { world: true };
533
- }
534
- /**
535
- * Does what the debug tools of a screen asked of a world here (`DebugAsk`), each field checked first: it comes from
536
- * anyone who can send anything
537
- */
538
- function askDebug(view, ask) {
539
- const target = targetOf(ask.inspect);
540
- if (target !== void 0) view.inspect(target);
541
- const set = ask.set;
542
- if (set && Array.isArray(set.path) && set.path.every((key) => typeof key === "string" || isFiniteNumber(key)) && (isFiniteNumber(set.value) || typeof set.value === "boolean")) view.set(set.path, set.value);
543
- if (typeof ask.listing === "boolean") view.listing = ask.listing;
544
- if (typeof ask.logging === "boolean") view.logging = ask.logging;
545
- if (ask.clearLog === true) view.clearLog();
546
- }
547
- /**
548
- * The debug tools' view of a world elsewhere, a server's or a worker's: what it asked to follow, said over the wire
549
- * (`DebugAsk`), and what came back last (`take`)
550
- */
551
- var RemoteDebug = class {
552
- ask;
553
- inspection = null;
554
- world = null;
555
- listed = false;
556
- logged = false;
557
- target = null;
558
- events = [];
559
- constructor(ask) {
560
- this.ask = ask;
561
- }
562
- inspect(target) {
563
- this.target = target;
564
- if (!target) this.inspection = null;
565
- this.ask({ inspect: target });
566
- }
567
- /** Asks again for all it follows: of a world it is served from anew (a session resumed, a replay gone back) */
568
- askAgain() {
569
- if (this.target || this.listed || this.logged) this.ask({
570
- inspect: this.target,
571
- listing: this.listed,
572
- logging: this.logged
573
- });
574
- }
575
- set(path, value) {
576
- this.ask({ set: {
577
- path,
578
- value
579
- } });
580
- }
581
- get listing() {
582
- return this.listed;
583
- }
584
- set listing(on) {
585
- this.listed = on;
586
- if (!on) this.world = null;
587
- this.ask({ listing: on });
588
- }
589
- get logging() {
590
- return this.logged;
591
- }
592
- set logging(on) {
593
- this.logged = on;
594
- this.ask({ logging: on });
595
- }
596
- log() {
597
- return this.events;
598
- }
599
- clearLog() {
600
- this.events = [];
601
- this.ask({ clearLog: true });
602
- }
603
- /** What the world's side said of what is followed */
604
- take(said) {
605
- this.inspection = said.inspection;
606
- this.world = this.listed ? said.world : null;
607
- if (this.logged) this.events = said.log;
608
- }
609
- };
610
- //#endregion
611
- //#region src/session/entityState.ts
612
- /**
613
- * What a player is told of an entity (design review E7): what everyone in sight of it is, worked out once a tick for
614
- * every seat of a host (`commonEntityState`), and on it what is one player's own (`playerEntityState`). A seat
615
- * (`LocalSession`) puts them in its snapshots; nothing here keeps anything between ticks
616
- */
617
- /** A rule of `GameRules.hud` for one unit: its value, or what its function decides */
618
- var ruleOf = (world, entity, rule) => typeof rule === "function" ? rule(world, entity) : rule;
619
- /** The seconds left of a unit's buffs, in their order: -1 for one with no end, or kept up by an aura or a passive */
620
- function buffTimesOf(entity) {
621
- const times = new Array(entity.buffs.length);
622
- for (let i = 0; i < entity.buffs.length; i++) {
623
- const buff = entity.buffs[i];
624
- times[i] = Number.isFinite(buff.remaining) && !buff.kept ? Math.max(buff.remaining, 0) : -1;
625
- }
626
- return times;
627
- }
628
- /**
629
- * What everyone in sight of an entity is told of it this tick, the same for every seat (`EntityState`): where it is,
630
- * its health and mana, its stats where they changed, its buffs, what the rules share for the plates over it. `name`
631
- * is what the map calls it, where it has a name
632
- *
633
- * @internal
634
- */
635
- function commonEntityState(world, entity, name) {
636
- const state = {
637
- id: entity.id,
638
- type: entity.def.id,
639
- owner: entity.owner,
640
- x: entity.pos.x,
641
- z: entity.pos.z,
642
- facing: entity.facing,
643
- hp: entity.hp,
644
- stats: changedStats(world, entity),
645
- visible: true
646
- };
647
- const base = baseStats(entity.def, world.registry);
648
- if (entity.maxHp !== base.health) state.maxHp = entity.maxHp;
649
- if (entity.buffs.length) state.shield = shieldOf(entity) || void 0;
650
- const dash = entity.get(dashing);
651
- if (dash?.height) state.leap = {
652
- from: dash.from,
653
- to: {
654
- x: dash.x,
655
- z: dash.z
656
- },
657
- height: dash.height
658
- };
659
- if (entity.maxMana > 0) {
660
- state.mana = entity.mana;
661
- if (entity.maxMana !== base.mana) state.maxMana = entity.maxMana;
662
- }
663
- if (entity.buffs.length) state.buffs = entity.buffs.map((buff) => buff.id);
664
- for (const buff of entity.buffs) if (buff.stacks) (state.stacks ??= {})[buff.id] = buff.stacks;
665
- const { hud } = world.rules;
666
- if (hud.shareBuffTimes !== void 0 && entity.buffs.length && ruleOf(world, entity, hud.shareBuffTimes) === true) state.buffTimes = buffTimesOf(entity);
667
- if (hud.shareAbilities !== void 0 && entity.abilities.length) {
668
- const share = ruleOf(world, entity, hud.shareAbilities);
669
- if (share === "icons" || share === "cooldowns") {
670
- const abilities = [];
671
- for (const { id, level, cooldown } of entity.abilities) if (level >= 1) abilities.push(share === "cooldowns" ? {
672
- id,
673
- level,
674
- cooldown
675
- } : {
676
- id,
677
- level
678
- });
679
- if (abilities.length) state.abilities = abilities;
680
- }
681
- }
682
- if (entity.get(deposit)) state.resource = entity.get(deposit).amount;
683
- if (entity.on !== void 0) state.on = entity.on;
684
- if (entity.asleep) state.asleep = true;
685
- if (entity.scale !== 1) state.scale = entity.scale;
686
- if (entity.look) state.look = entity.look;
687
- if (world.sight.isInvisible(entity)) state.unseen = true;
688
- if (name !== void 0) state.name = name;
689
- if (entity.expires !== null && !entity.has(illusion)) state.lifetime = {
690
- left: entity.expires,
691
- total: entity.lifetime
692
- };
693
- return state;
694
- }
695
- /**
696
- * Whether an entity has a component replicated to its owner, or shaping itself for each player (`Component.snapshot`)
697
- *
698
- * @internal
699
- */
700
- function hasOnePlayersPart(world, entity) {
701
- for (const held of entity.heldComponents()) {
702
- const component = world.registry.component(held.id);
703
- if (component?.replicate === "owner" || component?.replicate && component.snapshot) return true;
704
- }
705
- return false;
706
- }
707
- /**
708
- * What one player is told of an entity, on what everyone is (`shared`, `commonEntityState`): an illusion's lifetime on
709
- * its own side, the components replicated to the player and what they make of themselves for them, and its own part
710
- * (`own`: its orders, where it goes, its abilities) for one of the player's side. `shared` itself where there is
711
- * nothing more
712
- *
713
- * @internal
714
- */
715
- function playerEntityState(view, entity, shared) {
716
- const { world, player, observer } = view;
717
- let state = shared;
718
- /** This player's copy of the shared state, made once something of this player's is added */
719
- const mine = () => state === shared ? state = { ...shared } : state;
720
- if (entity.expires !== null && entity.has(illusion) && view.isAlly(entity.owner)) mine().lifetime = {
721
- left: entity.expires,
722
- total: entity.lifetime
723
- };
724
- let seen;
725
- for (const held of entity.heldComponents()) {
726
- const { id } = held;
727
- const component = world.registry.component(id);
728
- const audience = component?.replicate;
729
- if (!audience) continue;
730
- const ally = view.isAlly(entity.owner);
731
- if (!(audience === "everyone" || (audience === "allies" ? ally : entity.owner === player))) continue;
732
- const value = entity.get(held);
733
- const sent = component.snapshot ? component.snapshot(value, entity, seen ??= {
734
- world,
735
- player: observer ? void 0 : player,
736
- own: entity.owner === player,
737
- ally,
738
- observer,
739
- knows: view.knows,
740
- isAlly: view.isAlly,
741
- sees: view.sees
742
- }) : structuredClone(value);
743
- if (sent !== void 0) (mine().components ??= {})[id] = sent;
744
- }
745
- if (!view.isAlly(entity.owner)) return state;
746
- const shareBuffTimes = world.rules.hud.shareBuffTimes;
747
- if (shareBuffTimes !== void 0 && entity.buffs.length && !shared.buffTimes && ruleOf(world, entity, shareBuffTimes) === "allies") mine().buffTimes = buffTimesOf(entity);
748
- const m = entity.get(moving);
749
- let waypoints;
750
- for (let i = 1; i < entity.orders.length; i++) {
751
- const order = entity.orders[i];
752
- const target = world.get(order.init.target);
753
- const point = target && view.knows(target) ? target.pos : order.init.point;
754
- if (point) (waypoints ??= []).push({
755
- x: point.x,
756
- z: point.z
757
- });
758
- }
759
- const own = mine().own = {
760
- ...entity.owner !== player && !observer && world.mayCommand(player, entity) && { shared: true },
761
- hidden: entity.hidden,
762
- order: entity.orders[0]?.type ?? null,
763
- build: entity.orders[0]?.type === "build" && !orderSays(world, entity, "building") ? entity.orders[0].init.unitType : void 0,
764
- orders: entity.orders.length,
765
- passive: entity.get(fighting)?.passive ?? false,
766
- fighting: !!entity.get(fighting)?.autoTarget,
767
- goal: m?.status === "moving" ? {
768
- x: m.navGoal.x,
769
- z: m.navGoal.z
770
- } : void 0,
771
- ...waypoints && { waypoints }
772
- };
773
- if (entity.abilities.length) {
774
- const hooked = world.hooks.has("canCast");
775
- own.abilities = entity.abilities.map(({ id, level, cooldown, charges, refill, autocast }) => {
776
- const info = {
777
- id,
778
- level,
779
- cooldown,
780
- autocast
781
- };
782
- if (charges !== void 0) Object.assign(info, {
783
- charges,
784
- refill
785
- });
786
- if (!hooked || level < 1) return info;
787
- const ability = world.registry.ability(id);
788
- const declared = declaredRefusal(world, entity, ability);
789
- const decided = notReady(world, entity, ability);
790
- if (declared?.key !== decided?.key) info.decided = decided ?? null;
791
- return info;
792
- });
793
- }
794
- return state;
795
- }
796
- //#endregion
797
- //#region src/session/local.ts
798
- /**
799
- * A seat at a world running in the same page. It does the job a server will do later:
800
- * run the simulation, and hand the player only what their team is allowed to know.
801
- */
802
- /** The effects of the rules a player was shown that are kept, for a stop to be told to them: the latest so many */
803
- var MOST_EFFECTS = 1024;
804
- /**
805
- * The events a computer player's seat hears (`forComputer`): the facts a brain reads and a save keeps for it (deaths,
806
- * damage, healing, pings, chat, the game's own events) and the answers to its commands. The rest is for a screen (an
807
- * attack's swing, a shot, a buff, a hammer blow, a line said), and a computer's seat is spared hearing it
808
- *
809
- * @beta
810
- */
811
- var COMPUTER_EVENTS = /* @__PURE__ */ new Set([
812
- "death",
813
- "damage",
814
- "heal",
815
- "ping",
816
- "chat",
817
- "game",
818
- "command"
819
- ]);
820
- var SHARED = /* @__PURE__ */ new WeakMap();
821
- /**
822
- * From here until `endSharedCaptures`, the sessions of the world describe each entity once between them (what
823
- * everyone is told; what is one player's goes on a copy): for a host's round of sending, where every seat is captured
824
- * from the same world. Not while the world changes: what was described is said again
825
- *
826
- * @internal
827
- */
828
- function shareCaptures(world) {
829
- SHARED.set(world, {
830
- common: /* @__PURE__ */ new Map(),
831
- sides: /* @__PURE__ */ new Map()
832
- });
833
- }
834
- /** @internal */
835
- function endSharedCaptures(world) {
836
- SHARED.delete(world);
837
- }
838
- /** @beta */
839
- var LocalSession = class {
840
- world;
841
- playerId;
842
- terrain;
843
- environment;
844
- doodads;
845
- regions;
846
- cameras;
847
- paths;
848
- registry;
849
- tickRate;
850
- alpha = 1;
851
- /** What the world says (`World.log`): a session in the page has it, and the client shows it with its own */
852
- get log() {
853
- return this.world.log;
854
- }
855
- /** Why the game ended on an error, once it has (`World.failure`) */
856
- get failure() {
857
- return this.world.failure;
858
- }
859
- /** Simulation speed multiplier, 0 pauses. A debug control, a real server sets the pace itself */
860
- speed = 1;
861
- accumulator = 0;
862
- /** Whether the team saw the whole map at the last snapshot (the debug switch): what it saw then only is forgotten after */
863
- wasRevealed = false;
864
- /** What the player's team remembers, or an observer's own (`SessionView.memory`) */
865
- get memory() {
866
- return this.view.memory;
867
- }
868
- /** Ids of what made it into the snapshot being put together as in sight. Kept to be cleared, not made anew */
869
- inSight = /* @__PURE__ */ new Set();
870
- /** The names the map or the rules gave entities, by id, as of the snapshot being put together (`world.named`) */
871
- namesNow = /* @__PURE__ */ new Map();
872
- disposers = [];
873
- pendingCheckpoint;
874
- checkpoint;
875
- debug;
876
- /** Its pace, saves of its world, the debug tools' view, and what a computer player's brain reads (`SessionCan`) */
877
- can = {
878
- pace: paceOf(this),
879
- saves: savesOf(this),
880
- inspect: void 0,
881
- computer: {
882
- mines: () => this.mines(),
883
- lanes: () => this.lanes(),
884
- pendingEvents: () => this.pendingEvents(),
885
- restoreEvents: (events) => this.restoreEvents(events)
886
- }
887
- };
888
- /**
889
- * Who only watches, and sees everything: every entity, the whole map, every player's resources and heroes. From
890
- * `playerId`'s side all the same (who is an ally, an enemy). For a server's watchers, whose commands go nowhere
891
- */
892
- observer;
893
- /**
894
- * Whose seat is a computer player's (`forComputer`): its snapshots leave out projectiles, missiles, corpses, reveals
895
- * and the events a brain never reads, and it listens for none of those, so twelve computers cost the world less
896
- */
897
- forComputer;
898
- /** The seat's side of the world: whose it is, what they may know, what was told to them since the last snapshot */
899
- view;
900
- constructor(world, playerId, options = {}) {
901
- this.world = world;
902
- this.playerId = playerId;
903
- this.observer = options.observer ?? false;
904
- this.ownsWorld = options.ownsWorld ?? false;
905
- this.forComputer = options.forComputer ?? false;
906
- this.view = new SessionView(world, playerId, {
907
- observer: this.observer,
908
- forComputer: this.forComputer,
909
- mostEffects: options.mostEffects ?? MOST_EFFECTS
910
- });
911
- if (options.debug) world.debugPlayers.add(playerId);
912
- this.terrain = world.terrain;
913
- this.environment = world.map.environment;
914
- this.doodads = world.map.doodads;
915
- this.regions = world.map.regions;
916
- this.cameras = world.map.cameras;
917
- this.paths = world.map.paths;
918
- this.registry = world.registry;
919
- this.tickRate = world.tickRate;
920
- this.debug = new LocalDebug(world);
921
- this.can.inspect = this.debug;
922
- const { events } = world;
923
- const { view } = this;
924
- for (const replication of world.registry.replications) {
925
- if (!this.hears(replication.as)) continue;
926
- this.disposers.push(events.on(replication.event, (payload) => {
927
- const said = replication.tell(payload, view);
928
- if (said) view.events.push(said);
929
- }));
930
- }
931
- this.disposers.push(events.on(checkpoint, ({ label }) => this.pendingCheckpoint = label));
932
- if (this.hears("game")) this.disposers.push(events.watch((type, payload) => {
933
- if (typeof type !== "string") return;
934
- const audience = world.registry.event(type)?.replicate;
935
- if (!audience) return;
936
- if (audience !== "everyone" && !audience(payload, view)) return;
937
- if (this.world.checks.events) assertPlainData(payload, `Event "${type}"`);
938
- view.events.push({
939
- type: "game",
940
- event: type,
941
- payload
942
- });
943
- }));
944
- }
945
- /** Whether the seat is told of events of a kind: a player's seat of all of them, a computer's of what a brain reads */
946
- hears(kind) {
947
- return !this.forComputer || COMPUTER_EVENTS.has(kind);
948
- }
949
- /** The player's team: theirs now, as the rules may move them to another (`setTeam`) */
950
- get team() {
951
- return this.view.team;
952
- }
953
- isAlly(owner) {
954
- return this.view.isAlly(owner);
955
- }
956
- /** Whether the player's team sees a spot of the map right now: an observer sees all of it */
957
- sees(x, z) {
958
- return this.view.sees(x, z);
959
- }
960
- /**
961
- * How many effects of the rules are kept for their stop to be told (`mostEffects`), for a test of the bound
962
- *
963
- * @internal
964
- */
965
- get keptEffects() {
966
- return shownEffects(this.view).size;
967
- }
968
- /** Whether the player's team can see the entity right now */
969
- knows(entity) {
970
- return this.view.knows(entity);
971
- }
972
- /**
973
- * What everyone in sight of an entity is told of it this tick, the same for every seat: worked out once for all
974
- * the sessions of a world while a host's round of sending is on (`shareCaptures`), else for this session alone
975
- */
976
- common(entity) {
977
- const shared = SHARED.get(this.world)?.common;
978
- const known = shared?.get(entity.id);
979
- if (known) return known;
980
- const state = commonEntityState(this.world, entity, this.namesNow.get(entity.id));
981
- shared?.set(entity.id, state);
982
- return state;
983
- }
984
- /**
985
- * What this player is told of an entity: what everyone is (`common`, shared between the seats of a host), and on a
986
- * copy of it what is this player's to know: an illusion's lifetime on its own side, the components replicated to it
987
- * and what they make of themselves for it, and its own part (`own`) for an ally's
988
- */
989
- describe(entity) {
990
- const side = this.sideNow;
991
- if (!side) return playerEntityState(this.view, entity, this.common(entity));
992
- if (this.isOnePlayers(entity)) {
993
- const state = playerEntityState(this.view, entity, this.common(entity));
994
- const first = side.alike.get(entity.id);
995
- if (!first) side.alike.set(entity.id, state);
996
- else if (first !== state && sameEntity(first, state)) return first;
997
- return state;
998
- }
999
- const known = side.all.get(entity.id);
1000
- if (known) return known;
1001
- const state = playerEntityState(this.view, entity, this.common(entity));
1002
- side.all.set(entity.id, state);
1003
- return state;
1004
- }
1005
- /**
1006
- * What the seats of this one's side are told alike this round (`Round.sides`), by entity: none outside a host's round.
1007
- * Set as the capture starts (`capture`)
1008
- */
1009
- sideNow;
1010
- /**
1011
- * Which seats are told the same of an entity where nothing of it is one player's: an observer's, or a team's with the
1012
- * same allies among the players (relations are a pair of players', not a team's)
1013
- */
1014
- sideKey() {
1015
- if (this.observer) return "observer";
1016
- let key = `team ${this.team}:`;
1017
- for (const player of this.world.players.keys()) key += this.isAlly(player) ? "1" : "0";
1018
- return key;
1019
- }
1020
- /**
1021
- * Whether what this player is told of an entity is theirs alone, not their side's: a component replicated to its owner
1022
- * or shaping itself for each player (`Component.snapshot`), or control of another's unit shared with this player
1023
- */
1024
- isOnePlayers(entity) {
1025
- if (hasOnePlayersPart(this.world, entity)) return true;
1026
- return entity.owner !== this.playerId && !this.observer && this.isAlly(entity.owner) && this.world.mayCommand(this.playerId, entity);
1027
- }
1028
- /** Where in the list being captured are those that may be one player's (`SideSeen.mine`): while the first seat of a side captures */
1029
- mineNow;
1030
- /**
1031
- * What the team remembers of a structure is every teammate's to be told, not this seat's: without the parts of the
1032
- * description shaped for one player (components replicated to the owner, or made by their `snapshot` for whoever is
1033
- * told), which the seat that happened to see it first would otherwise give to the whole team
1034
- */
1035
- forTeam(entity, state) {
1036
- if (!state.components || !hasOnePlayersPart(this.world, entity)) return state;
1037
- const components = {};
1038
- for (const [id, part] of Object.entries(state.components)) {
1039
- const component = this.world.registry.component(id);
1040
- if (component?.replicate === "owner" || component?.replicate && component.snapshot) continue;
1041
- components[id] = part;
1042
- }
1043
- return {
1044
- ...state,
1045
- components
1046
- };
1047
- }
1048
- /** Adds what the player sees of an entity in sight to the snapshot, and remembers structures for when they are out of sight */
1049
- see(entity, out, remembered) {
1050
- const before = remembered[entity.id];
1051
- const kept = entity.isResource && before?.visible && before.resource === entity.get(deposit)?.amount;
1052
- const state = kept ? before : this.describe(entity);
1053
- if (!kept && this.mineNow && (this.isAlly(entity.owner) || hasOnePlayersPart(this.world, entity))) this.mineNow.push(out.length);
1054
- out.push(state);
1055
- this.inSight.add(entity.id);
1056
- if (entity.isStructure && !this.isAlly(entity.owner)) {
1057
- if (state !== before) remembered[entity.id] = this.forTeam(entity, state);
1058
- } else if (before) delete remembered[entity.id];
1059
- }
1060
- /** Throws when what was taken to be in sight is not what testing every entity gives. See `debugChecks` */
1061
- checkSight() {
1062
- for (const entity of this.world.entities.values()) {
1063
- if (!entity.alive || this.knows(entity) === this.inSight.has(entity.id)) continue;
1064
- const said = this.inSight.has(entity.id) ? "in sight" : "out of sight";
1065
- throw new Error(`Snapshot for player ${this.playerId} has ${entity.def.id}#${entity.id} ${said}, it is not`);
1066
- }
1067
- }
1068
- /** The scenery the player's team sees right now */
1069
- *sceneryInSight() {
1070
- const { world } = this;
1071
- if (this.observer || world.fog.isRevealed(this.team)) {
1072
- for (const entity of world.entities.values()) if (entity.scenery) yield entity;
1073
- } else yield* world.sceneryInSight.get(this.team) ?? [];
1074
- }
1075
- /**
1076
- * On a map explored from the start, what stands on it and belongs to no player (trees, mines, rocks, neutral
1077
- * buildings, the creeps' own) known to the team from the first snapshot, as it stands, out of sight: the genre's melee
1078
- * maps. Once for a team (`TeamMemory.startKnown`); units, and players' buildings, only once seen
1079
- */
1080
- knowStart(remembered) {
1081
- const { world } = this;
1082
- if (this.observer || !world.fog.exploredFromStart) return;
1083
- const memory = this.memory;
1084
- if (memory.startKnown) return;
1085
- memory.startKnown = true;
1086
- for (const entity of world.entities.values()) {
1087
- if (!entity.alive || !entity.isStructure || this.inSight.has(entity.id) || remembered[entity.id]) continue;
1088
- const owner = world.players.get(entity.owner);
1089
- if (!owner?.neutral && !owner?.creeps) continue;
1090
- remembered[entity.id] = {
1091
- ...this.forTeam(entity, this.describe(entity)),
1092
- visible: false
1093
- };
1094
- }
1095
- }
1096
- capture() {
1097
- const { world } = this;
1098
- const round = SHARED.get(world);
1099
- if (round) {
1100
- const key = this.sideKey();
1101
- let side = round.sides.get(key);
1102
- if (!side) round.sides.set(key, side = {
1103
- all: /* @__PURE__ */ new Map(),
1104
- alike: /* @__PURE__ */ new Map()
1105
- });
1106
- this.sideNow = side;
1107
- } else this.sideNow = void 0;
1108
- const remembered = this.memory.structures;
1109
- this.namesNow.clear();
1110
- if (world.states.has(names)) for (const [name, id] of Object.entries(world.state(names))) this.namesNow.set(id, name);
1111
- const seen = this.sideNow?.seen;
1112
- const entities = seen ? this.seeAsSide(seen) : this.seeAll(remembered);
1113
- if (this.world.checks.sight) this.checkSight();
1114
- if (seen) return this.finish(entities);
1115
- this.knowStart(remembered);
1116
- const revealed = this.observer || world.fog.isRevealed(this.team);
1117
- if (this.wasRevealed && !revealed) {
1118
- for (const [key, state] of Object.entries(remembered)) if (!this.inSight.has(Number(key)) && !world.fog.isExplored(this.team, state.x, state.z)) delete remembered[Number(key)];
1119
- }
1120
- this.wasRevealed = revealed;
1121
- const forget = world.rules.fog?.explored === "nothing" && !revealed;
1122
- for (const [key, state] of Object.entries(remembered)) {
1123
- const id = Number(key);
1124
- if (this.inSight.has(id)) continue;
1125
- if (forget) {
1126
- delete remembered[id];
1127
- continue;
1128
- }
1129
- if (!world.get(id) && this.sees(state.x, state.z)) {
1130
- delete remembered[id];
1131
- continue;
1132
- }
1133
- const memory = state.visible ? {
1134
- ...state,
1135
- visible: false
1136
- } : state;
1137
- if (memory !== state) remembered[id] = memory;
1138
- entities.push(memory);
1139
- }
1140
- if (this.sideNow) this.sideNow.seen = {
1141
- entities: [...entities],
1142
- inSight: new Set(this.inSight),
1143
- mine: this.mineNow ?? []
1144
- };
1145
- this.mineNow = void 0;
1146
- return this.finish(entities);
1147
- }
1148
- /** The entities in sight, and what the side remembers out of it, as the first seat of a side (or a seat on its own) sees them */
1149
- seeAll(remembered) {
1150
- const { world } = this;
1151
- const entities = [];
1152
- this.inSight.clear();
1153
- this.mineNow = this.sideNow ? [] : void 0;
1154
- for (const entity of world.actors.values()) if (entity.alive && this.knows(entity)) this.see(entity, entities, remembered);
1155
- for (const entity of this.sceneryInSight()) if (entity.alive && entity.scenery) this.see(entity, entities, remembered);
1156
- return entities;
1157
- }
1158
- /**
1159
- * What another seat of the side saw this round, as this one sees it: the same, but what may be this player's alone
1160
- * described again for them. The side's memory is the first seat's to keep
1161
- */
1162
- seeAsSide(seen) {
1163
- const entities = [...seen.entities];
1164
- this.inSight.clear();
1165
- for (const id of seen.inSight) this.inSight.add(id);
1166
- for (const at of seen.mine) entities[at] = this.describe(this.world.get(entities[at].id));
1167
- this.wasRevealed = this.observer || this.world.fog.isRevealed(this.team);
1168
- return entities;
1169
- }
1170
- /** The rest of a snapshot, round its entities: the players, and every feature's part (`SnapshotPart`) */
1171
- finish(entities) {
1172
- const { world } = this;
1173
- const players = [];
1174
- for (const player of world.players.values()) {
1175
- const state = {
1176
- id: player.id,
1177
- name: player.name,
1178
- team: player.team,
1179
- color: player.color,
1180
- neutral: player.neutral,
1181
- creeps: player.creeps || void 0,
1182
- ...player.race !== void 0 && { race: player.race },
1183
- defeated: player.defeated,
1184
- relation: player.id === this.playerId ? "self" : world.areAllies(this.playerId, player.id) ? "ally" : world.areEnemies(this.playerId, player.id) ? "enemy" : "neutral"
1185
- };
1186
- if (state.relation === "ally" && !player.neutral && !this.observer) {
1187
- const me = world.player(this.playerId);
1188
- state.shared = {
1189
- control: world.sides.controlOf(this.playerId).includes(player.id),
1190
- vision: me.team === player.team || world.sides.visionOf(me.team).includes(player.team)
1191
- };
1192
- }
1193
- if (player.id === this.playerId || this.observer && !player.neutral) {
1194
- state.own = {
1195
- resources: { ...player.resources },
1196
- supplyUsed: player.supplyUsed,
1197
- supplyCap: player.supplyCap,
1198
- ...Object.keys(player.supplies).length > 0 && { supplies: structuredClone(player.supplies) },
1199
- upkeep: world.rules.economy.upkeep(world, player.id),
1200
- upgrades: Object.fromEntries(player.upgrades),
1201
- researching: [...player.researching],
1202
- tech: [...techOf(world, player.id)],
1203
- heroes: heroSummaries(world, player.id),
1204
- objectives: world.objectives.of(player.id).map((objective) => structuredClone(objective)),
1205
- ...world.timers.shownTo(player.id).length && { timers: world.timers.shownTo(player.id) }
1206
- };
1207
- if (world.hooks.has("requirement") && player.id === this.playerId) state.own.unlocks = decidedUnlocks(world, player.id);
1208
- if (world.hooks.has("available") && player.id === this.playerId) {
1209
- const availability = decidedAvailability(world, player.id);
1210
- if (availability) state.own.availability = availability;
1211
- }
1212
- }
1213
- players.push(state);
1214
- }
1215
- const { view } = this;
1216
- const snapshot = { tick: world.tick };
1217
- const parts = world.registry.snapshotParts;
1218
- const take = (part) => {
1219
- const value = part.capture(view);
1220
- if (value !== void 0) snapshot[part.key] = value;
1221
- };
1222
- for (const part of parts) if (part.head) take(part);
1223
- snapshot.entities = entities;
1224
- snapshot.players = players;
1225
- for (const part of parts) if (!part.head) take(part);
1226
- return snapshot;
1227
- }
1228
- snapshot() {
1229
- return this.capture();
1230
- }
1231
- /**
1232
- * Moves the game on by `ticks` at the next update, however fast it goes: a step of a paused game (`speed` 0), as
1233
- * an editor's Step does. Ticks asked for while it runs are taken on top of its pace
1234
- */
1235
- advance(ticks = 1) {
1236
- this.accumulator += this.world.dt * Math.max(0, Math.floor(ticks));
1237
- }
1238
- /** A save of the world as it stands (`saveWorld`): at once, as a promise for what a session elsewhere answers later */
1239
- save() {
1240
- try {
1241
- return Promise.resolve(saveWorld(this.world));
1242
- } catch (error) {
1243
- return Promise.reject(error);
1244
- }
1245
- }
1246
- /**
1247
- * Runs the game on by itself, a tick at a time, as fast as the page can, until `until` holds of the world, `most`
1248
- * ticks have run, the game is over, or `deadline` (`performance.now()`'s) is past: what an editor's "Play to" does a
1249
- * slice a frame, its pace and `advance` aside. The ticks are the same ticks the game runs at its own pace, so the
1250
- * same game comes to the same moment. What happened in them is in the next snapshot (`update`), as after a slow frame.
1251
- * `until` is asked before the first tick too: what holds already runs none
1252
- */
1253
- runUntil(until, options = {}) {
1254
- const { world } = this;
1255
- const most = options.most ?? Infinity;
1256
- const deadline = options.deadline ?? Infinity;
1257
- let ticks = 0;
1258
- const over = () => world.failure !== null || world.winner !== null;
1259
- while (!until(world)) {
1260
- if (ticks >= most || over()) return this.ran(ticks, false, over());
1261
- if (ticks % 8 === 7 && performance.now() > deadline) return this.ran(ticks, false, false);
1262
- this.tickOnce();
1263
- ticks++;
1264
- }
1265
- return this.ran(ticks, true, over());
1266
- }
1267
- /** What `runUntil` gives back, the debug tools' view brought up to date where it ran */
1268
- ran(ticks, reached, over) {
1269
- if (ticks) {
1270
- this.debug.refresh();
1271
- this.ranOn = true;
1272
- }
1273
- return {
1274
- ticks,
1275
- reached,
1276
- over
1277
- };
1278
- }
1279
- /** Whether `runUntil` ran ticks since the last update: its next snapshot describes them, paused or not */
1280
- ranOn = false;
1281
- /** A tick of the world, and the checkpoint it marked saved as the world stood at its end, not at the end of the frame */
1282
- tickOnce() {
1283
- this.world.step();
1284
- if (this.pendingCheckpoint) {
1285
- this.checkpoint = {
1286
- label: this.pendingCheckpoint,
1287
- save: saveWorld(this.world)
1288
- };
1289
- this.pendingCheckpoint = void 0;
1290
- }
1291
- }
1292
- update(dt) {
1293
- const { world } = this;
1294
- let stepped = this.ranOn;
1295
- this.ranOn = false;
1296
- this.accumulator += dt * this.speed * world.cheats.speed;
1297
- while (this.accumulator >= world.dt) {
1298
- this.tickOnce();
1299
- this.accumulator -= world.dt;
1300
- stepped = true;
1301
- }
1302
- this.alpha = this.speed * world.cheats.speed > 0 ? this.accumulator / world.dt : 1;
1303
- if (!stepped) return this.view.events.length ? [this.capture()] : [];
1304
- this.debug.refresh();
1305
- return [this.capture()];
1306
- }
1307
- /** Sends a command. `seq` is the sender's own number for it, for a host passing on what a remote player numbered */
1308
- send(command, seq = ++this.lastSeq) {
1309
- this.world.issue({
1310
- ...command,
1311
- player: this.playerId,
1312
- seq
1313
- });
1314
- return seq;
1315
- }
1316
- /**
1317
- * The number of the last command sent: a computer's seat keeps it through a save, so the commands it sends after a
1318
- * load are numbered as they would have been
1319
- *
1320
- * @beta
1321
- */
1322
- lastSeq = 0;
1323
- fog() {
1324
- const { fog } = this.world;
1325
- const cells = fog.cells(this.team);
1326
- return {
1327
- width: fog.width,
1328
- depth: fog.depth,
1329
- version: fog.version,
1330
- revealed: this.observer || fog.isRevealed(this.team) || !cells,
1331
- visible: cells?.visible ?? /* @__PURE__ */ new Uint8Array(0),
1332
- explored: cells?.explored ?? /* @__PURE__ */ new Uint8Array(0)
1333
- };
1334
- }
1335
- /** Where the game's money is mined, as the map shows it, seen or not (`GameSession.mines`, `minesFor`) */
1336
- mines() {
1337
- return minesFor(this.view);
1338
- }
1339
- /** The lanes of the map, as the map shows them (`GameSession.lanes`) */
1340
- lanes() {
1341
- return lanesOf(this.world);
1342
- }
1343
- /** The camps as the player knows them (`GameSession.camps`, `campsFor`): worked out once a tick */
1344
- camps() {
1345
- return campsFor(this.view);
1346
- }
1347
- canPlace(unitType, point) {
1348
- return this.registry.units.has(unitType) && canPlaceStructure(this.world, this.registry.unit(unitType), point, this.playerId, true);
1349
- }
1350
- /** Which cells of a building's ground are in the way for the player: taken, or not explored by their team (`placementCells`) */
1351
- placeCells(unitType, point) {
1352
- if (!this.registry.units.has(unitType)) return void 0;
1353
- const { world } = this;
1354
- const { team } = world.player(this.playerId);
1355
- return placementCells(this.registry.unit(unitType), point, (x, z) => world.grid.canPlace(x, z, 1, 1), (x, z) => world.fog.isExplored(team, x + .5, z + .5));
1356
- }
1357
- findPath(from, to, flying = false) {
1358
- return (flying ? this.world.air : this.world.nav).findPath(from, to);
1359
- }
1360
- /** What happened since the last snapshot, not yet given in one: a copy, for a computer's save */
1361
- pendingEvents() {
1362
- return structuredClone(this.view.events);
1363
- }
1364
- /** Takes back what `pendingEvents` gave, ahead of what has happened since: in a game loaded from a save */
1365
- restoreEvents(events) {
1366
- this.view.events = [...structuredClone(events), ...this.view.events];
1367
- }
1368
- /** Whether the world goes with the session */
1369
- ownsWorld;
1370
- dispose() {
1371
- for (const dispose of this.disposers.splice(0)) dispose();
1372
- this.debug.dispose();
1373
- if (this.ownsWorld) this.world.dispose();
1374
- }
1375
- };
1376
- //#endregion
1377
- export { readMessage as _, RemoteDebug as a, bytesByKey as c, paceOf as d, savesOf as f, protocolMismatch as g, isFiniteNumber as h, LocalDebug as i, diff as l, isCommand as m, endSharedCaptures as n, askDebug as o, PROTOCOL_VERSION as p, shareCaptures as r, apply as s, LocalSession as t, quantize as u };
1378
-
1379
- //# sourceMappingURL=local-Dkovq42k.js.map