@v12-engine/engine 0.1.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (951) hide show
  1. package/dist/abilities/amounts.d.ts +28 -0
  2. package/dist/abilities/amounts.js +74 -0
  3. package/dist/abilities/amounts.js.map +1 -0
  4. package/dist/abilities/buffs.d.ts +106 -6
  5. package/dist/abilities/buffs.js +443 -0
  6. package/dist/abilities/buffs.js.map +1 -0
  7. package/dist/abilities/castTold.d.ts +2 -0
  8. package/dist/abilities/castTold.js +66 -0
  9. package/dist/abilities/castTold.js.map +1 -0
  10. package/dist/abilities/chance.d.ts +38 -0
  11. package/dist/abilities/chance.js +77 -0
  12. package/dist/abilities/chance.js.map +1 -0
  13. package/dist/abilities/charges.d.ts +18 -0
  14. package/dist/abilities/charges.js +101 -0
  15. package/dist/abilities/charges.js.map +1 -0
  16. package/dist/abilities/control.d.ts +28 -0
  17. package/dist/abilities/control.js +113 -0
  18. package/dist/abilities/control.js.map +1 -0
  19. package/dist/abilities/dispel.js +51 -0
  20. package/dist/abilities/dispel.js.map +1 -0
  21. package/dist/abilities/effectFields.d.ts +1 -1
  22. package/dist/abilities/effectFields.js +676 -0
  23. package/dist/abilities/effectFields.js.map +1 -0
  24. package/dist/abilities/effectIndex.d.ts +27 -0
  25. package/dist/abilities/effectIndex.js +64 -0
  26. package/dist/abilities/effectIndex.js.map +1 -0
  27. package/dist/abilities/effects/buff.d.ts +9 -3
  28. package/dist/abilities/effects/buff.js +84 -0
  29. package/dist/abilities/effects/buff.js.map +1 -0
  30. package/dist/abilities/effects/conditions.d.ts +2 -0
  31. package/dist/abilities/effects/conditions.js +41 -0
  32. package/dist/abilities/effects/conditions.js.map +1 -0
  33. package/dist/abilities/effects/core.js +54 -0
  34. package/dist/abilities/effects/core.js.map +1 -0
  35. package/dist/abilities/effects/damage.d.ts +1 -1
  36. package/dist/abilities/effects/damage.js +43 -0
  37. package/dist/abilities/effects/damage.js.map +1 -0
  38. package/dist/abilities/effects/heal.d.ts +2 -2
  39. package/dist/abilities/effects/heal.js +51 -0
  40. package/dist/abilities/effects/heal.js.map +1 -0
  41. package/dist/abilities/effects/missile.d.ts +13 -1
  42. package/dist/abilities/effects/missile.js +104 -0
  43. package/dist/abilities/effects/missile.js.map +1 -0
  44. package/dist/abilities/effects/morph.d.ts +5 -0
  45. package/dist/abilities/effects/morph.js +43 -0
  46. package/dist/abilities/effects/morph.js.map +1 -0
  47. package/dist/abilities/effects/moves.d.ts +16 -4
  48. package/dist/abilities/effects/moves.js +212 -0
  49. package/dist/abilities/effects/moves.js.map +1 -0
  50. package/dist/abilities/effects/passives.d.ts +19 -9
  51. package/dist/abilities/effects/passives.js +131 -0
  52. package/dist/abilities/effects/passives.js.map +1 -0
  53. package/dist/abilities/effects/proxy.d.ts +5 -0
  54. package/dist/abilities/effects/proxy.js +60 -0
  55. package/dist/abilities/effects/proxy.js.map +1 -0
  56. package/dist/abilities/effects/sight.d.ts +2 -2
  57. package/dist/abilities/effects/sight.js +39 -0
  58. package/dist/abilities/effects/sight.js.map +1 -0
  59. package/dist/abilities/effects/spawn.d.ts +5 -2
  60. package/dist/abilities/effects/spawn.js +40 -0
  61. package/dist/abilities/effects/spawn.js.map +1 -0
  62. package/dist/abilities/effects/timed.d.ts +2 -2
  63. package/dist/abilities/effects/timed.js +96 -0
  64. package/dist/abilities/effects/timed.js.map +1 -0
  65. package/dist/abilities/effects/trade.d.ts +1 -1
  66. package/dist/abilities/effects/trade.js +25 -0
  67. package/dist/abilities/effects/trade.js.map +1 -0
  68. package/dist/abilities/effects.d.ts +97 -23
  69. package/dist/abilities/effects.js +860 -0
  70. package/dist/abilities/effects.js.map +1 -0
  71. package/dist/abilities/land.d.ts +38 -4
  72. package/dist/abilities/land.js +189 -0
  73. package/dist/abilities/land.js.map +1 -0
  74. package/dist/abilities/recast.d.ts +45 -0
  75. package/dist/abilities/recast.js +118 -0
  76. package/dist/abilities/recast.js.map +1 -0
  77. package/dist/abilities/scaled.js +40 -0
  78. package/dist/abilities/scaled.js.map +1 -0
  79. package/dist/abilities/screen.d.ts +6 -0
  80. package/dist/abilities/screen.js +83 -0
  81. package/dist/abilities/screen.js.map +1 -0
  82. package/dist/abilities/shapes.d.ts +66 -0
  83. package/dist/abilities/shapes.js +122 -0
  84. package/dist/abilities/shapes.js.map +1 -0
  85. package/dist/abilities/text.d.ts +14 -2
  86. package/dist/abilities/text.js +204 -0
  87. package/dist/abilities/text.js.map +1 -0
  88. package/dist/abilities/triggers.d.ts +98 -0
  89. package/dist/abilities/triggers.js +351 -0
  90. package/dist/abilities/triggers.js.map +1 -0
  91. package/dist/abilityChanges.d.ts +131 -0
  92. package/dist/abilityChanges.js +345 -0
  93. package/dist/abilityChanges.js.map +1 -0
  94. package/dist/ai/area.d.ts +4 -1
  95. package/dist/ai/brain.d.ts +4 -1
  96. package/dist/ai/brain.js +844 -0
  97. package/dist/ai/brain.js.map +1 -0
  98. package/dist/ai/budget.js +74 -0
  99. package/dist/ai/budget.js.map +1 -0
  100. package/dist/ai/checks.d.ts +9 -1
  101. package/dist/ai/checks.js +242 -0
  102. package/dist/ai/checks.js.map +1 -0
  103. package/dist/ai/computer.d.ts +11 -4
  104. package/dist/ai/computer.js +251 -0
  105. package/dist/ai/computer.js.map +1 -0
  106. package/dist/ai/defence.d.ts +4 -0
  107. package/dist/ai/defence.js +430 -0
  108. package/dist/ai/defence.js.map +1 -0
  109. package/dist/ai/define.d.ts +3 -2
  110. package/dist/ai/define.js +31 -0
  111. package/dist/ai/define.js.map +1 -0
  112. package/dist/ai/economy.d.ts +10 -7
  113. package/dist/ai/economy.js +780 -0
  114. package/dist/ai/economy.js.map +1 -0
  115. package/dist/ai/geometry.js +38 -0
  116. package/dist/ai/geometry.js.map +1 -0
  117. package/dist/ai/goals.d.ts +1 -0
  118. package/dist/ai/goals.js +560 -0
  119. package/dist/ai/goals.js.map +1 -0
  120. package/dist/ai/knowledge.d.ts +72 -7
  121. package/dist/ai/knowledge.js +804 -0
  122. package/dist/ai/knowledge.js.map +1 -0
  123. package/dist/ai/lanes.d.ts +10 -2
  124. package/dist/ai/lanes.js +715 -0
  125. package/dist/ai/lanes.js.map +1 -0
  126. package/dist/ai/melee/build.js +264 -0
  127. package/dist/ai/melee/build.js.map +1 -0
  128. package/dist/ai/melee/goals.d.ts +7 -0
  129. package/dist/ai/melee/goals.js +720 -0
  130. package/dist/ai/melee/goals.js.map +1 -0
  131. package/dist/ai/melee/heroes.js +68 -0
  132. package/dist/ai/melee/heroes.js.map +1 -0
  133. package/dist/ai/melee/index.d.ts +1 -1
  134. package/dist/ai/melee/index.js +51 -0
  135. package/dist/ai/melee/index.js.map +1 -0
  136. package/dist/ai/melee/production.js +29 -0
  137. package/dist/ai/melee/production.js.map +1 -0
  138. package/dist/ai/melee/surrender.js +64 -0
  139. package/dist/ai/melee/surrender.js.map +1 -0
  140. package/dist/ai/micro.d.ts +9 -0
  141. package/dist/ai/micro.js +1316 -0
  142. package/dist/ai/micro.js.map +1 -0
  143. package/dist/ai/mission.d.ts +9 -2
  144. package/dist/ai/mission.js +538 -0
  145. package/dist/ai/mission.js.map +1 -0
  146. package/dist/ai/missionRules.d.ts +1 -1
  147. package/dist/ai/missionRules.js +26 -0
  148. package/dist/ai/missionRules.js.map +1 -0
  149. package/dist/ai/module.d.ts +6 -2
  150. package/dist/ai/module.js +37 -0
  151. package/dist/ai/module.js.map +1 -0
  152. package/dist/ai/options.d.ts +3 -3
  153. package/dist/ai/plans/build.d.ts +20 -1
  154. package/dist/ai/plans/build.js +608 -0
  155. package/dist/ai/plans/build.js.map +1 -0
  156. package/dist/ai/plans/placement.d.ts +4 -1
  157. package/dist/ai/plans/placement.js +295 -0
  158. package/dist/ai/plans/placement.js.map +1 -0
  159. package/dist/ai/plans/plans.d.ts +9 -0
  160. package/dist/ai/plans/plans.js +110 -0
  161. package/dist/ai/plans/plans.js.map +1 -0
  162. package/dist/ai/plans/production.d.ts +14 -2
  163. package/dist/ai/plans/production.js +434 -0
  164. package/dist/ai/plans/production.js.map +1 -0
  165. package/dist/ai/plans/purse.d.ts +6 -3
  166. package/dist/ai/plans/purse.js +139 -0
  167. package/dist/ai/plans/purse.js.map +1 -0
  168. package/dist/ai/plans/tech.d.ts +6 -0
  169. package/dist/ai/plans/tech.js +122 -0
  170. package/dist/ai/plans/tech.js.map +1 -0
  171. package/dist/ai/profiles.d.ts +4 -4
  172. package/dist/{profiles-B3NS9jwk.js → ai/profiles.js} +3 -98
  173. package/dist/ai/profiles.js.map +1 -0
  174. package/dist/ai/reach.js +54 -0
  175. package/dist/ai/reach.js.map +1 -0
  176. package/dist/ai/report.d.ts +8 -0
  177. package/dist/ai/report.js +87 -0
  178. package/dist/ai/report.js.map +1 -0
  179. package/dist/ai/roles.d.ts +4 -0
  180. package/dist/ai/roles.js +207 -0
  181. package/dist/ai/roles.js.map +1 -0
  182. package/dist/ai/rules.d.ts +8 -2
  183. package/dist/ai/rules.js +416 -0
  184. package/dist/ai/rules.js.map +1 -0
  185. package/dist/ai/scouting.d.ts +6 -0
  186. package/dist/ai/scouting.js +324 -0
  187. package/dist/ai/scouting.js.map +1 -0
  188. package/dist/ai/settings.js +99 -0
  189. package/dist/ai/settings.js.map +1 -0
  190. package/dist/ai/squads.d.ts +21 -2
  191. package/dist/ai/squads.js +916 -0
  192. package/dist/ai/squads.js.map +1 -0
  193. package/dist/ai/strength.js +320 -0
  194. package/dist/ai/strength.js.map +1 -0
  195. package/dist/ai/task.d.ts +3 -1
  196. package/dist/ai/task.js +17 -0
  197. package/dist/ai/task.js.map +1 -0
  198. package/dist/ai/tasks/attack.js +24 -0
  199. package/dist/ai/tasks/attack.js.map +1 -0
  200. package/dist/ai/tasks/capture.d.ts +3 -3
  201. package/dist/ai/tasks/capture.js +37 -0
  202. package/dist/ai/tasks/capture.js.map +1 -0
  203. package/dist/ai/tasks/creep.js +29 -0
  204. package/dist/ai/tasks/creep.js.map +1 -0
  205. package/dist/ai/tasks/defend.js +61 -0
  206. package/dist/ai/tasks/defend.js.map +1 -0
  207. package/dist/ai/tasks/drop.js +81 -0
  208. package/dist/ai/tasks/drop.js.map +1 -0
  209. package/dist/ai/tasks/escort.js +59 -0
  210. package/dist/ai/tasks/escort.js.map +1 -0
  211. package/dist/ai/tasks/gather.js +48 -0
  212. package/dist/ai/tasks/gather.js.map +1 -0
  213. package/dist/ai/tasks/harass.js +39 -0
  214. package/dist/ai/tasks/harass.js.map +1 -0
  215. package/dist/ai/tasks/hold.js +32 -0
  216. package/dist/ai/tasks/hold.js.map +1 -0
  217. package/dist/ai/tasks/index.js +34 -0
  218. package/dist/ai/tasks/index.js.map +1 -0
  219. package/dist/ai/tasks/move.js +26 -0
  220. package/dist/ai/tasks/move.js.map +1 -0
  221. package/dist/ai/tasks/patrol.js +59 -0
  222. package/dist/ai/tasks/patrol.js.map +1 -0
  223. package/dist/ai/tasks/retreat.js +28 -0
  224. package/dist/ai/tasks/retreat.js.map +1 -0
  225. package/dist/ai/tasks/scout.js +73 -0
  226. package/dist/ai/tasks/scout.js.map +1 -0
  227. package/dist/ai/tasks/shared.d.ts +1 -1
  228. package/dist/ai/tasks/shared.js +137 -0
  229. package/dist/ai/tasks/shared.js.map +1 -0
  230. package/dist/ai/team.d.ts +18 -1
  231. package/dist/ai/team.js +492 -0
  232. package/dist/ai/team.js.map +1 -0
  233. package/dist/ai/threat.d.ts +6 -0
  234. package/dist/ai/threat.js +206 -0
  235. package/dist/ai/threat.js.map +1 -0
  236. package/dist/ai/view.d.ts +21 -7
  237. package/dist/ai/view.js +677 -0
  238. package/dist/ai/view.js.map +1 -0
  239. package/dist/ai/waves.d.ts +6 -0
  240. package/dist/ai/waves.js +410 -0
  241. package/dist/ai/waves.js.map +1 -0
  242. package/dist/ai.js +54 -6239
  243. package/dist/aiTesting.d.ts +6 -3
  244. package/dist/aiTesting.js +229 -0
  245. package/dist/aiTesting.js.map +1 -0
  246. package/dist/areas.d.ts +4 -1
  247. package/dist/areas.js +295 -0
  248. package/dist/areas.js.map +1 -0
  249. package/dist/attacks.d.ts +3 -3
  250. package/dist/attacks.js +127 -0
  251. package/dist/attacks.js.map +1 -0
  252. package/dist/burning.d.ts +267 -0
  253. package/dist/burning.js +795 -0
  254. package/dist/burning.js.map +1 -0
  255. package/dist/bytes.js +21 -0
  256. package/dist/bytes.js.map +1 -0
  257. package/dist/callings.d.ts +71 -0
  258. package/dist/callings.js +157 -0
  259. package/dist/callings.js.map +1 -0
  260. package/dist/cameraOrders.d.ts +78 -0
  261. package/dist/cameraOrders.js +114 -0
  262. package/dist/cameraOrders.js.map +1 -0
  263. package/dist/camps.d.ts +70 -4
  264. package/dist/camps.js +501 -0
  265. package/dist/camps.js.map +1 -0
  266. package/dist/capture.d.ts +15 -3
  267. package/dist/capture.js +304 -0
  268. package/dist/capture.js.map +1 -0
  269. package/dist/cellLayers.d.ts +78 -13
  270. package/dist/cellLayers.js +275 -0
  271. package/dist/cellLayers.js.map +1 -0
  272. package/dist/cellPatches.d.ts +24 -0
  273. package/dist/cellPatches.js +73 -0
  274. package/dist/cellPatches.js.map +1 -0
  275. package/dist/cinematics.d.ts +10 -5
  276. package/dist/cinematics.js +161 -0
  277. package/dist/cinematics.js.map +1 -0
  278. package/dist/clock.d.ts +2 -2
  279. package/dist/clock.js +78 -0
  280. package/dist/clock.js.map +1 -0
  281. package/dist/commands.d.ts +36 -4
  282. package/dist/commands.js +636 -0
  283. package/dist/commands.js.map +1 -0
  284. package/dist/components.d.ts +31 -10
  285. package/dist/components.js +74 -0
  286. package/dist/components.js.map +1 -0
  287. package/dist/computers.d.ts +4 -4
  288. package/dist/computers.js +194 -0
  289. package/dist/computers.js.map +1 -0
  290. package/dist/concealment.d.ts +25 -2
  291. package/dist/concealment.js +409 -0
  292. package/dist/concealment.js.map +1 -0
  293. package/dist/coreComponents.js +130 -0
  294. package/dist/coreComponents.js.map +1 -0
  295. package/dist/createGame.d.ts +306 -0
  296. package/dist/createGame.js +405 -0
  297. package/dist/createGame.js.map +1 -0
  298. package/dist/dashing.d.ts +18 -2
  299. package/dist/dashing.js +41 -0
  300. package/dist/dashing.js.map +1 -0
  301. package/dist/debug.d.ts +8 -0
  302. package/dist/debug.js +5 -3
  303. package/dist/debug2.js +76 -0
  304. package/dist/debug2.js.map +1 -0
  305. package/dist/debugCommands.d.ts +6 -6
  306. package/dist/debugCommands.js +537 -0
  307. package/dist/debugCommands.js.map +1 -0
  308. package/dist/debugging.d.ts +1 -0
  309. package/dist/defaultSets.d.ts +183 -0
  310. package/dist/defaultSets.js +216 -0
  311. package/dist/defaultSets.js.map +1 -0
  312. package/dist/definitions.d.ts +6 -0
  313. package/dist/definitions.js +78 -0
  314. package/dist/definitions.js.map +1 -0
  315. package/dist/defs.d.ts +1895 -165
  316. package/dist/defs.js +380 -0
  317. package/dist/defs.js.map +1 -0
  318. package/dist/denying.d.ts +4 -4
  319. package/dist/denying.js +106 -0
  320. package/dist/denying.js.map +1 -0
  321. package/dist/destructibles.d.ts +2 -2
  322. package/dist/destructibles.js +36 -0
  323. package/dist/destructibles.js.map +1 -0
  324. package/dist/determinism.d.ts +4 -4
  325. package/dist/determinism.js +247 -0
  326. package/dist/determinism.js.map +1 -0
  327. package/dist/dialog.d.ts +17 -2
  328. package/dist/dialog.js +108 -0
  329. package/dist/dialog.js.map +1 -0
  330. package/dist/effectRefs.js +28 -0
  331. package/dist/effectRefs.js.map +1 -0
  332. package/dist/effects.d.ts +27 -11
  333. package/dist/effects.js +110 -0
  334. package/dist/effects.js.map +1 -0
  335. package/dist/endings.d.ts +1 -1
  336. package/dist/endings.js +78 -0
  337. package/dist/endings.js.map +1 -0
  338. package/dist/engagement.d.ts +40 -6
  339. package/dist/engagement.js +530 -0
  340. package/dist/engagement.js.map +1 -0
  341. package/dist/engineEvents.d.ts +72 -9
  342. package/dist/engineEvents.js +520 -0
  343. package/dist/engineEvents.js.map +1 -0
  344. package/dist/entity.d.ts +275 -26
  345. package/dist/entity.js +441 -0
  346. package/dist/entity.js.map +1 -0
  347. package/dist/entityIndex.d.ts +10 -3
  348. package/dist/entityIndex.js +149 -0
  349. package/dist/entityIndex.js.map +1 -0
  350. package/dist/errors.d.ts +6 -2
  351. package/dist/errors.js +59 -0
  352. package/dist/errors.js.map +1 -0
  353. package/dist/events.d.ts +11 -5
  354. package/dist/events.js +158 -0
  355. package/dist/events.js.map +1 -0
  356. package/dist/exactMath.js +273 -0
  357. package/dist/exactMath.js.map +1 -0
  358. package/dist/features.d.ts +1 -1
  359. package/dist/features.js +127 -0
  360. package/dist/features.js.map +1 -0
  361. package/dist/fields.d.ts +25 -5
  362. package/dist/fields.js +140 -0
  363. package/dist/fields.js.map +1 -0
  364. package/dist/fixture.d.ts +3 -3
  365. package/dist/fixture.js +512 -0
  366. package/dist/fixture.js.map +1 -0
  367. package/dist/fog.d.ts +26 -3
  368. package/dist/fog.js +333 -0
  369. package/dist/fog.js.map +1 -0
  370. package/dist/foliage.d.ts +476 -0
  371. package/dist/foliage.js +1478 -0
  372. package/dist/foliage.js.map +1 -0
  373. package/dist/foliageDebug.d.ts +57 -0
  374. package/dist/foliageDebug.js +172 -0
  375. package/dist/foliageDebug.js.map +1 -0
  376. package/dist/foliageRegrowth.d.ts +20 -0
  377. package/dist/foliageRegrowth.js +332 -0
  378. package/dist/foliageRegrowth.js.map +1 -0
  379. package/dist/formState.d.ts +67 -0
  380. package/dist/formState.js +65 -0
  381. package/dist/formState.js.map +1 -0
  382. package/dist/formation.d.ts +46 -8
  383. package/dist/formation.js +297 -0
  384. package/dist/formation.js.map +1 -0
  385. package/dist/forms.d.ts +58 -0
  386. package/dist/forms.js +146 -0
  387. package/dist/forms.js.map +1 -0
  388. package/dist/friendlyFire.d.ts +2 -2
  389. package/dist/friendlyFire.js +37 -0
  390. package/dist/friendlyFire.js.map +1 -0
  391. package/dist/game.d.ts +141 -48
  392. package/dist/game.js +834 -0
  393. package/dist/game.js.map +1 -0
  394. package/dist/gameData.d.ts +96 -22
  395. package/dist/gameData.js +1690 -0
  396. package/dist/gameData.js.map +1 -0
  397. package/dist/gameFiles.d.ts +3 -3
  398. package/dist/gameFiles.js +14 -0
  399. package/dist/gameFiles.js.map +1 -0
  400. package/dist/gates.js +92 -0
  401. package/dist/gates.js.map +1 -0
  402. package/dist/generate.d.ts +28 -1
  403. package/dist/generate.js +1062 -0
  404. package/dist/generate.js.map +1 -0
  405. package/dist/generateWorker.d.ts +7 -3
  406. package/dist/generateWorker.js +86 -0
  407. package/dist/generateWorker.js.map +1 -0
  408. package/dist/grid.d.ts +9 -0
  409. package/dist/grid.js +102 -0
  410. package/dist/grid.js.map +1 -0
  411. package/dist/ground.d.ts +17 -1
  412. package/dist/ground.js +375 -0
  413. package/dist/ground.js.map +1 -0
  414. package/dist/groundObjects.d.ts +70 -0
  415. package/dist/groundObjects.js +371 -0
  416. package/dist/groundObjects.js.map +1 -0
  417. package/dist/groundSpeed.d.ts +20 -3
  418. package/dist/groundSpeed.js +117 -0
  419. package/dist/groundSpeed.js.map +1 -0
  420. package/dist/hero.d.ts +126 -10
  421. package/dist/hero.js +432 -0
  422. package/dist/hero.js.map +1 -0
  423. package/dist/holds.d.ts +94 -0
  424. package/dist/holds.js +305 -0
  425. package/dist/holds.js.map +1 -0
  426. package/dist/home.d.ts +1 -1
  427. package/dist/home.js +30 -0
  428. package/dist/home.js.map +1 -0
  429. package/dist/hooks.d.ts +339 -57
  430. package/dist/hooks.js +105 -0
  431. package/dist/hooks.js.map +1 -0
  432. package/dist/hotReload.d.ts +6 -5
  433. package/dist/hotReload.js +145 -0
  434. package/dist/hotReload.js.map +1 -0
  435. package/dist/ids.d.ts +3 -3
  436. package/dist/ids.js +30 -0
  437. package/dist/ids.js.map +1 -0
  438. package/dist/idsFile.d.ts +36 -0
  439. package/dist/idsFile.js +134 -0
  440. package/dist/idsFile.js.map +1 -0
  441. package/dist/index.d.ts +105 -68
  442. package/dist/index.js +194 -4701
  443. package/dist/inspect.d.ts +29 -2
  444. package/dist/{inspect-D9dWHmZ0.js → inspect.js} +21 -12
  445. package/dist/inspect.js.map +1 -0
  446. package/dist/inventory.d.ts +14 -1
  447. package/dist/inventory.js +84 -0
  448. package/dist/inventory.js.map +1 -0
  449. package/dist/items.d.ts +136 -8
  450. package/dist/items.js +585 -0
  451. package/dist/items.js.map +1 -0
  452. package/dist/lanes.d.ts +12 -3
  453. package/dist/lanes.js +496 -0
  454. package/dist/lanes.js.map +1 -0
  455. package/dist/life.d.ts +6 -2
  456. package/dist/life.js +287 -0
  457. package/dist/life.js.map +1 -0
  458. package/dist/log.d.ts +26 -3
  459. package/dist/log.js +192 -0
  460. package/dist/log.js.map +1 -0
  461. package/dist/manaBurn.d.ts +2 -2
  462. package/dist/manaBurn.js +75 -0
  463. package/dist/manaBurn.js.map +1 -0
  464. package/dist/map/file.d.ts +56 -3
  465. package/dist/map/file.js +264 -0
  466. package/dist/map/file.js.map +1 -0
  467. package/dist/map/images.js +61 -0
  468. package/dist/map/images.js.map +1 -0
  469. package/dist/map/look.d.ts +1 -1
  470. package/dist/map/look.js +30 -0
  471. package/dist/map/look.js.map +1 -0
  472. package/dist/map/pathProfile.js +183 -0
  473. package/dist/map/pathProfile.js.map +1 -0
  474. package/dist/map/resize.d.ts +4 -0
  475. package/dist/map/resize.js +136 -0
  476. package/dist/map/resize.js.map +1 -0
  477. package/dist/map/schema.js +257 -0
  478. package/dist/map/schema.js.map +1 -0
  479. package/dist/map/terrain.js +214 -0
  480. package/dist/map/terrain.js.map +1 -0
  481. package/dist/map/types.d.ts +92 -13
  482. package/dist/map/types.js +251 -0
  483. package/dist/map/types.js.map +1 -0
  484. package/dist/mapCheck/cells.js +94 -0
  485. package/dist/mapCheck/cells.js.map +1 -0
  486. package/dist/mapCheck/rules/foliage.d.ts +9 -0
  487. package/dist/mapCheck/rules/foliage.js +83 -0
  488. package/dist/mapCheck/rules/foliage.js.map +1 -0
  489. package/dist/mapCheck/rules/names.js +39 -0
  490. package/dist/mapCheck/rules/names.js.map +1 -0
  491. package/dist/mapCheck/rules/objects.d.ts +1 -1
  492. package/dist/mapCheck/rules/objects.js +56 -0
  493. package/dist/mapCheck/rules/objects.js.map +1 -0
  494. package/dist/mapCheck/rules/paths.js +32 -0
  495. package/dist/mapCheck/rules/paths.js.map +1 -0
  496. package/dist/mapCheck/rules/players.js +20 -0
  497. package/dist/mapCheck/rules/players.js.map +1 -0
  498. package/dist/mapCheck/rules/races.js +56 -0
  499. package/dist/mapCheck/rules/races.js.map +1 -0
  500. package/dist/mapCheck/rules/random.js +47 -0
  501. package/dist/mapCheck/rules/random.js.map +1 -0
  502. package/dist/mapCheck/rules/regions.js +30 -0
  503. package/dist/mapCheck/rules/regions.js.map +1 -0
  504. package/dist/mapCheck/rules/targets.js +31 -0
  505. package/dist/mapCheck/rules/targets.js.map +1 -0
  506. package/dist/mapCheck/rules/walking.js +45 -0
  507. package/dist/mapCheck/rules/walking.js.map +1 -0
  508. package/dist/mapCheck.d.ts +2 -2
  509. package/dist/mapCheck.js +63 -0
  510. package/dist/mapCheck.js.map +1 -0
  511. package/dist/mapFields.d.ts +25 -2
  512. package/dist/mapFields.js +134 -0
  513. package/dist/mapFields.js.map +1 -0
  514. package/dist/mapFile.js +176 -0
  515. package/dist/mapFile.js.map +1 -0
  516. package/dist/mapMeasure.d.ts +8 -0
  517. package/dist/mapMeasure.js +283 -0
  518. package/dist/mapMeasure.js.map +1 -0
  519. package/dist/mapMerge.d.ts +1 -0
  520. package/dist/mapMerge.js +172 -0
  521. package/dist/mapMerge.js.map +1 -0
  522. package/dist/mapObjectives.js +138 -0
  523. package/dist/mapObjectives.js.map +1 -0
  524. package/dist/mapObjects.js +80 -0
  525. package/dist/mapObjects.js.map +1 -0
  526. package/dist/math.d.ts +37 -7
  527. package/dist/math.js +155 -0
  528. package/dist/math.js.map +1 -0
  529. package/dist/messages.d.ts +71 -4
  530. package/dist/messages.js +29 -0
  531. package/dist/messages.js.map +1 -0
  532. package/dist/missionRules.d.ts +10 -2
  533. package/dist/{missionRules-C-bGxm0Q.js → missionRules.js} +30 -150
  534. package/dist/missionRules.js.map +1 -0
  535. package/dist/mods.d.ts +39 -20
  536. package/dist/mods.js +271 -0
  537. package/dist/mods.js.map +1 -0
  538. package/dist/moves.d.ts +87 -0
  539. package/dist/moves.js +539 -0
  540. package/dist/moves.js.map +1 -0
  541. package/dist/names.d.ts +7 -0
  542. package/dist/names.js +122 -0
  543. package/dist/names.js.map +1 -0
  544. package/dist/navigation/agentParams.js +14 -0
  545. package/dist/navigation/agentParams.js.map +1 -0
  546. package/dist/navigation/air.d.ts +7 -3
  547. package/dist/navigation/air.js +401 -0
  548. package/dist/navigation/air.js.map +1 -0
  549. package/dist/navigation/builds.d.ts +34 -2
  550. package/dist/navigation/builds.js +287 -0
  551. package/dist/navigation/builds.js.map +1 -0
  552. package/dist/navigation/groundAreas.d.ts +59 -1
  553. package/dist/navigation/groundAreas.js +407 -0
  554. package/dist/navigation/groundAreas.js.map +1 -0
  555. package/dist/navigation/navigation.d.ts +98 -9
  556. package/dist/navigation/recast.d.ts +194 -18
  557. package/dist/navigation/recast.js +1379 -0
  558. package/dist/navigation/recast.js.map +1 -0
  559. package/dist/navigation/sidePaths.d.ts +8 -3
  560. package/dist/navigation/sidePaths.js +241 -0
  561. package/dist/navigation/sidePaths.js.map +1 -0
  562. package/dist/navigation/sized.js +243 -0
  563. package/dist/navigation/sized.js.map +1 -0
  564. package/dist/nearest.js +32 -0
  565. package/dist/nearest.js.map +1 -0
  566. package/dist/noise.js +59 -0
  567. package/dist/noise.js.map +1 -0
  568. package/dist/objectives.d.ts +12 -3
  569. package/dist/objectives.js +144 -0
  570. package/dist/objectives.js.map +1 -0
  571. package/dist/orders/basic.d.ts +5 -5
  572. package/dist/orders/basic.js +417 -0
  573. package/dist/orders/basic.js.map +1 -0
  574. package/dist/orders/build.js +278 -0
  575. package/dist/orders/build.js.map +1 -0
  576. package/dist/orders/cast.d.ts +13 -3
  577. package/dist/orders/cast.js +558 -0
  578. package/dist/orders/cast.js.map +1 -0
  579. package/dist/orders/facts.js +16 -0
  580. package/dist/orders/facts.js.map +1 -0
  581. package/dist/orders/harvest.d.ts +21 -5
  582. package/dist/orders/harvest.js +540 -0
  583. package/dist/orders/harvest.js.map +1 -0
  584. package/dist/orders/idle.d.ts +3 -1
  585. package/dist/orders/idle.js +234 -0
  586. package/dist/orders/idle.js.map +1 -0
  587. package/dist/orders/items.js +92 -0
  588. package/dist/orders/items.js.map +1 -0
  589. package/dist/orders/queue.js +108 -0
  590. package/dist/orders/queue.js.map +1 -0
  591. package/dist/orders/waiting.d.ts +39 -0
  592. package/dist/orders/waiting.js +149 -0
  593. package/dist/orders/waiting.js.map +1 -0
  594. package/dist/pack.schema.js +13 -0
  595. package/dist/pack.schema.js.map +1 -0
  596. package/dist/pack.schema.json +7622 -841
  597. package/dist/packs/director/index.d.ts +13 -5
  598. package/dist/packs/director/index.js +204 -0
  599. package/dist/packs/director/index.js.map +1 -0
  600. package/dist/packs/heroes/campaign.d.ts +3 -2
  601. package/dist/packs/heroes/campaign.js +241 -0
  602. package/dist/packs/heroes/campaign.js.map +1 -0
  603. package/dist/packs/heroes/carry.d.ts +6 -0
  604. package/dist/packs/heroes/carry.js +112 -0
  605. package/dist/packs/heroes/carry.js.map +1 -0
  606. package/dist/packs/heroes/commands.js +115 -0
  607. package/dist/packs/heroes/commands.js.map +1 -0
  608. package/dist/packs/heroes/fallen.d.ts +43 -0
  609. package/dist/packs/heroes/fallen.js +61 -0
  610. package/dist/packs/heroes/fallen.js.map +1 -0
  611. package/dist/packs/heroes/hire.js +60 -0
  612. package/dist/packs/heroes/hire.js.map +1 -0
  613. package/dist/packs/heroes/index.d.ts +7 -6
  614. package/dist/packs/heroes/index.js +130 -0
  615. package/dist/packs/heroes/index.js.map +1 -0
  616. package/dist/packs/heroes/loop.d.ts +95 -0
  617. package/dist/packs/heroes/loop.js +250 -0
  618. package/dist/packs/heroes/loop.js.map +1 -0
  619. package/dist/packs/heroes/making.d.ts +6 -3
  620. package/dist/packs/heroes/making.js +55 -0
  621. package/dist/packs/heroes/making.js.map +1 -0
  622. package/dist/packs/heroes/respawn.d.ts +3 -3
  623. package/dist/packs/heroes/respawn.js +87 -0
  624. package/dist/packs/heroes/respawn.js.map +1 -0
  625. package/dist/packs/heroes/sets.d.ts +32 -0
  626. package/dist/packs/heroes/sets.js +51 -0
  627. package/dist/packs/heroes/sets.js.map +1 -0
  628. package/dist/packs/heroes/spells.d.ts +16 -0
  629. package/dist/packs/heroes/spells.js +269 -0
  630. package/dist/packs/heroes/spells.js.map +1 -0
  631. package/dist/packs/items/defaults.d.ts +43 -0
  632. package/dist/packs/items/defaults.js +1504 -0
  633. package/dist/packs/items/defaults.js.map +1 -0
  634. package/dist/packs/items/index.d.ts +27 -0
  635. package/dist/packs/items/index.js +214 -0
  636. package/dist/packs/items/index.js.map +1 -0
  637. package/dist/packs/moba/index.d.ts +3 -3
  638. package/dist/packs/moba/index.js +174 -0
  639. package/dist/packs/moba/index.js.map +1 -0
  640. package/dist/packs/pack.d.ts +15 -15
  641. package/dist/packs/pack.js +14 -0
  642. package/dist/packs/pack.js.map +1 -0
  643. package/dist/packs.d.ts +15 -7
  644. package/dist/packs.js +222 -0
  645. package/dist/packs.js.map +1 -0
  646. package/dist/paths.d.ts +2 -0
  647. package/dist/paths.js +109 -0
  648. package/dist/paths.js.map +1 -0
  649. package/dist/plain.js +57 -0
  650. package/dist/plain.js.map +1 -0
  651. package/dist/player.d.ts +33 -10
  652. package/dist/player.js +159 -0
  653. package/dist/player.js.map +1 -0
  654. package/dist/portals.d.ts +1 -1
  655. package/dist/portals.js +194 -0
  656. package/dist/portals.js.map +1 -0
  657. package/dist/prefabs.d.ts +25 -2
  658. package/dist/prefabs.js +239 -0
  659. package/dist/prefabs.js.map +1 -0
  660. package/dist/presetBuildings.js +58 -0
  661. package/dist/presetBuildings.js.map +1 -0
  662. package/dist/presetFoliage.d.ts +27 -0
  663. package/dist/presetFoliage.js +98 -0
  664. package/dist/presetFoliage.js.map +1 -0
  665. package/dist/presetGround.js +65 -0
  666. package/dist/presetGround.js.map +1 -0
  667. package/dist/proxies.d.ts +12 -0
  668. package/dist/proxies.js +79 -0
  669. package/dist/proxies.js.map +1 -0
  670. package/dist/query.d.ts +56 -0
  671. package/dist/query.js +88 -0
  672. package/dist/query.js.map +1 -0
  673. package/dist/races.d.ts +15 -14
  674. package/dist/races.js +172 -0
  675. package/dist/races.js.map +1 -0
  676. package/dist/randomGroups.js +91 -0
  677. package/dist/randomGroups.js.map +1 -0
  678. package/dist/registry.d.ts +117 -53
  679. package/dist/registry.js +323 -0
  680. package/dist/registry.js.map +1 -0
  681. package/dist/remains.d.ts +11 -9
  682. package/dist/remains.js +188 -0
  683. package/dist/remains.js.map +1 -0
  684. package/dist/replication.d.ts +12 -7
  685. package/dist/replication.js +100 -0
  686. package/dist/replication.js.map +1 -0
  687. package/dist/rng.d.ts +2 -0
  688. package/dist/rng.js +40 -0
  689. package/dist/rng.js.map +1 -0
  690. package/dist/rules.d.ts +186 -99
  691. package/dist/rules.js +179 -0
  692. package/dist/rules.js.map +1 -0
  693. package/dist/rulesCheck.d.ts +5 -4
  694. package/dist/rulesCheck.js +693 -0
  695. package/dist/rulesCheck.js.map +1 -0
  696. package/dist/runes.d.ts +2 -2
  697. package/dist/runes.js +80 -0
  698. package/dist/runes.js.map +1 -0
  699. package/dist/save.d.ts +37 -12
  700. package/dist/save.js +532 -0
  701. package/dist/save.js.map +1 -0
  702. package/dist/scenario.d.ts +2 -2
  703. package/dist/scenario.js +99 -0
  704. package/dist/scenario.js.map +1 -0
  705. package/dist/scheduler.d.ts +3 -0
  706. package/dist/scheduler.js +156 -0
  707. package/dist/scheduler.js.map +1 -0
  708. package/dist/score.d.ts +19 -19
  709. package/dist/score.js +709 -0
  710. package/dist/score.js.map +1 -0
  711. package/dist/sequences.d.ts +10 -6
  712. package/dist/sequences.js +206 -0
  713. package/dist/sequences.js.map +1 -0
  714. package/dist/server/doorman.js +154 -0
  715. package/dist/server/doorman.js.map +1 -0
  716. package/dist/server/gameServer.d.ts +16 -1
  717. package/dist/server/gameServer.js +643 -0
  718. package/dist/server/gameServer.js.map +1 -0
  719. package/dist/server/index.d.ts +1 -1
  720. package/dist/server/lobby.js +199 -0
  721. package/dist/server/lobby.js.map +1 -0
  722. package/dist/server/log.js +18 -0
  723. package/dist/server/log.js.map +1 -0
  724. package/dist/server/match.js +267 -0
  725. package/dist/server/match.js.map +1 -0
  726. package/dist/server/mode.d.ts +18 -9
  727. package/dist/server/mode.js +220 -0
  728. package/dist/server/mode.js.map +1 -0
  729. package/dist/{navigation-worker.js → server/navigation-worker.js} +1 -1
  730. package/dist/server/navigation-worker.js.map +1 -0
  731. package/dist/server/navigation.js +39 -0
  732. package/dist/server/navigation.js.map +1 -0
  733. package/dist/server/ops.d.ts +4 -0
  734. package/dist/server/ops.js +137 -0
  735. package/dist/server/ops.js.map +1 -0
  736. package/dist/server/packs.d.ts +3 -3
  737. package/dist/server/packs.js +32 -0
  738. package/dist/server/packs.js.map +1 -0
  739. package/dist/server/ratings.d.ts +5 -0
  740. package/dist/server/ratings.js +104 -0
  741. package/dist/server/ratings.js.map +1 -0
  742. package/dist/server/relay.d.ts +12 -2
  743. package/dist/server/relay.js +144 -0
  744. package/dist/server/relay.js.map +1 -0
  745. package/dist/server/rooms.d.ts +9 -2
  746. package/dist/server/rooms.js +442 -0
  747. package/dist/server/rooms.js.map +1 -0
  748. package/dist/server/seat.js +116 -0
  749. package/dist/server/seat.js.map +1 -0
  750. package/dist/server/seatSettings.d.ts +3 -3
  751. package/dist/server/seatSettings.js +63 -0
  752. package/dist/server/seatSettings.js.map +1 -0
  753. package/dist/server/secret.js +13 -0
  754. package/dist/server/secret.js.map +1 -0
  755. package/dist/server/start.d.ts +13 -6
  756. package/dist/server/start.js +76 -0
  757. package/dist/server/start.js.map +1 -0
  758. package/dist/server/websocket.d.ts +9 -1
  759. package/dist/server/websocket.js +306 -0
  760. package/dist/server/websocket.js.map +1 -0
  761. package/dist/server.js +15 -2861
  762. package/dist/session/can.js +26 -0
  763. package/dist/session/can.js.map +1 -0
  764. package/dist/session/commandReplay.d.ts +8 -2
  765. package/dist/session/commandReplay.js +293 -0
  766. package/dist/session/commandReplay.js.map +1 -0
  767. package/dist/session/debug.js +151 -0
  768. package/dist/session/debug.js.map +1 -0
  769. package/dist/session/delay.js +62 -0
  770. package/dist/session/delay.js.map +1 -0
  771. package/dist/session/delta.d.ts +14 -1
  772. package/dist/session/delta.js +407 -0
  773. package/dist/session/delta.js.map +1 -0
  774. package/dist/session/entityState.js +415 -0
  775. package/dist/session/entityState.js.map +1 -0
  776. package/dist/session/local.d.ts +47 -5
  777. package/dist/session/local.js +670 -0
  778. package/dist/session/local.js.map +1 -0
  779. package/dist/session/memory.d.ts +20 -2
  780. package/dist/session/memory.js +131 -0
  781. package/dist/session/memory.js.map +1 -0
  782. package/dist/session/protocol.d.ts +325 -31
  783. package/dist/session/protocol.js +55 -0
  784. package/dist/session/protocol.js.map +1 -0
  785. package/dist/session/remote.d.ts +74 -12
  786. package/dist/session/remote.js +1394 -0
  787. package/dist/session/remote.js.map +1 -0
  788. package/dist/session/replay.d.ts +11 -2
  789. package/dist/session/replay.js +160 -0
  790. package/dist/session/replay.js.map +1 -0
  791. package/dist/session/seed.js +12 -0
  792. package/dist/session/seed.js.map +1 -0
  793. package/dist/session/share.d.ts +5 -1
  794. package/dist/session/share.js +94 -0
  795. package/dist/session/share.js.map +1 -0
  796. package/dist/session/socket.d.ts +1 -1
  797. package/dist/session/socket.js +29 -0
  798. package/dist/session/socket.js.map +1 -0
  799. package/dist/session/wire.d.ts +5 -0
  800. package/dist/session/wire.js +84 -0
  801. package/dist/session/wire.js.map +1 -0
  802. package/dist/session/worker.d.ts +77 -12
  803. package/dist/session/worker.js +499 -0
  804. package/dist/session/worker.js.map +1 -0
  805. package/dist/shared.d.ts +31 -5
  806. package/dist/shared.js +166 -0
  807. package/dist/shared.js.map +1 -0
  808. package/dist/sides.d.ts +9 -3
  809. package/dist/sides.js +149 -0
  810. package/dist/sides.js.map +1 -0
  811. package/dist/sight.js +85 -0
  812. package/dist/sight.js.map +1 -0
  813. package/dist/simulate-worker.js +1 -1
  814. package/dist/simulate.d.ts +12 -8
  815. package/dist/{simulate-oXBiw1Ff.js → simulate.js} +10 -11
  816. package/dist/simulate.js.map +1 -0
  817. package/dist/smart.js +77 -0
  818. package/dist/smart.js.map +1 -0
  819. package/dist/spatial.d.ts +32 -16
  820. package/dist/spatial.js +234 -0
  821. package/dist/spatial.js.map +1 -0
  822. package/dist/spawning.d.ts +1 -0
  823. package/dist/spawning.js +224 -0
  824. package/dist/spawning.js.map +1 -0
  825. package/dist/stances.d.ts +6 -3
  826. package/dist/stances.js +169 -0
  827. package/dist/stances.js.map +1 -0
  828. package/dist/start.d.ts +10 -10
  829. package/dist/start.js +75 -0
  830. package/dist/start.js.map +1 -0
  831. package/dist/stats.d.ts +42 -16
  832. package/dist/stats.js +290 -0
  833. package/dist/stats.js.map +1 -0
  834. package/dist/summoned.d.ts +52 -0
  835. package/dist/summoned.js +38 -0
  836. package/dist/summoned.js.map +1 -0
  837. package/dist/summons.d.ts +10 -13
  838. package/dist/summons.js +271 -0
  839. package/dist/summons.js.map +1 -0
  840. package/dist/systems/abilities.js +224 -0
  841. package/dist/systems/abilities.js.map +1 -0
  842. package/dist/systems/combat.d.ts +35 -1
  843. package/dist/systems/combat.js +677 -0
  844. package/dist/systems/combat.js.map +1 -0
  845. package/dist/systems/combatTold.d.ts +3 -1
  846. package/dist/systems/combatTold.js +85 -0
  847. package/dist/systems/combatTold.js.map +1 -0
  848. package/dist/systems/construction.js +80 -0
  849. package/dist/systems/construction.js.map +1 -0
  850. package/dist/systems/economy.d.ts +0 -6
  851. package/dist/systems/economy.js +128 -0
  852. package/dist/systems/economy.js.map +1 -0
  853. package/dist/systems/fog.d.ts +1 -1
  854. package/dist/systems/fog.js +120 -0
  855. package/dist/systems/fog.js.map +1 -0
  856. package/dist/systems/life.js +32 -0
  857. package/dist/systems/life.js.map +1 -0
  858. package/dist/systems/movement.d.ts +24 -12
  859. package/dist/systems/movement.js +1247 -0
  860. package/dist/systems/movement.js.map +1 -0
  861. package/dist/systems/orders.js +64 -0
  862. package/dist/systems/orders.js.map +1 -0
  863. package/dist/systems/production.js +322 -0
  864. package/dist/systems/production.js.map +1 -0
  865. package/dist/systems/productionQueue.js +120 -0
  866. package/dist/systems/productionQueue.js.map +1 -0
  867. package/dist/systems/victory.d.ts +1 -1
  868. package/dist/systems/victory.js +56 -0
  869. package/dist/systems/victory.js.map +1 -0
  870. package/dist/talk.d.ts +6 -6
  871. package/dist/talk.js +153 -0
  872. package/dist/talk.js.map +1 -0
  873. package/dist/targeting.d.ts +142 -0
  874. package/dist/targeting.js +49 -0
  875. package/dist/targeting.js.map +1 -0
  876. package/dist/tech.d.ts +20 -3
  877. package/dist/tech.js +239 -0
  878. package/dist/tech.js.map +1 -0
  879. package/dist/techTree.d.ts +7 -0
  880. package/dist/techTree.js +90 -0
  881. package/dist/techTree.js.map +1 -0
  882. package/dist/terrain.d.ts +59 -7
  883. package/dist/terrain.js +389 -0
  884. package/dist/terrain.js.map +1 -0
  885. package/dist/terrainSave.d.ts +6 -0
  886. package/dist/terrainSave.js +74 -0
  887. package/dist/terrainSave.js.map +1 -0
  888. package/dist/testing.d.ts +8 -7
  889. package/dist/testing.js +13 -739
  890. package/dist/testing.js.map +1 -1
  891. package/dist/tiles.d.ts +1 -1
  892. package/dist/tiles.js +43 -0
  893. package/dist/tiles.js.map +1 -0
  894. package/dist/timers.d.ts +29 -4
  895. package/dist/timers.js +242 -0
  896. package/dist/timers.js.map +1 -0
  897. package/dist/tomes.d.ts +4 -4
  898. package/dist/tomes.js +94 -0
  899. package/dist/tomes.js.map +1 -0
  900. package/dist/trade.js +103 -0
  901. package/dist/trade.js.map +1 -0
  902. package/dist/transport.d.ts +6 -1
  903. package/dist/transport.js +281 -0
  904. package/dist/transport.js.map +1 -0
  905. package/dist/tunables.d.ts +10 -3
  906. package/dist/tunables.js +56 -0
  907. package/dist/tunables.js.map +1 -0
  908. package/dist/unitResources.d.ts +67 -0
  909. package/dist/unitResources.js +266 -0
  910. package/dist/unitResources.js.map +1 -0
  911. package/dist/upkeep.d.ts +6 -1
  912. package/dist/upkeep.js +26 -0
  913. package/dist/upkeep.js.map +1 -0
  914. package/dist/veterancy.d.ts +8 -3
  915. package/dist/veterancy.js +131 -0
  916. package/dist/veterancy.js.map +1 -0
  917. package/dist/vision.d.ts +36 -0
  918. package/dist/vision.js +133 -0
  919. package/dist/vision.js.map +1 -0
  920. package/dist/walls.d.ts +1 -1
  921. package/dist/walls.js +278 -0
  922. package/dist/walls.js.map +1 -0
  923. package/dist/world.d.ts +606 -88
  924. package/dist/world.js +1263 -0
  925. package/dist/world.js.map +1 -0
  926. package/package.json +2 -2
  927. package/dist/ai.js.map +0 -1
  928. package/dist/attributes.d.ts +0 -66
  929. package/dist/brain-BvVdUhX8.js +0 -7659
  930. package/dist/brain-BvVdUhX8.js.map +0 -1
  931. package/dist/builds-C6LfgvEU.js +0 -460
  932. package/dist/builds-C6LfgvEU.js.map +0 -1
  933. package/dist/coreComponents-syuh2fPG.js +0 -5149
  934. package/dist/coreComponents-syuh2fPG.js.map +0 -1
  935. package/dist/debugCommands-CzjrSm66.js +0 -14739
  936. package/dist/debugCommands-CzjrSm66.js.map +0 -1
  937. package/dist/determinism-BCymQwiE.js +0 -518
  938. package/dist/determinism-BCymQwiE.js.map +0 -1
  939. package/dist/game-DiJEN-Ks.js +0 -5800
  940. package/dist/game-DiJEN-Ks.js.map +0 -1
  941. package/dist/index.js.map +0 -1
  942. package/dist/inspect-D9dWHmZ0.js.map +0 -1
  943. package/dist/local-Dkovq42k.js +0 -1379
  944. package/dist/local-Dkovq42k.js.map +0 -1
  945. package/dist/missionRules-C-bGxm0Q.js.map +0 -1
  946. package/dist/navigation-worker.js.map +0 -1
  947. package/dist/packs-g5thvmGn.js +0 -3199
  948. package/dist/packs-g5thvmGn.js.map +0 -1
  949. package/dist/profiles-B3NS9jwk.js.map +0 -1
  950. package/dist/server.js.map +0 -1
  951. package/dist/simulate-oXBiw1Ff.js.map +0 -1
@@ -0,0 +1,267 @@
1
+ import { commandRejected, pauseAsked } from "../engineEvents.js";
2
+ import { errorFields } from "../log.js";
3
+ import { SessionHost } from "../session/remote.js";
4
+ import { writeResult } from "./ops.js";
5
+ //#region src/server/match.ts
6
+ /**
7
+ * A server's game (`Match`): its world and the host that sends it, a pause, what a cheating client gets, the end of a
8
+ * game everyone left, and its result told and kept (design review E12). The server makes one when its lobby starts a
9
+ * game, seats the connections at it, and lets go of it back in the lobby
10
+ */
11
+ /**
12
+ * A game a server runs, from its world made to its result kept
13
+ *
14
+ * @internal
15
+ */
16
+ var Match = class Match {
17
+ server;
18
+ world;
19
+ host;
20
+ /** Who paused the game: an admin, or a player (with a pause of theirs, for so long at most). Nobody while it runs */
21
+ pausedBy;
22
+ /** What the players are told of a game that did not end by its rules: an error thrown out of a tick, a cheat, the server stopping */
23
+ failed;
24
+ hooks;
25
+ resumeTimer;
26
+ /** Counts down to the end of a game every player has left */
27
+ abandoned;
28
+ watcher;
29
+ statsTimer;
30
+ constructor(server, world, host) {
31
+ this.server = server;
32
+ this.world = world;
33
+ this.host = host;
34
+ this.hooks = server.options.mode.rules.server ?? {};
35
+ }
36
+ /**
37
+ * Makes the world of a game with these settings, the computer in the seats that are its, and its host: the game's
38
+ * `onGameStart` told. Nobody is connected to it yet, and it does not run until `run`
39
+ */
40
+ static async make(server, settings) {
41
+ const { mode } = server.options;
42
+ const { seats } = server;
43
+ const world = await mode.makeWorld({ ...settings }, {
44
+ log: server.logger,
45
+ seats: Object.fromEntries(seats.map((seat) => [seat.player, { ...seat.settings }])),
46
+ ...server.navigation && { navigation: server.navigation }
47
+ });
48
+ world.errorPolicy ??= "end";
49
+ server.fill();
50
+ const modeSeats = seats.map((seat) => seat.mode);
51
+ for (const seat of seats) {
52
+ if (!seat.ai || !mode.ai) continue;
53
+ const seatSettings = { ...seat.settings };
54
+ const brain = typeof mode.brain === "function" ? mode.brain(seat.mode, modeSeats, seatSettings) : mode.brain;
55
+ world.computers.seat(seat.player, {
56
+ ...mode.ai(seat.mode, modeSeats, seatSettings),
57
+ brain
58
+ });
59
+ }
60
+ let match;
61
+ world.events.on(commandRejected, ({ player, type, kind, reason }) => match.cheated(player, kind, reason, type));
62
+ world.events.on(pauseAsked, ({ player, seconds }) => match.pause(true, {
63
+ player,
64
+ seconds
65
+ }));
66
+ const host = new SessionHost(world, {
67
+ sendRate: server.options.sendRate,
68
+ ownsWorld: true,
69
+ dropSilentAfter: server.options.dropSilentAfter,
70
+ keptBytes: server.options.keptBytes,
71
+ onError: (error) => {
72
+ server.logger.error("server", "stepping the game threw: the game ends", {
73
+ error: errorFields(error),
74
+ game: mode.rules.id
75
+ });
76
+ if (match) match.failed = "The game stopped: an error on the server";
77
+ server.end();
78
+ },
79
+ onSlowTick: (ms, tick) => {
80
+ if (tick % 30 === 0) server.logger.warn("server", `tick ${tick} took ${ms.toFixed(1)} ms`, {
81
+ ms,
82
+ tick
83
+ });
84
+ }
85
+ });
86
+ match = new Match(server, world, host);
87
+ match.hooks.onGameStart?.(world, seats.map((seat) => server.publicSeat(seat)), { ...settings });
88
+ return match;
89
+ }
90
+ /** Runs it, those seated connected to it: its ticks, the line of its time every `stats` seconds, and the look out for its end */
91
+ run() {
92
+ const { server, host, world } = this;
93
+ host.start();
94
+ server.logger.info("server", `the game started: ${server.seats.map((seat) => `${seat.name}${seat.ai ? " (computer)" : ""}`).join(", ")}`);
95
+ if (server.options.stats) {
96
+ host.takeTiming();
97
+ this.statsTimer = setInterval(() => this.printStats(), server.options.stats * 1e3);
98
+ }
99
+ this.watcher = setInterval(() => {
100
+ if (world.winner !== null || world.failure) server.end();
101
+ }, 250);
102
+ }
103
+ /** A seat's client sent what an honest one never does: counted, said, and answered as the game says (`onCheat`) */
104
+ cheated(player, kind, reason, type) {
105
+ const { server } = this;
106
+ const seat = server.seats.find((each) => each.player === player);
107
+ if (!seat || seat.ai || !seat.connection) return;
108
+ const { kickAfter = 20, seconds = 10 } = server.options.cheating ?? {};
109
+ const now = performance.now();
110
+ const { cheats } = seat;
111
+ cheats.at = cheats.at.filter((at) => now - at < seconds * 1e3);
112
+ cheats.at.push(now);
113
+ cheats.total++;
114
+ const report = {
115
+ seat: server.publicSeat(seat),
116
+ address: seat.connection.address,
117
+ kind,
118
+ reason,
119
+ ...type !== void 0 && { type },
120
+ recent: cheats.at.length,
121
+ total: cheats.total
122
+ };
123
+ let answer;
124
+ try {
125
+ answer = server.options.onCheat ? server.options.onCheat(report) : cheats.at.length >= kickAfter ? "kick" : "warn";
126
+ } catch (error) {
127
+ server.logger.error("server", "onCheat threw: a warning, as without it", { error: errorFields(error) });
128
+ answer = "warn";
129
+ }
130
+ const fields = {
131
+ name: seat.name,
132
+ player: seat.player,
133
+ address: report.address,
134
+ reason,
135
+ type,
136
+ recent: report.recent,
137
+ total: report.total
138
+ };
139
+ const said = `${seat.name} sent what their client never does: ${reason} (${report.recent} in ${seconds} s, ${report.total} in all)`;
140
+ if (answer === "ignore" || answer === void 0) return server.logger.debug("server", said, fields);
141
+ server.logger.warn("server", said, fields);
142
+ if (answer === "kick") server.kick(seat.player, "sent what the game does not let a player send");
143
+ else if (answer === "end") {
144
+ this.failed = `The game ended: ${seat.name} sent what the game does not let a player send`;
145
+ server.end();
146
+ }
147
+ }
148
+ /**
149
+ * Pauses the game for everyone, or lets it go on. A player's pause (`by`, from the `pause` command) ends by itself
150
+ * after its seconds, or when a seated player says `resume`; an admin's, when the admin says so. A player's pause is
151
+ * refused while an admin's holds: its timer would end the admin's
152
+ */
153
+ pause(paused, by) {
154
+ const { server, world } = this;
155
+ if (paused && by && this.pausedBy === "admin") return;
156
+ this.unpause();
157
+ this.host.speed = paused ? 0 : 1;
158
+ if (paused) {
159
+ this.pausedBy = by?.player ?? "admin";
160
+ if (by) this.resumeTimer = setTimeout(() => this.pause(false), by.seconds * 1e3);
161
+ }
162
+ for (const seat of server.seats) if (!seat.ai) world.message(seat.player, { key: paused ? "gamePaused" : "gameResumed" }, "info");
163
+ server.tellAll({
164
+ type: "paused",
165
+ paused,
166
+ ...paused && by && {
167
+ player: by.player,
168
+ seconds: by.seconds
169
+ }
170
+ });
171
+ const who = by ? server.seats.find((seat) => seat.player === by.player)?.name : void 0;
172
+ server.logger.info("server", paused ? `paused${who ? ` by ${who}, ${by.seconds} s at most` : ""}` : "resumed");
173
+ }
174
+ /** No pause on: its timer stopped */
175
+ unpause() {
176
+ clearTimeout(this.resumeTimer);
177
+ this.resumeTimer = void 0;
178
+ this.pausedBy = void 0;
179
+ }
180
+ /**
181
+ * Every player left the game: it ends after a while (`abandonAfter`), unless one comes back. Nobody else would end it:
182
+ * the host stops with nobody to send to, the world with it, and no winner is ever decided
183
+ */
184
+ abandon() {
185
+ const after = this.server.options.abandonAfter ?? 60;
186
+ if (!Number.isFinite(after) || this.abandoned !== void 0) return;
187
+ this.server.logger.info("server", `everyone left: the game ends in ${after} seconds unless someone comes back`);
188
+ this.abandoned = setTimeout(() => {
189
+ this.abandoned = void 0;
190
+ if (!this.server.seats.some((each) => each.connected)) this.server.end();
191
+ }, after * 1e3);
192
+ }
193
+ /** Someone came back to the game, or it ended: it is not abandoned */
194
+ keep() {
195
+ clearTimeout(this.abandoned);
196
+ this.abandoned = void 0;
197
+ }
198
+ /**
199
+ * A line of where the host's time went since the last one: ticks a second against the game's rate, how long a tick
200
+ * of the simulation takes on average and at most, against the time a tick lasts, and the same for sending
201
+ */
202
+ printStats() {
203
+ const { host, world, server } = this;
204
+ const timing = host.takeTiming();
205
+ const budget = 1e3 / world.tickRate;
206
+ const average = (total, count) => count ? total / count : 0;
207
+ const tick = average(timing.tickTime, timing.ticks);
208
+ const send = average(timing.sendTime, timing.sends);
209
+ const busy = (timing.tickTime + timing.sendTime) / (timing.seconds * 1e3) * 100;
210
+ server.logger.info("server", [
211
+ `ticks ${(timing.ticks / timing.seconds).toFixed(1)}/s of ${world.tickRate}`,
212
+ `step avg ${tick.toFixed(2)} ms, max ${timing.tickMax.toFixed(2)} ms (${(tick / budget * 100).toFixed(1)}% of ${budget.toFixed(1)} ms)`,
213
+ `send avg ${send.toFixed(2)} ms, max ${timing.sendMax.toFixed(2)} ms, ${(timing.sends / timing.seconds).toFixed(1)}/s`,
214
+ `busy ${busy.toFixed(1)}%`,
215
+ `${world.entities.size} entities, ${server.seats.filter((seat) => seat.connected).length} players and ${server.watching} watching`
216
+ ].join(" | "));
217
+ }
218
+ /** Its timers stopped: no pause, no end looked out for or counted down to, no line of its time */
219
+ stop() {
220
+ this.keep();
221
+ this.unpause();
222
+ clearInterval(this.watcher);
223
+ clearInterval(this.statsTimer);
224
+ }
225
+ /** The game is over: its timers stopped, the result told to everyone and kept. The game goes on being shown */
226
+ async end() {
227
+ const { server, world } = this;
228
+ const { options } = server;
229
+ this.stop();
230
+ const result = {
231
+ game: options.mode.rules.id,
232
+ mode: options.mode.id,
233
+ winner: world.winner,
234
+ duration: world.time,
235
+ ...(world.failure || this.failed) && { failed: world.failure?.message ?? this.failed },
236
+ seats: server.seats.map((seat) => {
237
+ const team = world.player(seat.player).team;
238
+ return {
239
+ ...server.publicSeat(seat),
240
+ outcome: world.winner === null ? "none" : world.winner === team ? "victory" : "defeat"
241
+ };
242
+ })
243
+ };
244
+ this.hooks.onGameEnd?.(world, result);
245
+ server.tellAll({
246
+ type: "result",
247
+ result
248
+ });
249
+ server.logger.info("server", `the game ended: ${result.seats.map((seat) => `${seat.name} ${seat.outcome}`).join(", ")}`);
250
+ try {
251
+ if (this.hooks.saveResult) await this.hooks.saveResult(result);
252
+ else if (options.resultsDir) await writeResult(options.resultsDir, result);
253
+ } catch (error) {
254
+ server.logger.error("server", "the result could not be kept", { error: errorFields(error) });
255
+ }
256
+ try {
257
+ await options.ratings?.record(result);
258
+ } catch (error) {
259
+ server.logger.error("server", "the ratings could not be kept", { error: errorFields(error) });
260
+ }
261
+ return result;
262
+ }
263
+ };
264
+ //#endregion
265
+ export { Match };
266
+
267
+ //# sourceMappingURL=match.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"match.js","names":["commandRejectedEvent"],"sources":["../../src/server/match.ts"],"sourcesContent":["/**\n * A server's game (`Match`): its world and the host that sends it, a pause, what a cheating client gets, the end of a\n * game everyone left, and its result told and kept (design review E12). The server makes one when its lobby starts a\n * game, seats the connections at it, and lets go of it back in the lobby\n */\nimport { commandRejected as commandRejectedEvent, pauseAsked } from '#engine/engineEvents'\nimport type { PlayerId } from '#engine/entity'\nimport type { RejectedKind } from '#engine/errors'\nimport type { GameResult, ServerHooks, ServerSeat } from '#engine/game'\nimport { errorFields, type Logger } from '#engine/log'\nimport type { NavigationBuilds } from '#engine/navigation/builds'\nimport { SessionHost } from '#engine/session/remote'\nimport type { World } from '#engine/world'\nimport type { LobbyServerMessage } from '../session/wire'\nimport type { CheatAnswer, CheatReport, GameServerOptions } from './gameServer'\nimport { writeResult } from './ops'\nimport type { Seat } from './seat'\n\n/** What a game reads of the server it is played on */\nexport interface MatchContext {\n\treadonly options: GameServerOptions\n\treadonly logger: Logger\n\treadonly seats: readonly Seat[]\n\t/** Who builds the navigation of its world, where the server says */\n\treadonly navigation?: NavigationBuilds\n\t/** How many watch now: for the line of where the host's time goes */\n\treadonly watching: number\n\tpublicSeat(seat: Seat): ServerSeat\n\t/** What nobody joined is the computer's: once the world is made, before the computers sit */\n\tfill(): void\n\t/** Tells everyone connected */\n\ttellAll(message: LobbyServerMessage): void\n\tkick(player: PlayerId, reason: string): void\n\t/** The game is over: the server ends it (`GameServer.endGame`) */\n\tend(): void\n}\n\n/**\n * A game a server runs, from its world made to its result kept\n *\n * @internal\n */\nexport class Match {\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\tpausedBy?: PlayerId | 'admin'\n\t/** What the players are told of a game that did not end by its rules: an error thrown out of a tick, a cheat, the server stopping */\n\tfailed?: string\n\tprivate readonly hooks: ServerHooks\n\tprivate resumeTimer?: ReturnType<typeof setTimeout>\n\t/** Counts down to the end of a game every player has left */\n\tprivate abandoned?: ReturnType<typeof setTimeout>\n\tprivate watcher?: ReturnType<typeof setInterval>\n\tprivate statsTimer?: ReturnType<typeof setInterval>\n\n\tprivate constructor(\n\t\tprivate readonly server: MatchContext,\n\t\treadonly world: World,\n\t\treadonly host: SessionHost\n\t) {\n\t\tthis.hooks = server.options.mode.rules.server ?? {}\n\t}\n\n\t/**\n\t * Makes the world of a game with these settings, the computer in the seats that are its, and its host: the game's\n\t * `onGameStart` told. Nobody is connected to it yet, and it does not run until `run`\n\t */\n\tstatic async make(server: MatchContext, settings: Record<string, string>): Promise<Match> {\n\t\tconst { mode } = server.options\n\t\tconst { seats } = server\n\t\tconst world = await mode.makeWorld(\n\t\t\t{ ...settings },\n\t\t\t{\n\t\t\t\tlog: server.logger,\n\t\t\t\tseats: Object.fromEntries(seats.map((seat) => [seat.player, { ...seat.settings }])),\n\t\t\t\t...(server.navigation && { navigation: server.navigation })\n\t\t\t}\n\t\t)\n\t\t// a part of the game that throws ends this game, and no other, unless the game says otherwise (`Rules.onError`)\n\t\tworld.errorPolicy ??= 'end'\n\t\tserver.fill()\n\t\tconst modeSeats = seats.map((seat) => seat.mode)\n\t\tfor (const seat of seats) {\n\t\t\tif (!seat.ai || !mode.ai) continue\n\t\t\tconst seatSettings = { ...seat.settings }\n\t\t\t// the brain the mode says, else the first the game lists; remembered by the world, so a\n\t\t\t// save of the game has its computers back (`core.computers`)\n\t\t\tconst brain = typeof mode.brain === 'function' ? mode.brain(seat.mode, modeSeats, seatSettings) : mode.brain\n\t\t\tworld.computers.seat(seat.player, { ...mode.ai(seat.mode, modeSeats, seatSettings), brain })\n\t\t}\n\t\tlet match: Match | undefined\n\t\tworld.events.on(commandRejectedEvent, ({ player, type, kind, reason }) => match!.cheated(player, kind, reason, type))\n\t\t// a player asked for a pause, and the rules let them: the host stops until it is over\n\t\tworld.events.on(pauseAsked, ({ player, seconds }) => match!.pause(true, { player, seconds }))\n\t\tconst host = new SessionHost(world, {\n\t\t\tsendRate: server.options.sendRate,\n\t\t\t// the game's world goes with it: back to the lobby, or the server closed\n\t\t\townsWorld: true,\n\t\t\tdropSilentAfter: server.options.dropSilentAfter,\n\t\t\tkeptBytes: server.options.keptBytes,\n\t\t\t// whatever is thrown out of a tick all the same (a game that asks for `throw`, a fault of the engine's)\n\t\t\tonError: (error) => {\n\t\t\t\tserver.logger.error('server', 'stepping the game threw: the game ends', { error: errorFields(error), game: mode.rules.id })\n\t\t\t\tif (match) match.failed = 'The game stopped: an error on the server'\n\t\t\t\tserver.end()\n\t\t\t},\n\t\t\tonSlowTick: (ms, tick) => {\n\t\t\t\tif (tick % 30 === 0) server.logger.warn('server', `tick ${tick} took ${ms.toFixed(1)} ms`, { ms, tick })\n\t\t\t}\n\t\t})\n\t\tmatch = new Match(server, world, host)\n\t\tmatch.hooks.onGameStart?.(\n\t\t\tworld,\n\t\t\tseats.map((seat) => server.publicSeat(seat)),\n\t\t\t{ ...settings }\n\t\t)\n\t\treturn match\n\t}\n\n\t/** Runs it, those seated connected to it: its ticks, the line of its time every `stats` seconds, and the look out for its end */\n\trun(): void {\n\t\tconst { server, host, world } = this\n\t\thost.start()\n\t\tserver.logger.info('server', `the game started: ${server.seats.map((seat) => `${seat.name}${seat.ai ? ' (computer)' : ''}`).join(', ')}`)\n\t\tif (server.options.stats) {\n\t\t\thost.takeTiming()\n\t\t\tthis.statsTimer = setInterval(() => this.printStats(), server.options.stats * 1000)\n\t\t}\n\t\tthis.watcher = setInterval(() => {\n\t\t\tif (world.winner !== null || world.failure) server.end()\n\t\t}, 250)\n\t}\n\n\t/** A seat's client sent what an honest one never does: counted, said, and answered as the game says (`onCheat`) */\n\tprivate cheated(player: PlayerId | undefined, kind: RejectedKind, reason: string, type?: string): void {\n\t\tconst { server } = this\n\t\tconst seat = server.seats.find((each) => each.player === player)\n\t\tif (!seat || seat.ai || !seat.connection) return\n\t\tconst { kickAfter = 20, seconds = 10 } = server.options.cheating ?? {}\n\t\tconst now = performance.now()\n\t\tconst { cheats } = seat\n\t\tcheats.at = cheats.at.filter((at) => now - at < seconds * 1000)\n\t\tcheats.at.push(now)\n\t\tcheats.total++\n\t\tconst report: CheatReport = {\n\t\t\tseat: server.publicSeat(seat),\n\t\t\taddress: seat.connection.address,\n\t\t\tkind,\n\t\t\treason,\n\t\t\t...(type !== undefined && { type }),\n\t\t\trecent: cheats.at.length,\n\t\t\ttotal: cheats.total\n\t\t}\n\t\tlet answer: CheatAnswer | void\n\t\ttry {\n\t\t\tanswer = server.options.onCheat ? server.options.onCheat(report) : cheats.at.length >= kickAfter ? 'kick' : 'warn'\n\t\t} catch (error) {\n\t\t\tserver.logger.error('server', 'onCheat threw: a warning, as without it', { error: errorFields(error) })\n\t\t\tanswer = 'warn'\n\t\t}\n\t\tconst fields = { name: seat.name, player: seat.player, address: report.address, reason, type, recent: report.recent, total: report.total }\n\t\tconst said = `${seat.name} sent what their client never does: ${reason} (${report.recent} in ${seconds} s, ${report.total} in all)`\n\t\tif (answer === 'ignore' || answer === undefined) return server.logger.debug('server', said, fields)\n\t\tserver.logger.warn('server', said, fields)\n\t\tif (answer === 'kick') server.kick(seat.player, 'sent what the game does not let a player send')\n\t\telse if (answer === 'end') {\n\t\t\tthis.failed = `The game ended: ${seat.name} sent what the game does not let a player send`\n\t\t\tserver.end()\n\t\t}\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. A player's pause is\n\t * refused while an admin's holds: its timer would end the admin's\n\t */\n\tpause(paused: boolean, by?: { player: PlayerId; seconds: number }): void {\n\t\tconst { server, world } = this\n\t\tif (paused && by && this.pausedBy === 'admin') return\n\t\tthis.unpause()\n\t\tthis.host.speed = paused ? 0 : 1\n\t\tif (paused) {\n\t\t\tthis.pausedBy = by?.player ?? 'admin'\n\t\t\tif (by) this.resumeTimer = setTimeout(() => this.pause(false), by.seconds * 1000)\n\t\t}\n\t\tfor (const seat of server.seats) if (!seat.ai) world.message(seat.player, { key: paused ? 'gamePaused' : 'gameResumed' }, 'info')\n\t\t// paused, no tick goes by that would carry the message: it is told on the side too\n\t\tserver.tellAll({ type: 'paused', paused, ...(paused && by && { player: by.player, seconds: by.seconds }) })\n\t\tconst who = by ? server.seats.find((seat) => seat.player === by.player)?.name : undefined\n\t\tserver.logger.info('server', paused ? `paused${who ? ` by ${who}, ${by!.seconds} s at most` : ''}` : 'resumed')\n\t}\n\n\t/** No pause on: its timer stopped */\n\tprivate unpause(): void {\n\t\tclearTimeout(this.resumeTimer)\n\t\tthis.resumeTimer = undefined\n\t\tthis.pausedBy = undefined\n\t}\n\n\t/**\n\t * Every player left the game: it ends after a while (`abandonAfter`), unless one comes back. Nobody else would end it:\n\t * the host stops with nobody to send to, the world with it, and no winner is ever decided\n\t */\n\tabandon(): void {\n\t\tconst after = this.server.options.abandonAfter ?? 60\n\t\tif (!Number.isFinite(after) || this.abandoned !== undefined) return\n\t\tthis.server.logger.info('server', `everyone left: the game ends in ${after} seconds unless someone comes back`)\n\t\tthis.abandoned = setTimeout(() => {\n\t\t\tthis.abandoned = undefined\n\t\t\tif (!this.server.seats.some((each) => each.connected)) this.server.end()\n\t\t}, after * 1000)\n\t}\n\n\t/** Someone came back to the game, or it ended: it is not abandoned */\n\tkeep(): void {\n\t\tclearTimeout(this.abandoned)\n\t\tthis.abandoned = undefined\n\t}\n\n\t/**\n\t * A line of where the host's time went since the last one: ticks a second against the game's rate, how long a tick\n\t * of the simulation takes on average and at most, against the time a tick lasts, and the same for sending\n\t */\n\tprivate printStats(): void {\n\t\tconst { host, world, server } = this\n\t\tconst timing = host.takeTiming()\n\t\tconst budget = 1000 / world.tickRate\n\t\tconst average = (total: number, count: number) => (count ? total / count : 0)\n\t\tconst tick = average(timing.tickTime, timing.ticks)\n\t\tconst send = average(timing.sendTime, timing.sends)\n\t\tconst busy = ((timing.tickTime + timing.sendTime) / (timing.seconds * 1000)) * 100\n\t\tserver.logger.info(\n\t\t\t'server',\n\t\t\t[\n\t\t\t\t`ticks ${(timing.ticks / timing.seconds).toFixed(1)}/s of ${world.tickRate}`,\n\t\t\t\t`step avg ${tick.toFixed(2)} ms, max ${timing.tickMax.toFixed(2)} ms (${((tick / budget) * 100).toFixed(1)}% of ${budget.toFixed(1)} ms)`,\n\t\t\t\t`send avg ${send.toFixed(2)} ms, max ${timing.sendMax.toFixed(2)} ms, ${(timing.sends / timing.seconds).toFixed(1)}/s`,\n\t\t\t\t`busy ${busy.toFixed(1)}%`,\n\t\t\t\t`${world.entities.size} entities, ${server.seats.filter((seat) => seat.connected).length} players and ${server.watching} watching`\n\t\t\t].join(' | ')\n\t\t)\n\t}\n\n\t/** Its timers stopped: no pause, no end looked out for or counted down to, no line of its time */\n\tstop(): void {\n\t\tthis.keep()\n\t\tthis.unpause()\n\t\tclearInterval(this.watcher)\n\t\tclearInterval(this.statsTimer)\n\t}\n\n\t/** The game is over: its timers stopped, the result told to everyone and kept. The game goes on being shown */\n\tasync end(): Promise<GameResult> {\n\t\tconst { server, world } = this\n\t\tconst { options } = server\n\t\tthis.stop()\n\t\tconst result: GameResult = {\n\t\t\tgame: options.mode.rules.id,\n\t\t\tmode: options.mode.id,\n\t\t\twinner: world.winner,\n\t\t\tduration: world.time,\n\t\t\t...((world.failure || this.failed) && { failed: world.failure?.message ?? this.failed }),\n\t\t\tseats: server.seats.map((seat) => {\n\t\t\t\tconst team = world.player(seat.player).team\n\t\t\t\treturn {\n\t\t\t\t\t...server.publicSeat(seat),\n\t\t\t\t\toutcome: world.winner === null ? 'none' : world.winner === team ? 'victory' : 'defeat'\n\t\t\t\t}\n\t\t\t})\n\t\t}\n\t\tthis.hooks.onGameEnd?.(world, result)\n\t\tserver.tellAll({ type: 'result', result })\n\t\tserver.logger.info('server', `the game ended: ${result.seats.map((seat) => `${seat.name} ${seat.outcome}`).join(', ')}`)\n\t\ttry {\n\t\t\tif (this.hooks.saveResult) await this.hooks.saveResult(result)\n\t\t\telse if (options.resultsDir) await writeResult(options.resultsDir, result)\n\t\t} catch (error) {\n\t\t\tserver.logger.error('server', 'the result could not be kept', { error: errorFields(error) })\n\t\t}\n\t\ttry {\n\t\t\tawait options.ratings?.record(result)\n\t\t} catch (error) {\n\t\t\tserver.logger.error('server', 'the ratings could not be kept', { error: errorFields(error) })\n\t\t}\n\t\treturn result\n\t}\n}\n"],"mappings":"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"}
@@ -1,9 +1,10 @@
1
1
  import type { Logger } from '#engine/log';
2
2
  import type { NavigationBuilds } from '#engine/navigation/builds';
3
+ import { type Game } from '#engine/createGame';
3
4
  import type { BrainDef } from '#engine/ai/brain';
4
5
  import type { AiOptions } from '#engine/ai/options';
5
6
  import type { PlayerId } from '#engine/entity';
6
- import { type GameModule, type ServerHooks } from '#engine/game';
7
+ import { type Rules, type ServerHooks } from '#engine/game';
7
8
  import { type GeneratorOptions, type MapGenerator } from '#engine/generate';
8
9
  import { type GameMap } from '#engine/map';
9
10
  import type { Vec2 } from '#engine/math';
@@ -14,7 +15,9 @@ import type { World } from '#engine/world';
14
15
  * @beta
15
16
  */
16
17
  export interface ModeSeat {
18
+ /** The world's player this seat plays */
17
19
  player: PlayerId;
20
+ /** The seat's default name, shown in the lobby */
18
21
  name: string;
19
22
  /** Where it starts, for a computer player to know where its opponents are */
20
23
  base?: Vec2;
@@ -35,12 +38,16 @@ export interface ModeSeat {
35
38
  * What a server runs: a game module, the seats of a game of it, and how its world is made. Each game starts from a
36
39
  * world made anew, with the lobby's settings
37
40
  *
38
- * @beta
41
+ * @public
39
42
  */
40
43
  export interface GameMode {
44
+ /** The id of the mode, used to name the game it runs */
41
45
  id: string;
46
+ /** The mode's name as shown to players */
42
47
  name: string;
43
- game: GameModule;
48
+ /** The game's rules each world of the mode is made with */
49
+ rules: Rules;
50
+ /** The seats of a game of this mode, in the order the lobby lists them */
44
51
  seats: ModeSeat[];
45
52
  /**
46
53
  * What can be chosen for each seat in the lobby, in place of what the game offers (`seatSettingsOf(game)`): the races
@@ -64,7 +71,7 @@ export interface GameMode {
64
71
  */
65
72
  ai?(seat: ModeSeat, seats: readonly ModeSeat[], settings: Readonly<Record<string, string>>): AiOptions;
66
73
  /**
67
- * Which brain plays a seat of the computer (`defineBrain`), or its id (one the game lists in `GameModule.brains`, or
74
+ * Which brain plays a seat of the computer (`defineBrain`), or its id (one the game lists in `Rules.brains`, or
68
75
  * the engine's `core.melee`): one for every seat, or one by seat, with what was chosen for it in the lobby. The first
69
76
  * brain the game lists when left out
70
77
  */
@@ -136,17 +143,18 @@ export interface MapModeOptions {
136
143
  * What the game does once a world is made from the map, before anyone plays (the game's `start`, as a page or
137
144
  * `startServer` runs it): the units at each start, the first wave sent. Nothing when left out
138
145
  */
139
- start?: (world: World, context: {
146
+ onStart?: (world: World, context: {
140
147
  map: GameMap;
141
148
  settings: Record<string, string>;
142
149
  }) => void | Promise<void>;
143
150
  }
144
151
  /**
145
- * A game on a map of it: a seat for each player the map has a start for, and a world made from the map for each game
152
+ * A game on a map of it: a seat for each player the map has a start for, and a world made from the map for each game.
153
+ * The game (`createGame`) or its module (`Rules`): a game's start (`Game.onStart`) runs where `onStart` is left out
146
154
  *
147
- * @beta
155
+ * @public
148
156
  */
149
- export declare function mapMode(game: GameModule, map: GameMap, options?: MapModeOptions): GameMode;
157
+ export declare function mapMode(source: Game<unknown> | Rules, map: GameMap, options?: MapModeOptions): GameMode;
150
158
  /**
151
159
  * How a mode on a generated map is made (`generatedMode`): the generator's options (the seed a new one each time
152
160
  * when left out), and what a mode on a map takes
@@ -154,6 +162,7 @@ export declare function mapMode(game: GameModule, map: GameMap, options?: MapMod
154
162
  * @beta
155
163
  */
156
164
  export interface GeneratedModeOptions extends Omit<GeneratorOptions, 'seed'>, MapModeOptions {
165
+ /** The generator's seed; a new one each time when left out */
157
166
  seed?: number;
158
167
  }
159
168
  /**
@@ -163,6 +172,6 @@ export interface GeneratedModeOptions extends Omit<GeneratorOptions, 'seed'>, Ma
163
172
  *
164
173
  * @beta
165
174
  */
166
- export declare function generatedMode(game: GameModule, generator: MapGenerator, options: GeneratedModeOptions): GameMode & {
175
+ export declare function generatedMode(source: Game<unknown> | Rules, generator: MapGenerator, options: GeneratedModeOptions): GameMode & {
167
176
  map: GameMap;
168
177
  };
@@ -0,0 +1,220 @@
1
+ import { PLAYER_COLORS } from "../map/types.js";
2
+ import { createRegistry, createWorldFromMap } from "../game.js";
3
+ import { randomSeed } from "../session/seed.js";
4
+ import { generateMap } from "../generate.js";
5
+ import { rulesOf, startOf } from "../createGame.js";
6
+ import { seatSettingsOf } from "./seatSettings.js";
7
+ //#region src/server/mode.ts
8
+ /**
9
+ * A computer player that goes for everyone else's base: what a seat of the computer does when the server says nothing
10
+ * else. As hard as its seat's `difficulty` says and of the `personality` it says, where the game offers them to choose
11
+ * (`ServerHooks.seatSettings`, `seatSettingsOf`); a name the game does not have is left to the defaults
12
+ *
13
+ * @beta
14
+ */
15
+ var againstTheRest = (seat, seats, settings = {}) => ({
16
+ enemyBases: seats.filter((other) => other !== seat && other.base).map((other) => other.base),
17
+ ...settings.difficulty && { difficulty: settings.difficulty },
18
+ ...settings.personality && { personality: settings.personality }
19
+ });
20
+ /**
21
+ * The race chosen for each seat in the lobby, by player: none where nobody chose one, or the game has no races
22
+ *
23
+ * @beta
24
+ */
25
+ function racesOfSeats(seats) {
26
+ if (!seats) return void 0;
27
+ const races = {};
28
+ for (const [player, settings] of Object.entries(seats)) if (settings.race !== void 0) races[Number(player)] = settings.race;
29
+ return Object.keys(races).length ? races : void 0;
30
+ }
31
+ /**
32
+ * The seats a map has room for: a seat for each of its players with a start, the creeps apart
33
+ *
34
+ * @beta
35
+ */
36
+ var seatsOf = (map) => map.players.filter((player) => player.start && player.id !== 90).map((player) => ({
37
+ player: player.id,
38
+ name: player.name,
39
+ base: player.start,
40
+ team: player.team,
41
+ preset: {
42
+ team: String(player.team),
43
+ color: String(nearestColor(player.color) + 1)
44
+ },
45
+ ...player.race !== void 0 && { fixed: { race: player.race } }
46
+ }));
47
+ /**
48
+ * The names of the players' colours (`PLAYER_COLORS`), in their order, as a lobby shows them
49
+ *
50
+ * @beta
51
+ */
52
+ var PLAYER_COLOR_NAMES = [
53
+ "Blue",
54
+ "Red",
55
+ "Teal",
56
+ "Purple",
57
+ "Yellow",
58
+ "Orange",
59
+ "Green",
60
+ "Pink",
61
+ "Grey",
62
+ "Light blue",
63
+ "Dark green",
64
+ "Brown",
65
+ "Maroon",
66
+ "Navy",
67
+ "Turquoise",
68
+ "Violet",
69
+ "Wheat",
70
+ "Peach",
71
+ "Mint",
72
+ "Lavender",
73
+ "Coal",
74
+ "Snow",
75
+ "Emerald",
76
+ "Peanut"
77
+ ];
78
+ /** The colour of the players' (`PLAYER_COLORS`) nearest one, by its index */
79
+ function nearestColor(color) {
80
+ let best = 0;
81
+ let least = Infinity;
82
+ PLAYER_COLORS.forEach((each, index) => {
83
+ const [r, g, b] = [
84
+ each[0] - color[0],
85
+ each[1] - color[1],
86
+ each[2] - color[2]
87
+ ];
88
+ const apart = r * r + g * g + b * b;
89
+ if (apart < least) {
90
+ least = apart;
91
+ best = index;
92
+ }
93
+ });
94
+ return best;
95
+ }
96
+ /**
97
+ * What a lobby offers to choose for each seat of a map's game beside the game's own: a team, of as many as there are
98
+ * seats, and a colour of the players' (`PLAYER_COLORS`, by `PLAYER_COLOR_NAMES`), no two seats the same. Each seat has
99
+ * the map's until chosen otherwise (`ModeSeat.preset`)
100
+ *
101
+ * @beta
102
+ */
103
+ function seatLooksOf(seats) {
104
+ const teams = Math.max(seats.length, ...seats.map((seat) => seat.team ?? 0));
105
+ const numbers = (count) => Array.from({ length: count }, (_, i) => String(i + 1));
106
+ return {
107
+ team: {
108
+ label: "Team",
109
+ options: numbers(teams),
110
+ labels: Object.fromEntries(numbers(teams).map((id) => [id, `Team ${id}`])),
111
+ default: "1"
112
+ },
113
+ color: {
114
+ label: "Colour",
115
+ options: numbers(PLAYER_COLORS.length),
116
+ labels: Object.fromEntries(PLAYER_COLOR_NAMES.map((name, i) => [String(i + 1), name])),
117
+ default: "1",
118
+ unique: true
119
+ }
120
+ };
121
+ }
122
+ /**
123
+ * The teams and colours chosen in the lobby (`seatLooksOf`), by player, where they are not the map's: what
124
+ * `MapWorldOptions.teams` and `colors` take
125
+ *
126
+ * @beta
127
+ */
128
+ function looksOfSeats(seats, modeSeats) {
129
+ const teams = {};
130
+ const colors = {};
131
+ for (const seat of modeSeats) {
132
+ const chosen = seats?.[seat.player];
133
+ if (!chosen) continue;
134
+ const team = Number(chosen.team);
135
+ if (chosen.team !== void 0 && chosen.team !== seat.preset?.team && Number.isInteger(team) && team > 0) teams[seat.player] = team;
136
+ const color = PLAYER_COLORS[Number(chosen.color) - 1];
137
+ if (chosen.color !== void 0 && chosen.color !== seat.preset?.color && color) colors[seat.player] = [...color];
138
+ }
139
+ return {
140
+ ...Object.keys(teams).length && { teams },
141
+ ...Object.keys(colors).length && { colors }
142
+ };
143
+ }
144
+ /**
145
+ * A game on a map of it: a seat for each player the map has a start for, and a world made from the map for each game.
146
+ * The game (`createGame`) or its module (`Rules`): a game's start (`Game.onStart`) runs where `onStart` is left out
147
+ *
148
+ * @public
149
+ */
150
+ function mapMode(source, map, options = {}) {
151
+ const game = rulesOf(source);
152
+ const onStart = options.onStart ?? startOf(source);
153
+ const seats = options.seats ?? seatsOf(map);
154
+ return {
155
+ id: `map:${map.name}`,
156
+ name: map.name,
157
+ rules: game,
158
+ seats,
159
+ seatSettings: {
160
+ ...seatSettingsOf(game, map.races),
161
+ ...seatLooksOf(seats)
162
+ },
163
+ async makeWorld(settings, context) {
164
+ const made = structuredClone(map);
165
+ const world = await createWorldFromMap({
166
+ map: made,
167
+ rules: game,
168
+ seed: randomSeed(),
169
+ log: context?.log,
170
+ races: racesOfSeats(context?.seats),
171
+ ...looksOfSeats(context?.seats, seats),
172
+ ...context?.navigation && { navigation: { builds: context.navigation } }
173
+ });
174
+ try {
175
+ await onStart?.(world, {
176
+ map: made,
177
+ settings
178
+ });
179
+ } catch (error) {
180
+ world.dispose();
181
+ throw error;
182
+ }
183
+ return world;
184
+ },
185
+ ...options.ai !== null && { ai: options.ai ?? againstTheRest },
186
+ ...options.brain !== void 0 && { brain: options.brain }
187
+ };
188
+ }
189
+ /**
190
+ * A game on a map made by a generator (`generateMap`): the map made once, with the seed given or a new one, and a
191
+ * game of it as on any map (`mapMode`): a seat for each start, the world made from it for each game. For a room of a
192
+ * random map (`RoomKind.room` as a function: a new map for each room made)
193
+ *
194
+ * @beta
195
+ */
196
+ function generatedMode(source, generator, options) {
197
+ const game = rulesOf(source);
198
+ const { ai, brain, seats, ...generating } = options;
199
+ const onStart = options.onStart ?? startOf(source);
200
+ const seed = options.seed ?? 1 + Math.floor(Math.random() * 999999);
201
+ const { map } = generateMap(generator, {
202
+ ...generating,
203
+ seed,
204
+ name: options.name ?? `A random map (${seed})`
205
+ }, createRegistry(game));
206
+ return {
207
+ ...mapMode(game, map, {
208
+ onStart,
209
+ ai,
210
+ brain,
211
+ seats
212
+ }),
213
+ id: `generated:${map.generated?.seed ?? seed}`,
214
+ map
215
+ };
216
+ }
217
+ //#endregion
218
+ export { PLAYER_COLOR_NAMES, againstTheRest, generatedMode, looksOfSeats, mapMode, racesOfSeats, seatLooksOf, seatsOf };
219
+
220
+ //# sourceMappingURL=mode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mode.js","names":[],"sources":["../../src/server/mode.ts"],"sourcesContent":["import type { Logger } from '#engine/log'\nimport type { NavigationBuilds } from '#engine/navigation/builds'\nimport { randomSeed } from '#engine/session/seed'\nimport { type Game, rulesOf, startOf } from '#engine/createGame'\nimport type { BrainDef } from '#engine/ai/brain'\nimport type { AiOptions } from '#engine/ai/options'\nimport type { PlayerId } from '#engine/entity'\nimport { createWorldFromMap, type Rules, type ServerHooks, createRegistry } from '#engine/game'\nimport { generateMap, type GeneratorOptions, type MapGenerator } from '#engine/generate'\nimport { type GameMap, MAP_CREEPS, PLAYER_COLORS } from '#engine/map'\nimport type { Vec2 } from '#engine/math'\nimport type { World } from '#engine/world'\nimport { seatSettingsOf } from './seatSettings'\n\n/**\n * A seat a mode has: a player of the world, by default for whoever joins, or for the computer\n *\n * @beta\n */\nexport interface ModeSeat {\n\t/** The world's player this seat plays */\n\tplayer: PlayerId\n\t/** The seat's default name, shown in the lobby */\n\tname: string\n\t/** Where it starts, for a computer player to know where its opponents are */\n\tbase?: Vec2\n\t/** The team it plays for, shown in the lobby: the map's, for a mode made from a map */\n\tteam?: number\n\t/**\n\t * Settings of the seat that are not the lobby's to choose, by name (`ServerHooks.seatSettings`): the race a map gives\n\t * its player (`MapPlayer.race`)\n\t */\n\tfixed?: Record<string, string>\n\t/**\n\t * Settings of the seat chosen for it until someone chooses otherwise, by name: its team and its colour on the map\n\t * (`seatLooksOf`)\n\t */\n\tpreset?: Record<string, string>\n}\n\n/**\n * What a server runs: a game module, the seats of a game of it, and how its world is made. Each game starts from a\n * world made anew, with the lobby's settings\n *\n * @public\n */\nexport interface GameMode {\n\t/** The id of the mode, used to name the game it runs */\n\tid: string\n\t/** The mode's name as shown to players */\n\tname: string\n\t/** The game's rules each world of the mode is made with */\n\trules: Rules\n\t/** The seats of a game of this mode, in the order the lobby lists them */\n\tseats: ModeSeat[]\n\t/**\n\t * What can be chosen for each seat in the lobby, in place of what the game offers (`seatSettingsOf(game)`): the races\n\t * a map offers (`GameMap.races`)\n\t */\n\tseatSettings?: NonNullable<ServerHooks['seatSettings']>\n\t/**\n\t * Makes the world of a game. `context.log` is the server's logger, for the world's own to be made under;\n\t * `context.seats` what was chosen for each seat in the lobby, by player (`ServerHooks.seatSettings`): a race among\n\t * them, in a game with races (`seatSettingsOf`), for the world to give each player (`MapWorldOptions.races`);\n\t * `context.navigation` who builds its navigation (the server's worker thread: `GameServerOptions.navigationWorker`)\n\t */\n\tmakeWorld(\n\t\tsettings: Record<string, string>,\n\t\tcontext?: { log?: Logger; seats?: Readonly<Record<PlayerId, Readonly<Record<string, string>>>>; navigation?: NavigationBuilds }\n\t): Promise<World>\n\t/**\n\t * How a computer player in a seat plays: with what was chosen for that seat in the lobby (`settings`, from\n\t * `ServerHooks.seatSettings`: a difficulty, a race). No computer players without\n\t */\n\tai?(seat: ModeSeat, seats: readonly ModeSeat[], settings: Readonly<Record<string, string>>): AiOptions\n\t/**\n\t * Which brain plays a seat of the computer (`defineBrain`), or its id (one the game lists in `Rules.brains`, or\n\t * the engine's `core.melee`): one for every seat, or one by seat, with what was chosen for it in the lobby. The first\n\t * brain the game lists when left out\n\t */\n\tbrain?: ModeBrain\n}\n\n/**\n * Which brain plays a seat of the computer on a server (`GameMode.brain`): a brain, its id, or one chosen by seat\n *\n * @beta\n */\nexport type ModeBrain =\n\tBrainDef | string | ((seat: ModeSeat, seats: readonly ModeSeat[], settings: Readonly<Record<string, string>>) => BrainDef | string | undefined)\n\n/**\n * A computer player that goes for everyone else's base: what a seat of the computer does when the server says nothing\n * else. As hard as its seat's `difficulty` says and of the `personality` it says, where the game offers them to choose\n * (`ServerHooks.seatSettings`, `seatSettingsOf`); a name the game does not have is left to the defaults\n *\n * @beta\n */\nexport const againstTheRest = (seat: ModeSeat, seats: readonly ModeSeat[], settings: Readonly<Record<string, string>> = {}): AiOptions => ({\n\tenemyBases: seats.filter((other) => other !== seat && other.base).map((other) => other.base!),\n\t...(settings.difficulty && { difficulty: settings.difficulty }),\n\t...(settings.personality && { personality: settings.personality })\n})\n\n/**\n * The race chosen for each seat in the lobby, by player: none where nobody chose one, or the game has no races\n *\n * @beta\n */\nexport function racesOfSeats(seats: Readonly<Record<PlayerId, Readonly<Record<string, string>>>> | undefined): Record<PlayerId, string> | undefined {\n\tif (!seats) return undefined\n\tconst races: Record<PlayerId, string> = {}\n\tfor (const [player, settings] of Object.entries(seats)) if (settings.race !== undefined) races[Number(player)] = settings.race\n\treturn Object.keys(races).length ? races : undefined\n}\n\n/**\n * The seats a map has room for: a seat for each of its players with a start, the creeps apart\n *\n * @beta\n */\nexport const seatsOf = (map: GameMap): ModeSeat[] =>\n\tmap.players\n\t\t.filter((player) => player.start && player.id !== MAP_CREEPS)\n\t\t.map((player) => ({\n\t\t\tplayer: player.id,\n\t\t\tname: player.name,\n\t\t\tbase: player.start,\n\t\t\tteam: player.team,\n\t\t\t// its team and colour as the map has them, until the lobby chooses others\n\t\t\tpreset: { team: String(player.team), color: String(nearestColor(player.color) + 1) },\n\t\t\t...(player.race !== undefined && { fixed: { race: player.race } })\n\t\t}))\n\n/**\n * The names of the players' colours (`PLAYER_COLORS`), in their order, as a lobby shows them\n *\n * @beta\n */\nexport const PLAYER_COLOR_NAMES = [\n\t'Blue',\n\t'Red',\n\t'Teal',\n\t'Purple',\n\t'Yellow',\n\t'Orange',\n\t'Green',\n\t'Pink',\n\t'Grey',\n\t'Light blue',\n\t'Dark green',\n\t'Brown',\n\t'Maroon',\n\t'Navy',\n\t'Turquoise',\n\t'Violet',\n\t'Wheat',\n\t'Peach',\n\t'Mint',\n\t'Lavender',\n\t'Coal',\n\t'Snow',\n\t'Emerald',\n\t'Peanut'\n] as const\n\n/** The colour of the players' (`PLAYER_COLORS`) nearest one, by its index */\nfunction nearestColor(color: readonly [number, number, number]): number {\n\tlet best = 0\n\tlet least = Infinity\n\tPLAYER_COLORS.forEach((each, index) => {\n\t\tconst [r, g, b] = [each[0] - color[0], each[1] - color[1], each[2] - color[2]]\n\t\tconst apart = r * r + g * g + b * b\n\t\tif (apart < least) {\n\t\t\tleast = apart\n\t\t\tbest = index\n\t\t}\n\t})\n\treturn best\n}\n\n/**\n * What a lobby offers to choose for each seat of a map's game beside the game's own: a team, of as many as there are\n * seats, and a colour of the players' (`PLAYER_COLORS`, by `PLAYER_COLOR_NAMES`), no two seats the same. Each seat has\n * the map's until chosen otherwise (`ModeSeat.preset`)\n *\n * @beta\n */\nexport function seatLooksOf(seats: readonly ModeSeat[]): NonNullable<ServerHooks['seatSettings']> {\n\tconst teams = Math.max(seats.length, ...seats.map((seat) => seat.team ?? 0))\n\tconst numbers = (count: number) => Array.from({ length: count }, (_, i) => String(i + 1))\n\treturn {\n\t\tteam: {\n\t\t\tlabel: 'Team',\n\t\t\toptions: numbers(teams),\n\t\t\tlabels: Object.fromEntries(numbers(teams).map((id) => [id, `Team ${id}`])),\n\t\t\tdefault: '1'\n\t\t},\n\t\tcolor: {\n\t\t\tlabel: 'Colour',\n\t\t\toptions: numbers(PLAYER_COLORS.length),\n\t\t\tlabels: Object.fromEntries(PLAYER_COLOR_NAMES.map((name, i) => [String(i + 1), name])),\n\t\t\tdefault: '1',\n\t\t\tunique: true\n\t\t}\n\t}\n}\n\n/**\n * The teams and colours chosen in the lobby (`seatLooksOf`), by player, where they are not the map's: what\n * `MapWorldOptions.teams` and `colors` take\n *\n * @beta\n */\nexport function looksOfSeats(\n\tseats: Readonly<Record<PlayerId, Readonly<Record<string, string>>>> | undefined,\n\tmodeSeats: readonly ModeSeat[]\n): { teams?: Record<PlayerId, number>; colors?: Record<PlayerId, [number, number, number]> } {\n\tconst teams: Record<PlayerId, number> = {}\n\tconst colors: Record<PlayerId, [number, number, number]> = {}\n\tfor (const seat of modeSeats) {\n\t\tconst chosen = seats?.[seat.player]\n\t\tif (!chosen) continue\n\t\tconst team = Number(chosen.team)\n\t\tif (chosen.team !== undefined && chosen.team !== seat.preset?.team && Number.isInteger(team) && team > 0) teams[seat.player] = team\n\t\tconst color = PLAYER_COLORS[Number(chosen.color) - 1]\n\t\tif (chosen.color !== undefined && chosen.color !== seat.preset?.color && color) colors[seat.player] = [...color]\n\t}\n\treturn { ...(Object.keys(teams).length && { teams }), ...(Object.keys(colors).length && { colors }) }\n}\n\n/**\n * How a mode is made from a map (`mapMode`)\n *\n * @beta\n */\nexport interface MapModeOptions {\n\t/** The seats a player may take. One for each player of the map with a start when left out */\n\tseats?: ModeSeat[]\n\t/** How a computer player in a seat plays: against everyone else's base when left out, `null` for none */\n\tai?: GameMode['ai'] | null\n\t/** Which brain plays a seat of the computer: the first the game lists when left out */\n\tbrain?: ModeBrain\n\t/**\n\t * What the game does once a world is made from the map, before anyone plays (the game's `start`, as a page or\n\t * `startServer` runs it): the units at each start, the first wave sent. Nothing when left out\n\t */\n\tonStart?: (world: World, context: { map: GameMap; settings: Record<string, string> }) => void | Promise<void>\n}\n\n/**\n * A game on a map of it: a seat for each player the map has a start for, and a world made from the map for each game.\n * The game (`createGame`) or its module (`Rules`): a game's start (`Game.onStart`) runs where `onStart` is left out\n *\n * @public\n */\nexport function mapMode(source: Game<unknown> | Rules, map: GameMap, options: MapModeOptions = {}): GameMode {\n\tconst game = rulesOf(source)\n\tconst onStart = options.onStart ?? startOf(source)\n\tconst seats = options.seats ?? seatsOf(map)\n\treturn {\n\t\tid: `map:${map.name}`,\n\t\tname: map.name,\n\t\trules: game,\n\t\tseats,\n\t\t// the game's (a race among the map's), and a team and a colour\n\t\tseatSettings: { ...seatSettingsOf(game, map.races), ...seatLooksOf(seats) },\n\t\tasync makeWorld(settings, context) {\n\t\t\tconst made = structuredClone(map)\n\t\t\tconst world = await createWorldFromMap({\n\t\t\t\tmap: made,\n\t\t\t\trules: game,\n\t\t\t\tseed: randomSeed(),\n\t\t\t\tlog: context?.log,\n\t\t\t\traces: racesOfSeats(context?.seats),\n\t\t\t\t...looksOfSeats(context?.seats, seats),\n\t\t\t\t...(context?.navigation && { navigation: { builds: context.navigation } })\n\t\t\t})\n\t\t\ttry {\n\t\t\t\tawait onStart?.(world, { map: made, settings })\n\t\t\t} catch (error) {\n\t\t\t\tworld.dispose()\n\t\t\t\tthrow error\n\t\t\t}\n\t\t\treturn world\n\t\t},\n\t\t...(options.ai !== null && { ai: options.ai ?? againstTheRest }),\n\t\t...(options.brain !== undefined && { brain: options.brain })\n\t}\n}\n\n/**\n * How a mode on a generated map is made (`generatedMode`): the generator's options (the seed a new one each time\n * when left out), and what a mode on a map takes\n *\n * @beta\n */\nexport interface GeneratedModeOptions extends Omit<GeneratorOptions, 'seed'>, MapModeOptions {\n\t/** The generator's seed; a new one each time when left out */\n\tseed?: number\n}\n\n/**\n * A game on a map made by a generator (`generateMap`): the map made once, with the seed given or a new one, and a\n * game of it as on any map (`mapMode`): a seat for each start, the world made from it for each game. For a room of a\n * random map (`RoomKind.room` as a function: a new map for each room made)\n *\n * @beta\n */\nexport function generatedMode(\n\tsource: Game<unknown> | Rules,\n\tgenerator: MapGenerator,\n\toptions: GeneratedModeOptions\n): GameMode & { map: GameMap } {\n\tconst game = rulesOf(source)\n\tconst { ai, brain, seats, ...generating } = options\n\tconst onStart = options.onStart ?? startOf(source)\n\t// a new map each time a seed is not said: the server's own, not the simulation's\n\tconst seed = options.seed ?? 1 + Math.floor(Math.random() * 999999)\n\tconst { map } = generateMap(generator, { ...generating, seed, name: options.name ?? `A random map (${seed})` }, createRegistry(game))\n\tconst mode = mapMode(game, map, { onStart, ai, brain, seats })\n\treturn { ...mode, id: `generated:${map.generated?.seed ?? seed}`, map }\n}\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { c as serveNavigationBuilds } from "./builds-C6LfgvEU.js";
1
+ import { serveNavigationBuilds } from "../navigation/builds.js";
2
2
  import { parentPort } from "node:worker_threads";
3
3
  //#region src/server/navigation-worker.ts
4
4
  /**
@@ -0,0 +1 @@
1
+ {"version":3,"file":"navigation-worker.js","names":[],"sources":["../../src/server/navigation-worker.ts"],"sourcesContent":["/**\n * A worker thread of a server's that builds navigations (S37): told what to build, it sends back what it built. Built\n * next to `server.js`, and not one of the engine's names: `nodeNavigationBuilder` starts it\n */\nimport { parentPort } from 'node:worker_threads'\nimport { serveNavigationBuilds } from '#engine/navigation/builds'\n\nif (parentPort) serveNavigationBuilds(parentPort as never)\n"],"mappings":";;;;;;;AAOA,IAAI,YAAY,sBAAsB,UAAmB"}