@v12-engine/engine 0.1.1 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (951) hide show
  1. package/dist/abilities/amounts.d.ts +28 -0
  2. package/dist/abilities/amounts.js +74 -0
  3. package/dist/abilities/amounts.js.map +1 -0
  4. package/dist/abilities/buffs.d.ts +106 -6
  5. package/dist/abilities/buffs.js +443 -0
  6. package/dist/abilities/buffs.js.map +1 -0
  7. package/dist/abilities/castTold.d.ts +2 -0
  8. package/dist/abilities/castTold.js +66 -0
  9. package/dist/abilities/castTold.js.map +1 -0
  10. package/dist/abilities/chance.d.ts +38 -0
  11. package/dist/abilities/chance.js +77 -0
  12. package/dist/abilities/chance.js.map +1 -0
  13. package/dist/abilities/charges.d.ts +18 -0
  14. package/dist/abilities/charges.js +101 -0
  15. package/dist/abilities/charges.js.map +1 -0
  16. package/dist/abilities/control.d.ts +28 -0
  17. package/dist/abilities/control.js +113 -0
  18. package/dist/abilities/control.js.map +1 -0
  19. package/dist/abilities/dispel.js +51 -0
  20. package/dist/abilities/dispel.js.map +1 -0
  21. package/dist/abilities/effectFields.d.ts +1 -1
  22. package/dist/abilities/effectFields.js +676 -0
  23. package/dist/abilities/effectFields.js.map +1 -0
  24. package/dist/abilities/effectIndex.d.ts +27 -0
  25. package/dist/abilities/effectIndex.js +64 -0
  26. package/dist/abilities/effectIndex.js.map +1 -0
  27. package/dist/abilities/effects/buff.d.ts +9 -3
  28. package/dist/abilities/effects/buff.js +84 -0
  29. package/dist/abilities/effects/buff.js.map +1 -0
  30. package/dist/abilities/effects/conditions.d.ts +2 -0
  31. package/dist/abilities/effects/conditions.js +41 -0
  32. package/dist/abilities/effects/conditions.js.map +1 -0
  33. package/dist/abilities/effects/core.js +54 -0
  34. package/dist/abilities/effects/core.js.map +1 -0
  35. package/dist/abilities/effects/damage.d.ts +1 -1
  36. package/dist/abilities/effects/damage.js +43 -0
  37. package/dist/abilities/effects/damage.js.map +1 -0
  38. package/dist/abilities/effects/heal.d.ts +2 -2
  39. package/dist/abilities/effects/heal.js +51 -0
  40. package/dist/abilities/effects/heal.js.map +1 -0
  41. package/dist/abilities/effects/missile.d.ts +13 -1
  42. package/dist/abilities/effects/missile.js +104 -0
  43. package/dist/abilities/effects/missile.js.map +1 -0
  44. package/dist/abilities/effects/morph.d.ts +5 -0
  45. package/dist/abilities/effects/morph.js +43 -0
  46. package/dist/abilities/effects/morph.js.map +1 -0
  47. package/dist/abilities/effects/moves.d.ts +16 -4
  48. package/dist/abilities/effects/moves.js +212 -0
  49. package/dist/abilities/effects/moves.js.map +1 -0
  50. package/dist/abilities/effects/passives.d.ts +19 -9
  51. package/dist/abilities/effects/passives.js +131 -0
  52. package/dist/abilities/effects/passives.js.map +1 -0
  53. package/dist/abilities/effects/proxy.d.ts +5 -0
  54. package/dist/abilities/effects/proxy.js +60 -0
  55. package/dist/abilities/effects/proxy.js.map +1 -0
  56. package/dist/abilities/effects/sight.d.ts +2 -2
  57. package/dist/abilities/effects/sight.js +39 -0
  58. package/dist/abilities/effects/sight.js.map +1 -0
  59. package/dist/abilities/effects/spawn.d.ts +5 -2
  60. package/dist/abilities/effects/spawn.js +40 -0
  61. package/dist/abilities/effects/spawn.js.map +1 -0
  62. package/dist/abilities/effects/timed.d.ts +2 -2
  63. package/dist/abilities/effects/timed.js +96 -0
  64. package/dist/abilities/effects/timed.js.map +1 -0
  65. package/dist/abilities/effects/trade.d.ts +1 -1
  66. package/dist/abilities/effects/trade.js +25 -0
  67. package/dist/abilities/effects/trade.js.map +1 -0
  68. package/dist/abilities/effects.d.ts +97 -23
  69. package/dist/abilities/effects.js +860 -0
  70. package/dist/abilities/effects.js.map +1 -0
  71. package/dist/abilities/land.d.ts +38 -4
  72. package/dist/abilities/land.js +189 -0
  73. package/dist/abilities/land.js.map +1 -0
  74. package/dist/abilities/recast.d.ts +45 -0
  75. package/dist/abilities/recast.js +118 -0
  76. package/dist/abilities/recast.js.map +1 -0
  77. package/dist/abilities/scaled.js +40 -0
  78. package/dist/abilities/scaled.js.map +1 -0
  79. package/dist/abilities/screen.d.ts +6 -0
  80. package/dist/abilities/screen.js +83 -0
  81. package/dist/abilities/screen.js.map +1 -0
  82. package/dist/abilities/shapes.d.ts +66 -0
  83. package/dist/abilities/shapes.js +122 -0
  84. package/dist/abilities/shapes.js.map +1 -0
  85. package/dist/abilities/text.d.ts +14 -2
  86. package/dist/abilities/text.js +204 -0
  87. package/dist/abilities/text.js.map +1 -0
  88. package/dist/abilities/triggers.d.ts +98 -0
  89. package/dist/abilities/triggers.js +351 -0
  90. package/dist/abilities/triggers.js.map +1 -0
  91. package/dist/abilityChanges.d.ts +131 -0
  92. package/dist/abilityChanges.js +345 -0
  93. package/dist/abilityChanges.js.map +1 -0
  94. package/dist/ai/area.d.ts +4 -1
  95. package/dist/ai/brain.d.ts +4 -1
  96. package/dist/ai/brain.js +844 -0
  97. package/dist/ai/brain.js.map +1 -0
  98. package/dist/ai/budget.js +74 -0
  99. package/dist/ai/budget.js.map +1 -0
  100. package/dist/ai/checks.d.ts +9 -1
  101. package/dist/ai/checks.js +242 -0
  102. package/dist/ai/checks.js.map +1 -0
  103. package/dist/ai/computer.d.ts +11 -4
  104. package/dist/ai/computer.js +251 -0
  105. package/dist/ai/computer.js.map +1 -0
  106. package/dist/ai/defence.d.ts +4 -0
  107. package/dist/ai/defence.js +430 -0
  108. package/dist/ai/defence.js.map +1 -0
  109. package/dist/ai/define.d.ts +3 -2
  110. package/dist/ai/define.js +31 -0
  111. package/dist/ai/define.js.map +1 -0
  112. package/dist/ai/economy.d.ts +10 -7
  113. package/dist/ai/economy.js +780 -0
  114. package/dist/ai/economy.js.map +1 -0
  115. package/dist/ai/geometry.js +38 -0
  116. package/dist/ai/geometry.js.map +1 -0
  117. package/dist/ai/goals.d.ts +1 -0
  118. package/dist/ai/goals.js +560 -0
  119. package/dist/ai/goals.js.map +1 -0
  120. package/dist/ai/knowledge.d.ts +72 -7
  121. package/dist/ai/knowledge.js +804 -0
  122. package/dist/ai/knowledge.js.map +1 -0
  123. package/dist/ai/lanes.d.ts +10 -2
  124. package/dist/ai/lanes.js +715 -0
  125. package/dist/ai/lanes.js.map +1 -0
  126. package/dist/ai/melee/build.js +264 -0
  127. package/dist/ai/melee/build.js.map +1 -0
  128. package/dist/ai/melee/goals.d.ts +7 -0
  129. package/dist/ai/melee/goals.js +720 -0
  130. package/dist/ai/melee/goals.js.map +1 -0
  131. package/dist/ai/melee/heroes.js +68 -0
  132. package/dist/ai/melee/heroes.js.map +1 -0
  133. package/dist/ai/melee/index.d.ts +1 -1
  134. package/dist/ai/melee/index.js +51 -0
  135. package/dist/ai/melee/index.js.map +1 -0
  136. package/dist/ai/melee/production.js +29 -0
  137. package/dist/ai/melee/production.js.map +1 -0
  138. package/dist/ai/melee/surrender.js +64 -0
  139. package/dist/ai/melee/surrender.js.map +1 -0
  140. package/dist/ai/micro.d.ts +9 -0
  141. package/dist/ai/micro.js +1316 -0
  142. package/dist/ai/micro.js.map +1 -0
  143. package/dist/ai/mission.d.ts +9 -2
  144. package/dist/ai/mission.js +538 -0
  145. package/dist/ai/mission.js.map +1 -0
  146. package/dist/ai/missionRules.d.ts +1 -1
  147. package/dist/ai/missionRules.js +26 -0
  148. package/dist/ai/missionRules.js.map +1 -0
  149. package/dist/ai/module.d.ts +6 -2
  150. package/dist/ai/module.js +37 -0
  151. package/dist/ai/module.js.map +1 -0
  152. package/dist/ai/options.d.ts +3 -3
  153. package/dist/ai/plans/build.d.ts +20 -1
  154. package/dist/ai/plans/build.js +608 -0
  155. package/dist/ai/plans/build.js.map +1 -0
  156. package/dist/ai/plans/placement.d.ts +4 -1
  157. package/dist/ai/plans/placement.js +295 -0
  158. package/dist/ai/plans/placement.js.map +1 -0
  159. package/dist/ai/plans/plans.d.ts +9 -0
  160. package/dist/ai/plans/plans.js +110 -0
  161. package/dist/ai/plans/plans.js.map +1 -0
  162. package/dist/ai/plans/production.d.ts +14 -2
  163. package/dist/ai/plans/production.js +434 -0
  164. package/dist/ai/plans/production.js.map +1 -0
  165. package/dist/ai/plans/purse.d.ts +6 -3
  166. package/dist/ai/plans/purse.js +139 -0
  167. package/dist/ai/plans/purse.js.map +1 -0
  168. package/dist/ai/plans/tech.d.ts +6 -0
  169. package/dist/ai/plans/tech.js +122 -0
  170. package/dist/ai/plans/tech.js.map +1 -0
  171. package/dist/ai/profiles.d.ts +4 -4
  172. package/dist/{profiles-B3NS9jwk.js → ai/profiles.js} +3 -98
  173. package/dist/ai/profiles.js.map +1 -0
  174. package/dist/ai/reach.js +54 -0
  175. package/dist/ai/reach.js.map +1 -0
  176. package/dist/ai/report.d.ts +8 -0
  177. package/dist/ai/report.js +87 -0
  178. package/dist/ai/report.js.map +1 -0
  179. package/dist/ai/roles.d.ts +4 -0
  180. package/dist/ai/roles.js +207 -0
  181. package/dist/ai/roles.js.map +1 -0
  182. package/dist/ai/rules.d.ts +8 -2
  183. package/dist/ai/rules.js +416 -0
  184. package/dist/ai/rules.js.map +1 -0
  185. package/dist/ai/scouting.d.ts +6 -0
  186. package/dist/ai/scouting.js +324 -0
  187. package/dist/ai/scouting.js.map +1 -0
  188. package/dist/ai/settings.js +99 -0
  189. package/dist/ai/settings.js.map +1 -0
  190. package/dist/ai/squads.d.ts +21 -2
  191. package/dist/ai/squads.js +916 -0
  192. package/dist/ai/squads.js.map +1 -0
  193. package/dist/ai/strength.js +320 -0
  194. package/dist/ai/strength.js.map +1 -0
  195. package/dist/ai/task.d.ts +3 -1
  196. package/dist/ai/task.js +17 -0
  197. package/dist/ai/task.js.map +1 -0
  198. package/dist/ai/tasks/attack.js +24 -0
  199. package/dist/ai/tasks/attack.js.map +1 -0
  200. package/dist/ai/tasks/capture.d.ts +3 -3
  201. package/dist/ai/tasks/capture.js +37 -0
  202. package/dist/ai/tasks/capture.js.map +1 -0
  203. package/dist/ai/tasks/creep.js +29 -0
  204. package/dist/ai/tasks/creep.js.map +1 -0
  205. package/dist/ai/tasks/defend.js +61 -0
  206. package/dist/ai/tasks/defend.js.map +1 -0
  207. package/dist/ai/tasks/drop.js +81 -0
  208. package/dist/ai/tasks/drop.js.map +1 -0
  209. package/dist/ai/tasks/escort.js +59 -0
  210. package/dist/ai/tasks/escort.js.map +1 -0
  211. package/dist/ai/tasks/gather.js +48 -0
  212. package/dist/ai/tasks/gather.js.map +1 -0
  213. package/dist/ai/tasks/harass.js +39 -0
  214. package/dist/ai/tasks/harass.js.map +1 -0
  215. package/dist/ai/tasks/hold.js +32 -0
  216. package/dist/ai/tasks/hold.js.map +1 -0
  217. package/dist/ai/tasks/index.js +34 -0
  218. package/dist/ai/tasks/index.js.map +1 -0
  219. package/dist/ai/tasks/move.js +26 -0
  220. package/dist/ai/tasks/move.js.map +1 -0
  221. package/dist/ai/tasks/patrol.js +59 -0
  222. package/dist/ai/tasks/patrol.js.map +1 -0
  223. package/dist/ai/tasks/retreat.js +28 -0
  224. package/dist/ai/tasks/retreat.js.map +1 -0
  225. package/dist/ai/tasks/scout.js +73 -0
  226. package/dist/ai/tasks/scout.js.map +1 -0
  227. package/dist/ai/tasks/shared.d.ts +1 -1
  228. package/dist/ai/tasks/shared.js +137 -0
  229. package/dist/ai/tasks/shared.js.map +1 -0
  230. package/dist/ai/team.d.ts +18 -1
  231. package/dist/ai/team.js +492 -0
  232. package/dist/ai/team.js.map +1 -0
  233. package/dist/ai/threat.d.ts +6 -0
  234. package/dist/ai/threat.js +206 -0
  235. package/dist/ai/threat.js.map +1 -0
  236. package/dist/ai/view.d.ts +21 -7
  237. package/dist/ai/view.js +677 -0
  238. package/dist/ai/view.js.map +1 -0
  239. package/dist/ai/waves.d.ts +6 -0
  240. package/dist/ai/waves.js +410 -0
  241. package/dist/ai/waves.js.map +1 -0
  242. package/dist/ai.js +54 -6239
  243. package/dist/aiTesting.d.ts +6 -3
  244. package/dist/aiTesting.js +229 -0
  245. package/dist/aiTesting.js.map +1 -0
  246. package/dist/areas.d.ts +4 -1
  247. package/dist/areas.js +295 -0
  248. package/dist/areas.js.map +1 -0
  249. package/dist/attacks.d.ts +3 -3
  250. package/dist/attacks.js +127 -0
  251. package/dist/attacks.js.map +1 -0
  252. package/dist/burning.d.ts +267 -0
  253. package/dist/burning.js +795 -0
  254. package/dist/burning.js.map +1 -0
  255. package/dist/bytes.js +21 -0
  256. package/dist/bytes.js.map +1 -0
  257. package/dist/callings.d.ts +71 -0
  258. package/dist/callings.js +157 -0
  259. package/dist/callings.js.map +1 -0
  260. package/dist/cameraOrders.d.ts +78 -0
  261. package/dist/cameraOrders.js +114 -0
  262. package/dist/cameraOrders.js.map +1 -0
  263. package/dist/camps.d.ts +70 -4
  264. package/dist/camps.js +501 -0
  265. package/dist/camps.js.map +1 -0
  266. package/dist/capture.d.ts +15 -3
  267. package/dist/capture.js +304 -0
  268. package/dist/capture.js.map +1 -0
  269. package/dist/cellLayers.d.ts +78 -13
  270. package/dist/cellLayers.js +275 -0
  271. package/dist/cellLayers.js.map +1 -0
  272. package/dist/cellPatches.d.ts +24 -0
  273. package/dist/cellPatches.js +73 -0
  274. package/dist/cellPatches.js.map +1 -0
  275. package/dist/cinematics.d.ts +10 -5
  276. package/dist/cinematics.js +161 -0
  277. package/dist/cinematics.js.map +1 -0
  278. package/dist/clock.d.ts +2 -2
  279. package/dist/clock.js +78 -0
  280. package/dist/clock.js.map +1 -0
  281. package/dist/commands.d.ts +36 -4
  282. package/dist/commands.js +636 -0
  283. package/dist/commands.js.map +1 -0
  284. package/dist/components.d.ts +31 -10
  285. package/dist/components.js +74 -0
  286. package/dist/components.js.map +1 -0
  287. package/dist/computers.d.ts +4 -4
  288. package/dist/computers.js +194 -0
  289. package/dist/computers.js.map +1 -0
  290. package/dist/concealment.d.ts +25 -2
  291. package/dist/concealment.js +409 -0
  292. package/dist/concealment.js.map +1 -0
  293. package/dist/coreComponents.js +130 -0
  294. package/dist/coreComponents.js.map +1 -0
  295. package/dist/createGame.d.ts +306 -0
  296. package/dist/createGame.js +405 -0
  297. package/dist/createGame.js.map +1 -0
  298. package/dist/dashing.d.ts +18 -2
  299. package/dist/dashing.js +41 -0
  300. package/dist/dashing.js.map +1 -0
  301. package/dist/debug.d.ts +8 -0
  302. package/dist/debug.js +5 -3
  303. package/dist/debug2.js +76 -0
  304. package/dist/debug2.js.map +1 -0
  305. package/dist/debugCommands.d.ts +6 -6
  306. package/dist/debugCommands.js +537 -0
  307. package/dist/debugCommands.js.map +1 -0
  308. package/dist/debugging.d.ts +1 -0
  309. package/dist/defaultSets.d.ts +183 -0
  310. package/dist/defaultSets.js +216 -0
  311. package/dist/defaultSets.js.map +1 -0
  312. package/dist/definitions.d.ts +6 -0
  313. package/dist/definitions.js +78 -0
  314. package/dist/definitions.js.map +1 -0
  315. package/dist/defs.d.ts +1895 -165
  316. package/dist/defs.js +380 -0
  317. package/dist/defs.js.map +1 -0
  318. package/dist/denying.d.ts +4 -4
  319. package/dist/denying.js +106 -0
  320. package/dist/denying.js.map +1 -0
  321. package/dist/destructibles.d.ts +2 -2
  322. package/dist/destructibles.js +36 -0
  323. package/dist/destructibles.js.map +1 -0
  324. package/dist/determinism.d.ts +4 -4
  325. package/dist/determinism.js +247 -0
  326. package/dist/determinism.js.map +1 -0
  327. package/dist/dialog.d.ts +17 -2
  328. package/dist/dialog.js +108 -0
  329. package/dist/dialog.js.map +1 -0
  330. package/dist/effectRefs.js +28 -0
  331. package/dist/effectRefs.js.map +1 -0
  332. package/dist/effects.d.ts +27 -11
  333. package/dist/effects.js +110 -0
  334. package/dist/effects.js.map +1 -0
  335. package/dist/endings.d.ts +1 -1
  336. package/dist/endings.js +78 -0
  337. package/dist/endings.js.map +1 -0
  338. package/dist/engagement.d.ts +40 -6
  339. package/dist/engagement.js +530 -0
  340. package/dist/engagement.js.map +1 -0
  341. package/dist/engineEvents.d.ts +72 -9
  342. package/dist/engineEvents.js +520 -0
  343. package/dist/engineEvents.js.map +1 -0
  344. package/dist/entity.d.ts +275 -26
  345. package/dist/entity.js +441 -0
  346. package/dist/entity.js.map +1 -0
  347. package/dist/entityIndex.d.ts +10 -3
  348. package/dist/entityIndex.js +149 -0
  349. package/dist/entityIndex.js.map +1 -0
  350. package/dist/errors.d.ts +6 -2
  351. package/dist/errors.js +59 -0
  352. package/dist/errors.js.map +1 -0
  353. package/dist/events.d.ts +11 -5
  354. package/dist/events.js +158 -0
  355. package/dist/events.js.map +1 -0
  356. package/dist/exactMath.js +273 -0
  357. package/dist/exactMath.js.map +1 -0
  358. package/dist/features.d.ts +1 -1
  359. package/dist/features.js +127 -0
  360. package/dist/features.js.map +1 -0
  361. package/dist/fields.d.ts +25 -5
  362. package/dist/fields.js +140 -0
  363. package/dist/fields.js.map +1 -0
  364. package/dist/fixture.d.ts +3 -3
  365. package/dist/fixture.js +512 -0
  366. package/dist/fixture.js.map +1 -0
  367. package/dist/fog.d.ts +26 -3
  368. package/dist/fog.js +333 -0
  369. package/dist/fog.js.map +1 -0
  370. package/dist/foliage.d.ts +476 -0
  371. package/dist/foliage.js +1478 -0
  372. package/dist/foliage.js.map +1 -0
  373. package/dist/foliageDebug.d.ts +57 -0
  374. package/dist/foliageDebug.js +172 -0
  375. package/dist/foliageDebug.js.map +1 -0
  376. package/dist/foliageRegrowth.d.ts +20 -0
  377. package/dist/foliageRegrowth.js +332 -0
  378. package/dist/foliageRegrowth.js.map +1 -0
  379. package/dist/formState.d.ts +67 -0
  380. package/dist/formState.js +65 -0
  381. package/dist/formState.js.map +1 -0
  382. package/dist/formation.d.ts +46 -8
  383. package/dist/formation.js +297 -0
  384. package/dist/formation.js.map +1 -0
  385. package/dist/forms.d.ts +58 -0
  386. package/dist/forms.js +146 -0
  387. package/dist/forms.js.map +1 -0
  388. package/dist/friendlyFire.d.ts +2 -2
  389. package/dist/friendlyFire.js +37 -0
  390. package/dist/friendlyFire.js.map +1 -0
  391. package/dist/game.d.ts +141 -48
  392. package/dist/game.js +834 -0
  393. package/dist/game.js.map +1 -0
  394. package/dist/gameData.d.ts +96 -22
  395. package/dist/gameData.js +1690 -0
  396. package/dist/gameData.js.map +1 -0
  397. package/dist/gameFiles.d.ts +3 -3
  398. package/dist/gameFiles.js +14 -0
  399. package/dist/gameFiles.js.map +1 -0
  400. package/dist/gates.js +92 -0
  401. package/dist/gates.js.map +1 -0
  402. package/dist/generate.d.ts +28 -1
  403. package/dist/generate.js +1062 -0
  404. package/dist/generate.js.map +1 -0
  405. package/dist/generateWorker.d.ts +7 -3
  406. package/dist/generateWorker.js +86 -0
  407. package/dist/generateWorker.js.map +1 -0
  408. package/dist/grid.d.ts +9 -0
  409. package/dist/grid.js +102 -0
  410. package/dist/grid.js.map +1 -0
  411. package/dist/ground.d.ts +17 -1
  412. package/dist/ground.js +375 -0
  413. package/dist/ground.js.map +1 -0
  414. package/dist/groundObjects.d.ts +70 -0
  415. package/dist/groundObjects.js +371 -0
  416. package/dist/groundObjects.js.map +1 -0
  417. package/dist/groundSpeed.d.ts +20 -3
  418. package/dist/groundSpeed.js +117 -0
  419. package/dist/groundSpeed.js.map +1 -0
  420. package/dist/hero.d.ts +126 -10
  421. package/dist/hero.js +432 -0
  422. package/dist/hero.js.map +1 -0
  423. package/dist/holds.d.ts +94 -0
  424. package/dist/holds.js +305 -0
  425. package/dist/holds.js.map +1 -0
  426. package/dist/home.d.ts +1 -1
  427. package/dist/home.js +30 -0
  428. package/dist/home.js.map +1 -0
  429. package/dist/hooks.d.ts +339 -57
  430. package/dist/hooks.js +105 -0
  431. package/dist/hooks.js.map +1 -0
  432. package/dist/hotReload.d.ts +6 -5
  433. package/dist/hotReload.js +145 -0
  434. package/dist/hotReload.js.map +1 -0
  435. package/dist/ids.d.ts +3 -3
  436. package/dist/ids.js +30 -0
  437. package/dist/ids.js.map +1 -0
  438. package/dist/idsFile.d.ts +36 -0
  439. package/dist/idsFile.js +134 -0
  440. package/dist/idsFile.js.map +1 -0
  441. package/dist/index.d.ts +105 -68
  442. package/dist/index.js +194 -4701
  443. package/dist/inspect.d.ts +29 -2
  444. package/dist/{inspect-D9dWHmZ0.js → inspect.js} +21 -12
  445. package/dist/inspect.js.map +1 -0
  446. package/dist/inventory.d.ts +14 -1
  447. package/dist/inventory.js +84 -0
  448. package/dist/inventory.js.map +1 -0
  449. package/dist/items.d.ts +136 -8
  450. package/dist/items.js +585 -0
  451. package/dist/items.js.map +1 -0
  452. package/dist/lanes.d.ts +12 -3
  453. package/dist/lanes.js +496 -0
  454. package/dist/lanes.js.map +1 -0
  455. package/dist/life.d.ts +6 -2
  456. package/dist/life.js +287 -0
  457. package/dist/life.js.map +1 -0
  458. package/dist/log.d.ts +26 -3
  459. package/dist/log.js +192 -0
  460. package/dist/log.js.map +1 -0
  461. package/dist/manaBurn.d.ts +2 -2
  462. package/dist/manaBurn.js +75 -0
  463. package/dist/manaBurn.js.map +1 -0
  464. package/dist/map/file.d.ts +56 -3
  465. package/dist/map/file.js +264 -0
  466. package/dist/map/file.js.map +1 -0
  467. package/dist/map/images.js +61 -0
  468. package/dist/map/images.js.map +1 -0
  469. package/dist/map/look.d.ts +1 -1
  470. package/dist/map/look.js +30 -0
  471. package/dist/map/look.js.map +1 -0
  472. package/dist/map/pathProfile.js +183 -0
  473. package/dist/map/pathProfile.js.map +1 -0
  474. package/dist/map/resize.d.ts +4 -0
  475. package/dist/map/resize.js +136 -0
  476. package/dist/map/resize.js.map +1 -0
  477. package/dist/map/schema.js +257 -0
  478. package/dist/map/schema.js.map +1 -0
  479. package/dist/map/terrain.js +214 -0
  480. package/dist/map/terrain.js.map +1 -0
  481. package/dist/map/types.d.ts +92 -13
  482. package/dist/map/types.js +251 -0
  483. package/dist/map/types.js.map +1 -0
  484. package/dist/mapCheck/cells.js +94 -0
  485. package/dist/mapCheck/cells.js.map +1 -0
  486. package/dist/mapCheck/rules/foliage.d.ts +9 -0
  487. package/dist/mapCheck/rules/foliage.js +83 -0
  488. package/dist/mapCheck/rules/foliage.js.map +1 -0
  489. package/dist/mapCheck/rules/names.js +39 -0
  490. package/dist/mapCheck/rules/names.js.map +1 -0
  491. package/dist/mapCheck/rules/objects.d.ts +1 -1
  492. package/dist/mapCheck/rules/objects.js +56 -0
  493. package/dist/mapCheck/rules/objects.js.map +1 -0
  494. package/dist/mapCheck/rules/paths.js +32 -0
  495. package/dist/mapCheck/rules/paths.js.map +1 -0
  496. package/dist/mapCheck/rules/players.js +20 -0
  497. package/dist/mapCheck/rules/players.js.map +1 -0
  498. package/dist/mapCheck/rules/races.js +56 -0
  499. package/dist/mapCheck/rules/races.js.map +1 -0
  500. package/dist/mapCheck/rules/random.js +47 -0
  501. package/dist/mapCheck/rules/random.js.map +1 -0
  502. package/dist/mapCheck/rules/regions.js +30 -0
  503. package/dist/mapCheck/rules/regions.js.map +1 -0
  504. package/dist/mapCheck/rules/targets.js +31 -0
  505. package/dist/mapCheck/rules/targets.js.map +1 -0
  506. package/dist/mapCheck/rules/walking.js +45 -0
  507. package/dist/mapCheck/rules/walking.js.map +1 -0
  508. package/dist/mapCheck.d.ts +2 -2
  509. package/dist/mapCheck.js +63 -0
  510. package/dist/mapCheck.js.map +1 -0
  511. package/dist/mapFields.d.ts +25 -2
  512. package/dist/mapFields.js +134 -0
  513. package/dist/mapFields.js.map +1 -0
  514. package/dist/mapFile.js +176 -0
  515. package/dist/mapFile.js.map +1 -0
  516. package/dist/mapMeasure.d.ts +8 -0
  517. package/dist/mapMeasure.js +283 -0
  518. package/dist/mapMeasure.js.map +1 -0
  519. package/dist/mapMerge.d.ts +1 -0
  520. package/dist/mapMerge.js +172 -0
  521. package/dist/mapMerge.js.map +1 -0
  522. package/dist/mapObjectives.js +138 -0
  523. package/dist/mapObjectives.js.map +1 -0
  524. package/dist/mapObjects.js +80 -0
  525. package/dist/mapObjects.js.map +1 -0
  526. package/dist/math.d.ts +37 -7
  527. package/dist/math.js +155 -0
  528. package/dist/math.js.map +1 -0
  529. package/dist/messages.d.ts +71 -4
  530. package/dist/messages.js +29 -0
  531. package/dist/messages.js.map +1 -0
  532. package/dist/missionRules.d.ts +10 -2
  533. package/dist/{missionRules-C-bGxm0Q.js → missionRules.js} +30 -150
  534. package/dist/missionRules.js.map +1 -0
  535. package/dist/mods.d.ts +39 -20
  536. package/dist/mods.js +271 -0
  537. package/dist/mods.js.map +1 -0
  538. package/dist/moves.d.ts +87 -0
  539. package/dist/moves.js +539 -0
  540. package/dist/moves.js.map +1 -0
  541. package/dist/names.d.ts +7 -0
  542. package/dist/names.js +122 -0
  543. package/dist/names.js.map +1 -0
  544. package/dist/navigation/agentParams.js +14 -0
  545. package/dist/navigation/agentParams.js.map +1 -0
  546. package/dist/navigation/air.d.ts +7 -3
  547. package/dist/navigation/air.js +401 -0
  548. package/dist/navigation/air.js.map +1 -0
  549. package/dist/navigation/builds.d.ts +34 -2
  550. package/dist/navigation/builds.js +287 -0
  551. package/dist/navigation/builds.js.map +1 -0
  552. package/dist/navigation/groundAreas.d.ts +59 -1
  553. package/dist/navigation/groundAreas.js +407 -0
  554. package/dist/navigation/groundAreas.js.map +1 -0
  555. package/dist/navigation/navigation.d.ts +98 -9
  556. package/dist/navigation/recast.d.ts +194 -18
  557. package/dist/navigation/recast.js +1379 -0
  558. package/dist/navigation/recast.js.map +1 -0
  559. package/dist/navigation/sidePaths.d.ts +8 -3
  560. package/dist/navigation/sidePaths.js +241 -0
  561. package/dist/navigation/sidePaths.js.map +1 -0
  562. package/dist/navigation/sized.js +243 -0
  563. package/dist/navigation/sized.js.map +1 -0
  564. package/dist/nearest.js +32 -0
  565. package/dist/nearest.js.map +1 -0
  566. package/dist/noise.js +59 -0
  567. package/dist/noise.js.map +1 -0
  568. package/dist/objectives.d.ts +12 -3
  569. package/dist/objectives.js +144 -0
  570. package/dist/objectives.js.map +1 -0
  571. package/dist/orders/basic.d.ts +5 -5
  572. package/dist/orders/basic.js +417 -0
  573. package/dist/orders/basic.js.map +1 -0
  574. package/dist/orders/build.js +278 -0
  575. package/dist/orders/build.js.map +1 -0
  576. package/dist/orders/cast.d.ts +13 -3
  577. package/dist/orders/cast.js +558 -0
  578. package/dist/orders/cast.js.map +1 -0
  579. package/dist/orders/facts.js +16 -0
  580. package/dist/orders/facts.js.map +1 -0
  581. package/dist/orders/harvest.d.ts +21 -5
  582. package/dist/orders/harvest.js +540 -0
  583. package/dist/orders/harvest.js.map +1 -0
  584. package/dist/orders/idle.d.ts +3 -1
  585. package/dist/orders/idle.js +234 -0
  586. package/dist/orders/idle.js.map +1 -0
  587. package/dist/orders/items.js +92 -0
  588. package/dist/orders/items.js.map +1 -0
  589. package/dist/orders/queue.js +108 -0
  590. package/dist/orders/queue.js.map +1 -0
  591. package/dist/orders/waiting.d.ts +39 -0
  592. package/dist/orders/waiting.js +149 -0
  593. package/dist/orders/waiting.js.map +1 -0
  594. package/dist/pack.schema.js +13 -0
  595. package/dist/pack.schema.js.map +1 -0
  596. package/dist/pack.schema.json +7622 -841
  597. package/dist/packs/director/index.d.ts +13 -5
  598. package/dist/packs/director/index.js +204 -0
  599. package/dist/packs/director/index.js.map +1 -0
  600. package/dist/packs/heroes/campaign.d.ts +3 -2
  601. package/dist/packs/heroes/campaign.js +241 -0
  602. package/dist/packs/heroes/campaign.js.map +1 -0
  603. package/dist/packs/heroes/carry.d.ts +6 -0
  604. package/dist/packs/heroes/carry.js +112 -0
  605. package/dist/packs/heroes/carry.js.map +1 -0
  606. package/dist/packs/heroes/commands.js +115 -0
  607. package/dist/packs/heroes/commands.js.map +1 -0
  608. package/dist/packs/heroes/fallen.d.ts +43 -0
  609. package/dist/packs/heroes/fallen.js +61 -0
  610. package/dist/packs/heroes/fallen.js.map +1 -0
  611. package/dist/packs/heroes/hire.js +60 -0
  612. package/dist/packs/heroes/hire.js.map +1 -0
  613. package/dist/packs/heroes/index.d.ts +7 -6
  614. package/dist/packs/heroes/index.js +130 -0
  615. package/dist/packs/heroes/index.js.map +1 -0
  616. package/dist/packs/heroes/loop.d.ts +95 -0
  617. package/dist/packs/heroes/loop.js +250 -0
  618. package/dist/packs/heroes/loop.js.map +1 -0
  619. package/dist/packs/heroes/making.d.ts +6 -3
  620. package/dist/packs/heroes/making.js +55 -0
  621. package/dist/packs/heroes/making.js.map +1 -0
  622. package/dist/packs/heroes/respawn.d.ts +3 -3
  623. package/dist/packs/heroes/respawn.js +87 -0
  624. package/dist/packs/heroes/respawn.js.map +1 -0
  625. package/dist/packs/heroes/sets.d.ts +32 -0
  626. package/dist/packs/heroes/sets.js +51 -0
  627. package/dist/packs/heroes/sets.js.map +1 -0
  628. package/dist/packs/heroes/spells.d.ts +16 -0
  629. package/dist/packs/heroes/spells.js +269 -0
  630. package/dist/packs/heroes/spells.js.map +1 -0
  631. package/dist/packs/items/defaults.d.ts +43 -0
  632. package/dist/packs/items/defaults.js +1504 -0
  633. package/dist/packs/items/defaults.js.map +1 -0
  634. package/dist/packs/items/index.d.ts +27 -0
  635. package/dist/packs/items/index.js +214 -0
  636. package/dist/packs/items/index.js.map +1 -0
  637. package/dist/packs/moba/index.d.ts +3 -3
  638. package/dist/packs/moba/index.js +174 -0
  639. package/dist/packs/moba/index.js.map +1 -0
  640. package/dist/packs/pack.d.ts +15 -15
  641. package/dist/packs/pack.js +14 -0
  642. package/dist/packs/pack.js.map +1 -0
  643. package/dist/packs.d.ts +15 -7
  644. package/dist/packs.js +222 -0
  645. package/dist/packs.js.map +1 -0
  646. package/dist/paths.d.ts +2 -0
  647. package/dist/paths.js +109 -0
  648. package/dist/paths.js.map +1 -0
  649. package/dist/plain.js +57 -0
  650. package/dist/plain.js.map +1 -0
  651. package/dist/player.d.ts +33 -10
  652. package/dist/player.js +159 -0
  653. package/dist/player.js.map +1 -0
  654. package/dist/portals.d.ts +1 -1
  655. package/dist/portals.js +194 -0
  656. package/dist/portals.js.map +1 -0
  657. package/dist/prefabs.d.ts +25 -2
  658. package/dist/prefabs.js +239 -0
  659. package/dist/prefabs.js.map +1 -0
  660. package/dist/presetBuildings.js +58 -0
  661. package/dist/presetBuildings.js.map +1 -0
  662. package/dist/presetFoliage.d.ts +27 -0
  663. package/dist/presetFoliage.js +98 -0
  664. package/dist/presetFoliage.js.map +1 -0
  665. package/dist/presetGround.js +65 -0
  666. package/dist/presetGround.js.map +1 -0
  667. package/dist/proxies.d.ts +12 -0
  668. package/dist/proxies.js +79 -0
  669. package/dist/proxies.js.map +1 -0
  670. package/dist/query.d.ts +56 -0
  671. package/dist/query.js +88 -0
  672. package/dist/query.js.map +1 -0
  673. package/dist/races.d.ts +15 -14
  674. package/dist/races.js +172 -0
  675. package/dist/races.js.map +1 -0
  676. package/dist/randomGroups.js +91 -0
  677. package/dist/randomGroups.js.map +1 -0
  678. package/dist/registry.d.ts +117 -53
  679. package/dist/registry.js +323 -0
  680. package/dist/registry.js.map +1 -0
  681. package/dist/remains.d.ts +11 -9
  682. package/dist/remains.js +188 -0
  683. package/dist/remains.js.map +1 -0
  684. package/dist/replication.d.ts +12 -7
  685. package/dist/replication.js +100 -0
  686. package/dist/replication.js.map +1 -0
  687. package/dist/rng.d.ts +2 -0
  688. package/dist/rng.js +40 -0
  689. package/dist/rng.js.map +1 -0
  690. package/dist/rules.d.ts +186 -99
  691. package/dist/rules.js +179 -0
  692. package/dist/rules.js.map +1 -0
  693. package/dist/rulesCheck.d.ts +5 -4
  694. package/dist/rulesCheck.js +693 -0
  695. package/dist/rulesCheck.js.map +1 -0
  696. package/dist/runes.d.ts +2 -2
  697. package/dist/runes.js +80 -0
  698. package/dist/runes.js.map +1 -0
  699. package/dist/save.d.ts +37 -12
  700. package/dist/save.js +532 -0
  701. package/dist/save.js.map +1 -0
  702. package/dist/scenario.d.ts +2 -2
  703. package/dist/scenario.js +99 -0
  704. package/dist/scenario.js.map +1 -0
  705. package/dist/scheduler.d.ts +3 -0
  706. package/dist/scheduler.js +156 -0
  707. package/dist/scheduler.js.map +1 -0
  708. package/dist/score.d.ts +19 -19
  709. package/dist/score.js +709 -0
  710. package/dist/score.js.map +1 -0
  711. package/dist/sequences.d.ts +10 -6
  712. package/dist/sequences.js +206 -0
  713. package/dist/sequences.js.map +1 -0
  714. package/dist/server/doorman.js +154 -0
  715. package/dist/server/doorman.js.map +1 -0
  716. package/dist/server/gameServer.d.ts +16 -1
  717. package/dist/server/gameServer.js +643 -0
  718. package/dist/server/gameServer.js.map +1 -0
  719. package/dist/server/index.d.ts +1 -1
  720. package/dist/server/lobby.js +199 -0
  721. package/dist/server/lobby.js.map +1 -0
  722. package/dist/server/log.js +18 -0
  723. package/dist/server/log.js.map +1 -0
  724. package/dist/server/match.js +267 -0
  725. package/dist/server/match.js.map +1 -0
  726. package/dist/server/mode.d.ts +18 -9
  727. package/dist/server/mode.js +220 -0
  728. package/dist/server/mode.js.map +1 -0
  729. package/dist/{navigation-worker.js → server/navigation-worker.js} +1 -1
  730. package/dist/server/navigation-worker.js.map +1 -0
  731. package/dist/server/navigation.js +39 -0
  732. package/dist/server/navigation.js.map +1 -0
  733. package/dist/server/ops.d.ts +4 -0
  734. package/dist/server/ops.js +137 -0
  735. package/dist/server/ops.js.map +1 -0
  736. package/dist/server/packs.d.ts +3 -3
  737. package/dist/server/packs.js +32 -0
  738. package/dist/server/packs.js.map +1 -0
  739. package/dist/server/ratings.d.ts +5 -0
  740. package/dist/server/ratings.js +104 -0
  741. package/dist/server/ratings.js.map +1 -0
  742. package/dist/server/relay.d.ts +12 -2
  743. package/dist/server/relay.js +144 -0
  744. package/dist/server/relay.js.map +1 -0
  745. package/dist/server/rooms.d.ts +9 -2
  746. package/dist/server/rooms.js +442 -0
  747. package/dist/server/rooms.js.map +1 -0
  748. package/dist/server/seat.js +116 -0
  749. package/dist/server/seat.js.map +1 -0
  750. package/dist/server/seatSettings.d.ts +3 -3
  751. package/dist/server/seatSettings.js +63 -0
  752. package/dist/server/seatSettings.js.map +1 -0
  753. package/dist/server/secret.js +13 -0
  754. package/dist/server/secret.js.map +1 -0
  755. package/dist/server/start.d.ts +13 -6
  756. package/dist/server/start.js +76 -0
  757. package/dist/server/start.js.map +1 -0
  758. package/dist/server/websocket.d.ts +9 -1
  759. package/dist/server/websocket.js +306 -0
  760. package/dist/server/websocket.js.map +1 -0
  761. package/dist/server.js +15 -2861
  762. package/dist/session/can.js +26 -0
  763. package/dist/session/can.js.map +1 -0
  764. package/dist/session/commandReplay.d.ts +8 -2
  765. package/dist/session/commandReplay.js +293 -0
  766. package/dist/session/commandReplay.js.map +1 -0
  767. package/dist/session/debug.js +151 -0
  768. package/dist/session/debug.js.map +1 -0
  769. package/dist/session/delay.js +62 -0
  770. package/dist/session/delay.js.map +1 -0
  771. package/dist/session/delta.d.ts +14 -1
  772. package/dist/session/delta.js +407 -0
  773. package/dist/session/delta.js.map +1 -0
  774. package/dist/session/entityState.js +415 -0
  775. package/dist/session/entityState.js.map +1 -0
  776. package/dist/session/local.d.ts +47 -5
  777. package/dist/session/local.js +670 -0
  778. package/dist/session/local.js.map +1 -0
  779. package/dist/session/memory.d.ts +20 -2
  780. package/dist/session/memory.js +131 -0
  781. package/dist/session/memory.js.map +1 -0
  782. package/dist/session/protocol.d.ts +325 -31
  783. package/dist/session/protocol.js +55 -0
  784. package/dist/session/protocol.js.map +1 -0
  785. package/dist/session/remote.d.ts +74 -12
  786. package/dist/session/remote.js +1394 -0
  787. package/dist/session/remote.js.map +1 -0
  788. package/dist/session/replay.d.ts +11 -2
  789. package/dist/session/replay.js +160 -0
  790. package/dist/session/replay.js.map +1 -0
  791. package/dist/session/seed.js +12 -0
  792. package/dist/session/seed.js.map +1 -0
  793. package/dist/session/share.d.ts +5 -1
  794. package/dist/session/share.js +94 -0
  795. package/dist/session/share.js.map +1 -0
  796. package/dist/session/socket.d.ts +1 -1
  797. package/dist/session/socket.js +29 -0
  798. package/dist/session/socket.js.map +1 -0
  799. package/dist/session/wire.d.ts +5 -0
  800. package/dist/session/wire.js +84 -0
  801. package/dist/session/wire.js.map +1 -0
  802. package/dist/session/worker.d.ts +77 -12
  803. package/dist/session/worker.js +499 -0
  804. package/dist/session/worker.js.map +1 -0
  805. package/dist/shared.d.ts +31 -5
  806. package/dist/shared.js +166 -0
  807. package/dist/shared.js.map +1 -0
  808. package/dist/sides.d.ts +9 -3
  809. package/dist/sides.js +149 -0
  810. package/dist/sides.js.map +1 -0
  811. package/dist/sight.js +85 -0
  812. package/dist/sight.js.map +1 -0
  813. package/dist/simulate-worker.js +1 -1
  814. package/dist/simulate.d.ts +12 -8
  815. package/dist/{simulate-oXBiw1Ff.js → simulate.js} +10 -11
  816. package/dist/simulate.js.map +1 -0
  817. package/dist/smart.js +77 -0
  818. package/dist/smart.js.map +1 -0
  819. package/dist/spatial.d.ts +32 -16
  820. package/dist/spatial.js +234 -0
  821. package/dist/spatial.js.map +1 -0
  822. package/dist/spawning.d.ts +1 -0
  823. package/dist/spawning.js +224 -0
  824. package/dist/spawning.js.map +1 -0
  825. package/dist/stances.d.ts +6 -3
  826. package/dist/stances.js +169 -0
  827. package/dist/stances.js.map +1 -0
  828. package/dist/start.d.ts +10 -10
  829. package/dist/start.js +75 -0
  830. package/dist/start.js.map +1 -0
  831. package/dist/stats.d.ts +42 -16
  832. package/dist/stats.js +290 -0
  833. package/dist/stats.js.map +1 -0
  834. package/dist/summoned.d.ts +52 -0
  835. package/dist/summoned.js +38 -0
  836. package/dist/summoned.js.map +1 -0
  837. package/dist/summons.d.ts +10 -13
  838. package/dist/summons.js +271 -0
  839. package/dist/summons.js.map +1 -0
  840. package/dist/systems/abilities.js +224 -0
  841. package/dist/systems/abilities.js.map +1 -0
  842. package/dist/systems/combat.d.ts +35 -1
  843. package/dist/systems/combat.js +677 -0
  844. package/dist/systems/combat.js.map +1 -0
  845. package/dist/systems/combatTold.d.ts +3 -1
  846. package/dist/systems/combatTold.js +85 -0
  847. package/dist/systems/combatTold.js.map +1 -0
  848. package/dist/systems/construction.js +80 -0
  849. package/dist/systems/construction.js.map +1 -0
  850. package/dist/systems/economy.d.ts +0 -6
  851. package/dist/systems/economy.js +128 -0
  852. package/dist/systems/economy.js.map +1 -0
  853. package/dist/systems/fog.d.ts +1 -1
  854. package/dist/systems/fog.js +120 -0
  855. package/dist/systems/fog.js.map +1 -0
  856. package/dist/systems/life.js +32 -0
  857. package/dist/systems/life.js.map +1 -0
  858. package/dist/systems/movement.d.ts +24 -12
  859. package/dist/systems/movement.js +1247 -0
  860. package/dist/systems/movement.js.map +1 -0
  861. package/dist/systems/orders.js +64 -0
  862. package/dist/systems/orders.js.map +1 -0
  863. package/dist/systems/production.js +322 -0
  864. package/dist/systems/production.js.map +1 -0
  865. package/dist/systems/productionQueue.js +120 -0
  866. package/dist/systems/productionQueue.js.map +1 -0
  867. package/dist/systems/victory.d.ts +1 -1
  868. package/dist/systems/victory.js +56 -0
  869. package/dist/systems/victory.js.map +1 -0
  870. package/dist/talk.d.ts +6 -6
  871. package/dist/talk.js +153 -0
  872. package/dist/talk.js.map +1 -0
  873. package/dist/targeting.d.ts +142 -0
  874. package/dist/targeting.js +49 -0
  875. package/dist/targeting.js.map +1 -0
  876. package/dist/tech.d.ts +20 -3
  877. package/dist/tech.js +239 -0
  878. package/dist/tech.js.map +1 -0
  879. package/dist/techTree.d.ts +7 -0
  880. package/dist/techTree.js +90 -0
  881. package/dist/techTree.js.map +1 -0
  882. package/dist/terrain.d.ts +59 -7
  883. package/dist/terrain.js +389 -0
  884. package/dist/terrain.js.map +1 -0
  885. package/dist/terrainSave.d.ts +6 -0
  886. package/dist/terrainSave.js +74 -0
  887. package/dist/terrainSave.js.map +1 -0
  888. package/dist/testing.d.ts +8 -7
  889. package/dist/testing.js +13 -739
  890. package/dist/testing.js.map +1 -1
  891. package/dist/tiles.d.ts +1 -1
  892. package/dist/tiles.js +43 -0
  893. package/dist/tiles.js.map +1 -0
  894. package/dist/timers.d.ts +29 -4
  895. package/dist/timers.js +242 -0
  896. package/dist/timers.js.map +1 -0
  897. package/dist/tomes.d.ts +4 -4
  898. package/dist/tomes.js +94 -0
  899. package/dist/tomes.js.map +1 -0
  900. package/dist/trade.js +103 -0
  901. package/dist/trade.js.map +1 -0
  902. package/dist/transport.d.ts +6 -1
  903. package/dist/transport.js +281 -0
  904. package/dist/transport.js.map +1 -0
  905. package/dist/tunables.d.ts +10 -3
  906. package/dist/tunables.js +56 -0
  907. package/dist/tunables.js.map +1 -0
  908. package/dist/unitResources.d.ts +67 -0
  909. package/dist/unitResources.js +266 -0
  910. package/dist/unitResources.js.map +1 -0
  911. package/dist/upkeep.d.ts +6 -1
  912. package/dist/upkeep.js +26 -0
  913. package/dist/upkeep.js.map +1 -0
  914. package/dist/veterancy.d.ts +8 -3
  915. package/dist/veterancy.js +131 -0
  916. package/dist/veterancy.js.map +1 -0
  917. package/dist/vision.d.ts +36 -0
  918. package/dist/vision.js +133 -0
  919. package/dist/vision.js.map +1 -0
  920. package/dist/walls.d.ts +1 -1
  921. package/dist/walls.js +278 -0
  922. package/dist/walls.js.map +1 -0
  923. package/dist/world.d.ts +606 -88
  924. package/dist/world.js +1263 -0
  925. package/dist/world.js.map +1 -0
  926. package/package.json +2 -2
  927. package/dist/ai.js.map +0 -1
  928. package/dist/attributes.d.ts +0 -66
  929. package/dist/brain-BvVdUhX8.js +0 -7659
  930. package/dist/brain-BvVdUhX8.js.map +0 -1
  931. package/dist/builds-C6LfgvEU.js +0 -460
  932. package/dist/builds-C6LfgvEU.js.map +0 -1
  933. package/dist/coreComponents-syuh2fPG.js +0 -5149
  934. package/dist/coreComponents-syuh2fPG.js.map +0 -1
  935. package/dist/debugCommands-CzjrSm66.js +0 -14739
  936. package/dist/debugCommands-CzjrSm66.js.map +0 -1
  937. package/dist/determinism-BCymQwiE.js +0 -518
  938. package/dist/determinism-BCymQwiE.js.map +0 -1
  939. package/dist/game-DiJEN-Ks.js +0 -5800
  940. package/dist/game-DiJEN-Ks.js.map +0 -1
  941. package/dist/index.js.map +0 -1
  942. package/dist/inspect-D9dWHmZ0.js.map +0 -1
  943. package/dist/local-Dkovq42k.js +0 -1379
  944. package/dist/local-Dkovq42k.js.map +0 -1
  945. package/dist/missionRules-C-bGxm0Q.js.map +0 -1
  946. package/dist/navigation-worker.js.map +0 -1
  947. package/dist/packs-g5thvmGn.js +0 -3199
  948. package/dist/packs-g5thvmGn.js.map +0 -1
  949. package/dist/profiles-B3NS9jwk.js.map +0 -1
  950. package/dist/server.js.map +0 -1
  951. package/dist/simulate-oXBiw1Ff.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proxies.js","names":[],"sources":["../src/proxies.ts"],"sourcesContent":["import type { EffectContext } from './abilities/effects'\nimport type { EffectDef, ProxyOrigin } from './defs'\nimport type { Entity } from './entity'\nimport { hypot } from './exactMath'\nimport type { World } from './world'\n\n/*\n * Proxies (E2E-PLAN AB17): units of a caster's its effects go off from, as from itself (`EffectCommon.origin`): Zed's\n * shadows, Orianna's ball, Syndra's spheres, Azir's soldiers. Each picked is the context's `origin` for the effect\n * (AB1), the caster staying who does it; `sendProxy` (`abilities/effects/proxy.ts`) moves one to\n * where it was aimed\n */\n\n/** Who put a unit down, where the ground objects pack says (`madeBy`): read by its id, so that this brings in none of the pack */\nconst MADE_BY = 'core.madeBy'\n\n/** Whether a unit is the caster's: put down by it, or, where nothing says who put it down, its owner's */\nfunction isOf(world: World, unit: Entity, caster: Entity): boolean {\n\tconst component = world.registry.component(MADE_BY)\n\tconst made = component && (unit.get(component) as { by: number } | undefined)\n\treturn made ? made.by === caster.id : unit.owner === caster.owner\n}\n\n/**\n * The units of the caster's an effect with a proxy origin goes off from (`ProxyOrigin`), in the order it goes off from\n * them: those of its type that are the caster's (put down by it: `madeBy`; or its owner's where nothing says who put one\n * down), within its `range` of the caster and `near` where it was aimed, and of those the ones it picks. The caster is\n * not among them (`ProxyOrigin.caster` says when it goes off from it too). For a game's own effect, and a screen\n *\n * @beta\n */\nexport function proxiesOf(context: Pick<EffectContext, 'world' | 'caster' | 'point'>, origin: ProxyOrigin): Entity[] {\n\tconst { world, caster, point } = context\n\tconst found: Entity[] = []\n\tconst candidates = origin.range === undefined ? world.units.values() : world.spatial.query(caster.pos.x, caster.pos.z, origin.range + 2)\n\tfor (const unit of candidates) {\n\t\tif (unit === caster || !unit.alive || unit.hidden || unit.def.id !== origin.proxy || !isOf(world, unit, caster)) continue\n\t\tif (origin.range !== undefined && hypot(unit.pos.x - caster.pos.x, unit.pos.z - caster.pos.z) > origin.range) continue\n\t\tif (origin.near !== undefined && hypot(unit.pos.x - point.x, unit.pos.z - point.z) > origin.near) continue\n\t\tfound.push(unit)\n\t}\n\t// in the order they came into the world, whatever order they were found in\n\tfound.sort((a, b) => a.id - b.id)\n\tswitch (origin.pick ?? 'nearest') {\n\t\tcase 'all':\n\t\t\treturn found\n\t\tcase 'newest':\n\t\t\treturn found.slice(-1)\n\t\tcase 'oldest':\n\t\t\treturn found.slice(0, 1)\n\t\tdefault: {\n\t\t\tlet best: Entity | undefined\n\t\t\tlet gap = Infinity\n\t\t\tfor (const unit of found) {\n\t\t\t\tconst d = hypot(unit.pos.x - point.x, unit.pos.z - point.z)\n\t\t\t\tif (d < gap) [best, gap] = [unit, d]\n\t\t\t}\n\t\t\treturn best ? [best] : []\n\t\t}\n\t}\n}\n\n/**\n * Runs an effect with a proxy origin (`EffectCommon.origin`): once from the caster where it says so, and once from each\n * proxy it picks, that one the `origin` (its place the `point` with `at: 'proxy'`, and the `target` with `target`)\n *\n * @internal\n */\nexport function fromProxies(context: EffectContext, effect: EffectDef, each: (context: EffectContext) => void): void {\n\tconst origin = effect.origin!\n\tconst picked = proxiesOf(context, origin)\n\tconst fromCaster = origin.caster === true || (origin.caster === 'otherwise' && !picked.length)\n\tconst atProxy = origin.at === 'proxy'\n\tif (fromCaster) each(atProxy ? { ...context, point: { x: context.caster.pos.x, z: context.caster.pos.z } } : context)\n\tfor (const proxy of picked) {\n\t\tif (!proxy.alive) continue\n\t\teach({\n\t\t\t...context,\n\t\t\torigin: proxy,\n\t\t\t...(atProxy && { point: { x: proxy.pos.x, z: proxy.pos.z } }),\n\t\t\t...(origin.target && { target: proxy })\n\t\t})\n\t}\n}\n"],"mappings":";;;AAcA,IAAM,UAAU;;AAGhB,SAAS,KAAK,OAAc,MAAc,QAAyB;CAClE,MAAM,YAAY,MAAM,SAAS,UAAU,OAAO;CAClD,MAAM,OAAO,aAAc,KAAK,IAAI,SAAS;CAC7C,OAAO,OAAO,KAAK,OAAO,OAAO,KAAK,KAAK,UAAU,OAAO;AAC7D;;;;;;;;;AAUA,SAAgB,UAAU,SAA4D,QAA+B;CACpH,MAAM,EAAE,OAAO,QAAQ,UAAU;CACjC,MAAM,QAAkB,CAAC;CACzB,MAAM,aAAa,OAAO,UAAU,KAAA,IAAY,MAAM,MAAM,OAAO,IAAI,MAAM,QAAQ,MAAM,OAAO,IAAI,GAAG,OAAO,IAAI,GAAG,OAAO,QAAQ,CAAC;CACvI,KAAK,MAAM,QAAQ,YAAY;EAC9B,IAAI,SAAS,UAAU,CAAC,KAAK,SAAS,KAAK,UAAU,KAAK,IAAI,OAAO,OAAO,SAAS,CAAC,KAAK,OAAO,MAAM,MAAM,GAAG;EACjH,IAAI,OAAO,UAAU,KAAA,KAAa,MAAM,KAAK,IAAI,IAAI,OAAO,IAAI,GAAG,KAAK,IAAI,IAAI,OAAO,IAAI,CAAC,IAAI,OAAO,OAAO;EAC9G,IAAI,OAAO,SAAS,KAAA,KAAa,MAAM,KAAK,IAAI,IAAI,MAAM,GAAG,KAAK,IAAI,IAAI,MAAM,CAAC,IAAI,OAAO,MAAM;EAClG,MAAM,KAAK,IAAI;CAChB;CAEA,MAAM,MAAM,GAAG,MAAM,EAAE,KAAK,EAAE,EAAE;CAChC,QAAQ,OAAO,QAAQ,WAAvB;EACC,KAAK,OACJ,OAAO;EACR,KAAK,UACJ,OAAO,MAAM,MAAM,EAAE;EACtB,KAAK,UACJ,OAAO,MAAM,MAAM,GAAG,CAAC;EACxB,SAAS;GACR,IAAI;GACJ,IAAI,MAAM;GACV,KAAK,MAAM,QAAQ,OAAO;IACzB,MAAM,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,GAAG,KAAK,IAAI,IAAI,MAAM,CAAC;IAC1D,IAAI,IAAI,KAAK,CAAC,MAAM,OAAO,CAAC,MAAM,CAAC;GACpC;GACA,OAAO,OAAO,CAAC,IAAI,IAAI,CAAC;EACzB;CACD;AACD;;;;;;;AAQA,SAAgB,YAAY,SAAwB,QAAmB,MAA8C;CACpH,MAAM,SAAS,OAAO;CACtB,MAAM,SAAS,UAAU,SAAS,MAAM;CACxC,MAAM,aAAa,OAAO,WAAW,QAAS,OAAO,WAAW,eAAe,CAAC,OAAO;CACvF,MAAM,UAAU,OAAO,OAAO;CAC9B,IAAI,YAAY,KAAK,UAAU;EAAE,GAAG;EAAS,OAAO;GAAE,GAAG,QAAQ,OAAO,IAAI;GAAG,GAAG,QAAQ,OAAO,IAAI;EAAE;CAAE,IAAI,OAAO;CACpH,KAAK,MAAM,SAAS,QAAQ;EAC3B,IAAI,CAAC,MAAM,OAAO;EAClB,KAAK;GACJ,GAAG;GACH,QAAQ;GACR,GAAI,WAAW,EAAE,OAAO;IAAE,GAAG,MAAM,IAAI;IAAG,GAAG,MAAM,IAAI;GAAE,EAAE;GAC3D,GAAI,OAAO,UAAU,EAAE,QAAQ,MAAM;EACtC,CAAC;CACF;AACD"}
@@ -0,0 +1,56 @@
1
+ import type { EntityKind, Layer, TargetOrder, UnitCondition } from './defs';
2
+ import { type Entity, type PlayerId } from './entity';
3
+ import type { Vec2 } from './math';
4
+ import type { World } from './world';
5
+ /**
6
+ * What a query of the world asks (`world.query`): each part it says must hold. What a `UnitCondition` says too (a buff,
7
+ * health under a share, a hero, tags, enemy or ally of `of`)
8
+ *
9
+ * @beta
10
+ */
11
+ export interface WorldQuery extends UnitCondition {
12
+ /** Around this point or unit: within `radius` of it, and what `nearest` and `farthest` sort by */
13
+ near?: Vec2 | Entity;
14
+ /** How far from `near` (to the edge of each, as an effect's radius reaches). Anywhere when left out */
15
+ radius?: number;
16
+ /** Only what is inside this area (`defineArea`, a region of the map) */
17
+ area?: string;
18
+ /** Whose eyes `is` (enemy or ally) looks with: the owner of `near`, where that is a unit, when left out */
19
+ of?: PlayerId;
20
+ /** Only what these players own */
21
+ owner?: PlayerId | readonly PlayerId[];
22
+ /** Only these unit types, by id */
23
+ type?: string | readonly string[];
24
+ /** Only these kinds of things (unit, building, resource…). Everything when left out */
25
+ kinds?: readonly EntityKind[];
26
+ /** Only what is there: on the ground or in the air. Both when left out */
27
+ layers?: readonly Layer[];
28
+ /** Only what this player's team sees now (fog, invisibility) */
29
+ visibleTo?: PlayerId;
30
+ /** Not these: the caster, the one already hit */
31
+ except?: Entity | readonly Entity[];
32
+ /** The dead as well (`true`), or the dead alone (`'only'`). The living alone when left out */
33
+ dead?: boolean | 'only';
34
+ /** What is out of the world for now as well (a worker in a mine, a unit in a transport). Left out when left out */
35
+ hidden?: boolean;
36
+ /** Code that says yes or no of each, after the rest: anything the parts above do not say */
37
+ where?: (entity: Entity, world: World) => boolean;
38
+ /** The order to give them in (`TargetOrder`), or a comparison. In the order they came into the world when left out */
39
+ sort?: TargetOrder | ((a: Entity, b: Entity) => number);
40
+ /** At most this many, the first of the order */
41
+ limit?: number;
42
+ }
43
+ /**
44
+ * Sorts what was found in an order (`TargetOrder`), in place, and gives it: ties by who came into the world first, so
45
+ * the same on every machine. `nearest` and `farthest` need the point they measure from
46
+ *
47
+ * @beta
48
+ */
49
+ export declare function sortTargets(world: World, found: Entity[], order: TargetOrder | ((a: Entity, b: Entity) => number), from?: Vec2): Entity[];
50
+ /**
51
+ * What in the world is all a query asks (`WorldQuery`), in its order, as many as it says: a new list. Throws for a
52
+ * query that asks `is` with no player to ask it of, or sorts by distance with no `near`
53
+ *
54
+ * @beta
55
+ */
56
+ export declare function queryWorld(world: World, query?: WorldQuery): Entity[];
package/dist/query.js ADDED
@@ -0,0 +1,88 @@
1
+ import { distanceToEdge } from "./entity.js";
2
+ import { unitMatches } from "./abilities/chance.js";
3
+ import { layerOf } from "./abilities/buffs.js";
4
+ //#region src/query.ts
5
+ /**
6
+ * Asking the world for what is in it by what it is (`world.query`): around a point or a unit, in an area, of whom, of
7
+ * which type, kind and layer, what it carries and how hurt it is, what a player sees, or code; sorted and cut to a few.
8
+ * What a game's code, an ability of its own and a trigger ask; an effect's `where` and `pick` ask the same of what it reaches
9
+ */
10
+ /** Where a query or a pick measures from */
11
+ var pointOf = (near) => "pos" in near ? near.pos : near;
12
+ var isEntity = (near) => !!near && "pos" in near;
13
+ var share = (entity) => entity.maxHealth > 0 ? entity.health / entity.maxHealth : 0;
14
+ /**
15
+ * Sorts what was found in an order (`TargetOrder`), in place, and gives it: ties by who came into the world first, so
16
+ * the same on every machine. `nearest` and `farthest` need the point they measure from
17
+ *
18
+ * @beta
19
+ */
20
+ function sortTargets(world, found, order, from) {
21
+ if (typeof order === "function") return found.sort((a, b) => order(a, b) || a.id - b.id);
22
+ if (order === "random") {
23
+ found.sort((a, b) => a.id - b.id);
24
+ for (let i = found.length - 1; i > 0; i--) {
25
+ const j = world.rng.int(0, i);
26
+ const swap = found[i];
27
+ found[i] = found[j];
28
+ found[j] = swap;
29
+ }
30
+ return found;
31
+ }
32
+ if (order === "nearest" || order === "farthest") {
33
+ if (!from) throw new Error(`Sorting by "${order}" needs a point to measure from (near)`);
34
+ const distance = new Map(found.map((entity) => [entity, distanceToEdge(from, entity)]));
35
+ const sign = order === "nearest" ? 1 : -1;
36
+ return found.sort((a, b) => sign * (distance.get(a) - distance.get(b)) || a.id - b.id);
37
+ }
38
+ const by = order === "lowestHealth" || order === "highestHealth" ? (entity) => entity.health : share;
39
+ const sign = order === "lowestHealth" || order === "lowestHealthShare" ? 1 : -1;
40
+ return found.sort((a, b) => sign * (by(a) - by(b)) || a.id - b.id);
41
+ }
42
+ /** What a query starts from: the fewest it can, the rest asked of each */
43
+ function source(world, query, from) {
44
+ if (from && query.radius !== void 0) return [...world.spatial.query(from.x, from.z, query.radius)];
45
+ if (query.area !== void 0) return world.areas.inside(query.area);
46
+ if (typeof query.owner === "number") return world.index.ownedBy(query.owner);
47
+ return world.entities.values();
48
+ }
49
+ /**
50
+ * What in the world is all a query asks (`WorldQuery`), in its order, as many as it says: a new list. Throws for a
51
+ * query that asks `is` with no player to ask it of, or sorts by distance with no `near`
52
+ *
53
+ * @beta
54
+ */
55
+ function queryWorld(world, query = {}) {
56
+ const from = query.near ? pointOf(query.near) : void 0;
57
+ const of = query.of ?? (isEntity(query.near) ? query.near.owner : void 0);
58
+ if (query.is !== void 0 && of === void 0) throw new Error(`A query that asks is: "${query.is}" needs a player to ask it of (of, or a unit as near)`);
59
+ const owners = query.owner === void 0 ? void 0 : typeof query.owner === "number" ? [query.owner] : query.owner;
60
+ const types = query.type === void 0 ? void 0 : typeof query.type === "string" ? [query.type] : query.type;
61
+ const except = query.except === void 0 ? void 0 : "pos" in query.except ? [query.except] : query.except;
62
+ const team = query.visibleTo !== void 0 ? world.player(query.visibleTo).team : void 0;
63
+ const radius = query.radius;
64
+ const found = [];
65
+ for (const entity of source(world, query, from)) {
66
+ if (query.dead === "only" ? entity.alive : !query.dead && !entity.alive) continue;
67
+ if (entity.hidden && !query.hidden) continue;
68
+ if (from && radius !== void 0 && distanceToEdge(from, entity) > radius) continue;
69
+ if (owners && !owners.includes(entity.owner)) continue;
70
+ if (types && !types.includes(entity.def.id)) continue;
71
+ if (query.kinds && !query.kinds.includes(entity.def.kind)) continue;
72
+ if (query.layers && !query.layers.includes(layerOf(world, entity))) continue;
73
+ if (query.area !== void 0 && from && radius !== void 0 && !world.areas.contains(query.area, entity)) continue;
74
+ if (except && except.includes(entity)) continue;
75
+ if (team !== void 0 && !world.isVisibleTo(entity, team)) continue;
76
+ if (!unitMatches(world, query, entity, of)) continue;
77
+ if (query.where && !query.where(entity, world)) continue;
78
+ found.push(entity);
79
+ }
80
+ if (query.sort !== void 0) sortTargets(world, found, query.sort, from);
81
+ else found.sort((a, b) => a.id - b.id);
82
+ if (query.limit !== void 0) found.length = Math.min(found.length, Math.max(0, Math.floor(query.limit)));
83
+ return found;
84
+ }
85
+ //#endregion
86
+ export { queryWorld, sortTargets };
87
+
88
+ //# sourceMappingURL=query.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query.js","names":[],"sources":["../src/query.ts"],"sourcesContent":["/**\n * Asking the world for what is in it by what it is (`world.query`): around a point or a unit, in an area, of whom, of\n * which type, kind and layer, what it carries and how hurt it is, what a player sees, or code; sorted and cut to a few.\n * What a game's code, an ability of its own and a trigger ask; an effect's `where` and `pick` ask the same of what it reaches\n */\nimport { unitMatches } from './abilities/chance'\nimport { layerOf } from './abilities/buffs'\nimport type { EntityKind, Layer, TargetOrder, UnitCondition } from './defs'\nimport { distanceToEdge, type Entity, type PlayerId } from './entity'\nimport type { Vec2 } from './math'\nimport type { World } from './world'\n\n/**\n * What a query of the world asks (`world.query`): each part it says must hold. What a `UnitCondition` says too (a buff,\n * health under a share, a hero, tags, enemy or ally of `of`)\n *\n * @beta\n */\nexport interface WorldQuery extends UnitCondition {\n\t/** Around this point or unit: within `radius` of it, and what `nearest` and `farthest` sort by */\n\tnear?: Vec2 | Entity\n\t/** How far from `near` (to the edge of each, as an effect's radius reaches). Anywhere when left out */\n\tradius?: number\n\t/** Only what is inside this area (`defineArea`, a region of the map) */\n\tarea?: string\n\t/** Whose eyes `is` (enemy or ally) looks with: the owner of `near`, where that is a unit, when left out */\n\tof?: PlayerId\n\t/** Only what these players own */\n\towner?: PlayerId | readonly PlayerId[]\n\t/** Only these unit types, by id */\n\ttype?: string | readonly string[]\n\t/** Only these kinds of things (unit, building, resource…). Everything when left out */\n\tkinds?: readonly EntityKind[]\n\t/** Only what is there: on the ground or in the air. Both when left out */\n\tlayers?: readonly Layer[]\n\t/** Only what this player's team sees now (fog, invisibility) */\n\tvisibleTo?: PlayerId\n\t/** Not these: the caster, the one already hit */\n\texcept?: Entity | readonly Entity[]\n\t/** The dead as well (`true`), or the dead alone (`'only'`). The living alone when left out */\n\tdead?: boolean | 'only'\n\t/** What is out of the world for now as well (a worker in a mine, a unit in a transport). Left out when left out */\n\thidden?: boolean\n\t/** Code that says yes or no of each, after the rest: anything the parts above do not say */\n\twhere?: (entity: Entity, world: World) => boolean\n\t/** The order to give them in (`TargetOrder`), or a comparison. In the order they came into the world when left out */\n\tsort?: TargetOrder | ((a: Entity, b: Entity) => number)\n\t/** At most this many, the first of the order */\n\tlimit?: number\n}\n\n/** Where a query or a pick measures from */\nconst pointOf = (near: Vec2 | Entity): Vec2 => ('pos' in near ? near.pos : near)\n\nconst isEntity = (near: Vec2 | Entity | undefined): near is Entity => !!near && 'pos' in near\n\nconst share = (entity: Entity): number => (entity.maxHealth > 0 ? entity.health / entity.maxHealth : 0)\n\n/**\n * Sorts what was found in an order (`TargetOrder`), in place, and gives it: ties by who came into the world first, so\n * the same on every machine. `nearest` and `farthest` need the point they measure from\n *\n * @beta\n */\nexport function sortTargets(world: World, found: Entity[], order: TargetOrder | ((a: Entity, b: Entity) => number), from?: Vec2): Entity[] {\n\tif (typeof order === 'function') return found.sort((a, b) => order(a, b) || a.id - b.id)\n\tif (order === 'random') {\n\t\tfound.sort((a, b) => a.id - b.id)\n\t\tfor (let i = found.length - 1; i > 0; i--) {\n\t\t\tconst j = world.rng.int(0, i)\n\t\t\tconst swap = found[i]\n\t\t\tfound[i] = found[j]\n\t\t\tfound[j] = swap\n\t\t}\n\t\treturn found\n\t}\n\tif (order === 'nearest' || order === 'farthest') {\n\t\tif (!from) throw new Error(`Sorting by \"${order}\" needs a point to measure from (near)`)\n\t\tconst distance = new Map(found.map((entity) => [entity, distanceToEdge(from, entity)]))\n\t\tconst sign = order === 'nearest' ? 1 : -1\n\t\treturn found.sort((a, b) => sign * (distance.get(a)! - distance.get(b)!) || a.id - b.id)\n\t}\n\tconst by: (entity: Entity) => number = order === 'lowestHealth' || order === 'highestHealth' ? (entity) => entity.health : share\n\tconst sign = order === 'lowestHealth' || order === 'lowestHealthShare' ? 1 : -1\n\treturn found.sort((a, b) => sign * (by(a) - by(b)) || a.id - b.id)\n}\n\n/** What a query starts from: the fewest it can, the rest asked of each */\nfunction source(world: World, query: WorldQuery, from: Vec2 | undefined): Iterable<Entity> {\n\t// a copy: code a query asks may itself ask what is near, which writes into the same list\n\tif (from && query.radius !== undefined) return [...world.spatial.query(from.x, from.z, query.radius)]\n\tif (query.area !== undefined) return world.areas.inside(query.area)\n\tif (typeof query.owner === 'number') return world.index.ownedBy(query.owner)\n\treturn world.entities.values()\n}\n\n/**\n * What in the world is all a query asks (`WorldQuery`), in its order, as many as it says: a new list. Throws for a\n * query that asks `is` with no player to ask it of, or sorts by distance with no `near`\n *\n * @beta\n */\nexport function queryWorld(world: World, query: WorldQuery = {}): Entity[] {\n\tconst from = query.near ? pointOf(query.near) : undefined\n\tconst of = query.of ?? (isEntity(query.near) ? query.near.owner : undefined)\n\tif (query.is !== undefined && of === undefined) throw new Error(`A query that asks is: \"${query.is}\" needs a player to ask it of (of, or a unit as near)`)\n\tconst owners = query.owner === undefined ? undefined : typeof query.owner === 'number' ? [query.owner] : query.owner\n\tconst types = query.type === undefined ? undefined : typeof query.type === 'string' ? [query.type] : query.type\n\tconst except = query.except === undefined ? undefined : 'pos' in query.except ? [query.except] : query.except\n\tconst team = query.visibleTo !== undefined ? world.player(query.visibleTo).team : undefined\n\tconst radius = query.radius\n\tconst found: Entity[] = []\n\tfor (const entity of source(world, query, from)) {\n\t\tif (query.dead === 'only' ? entity.alive : !query.dead && !entity.alive) continue\n\t\tif (entity.hidden && !query.hidden) continue\n\t\tif (from && radius !== undefined && distanceToEdge(from, entity) > radius) continue\n\t\tif (owners && !owners.includes(entity.owner)) continue\n\t\tif (types && !types.includes(entity.def.id)) continue\n\t\tif (query.kinds && !query.kinds.includes(entity.def.kind)) continue\n\t\tif (query.layers && !query.layers.includes(layerOf(world, entity))) continue\n\t\tif (query.area !== undefined && from && radius !== undefined && !world.areas.contains(query.area, entity)) continue\n\t\tif (except && except.includes(entity)) continue\n\t\tif (team !== undefined && !world.isVisibleTo(entity, team)) continue\n\t\tif (!unitMatches(world, query, entity, of)) continue\n\t\tif (query.where && !query.where(entity, world)) continue\n\t\tfound.push(entity)\n\t}\n\tif (query.sort !== undefined) sortTargets(world, found, query.sort, from)\n\telse found.sort((a, b) => a.id - b.id)\n\tif (query.limit !== undefined) found.length = Math.min(found.length, Math.max(0, Math.floor(query.limit)))\n\treturn found\n}\n"],"mappings":"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"}
package/dist/races.d.ts CHANGED
@@ -1,21 +1,22 @@
1
- import type { ResourceKind } from './defs';
1
+ import type { ResourceId } from './defs';
2
2
  import { type PlayerId } from './entity';
3
- import type { GameModule } from './game';
3
+ import type { Rules } from './game';
4
4
  import type { HookDef } from './hooks';
5
5
  import type { Player } from './player';
6
6
  import type { Registry } from './registry';
7
- import { type StartDef } from './start';
7
+ import { type StartingBase } from './start';
8
8
  import type { World } from './world';
9
9
  /**
10
10
  * A side a player can play, with a roster of its own: melee's humans and undead. Optional: a game that lists none
11
- * (`GameModule.races`) has no race anywhere, no choice of one in the lobby and nothing kept from anyone. A unit type or
11
+ * (`Rules.races`) has no race anywhere, no choice of one in the lobby and nothing kept from anyone. A unit type or
12
12
  * an upgrade of a race (`UnitTypeDef.race`, `UpgradeDef.race`) is only its players' to make; one of none, everyone's.
13
13
  * Each player has one (`raceOf`): chosen in the lobby (a seat setting the server offers by itself, `seatSettingsOf`),
14
14
  * given to the world as it is made (`PlayerInit.race`, `MapWorldOptions.races`), or changed by the rules (`setRace`)
15
15
  *
16
- * @beta
16
+ * @public
17
17
  */
18
18
  export interface RaceDef {
19
+ /** The race's id, shared by every game: referenced by `PlayerInit.race`, `UnitTypeDef.race` and `UpgradeDef.race` */
19
20
  id: string;
20
21
  /** What players are shown: in the lobby, on the scores */
21
22
  name: string;
@@ -32,13 +33,13 @@ export interface RaceDef {
32
33
  * What its players start with of each resource, by resource id, over what the game starts everyone with
33
34
  * (`ResourceDef.start`). Not for a player given resources of their own (`PlayerInit.resources`, a map's)
34
35
  */
35
- resources?: Partial<Record<ResourceKind, number>>;
36
+ resources?: Partial<Record<ResourceId, number>>;
36
37
  /**
37
- * What its players get at the start of a game on a map, in place of the game's (`GameModule.start`): its own hall and
38
- * workers, as data (`StartData`: what a race made in the Data panel has, `start.hall` and the rest editable there)
39
- * or as code (`StartCode`)
38
+ * What its players get at the start of a game on a map, in place of the game's (`Rules.startingBase`): its own hall and
39
+ * workers, as data (`StartingBaseData`: what a race made in the Data panel has, `start.hall` and the rest editable there)
40
+ * or as code (`StartingBaseCode`)
40
41
  */
41
- start?: StartDef;
42
+ startingBase?: StartingBase;
42
43
  /**
43
44
  * Run for each of its players once a world is made from a map, after everything the map puts down and the starts:
44
45
  * what its players begin with that is not a unit (a ground of its own around its halls, a state)
@@ -76,11 +77,11 @@ export type RaceHookDef = HookDef & {
76
77
  /** The player a hook's event is of (see `RaceHookDef`): undefined for one of nobody's */
77
78
  export declare function playerOfEvent(event: unknown): PlayerId | undefined;
78
79
  /** Each race's hook handlers, each to run only for what is of the race's players */
79
- export declare function raceHooks(game: GameModule): HookDef[];
80
+ export declare function raceHooks(game: Rules): HookDef[];
80
81
  /**
81
- * A race, as the game lists it (`GameModule.races`)
82
+ * A race, as the game lists it (`Rules.races`)
82
83
  *
83
- * @beta
84
+ * @public
84
85
  */
85
86
  export declare const defineRace: (def: RaceDef) => RaceDef;
86
87
  /**
@@ -125,7 +126,7 @@ export declare function settleRaces(players: Iterable<Player>, registry: Registr
125
126
  *
126
127
  * @beta
127
128
  */
128
- export declare function checkRaces(game: GameModule): void;
129
+ export declare function checkRaces(game: Rules): void;
129
130
  /**
130
131
  * Gives each player of a world just made what their race starts them with (`RaceDef.resources`), but those given
131
132
  * resources of their own
package/dist/races.js ADDED
@@ -0,0 +1,172 @@
1
+ import { startIds } from "./start.js";
2
+ import { Entity } from "./entity.js";
3
+ import { availableTo } from "./shared.js";
4
+ import { nearestId } from "./nearest.js";
5
+ //#region src/races.ts
6
+ /** Fields of a hook's event that are an entity, in the order whose an event is looked for */
7
+ var ACTORS = [
8
+ "entity",
9
+ "caster",
10
+ "attacker",
11
+ "worker",
12
+ "buyer",
13
+ "hero",
14
+ "producer",
15
+ "source",
16
+ "target"
17
+ ];
18
+ /** The player a hook's event is of (see `RaceHookDef`): undefined for one of nobody's */
19
+ function playerOfEvent(event) {
20
+ if (typeof event !== "object" || event === null) return void 0;
21
+ const fields = event;
22
+ if (typeof fields.player === "number") return fields.player;
23
+ for (const key of ACTORS) {
24
+ const actor = fields[key];
25
+ if (actor instanceof Entity) return actor.owner;
26
+ }
27
+ }
28
+ /** Each race's hook handlers, each to run only for what is of the race's players */
29
+ function raceHooks(game) {
30
+ const hooks = [];
31
+ for (const race of game.races ?? []) {
32
+ if (race.inherits?.hooks === false) continue;
33
+ for (const { of, ...hook } of race.hooks ?? []) {
34
+ const whose = of ?? playerOfEvent;
35
+ hooks.push({
36
+ ...hook,
37
+ run(world, event) {
38
+ const player = whose(event);
39
+ if (player !== void 0 && world.players.get(player)?.race === race.id) hook.run(world, event);
40
+ }
41
+ });
42
+ }
43
+ }
44
+ return hooks;
45
+ }
46
+ /**
47
+ * A race, as the game lists it (`Rules.races`)
48
+ *
49
+ * @public
50
+ */
51
+ var defineRace = (def) => def;
52
+ /**
53
+ * What is chosen for a seat or a player to have a race drawn for them as the game starts, from the world's own
54
+ * numbers: the same on every machine
55
+ *
56
+ * @beta
57
+ */
58
+ var RANDOM_RACE = "random";
59
+ /**
60
+ * The race a player plays: none in a game without races, and none for the neutral players and the creeps
61
+ *
62
+ * @beta
63
+ */
64
+ var raceOf = (world, player) => world.players.get(player)?.race;
65
+ /**
66
+ * Makes a player play another race from now on: a campaign's mission, a game's own way of choosing. What they have
67
+ * stays theirs; what they may make is the new race's. Throws for a race the game does not have, or for the neutral
68
+ * players and the creeps
69
+ *
70
+ * @beta
71
+ */
72
+ function setRace(world, player, race) {
73
+ const who = world.player(player);
74
+ if (who.neutral || who.creeps) throw new Error(`Player ${player} plays no race: the neutral players and the creeps have none`);
75
+ if (!world.registry.races.has(race)) throw new Error(`"${race}" is not a race of the game (${raceList(world.registry)})`);
76
+ who.race = race;
77
+ }
78
+ /**
79
+ * Whether a player may make a unit type or research an upgrade at all, as their race goes (`UnitTypeDef.race`), and
80
+ * then as the game's `available` hook says: what they may not is not on their buttons, and an order for it is
81
+ * refused. What it requires is another question (`unlocked`), asked only of what is available
82
+ *
83
+ * @beta
84
+ */
85
+ function isAvailable(world, player, kind, id) {
86
+ const { registry } = world;
87
+ if (kind === "unit" ? !registry.units.has(id) : !registry.upgrades.has(id)) return false;
88
+ const def = kind === "unit" ? registry.unit(id) : registry.upgrade(id);
89
+ const race = raceOf(world, player);
90
+ const available = availableTo(def, race);
91
+ if (!world.hooks.has("available")) return available;
92
+ return world.hooks.run("available", {
93
+ player,
94
+ kind,
95
+ id,
96
+ race,
97
+ available
98
+ }).available;
99
+ }
100
+ /**
101
+ * The races players get as a world is made: what each was given, one drawn for those given `random`, and the game's
102
+ * first for a player given none. Nobody's in a game without races. Throws for a race the game does not have
103
+ */
104
+ function settleRaces(players, registry, draw, among) {
105
+ const races = registry.races.all();
106
+ const drawn = races.filter((race) => among?.includes(race.id));
107
+ const pool = drawn.length ? drawn : races;
108
+ for (const player of players) {
109
+ const given = player.race;
110
+ if (player.neutral || player.creeps || !races.length) {
111
+ if (given !== void 0 && given !== "random" && !registry.races.has(given)) throw new Error(`Player ${player.id} is given the race "${given}", and ${races.length ? "plays none" : "the game has no races"}`);
112
+ player.race = void 0;
113
+ continue;
114
+ }
115
+ if (given === "random") player.race = pool[draw(pool.length)].id;
116
+ else if (given === void 0) player.race = races[0].id;
117
+ else if (!registry.races.has(given)) throw new Error(`Player ${player.id} is given the race "${given}", which is not a race of the game (${raceList(registry)})`);
118
+ }
119
+ }
120
+ /**
121
+ * Throws for races that cannot be: one there twice, one called `random`, a unit type or upgrade of a race the game does
122
+ * not have, a resource a race starts with that the game has not, or a start as data (a race's, or the game's) that names
123
+ * a unit type the game has not, saying which was meant where one is close. Run as a registry is made (`createRegistry`,
124
+ * every world's); for a game's own tests
125
+ *
126
+ * @beta
127
+ */
128
+ function checkRaces(game) {
129
+ const known = /* @__PURE__ */ new Set();
130
+ for (const race of game.races ?? []) {
131
+ if (race.id === "random") throw new Error(`A race cannot be called "${RANDOM_RACE}": it is what is chosen for one drawn as the game starts`);
132
+ if (known.has(race.id)) throw new Error(`The race "${race.id}" is there twice`);
133
+ known.add(race.id);
134
+ }
135
+ const check = (what, race) => {
136
+ if (race !== void 0 && !known.has(race)) throw new Error(`${what} is of the race "${race}", which ${known.size ? `is not a race of the game (${[...known].join(", ")})` : "the game does not have: it has no races"}`);
137
+ };
138
+ for (const unit of game.units) check(`Unit type "${unit.id}"`, unit.race);
139
+ for (const upgrade of game.upgrades ?? []) check(`Upgrade "${upgrade.id}"`, upgrade.race);
140
+ const resources = new Set((game.resources ?? []).map((resource) => resource.id));
141
+ for (const race of game.races ?? []) for (const kind in race.resources) if (!resources.has(kind)) throw new Error(`The race "${race.id}" starts with "${kind}", which is not a resource of the game`);
142
+ const units = new Set(game.units.map((unit) => unit.id));
143
+ const starts = [{
144
+ whose: "The game",
145
+ start: game.startingBase
146
+ }, ...(game.races ?? []).map((race) => ({
147
+ whose: `The race "${race.id}"`,
148
+ start: race.startingBase
149
+ }))];
150
+ for (const { whose, start } of starts) for (const { where, id } of startIds(start)) {
151
+ if (units.has(id)) continue;
152
+ const meant = nearestId(id, units);
153
+ throw new Error(`${whose} starts with "${id}" (${where}), which is no unit type of the game${meant ? `. Did you mean "${meant}"?` : ""}`);
154
+ }
155
+ }
156
+ /**
157
+ * Gives each player of a world just made what their race starts them with (`RaceDef.resources`), but those given
158
+ * resources of their own
159
+ */
160
+ function raceResources(world, players) {
161
+ for (const init of players) {
162
+ const player = world.players.get(init.id);
163
+ if (!player?.race || init.resources) continue;
164
+ const own = world.registry.race(player.race).resources;
165
+ for (const kind in own) player.resources[kind] = own[kind];
166
+ }
167
+ }
168
+ var raceList = (registry) => registry.races.size ? registry.races.keys().join(", ") : "it has none";
169
+ //#endregion
170
+ export { RANDOM_RACE, checkRaces, defineRace, isAvailable, playerOfEvent, raceHooks, raceOf, raceResources, setRace, settleRaces };
171
+
172
+ //# sourceMappingURL=races.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"races.js","names":[],"sources":["../src/races.ts"],"sourcesContent":["import type { ResourceId, UnitTypeDef, UpgradeDef } from './defs'\nimport { Entity, type PlayerId } from './entity'\nimport type { Rules } from './game'\nimport type { HookDef } from './hooks'\nimport type { Player } from './player'\nimport type { Registry } from './registry'\nimport { nearestId } from './nearest'\nimport { availableTo } from './shared'\nimport { type StartingBase, startIds } from './start'\nimport type { World } from './world'\n\n/**\n * A side a player can play, with a roster of its own: melee's humans and undead. Optional: a game that lists none\n * (`Rules.races`) has no race anywhere, no choice of one in the lobby and nothing kept from anyone. A unit type or\n * an upgrade of a race (`UnitTypeDef.race`, `UpgradeDef.race`) is only its players' to make; one of none, everyone's.\n * Each player has one (`raceOf`): chosen in the lobby (a seat setting the server offers by itself, `seatSettingsOf`),\n * given to the world as it is made (`PlayerInit.race`, `MapWorldOptions.races`), or changed by the rules (`setRace`)\n *\n * @public\n */\nexport interface RaceDef {\n\t/** The race's id, shared by every game: referenced by `PlayerInit.race`, `UnitTypeDef.race` and `UpgradeDef.race` */\n\tid: string\n\t/** What players are shown: in the lobby, on the scores */\n\tname: string\n\t/**\n\t * The definition this one is a copy of, made from the data (`copyOf` in a `data.json`, the editor's Copy as new):\n\t * what it is drawn, heard and pictured as where the game gives it no look of its own\n\t */\n\tbasedOn?: string\n\t/** What it is like, for a tooltip */\n\tdescription?: string\n\t/** Its picture, by the id the game's view knows icons by */\n\ticon?: string\n\t/**\n\t * What its players start with of each resource, by resource id, over what the game starts everyone with\n\t * (`ResourceDef.start`). Not for a player given resources of their own (`PlayerInit.resources`, a map's)\n\t */\n\tresources?: Partial<Record<ResourceId, number>>\n\t/**\n\t * What its players get at the start of a game on a map, in place of the game's (`Rules.startingBase`): its own hall and\n\t * workers, as data (`StartingBaseData`: what a race made in the Data panel has, `start.hall` and the rest editable there)\n\t * or as code (`StartingBaseCode`)\n\t */\n\tstartingBase?: StartingBase\n\t/**\n\t * Run for each of its players once a world is made from a map, after everything the map puts down and the starts:\n\t * what its players begin with that is not a unit (a ground of its own around its halls, a state)\n\t */\n\tonStart?(world: World, player: PlayerId): void\n\t/**\n\t * Hook handlers of its own, run only for what is of its players (`RaceHookDef`): how it gathers, where it may build.\n\t * With these a race plays differently with no test of the race in the game's code\n\t */\n\thooks?: RaceHookDef[]\n\t/**\n\t * What a race made as a copy of another (`basedOn`: `copyOf` in a `data.json`, the editor's Copy as new) keeps of the\n\t * original's code: its `hooks` and its `onStart`, each kept unless said `false` here. A copy keeps both when this is\n\t * left out, so a race copied from the undead gathers at a cursed mine and builds on blight as they do; one that\n\t * says `hooks: false` plays by the game's rules alone. Its `start` is data, the copy's own to change; a `start` in\n\t * code is kept whole. Two toggles in the Data panel, on a copy\n\t */\n\tinherits?: { hooks?: boolean; onStart?: boolean }\n}\n\n/**\n * A hook handler of a race (`RaceDef.hooks`): run only where the event is of one of the race's players. Whose an event\n * is, is `of(event)` where it is given, or else its `player`, or else the owner of the first there is of its `entity`,\n * `caster`, `attacker`, `worker`, `buyer`, `hero`, `producer`, `source`, `target`: the one doing it before the one it\n * is done to (a damage is its source's)\n *\n * @beta\n */\nexport type RaceHookDef = HookDef & {\n\t/** The player an event is of, where it is not the one found by default */\n\tof?: (event: any) => PlayerId | undefined\n}\n\n/** Fields of a hook's event that are an entity, in the order whose an event is looked for */\nconst ACTORS = ['entity', 'caster', 'attacker', 'worker', 'buyer', 'hero', 'producer', 'source', 'target'] as const\n\n/** The player a hook's event is of (see `RaceHookDef`): undefined for one of nobody's */\nexport function playerOfEvent(event: unknown): PlayerId | undefined {\n\tif (typeof event !== 'object' || event === null) return undefined\n\tconst fields = event as Record<string, unknown>\n\tif (typeof fields.player === 'number') return fields.player\n\tfor (const key of ACTORS) {\n\t\tconst actor = fields[key]\n\t\tif (actor instanceof Entity) return actor.owner\n\t}\n\treturn undefined\n}\n\n/** Each race's hook handlers, each to run only for what is of the race's players */\nexport function raceHooks(game: Rules): HookDef[] {\n\tconst hooks: HookDef[] = []\n\tfor (const race of game.races ?? []) {\n\t\t// a copy that says it keeps none of the original's hooks\n\t\tif (race.inherits?.hooks === false) continue\n\t\tfor (const { of, ...hook } of race.hooks ?? []) {\n\t\t\tconst whose = of ?? playerOfEvent\n\t\t\thooks.push({\n\t\t\t\t...hook,\n\t\t\t\trun(world, event) {\n\t\t\t\t\tconst player = whose(event)\n\t\t\t\t\tif (player !== undefined && world.players.get(player)?.race === race.id) hook.run(world, event)\n\t\t\t\t}\n\t\t\t})\n\t\t}\n\t}\n\treturn hooks\n}\n\n/**\n * A race, as the game lists it (`Rules.races`)\n *\n * @public\n */\nexport const defineRace = (def: RaceDef): RaceDef => def\n\n/**\n * What is chosen for a seat or a player to have a race drawn for them as the game starts, from the world's own\n * numbers: the same on every machine\n *\n * @beta\n */\nexport const RANDOM_RACE = 'random'\n\n/**\n * The race a player plays: none in a game without races, and none for the neutral players and the creeps\n *\n * @beta\n */\nexport const raceOf = (world: World, player: PlayerId): string | undefined => world.players.get(player)?.race\n\n/**\n * Makes a player play another race from now on: a campaign's mission, a game's own way of choosing. What they have\n * stays theirs; what they may make is the new race's. Throws for a race the game does not have, or for the neutral\n * players and the creeps\n *\n * @beta\n */\nexport function setRace(world: World, player: PlayerId, race: string): void {\n\tconst who = world.player(player)\n\tif (who.neutral || who.creeps) throw new Error(`Player ${player} plays no race: the neutral players and the creeps have none`)\n\tif (!world.registry.races.has(race)) throw new Error(`\"${race}\" is not a race of the game (${raceList(world.registry)})`)\n\twho.race = race\n}\n\n/**\n * Whether a player may make a unit type or research an upgrade at all, as their race goes (`UnitTypeDef.race`), and\n * then as the game's `available` hook says: what they may not is not on their buttons, and an order for it is\n * refused. What it requires is another question (`unlocked`), asked only of what is available\n *\n * @beta\n */\nexport function isAvailable(world: World, player: PlayerId, kind: 'unit' | 'upgrade', id: string): boolean {\n\tconst { registry } = world\n\tif (kind === 'unit' ? !registry.units.has(id) : !registry.upgrades.has(id)) return false\n\tconst def: UnitTypeDef | UpgradeDef = kind === 'unit' ? registry.unit(id) : registry.upgrade(id)\n\tconst race = raceOf(world, player)\n\tconst available = availableTo(def, race)\n\tif (!world.hooks.has('available')) return available\n\treturn world.hooks.run('available', { player, kind, id, race, available }).available\n}\n\n/**\n * The races players get as a world is made: what each was given, one drawn for those given `random`, and the game's\n * first for a player given none. Nobody's in a game without races. Throws for a race the game does not have\n */\nexport function settleRaces(players: Iterable<Player>, registry: Registry, draw: (count: number) => number, among?: readonly string[]): void {\n\tconst races = registry.races.all()\n\t// what random draws from: those of the game named, all where none are\n\tconst drawn = races.filter((race) => among?.includes(race.id))\n\tconst pool = drawn.length ? drawn : races\n\tfor (const player of players) {\n\t\tconst given = player.race\n\t\tif (player.neutral || player.creeps || !races.length) {\n\t\t\tif (given !== undefined && given !== RANDOM_RACE && !registry.races.has(given))\n\t\t\t\tthrow new Error(`Player ${player.id} is given the race \"${given}\", and ${races.length ? 'plays none' : 'the game has no races'}`)\n\t\t\tplayer.race = undefined\n\t\t\tcontinue\n\t\t}\n\t\tif (given === RANDOM_RACE) player.race = pool[draw(pool.length)].id\n\t\telse if (given === undefined) player.race = races[0].id\n\t\telse if (!registry.races.has(given))\n\t\t\tthrow new Error(`Player ${player.id} is given the race \"${given}\", which is not a race of the game (${raceList(registry)})`)\n\t}\n}\n\n/**\n * Throws for races that cannot be: one there twice, one called `random`, a unit type or upgrade of a race the game does\n * not have, a resource a race starts with that the game has not, or a start as data (a race's, or the game's) that names\n * a unit type the game has not, saying which was meant where one is close. Run as a registry is made (`createRegistry`,\n * every world's); for a game's own tests\n *\n * @beta\n */\nexport function checkRaces(game: Rules): void {\n\tconst known = new Set<string>()\n\tfor (const race of game.races ?? []) {\n\t\tif (race.id === RANDOM_RACE) throw new Error(`A race cannot be called \"${RANDOM_RACE}\": it is what is chosen for one drawn as the game starts`)\n\t\tif (known.has(race.id)) throw new Error(`The race \"${race.id}\" is there twice`)\n\t\tknown.add(race.id)\n\t}\n\tconst check = (what: string, race: string | undefined) => {\n\t\tif (race !== undefined && !known.has(race))\n\t\t\tthrow new Error(\n\t\t\t\t`${what} is of the race \"${race}\", which ${known.size ? `is not a race of the game (${[...known].join(', ')})` : 'the game does not have: it has no races'}`\n\t\t\t)\n\t}\n\tfor (const unit of game.units) check(`Unit type \"${unit.id}\"`, unit.race)\n\tfor (const upgrade of game.upgrades ?? []) check(`Upgrade \"${upgrade.id}\"`, upgrade.race)\n\tconst resources = new Set((game.resources ?? []).map((resource) => resource.id))\n\tfor (const race of game.races ?? []) {\n\t\tfor (const kind in race.resources)\n\t\t\tif (!resources.has(kind)) throw new Error(`The race \"${race.id}\" starts with \"${kind}\", which is not a resource of the game`)\n\t}\n\t// a start as data names unit types the game has to have\n\tconst units = new Set(game.units.map((unit) => unit.id))\n\tconst starts = [\n\t\t{ whose: 'The game', start: game.startingBase },\n\t\t...(game.races ?? []).map((race) => ({ whose: `The race \"${race.id}\"`, start: race.startingBase }))\n\t]\n\tfor (const { whose, start } of starts) {\n\t\tfor (const { where, id } of startIds(start)) {\n\t\t\tif (units.has(id)) continue\n\t\t\tconst meant = nearestId(id, units)\n\t\t\tthrow new Error(`${whose} starts with \"${id}\" (${where}), which is no unit type of the game${meant ? `. Did you mean \"${meant}\"?` : ''}`)\n\t\t}\n\t}\n}\n\n/**\n * Gives each player of a world just made what their race starts them with (`RaceDef.resources`), but those given\n * resources of their own\n */\nexport function raceResources(world: World, players: readonly { id: PlayerId; resources?: unknown }[]): void {\n\tfor (const init of players) {\n\t\tconst player = world.players.get(init.id)\n\t\tif (!player?.race || init.resources) continue\n\t\tconst own = world.registry.race(player.race).resources\n\t\tfor (const kind in own) player.resources[kind] = own[kind]!\n\t}\n}\n\nconst raceList = (registry: Registry): string => (registry.races.size ? registry.races.keys().join(', ') : 'it has none')\n"],"mappings":"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"}
@@ -0,0 +1,91 @@
1
+ import { defineComponent } from "./components.js";
2
+ import { defineListener } from "./events.js";
3
+ import { entityDied } from "./engineEvents.js";
4
+ import { createItem, dropOnGround } from "./items.js";
5
+ //#region src/randomGroups.ts
6
+ /** One of a list by weight, or nothing for an empty list */
7
+ function byWeight(list, rng) {
8
+ const total = list.reduce((sum, entry) => sum + Math.max(entry.weight, 0), 0);
9
+ if (total <= 0) return void 0;
10
+ let at = rng.next() * total;
11
+ for (const entry of list) {
12
+ at -= Math.max(entry.weight, 0);
13
+ if (at < 0) return entry;
14
+ }
15
+ return list[list.length - 1];
16
+ }
17
+ /**
18
+ * The unit types a random group can be drawn from, as the game has them
19
+ *
20
+ * @internal
21
+ */
22
+ function groupChoices(group, registry) {
23
+ if (group.choices?.length) return group.choices.filter((choice) => registry.units.has(choice.type) && choice.weight > 0);
24
+ if (group.level === void 0) return [];
25
+ return registry.units.all().filter((def) => def.kind === "unit" && def.bounty && (def.level ?? 1) === group.level).map((def) => ({
26
+ type: def.id,
27
+ weight: 1
28
+ }));
29
+ }
30
+ /**
31
+ * A unit type drawn from a random group, as the game starts: nothing when it has none to draw from
32
+ *
33
+ * @internal
34
+ */
35
+ var drawFromGroup = (group, registry, rng) => byWeight(groupChoices(group, registry), rng)?.type;
36
+ /**
37
+ * An item drawn from a table as something dies: nothing when it drops nothing this time
38
+ *
39
+ * @internal
40
+ */
41
+ function drawFromTable(table, registry, rng) {
42
+ if (table.chance !== void 0 && rng.next() >= table.chance) return void 0;
43
+ return byWeight(tableItems(table, registry), rng)?.item;
44
+ }
45
+ /**
46
+ * The items a table draws from, each with its weight: an item by id as it is, a line of a level or a class its
47
+ * weight shared among the game's items that match (in the game's order: the same draw from the same seed)
48
+ *
49
+ * @internal
50
+ */
51
+ function tableItems(table, registry) {
52
+ const out = [];
53
+ for (const entry of table.items) {
54
+ if (entry.item !== void 0) {
55
+ if (registry.items.has(entry.item)) out.push({
56
+ item: entry.item,
57
+ weight: entry.weight
58
+ });
59
+ continue;
60
+ }
61
+ if (entry.level === void 0 && entry.class === void 0) continue;
62
+ const matching = registry.items.all().filter((def) => (entry.level === void 0 || (def.level ?? 1) === entry.level) && (entry.class === void 0 || def.class === entry.class));
63
+ for (const def of matching) out.push({
64
+ item: def.id,
65
+ weight: entry.weight / matching.length
66
+ });
67
+ }
68
+ return out;
69
+ }
70
+ /**
71
+ * The item table a thing placed on a map drops from when it dies (`MapObject.drops`), by name
72
+ *
73
+ * @internal
74
+ */
75
+ var mapDrops = defineComponent({ id: "core.mapDrops" });
76
+ /** What a thing placed on a map drops when it dies: one item from its table, on the ground where it fell */
77
+ var dropFromTable = defineListener({
78
+ id: "core.dropFromTable",
79
+ event: entityDied,
80
+ run(world, { entity }) {
81
+ const name = entity.get(mapDrops);
82
+ if (!name) return;
83
+ const table = world.map.itemTable(name);
84
+ const item = table && drawFromTable(table, world.registry, world.rng);
85
+ if (item) dropOnGround(world, createItem(world, item), entity.pos);
86
+ }
87
+ });
88
+ //#endregion
89
+ export { drawFromGroup, drawFromTable, dropFromTable, groupChoices, mapDrops, tableItems };
90
+
91
+ //# sourceMappingURL=randomGroups.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"randomGroups.js","names":[],"sources":["../src/randomGroups.ts"],"sourcesContent":["import { entityDied } from '#engine/engineEvents'\nimport { defineComponent } from './components'\nimport { defineListener } from './events'\nimport { createItem, dropOnGround } from './items'\nimport type { MapItemTable, MapRandomGroup } from './map'\nimport type { Registry } from './registry'\nimport type { Rng } from './rng'\n\n/** One of a list by weight, or nothing for an empty list */\nfunction byWeight<T extends { weight: number }>(list: readonly T[], rng: Rng): T | undefined {\n\tconst total = list.reduce((sum, entry) => sum + Math.max(entry.weight, 0), 0)\n\tif (total <= 0) return undefined\n\tlet at = rng.next() * total\n\tfor (const entry of list) {\n\t\tat -= Math.max(entry.weight, 0)\n\t\tif (at < 0) return entry\n\t}\n\treturn list[list.length - 1]\n}\n\n/**\n * The unit types a random group can be drawn from, as the game has them\n *\n * @internal\n */\nexport function groupChoices(group: MapRandomGroup, registry: Registry): { type: string; weight: number }[] {\n\tif (group.choices?.length) return group.choices.filter((choice) => registry.units.has(choice.type) && choice.weight > 0)\n\tif (group.level === undefined) return []\n\t// any creep of the level: a unit type with a bounty\n\treturn registry.units\n\t\t.all()\n\t\t.filter((def) => def.kind === 'unit' && def.bounty && (def.level ?? 1) === group.level)\n\t\t.map((def) => ({ type: def.id, weight: 1 }))\n}\n\n/**\n * A unit type drawn from a random group, as the game starts: nothing when it has none to draw from\n *\n * @internal\n */\nexport const drawFromGroup = (group: MapRandomGroup, registry: Registry, rng: Rng): string | undefined =>\n\tbyWeight(groupChoices(group, registry), rng)?.type\n\n/**\n * An item drawn from a table as something dies: nothing when it drops nothing this time\n *\n * @internal\n */\nexport function drawFromTable(table: MapItemTable, registry: Registry, rng: Rng): string | undefined {\n\tif (table.chance !== undefined && rng.next() >= table.chance) return undefined\n\treturn byWeight(tableItems(table, registry), rng)?.item\n}\n\n/**\n * The items a table draws from, each with its weight: an item by id as it is, a line of a level or a class its\n * weight shared among the game's items that match (in the game's order: the same draw from the same seed)\n *\n * @internal\n */\nexport function tableItems(table: MapItemTable, registry: Registry): { item: string; weight: number }[] {\n\tconst out: { item: string; weight: number }[] = []\n\tfor (const entry of table.items) {\n\t\tif (entry.item !== undefined) {\n\t\t\tif (registry.items.has(entry.item)) out.push({ item: entry.item, weight: entry.weight })\n\t\t\tcontinue\n\t\t}\n\t\tif (entry.level === undefined && entry.class === undefined) continue\n\t\tconst matching = registry.items\n\t\t\t.all()\n\t\t\t.filter((def) => (entry.level === undefined || (def.level ?? 1) === entry.level) && (entry.class === undefined || def.class === entry.class))\n\t\tfor (const def of matching) out.push({ item: def.id, weight: entry.weight / matching.length })\n\t}\n\treturn out\n}\n\n/**\n * The item table a thing placed on a map drops from when it dies (`MapObject.drops`), by name\n *\n * @internal\n */\nexport const mapDrops = defineComponent<string>({ id: 'core.mapDrops' })\n\n/** What a thing placed on a map drops when it dies: one item from its table, on the ground where it fell */\nexport const dropFromTable = defineListener({\n\tid: 'core.dropFromTable',\n\tevent: entityDied,\n\trun(world, { entity }) {\n\t\tconst name = entity.get(mapDrops)\n\t\tif (!name) return\n\t\tconst table = world.map.itemTable(name)\n\t\tconst item = table && drawFromTable(table, world.registry, world.rng)\n\t\tif (item) dropOnGround(world, createItem(world, item), entity.pos)\n\t}\n})\n"],"mappings":";;;;;;AASA,SAAS,SAAuC,MAAoB,KAAyB;CAC5F,MAAM,QAAQ,KAAK,QAAQ,KAAK,UAAU,MAAM,KAAK,IAAI,MAAM,QAAQ,CAAC,GAAG,CAAC;CAC5E,IAAI,SAAS,GAAG,OAAO,KAAA;CACvB,IAAI,KAAK,IAAI,KAAK,IAAI;CACtB,KAAK,MAAM,SAAS,MAAM;EACzB,MAAM,KAAK,IAAI,MAAM,QAAQ,CAAC;EAC9B,IAAI,KAAK,GAAG,OAAO;CACpB;CACA,OAAO,KAAK,KAAK,SAAS;AAC3B;;;;;;AAOA,SAAgB,aAAa,OAAuB,UAAwD;CAC3G,IAAI,MAAM,SAAS,QAAQ,OAAO,MAAM,QAAQ,QAAQ,WAAW,SAAS,MAAM,IAAI,OAAO,IAAI,KAAK,OAAO,SAAS,CAAC;CACvH,IAAI,MAAM,UAAU,KAAA,GAAW,OAAO,CAAC;CAEvC,OAAO,SAAS,MACd,IAAI,CAAC,CACL,QAAQ,QAAQ,IAAI,SAAS,UAAU,IAAI,WAAW,IAAI,SAAS,OAAO,MAAM,KAAK,CAAC,CACtF,KAAK,SAAS;EAAE,MAAM,IAAI;EAAI,QAAQ;CAAE,EAAE;AAC7C;;;;;;AAOA,IAAa,iBAAiB,OAAuB,UAAoB,QACxE,SAAS,aAAa,OAAO,QAAQ,GAAG,GAAG,CAAC,EAAE;;;;;;AAO/C,SAAgB,cAAc,OAAqB,UAAoB,KAA8B;CACpG,IAAI,MAAM,WAAW,KAAA,KAAa,IAAI,KAAK,KAAK,MAAM,QAAQ,OAAO,KAAA;CACrE,OAAO,SAAS,WAAW,OAAO,QAAQ,GAAG,GAAG,CAAC,EAAE;AACpD;;;;;;;AAQA,SAAgB,WAAW,OAAqB,UAAwD;CACvG,MAAM,MAA0C,CAAC;CACjD,KAAK,MAAM,SAAS,MAAM,OAAO;EAChC,IAAI,MAAM,SAAS,KAAA,GAAW;GAC7B,IAAI,SAAS,MAAM,IAAI,MAAM,IAAI,GAAG,IAAI,KAAK;IAAE,MAAM,MAAM;IAAM,QAAQ,MAAM;GAAO,CAAC;GACvF;EACD;EACA,IAAI,MAAM,UAAU,KAAA,KAAa,MAAM,UAAU,KAAA,GAAW;EAC5D,MAAM,WAAW,SAAS,MACxB,IAAI,CAAC,CACL,QAAQ,SAAS,MAAM,UAAU,KAAA,MAAc,IAAI,SAAS,OAAO,MAAM,WAAW,MAAM,UAAU,KAAA,KAAa,IAAI,UAAU,MAAM,MAAM;EAC7I,KAAK,MAAM,OAAO,UAAU,IAAI,KAAK;GAAE,MAAM,IAAI;GAAI,QAAQ,MAAM,SAAS,SAAS;EAAO,CAAC;CAC9F;CACA,OAAO;AACR;;;;;;AAOA,IAAa,WAAW,gBAAwB,EAAE,IAAI,gBAAgB,CAAC;;AAGvE,IAAa,gBAAgB,eAAe;CAC3C,IAAI;CACJ,OAAO;CACP,IAAI,OAAO,EAAE,UAAU;EACtB,MAAM,OAAO,OAAO,IAAI,QAAQ;EAChC,IAAI,CAAC,MAAM;EACX,MAAM,QAAQ,MAAM,IAAI,UAAU,IAAI;EACtC,MAAM,OAAO,SAAS,cAAc,OAAO,MAAM,UAAU,MAAM,GAAG;EACpE,IAAI,MAAM,aAAa,OAAO,WAAW,OAAO,IAAI,GAAG,OAAO,GAAG;CAClE;AACD,CAAC"}