@v12-engine/engine 0.1.1 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (951) hide show
  1. package/dist/abilities/amounts.d.ts +28 -0
  2. package/dist/abilities/amounts.js +74 -0
  3. package/dist/abilities/amounts.js.map +1 -0
  4. package/dist/abilities/buffs.d.ts +106 -6
  5. package/dist/abilities/buffs.js +443 -0
  6. package/dist/abilities/buffs.js.map +1 -0
  7. package/dist/abilities/castTold.d.ts +2 -0
  8. package/dist/abilities/castTold.js +66 -0
  9. package/dist/abilities/castTold.js.map +1 -0
  10. package/dist/abilities/chance.d.ts +38 -0
  11. package/dist/abilities/chance.js +77 -0
  12. package/dist/abilities/chance.js.map +1 -0
  13. package/dist/abilities/charges.d.ts +18 -0
  14. package/dist/abilities/charges.js +101 -0
  15. package/dist/abilities/charges.js.map +1 -0
  16. package/dist/abilities/control.d.ts +28 -0
  17. package/dist/abilities/control.js +113 -0
  18. package/dist/abilities/control.js.map +1 -0
  19. package/dist/abilities/dispel.js +51 -0
  20. package/dist/abilities/dispel.js.map +1 -0
  21. package/dist/abilities/effectFields.d.ts +1 -1
  22. package/dist/abilities/effectFields.js +676 -0
  23. package/dist/abilities/effectFields.js.map +1 -0
  24. package/dist/abilities/effectIndex.d.ts +27 -0
  25. package/dist/abilities/effectIndex.js +64 -0
  26. package/dist/abilities/effectIndex.js.map +1 -0
  27. package/dist/abilities/effects/buff.d.ts +9 -3
  28. package/dist/abilities/effects/buff.js +84 -0
  29. package/dist/abilities/effects/buff.js.map +1 -0
  30. package/dist/abilities/effects/conditions.d.ts +2 -0
  31. package/dist/abilities/effects/conditions.js +41 -0
  32. package/dist/abilities/effects/conditions.js.map +1 -0
  33. package/dist/abilities/effects/core.js +54 -0
  34. package/dist/abilities/effects/core.js.map +1 -0
  35. package/dist/abilities/effects/damage.d.ts +1 -1
  36. package/dist/abilities/effects/damage.js +43 -0
  37. package/dist/abilities/effects/damage.js.map +1 -0
  38. package/dist/abilities/effects/heal.d.ts +2 -2
  39. package/dist/abilities/effects/heal.js +51 -0
  40. package/dist/abilities/effects/heal.js.map +1 -0
  41. package/dist/abilities/effects/missile.d.ts +13 -1
  42. package/dist/abilities/effects/missile.js +104 -0
  43. package/dist/abilities/effects/missile.js.map +1 -0
  44. package/dist/abilities/effects/morph.d.ts +5 -0
  45. package/dist/abilities/effects/morph.js +43 -0
  46. package/dist/abilities/effects/morph.js.map +1 -0
  47. package/dist/abilities/effects/moves.d.ts +16 -4
  48. package/dist/abilities/effects/moves.js +212 -0
  49. package/dist/abilities/effects/moves.js.map +1 -0
  50. package/dist/abilities/effects/passives.d.ts +19 -9
  51. package/dist/abilities/effects/passives.js +131 -0
  52. package/dist/abilities/effects/passives.js.map +1 -0
  53. package/dist/abilities/effects/proxy.d.ts +5 -0
  54. package/dist/abilities/effects/proxy.js +60 -0
  55. package/dist/abilities/effects/proxy.js.map +1 -0
  56. package/dist/abilities/effects/sight.d.ts +2 -2
  57. package/dist/abilities/effects/sight.js +39 -0
  58. package/dist/abilities/effects/sight.js.map +1 -0
  59. package/dist/abilities/effects/spawn.d.ts +5 -2
  60. package/dist/abilities/effects/spawn.js +40 -0
  61. package/dist/abilities/effects/spawn.js.map +1 -0
  62. package/dist/abilities/effects/timed.d.ts +2 -2
  63. package/dist/abilities/effects/timed.js +96 -0
  64. package/dist/abilities/effects/timed.js.map +1 -0
  65. package/dist/abilities/effects/trade.d.ts +1 -1
  66. package/dist/abilities/effects/trade.js +25 -0
  67. package/dist/abilities/effects/trade.js.map +1 -0
  68. package/dist/abilities/effects.d.ts +97 -23
  69. package/dist/abilities/effects.js +860 -0
  70. package/dist/abilities/effects.js.map +1 -0
  71. package/dist/abilities/land.d.ts +38 -4
  72. package/dist/abilities/land.js +189 -0
  73. package/dist/abilities/land.js.map +1 -0
  74. package/dist/abilities/recast.d.ts +45 -0
  75. package/dist/abilities/recast.js +118 -0
  76. package/dist/abilities/recast.js.map +1 -0
  77. package/dist/abilities/scaled.js +40 -0
  78. package/dist/abilities/scaled.js.map +1 -0
  79. package/dist/abilities/screen.d.ts +6 -0
  80. package/dist/abilities/screen.js +83 -0
  81. package/dist/abilities/screen.js.map +1 -0
  82. package/dist/abilities/shapes.d.ts +66 -0
  83. package/dist/abilities/shapes.js +122 -0
  84. package/dist/abilities/shapes.js.map +1 -0
  85. package/dist/abilities/text.d.ts +14 -2
  86. package/dist/abilities/text.js +204 -0
  87. package/dist/abilities/text.js.map +1 -0
  88. package/dist/abilities/triggers.d.ts +98 -0
  89. package/dist/abilities/triggers.js +351 -0
  90. package/dist/abilities/triggers.js.map +1 -0
  91. package/dist/abilityChanges.d.ts +131 -0
  92. package/dist/abilityChanges.js +345 -0
  93. package/dist/abilityChanges.js.map +1 -0
  94. package/dist/ai/area.d.ts +4 -1
  95. package/dist/ai/brain.d.ts +4 -1
  96. package/dist/ai/brain.js +844 -0
  97. package/dist/ai/brain.js.map +1 -0
  98. package/dist/ai/budget.js +74 -0
  99. package/dist/ai/budget.js.map +1 -0
  100. package/dist/ai/checks.d.ts +9 -1
  101. package/dist/ai/checks.js +242 -0
  102. package/dist/ai/checks.js.map +1 -0
  103. package/dist/ai/computer.d.ts +11 -4
  104. package/dist/ai/computer.js +251 -0
  105. package/dist/ai/computer.js.map +1 -0
  106. package/dist/ai/defence.d.ts +4 -0
  107. package/dist/ai/defence.js +430 -0
  108. package/dist/ai/defence.js.map +1 -0
  109. package/dist/ai/define.d.ts +3 -2
  110. package/dist/ai/define.js +31 -0
  111. package/dist/ai/define.js.map +1 -0
  112. package/dist/ai/economy.d.ts +10 -7
  113. package/dist/ai/economy.js +780 -0
  114. package/dist/ai/economy.js.map +1 -0
  115. package/dist/ai/geometry.js +38 -0
  116. package/dist/ai/geometry.js.map +1 -0
  117. package/dist/ai/goals.d.ts +1 -0
  118. package/dist/ai/goals.js +560 -0
  119. package/dist/ai/goals.js.map +1 -0
  120. package/dist/ai/knowledge.d.ts +72 -7
  121. package/dist/ai/knowledge.js +804 -0
  122. package/dist/ai/knowledge.js.map +1 -0
  123. package/dist/ai/lanes.d.ts +10 -2
  124. package/dist/ai/lanes.js +715 -0
  125. package/dist/ai/lanes.js.map +1 -0
  126. package/dist/ai/melee/build.js +264 -0
  127. package/dist/ai/melee/build.js.map +1 -0
  128. package/dist/ai/melee/goals.d.ts +7 -0
  129. package/dist/ai/melee/goals.js +720 -0
  130. package/dist/ai/melee/goals.js.map +1 -0
  131. package/dist/ai/melee/heroes.js +68 -0
  132. package/dist/ai/melee/heroes.js.map +1 -0
  133. package/dist/ai/melee/index.d.ts +1 -1
  134. package/dist/ai/melee/index.js +51 -0
  135. package/dist/ai/melee/index.js.map +1 -0
  136. package/dist/ai/melee/production.js +29 -0
  137. package/dist/ai/melee/production.js.map +1 -0
  138. package/dist/ai/melee/surrender.js +64 -0
  139. package/dist/ai/melee/surrender.js.map +1 -0
  140. package/dist/ai/micro.d.ts +9 -0
  141. package/dist/ai/micro.js +1316 -0
  142. package/dist/ai/micro.js.map +1 -0
  143. package/dist/ai/mission.d.ts +9 -2
  144. package/dist/ai/mission.js +538 -0
  145. package/dist/ai/mission.js.map +1 -0
  146. package/dist/ai/missionRules.d.ts +1 -1
  147. package/dist/ai/missionRules.js +26 -0
  148. package/dist/ai/missionRules.js.map +1 -0
  149. package/dist/ai/module.d.ts +6 -2
  150. package/dist/ai/module.js +37 -0
  151. package/dist/ai/module.js.map +1 -0
  152. package/dist/ai/options.d.ts +3 -3
  153. package/dist/ai/plans/build.d.ts +20 -1
  154. package/dist/ai/plans/build.js +608 -0
  155. package/dist/ai/plans/build.js.map +1 -0
  156. package/dist/ai/plans/placement.d.ts +4 -1
  157. package/dist/ai/plans/placement.js +295 -0
  158. package/dist/ai/plans/placement.js.map +1 -0
  159. package/dist/ai/plans/plans.d.ts +9 -0
  160. package/dist/ai/plans/plans.js +110 -0
  161. package/dist/ai/plans/plans.js.map +1 -0
  162. package/dist/ai/plans/production.d.ts +14 -2
  163. package/dist/ai/plans/production.js +434 -0
  164. package/dist/ai/plans/production.js.map +1 -0
  165. package/dist/ai/plans/purse.d.ts +6 -3
  166. package/dist/ai/plans/purse.js +139 -0
  167. package/dist/ai/plans/purse.js.map +1 -0
  168. package/dist/ai/plans/tech.d.ts +6 -0
  169. package/dist/ai/plans/tech.js +122 -0
  170. package/dist/ai/plans/tech.js.map +1 -0
  171. package/dist/ai/profiles.d.ts +4 -4
  172. package/dist/{profiles-B3NS9jwk.js → ai/profiles.js} +3 -98
  173. package/dist/ai/profiles.js.map +1 -0
  174. package/dist/ai/reach.js +54 -0
  175. package/dist/ai/reach.js.map +1 -0
  176. package/dist/ai/report.d.ts +8 -0
  177. package/dist/ai/report.js +87 -0
  178. package/dist/ai/report.js.map +1 -0
  179. package/dist/ai/roles.d.ts +4 -0
  180. package/dist/ai/roles.js +207 -0
  181. package/dist/ai/roles.js.map +1 -0
  182. package/dist/ai/rules.d.ts +8 -2
  183. package/dist/ai/rules.js +416 -0
  184. package/dist/ai/rules.js.map +1 -0
  185. package/dist/ai/scouting.d.ts +6 -0
  186. package/dist/ai/scouting.js +324 -0
  187. package/dist/ai/scouting.js.map +1 -0
  188. package/dist/ai/settings.js +99 -0
  189. package/dist/ai/settings.js.map +1 -0
  190. package/dist/ai/squads.d.ts +21 -2
  191. package/dist/ai/squads.js +916 -0
  192. package/dist/ai/squads.js.map +1 -0
  193. package/dist/ai/strength.js +320 -0
  194. package/dist/ai/strength.js.map +1 -0
  195. package/dist/ai/task.d.ts +3 -1
  196. package/dist/ai/task.js +17 -0
  197. package/dist/ai/task.js.map +1 -0
  198. package/dist/ai/tasks/attack.js +24 -0
  199. package/dist/ai/tasks/attack.js.map +1 -0
  200. package/dist/ai/tasks/capture.d.ts +3 -3
  201. package/dist/ai/tasks/capture.js +37 -0
  202. package/dist/ai/tasks/capture.js.map +1 -0
  203. package/dist/ai/tasks/creep.js +29 -0
  204. package/dist/ai/tasks/creep.js.map +1 -0
  205. package/dist/ai/tasks/defend.js +61 -0
  206. package/dist/ai/tasks/defend.js.map +1 -0
  207. package/dist/ai/tasks/drop.js +81 -0
  208. package/dist/ai/tasks/drop.js.map +1 -0
  209. package/dist/ai/tasks/escort.js +59 -0
  210. package/dist/ai/tasks/escort.js.map +1 -0
  211. package/dist/ai/tasks/gather.js +48 -0
  212. package/dist/ai/tasks/gather.js.map +1 -0
  213. package/dist/ai/tasks/harass.js +39 -0
  214. package/dist/ai/tasks/harass.js.map +1 -0
  215. package/dist/ai/tasks/hold.js +32 -0
  216. package/dist/ai/tasks/hold.js.map +1 -0
  217. package/dist/ai/tasks/index.js +34 -0
  218. package/dist/ai/tasks/index.js.map +1 -0
  219. package/dist/ai/tasks/move.js +26 -0
  220. package/dist/ai/tasks/move.js.map +1 -0
  221. package/dist/ai/tasks/patrol.js +59 -0
  222. package/dist/ai/tasks/patrol.js.map +1 -0
  223. package/dist/ai/tasks/retreat.js +28 -0
  224. package/dist/ai/tasks/retreat.js.map +1 -0
  225. package/dist/ai/tasks/scout.js +73 -0
  226. package/dist/ai/tasks/scout.js.map +1 -0
  227. package/dist/ai/tasks/shared.d.ts +1 -1
  228. package/dist/ai/tasks/shared.js +137 -0
  229. package/dist/ai/tasks/shared.js.map +1 -0
  230. package/dist/ai/team.d.ts +18 -1
  231. package/dist/ai/team.js +492 -0
  232. package/dist/ai/team.js.map +1 -0
  233. package/dist/ai/threat.d.ts +6 -0
  234. package/dist/ai/threat.js +206 -0
  235. package/dist/ai/threat.js.map +1 -0
  236. package/dist/ai/view.d.ts +21 -7
  237. package/dist/ai/view.js +677 -0
  238. package/dist/ai/view.js.map +1 -0
  239. package/dist/ai/waves.d.ts +6 -0
  240. package/dist/ai/waves.js +410 -0
  241. package/dist/ai/waves.js.map +1 -0
  242. package/dist/ai.js +54 -6239
  243. package/dist/aiTesting.d.ts +6 -3
  244. package/dist/aiTesting.js +229 -0
  245. package/dist/aiTesting.js.map +1 -0
  246. package/dist/areas.d.ts +4 -1
  247. package/dist/areas.js +295 -0
  248. package/dist/areas.js.map +1 -0
  249. package/dist/attacks.d.ts +3 -3
  250. package/dist/attacks.js +127 -0
  251. package/dist/attacks.js.map +1 -0
  252. package/dist/burning.d.ts +267 -0
  253. package/dist/burning.js +795 -0
  254. package/dist/burning.js.map +1 -0
  255. package/dist/bytes.js +21 -0
  256. package/dist/bytes.js.map +1 -0
  257. package/dist/callings.d.ts +71 -0
  258. package/dist/callings.js +157 -0
  259. package/dist/callings.js.map +1 -0
  260. package/dist/cameraOrders.d.ts +78 -0
  261. package/dist/cameraOrders.js +114 -0
  262. package/dist/cameraOrders.js.map +1 -0
  263. package/dist/camps.d.ts +70 -4
  264. package/dist/camps.js +501 -0
  265. package/dist/camps.js.map +1 -0
  266. package/dist/capture.d.ts +15 -3
  267. package/dist/capture.js +304 -0
  268. package/dist/capture.js.map +1 -0
  269. package/dist/cellLayers.d.ts +78 -13
  270. package/dist/cellLayers.js +275 -0
  271. package/dist/cellLayers.js.map +1 -0
  272. package/dist/cellPatches.d.ts +24 -0
  273. package/dist/cellPatches.js +73 -0
  274. package/dist/cellPatches.js.map +1 -0
  275. package/dist/cinematics.d.ts +10 -5
  276. package/dist/cinematics.js +161 -0
  277. package/dist/cinematics.js.map +1 -0
  278. package/dist/clock.d.ts +2 -2
  279. package/dist/clock.js +78 -0
  280. package/dist/clock.js.map +1 -0
  281. package/dist/commands.d.ts +36 -4
  282. package/dist/commands.js +636 -0
  283. package/dist/commands.js.map +1 -0
  284. package/dist/components.d.ts +31 -10
  285. package/dist/components.js +74 -0
  286. package/dist/components.js.map +1 -0
  287. package/dist/computers.d.ts +4 -4
  288. package/dist/computers.js +194 -0
  289. package/dist/computers.js.map +1 -0
  290. package/dist/concealment.d.ts +25 -2
  291. package/dist/concealment.js +409 -0
  292. package/dist/concealment.js.map +1 -0
  293. package/dist/coreComponents.js +130 -0
  294. package/dist/coreComponents.js.map +1 -0
  295. package/dist/createGame.d.ts +306 -0
  296. package/dist/createGame.js +405 -0
  297. package/dist/createGame.js.map +1 -0
  298. package/dist/dashing.d.ts +18 -2
  299. package/dist/dashing.js +41 -0
  300. package/dist/dashing.js.map +1 -0
  301. package/dist/debug.d.ts +8 -0
  302. package/dist/debug.js +5 -3
  303. package/dist/debug2.js +76 -0
  304. package/dist/debug2.js.map +1 -0
  305. package/dist/debugCommands.d.ts +6 -6
  306. package/dist/debugCommands.js +537 -0
  307. package/dist/debugCommands.js.map +1 -0
  308. package/dist/debugging.d.ts +1 -0
  309. package/dist/defaultSets.d.ts +183 -0
  310. package/dist/defaultSets.js +216 -0
  311. package/dist/defaultSets.js.map +1 -0
  312. package/dist/definitions.d.ts +6 -0
  313. package/dist/definitions.js +78 -0
  314. package/dist/definitions.js.map +1 -0
  315. package/dist/defs.d.ts +1895 -165
  316. package/dist/defs.js +380 -0
  317. package/dist/defs.js.map +1 -0
  318. package/dist/denying.d.ts +4 -4
  319. package/dist/denying.js +106 -0
  320. package/dist/denying.js.map +1 -0
  321. package/dist/destructibles.d.ts +2 -2
  322. package/dist/destructibles.js +36 -0
  323. package/dist/destructibles.js.map +1 -0
  324. package/dist/determinism.d.ts +4 -4
  325. package/dist/determinism.js +247 -0
  326. package/dist/determinism.js.map +1 -0
  327. package/dist/dialog.d.ts +17 -2
  328. package/dist/dialog.js +108 -0
  329. package/dist/dialog.js.map +1 -0
  330. package/dist/effectRefs.js +28 -0
  331. package/dist/effectRefs.js.map +1 -0
  332. package/dist/effects.d.ts +27 -11
  333. package/dist/effects.js +110 -0
  334. package/dist/effects.js.map +1 -0
  335. package/dist/endings.d.ts +1 -1
  336. package/dist/endings.js +78 -0
  337. package/dist/endings.js.map +1 -0
  338. package/dist/engagement.d.ts +40 -6
  339. package/dist/engagement.js +530 -0
  340. package/dist/engagement.js.map +1 -0
  341. package/dist/engineEvents.d.ts +72 -9
  342. package/dist/engineEvents.js +520 -0
  343. package/dist/engineEvents.js.map +1 -0
  344. package/dist/entity.d.ts +275 -26
  345. package/dist/entity.js +441 -0
  346. package/dist/entity.js.map +1 -0
  347. package/dist/entityIndex.d.ts +10 -3
  348. package/dist/entityIndex.js +149 -0
  349. package/dist/entityIndex.js.map +1 -0
  350. package/dist/errors.d.ts +6 -2
  351. package/dist/errors.js +59 -0
  352. package/dist/errors.js.map +1 -0
  353. package/dist/events.d.ts +11 -5
  354. package/dist/events.js +158 -0
  355. package/dist/events.js.map +1 -0
  356. package/dist/exactMath.js +273 -0
  357. package/dist/exactMath.js.map +1 -0
  358. package/dist/features.d.ts +1 -1
  359. package/dist/features.js +127 -0
  360. package/dist/features.js.map +1 -0
  361. package/dist/fields.d.ts +25 -5
  362. package/dist/fields.js +140 -0
  363. package/dist/fields.js.map +1 -0
  364. package/dist/fixture.d.ts +3 -3
  365. package/dist/fixture.js +512 -0
  366. package/dist/fixture.js.map +1 -0
  367. package/dist/fog.d.ts +26 -3
  368. package/dist/fog.js +333 -0
  369. package/dist/fog.js.map +1 -0
  370. package/dist/foliage.d.ts +476 -0
  371. package/dist/foliage.js +1478 -0
  372. package/dist/foliage.js.map +1 -0
  373. package/dist/foliageDebug.d.ts +57 -0
  374. package/dist/foliageDebug.js +172 -0
  375. package/dist/foliageDebug.js.map +1 -0
  376. package/dist/foliageRegrowth.d.ts +20 -0
  377. package/dist/foliageRegrowth.js +332 -0
  378. package/dist/foliageRegrowth.js.map +1 -0
  379. package/dist/formState.d.ts +67 -0
  380. package/dist/formState.js +65 -0
  381. package/dist/formState.js.map +1 -0
  382. package/dist/formation.d.ts +46 -8
  383. package/dist/formation.js +297 -0
  384. package/dist/formation.js.map +1 -0
  385. package/dist/forms.d.ts +58 -0
  386. package/dist/forms.js +146 -0
  387. package/dist/forms.js.map +1 -0
  388. package/dist/friendlyFire.d.ts +2 -2
  389. package/dist/friendlyFire.js +37 -0
  390. package/dist/friendlyFire.js.map +1 -0
  391. package/dist/game.d.ts +141 -48
  392. package/dist/game.js +834 -0
  393. package/dist/game.js.map +1 -0
  394. package/dist/gameData.d.ts +96 -22
  395. package/dist/gameData.js +1690 -0
  396. package/dist/gameData.js.map +1 -0
  397. package/dist/gameFiles.d.ts +3 -3
  398. package/dist/gameFiles.js +14 -0
  399. package/dist/gameFiles.js.map +1 -0
  400. package/dist/gates.js +92 -0
  401. package/dist/gates.js.map +1 -0
  402. package/dist/generate.d.ts +28 -1
  403. package/dist/generate.js +1062 -0
  404. package/dist/generate.js.map +1 -0
  405. package/dist/generateWorker.d.ts +7 -3
  406. package/dist/generateWorker.js +86 -0
  407. package/dist/generateWorker.js.map +1 -0
  408. package/dist/grid.d.ts +9 -0
  409. package/dist/grid.js +102 -0
  410. package/dist/grid.js.map +1 -0
  411. package/dist/ground.d.ts +17 -1
  412. package/dist/ground.js +375 -0
  413. package/dist/ground.js.map +1 -0
  414. package/dist/groundObjects.d.ts +70 -0
  415. package/dist/groundObjects.js +371 -0
  416. package/dist/groundObjects.js.map +1 -0
  417. package/dist/groundSpeed.d.ts +20 -3
  418. package/dist/groundSpeed.js +117 -0
  419. package/dist/groundSpeed.js.map +1 -0
  420. package/dist/hero.d.ts +126 -10
  421. package/dist/hero.js +432 -0
  422. package/dist/hero.js.map +1 -0
  423. package/dist/holds.d.ts +94 -0
  424. package/dist/holds.js +305 -0
  425. package/dist/holds.js.map +1 -0
  426. package/dist/home.d.ts +1 -1
  427. package/dist/home.js +30 -0
  428. package/dist/home.js.map +1 -0
  429. package/dist/hooks.d.ts +339 -57
  430. package/dist/hooks.js +105 -0
  431. package/dist/hooks.js.map +1 -0
  432. package/dist/hotReload.d.ts +6 -5
  433. package/dist/hotReload.js +145 -0
  434. package/dist/hotReload.js.map +1 -0
  435. package/dist/ids.d.ts +3 -3
  436. package/dist/ids.js +30 -0
  437. package/dist/ids.js.map +1 -0
  438. package/dist/idsFile.d.ts +36 -0
  439. package/dist/idsFile.js +134 -0
  440. package/dist/idsFile.js.map +1 -0
  441. package/dist/index.d.ts +105 -68
  442. package/dist/index.js +194 -4701
  443. package/dist/inspect.d.ts +29 -2
  444. package/dist/{inspect-D9dWHmZ0.js → inspect.js} +21 -12
  445. package/dist/inspect.js.map +1 -0
  446. package/dist/inventory.d.ts +14 -1
  447. package/dist/inventory.js +84 -0
  448. package/dist/inventory.js.map +1 -0
  449. package/dist/items.d.ts +136 -8
  450. package/dist/items.js +585 -0
  451. package/dist/items.js.map +1 -0
  452. package/dist/lanes.d.ts +12 -3
  453. package/dist/lanes.js +496 -0
  454. package/dist/lanes.js.map +1 -0
  455. package/dist/life.d.ts +6 -2
  456. package/dist/life.js +287 -0
  457. package/dist/life.js.map +1 -0
  458. package/dist/log.d.ts +26 -3
  459. package/dist/log.js +192 -0
  460. package/dist/log.js.map +1 -0
  461. package/dist/manaBurn.d.ts +2 -2
  462. package/dist/manaBurn.js +75 -0
  463. package/dist/manaBurn.js.map +1 -0
  464. package/dist/map/file.d.ts +56 -3
  465. package/dist/map/file.js +264 -0
  466. package/dist/map/file.js.map +1 -0
  467. package/dist/map/images.js +61 -0
  468. package/dist/map/images.js.map +1 -0
  469. package/dist/map/look.d.ts +1 -1
  470. package/dist/map/look.js +30 -0
  471. package/dist/map/look.js.map +1 -0
  472. package/dist/map/pathProfile.js +183 -0
  473. package/dist/map/pathProfile.js.map +1 -0
  474. package/dist/map/resize.d.ts +4 -0
  475. package/dist/map/resize.js +136 -0
  476. package/dist/map/resize.js.map +1 -0
  477. package/dist/map/schema.js +257 -0
  478. package/dist/map/schema.js.map +1 -0
  479. package/dist/map/terrain.js +214 -0
  480. package/dist/map/terrain.js.map +1 -0
  481. package/dist/map/types.d.ts +92 -13
  482. package/dist/map/types.js +251 -0
  483. package/dist/map/types.js.map +1 -0
  484. package/dist/mapCheck/cells.js +94 -0
  485. package/dist/mapCheck/cells.js.map +1 -0
  486. package/dist/mapCheck/rules/foliage.d.ts +9 -0
  487. package/dist/mapCheck/rules/foliage.js +83 -0
  488. package/dist/mapCheck/rules/foliage.js.map +1 -0
  489. package/dist/mapCheck/rules/names.js +39 -0
  490. package/dist/mapCheck/rules/names.js.map +1 -0
  491. package/dist/mapCheck/rules/objects.d.ts +1 -1
  492. package/dist/mapCheck/rules/objects.js +56 -0
  493. package/dist/mapCheck/rules/objects.js.map +1 -0
  494. package/dist/mapCheck/rules/paths.js +32 -0
  495. package/dist/mapCheck/rules/paths.js.map +1 -0
  496. package/dist/mapCheck/rules/players.js +20 -0
  497. package/dist/mapCheck/rules/players.js.map +1 -0
  498. package/dist/mapCheck/rules/races.js +56 -0
  499. package/dist/mapCheck/rules/races.js.map +1 -0
  500. package/dist/mapCheck/rules/random.js +47 -0
  501. package/dist/mapCheck/rules/random.js.map +1 -0
  502. package/dist/mapCheck/rules/regions.js +30 -0
  503. package/dist/mapCheck/rules/regions.js.map +1 -0
  504. package/dist/mapCheck/rules/targets.js +31 -0
  505. package/dist/mapCheck/rules/targets.js.map +1 -0
  506. package/dist/mapCheck/rules/walking.js +45 -0
  507. package/dist/mapCheck/rules/walking.js.map +1 -0
  508. package/dist/mapCheck.d.ts +2 -2
  509. package/dist/mapCheck.js +63 -0
  510. package/dist/mapCheck.js.map +1 -0
  511. package/dist/mapFields.d.ts +25 -2
  512. package/dist/mapFields.js +134 -0
  513. package/dist/mapFields.js.map +1 -0
  514. package/dist/mapFile.js +176 -0
  515. package/dist/mapFile.js.map +1 -0
  516. package/dist/mapMeasure.d.ts +8 -0
  517. package/dist/mapMeasure.js +283 -0
  518. package/dist/mapMeasure.js.map +1 -0
  519. package/dist/mapMerge.d.ts +1 -0
  520. package/dist/mapMerge.js +172 -0
  521. package/dist/mapMerge.js.map +1 -0
  522. package/dist/mapObjectives.js +138 -0
  523. package/dist/mapObjectives.js.map +1 -0
  524. package/dist/mapObjects.js +80 -0
  525. package/dist/mapObjects.js.map +1 -0
  526. package/dist/math.d.ts +37 -7
  527. package/dist/math.js +155 -0
  528. package/dist/math.js.map +1 -0
  529. package/dist/messages.d.ts +71 -4
  530. package/dist/messages.js +29 -0
  531. package/dist/messages.js.map +1 -0
  532. package/dist/missionRules.d.ts +10 -2
  533. package/dist/{missionRules-C-bGxm0Q.js → missionRules.js} +30 -150
  534. package/dist/missionRules.js.map +1 -0
  535. package/dist/mods.d.ts +39 -20
  536. package/dist/mods.js +271 -0
  537. package/dist/mods.js.map +1 -0
  538. package/dist/moves.d.ts +87 -0
  539. package/dist/moves.js +539 -0
  540. package/dist/moves.js.map +1 -0
  541. package/dist/names.d.ts +7 -0
  542. package/dist/names.js +122 -0
  543. package/dist/names.js.map +1 -0
  544. package/dist/navigation/agentParams.js +14 -0
  545. package/dist/navigation/agentParams.js.map +1 -0
  546. package/dist/navigation/air.d.ts +7 -3
  547. package/dist/navigation/air.js +401 -0
  548. package/dist/navigation/air.js.map +1 -0
  549. package/dist/navigation/builds.d.ts +34 -2
  550. package/dist/navigation/builds.js +287 -0
  551. package/dist/navigation/builds.js.map +1 -0
  552. package/dist/navigation/groundAreas.d.ts +59 -1
  553. package/dist/navigation/groundAreas.js +407 -0
  554. package/dist/navigation/groundAreas.js.map +1 -0
  555. package/dist/navigation/navigation.d.ts +98 -9
  556. package/dist/navigation/recast.d.ts +194 -18
  557. package/dist/navigation/recast.js +1379 -0
  558. package/dist/navigation/recast.js.map +1 -0
  559. package/dist/navigation/sidePaths.d.ts +8 -3
  560. package/dist/navigation/sidePaths.js +241 -0
  561. package/dist/navigation/sidePaths.js.map +1 -0
  562. package/dist/navigation/sized.js +243 -0
  563. package/dist/navigation/sized.js.map +1 -0
  564. package/dist/nearest.js +32 -0
  565. package/dist/nearest.js.map +1 -0
  566. package/dist/noise.js +59 -0
  567. package/dist/noise.js.map +1 -0
  568. package/dist/objectives.d.ts +12 -3
  569. package/dist/objectives.js +144 -0
  570. package/dist/objectives.js.map +1 -0
  571. package/dist/orders/basic.d.ts +5 -5
  572. package/dist/orders/basic.js +417 -0
  573. package/dist/orders/basic.js.map +1 -0
  574. package/dist/orders/build.js +278 -0
  575. package/dist/orders/build.js.map +1 -0
  576. package/dist/orders/cast.d.ts +13 -3
  577. package/dist/orders/cast.js +558 -0
  578. package/dist/orders/cast.js.map +1 -0
  579. package/dist/orders/facts.js +16 -0
  580. package/dist/orders/facts.js.map +1 -0
  581. package/dist/orders/harvest.d.ts +21 -5
  582. package/dist/orders/harvest.js +540 -0
  583. package/dist/orders/harvest.js.map +1 -0
  584. package/dist/orders/idle.d.ts +3 -1
  585. package/dist/orders/idle.js +234 -0
  586. package/dist/orders/idle.js.map +1 -0
  587. package/dist/orders/items.js +92 -0
  588. package/dist/orders/items.js.map +1 -0
  589. package/dist/orders/queue.js +108 -0
  590. package/dist/orders/queue.js.map +1 -0
  591. package/dist/orders/waiting.d.ts +39 -0
  592. package/dist/orders/waiting.js +149 -0
  593. package/dist/orders/waiting.js.map +1 -0
  594. package/dist/pack.schema.js +13 -0
  595. package/dist/pack.schema.js.map +1 -0
  596. package/dist/pack.schema.json +7622 -841
  597. package/dist/packs/director/index.d.ts +13 -5
  598. package/dist/packs/director/index.js +204 -0
  599. package/dist/packs/director/index.js.map +1 -0
  600. package/dist/packs/heroes/campaign.d.ts +3 -2
  601. package/dist/packs/heroes/campaign.js +241 -0
  602. package/dist/packs/heroes/campaign.js.map +1 -0
  603. package/dist/packs/heroes/carry.d.ts +6 -0
  604. package/dist/packs/heroes/carry.js +112 -0
  605. package/dist/packs/heroes/carry.js.map +1 -0
  606. package/dist/packs/heroes/commands.js +115 -0
  607. package/dist/packs/heroes/commands.js.map +1 -0
  608. package/dist/packs/heroes/fallen.d.ts +43 -0
  609. package/dist/packs/heroes/fallen.js +61 -0
  610. package/dist/packs/heroes/fallen.js.map +1 -0
  611. package/dist/packs/heroes/hire.js +60 -0
  612. package/dist/packs/heroes/hire.js.map +1 -0
  613. package/dist/packs/heroes/index.d.ts +7 -6
  614. package/dist/packs/heroes/index.js +130 -0
  615. package/dist/packs/heroes/index.js.map +1 -0
  616. package/dist/packs/heroes/loop.d.ts +95 -0
  617. package/dist/packs/heroes/loop.js +250 -0
  618. package/dist/packs/heroes/loop.js.map +1 -0
  619. package/dist/packs/heroes/making.d.ts +6 -3
  620. package/dist/packs/heroes/making.js +55 -0
  621. package/dist/packs/heroes/making.js.map +1 -0
  622. package/dist/packs/heroes/respawn.d.ts +3 -3
  623. package/dist/packs/heroes/respawn.js +87 -0
  624. package/dist/packs/heroes/respawn.js.map +1 -0
  625. package/dist/packs/heroes/sets.d.ts +32 -0
  626. package/dist/packs/heroes/sets.js +51 -0
  627. package/dist/packs/heroes/sets.js.map +1 -0
  628. package/dist/packs/heroes/spells.d.ts +16 -0
  629. package/dist/packs/heroes/spells.js +269 -0
  630. package/dist/packs/heroes/spells.js.map +1 -0
  631. package/dist/packs/items/defaults.d.ts +43 -0
  632. package/dist/packs/items/defaults.js +1504 -0
  633. package/dist/packs/items/defaults.js.map +1 -0
  634. package/dist/packs/items/index.d.ts +27 -0
  635. package/dist/packs/items/index.js +214 -0
  636. package/dist/packs/items/index.js.map +1 -0
  637. package/dist/packs/moba/index.d.ts +3 -3
  638. package/dist/packs/moba/index.js +174 -0
  639. package/dist/packs/moba/index.js.map +1 -0
  640. package/dist/packs/pack.d.ts +15 -15
  641. package/dist/packs/pack.js +14 -0
  642. package/dist/packs/pack.js.map +1 -0
  643. package/dist/packs.d.ts +15 -7
  644. package/dist/packs.js +222 -0
  645. package/dist/packs.js.map +1 -0
  646. package/dist/paths.d.ts +2 -0
  647. package/dist/paths.js +109 -0
  648. package/dist/paths.js.map +1 -0
  649. package/dist/plain.js +57 -0
  650. package/dist/plain.js.map +1 -0
  651. package/dist/player.d.ts +33 -10
  652. package/dist/player.js +159 -0
  653. package/dist/player.js.map +1 -0
  654. package/dist/portals.d.ts +1 -1
  655. package/dist/portals.js +194 -0
  656. package/dist/portals.js.map +1 -0
  657. package/dist/prefabs.d.ts +25 -2
  658. package/dist/prefabs.js +239 -0
  659. package/dist/prefabs.js.map +1 -0
  660. package/dist/presetBuildings.js +58 -0
  661. package/dist/presetBuildings.js.map +1 -0
  662. package/dist/presetFoliage.d.ts +27 -0
  663. package/dist/presetFoliage.js +98 -0
  664. package/dist/presetFoliage.js.map +1 -0
  665. package/dist/presetGround.js +65 -0
  666. package/dist/presetGround.js.map +1 -0
  667. package/dist/proxies.d.ts +12 -0
  668. package/dist/proxies.js +79 -0
  669. package/dist/proxies.js.map +1 -0
  670. package/dist/query.d.ts +56 -0
  671. package/dist/query.js +88 -0
  672. package/dist/query.js.map +1 -0
  673. package/dist/races.d.ts +15 -14
  674. package/dist/races.js +172 -0
  675. package/dist/races.js.map +1 -0
  676. package/dist/randomGroups.js +91 -0
  677. package/dist/randomGroups.js.map +1 -0
  678. package/dist/registry.d.ts +117 -53
  679. package/dist/registry.js +323 -0
  680. package/dist/registry.js.map +1 -0
  681. package/dist/remains.d.ts +11 -9
  682. package/dist/remains.js +188 -0
  683. package/dist/remains.js.map +1 -0
  684. package/dist/replication.d.ts +12 -7
  685. package/dist/replication.js +100 -0
  686. package/dist/replication.js.map +1 -0
  687. package/dist/rng.d.ts +2 -0
  688. package/dist/rng.js +40 -0
  689. package/dist/rng.js.map +1 -0
  690. package/dist/rules.d.ts +186 -99
  691. package/dist/rules.js +179 -0
  692. package/dist/rules.js.map +1 -0
  693. package/dist/rulesCheck.d.ts +5 -4
  694. package/dist/rulesCheck.js +693 -0
  695. package/dist/rulesCheck.js.map +1 -0
  696. package/dist/runes.d.ts +2 -2
  697. package/dist/runes.js +80 -0
  698. package/dist/runes.js.map +1 -0
  699. package/dist/save.d.ts +37 -12
  700. package/dist/save.js +532 -0
  701. package/dist/save.js.map +1 -0
  702. package/dist/scenario.d.ts +2 -2
  703. package/dist/scenario.js +99 -0
  704. package/dist/scenario.js.map +1 -0
  705. package/dist/scheduler.d.ts +3 -0
  706. package/dist/scheduler.js +156 -0
  707. package/dist/scheduler.js.map +1 -0
  708. package/dist/score.d.ts +19 -19
  709. package/dist/score.js +709 -0
  710. package/dist/score.js.map +1 -0
  711. package/dist/sequences.d.ts +10 -6
  712. package/dist/sequences.js +206 -0
  713. package/dist/sequences.js.map +1 -0
  714. package/dist/server/doorman.js +154 -0
  715. package/dist/server/doorman.js.map +1 -0
  716. package/dist/server/gameServer.d.ts +16 -1
  717. package/dist/server/gameServer.js +643 -0
  718. package/dist/server/gameServer.js.map +1 -0
  719. package/dist/server/index.d.ts +1 -1
  720. package/dist/server/lobby.js +199 -0
  721. package/dist/server/lobby.js.map +1 -0
  722. package/dist/server/log.js +18 -0
  723. package/dist/server/log.js.map +1 -0
  724. package/dist/server/match.js +267 -0
  725. package/dist/server/match.js.map +1 -0
  726. package/dist/server/mode.d.ts +18 -9
  727. package/dist/server/mode.js +220 -0
  728. package/dist/server/mode.js.map +1 -0
  729. package/dist/{navigation-worker.js → server/navigation-worker.js} +1 -1
  730. package/dist/server/navigation-worker.js.map +1 -0
  731. package/dist/server/navigation.js +39 -0
  732. package/dist/server/navigation.js.map +1 -0
  733. package/dist/server/ops.d.ts +4 -0
  734. package/dist/server/ops.js +137 -0
  735. package/dist/server/ops.js.map +1 -0
  736. package/dist/server/packs.d.ts +3 -3
  737. package/dist/server/packs.js +32 -0
  738. package/dist/server/packs.js.map +1 -0
  739. package/dist/server/ratings.d.ts +5 -0
  740. package/dist/server/ratings.js +104 -0
  741. package/dist/server/ratings.js.map +1 -0
  742. package/dist/server/relay.d.ts +12 -2
  743. package/dist/server/relay.js +144 -0
  744. package/dist/server/relay.js.map +1 -0
  745. package/dist/server/rooms.d.ts +9 -2
  746. package/dist/server/rooms.js +442 -0
  747. package/dist/server/rooms.js.map +1 -0
  748. package/dist/server/seat.js +116 -0
  749. package/dist/server/seat.js.map +1 -0
  750. package/dist/server/seatSettings.d.ts +3 -3
  751. package/dist/server/seatSettings.js +63 -0
  752. package/dist/server/seatSettings.js.map +1 -0
  753. package/dist/server/secret.js +13 -0
  754. package/dist/server/secret.js.map +1 -0
  755. package/dist/server/start.d.ts +13 -6
  756. package/dist/server/start.js +76 -0
  757. package/dist/server/start.js.map +1 -0
  758. package/dist/server/websocket.d.ts +9 -1
  759. package/dist/server/websocket.js +306 -0
  760. package/dist/server/websocket.js.map +1 -0
  761. package/dist/server.js +15 -2861
  762. package/dist/session/can.js +26 -0
  763. package/dist/session/can.js.map +1 -0
  764. package/dist/session/commandReplay.d.ts +8 -2
  765. package/dist/session/commandReplay.js +293 -0
  766. package/dist/session/commandReplay.js.map +1 -0
  767. package/dist/session/debug.js +151 -0
  768. package/dist/session/debug.js.map +1 -0
  769. package/dist/session/delay.js +62 -0
  770. package/dist/session/delay.js.map +1 -0
  771. package/dist/session/delta.d.ts +14 -1
  772. package/dist/session/delta.js +407 -0
  773. package/dist/session/delta.js.map +1 -0
  774. package/dist/session/entityState.js +415 -0
  775. package/dist/session/entityState.js.map +1 -0
  776. package/dist/session/local.d.ts +47 -5
  777. package/dist/session/local.js +670 -0
  778. package/dist/session/local.js.map +1 -0
  779. package/dist/session/memory.d.ts +20 -2
  780. package/dist/session/memory.js +131 -0
  781. package/dist/session/memory.js.map +1 -0
  782. package/dist/session/protocol.d.ts +325 -31
  783. package/dist/session/protocol.js +55 -0
  784. package/dist/session/protocol.js.map +1 -0
  785. package/dist/session/remote.d.ts +74 -12
  786. package/dist/session/remote.js +1394 -0
  787. package/dist/session/remote.js.map +1 -0
  788. package/dist/session/replay.d.ts +11 -2
  789. package/dist/session/replay.js +160 -0
  790. package/dist/session/replay.js.map +1 -0
  791. package/dist/session/seed.js +12 -0
  792. package/dist/session/seed.js.map +1 -0
  793. package/dist/session/share.d.ts +5 -1
  794. package/dist/session/share.js +94 -0
  795. package/dist/session/share.js.map +1 -0
  796. package/dist/session/socket.d.ts +1 -1
  797. package/dist/session/socket.js +29 -0
  798. package/dist/session/socket.js.map +1 -0
  799. package/dist/session/wire.d.ts +5 -0
  800. package/dist/session/wire.js +84 -0
  801. package/dist/session/wire.js.map +1 -0
  802. package/dist/session/worker.d.ts +77 -12
  803. package/dist/session/worker.js +499 -0
  804. package/dist/session/worker.js.map +1 -0
  805. package/dist/shared.d.ts +31 -5
  806. package/dist/shared.js +166 -0
  807. package/dist/shared.js.map +1 -0
  808. package/dist/sides.d.ts +9 -3
  809. package/dist/sides.js +149 -0
  810. package/dist/sides.js.map +1 -0
  811. package/dist/sight.js +85 -0
  812. package/dist/sight.js.map +1 -0
  813. package/dist/simulate-worker.js +1 -1
  814. package/dist/simulate.d.ts +12 -8
  815. package/dist/{simulate-oXBiw1Ff.js → simulate.js} +10 -11
  816. package/dist/simulate.js.map +1 -0
  817. package/dist/smart.js +77 -0
  818. package/dist/smart.js.map +1 -0
  819. package/dist/spatial.d.ts +32 -16
  820. package/dist/spatial.js +234 -0
  821. package/dist/spatial.js.map +1 -0
  822. package/dist/spawning.d.ts +1 -0
  823. package/dist/spawning.js +224 -0
  824. package/dist/spawning.js.map +1 -0
  825. package/dist/stances.d.ts +6 -3
  826. package/dist/stances.js +169 -0
  827. package/dist/stances.js.map +1 -0
  828. package/dist/start.d.ts +10 -10
  829. package/dist/start.js +75 -0
  830. package/dist/start.js.map +1 -0
  831. package/dist/stats.d.ts +42 -16
  832. package/dist/stats.js +290 -0
  833. package/dist/stats.js.map +1 -0
  834. package/dist/summoned.d.ts +52 -0
  835. package/dist/summoned.js +38 -0
  836. package/dist/summoned.js.map +1 -0
  837. package/dist/summons.d.ts +10 -13
  838. package/dist/summons.js +271 -0
  839. package/dist/summons.js.map +1 -0
  840. package/dist/systems/abilities.js +224 -0
  841. package/dist/systems/abilities.js.map +1 -0
  842. package/dist/systems/combat.d.ts +35 -1
  843. package/dist/systems/combat.js +677 -0
  844. package/dist/systems/combat.js.map +1 -0
  845. package/dist/systems/combatTold.d.ts +3 -1
  846. package/dist/systems/combatTold.js +85 -0
  847. package/dist/systems/combatTold.js.map +1 -0
  848. package/dist/systems/construction.js +80 -0
  849. package/dist/systems/construction.js.map +1 -0
  850. package/dist/systems/economy.d.ts +0 -6
  851. package/dist/systems/economy.js +128 -0
  852. package/dist/systems/economy.js.map +1 -0
  853. package/dist/systems/fog.d.ts +1 -1
  854. package/dist/systems/fog.js +120 -0
  855. package/dist/systems/fog.js.map +1 -0
  856. package/dist/systems/life.js +32 -0
  857. package/dist/systems/life.js.map +1 -0
  858. package/dist/systems/movement.d.ts +24 -12
  859. package/dist/systems/movement.js +1247 -0
  860. package/dist/systems/movement.js.map +1 -0
  861. package/dist/systems/orders.js +64 -0
  862. package/dist/systems/orders.js.map +1 -0
  863. package/dist/systems/production.js +322 -0
  864. package/dist/systems/production.js.map +1 -0
  865. package/dist/systems/productionQueue.js +120 -0
  866. package/dist/systems/productionQueue.js.map +1 -0
  867. package/dist/systems/victory.d.ts +1 -1
  868. package/dist/systems/victory.js +56 -0
  869. package/dist/systems/victory.js.map +1 -0
  870. package/dist/talk.d.ts +6 -6
  871. package/dist/talk.js +153 -0
  872. package/dist/talk.js.map +1 -0
  873. package/dist/targeting.d.ts +142 -0
  874. package/dist/targeting.js +49 -0
  875. package/dist/targeting.js.map +1 -0
  876. package/dist/tech.d.ts +20 -3
  877. package/dist/tech.js +239 -0
  878. package/dist/tech.js.map +1 -0
  879. package/dist/techTree.d.ts +7 -0
  880. package/dist/techTree.js +90 -0
  881. package/dist/techTree.js.map +1 -0
  882. package/dist/terrain.d.ts +59 -7
  883. package/dist/terrain.js +389 -0
  884. package/dist/terrain.js.map +1 -0
  885. package/dist/terrainSave.d.ts +6 -0
  886. package/dist/terrainSave.js +74 -0
  887. package/dist/terrainSave.js.map +1 -0
  888. package/dist/testing.d.ts +8 -7
  889. package/dist/testing.js +13 -739
  890. package/dist/testing.js.map +1 -1
  891. package/dist/tiles.d.ts +1 -1
  892. package/dist/tiles.js +43 -0
  893. package/dist/tiles.js.map +1 -0
  894. package/dist/timers.d.ts +29 -4
  895. package/dist/timers.js +242 -0
  896. package/dist/timers.js.map +1 -0
  897. package/dist/tomes.d.ts +4 -4
  898. package/dist/tomes.js +94 -0
  899. package/dist/tomes.js.map +1 -0
  900. package/dist/trade.js +103 -0
  901. package/dist/trade.js.map +1 -0
  902. package/dist/transport.d.ts +6 -1
  903. package/dist/transport.js +281 -0
  904. package/dist/transport.js.map +1 -0
  905. package/dist/tunables.d.ts +10 -3
  906. package/dist/tunables.js +56 -0
  907. package/dist/tunables.js.map +1 -0
  908. package/dist/unitResources.d.ts +67 -0
  909. package/dist/unitResources.js +266 -0
  910. package/dist/unitResources.js.map +1 -0
  911. package/dist/upkeep.d.ts +6 -1
  912. package/dist/upkeep.js +26 -0
  913. package/dist/upkeep.js.map +1 -0
  914. package/dist/veterancy.d.ts +8 -3
  915. package/dist/veterancy.js +131 -0
  916. package/dist/veterancy.js.map +1 -0
  917. package/dist/vision.d.ts +36 -0
  918. package/dist/vision.js +133 -0
  919. package/dist/vision.js.map +1 -0
  920. package/dist/walls.d.ts +1 -1
  921. package/dist/walls.js +278 -0
  922. package/dist/walls.js.map +1 -0
  923. package/dist/world.d.ts +606 -88
  924. package/dist/world.js +1263 -0
  925. package/dist/world.js.map +1 -0
  926. package/package.json +2 -2
  927. package/dist/ai.js.map +0 -1
  928. package/dist/attributes.d.ts +0 -66
  929. package/dist/brain-BvVdUhX8.js +0 -7659
  930. package/dist/brain-BvVdUhX8.js.map +0 -1
  931. package/dist/builds-C6LfgvEU.js +0 -460
  932. package/dist/builds-C6LfgvEU.js.map +0 -1
  933. package/dist/coreComponents-syuh2fPG.js +0 -5149
  934. package/dist/coreComponents-syuh2fPG.js.map +0 -1
  935. package/dist/debugCommands-CzjrSm66.js +0 -14739
  936. package/dist/debugCommands-CzjrSm66.js.map +0 -1
  937. package/dist/determinism-BCymQwiE.js +0 -518
  938. package/dist/determinism-BCymQwiE.js.map +0 -1
  939. package/dist/game-DiJEN-Ks.js +0 -5800
  940. package/dist/game-DiJEN-Ks.js.map +0 -1
  941. package/dist/index.js.map +0 -1
  942. package/dist/inspect-D9dWHmZ0.js.map +0 -1
  943. package/dist/local-Dkovq42k.js +0 -1379
  944. package/dist/local-Dkovq42k.js.map +0 -1
  945. package/dist/missionRules-C-bGxm0Q.js.map +0 -1
  946. package/dist/navigation-worker.js.map +0 -1
  947. package/dist/packs-g5thvmGn.js +0 -3199
  948. package/dist/packs-g5thvmGn.js.map +0 -1
  949. package/dist/profiles-B3NS9jwk.js.map +0 -1
  950. package/dist/server.js.map +0 -1
  951. package/dist/simulate-oXBiw1Ff.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gameServer.js","names":[],"sources":["../../src/server/gameServer.ts"],"sourcesContent":["import type { Ratings } from './ratings'\nimport { type LobbyPlayerMessage, type LobbyServerMessage, readPlayerMessage } from '../session/wire'\nimport { delayed } from '../session/delay'\nimport type { GameListing } from '#engine/session/protocol'\nimport type { Logger } from '#engine/log'\nimport type { NavigationBuilds } from '#engine/navigation/builds'\nimport { nodeNavigationBuilder } from './navigation'\nimport { type ServerLog, serverLogger } from './log'\nimport type { PlayerId } from '#engine/entity'\nimport type { RejectedKind } from '#engine/errors'\nimport type { GameResult, ServerHooks, ServerSeat } from '#engine/game'\nimport { isFiniteNumber, PROTOCOL_VERSION } from '#engine/session/protocol'\nimport type { SessionHost, Transport } from '#engine/session/remote'\nimport type { World } from '#engine/world'\nimport { engineMessage, type Message } from '#engine/messages'\nimport { type Door, Doorman, type Join } from './doorman'\nimport type { Seat } from './seat'\nimport { Lobby } from './lobby'\nimport { Match } from './match'\nimport type { GameMode } from './mode'\nimport { answerOps, type ServerHttpOptions, type ServerMetrics } from './ops'\nimport { sameSecret } from './secret'\nimport { type Connection, type ConnectionSource, startSocketServer } from './websocket'\n\n/*\n * A game server: a lobby, then a game, then its result, and the lobby again. Players connect over WebSockets and\n * join (`join`); they take the mode's seats in order, or the seat they had when they come back with its token. Once\n * every seat for a player is taken (or a seated player says `start`), the world is made, the computer takes the seats\n * it was given and those left empty, and everyone gets the game as a `SessionHost` sends it. Those who come after\n * the seats are taken watch, from the first player's side. In the lobby a player moves to another free seat (`sit`),\n * changes their name (`name`) and says they are ready (`ready`): once every player seated is, the game starts\n */\n\n/**\n * What a `GameServer` is made with: the mode it runs, the port, which seats the computer plays and the limits and hooks of the server\n *\n * @beta\n */\nexport interface GameServerOptions {\n\t/** The game the server runs: its rules, its seats and how the world of each game is made */\n\tmode: GameMode\n\t/** Port to listen on: 0 for any free one */\n\tport: number\n\t/** Seats the computer plays, whoever joins */\n\tai?: PlayerId[]\n\t/**\n\t * Where ratings are kept (`Ratings`, `createRatings`): the players' shown in the lobby and the list of games, and\n\t * moved by every game that ends. A player is who brings the same key (`join`'s `who`), or the `seat` hook's `id`\n\t */\n\tratings?: Ratings\n\t/**\n\t * The game's settings it starts with (`ServerHooks.settings`), in place of their defaults: the map a room was made\n\t * for. Only those the game offers, with a value it offers\n\t */\n\tsettings?: Record<string, string>\n\t/** Starts once every seat for a player is taken, without anyone saying so. Yes when left out */\n\tautoStart?: boolean\n\t/** What `admin` messages must carry: no admin without */\n\tadminKey?: string\n\t/** Where results are kept as files, when the game has no `saveResult` of its own. Kept nowhere without */\n\tresultsDir?: string\n\t/** Commands a second a connection may send, and how many at once: what is over the limit is dropped, and answered refused. 30 and 60 */\n\trate?: { perSecond: number; burst: number }\n\t/**\n\t * Messages a second a connection may send besides its commands (`rate`), and how many at once: what is over is\n\t * dropped, unanswered. A player's screen says it got what it was sent `sendRate` times a second, pings every two\n\t * seconds and asks for the ground a part at a time. 100 and 200 when left out\n\t *\n\t * @beta\n\t */\n\tmessageRate?: { perSecond: number; burst: number }\n\t/**\n\t * The lobby's messages a second a connection may send, and how many at once: a join, a seat, a name, a setting,\n\t * ready, start, an admin's word. Each is told to everyone (and an admin's key tried): what is over is dropped. 4 and\n\t * 20 when left out\n\t *\n\t * @beta\n\t */\n\tlobbyRate?: { perSecond: number; burst: number }\n\t/** How many times a second the server sends a player's screen what happened; see `messageRate` for the limit this implies */\n\tsendRate?: number\n\t/** Whether the seated players may use the debug tools (`debug.*` commands): for a game to try things out in. No when left out */\n\tdebug?: boolean\n\t/** Whether to compress what goes to players whose browsers can take it (`permessage-deflate`). Yes when left out */\n\tcompress?: boolean\n\t/**\n\t * Whether those who come once the seats are taken, or who ask to, may watch: they see everything, the whole map\n\t * without fog and every player's resources, so a player who could watch on the side would know all the other\n\t * side does. No when left out. `{ key }` lets in who brings the key (`join`'s `key`); a function decides for each\n\t * who asks\n\t */\n\twatch?: boolean | { key: string } | ((request: WatchRequest) => boolean)\n\t/**\n\t * Seconds who watches a game being played sees it behind (`delayed`): so that a watcher cannot tell a side where the\n\t * other is now. None when left out\n\t */\n\twatchDelay?: number\n\t/**\n\t * Who sits where, decided for each who joins: for a login, a matchmaker's ticket, a seat a lobby gave, a name\n\t * checked. It gets who asks (`SeatRequest`: their address, name, the ticket they brought and the seats free) and\n\t * answers a seat, the name to use and who they are, or a refusal with a reason; it may be asynchronous, to ask a\n\t * login service. Without, the first free seat, by the name sent. One who comes back with their seat's token takes it\n\t * again without being asked about. Watching is still `watch`'s\n\t */\n\tseat?: (request: SeatRequest) => SeatAnswer | Promise<SeatAnswer>\n\t/**\n\t * What becomes of a player whose client sends what an honest one never does (`commandRejected`: a command not what\n\t * it says it is, another player's unit, a unit there never was): each is counted by seat and said in the log, and\n\t * this decides, from who it is, why and how many: `ignore`, `warn` (said in the log as a warning), `kick` (let go,\n\t * their token and id no good any more) or `end` (the game ends, with no winner). Without, a warning each time, and a\n\t * kick once there are `cheating.kickAfter` within `cheating.seconds`\n\t */\n\tonCheat?: (report: CheatReport) => CheatAnswer | void\n\t/** How many refusals in how many seconds the server kicks after when there is no `onCheat`, and `CheatReport.recent` counts over. 20 in 10 */\n\tcheating?: { kickAfter?: number; seconds?: number }\n\t/** Seconds between two lines of where the host's time goes, while a game runs: none without */\n\tstats?: number\n\t/**\n\t * Whether the navigations of its worlds are built in a worker thread (S37), so that a world being made does not\n\t * hold up the ticks of the games already running: yes when left out, where the engine is built (in this\n\t * repository, which runs it as it is written, they are built on the server's thread). Handed to the mode's worlds\n\t * (`GameMode.makeWorld`'s `context.navigation`): a mode of its own passes it on\n\t */\n\tnavigationWorker?: boolean\n\t/**\n\t * Seconds a game goes on once every player has left it, for one of them to come back with their token: then it ends,\n\t * with no winner, and the server goes back to its lobby. 60 when left out; 0 ends it at once, `Infinity` never. A game\n\t * may end itself sooner or later its own way (`ServerHooks.onPlayerLeave`, `world.winner`)\n\t */\n\tabandonAfter?: number\n\t/** Seconds of the game a player may go without saying it got what it was sent, before it is let go (`SessionHostOptions.dropSilentAfter`) */\n\tdropSilentAfter?: number\n\t/** Bytes of what is kept for each player to make a delta against, at most (`SessionHostOptions.keptBytes`): 8 MB when left out */\n\tkeptBytes?: number\n\t/** Seconds a connection may say nothing, pings unanswered, before it is closed (`SocketServerOptions.idleTimeout`) */\n\tidleTimeout?: number\n\t/** Bytes waiting to go out to a connection, at most, before it is closed (`SocketServerOptions.maxBuffered`) */\n\tmaxBuffered?: number\n\t/**\n\t * Connections open at once, at most (`SocketServerOptions.maxConnections`): one more is turned away before it is a\n\t * WebSocket. 1024 when left out\n\t *\n\t * @beta\n\t */\n\tmaxConnections?: number\n\t/**\n\t * Seconds a connection has to join (`join`) before it is closed: one that never does is told nothing of the lobby\n\t * meanwhile, and would be kept for good, as a browser answers the pings that let go of those gone (RV38). 10 when\n\t * left out; `Infinity` waits for ever\n\t *\n\t * @beta\n\t */\n\tjoinWithin?: number\n\t/**\n\t * Where the server says what it does (seats, games, slow ticks, what went wrong), and its games with it: a logger\n\t * (`Logger`), whose entries say what they are about by name, or a function that takes each as a line of text.\n\t * Warnings and errors go to the root logger when left out\n\t */\n\tlog?: ServerLog\n\t/**\n\t * The addresses on its HTTP server besides the sockets: one that says whether it is well (`/health`) and one with\n\t * its numbers (`/metrics`), each to move or leave out, and a key the numbers take. See `ServerHttpOptions`\n\t */\n\thttp?: ServerHttpOptions\n}\n\n/**\n * Who asks to watch a game (`GameServerOptions.watch`)\n *\n * @beta\n */\nexport interface WatchRequest {\n\t/** The address they connect from */\n\taddress: string\n\t/** The name they gave */\n\tname?: string\n\t/** The key they brought */\n\tkey?: string\n\t/** Whether a seat is held from the same address: a player who would watch their own game from the side */\n\tseated: boolean\n\t/** The server's phase when the request came: lobby, game or ended */\n\tphase: GameServer['phase']\n}\n\n/**\n * A player whose client sent what an honest one never does (`GameServerOptions.onCheat`)\n *\n * @beta\n */\nexport interface CheatReport {\n\t/** The seat of the player who sent it */\n\tseat: ServerSeat\n\t/** The address they connect from */\n\taddress?: string\n\t/** Why it was turned away (`commandRejected`'s kind), in words (its reason), and the command's type when it is known */\n\tkind: RejectedKind\n\t/** Why it was turned away, in words */\n\treason: string\n\t/** The type of the command that was turned away, when it is known */\n\ttype?: string\n\t/** How many there were within `cheating.seconds`, this one with them, and in the whole game */\n\trecent: number\n\t/** How many there were in the whole game */\n\ttotal: number\n}\n\n/**\n * What the server does about it (`GameServerOptions.onCheat`): nothing, a warning in the log, let them go, or end the game\n *\n * @beta\n */\nexport type CheatAnswer = 'ignore' | 'warn' | 'kick' | 'end'\n\n/**\n * Who asks for a seat (`GameServerOptions.seat`)\n *\n * @beta\n */\nexport interface SeatRequest {\n\t/** The address they connect from */\n\taddress: string\n\t/** The name they gave */\n\tname?: string\n\t/** What they brought to be let in by (`join`'s `ticket`): a login's token, a matchmaker's ticket. Checked by the game, never by the server */\n\tticket?: string\n\t/** The seats nobody holds now, in the mode's order: none once a game is on, where only coming back is left */\n\tfree: ServerSeat[]\n\t/** The server's phase when the seat was asked for: lobby, game or ended */\n\tphase: GameServer['phase']\n}\n\n/**\n * Where who asked sits (`GameServerOptions.seat`): a seat by its player (the first free one when left out), the name to\n * use there (theirs, or the seat's, when left out), and who they are (`id`): one who comes again as the same id gets the\n * seat they hold, from another page or after a drop, and the connection there before is let go. A seat another holds is\n * refused. `{ refuse }` sends them away with the reason, which they are told\n *\n * @beta\n */\nexport type SeatAnswer =\n\t| {\n\t\t\tplayer?: PlayerId\n\t\t\tname?: string\n\t\t\tid?: string\n\t\t\t/**\n\t\t\t * Who to rate them as (`ratings`): a login's account. The key they brought (`join`'s `who`) when left out, and\n\t\t\t * `id` without one; a matchmaker's ticket, a new id every game, is no one to rate\n\t\t\t */\n\t\t\trate?: string\n\t }\n\t| { refuse: string }\n\n/** A connection, and what it gives the game to talk through */\ninterface Client {\n\tconnection: Connection\n\t/** The end the game's host holds: what comes in that is not the server's goes to it */\n\trelay: Transport\n\ttoGame: (text: string) => void\n\tfromGameClosed: () => void\n\tseat?: Seat\n\twatching: boolean\n\t/** Asked about, by the `seat` hook: a second join waits for nothing and is dropped */\n\tjoining?: boolean\n\t/** Joined, and answered: seated, watching, or told every seat is taken. Only those are told of the lobby */\n\tjoined?: boolean\n\t/** The key the page joined with (`join`'s `who`): what keeps one voted out of the lobby out */\n\twho?: string\n\t/** The name it joined by: what one who watches is called in their lines */\n\tname?: string\n\t/** What closes it if it has not joined in time (`joinWithin`) */\n\tdeadline?: ReturnType<typeof setTimeout>\n\t/** The rate limits: of its commands (`rate`), of its other messages (`messageRate`), of the lobby's (`lobbyRate`) */\n\tcommands: Bucket\n\tmessages: Bucket\n\tlobby: Bucket\n}\n\n/** The messages of the lobby: each told to everyone, or a key tried (`lobbyRate`) */\nconst LOBBY_MESSAGES = new Set<unknown>(['join', 'sit', 'ready', 'resume', 'name', 'start', 'setting', 'seatSetting', 'admin', 'lobbyChat', 'kick'])\n\n/** How long a line said in the lobby may be */\nconst LOBBY_LINE = 200\n\n/** A token bucket: so many at once, filled again at so many a second */\nclass Bucket {\n\tprivate tokens: number\n\tprivate toppedUp = performance.now()\n\n\tconstructor(private readonly rate: { perSecond: number; burst: number }) {\n\t\tthis.tokens = rate.burst\n\t}\n\n\t/** Whether one more goes now: taken from the bucket, when it does */\n\ttake(): boolean {\n\t\tconst now = performance.now()\n\t\tthis.tokens = Math.min(this.rate.burst, this.tokens + ((now - this.toppedUp) / 1000) * this.rate.perSecond)\n\t\tthis.toppedUp = now\n\t\tif (this.tokens < 1) return false\n\t\tthis.tokens--\n\t\treturn true\n\t}\n}\n\n/**\n * A server of a game: its connections, who joins and where they go (`Doorman`), its lobby (`Lobby`: the seats, the\n * settings, when a game starts) and its game while one is on (`Match`)\n *\n * @beta\n */\nexport class GameServer {\n\t/** Where the server is: `lobby` before the game, `game` while it is on, `ended` once it is over */\n\tphase: 'lobby' | 'game' | 'ended' = 'lobby'\n\tprivate readonly clients = new Set<Client>()\n\t/** The keys of those the lobby voted out (`kick`): kept out until the server starts afresh (`reset`) */\n\tprivate readonly kickedOut = new Set<string>()\n\t/** Where each who joins goes */\n\tprivate readonly doorman: Doorman = new Doorman(this)\n\t/** The seats, the settings, and when a game starts */\n\tprivate readonly lobby: Lobby\n\t/** The game on, or the one that ended while its players are still on its screen */\n\tprivate match?: Match\n\n\tprivate constructor(\n\t\tprivate readonly source: ConnectionSource,\n\t\t/** What the server was made with */\n\t\treadonly options: GameServerOptions,\n\t\tlogger: Logger,\n\t\t/** Who builds the navigations of its worlds: its worker thread (`navigationWorker`), or the world's own way */\n\t\tprivate readonly navigation?: NavigationBuilds\n\t) {\n\t\tconst server = this\n\t\tthis.logger = logger\n\t\tthis.lobby = new Lobby({\n\t\t\toptions,\n\t\t\tlogger,\n\t\t\tget phase() {\n\t\t\t\treturn server.phase\n\t\t\t},\n\t\t\ttellAll: (message) => this.tellAll(message),\n\t\t\tstartGame: () => void this.startGame()\n\t\t})\n\t\tsource.onConnection((connection) => this.accept(connection))\n\t}\n\n\t/** Starts a server, and resolves once it listens */\n\tstatic async start(options: GameServerOptions): Promise<GameServer> {\n\t\tconst logger = serverLogger(options.log)\n\t\tconst builder = options.navigationWorker !== false ? nodeNavigationBuilder() : undefined\n\t\tlet server: GameServer | undefined\n\t\tconst socket = await startSocketServer({\n\t\t\tport: options.port,\n\t\t\tcompress: options.compress,\n\t\t\tidleTimeout: options.idleTimeout,\n\t\t\tmaxBuffered: options.maxBuffered,\n\t\t\tmaxConnections: options.maxConnections,\n\t\t\tlog: logger,\n\t\t\t// its health and its numbers, on the same port as its sockets\n\t\t\tonRequest: (request, response) => {\n\t\t\t\tconst answered =\n\t\t\t\t\tserver &&\n\t\t\t\t\tanswerOps(\n\t\t\t\t\t\trequest,\n\t\t\t\t\t\tresponse,\n\t\t\t\t\t\toptions.http,\n\t\t\t\t\t\t() => ({ draining: server!.draining, rooms: new Map([['', server!.metrics()]]) }),\n\t\t\t\t\t\t() => ({ games: [server!.listing('')] }),\n\t\t\t\t\t\t{ ratings: options.ratings, modes: [options.mode.id] }\n\t\t\t\t\t)\n\t\t\t\tif (answered) return\n\t\t\t\tresponse.writeHead(426, { 'content-type': 'text/plain' })\n\t\t\t\tresponse.end('A game server: connect with a WebSocket\\n')\n\t\t\t}\n\t\t})\n\t\tserver = new GameServer(socket, options, logger, builder && { builder })\n\t\treturn server.begin()\n\t}\n\n\t/**\n\t * A server whose connections come from elsewhere (`ConnectionSource`): a room of `GameRooms`, those a port it shares\n\t * hands it. Closing it closes those, and leaves where they come from to whoever owns it\n\t */\n\tstatic async attach(source: ConnectionSource, options: Omit<GameServerOptions, 'port'>): Promise<GameServer> {\n\t\treturn new GameServer(source, { ...options, port: source.port }, serverLogger(options.log)).begin()\n\t}\n\n\t/** Says it is there, and starts a game at once where the computer has every seat */\n\tprivate async begin(): Promise<GameServer> {\n\t\tconst { options, source } = this\n\t\tthis.log(`${options.mode.name} (${options.mode.rules.id}) on port ${source.port}, ${this.seats.length} seats`)\n\t\t// the computer in every seat: nobody to wait for (a game to watch, or to measure)\n\t\tif ((options.autoStart ?? true) && this.seats.every((seat) => seat.ai)) await this.startGame()\n\t\treturn this\n\t}\n\n\t/**\n\t * Its seats, in the mode's order: the server's own (its doorman's), a seat of a player is `publicSeat`'s\n\t *\n\t * @internal\n\t */\n\tget seats(): Seat[] {\n\t\treturn this.lobby.seats\n\t}\n\n\t/** The game's settings (`ServerHooks.settings`), as chosen in the lobby */\n\tget settings(): Record<string, string> {\n\t\treturn this.lobby.settings\n\t}\n\n\t/** The world of the game on, or of the one that ended while its players are still on its screen */\n\tget world(): World | undefined {\n\t\treturn this.match?.world\n\t}\n\n\t/** What sends the game to its players, while there is one */\n\tget host(): SessionHost | undefined {\n\t\treturn this.match?.host\n\t}\n\n\t/** Who paused the game: an admin, or a player (with a pause of theirs, for so long at most). Nobody while it runs */\n\tget pausedBy(): PlayerId | 'admin' | undefined {\n\t\treturn this.match?.pausedBy\n\t}\n\n\t/** When it started, for its uptime */\n\tprivate readonly startedAt = performance.now()\n\t/** Games played to their end */\n\tprivate played = 0\n\t/** What the hosts of the games before this one counted: the numbers go on from there */\n\tprivate readonly past = { ticks: 0, tickTime: 0, sends: 0, sendTime: 0 }\n\t/** It takes no new games: it is stopping once the running one is over (`close({ drain })`) */\n\tdraining = false\n\t/** Tells a stop that waits that the running game is over */\n\tprivate drained?: () => void\n\n\t/** What a list of games says of it (`GET /games`, `GameListing`), as the room it is reached at */\n\tlisting(room: string): GameListing {\n\t\tconst { mode } = this.options\n\t\tconst rating = this.lobby.rating()\n\t\treturn {\n\t\t\troom,\n\t\t\tgame: mode.rules.id,\n\t\t\tmode: mode.name,\n\t\t\tphase: this.phase,\n\t\t\tplayers: this.seats.filter((seat) => !seat.ai && seat.connected).length,\n\t\t\tfree: this.seats.filter((seat) => !seat.ai && seat.isFree).length,\n\t\t\tcomputer: this.seats.filter((seat) => seat.ai).length,\n\t\t\twatchers: this.watching,\n\t\t\tsettings: { ...this.settings },\n\t\t\tdraining: this.draining,\n\t\t\t...(rating !== undefined && { rating })\n\t\t}\n\t}\n\n\t/** How many are connected to it, playing or watching: none, for a room that may be closed */\n\tget connections(): number {\n\t\treturn this.clients.size\n\t}\n\n\t/** How many watch */\n\tprivate get watching(): number {\n\t\treturn [...this.clients].filter((client) => client.watching).length\n\t}\n\n\t/** Its numbers now: what `/metrics` says (see `ServerMetrics`) */\n\tmetrics(): ServerMetrics {\n\t\tconst totals = this.host?.totals\n\t\treturn {\n\t\t\tphase: this.phase,\n\t\t\tdraining: this.draining,\n\t\t\tuptime: (performance.now() - this.startedAt) / 1000,\n\t\t\tgames: { running: this.phase === 'game' ? 1 : 0, played: this.played },\n\t\t\tplayers: this.seats.filter((seat) => seat.connected).length,\n\t\t\twatching: this.watching,\n\t\t\tconnections: this.clients.size,\n\t\t\tticks: this.past.ticks + (totals?.ticks ?? 0),\n\t\t\ttickSeconds: (this.past.tickTime + (totals?.tickTime ?? 0)) / 1000,\n\t\t\tlastTickSeconds: (totals?.lastTick ?? 0) / 1000,\n\t\t\tsends: this.past.sends + (totals?.sends ?? 0),\n\t\t\tsendSeconds: (this.past.sendTime + (totals?.sendTime ?? 0)) / 1000,\n\t\t\tbytesSent: this.bytesSent\n\t\t}\n\t}\n\n\t/** The game let go of, what its host counted kept for the numbers */\n\tprivate dropMatch(options?: { closeTransports: boolean }): void {\n\t\tconst { match } = this\n\t\tif (!match) return\n\t\tconst { host } = match\n\t\tmatch.stop()\n\t\tthis.past.ticks += host.totals.ticks\n\t\tthis.past.tickTime += host.totals.tickTime\n\t\tthis.past.sends += host.totals.sends\n\t\tthis.past.sendTime += host.totals.sendTime\n\t\thost.dispose(options)\n\t\tthis.match = undefined\n\t}\n\n\t/** The port the server listens on, the real one where 0 was asked for */\n\tget port(): number {\n\t\treturn this.source.port\n\t}\n\n\t/** Bytes sent to those connected now, as they went over the wire: compressed, where they are */\n\tget bytesSent(): number {\n\t\tlet total = 0\n\t\tfor (const client of this.clients) total += client.connection.bytesSent\n\t\treturn total\n\t}\n\n\t/** What the server and its games say: see `GameServerOptions.log` */\n\treadonly logger: Logger\n\n\tprivate log(line: string, fields?: Record<string, unknown>): void {\n\t\tthis.logger.info('server', line, fields)\n\t}\n\n\tprivate accept(connection: Connection): void {\n\t\tconst { options } = this\n\t\tconst client: Client = {\n\t\t\tconnection,\n\t\t\twatching: false,\n\t\t\tcommands: new Bucket(options.rate ?? { perSecond: 30, burst: 60 }),\n\t\t\tmessages: new Bucket(options.messageRate ?? { perSecond: 100, burst: 200 }),\n\t\t\tlobby: new Bucket(options.lobbyRate ?? { perSecond: 4, burst: 20 }),\n\t\t\ttoGame: () => {},\n\t\t\tfromGameClosed: () => {},\n\t\t\trelay: undefined as unknown as Transport\n\t\t}\n\t\tclient.relay = {\n\t\t\tsend: (message) => connection.send(message),\n\t\t\tonMessage: (handler) => (client.toGame = handler),\n\t\t\tonClose: (handler) => (client.fromGameClosed = handler),\n\t\t\tclose: () => connection.close()\n\t\t}\n\t\tthis.clients.add(client)\n\t\tconnection.onMessage((text) => this.receive(client, text))\n\t\tconnection.onClose(() => this.leave(client))\n\t\t// one that never joins is let go: nothing else would (RV38)\n\t\tconst within = options.joinWithin ?? 10\n\t\tif (Number.isFinite(within)) {\n\t\t\tclient.deadline = setTimeout(\n\t\t\t\t() => {\n\t\t\t\t\tif (client.joined || client.joining || !this.clients.has(client)) return\n\t\t\t\t\tthis.log('a connection that did not join in time was closed', { address: connection.address })\n\t\t\t\t\tconnection.close()\n\t\t\t\t},\n\t\t\t\tMath.max(0, within) * 1000\n\t\t\t)\n\t\t\tclient.deadline.unref?.()\n\t\t}\n\t}\n\n\tprivate tell(client: Client, message: LobbyServerMessage): void {\n\t\tclient.connection.send(JSON.stringify(message))\n\t}\n\n\t/** Tells everyone who joined: never a connection that has not (RV38) */\n\tprivate tellAll(message: LobbyServerMessage): void {\n\t\tfor (const client of this.clients) if (client.joined) this.tell(client, message)\n\t}\n\n\tprivate receive(client: Client, text: string): void {\n\t\t// one that has left says nothing more\n\t\tif (!this.clients.has(client)) return\n\t\t// anyone can connect and send anything: each field is checked before it is used, and what is not right is dropped\n\t\tconst message = readPlayerMessage(text)\n\t\tconst { seat } = client\n\t\t// every message through a limit: a seated player's commands through theirs (`allow`, which answers each it\n\t\t// drops), everything else through the connection's, and the lobby's, told to everyone, through one of its own (RV37)\n\t\tif (!(message?.type === 'command' && seat && this.phase === 'game') && !client.messages.take()) return\n\t\tif (!message) return\n\t\tif (LOBBY_MESSAGES.has(message.type) && !client.lobby.take()) return\n\t\tswitch (message.type) {\n\t\t\tcase 'join':\n\t\t\t\treturn this.join(client, {\n\t\t\t\t\ttype: 'join',\n\t\t\t\t\tname: typeof message.name === 'string' ? message.name : undefined,\n\t\t\t\t\ttoken: typeof message.token === 'string' ? message.token : undefined,\n\t\t\t\t\tticket: typeof message.ticket === 'string' ? message.ticket : undefined,\n\t\t\t\t\twatch: message.watch === true,\n\t\t\t\t\tkey: typeof message.key === 'string' ? message.key : undefined,\n\t\t\t\t\t// who they are to the ratings: a key of their own, of a sensible length\n\t\t\t\t\twho: typeof message.who === 'string' && message.who.length <= 128 ? message.who : undefined,\n\t\t\t\t\tback: message.back === true,\n\t\t\t\t\tprotocol: isFiniteNumber(message.protocol) ? message.protocol : undefined\n\t\t\t\t})\n\t\t\tcase 'sit':\n\t\t\t\tif (typeof message.player === 'number') this.move(client, message.player)\n\t\t\t\treturn\n\t\t\tcase 'ready':\n\t\t\t\tif (seat && typeof message.ready === 'boolean') this.lobby.ready(seat, message.ready)\n\t\t\t\treturn\n\t\t\tcase 'resume':\n\t\t\t\t// a pause a player asked for, which any seated player may end; an admin's is the admin's\n\t\t\t\tif (seat && this.phase === 'game' && this.pausedBy !== undefined && this.pausedBy !== 'admin') this.pause(false)\n\t\t\t\treturn\n\t\t\tcase 'name':\n\t\t\t\tif (seat && typeof message.name === 'string') this.lobby.rename(seat, message.name)\n\t\t\t\treturn\n\t\t\tcase 'start':\n\t\t\t\tif (seat && this.phase === 'lobby') void this.startGame()\n\t\t\t\treturn\n\t\t\tcase 'setting': {\n\t\t\t\tconst { name, value } = message\n\t\t\t\tif (seat && typeof name === 'string' && typeof value === 'string') this.lobby.set(name, value)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tcase 'seatSetting': {\n\t\t\t\tconst { player, name, value } = message\n\t\t\t\tif (seat && typeof name === 'string' && typeof value === 'string' && typeof player === 'number') this.lobby.setSeat(seat, player, name, value)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tcase 'lobbyChat': {\n\t\t\t\t// before the game, from who joined: the game has a chat of its own\n\t\t\t\tconst text = typeof message.text === 'string' ? message.text.trim().slice(0, LOBBY_LINE) : ''\n\t\t\t\tif (!client.joined || this.phase !== 'lobby' || !text) return\n\t\t\t\treturn this.tellAll({ type: 'lobbyChat', ...(seat && { player: seat.player }), name: seat?.name ?? 'A watcher', text })\n\t\t\t}\n\t\t\tcase 'kick': {\n\t\t\t\tif (!seat || typeof message.player !== 'number') return\n\t\t\t\tconst out = this.lobby.voteKick(seat, message.player)\n\t\t\t\tif (!out) return\n\t\t\t\t// kept out of this lobby by the key their page keeps (`join`'s `who`), until the server starts afresh\n\t\t\t\tconst theirs = [...this.clients].find((each) => each.seat === out)\n\t\t\t\tif (theirs?.who) this.kickedOut.add(theirs.who)\n\t\t\t\treturn this.kick(out.player, 'let go by a vote of the lobby')\n\t\t\t}\n\t\t\tcase 'admin': {\n\t\t\t\tconst { key, action } = message\n\t\t\t\tif (typeof key !== 'string' || (action !== 'pause' && action !== 'resume' && action !== 'stop')) return\n\t\t\t\treturn this.admin(client, { type: 'admin', key, action })\n\t\t\t}\n\t\t\tdefault:\n\t\t\t\t// the game's: acknowledgements, and commands within the limit\n\t\t\t\tclient.toGame(text)\n\t\t}\n\t}\n\n\t/** Whether a command of this client's goes in: a bucket that fills at the rate allowed. Why not, when it does not */\n\tprivate allow(client: Client): true | Message {\n\t\treturn client.commands.take() || engineMessage('tooManyCommands')\n\t}\n\n\tprivate join(client: Client, message: Join): void {\n\t\tif (client.seat || client.watching || client.joining) return\n\t\tclient.who = message.who\n\t\tclient.name = message.name?.trim().slice(0, 24) || undefined\n\t\tif (message.who && this.kickedOut.has(message.who)) return this.enter(client, message, { to: 'refuse', reason: 'let go by a vote of the lobby' })\n\t\tconst wrong = this.doorman.wrongWire(message)\n\t\tif (wrong) {\n\t\t\tthis.log(`${message.name ?? 'someone'} was refused: protocol ${message.protocol}, this server's is ${PROTOCOL_VERSION}`, {\n\t\t\t\tname: message.name,\n\t\t\t\tprotocol: message.protocol\n\t\t\t})\n\t\t\treturn this.enter(client, message, { to: 'refuse', reason: wrong })\n\t\t}\n\t\t// a player of the game that ended, again: the lobby, with those still there in their seats (\"Again\")\n\t\tif (this.phase === 'ended' && !message.back && message.token && this.seats.some((each) => each.token === message.token)) {\n\t\t\tthis.backToLobby(message.token)\n\t\t}\n\t\tconst door = this.doorman.place(message, client.connection.address)\n\t\tif (!(door instanceof Promise)) return this.enter(client, message, door)\n\t\t// the game is asked: checked again once it has answered, as who asked may be gone or seated meanwhile\n\t\tclient.joining = true\n\t\tvoid door.then((placed) => {\n\t\t\tclient.joining = false\n\t\t\tif (this.clients.has(client) && !client.seat && !client.watching) this.enter(client, message, placed)\n\t\t})\n\t}\n\n\t/** Takes who joined where the doorman said: a seat, watching, told every seat is taken, or away with why */\n\tprivate enter(client: Client, message: Join, door: Door): void {\n\t\tif (door.to !== 'refuse') {\n\t\t\tclient.joined = true\n\t\t\tclearTimeout(client.deadline)\n\t\t}\n\t\tswitch (door.to) {\n\t\t\tcase 'seat':\n\t\t\t\tif ('id' in door) door.seat.id = door.id\n\t\t\t\tif ('rated' in door) door.seat.rated = door.rated\n\t\t\t\treturn this.sit(client, door.seat, door.name, door.named)\n\t\t\tcase 'watch':\n\t\t\t\treturn this.watch(client)\n\t\t\tcase 'full':\n\t\t\t\treturn this.tell(client, { type: 'full' })\n\t\t\tcase 'refuse':\n\t\t\t\tthis.log(`${message.name ?? 'someone'} was refused: ${door.reason}`, { name: message.name, reason: door.reason })\n\t\t\t\tthis.tell(client, { type: 'refused', reason: door.reason })\n\t\t\t\treturn client.connection.close()\n\t\t}\n\t}\n\n\t/** A seated player moves to another seat, free, in the lobby */\n\tprivate move(client: Client, player: PlayerId): void {\n\t\tif (!client.seat) return\n\t\tconst to = this.lobby.move(client.seat, player)\n\t\tif (!to) return\n\t\tclient.seat = to\n\t\tthis.tell(client, { type: 'seated', player: to.player, token: to.token! })\n\t}\n\n\t/** Seats a client, and lets go whoever had the seat before: a player back from another page. A name the game gave goes in any phase */\n\tprivate sit(client: Client, seat: Seat, name: string | undefined, named = false): void {\n\t\tconst token = seat.take(client.connection, this.phase === 'lobby' || named ? name : undefined)\n\t\tclient.seat = seat\n\t\tthis.tell(client, { type: 'seated', player: seat.player, token })\n\t\tthis.log(`${seat.name} took seat ${seat.player}`, { name: seat.name, player: seat.player })\n\t\tthis.hooks.onPlayerJoin?.(this.publicSeat(seat), this.world)\n\t\tif (this.phase === 'lobby') return this.lobby.seated()\n\t\t// back in a game: everything they may know, then what changes\n\t\tthis.match?.keep()\n\t\tthis.seatInGame(client, seat)\n\t}\n\n\t/** The game's hooks */\n\tprivate get hooks(): ServerHooks {\n\t\treturn this.options.mode.rules.server ?? {}\n\t}\n\n\t/**\n\t * Who comes once the seats are taken watches, when the server lets them (`watch`): everything, the whole map without fog, every player's resources. From\n\t * the side of the world's neutral player, so that nobody's units are theirs; from the first seat's, in a world without one\n\t */\n\tprivate watch(client: Client): void {\n\t\tclient.watching = true\n\t\tconst { world, host } = this\n\t\tif (this.phase === 'lobby' || !host || !world) {\n\t\t\tthis.tell(client, { type: 'watching', player: this.seats[0].player })\n\t\t\treturn this.lobby.broadcast()\n\t\t}\n\t\tconst side = [...world.players.values()].find((player) => player.neutral)?.id ?? this.seats[0].player\n\t\tthis.tell(client, { type: 'watching', player: side })\n\t\tconst delay = this.options.watchDelay ?? 0\n\t\thost.connect(side, delay > 0 ? delayed(client.relay, delay) : client.relay, { readOnly: true, observer: true, name: client.name })\n\t\t// a host with nobody to send to stops: it goes on for who comes to watch\n\t\tif (!host.running && this.phase === 'game') host.start()\n\t}\n\n\tprivate seatInGame(client: Client, seat: Seat): void {\n\t\tconst { host } = this\n\t\tif (!host) return\n\t\tif (this.options.debug) this.world?.debugPlayers.add(seat.player)\n\t\thost.connect(seat.player, client.relay, { allow: () => this.allow(client) })\n\t\tif (!host.running && this.phase === 'game') host.start()\n\t}\n\n\tprivate leave(client: Client): void {\n\t\tif (!this.clients.delete(client)) return\n\t\tclearTimeout(client.deadline)\n\t\tclient.fromGameClosed()\n\t\tconst { seat } = client\n\t\tif (!seat || seat.connection !== client.connection) return\n\t\tseat.drop()\n\t\tthis.log(`${seat.name} left seat ${seat.player}`, { name: seat.name, player: seat.player })\n\t\tthis.hooks.onPlayerLeave?.(this.publicSeat(seat), this.world)\n\t\tconst anyone = this.seats.some((each) => each.connected)\n\t\tif (this.phase === 'lobby') this.lobby.left(seat)\n\t\telse if (this.phase === 'ended' && !anyone) this.reset()\n\t\telse if (this.phase === 'game' && !anyone) this.match?.abandon()\n\t}\n\n\t/**\n\t * A seat as everyone is told it (the lobby, the hooks)\n\t *\n\t * @internal\n\t */\n\tpublicSeat(seat: Seat): ServerSeat {\n\t\treturn this.lobby.publicSeat(seat)\n\t}\n\n\t/** Makes the world, seats everyone at it, and runs it */\n\tasync startGame(): Promise<void> {\n\t\t// a server that is stopping starts nothing more\n\t\tif (this.phase !== 'lobby' || this.draining) return\n\t\tthis.phase = 'game'\n\t\tthis.lobby.again = false\n\t\tconst server = this\n\t\tconst match = await Match.make(\n\t\t\t{\n\t\t\t\toptions: this.options,\n\t\t\t\tlogger: this.logger,\n\t\t\t\tseats: this.seats,\n\t\t\t\tnavigation: this.navigation,\n\t\t\t\tfill: () => this.lobby.fill(),\n\t\t\t\tget watching() {\n\t\t\t\t\treturn server.watching\n\t\t\t\t},\n\t\t\t\tpublicSeat: (seat) => this.publicSeat(seat),\n\t\t\t\ttellAll: (message) => this.tellAll(message),\n\t\t\t\tkick: (player, reason) => this.kick(player, reason),\n\t\t\t\tend: () => void this.endGame()\n\t\t\t},\n\t\t\tthis.settings\n\t\t)\n\t\tthis.match = match\n\t\tthis.lobby.broadcast()\n\t\tfor (const client of this.clients) {\n\t\t\tif (client.seat) this.seatInGame(client, client.seat)\n\t\t\telse if (client.watching) this.watch(client)\n\t\t}\n\t\tmatch.run()\n\t}\n\n\t/** Lets a player go for good: told why, their connection closed, and their token and id no good any more */\n\tkick(player: PlayerId, reason: string): void {\n\t\tconst held = this.lobby.seat(player)\n\t\tif (!held) return\n\t\tconst client = [...this.clients].find((each) => each.seat === held)\n\t\theld.revoke()\n\t\tthis.log(`${held.name} was let go from seat ${held.player}: ${reason}`, { name: held.name, player: held.player, reason })\n\t\tif (!client) return\n\t\tthis.tell(client, { type: 'refused', reason })\n\t\tclient.connection.close()\n\t}\n\n\t/** The game is over: the result told to everyone and kept. The game goes on being shown until everyone has left */\n\tasync endGame(): Promise<GameResult | undefined> {\n\t\tconst { match } = this\n\t\tif (!match || this.phase !== 'game') return undefined\n\t\tthis.phase = 'ended'\n\t\tthis.played++\n\t\tconst result = await match.end()\n\t\tif (!this.seats.some((seat) => seat.connected)) this.reset()\n\t\tthis.drained?.()\n\t\treturn result\n\t}\n\n\t/**\n\t * Back to the lobby after a game, with who is still there in their seats: a player of it who joins again (\"Again\",\n\t * with their seat's token) takes theirs, the seats of those gone are free\n\t */\n\tprivate backToLobby(keepToken: string): void {\n\t\t// the players' connections stay: the lobby is theirs now\n\t\tthis.dropMatch({ closeTransports: false })\n\t\tfor (const client of this.clients) {\n\t\t\tclient.toGame = () => {}\n\t\t\tclient.fromGameClosed = () => {}\n\t\t}\n\t\tthis.phase = 'lobby'\n\t\tthis.lobby.backFromGame(keepToken)\n\t\tthis.log('back to the lobby, for another game')\n\t\tthis.lobby.broadcast()\n\t}\n\n\t/** Back to the lobby, for a new game: the old one gone, every seat free */\n\tprivate reset(): void {\n\t\tthis.dropMatch()\n\t\tthis.phase = 'lobby'\n\t\tthis.lobby.reset()\n\t\tthis.kickedOut.clear()\n\t\tthis.log('back to the lobby')\n\t}\n\n\tprivate admin(client: Client, message: Extract<LobbyPlayerMessage, { type: 'admin' }>): void {\n\t\tif (!this.options.adminKey || !sameSecret(message.key, this.options.adminKey))\n\t\t\treturn this.tell(client, { type: 'refused', reason: 'not an admin' })\n\t\tif (message.action === 'stop') {\n\t\t\tvoid this.endGame()\n\t\t\treturn\n\t\t}\n\t\tthis.pause(message.action === 'pause')\n\t}\n\n\t/**\n\t * Pauses the game for everyone, or lets it go on. A player's pause (`by`, from the `pause` command) ends by itself\n\t * after its seconds, or when a seated player says `resume`; an admin's, when the admin says so\n\t */\n\tpause(paused: boolean, by?: { player: PlayerId; seconds: number }): void {\n\t\tthis.match?.pause(paused, by)\n\t}\n\n\t/**\n\t * Stops the server: every connection closed. With `drain`, it first takes no new games (its health says so, for a\n\t * load balancer to send nobody new) and waits for the running one to end, up to so many seconds: then it is ended\n\t * (no winner, the players told the server stopped) and the server closes\n\t */\n\tasync close(options: { drain?: number } = {}): Promise<void> {\n\t\tif (options.drain && !this.draining) {\n\t\t\tthis.draining = true\n\t\t\tthis.log(`stopping: no new games, ${this.phase === 'game' ? `the running one has ${options.drain} s to end` : 'none running'}`)\n\t\t\tif (this.phase === 'game') {\n\t\t\t\tlet limit: ReturnType<typeof setTimeout> | undefined\n\t\t\t\tconst over = await new Promise<boolean>((resolve) => {\n\t\t\t\t\tthis.drained = () => resolve(true)\n\t\t\t\t\tlimit = setTimeout(() => resolve(false), options.drain! * 1000)\n\t\t\t\t})\n\t\t\t\tclearTimeout(limit)\n\t\t\t\tthis.drained = undefined\n\t\t\t\tif (!over) {\n\t\t\t\t\tif (this.match) this.match.failed = 'The server stopped'\n\t\t\t\t\tawait this.endGame()\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tthis.dropMatch()\n\t\tawait this.source.close()\n\t}\n}\n"],"mappings":"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"}
@@ -21,4 +21,4 @@ export type { Connection, ConnectionSource, SocketServer, SocketServerOptions }
21
21
  export { startSocketServer } from './websocket';
22
22
  export { nodeNavigationBuilder } from './navigation';
23
23
  export { createRatings, type RatedPlayer, type Rating, ratedId, type Ratings } from './ratings';
24
- export { readPacks, withPackFiles } from './packs';
24
+ export { readPacks, mergePackFiles } from './packs';
@@ -0,0 +1,199 @@
1
+ import { Seat } from "./seat.js";
2
+ import { seatSettingsOf } from "./seatSettings.js";
3
+ //#region src/server/lobby.ts
4
+ /**
5
+ * A server's seats and settings, and when its game starts
6
+ *
7
+ * @internal
8
+ */
9
+ var Lobby = class {
10
+ server;
11
+ /** Its seats, in the mode's order */
12
+ seats;
13
+ /** The game's settings (`ServerHooks.settings`), as chosen */
14
+ settings = {};
15
+ /** What each seat can have chosen for it: the game's (`ServerHooks.seatSettings`), and a race where it has races (`seatSettingsOf`) */
16
+ seatOffered;
17
+ /** Back in the lobby after a game, with its players: it starts once they are ready, not as the seats fill */
18
+ again = false;
19
+ /** The votes to let a seated player go (`voteKick`), by who it is about: who voted */
20
+ kickVotes = /* @__PURE__ */ new Map();
21
+ hooks;
22
+ constructor(server) {
23
+ this.server = server;
24
+ const { mode, ai, settings } = server.options;
25
+ this.hooks = mode.rules.server ?? {};
26
+ this.seatOffered = mode.seatSettings ?? seatSettingsOf(mode.rules);
27
+ for (const [name, setting] of Object.entries(this.hooks.settings ?? {})) {
28
+ const wanted = settings?.[name];
29
+ this.settings[name] = wanted !== void 0 && setting.options.includes(wanted) ? wanted : setting.default;
30
+ }
31
+ this.seats = mode.seats.map((seat) => new Seat(seat, !!ai?.includes(seat.player), {
32
+ ...Object.fromEntries(Object.entries(this.seatOffered).map(([name, setting]) => [name, setting.default])),
33
+ ...Object.fromEntries(Object.entries(seat.preset ?? {}).filter(([name]) => Object.hasOwn(this.seatOffered, name))),
34
+ ...seat.fixed
35
+ }));
36
+ }
37
+ /** A seat by its player */
38
+ seat(player) {
39
+ return this.seats.find((each) => each.player === player);
40
+ }
41
+ /** A seat as everyone is told it (the lobby, the hooks) */
42
+ publicSeat(seat) {
43
+ const { ratings, mode } = this.server.options;
44
+ const team = seat.settings?.team !== void 0 ? Number(seat.settings.team) : seat.mode.team;
45
+ return {
46
+ player: seat.player,
47
+ name: seat.name,
48
+ ai: seat.ai,
49
+ connected: seat.connected,
50
+ ...team !== void 0 && { team },
51
+ ...this.server.phase === "lobby" && !seat.ai && { ready: !!seat.ready },
52
+ ...seat.settings && Object.keys(seat.settings).length > 0 && { settings: { ...seat.settings } },
53
+ ...seat.mode.fixed && Object.keys(seat.mode.fixed).length > 0 && { fixed: Object.keys(seat.mode.fixed) },
54
+ ...seat.rated && { rated: seat.rated },
55
+ ...seat.rated && ratings && { rating: ratings.get(mode.id, seat.rated)?.rating ?? void 0 },
56
+ ...this.kickVotes.get(seat.player)?.size && { kick: {
57
+ votes: this.kickVotes.get(seat.player).size,
58
+ needed: this.kickNeeded(seat)
59
+ } }
60
+ };
61
+ }
62
+ /** The players who may vote to let one go: the others seated and there */
63
+ voters(about) {
64
+ return this.seats.filter((seat) => seat !== about && seat.connected && !seat.ai);
65
+ }
66
+ /** How many votes let a seated player go: most of the others seated and there */
67
+ kickNeeded(about) {
68
+ return Math.floor(this.voters(about).length / 2) + 1;
69
+ }
70
+ /**
71
+ * A seated player votes to let another go, in the lobby: once most of the others seated and there have, the seat
72
+ * voted on is given back (its player is the server's to let go, `GameServer.kick`). Nothing for a seat nobody is in,
73
+ * a computer's, or one's own
74
+ */
75
+ voteKick(by, player) {
76
+ const about = this.seat(player);
77
+ if (this.server.phase !== "lobby" || !about || about === by || !about.connected || about.ai || !by.connected) return void 0;
78
+ const votes = this.kickVotes.get(player) ?? /* @__PURE__ */ new Set();
79
+ votes.add(by.player);
80
+ this.kickVotes.set(player, votes);
81
+ if (this.voters(about).filter((seat) => votes.has(seat.player)).length >= this.kickNeeded(about)) {
82
+ this.kickVotes.delete(player);
83
+ return about;
84
+ }
85
+ this.broadcast();
86
+ }
87
+ /** A player left their seat, or moved: the votes about them and theirs go */
88
+ forgetVotes(player) {
89
+ this.kickVotes.delete(player);
90
+ for (const votes of this.kickVotes.values()) votes.delete(player);
91
+ }
92
+ /** The rating of the players in its seats, on average: none where nobody rated sits or there are no ratings */
93
+ rating() {
94
+ const { ratings, mode } = this.server.options;
95
+ if (!ratings) return void 0;
96
+ const rated = this.seats.filter((seat) => seat.connected && seat.rated).map((seat) => ratings.get(mode.id, seat.rated)?.rating ?? void 0).filter((rating) => rating !== void 0);
97
+ return rated.length ? Math.round(rated.reduce((sum, rating) => sum + rating, 0) / rated.length) : void 0;
98
+ }
99
+ /** Tells everyone the lobby as it is now */
100
+ broadcast() {
101
+ const { mode } = this.server.options;
102
+ this.server.tellAll({
103
+ type: "lobby",
104
+ mode: mode.id,
105
+ game: mode.rules.id,
106
+ phase: this.server.phase,
107
+ seats: this.seats.map((seat) => this.publicSeat(seat)),
108
+ settings: { ...this.settings },
109
+ offered: this.hooks.settings ?? {},
110
+ seatOffered: this.seatOffered
111
+ });
112
+ }
113
+ /** A player took a seat in the lobby: the game starts once every seat is filled, unless they are back from one ("Again") */
114
+ seated() {
115
+ this.broadcast();
116
+ if ((this.server.options.autoStart ?? true) && !this.again && this.seats.every((each) => each.ai || each.connected)) this.server.startGame();
117
+ }
118
+ /** A player left the lobby: their seat is free for anyone */
119
+ left(seat) {
120
+ this.forgetVotes(seat.player);
121
+ seat.free();
122
+ this.broadcast();
123
+ }
124
+ /** A seated player moves to another seat, free, in the lobby: their own is free for anyone then. The seat moved to, or none */
125
+ move(from, player) {
126
+ const to = this.seat(player);
127
+ if (!to || to === from || this.server.phase !== "lobby" || !to.isFree) return void 0;
128
+ this.forgetVotes(from.player);
129
+ to.takeFrom(from);
130
+ this.server.logger.info("server", `${to.name} moved from seat ${from.player} to ${to.player}`, {
131
+ name: to.name,
132
+ from: from.player,
133
+ player: to.player
134
+ });
135
+ this.broadcast();
136
+ return to;
137
+ }
138
+ /** A seated player says they are ready, or not: once every player seated is, the game starts */
139
+ ready(seat, ready) {
140
+ if (this.server.phase !== "lobby" || seat.ready === ready) return;
141
+ seat.ready = ready;
142
+ this.broadcast();
143
+ if (this.seats.every((each) => !each.connected || each.ready)) this.server.startGame();
144
+ }
145
+ /** A seated player's new name */
146
+ rename(seat, name) {
147
+ if (this.server.phase !== "lobby") return;
148
+ const trimmed = name.trim().slice(0, 24);
149
+ if (!trimmed || trimmed === seat.name) return;
150
+ seat.name = trimmed;
151
+ this.broadcast();
152
+ }
153
+ /** A setting of the game a seated player chose: one it offers, with a value it offers */
154
+ set(name, value) {
155
+ if (this.server.phase !== "lobby" || !Object.hasOwn(this.hooks.settings ?? {}, name)) return;
156
+ if (!this.hooks.settings[name].options.includes(value)) return;
157
+ this.settings[name] = value;
158
+ this.broadcast();
159
+ }
160
+ /**
161
+ * A setting of a seat chosen by a seated player (`by`): their own seat, or one no other player holds (a computer's,
162
+ * or one nobody took yet). Not what the mode fixes
163
+ */
164
+ setSeat(by, player, name, value) {
165
+ if (this.server.phase !== "lobby" || !Object.hasOwn(this.seatOffered, name)) return;
166
+ if (!this.seatOffered[name].options.includes(value)) return;
167
+ const seat = this.seat(player);
168
+ if (!seat || seat !== by && seat.connected && !seat.ai) return;
169
+ if (seat.mode.fixed && Object.hasOwn(seat.mode.fixed, name)) return;
170
+ if (this.seatOffered[name].unique && this.seats.some((other) => other !== seat && other.settings?.[name] === value)) return;
171
+ seat.settings = {
172
+ ...seat.settings,
173
+ [name]: value
174
+ };
175
+ this.broadcast();
176
+ }
177
+ /** A game starts: what nobody joined is the computer's */
178
+ fill() {
179
+ this.kickVotes.clear();
180
+ for (const seat of this.seats) if (!seat.connected) seat.ai = true;
181
+ }
182
+ /** Back after a game, with who is still there in their seats (and who comes again with `keepToken`): the seats of those gone are free */
183
+ backFromGame(keepToken) {
184
+ this.again = true;
185
+ for (const seat of this.seats) {
186
+ seat.newGame();
187
+ if (!seat.connected && seat.token !== keepToken) seat.free();
188
+ }
189
+ }
190
+ /** New, for a new game with nobody: every seat free */
191
+ reset() {
192
+ this.again = false;
193
+ for (const seat of this.seats) seat.reset();
194
+ }
195
+ };
196
+ //#endregion
197
+ export { Lobby };
198
+
199
+ //# sourceMappingURL=lobby.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lobby.js","names":[],"sources":["../../src/server/lobby.ts"],"sourcesContent":["/**\n * A server's lobby (`Lobby`): its seats, the game's settings, who is ready, when a game starts, and what everyone is\n * told of it (design review E12). The server hands it what a seated player asks for in the lobby; the connections,\n * the game and its phase stay the server's\n */\nimport type { PlayerId } from '#engine/entity'\nimport type { Logger } from '#engine/log'\nimport type { ServerHooks, ServerSeat } from '#engine/game'\nimport type { LobbyServerMessage } from '../session/wire'\nimport type { GameServerOptions } from './gameServer'\nimport { Seat } from './seat'\nimport { seatSettingsOf } from './seatSettings'\n\n/**\n * What the lobby reads of the server it is the lobby of\n *\n * @internal\n */\nexport interface LobbyContext {\n\t/** The server's phase now: lobby, game or ended */\n\treadonly phase: 'lobby' | 'game' | 'ended'\n\t/** The parts of the server's options the lobby reads: mode, computer seats, settings, ratings and auto start */\n\treadonly options: Pick<GameServerOptions, 'mode' | 'ai' | 'settings' | 'ratings' | 'autoStart'>\n\t/** The server's logger */\n\treadonly logger: Logger\n\t/** Tells everyone connected */\n\ttellAll(message: LobbyServerMessage): void\n\t/** Starts the game: every seat filled, or everyone ready */\n\tstartGame(): void\n}\n\n/**\n * A server's seats and settings, and when its game starts\n *\n * @internal\n */\nexport class Lobby {\n\t/** Its seats, in the mode's order */\n\treadonly seats: Seat[]\n\t/** The game's settings (`ServerHooks.settings`), as chosen */\n\treadonly settings: Record<string, string> = {}\n\t/** What each seat can have chosen for it: the game's (`ServerHooks.seatSettings`), and a race where it has races (`seatSettingsOf`) */\n\treadonly seatOffered: NonNullable<ServerHooks['seatSettings']>\n\t/** Back in the lobby after a game, with its players: it starts once they are ready, not as the seats fill */\n\tagain = false\n\t/** The votes to let a seated player go (`voteKick`), by who it is about: who voted */\n\tprivate readonly kickVotes = new Map<PlayerId, Set<PlayerId>>()\n\tprivate readonly hooks: ServerHooks\n\n\tconstructor(private readonly server: LobbyContext) {\n\t\tconst { mode, ai, settings } = server.options\n\t\tthis.hooks = mode.rules.server ?? {}\n\t\tthis.seatOffered = mode.seatSettings ?? seatSettingsOf(mode.rules)\n\t\tfor (const [name, setting] of Object.entries(this.hooks.settings ?? {})) {\n\t\t\tconst wanted = settings?.[name]\n\t\t\tthis.settings[name] = wanted !== undefined && setting.options.includes(wanted) ? wanted : setting.default\n\t\t}\n\t\tthis.seats = mode.seats.map(\n\t\t\t(seat) =>\n\t\t\t\tnew Seat(\n\t\t\t\t\tseat,\n\t\t\t\t\t!!ai?.includes(seat.player),\n\t\t\t\t\t// what the mode fixes for the seat over the defaults: a race a map gives its player\n\t\t\t\t\t{\n\t\t\t\t\t\t...Object.fromEntries(Object.entries(this.seatOffered).map(([name, setting]) => [name, setting.default])),\n\t\t\t\t\t\t// what the mode chose for it until someone chooses otherwise: its team and colour on the map\n\t\t\t\t\t\t...Object.fromEntries(Object.entries(seat.preset ?? {}).filter(([name]) => Object.hasOwn(this.seatOffered, name))),\n\t\t\t\t\t\t...seat.fixed\n\t\t\t\t\t}\n\t\t\t\t)\n\t\t)\n\t}\n\n\t/** A seat by its player */\n\tseat(player: PlayerId): Seat | undefined {\n\t\treturn this.seats.find((each) => each.player === player)\n\t}\n\n\t/** A seat as everyone is told it (the lobby, the hooks) */\n\tpublicSeat(seat: Seat): ServerSeat {\n\t\tconst { ratings, mode } = this.server.options\n\t\t// the team chosen for it, where the lobby offers one, else the mode's\n\t\tconst team = seat.settings?.team !== undefined ? Number(seat.settings.team) : seat.mode.team\n\t\treturn {\n\t\t\tplayer: seat.player,\n\t\t\tname: seat.name,\n\t\t\tai: seat.ai,\n\t\t\tconnected: seat.connected,\n\t\t\t...(team !== undefined && { team }),\n\t\t\t...(this.server.phase === 'lobby' && !seat.ai && { ready: !!seat.ready }),\n\t\t\t...(seat.settings && Object.keys(seat.settings).length > 0 && { settings: { ...seat.settings } }),\n\t\t\t...(seat.mode.fixed && Object.keys(seat.mode.fixed).length > 0 && { fixed: Object.keys(seat.mode.fixed) }),\n\t\t\t...(seat.rated && { rated: seat.rated }),\n\t\t\t...(seat.rated && ratings && { rating: ratings.get(mode.id, seat.rated)?.rating ?? undefined }),\n\t\t\t...(this.kickVotes.get(seat.player)?.size && { kick: { votes: this.kickVotes.get(seat.player)!.size, needed: this.kickNeeded(seat) } })\n\t\t}\n\t}\n\n\t/** The players who may vote to let one go: the others seated and there */\n\tprivate voters(about: Seat): Seat[] {\n\t\treturn this.seats.filter((seat) => seat !== about && seat.connected && !seat.ai)\n\t}\n\n\t/** How many votes let a seated player go: most of the others seated and there */\n\tprivate kickNeeded(about: Seat): number {\n\t\treturn Math.floor(this.voters(about).length / 2) + 1\n\t}\n\n\t/**\n\t * A seated player votes to let another go, in the lobby: once most of the others seated and there have, the seat\n\t * voted on is given back (its player is the server's to let go, `GameServer.kick`). Nothing for a seat nobody is in,\n\t * a computer's, or one's own\n\t */\n\tvoteKick(by: Seat, player: PlayerId): Seat | undefined {\n\t\tconst about = this.seat(player)\n\t\tif (this.server.phase !== 'lobby' || !about || about === by || !about.connected || about.ai || !by.connected) return undefined\n\t\tconst votes = this.kickVotes.get(player) ?? new Set<PlayerId>()\n\t\tvotes.add(by.player)\n\t\tthis.kickVotes.set(player, votes)\n\t\t// only those still there count\n\t\tconst counted = this.voters(about).filter((seat) => votes.has(seat.player)).length\n\t\tif (counted >= this.kickNeeded(about)) {\n\t\t\tthis.kickVotes.delete(player)\n\t\t\treturn about\n\t\t}\n\t\tthis.broadcast()\n\t\treturn undefined\n\t}\n\n\t/** A player left their seat, or moved: the votes about them and theirs go */\n\tprivate forgetVotes(player: PlayerId): void {\n\t\tthis.kickVotes.delete(player)\n\t\tfor (const votes of this.kickVotes.values()) votes.delete(player)\n\t}\n\n\t/** The rating of the players in its seats, on average: none where nobody rated sits or there are no ratings */\n\trating(): number | undefined {\n\t\tconst { ratings, mode } = this.server.options\n\t\tif (!ratings) return undefined\n\t\tconst known = this.seats.filter((seat) => seat.connected && seat.rated).map((seat) => ratings.get(mode.id, seat.rated!)?.rating ?? undefined)\n\t\tconst rated = known.filter((rating): rating is number => rating !== undefined)\n\t\treturn rated.length ? Math.round(rated.reduce((sum, rating) => sum + rating, 0) / rated.length) : undefined\n\t}\n\n\t/** Tells everyone the lobby as it is now */\n\tbroadcast(): void {\n\t\tconst { mode } = this.server.options\n\t\tthis.server.tellAll({\n\t\t\ttype: 'lobby',\n\t\t\tmode: mode.id,\n\t\t\tgame: mode.rules.id,\n\t\t\tphase: this.server.phase,\n\t\t\tseats: this.seats.map((seat) => this.publicSeat(seat)),\n\t\t\tsettings: { ...this.settings },\n\t\t\toffered: this.hooks.settings ?? {},\n\t\t\tseatOffered: this.seatOffered\n\t\t})\n\t}\n\n\t/** A player took a seat in the lobby: the game starts once every seat is filled, unless they are back from one (\"Again\") */\n\tseated(): void {\n\t\tthis.broadcast()\n\t\tif ((this.server.options.autoStart ?? true) && !this.again && this.seats.every((each) => each.ai || each.connected)) this.server.startGame()\n\t}\n\n\t/** A player left the lobby: their seat is free for anyone */\n\tleft(seat: Seat): void {\n\t\tthis.forgetVotes(seat.player)\n\t\tseat.free()\n\t\tthis.broadcast()\n\t}\n\n\t/** A seated player moves to another seat, free, in the lobby: their own is free for anyone then. The seat moved to, or none */\n\tmove(from: Seat, player: PlayerId): Seat | undefined {\n\t\tconst to = this.seat(player)\n\t\tif (!to || to === from || this.server.phase !== 'lobby' || !to.isFree) return undefined\n\t\tthis.forgetVotes(from.player)\n\t\tto.takeFrom(from)\n\t\tthis.server.logger.info('server', `${to.name} moved from seat ${from.player} to ${to.player}`, {\n\t\t\tname: to.name,\n\t\t\tfrom: from.player,\n\t\t\tplayer: to.player\n\t\t})\n\t\tthis.broadcast()\n\t\treturn to\n\t}\n\n\t/** A seated player says they are ready, or not: once every player seated is, the game starts */\n\tready(seat: Seat, ready: boolean): void {\n\t\tif (this.server.phase !== 'lobby' || seat.ready === ready) return\n\t\tseat.ready = ready\n\t\tthis.broadcast()\n\t\tif (this.seats.every((each) => !each.connected || each.ready)) this.server.startGame()\n\t}\n\n\t/** A seated player's new name */\n\trename(seat: Seat, name: string): void {\n\t\tif (this.server.phase !== 'lobby') return\n\t\tconst trimmed = name.trim().slice(0, 24)\n\t\tif (!trimmed || trimmed === seat.name) return\n\t\tseat.name = trimmed\n\t\tthis.broadcast()\n\t}\n\n\t/** A setting of the game a seated player chose: one it offers, with a value it offers */\n\tset(name: string, value: string): void {\n\t\tif (this.server.phase !== 'lobby' || !Object.hasOwn(this.hooks.settings ?? {}, name)) return\n\t\tif (!this.hooks.settings![name].options.includes(value)) return\n\t\tthis.settings[name] = value\n\t\tthis.broadcast()\n\t}\n\n\t/**\n\t * A setting of a seat chosen by a seated player (`by`): their own seat, or one no other player holds (a computer's,\n\t * or one nobody took yet). Not what the mode fixes\n\t */\n\tsetSeat(by: Seat, player: PlayerId, name: string, value: string): void {\n\t\tif (this.server.phase !== 'lobby' || !Object.hasOwn(this.seatOffered, name)) return\n\t\tif (!this.seatOffered[name].options.includes(value)) return\n\t\tconst seat = this.seat(player)\n\t\tif (!seat || (seat !== by && seat.connected && !seat.ai)) return\n\t\tif (seat.mode.fixed && Object.hasOwn(seat.mode.fixed, name)) return\n\t\t// one no two seats hold (a colour): not while another holds it\n\t\tif (this.seatOffered[name].unique && this.seats.some((other) => other !== seat && other.settings?.[name] === value)) return\n\t\tseat.settings = { ...seat.settings, [name]: value }\n\t\tthis.broadcast()\n\t}\n\n\t/** A game starts: what nobody joined is the computer's */\n\tfill(): void {\n\t\tthis.kickVotes.clear()\n\t\tfor (const seat of this.seats) if (!seat.connected) seat.ai = true\n\t}\n\n\t/** Back after a game, with who is still there in their seats (and who comes again with `keepToken`): the seats of those gone are free */\n\tbackFromGame(keepToken: string): void {\n\t\t// those still on the last game's screen are seated, not there: the next starts when everyone says ready\n\t\tthis.again = true\n\t\tfor (const seat of this.seats) {\n\t\t\tseat.newGame()\n\t\t\tif (!seat.connected && seat.token !== keepToken) seat.free()\n\t\t}\n\t}\n\n\t/** New, for a new game with nobody: every seat free */\n\treset(): void {\n\t\tthis.again = false\n\t\tfor (const seat of this.seats) seat.reset()\n\t}\n}\n"],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import { Logger, logLine, rootLogger } from "../log.js";
2
+ //#region src/server/log.ts
3
+ /**
4
+ * The logger of a server, from what it was started with. A logger: one under it. A function of lines: a logger of its
5
+ * own that gives it the server's own entries as their words, and everything else (a game's, a warning) as a whole
6
+ * line. Nothing: one under the root, which says warnings and errors only, as a server said nothing else before
7
+ */
8
+ function serverLogger(given) {
9
+ if (given instanceof Logger) return given.child();
10
+ if (!given) return rootLogger.child({ level: "warn" });
11
+ const logger = new Logger();
12
+ logger.to((entry) => given(entry.category === "server" && entry.level === "info" ? entry.message : logLine(entry)));
13
+ return logger;
14
+ }
15
+ //#endregion
16
+ export { serverLogger };
17
+
18
+ //# sourceMappingURL=log.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log.js","names":[],"sources":["../../src/server/log.ts"],"sourcesContent":["import { type LogEntry, Logger, logLine, rootLogger } from '#engine/log'\n\n/**\n * What a server may be given to log with: a logger, or a function that takes each line as text\n *\n * @beta\n */\nexport type ServerLog = Logger | ((line: string) => void)\n\n/**\n * The logger of a server, from what it was started with. A logger: one under it. A function of lines: a logger of its\n * own that gives it the server's own entries as their words, and everything else (a game's, a warning) as a whole\n * line. Nothing: one under the root, which says warnings and errors only, as a server said nothing else before\n */\nexport function serverLogger(given: ServerLog | undefined): Logger {\n\tif (given instanceof Logger) return given.child()\n\tif (!given) return rootLogger.child({ level: 'warn' })\n\tconst logger = new Logger()\n\tlogger.to((entry: LogEntry) => given(entry.category === 'server' && entry.level === 'info' ? entry.message : logLine(entry)))\n\treturn logger\n}\n"],"mappings":";;;;;;;AAcA,SAAgB,aAAa,OAAsC;CAClE,IAAI,iBAAiB,QAAQ,OAAO,MAAM,MAAM;CAChD,IAAI,CAAC,OAAO,OAAO,WAAW,MAAM,EAAE,OAAO,OAAO,CAAC;CACrD,MAAM,SAAS,IAAI,OAAO;CAC1B,OAAO,IAAI,UAAoB,MAAM,MAAM,aAAa,YAAY,MAAM,UAAU,SAAS,MAAM,UAAU,QAAQ,KAAK,CAAC,CAAC;CAC5H,OAAO;AACR"}