@v12-engine/engine 0.1.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (951) hide show
  1. package/dist/abilities/amounts.d.ts +28 -0
  2. package/dist/abilities/amounts.js +74 -0
  3. package/dist/abilities/amounts.js.map +1 -0
  4. package/dist/abilities/buffs.d.ts +106 -6
  5. package/dist/abilities/buffs.js +443 -0
  6. package/dist/abilities/buffs.js.map +1 -0
  7. package/dist/abilities/castTold.d.ts +2 -0
  8. package/dist/abilities/castTold.js +66 -0
  9. package/dist/abilities/castTold.js.map +1 -0
  10. package/dist/abilities/chance.d.ts +38 -0
  11. package/dist/abilities/chance.js +77 -0
  12. package/dist/abilities/chance.js.map +1 -0
  13. package/dist/abilities/charges.d.ts +18 -0
  14. package/dist/abilities/charges.js +101 -0
  15. package/dist/abilities/charges.js.map +1 -0
  16. package/dist/abilities/control.d.ts +28 -0
  17. package/dist/abilities/control.js +113 -0
  18. package/dist/abilities/control.js.map +1 -0
  19. package/dist/abilities/dispel.js +51 -0
  20. package/dist/abilities/dispel.js.map +1 -0
  21. package/dist/abilities/effectFields.d.ts +1 -1
  22. package/dist/abilities/effectFields.js +676 -0
  23. package/dist/abilities/effectFields.js.map +1 -0
  24. package/dist/abilities/effectIndex.d.ts +27 -0
  25. package/dist/abilities/effectIndex.js +64 -0
  26. package/dist/abilities/effectIndex.js.map +1 -0
  27. package/dist/abilities/effects/buff.d.ts +9 -3
  28. package/dist/abilities/effects/buff.js +84 -0
  29. package/dist/abilities/effects/buff.js.map +1 -0
  30. package/dist/abilities/effects/conditions.d.ts +2 -0
  31. package/dist/abilities/effects/conditions.js +41 -0
  32. package/dist/abilities/effects/conditions.js.map +1 -0
  33. package/dist/abilities/effects/core.js +54 -0
  34. package/dist/abilities/effects/core.js.map +1 -0
  35. package/dist/abilities/effects/damage.d.ts +1 -1
  36. package/dist/abilities/effects/damage.js +43 -0
  37. package/dist/abilities/effects/damage.js.map +1 -0
  38. package/dist/abilities/effects/heal.d.ts +2 -2
  39. package/dist/abilities/effects/heal.js +51 -0
  40. package/dist/abilities/effects/heal.js.map +1 -0
  41. package/dist/abilities/effects/missile.d.ts +13 -1
  42. package/dist/abilities/effects/missile.js +104 -0
  43. package/dist/abilities/effects/missile.js.map +1 -0
  44. package/dist/abilities/effects/morph.d.ts +5 -0
  45. package/dist/abilities/effects/morph.js +43 -0
  46. package/dist/abilities/effects/morph.js.map +1 -0
  47. package/dist/abilities/effects/moves.d.ts +16 -4
  48. package/dist/abilities/effects/moves.js +212 -0
  49. package/dist/abilities/effects/moves.js.map +1 -0
  50. package/dist/abilities/effects/passives.d.ts +19 -9
  51. package/dist/abilities/effects/passives.js +131 -0
  52. package/dist/abilities/effects/passives.js.map +1 -0
  53. package/dist/abilities/effects/proxy.d.ts +5 -0
  54. package/dist/abilities/effects/proxy.js +60 -0
  55. package/dist/abilities/effects/proxy.js.map +1 -0
  56. package/dist/abilities/effects/sight.d.ts +2 -2
  57. package/dist/abilities/effects/sight.js +39 -0
  58. package/dist/abilities/effects/sight.js.map +1 -0
  59. package/dist/abilities/effects/spawn.d.ts +5 -2
  60. package/dist/abilities/effects/spawn.js +40 -0
  61. package/dist/abilities/effects/spawn.js.map +1 -0
  62. package/dist/abilities/effects/timed.d.ts +2 -2
  63. package/dist/abilities/effects/timed.js +96 -0
  64. package/dist/abilities/effects/timed.js.map +1 -0
  65. package/dist/abilities/effects/trade.d.ts +1 -1
  66. package/dist/abilities/effects/trade.js +25 -0
  67. package/dist/abilities/effects/trade.js.map +1 -0
  68. package/dist/abilities/effects.d.ts +97 -23
  69. package/dist/abilities/effects.js +860 -0
  70. package/dist/abilities/effects.js.map +1 -0
  71. package/dist/abilities/land.d.ts +38 -4
  72. package/dist/abilities/land.js +189 -0
  73. package/dist/abilities/land.js.map +1 -0
  74. package/dist/abilities/recast.d.ts +45 -0
  75. package/dist/abilities/recast.js +118 -0
  76. package/dist/abilities/recast.js.map +1 -0
  77. package/dist/abilities/scaled.js +40 -0
  78. package/dist/abilities/scaled.js.map +1 -0
  79. package/dist/abilities/screen.d.ts +6 -0
  80. package/dist/abilities/screen.js +83 -0
  81. package/dist/abilities/screen.js.map +1 -0
  82. package/dist/abilities/shapes.d.ts +66 -0
  83. package/dist/abilities/shapes.js +122 -0
  84. package/dist/abilities/shapes.js.map +1 -0
  85. package/dist/abilities/text.d.ts +14 -2
  86. package/dist/abilities/text.js +204 -0
  87. package/dist/abilities/text.js.map +1 -0
  88. package/dist/abilities/triggers.d.ts +98 -0
  89. package/dist/abilities/triggers.js +351 -0
  90. package/dist/abilities/triggers.js.map +1 -0
  91. package/dist/abilityChanges.d.ts +131 -0
  92. package/dist/abilityChanges.js +345 -0
  93. package/dist/abilityChanges.js.map +1 -0
  94. package/dist/ai/area.d.ts +4 -1
  95. package/dist/ai/brain.d.ts +4 -1
  96. package/dist/ai/brain.js +844 -0
  97. package/dist/ai/brain.js.map +1 -0
  98. package/dist/ai/budget.js +74 -0
  99. package/dist/ai/budget.js.map +1 -0
  100. package/dist/ai/checks.d.ts +9 -1
  101. package/dist/ai/checks.js +242 -0
  102. package/dist/ai/checks.js.map +1 -0
  103. package/dist/ai/computer.d.ts +11 -4
  104. package/dist/ai/computer.js +251 -0
  105. package/dist/ai/computer.js.map +1 -0
  106. package/dist/ai/defence.d.ts +4 -0
  107. package/dist/ai/defence.js +430 -0
  108. package/dist/ai/defence.js.map +1 -0
  109. package/dist/ai/define.d.ts +3 -2
  110. package/dist/ai/define.js +31 -0
  111. package/dist/ai/define.js.map +1 -0
  112. package/dist/ai/economy.d.ts +10 -7
  113. package/dist/ai/economy.js +780 -0
  114. package/dist/ai/economy.js.map +1 -0
  115. package/dist/ai/geometry.js +38 -0
  116. package/dist/ai/geometry.js.map +1 -0
  117. package/dist/ai/goals.d.ts +1 -0
  118. package/dist/ai/goals.js +560 -0
  119. package/dist/ai/goals.js.map +1 -0
  120. package/dist/ai/knowledge.d.ts +72 -7
  121. package/dist/ai/knowledge.js +804 -0
  122. package/dist/ai/knowledge.js.map +1 -0
  123. package/dist/ai/lanes.d.ts +10 -2
  124. package/dist/ai/lanes.js +715 -0
  125. package/dist/ai/lanes.js.map +1 -0
  126. package/dist/ai/melee/build.js +264 -0
  127. package/dist/ai/melee/build.js.map +1 -0
  128. package/dist/ai/melee/goals.d.ts +7 -0
  129. package/dist/ai/melee/goals.js +720 -0
  130. package/dist/ai/melee/goals.js.map +1 -0
  131. package/dist/ai/melee/heroes.js +68 -0
  132. package/dist/ai/melee/heroes.js.map +1 -0
  133. package/dist/ai/melee/index.d.ts +1 -1
  134. package/dist/ai/melee/index.js +51 -0
  135. package/dist/ai/melee/index.js.map +1 -0
  136. package/dist/ai/melee/production.js +29 -0
  137. package/dist/ai/melee/production.js.map +1 -0
  138. package/dist/ai/melee/surrender.js +64 -0
  139. package/dist/ai/melee/surrender.js.map +1 -0
  140. package/dist/ai/micro.d.ts +9 -0
  141. package/dist/ai/micro.js +1316 -0
  142. package/dist/ai/micro.js.map +1 -0
  143. package/dist/ai/mission.d.ts +9 -2
  144. package/dist/ai/mission.js +538 -0
  145. package/dist/ai/mission.js.map +1 -0
  146. package/dist/ai/missionRules.d.ts +1 -1
  147. package/dist/ai/missionRules.js +26 -0
  148. package/dist/ai/missionRules.js.map +1 -0
  149. package/dist/ai/module.d.ts +6 -2
  150. package/dist/ai/module.js +37 -0
  151. package/dist/ai/module.js.map +1 -0
  152. package/dist/ai/options.d.ts +3 -3
  153. package/dist/ai/plans/build.d.ts +20 -1
  154. package/dist/ai/plans/build.js +608 -0
  155. package/dist/ai/plans/build.js.map +1 -0
  156. package/dist/ai/plans/placement.d.ts +4 -1
  157. package/dist/ai/plans/placement.js +295 -0
  158. package/dist/ai/plans/placement.js.map +1 -0
  159. package/dist/ai/plans/plans.d.ts +9 -0
  160. package/dist/ai/plans/plans.js +110 -0
  161. package/dist/ai/plans/plans.js.map +1 -0
  162. package/dist/ai/plans/production.d.ts +14 -2
  163. package/dist/ai/plans/production.js +434 -0
  164. package/dist/ai/plans/production.js.map +1 -0
  165. package/dist/ai/plans/purse.d.ts +6 -3
  166. package/dist/ai/plans/purse.js +139 -0
  167. package/dist/ai/plans/purse.js.map +1 -0
  168. package/dist/ai/plans/tech.d.ts +6 -0
  169. package/dist/ai/plans/tech.js +122 -0
  170. package/dist/ai/plans/tech.js.map +1 -0
  171. package/dist/ai/profiles.d.ts +4 -4
  172. package/dist/{profiles-B3NS9jwk.js → ai/profiles.js} +3 -98
  173. package/dist/ai/profiles.js.map +1 -0
  174. package/dist/ai/reach.js +54 -0
  175. package/dist/ai/reach.js.map +1 -0
  176. package/dist/ai/report.d.ts +8 -0
  177. package/dist/ai/report.js +87 -0
  178. package/dist/ai/report.js.map +1 -0
  179. package/dist/ai/roles.d.ts +4 -0
  180. package/dist/ai/roles.js +207 -0
  181. package/dist/ai/roles.js.map +1 -0
  182. package/dist/ai/rules.d.ts +8 -2
  183. package/dist/ai/rules.js +416 -0
  184. package/dist/ai/rules.js.map +1 -0
  185. package/dist/ai/scouting.d.ts +6 -0
  186. package/dist/ai/scouting.js +324 -0
  187. package/dist/ai/scouting.js.map +1 -0
  188. package/dist/ai/settings.js +99 -0
  189. package/dist/ai/settings.js.map +1 -0
  190. package/dist/ai/squads.d.ts +21 -2
  191. package/dist/ai/squads.js +916 -0
  192. package/dist/ai/squads.js.map +1 -0
  193. package/dist/ai/strength.js +320 -0
  194. package/dist/ai/strength.js.map +1 -0
  195. package/dist/ai/task.d.ts +3 -1
  196. package/dist/ai/task.js +17 -0
  197. package/dist/ai/task.js.map +1 -0
  198. package/dist/ai/tasks/attack.js +24 -0
  199. package/dist/ai/tasks/attack.js.map +1 -0
  200. package/dist/ai/tasks/capture.d.ts +3 -3
  201. package/dist/ai/tasks/capture.js +37 -0
  202. package/dist/ai/tasks/capture.js.map +1 -0
  203. package/dist/ai/tasks/creep.js +29 -0
  204. package/dist/ai/tasks/creep.js.map +1 -0
  205. package/dist/ai/tasks/defend.js +61 -0
  206. package/dist/ai/tasks/defend.js.map +1 -0
  207. package/dist/ai/tasks/drop.js +81 -0
  208. package/dist/ai/tasks/drop.js.map +1 -0
  209. package/dist/ai/tasks/escort.js +59 -0
  210. package/dist/ai/tasks/escort.js.map +1 -0
  211. package/dist/ai/tasks/gather.js +48 -0
  212. package/dist/ai/tasks/gather.js.map +1 -0
  213. package/dist/ai/tasks/harass.js +39 -0
  214. package/dist/ai/tasks/harass.js.map +1 -0
  215. package/dist/ai/tasks/hold.js +32 -0
  216. package/dist/ai/tasks/hold.js.map +1 -0
  217. package/dist/ai/tasks/index.js +34 -0
  218. package/dist/ai/tasks/index.js.map +1 -0
  219. package/dist/ai/tasks/move.js +26 -0
  220. package/dist/ai/tasks/move.js.map +1 -0
  221. package/dist/ai/tasks/patrol.js +59 -0
  222. package/dist/ai/tasks/patrol.js.map +1 -0
  223. package/dist/ai/tasks/retreat.js +28 -0
  224. package/dist/ai/tasks/retreat.js.map +1 -0
  225. package/dist/ai/tasks/scout.js +73 -0
  226. package/dist/ai/tasks/scout.js.map +1 -0
  227. package/dist/ai/tasks/shared.d.ts +1 -1
  228. package/dist/ai/tasks/shared.js +137 -0
  229. package/dist/ai/tasks/shared.js.map +1 -0
  230. package/dist/ai/team.d.ts +18 -1
  231. package/dist/ai/team.js +492 -0
  232. package/dist/ai/team.js.map +1 -0
  233. package/dist/ai/threat.d.ts +6 -0
  234. package/dist/ai/threat.js +206 -0
  235. package/dist/ai/threat.js.map +1 -0
  236. package/dist/ai/view.d.ts +21 -7
  237. package/dist/ai/view.js +677 -0
  238. package/dist/ai/view.js.map +1 -0
  239. package/dist/ai/waves.d.ts +6 -0
  240. package/dist/ai/waves.js +410 -0
  241. package/dist/ai/waves.js.map +1 -0
  242. package/dist/ai.js +54 -6239
  243. package/dist/aiTesting.d.ts +6 -3
  244. package/dist/aiTesting.js +229 -0
  245. package/dist/aiTesting.js.map +1 -0
  246. package/dist/areas.d.ts +4 -1
  247. package/dist/areas.js +295 -0
  248. package/dist/areas.js.map +1 -0
  249. package/dist/attacks.d.ts +3 -3
  250. package/dist/attacks.js +127 -0
  251. package/dist/attacks.js.map +1 -0
  252. package/dist/burning.d.ts +267 -0
  253. package/dist/burning.js +795 -0
  254. package/dist/burning.js.map +1 -0
  255. package/dist/bytes.js +21 -0
  256. package/dist/bytes.js.map +1 -0
  257. package/dist/callings.d.ts +71 -0
  258. package/dist/callings.js +157 -0
  259. package/dist/callings.js.map +1 -0
  260. package/dist/cameraOrders.d.ts +78 -0
  261. package/dist/cameraOrders.js +114 -0
  262. package/dist/cameraOrders.js.map +1 -0
  263. package/dist/camps.d.ts +70 -4
  264. package/dist/camps.js +501 -0
  265. package/dist/camps.js.map +1 -0
  266. package/dist/capture.d.ts +15 -3
  267. package/dist/capture.js +304 -0
  268. package/dist/capture.js.map +1 -0
  269. package/dist/cellLayers.d.ts +78 -13
  270. package/dist/cellLayers.js +275 -0
  271. package/dist/cellLayers.js.map +1 -0
  272. package/dist/cellPatches.d.ts +24 -0
  273. package/dist/cellPatches.js +73 -0
  274. package/dist/cellPatches.js.map +1 -0
  275. package/dist/cinematics.d.ts +10 -5
  276. package/dist/cinematics.js +161 -0
  277. package/dist/cinematics.js.map +1 -0
  278. package/dist/clock.d.ts +2 -2
  279. package/dist/clock.js +78 -0
  280. package/dist/clock.js.map +1 -0
  281. package/dist/commands.d.ts +36 -4
  282. package/dist/commands.js +636 -0
  283. package/dist/commands.js.map +1 -0
  284. package/dist/components.d.ts +31 -10
  285. package/dist/components.js +74 -0
  286. package/dist/components.js.map +1 -0
  287. package/dist/computers.d.ts +4 -4
  288. package/dist/computers.js +194 -0
  289. package/dist/computers.js.map +1 -0
  290. package/dist/concealment.d.ts +25 -2
  291. package/dist/concealment.js +409 -0
  292. package/dist/concealment.js.map +1 -0
  293. package/dist/coreComponents.js +130 -0
  294. package/dist/coreComponents.js.map +1 -0
  295. package/dist/createGame.d.ts +306 -0
  296. package/dist/createGame.js +405 -0
  297. package/dist/createGame.js.map +1 -0
  298. package/dist/dashing.d.ts +18 -2
  299. package/dist/dashing.js +41 -0
  300. package/dist/dashing.js.map +1 -0
  301. package/dist/debug.d.ts +8 -0
  302. package/dist/debug.js +5 -3
  303. package/dist/debug2.js +76 -0
  304. package/dist/debug2.js.map +1 -0
  305. package/dist/debugCommands.d.ts +6 -6
  306. package/dist/debugCommands.js +537 -0
  307. package/dist/debugCommands.js.map +1 -0
  308. package/dist/debugging.d.ts +1 -0
  309. package/dist/defaultSets.d.ts +183 -0
  310. package/dist/defaultSets.js +216 -0
  311. package/dist/defaultSets.js.map +1 -0
  312. package/dist/definitions.d.ts +6 -0
  313. package/dist/definitions.js +78 -0
  314. package/dist/definitions.js.map +1 -0
  315. package/dist/defs.d.ts +1895 -165
  316. package/dist/defs.js +380 -0
  317. package/dist/defs.js.map +1 -0
  318. package/dist/denying.d.ts +4 -4
  319. package/dist/denying.js +106 -0
  320. package/dist/denying.js.map +1 -0
  321. package/dist/destructibles.d.ts +2 -2
  322. package/dist/destructibles.js +36 -0
  323. package/dist/destructibles.js.map +1 -0
  324. package/dist/determinism.d.ts +4 -4
  325. package/dist/determinism.js +247 -0
  326. package/dist/determinism.js.map +1 -0
  327. package/dist/dialog.d.ts +17 -2
  328. package/dist/dialog.js +108 -0
  329. package/dist/dialog.js.map +1 -0
  330. package/dist/effectRefs.js +28 -0
  331. package/dist/effectRefs.js.map +1 -0
  332. package/dist/effects.d.ts +27 -11
  333. package/dist/effects.js +110 -0
  334. package/dist/effects.js.map +1 -0
  335. package/dist/endings.d.ts +1 -1
  336. package/dist/endings.js +78 -0
  337. package/dist/endings.js.map +1 -0
  338. package/dist/engagement.d.ts +40 -6
  339. package/dist/engagement.js +530 -0
  340. package/dist/engagement.js.map +1 -0
  341. package/dist/engineEvents.d.ts +72 -9
  342. package/dist/engineEvents.js +520 -0
  343. package/dist/engineEvents.js.map +1 -0
  344. package/dist/entity.d.ts +275 -26
  345. package/dist/entity.js +441 -0
  346. package/dist/entity.js.map +1 -0
  347. package/dist/entityIndex.d.ts +10 -3
  348. package/dist/entityIndex.js +149 -0
  349. package/dist/entityIndex.js.map +1 -0
  350. package/dist/errors.d.ts +6 -2
  351. package/dist/errors.js +59 -0
  352. package/dist/errors.js.map +1 -0
  353. package/dist/events.d.ts +11 -5
  354. package/dist/events.js +158 -0
  355. package/dist/events.js.map +1 -0
  356. package/dist/exactMath.js +273 -0
  357. package/dist/exactMath.js.map +1 -0
  358. package/dist/features.d.ts +1 -1
  359. package/dist/features.js +127 -0
  360. package/dist/features.js.map +1 -0
  361. package/dist/fields.d.ts +25 -5
  362. package/dist/fields.js +140 -0
  363. package/dist/fields.js.map +1 -0
  364. package/dist/fixture.d.ts +3 -3
  365. package/dist/fixture.js +512 -0
  366. package/dist/fixture.js.map +1 -0
  367. package/dist/fog.d.ts +26 -3
  368. package/dist/fog.js +333 -0
  369. package/dist/fog.js.map +1 -0
  370. package/dist/foliage.d.ts +476 -0
  371. package/dist/foliage.js +1478 -0
  372. package/dist/foliage.js.map +1 -0
  373. package/dist/foliageDebug.d.ts +57 -0
  374. package/dist/foliageDebug.js +172 -0
  375. package/dist/foliageDebug.js.map +1 -0
  376. package/dist/foliageRegrowth.d.ts +20 -0
  377. package/dist/foliageRegrowth.js +332 -0
  378. package/dist/foliageRegrowth.js.map +1 -0
  379. package/dist/formState.d.ts +67 -0
  380. package/dist/formState.js +65 -0
  381. package/dist/formState.js.map +1 -0
  382. package/dist/formation.d.ts +46 -8
  383. package/dist/formation.js +297 -0
  384. package/dist/formation.js.map +1 -0
  385. package/dist/forms.d.ts +58 -0
  386. package/dist/forms.js +146 -0
  387. package/dist/forms.js.map +1 -0
  388. package/dist/friendlyFire.d.ts +2 -2
  389. package/dist/friendlyFire.js +37 -0
  390. package/dist/friendlyFire.js.map +1 -0
  391. package/dist/game.d.ts +141 -48
  392. package/dist/game.js +834 -0
  393. package/dist/game.js.map +1 -0
  394. package/dist/gameData.d.ts +96 -22
  395. package/dist/gameData.js +1690 -0
  396. package/dist/gameData.js.map +1 -0
  397. package/dist/gameFiles.d.ts +3 -3
  398. package/dist/gameFiles.js +14 -0
  399. package/dist/gameFiles.js.map +1 -0
  400. package/dist/gates.js +92 -0
  401. package/dist/gates.js.map +1 -0
  402. package/dist/generate.d.ts +28 -1
  403. package/dist/generate.js +1062 -0
  404. package/dist/generate.js.map +1 -0
  405. package/dist/generateWorker.d.ts +7 -3
  406. package/dist/generateWorker.js +86 -0
  407. package/dist/generateWorker.js.map +1 -0
  408. package/dist/grid.d.ts +9 -0
  409. package/dist/grid.js +102 -0
  410. package/dist/grid.js.map +1 -0
  411. package/dist/ground.d.ts +17 -1
  412. package/dist/ground.js +375 -0
  413. package/dist/ground.js.map +1 -0
  414. package/dist/groundObjects.d.ts +70 -0
  415. package/dist/groundObjects.js +371 -0
  416. package/dist/groundObjects.js.map +1 -0
  417. package/dist/groundSpeed.d.ts +20 -3
  418. package/dist/groundSpeed.js +117 -0
  419. package/dist/groundSpeed.js.map +1 -0
  420. package/dist/hero.d.ts +126 -10
  421. package/dist/hero.js +432 -0
  422. package/dist/hero.js.map +1 -0
  423. package/dist/holds.d.ts +94 -0
  424. package/dist/holds.js +305 -0
  425. package/dist/holds.js.map +1 -0
  426. package/dist/home.d.ts +1 -1
  427. package/dist/home.js +30 -0
  428. package/dist/home.js.map +1 -0
  429. package/dist/hooks.d.ts +339 -57
  430. package/dist/hooks.js +105 -0
  431. package/dist/hooks.js.map +1 -0
  432. package/dist/hotReload.d.ts +6 -5
  433. package/dist/hotReload.js +145 -0
  434. package/dist/hotReload.js.map +1 -0
  435. package/dist/ids.d.ts +3 -3
  436. package/dist/ids.js +30 -0
  437. package/dist/ids.js.map +1 -0
  438. package/dist/idsFile.d.ts +36 -0
  439. package/dist/idsFile.js +134 -0
  440. package/dist/idsFile.js.map +1 -0
  441. package/dist/index.d.ts +105 -68
  442. package/dist/index.js +194 -4701
  443. package/dist/inspect.d.ts +29 -2
  444. package/dist/{inspect-D9dWHmZ0.js → inspect.js} +21 -12
  445. package/dist/inspect.js.map +1 -0
  446. package/dist/inventory.d.ts +14 -1
  447. package/dist/inventory.js +84 -0
  448. package/dist/inventory.js.map +1 -0
  449. package/dist/items.d.ts +136 -8
  450. package/dist/items.js +585 -0
  451. package/dist/items.js.map +1 -0
  452. package/dist/lanes.d.ts +12 -3
  453. package/dist/lanes.js +496 -0
  454. package/dist/lanes.js.map +1 -0
  455. package/dist/life.d.ts +6 -2
  456. package/dist/life.js +287 -0
  457. package/dist/life.js.map +1 -0
  458. package/dist/log.d.ts +26 -3
  459. package/dist/log.js +192 -0
  460. package/dist/log.js.map +1 -0
  461. package/dist/manaBurn.d.ts +2 -2
  462. package/dist/manaBurn.js +75 -0
  463. package/dist/manaBurn.js.map +1 -0
  464. package/dist/map/file.d.ts +56 -3
  465. package/dist/map/file.js +264 -0
  466. package/dist/map/file.js.map +1 -0
  467. package/dist/map/images.js +61 -0
  468. package/dist/map/images.js.map +1 -0
  469. package/dist/map/look.d.ts +1 -1
  470. package/dist/map/look.js +30 -0
  471. package/dist/map/look.js.map +1 -0
  472. package/dist/map/pathProfile.js +183 -0
  473. package/dist/map/pathProfile.js.map +1 -0
  474. package/dist/map/resize.d.ts +4 -0
  475. package/dist/map/resize.js +136 -0
  476. package/dist/map/resize.js.map +1 -0
  477. package/dist/map/schema.js +257 -0
  478. package/dist/map/schema.js.map +1 -0
  479. package/dist/map/terrain.js +214 -0
  480. package/dist/map/terrain.js.map +1 -0
  481. package/dist/map/types.d.ts +92 -13
  482. package/dist/map/types.js +251 -0
  483. package/dist/map/types.js.map +1 -0
  484. package/dist/mapCheck/cells.js +94 -0
  485. package/dist/mapCheck/cells.js.map +1 -0
  486. package/dist/mapCheck/rules/foliage.d.ts +9 -0
  487. package/dist/mapCheck/rules/foliage.js +83 -0
  488. package/dist/mapCheck/rules/foliage.js.map +1 -0
  489. package/dist/mapCheck/rules/names.js +39 -0
  490. package/dist/mapCheck/rules/names.js.map +1 -0
  491. package/dist/mapCheck/rules/objects.d.ts +1 -1
  492. package/dist/mapCheck/rules/objects.js +56 -0
  493. package/dist/mapCheck/rules/objects.js.map +1 -0
  494. package/dist/mapCheck/rules/paths.js +32 -0
  495. package/dist/mapCheck/rules/paths.js.map +1 -0
  496. package/dist/mapCheck/rules/players.js +20 -0
  497. package/dist/mapCheck/rules/players.js.map +1 -0
  498. package/dist/mapCheck/rules/races.js +56 -0
  499. package/dist/mapCheck/rules/races.js.map +1 -0
  500. package/dist/mapCheck/rules/random.js +47 -0
  501. package/dist/mapCheck/rules/random.js.map +1 -0
  502. package/dist/mapCheck/rules/regions.js +30 -0
  503. package/dist/mapCheck/rules/regions.js.map +1 -0
  504. package/dist/mapCheck/rules/targets.js +31 -0
  505. package/dist/mapCheck/rules/targets.js.map +1 -0
  506. package/dist/mapCheck/rules/walking.js +45 -0
  507. package/dist/mapCheck/rules/walking.js.map +1 -0
  508. package/dist/mapCheck.d.ts +2 -2
  509. package/dist/mapCheck.js +63 -0
  510. package/dist/mapCheck.js.map +1 -0
  511. package/dist/mapFields.d.ts +25 -2
  512. package/dist/mapFields.js +134 -0
  513. package/dist/mapFields.js.map +1 -0
  514. package/dist/mapFile.js +176 -0
  515. package/dist/mapFile.js.map +1 -0
  516. package/dist/mapMeasure.d.ts +8 -0
  517. package/dist/mapMeasure.js +283 -0
  518. package/dist/mapMeasure.js.map +1 -0
  519. package/dist/mapMerge.d.ts +1 -0
  520. package/dist/mapMerge.js +172 -0
  521. package/dist/mapMerge.js.map +1 -0
  522. package/dist/mapObjectives.js +138 -0
  523. package/dist/mapObjectives.js.map +1 -0
  524. package/dist/mapObjects.js +80 -0
  525. package/dist/mapObjects.js.map +1 -0
  526. package/dist/math.d.ts +37 -7
  527. package/dist/math.js +155 -0
  528. package/dist/math.js.map +1 -0
  529. package/dist/messages.d.ts +71 -4
  530. package/dist/messages.js +29 -0
  531. package/dist/messages.js.map +1 -0
  532. package/dist/missionRules.d.ts +10 -2
  533. package/dist/{missionRules-C-bGxm0Q.js → missionRules.js} +30 -150
  534. package/dist/missionRules.js.map +1 -0
  535. package/dist/mods.d.ts +39 -20
  536. package/dist/mods.js +271 -0
  537. package/dist/mods.js.map +1 -0
  538. package/dist/moves.d.ts +87 -0
  539. package/dist/moves.js +539 -0
  540. package/dist/moves.js.map +1 -0
  541. package/dist/names.d.ts +7 -0
  542. package/dist/names.js +122 -0
  543. package/dist/names.js.map +1 -0
  544. package/dist/navigation/agentParams.js +14 -0
  545. package/dist/navigation/agentParams.js.map +1 -0
  546. package/dist/navigation/air.d.ts +7 -3
  547. package/dist/navigation/air.js +401 -0
  548. package/dist/navigation/air.js.map +1 -0
  549. package/dist/navigation/builds.d.ts +34 -2
  550. package/dist/navigation/builds.js +287 -0
  551. package/dist/navigation/builds.js.map +1 -0
  552. package/dist/navigation/groundAreas.d.ts +59 -1
  553. package/dist/navigation/groundAreas.js +407 -0
  554. package/dist/navigation/groundAreas.js.map +1 -0
  555. package/dist/navigation/navigation.d.ts +98 -9
  556. package/dist/navigation/recast.d.ts +194 -18
  557. package/dist/navigation/recast.js +1379 -0
  558. package/dist/navigation/recast.js.map +1 -0
  559. package/dist/navigation/sidePaths.d.ts +8 -3
  560. package/dist/navigation/sidePaths.js +241 -0
  561. package/dist/navigation/sidePaths.js.map +1 -0
  562. package/dist/navigation/sized.js +243 -0
  563. package/dist/navigation/sized.js.map +1 -0
  564. package/dist/nearest.js +32 -0
  565. package/dist/nearest.js.map +1 -0
  566. package/dist/noise.js +59 -0
  567. package/dist/noise.js.map +1 -0
  568. package/dist/objectives.d.ts +12 -3
  569. package/dist/objectives.js +144 -0
  570. package/dist/objectives.js.map +1 -0
  571. package/dist/orders/basic.d.ts +5 -5
  572. package/dist/orders/basic.js +417 -0
  573. package/dist/orders/basic.js.map +1 -0
  574. package/dist/orders/build.js +278 -0
  575. package/dist/orders/build.js.map +1 -0
  576. package/dist/orders/cast.d.ts +13 -3
  577. package/dist/orders/cast.js +558 -0
  578. package/dist/orders/cast.js.map +1 -0
  579. package/dist/orders/facts.js +16 -0
  580. package/dist/orders/facts.js.map +1 -0
  581. package/dist/orders/harvest.d.ts +21 -5
  582. package/dist/orders/harvest.js +540 -0
  583. package/dist/orders/harvest.js.map +1 -0
  584. package/dist/orders/idle.d.ts +3 -1
  585. package/dist/orders/idle.js +234 -0
  586. package/dist/orders/idle.js.map +1 -0
  587. package/dist/orders/items.js +92 -0
  588. package/dist/orders/items.js.map +1 -0
  589. package/dist/orders/queue.js +108 -0
  590. package/dist/orders/queue.js.map +1 -0
  591. package/dist/orders/waiting.d.ts +39 -0
  592. package/dist/orders/waiting.js +149 -0
  593. package/dist/orders/waiting.js.map +1 -0
  594. package/dist/pack.schema.js +13 -0
  595. package/dist/pack.schema.js.map +1 -0
  596. package/dist/pack.schema.json +7622 -841
  597. package/dist/packs/director/index.d.ts +13 -5
  598. package/dist/packs/director/index.js +204 -0
  599. package/dist/packs/director/index.js.map +1 -0
  600. package/dist/packs/heroes/campaign.d.ts +3 -2
  601. package/dist/packs/heroes/campaign.js +241 -0
  602. package/dist/packs/heroes/campaign.js.map +1 -0
  603. package/dist/packs/heroes/carry.d.ts +6 -0
  604. package/dist/packs/heroes/carry.js +112 -0
  605. package/dist/packs/heroes/carry.js.map +1 -0
  606. package/dist/packs/heroes/commands.js +115 -0
  607. package/dist/packs/heroes/commands.js.map +1 -0
  608. package/dist/packs/heroes/fallen.d.ts +43 -0
  609. package/dist/packs/heroes/fallen.js +61 -0
  610. package/dist/packs/heroes/fallen.js.map +1 -0
  611. package/dist/packs/heroes/hire.js +60 -0
  612. package/dist/packs/heroes/hire.js.map +1 -0
  613. package/dist/packs/heroes/index.d.ts +7 -6
  614. package/dist/packs/heroes/index.js +130 -0
  615. package/dist/packs/heroes/index.js.map +1 -0
  616. package/dist/packs/heroes/loop.d.ts +95 -0
  617. package/dist/packs/heroes/loop.js +250 -0
  618. package/dist/packs/heroes/loop.js.map +1 -0
  619. package/dist/packs/heroes/making.d.ts +6 -3
  620. package/dist/packs/heroes/making.js +55 -0
  621. package/dist/packs/heroes/making.js.map +1 -0
  622. package/dist/packs/heroes/respawn.d.ts +3 -3
  623. package/dist/packs/heroes/respawn.js +87 -0
  624. package/dist/packs/heroes/respawn.js.map +1 -0
  625. package/dist/packs/heroes/sets.d.ts +32 -0
  626. package/dist/packs/heroes/sets.js +51 -0
  627. package/dist/packs/heroes/sets.js.map +1 -0
  628. package/dist/packs/heroes/spells.d.ts +16 -0
  629. package/dist/packs/heroes/spells.js +269 -0
  630. package/dist/packs/heroes/spells.js.map +1 -0
  631. package/dist/packs/items/defaults.d.ts +43 -0
  632. package/dist/packs/items/defaults.js +1504 -0
  633. package/dist/packs/items/defaults.js.map +1 -0
  634. package/dist/packs/items/index.d.ts +27 -0
  635. package/dist/packs/items/index.js +214 -0
  636. package/dist/packs/items/index.js.map +1 -0
  637. package/dist/packs/moba/index.d.ts +3 -3
  638. package/dist/packs/moba/index.js +174 -0
  639. package/dist/packs/moba/index.js.map +1 -0
  640. package/dist/packs/pack.d.ts +15 -15
  641. package/dist/packs/pack.js +14 -0
  642. package/dist/packs/pack.js.map +1 -0
  643. package/dist/packs.d.ts +15 -7
  644. package/dist/packs.js +222 -0
  645. package/dist/packs.js.map +1 -0
  646. package/dist/paths.d.ts +2 -0
  647. package/dist/paths.js +109 -0
  648. package/dist/paths.js.map +1 -0
  649. package/dist/plain.js +57 -0
  650. package/dist/plain.js.map +1 -0
  651. package/dist/player.d.ts +33 -10
  652. package/dist/player.js +159 -0
  653. package/dist/player.js.map +1 -0
  654. package/dist/portals.d.ts +1 -1
  655. package/dist/portals.js +194 -0
  656. package/dist/portals.js.map +1 -0
  657. package/dist/prefabs.d.ts +25 -2
  658. package/dist/prefabs.js +239 -0
  659. package/dist/prefabs.js.map +1 -0
  660. package/dist/presetBuildings.js +58 -0
  661. package/dist/presetBuildings.js.map +1 -0
  662. package/dist/presetFoliage.d.ts +27 -0
  663. package/dist/presetFoliage.js +98 -0
  664. package/dist/presetFoliage.js.map +1 -0
  665. package/dist/presetGround.js +65 -0
  666. package/dist/presetGround.js.map +1 -0
  667. package/dist/proxies.d.ts +12 -0
  668. package/dist/proxies.js +79 -0
  669. package/dist/proxies.js.map +1 -0
  670. package/dist/query.d.ts +56 -0
  671. package/dist/query.js +88 -0
  672. package/dist/query.js.map +1 -0
  673. package/dist/races.d.ts +15 -14
  674. package/dist/races.js +172 -0
  675. package/dist/races.js.map +1 -0
  676. package/dist/randomGroups.js +91 -0
  677. package/dist/randomGroups.js.map +1 -0
  678. package/dist/registry.d.ts +117 -53
  679. package/dist/registry.js +323 -0
  680. package/dist/registry.js.map +1 -0
  681. package/dist/remains.d.ts +11 -9
  682. package/dist/remains.js +188 -0
  683. package/dist/remains.js.map +1 -0
  684. package/dist/replication.d.ts +12 -7
  685. package/dist/replication.js +100 -0
  686. package/dist/replication.js.map +1 -0
  687. package/dist/rng.d.ts +2 -0
  688. package/dist/rng.js +40 -0
  689. package/dist/rng.js.map +1 -0
  690. package/dist/rules.d.ts +186 -99
  691. package/dist/rules.js +179 -0
  692. package/dist/rules.js.map +1 -0
  693. package/dist/rulesCheck.d.ts +5 -4
  694. package/dist/rulesCheck.js +693 -0
  695. package/dist/rulesCheck.js.map +1 -0
  696. package/dist/runes.d.ts +2 -2
  697. package/dist/runes.js +80 -0
  698. package/dist/runes.js.map +1 -0
  699. package/dist/save.d.ts +37 -12
  700. package/dist/save.js +532 -0
  701. package/dist/save.js.map +1 -0
  702. package/dist/scenario.d.ts +2 -2
  703. package/dist/scenario.js +99 -0
  704. package/dist/scenario.js.map +1 -0
  705. package/dist/scheduler.d.ts +3 -0
  706. package/dist/scheduler.js +156 -0
  707. package/dist/scheduler.js.map +1 -0
  708. package/dist/score.d.ts +19 -19
  709. package/dist/score.js +709 -0
  710. package/dist/score.js.map +1 -0
  711. package/dist/sequences.d.ts +10 -6
  712. package/dist/sequences.js +206 -0
  713. package/dist/sequences.js.map +1 -0
  714. package/dist/server/doorman.js +154 -0
  715. package/dist/server/doorman.js.map +1 -0
  716. package/dist/server/gameServer.d.ts +16 -1
  717. package/dist/server/gameServer.js +643 -0
  718. package/dist/server/gameServer.js.map +1 -0
  719. package/dist/server/index.d.ts +1 -1
  720. package/dist/server/lobby.js +199 -0
  721. package/dist/server/lobby.js.map +1 -0
  722. package/dist/server/log.js +18 -0
  723. package/dist/server/log.js.map +1 -0
  724. package/dist/server/match.js +267 -0
  725. package/dist/server/match.js.map +1 -0
  726. package/dist/server/mode.d.ts +18 -9
  727. package/dist/server/mode.js +220 -0
  728. package/dist/server/mode.js.map +1 -0
  729. package/dist/{navigation-worker.js → server/navigation-worker.js} +1 -1
  730. package/dist/server/navigation-worker.js.map +1 -0
  731. package/dist/server/navigation.js +39 -0
  732. package/dist/server/navigation.js.map +1 -0
  733. package/dist/server/ops.d.ts +4 -0
  734. package/dist/server/ops.js +137 -0
  735. package/dist/server/ops.js.map +1 -0
  736. package/dist/server/packs.d.ts +3 -3
  737. package/dist/server/packs.js +32 -0
  738. package/dist/server/packs.js.map +1 -0
  739. package/dist/server/ratings.d.ts +5 -0
  740. package/dist/server/ratings.js +104 -0
  741. package/dist/server/ratings.js.map +1 -0
  742. package/dist/server/relay.d.ts +12 -2
  743. package/dist/server/relay.js +144 -0
  744. package/dist/server/relay.js.map +1 -0
  745. package/dist/server/rooms.d.ts +9 -2
  746. package/dist/server/rooms.js +442 -0
  747. package/dist/server/rooms.js.map +1 -0
  748. package/dist/server/seat.js +116 -0
  749. package/dist/server/seat.js.map +1 -0
  750. package/dist/server/seatSettings.d.ts +3 -3
  751. package/dist/server/seatSettings.js +63 -0
  752. package/dist/server/seatSettings.js.map +1 -0
  753. package/dist/server/secret.js +13 -0
  754. package/dist/server/secret.js.map +1 -0
  755. package/dist/server/start.d.ts +13 -6
  756. package/dist/server/start.js +76 -0
  757. package/dist/server/start.js.map +1 -0
  758. package/dist/server/websocket.d.ts +9 -1
  759. package/dist/server/websocket.js +306 -0
  760. package/dist/server/websocket.js.map +1 -0
  761. package/dist/server.js +15 -2861
  762. package/dist/session/can.js +26 -0
  763. package/dist/session/can.js.map +1 -0
  764. package/dist/session/commandReplay.d.ts +8 -2
  765. package/dist/session/commandReplay.js +293 -0
  766. package/dist/session/commandReplay.js.map +1 -0
  767. package/dist/session/debug.js +151 -0
  768. package/dist/session/debug.js.map +1 -0
  769. package/dist/session/delay.js +62 -0
  770. package/dist/session/delay.js.map +1 -0
  771. package/dist/session/delta.d.ts +14 -1
  772. package/dist/session/delta.js +407 -0
  773. package/dist/session/delta.js.map +1 -0
  774. package/dist/session/entityState.js +415 -0
  775. package/dist/session/entityState.js.map +1 -0
  776. package/dist/session/local.d.ts +47 -5
  777. package/dist/session/local.js +670 -0
  778. package/dist/session/local.js.map +1 -0
  779. package/dist/session/memory.d.ts +20 -2
  780. package/dist/session/memory.js +131 -0
  781. package/dist/session/memory.js.map +1 -0
  782. package/dist/session/protocol.d.ts +325 -31
  783. package/dist/session/protocol.js +55 -0
  784. package/dist/session/protocol.js.map +1 -0
  785. package/dist/session/remote.d.ts +74 -12
  786. package/dist/session/remote.js +1394 -0
  787. package/dist/session/remote.js.map +1 -0
  788. package/dist/session/replay.d.ts +11 -2
  789. package/dist/session/replay.js +160 -0
  790. package/dist/session/replay.js.map +1 -0
  791. package/dist/session/seed.js +12 -0
  792. package/dist/session/seed.js.map +1 -0
  793. package/dist/session/share.d.ts +5 -1
  794. package/dist/session/share.js +94 -0
  795. package/dist/session/share.js.map +1 -0
  796. package/dist/session/socket.d.ts +1 -1
  797. package/dist/session/socket.js +29 -0
  798. package/dist/session/socket.js.map +1 -0
  799. package/dist/session/wire.d.ts +5 -0
  800. package/dist/session/wire.js +84 -0
  801. package/dist/session/wire.js.map +1 -0
  802. package/dist/session/worker.d.ts +77 -12
  803. package/dist/session/worker.js +499 -0
  804. package/dist/session/worker.js.map +1 -0
  805. package/dist/shared.d.ts +31 -5
  806. package/dist/shared.js +166 -0
  807. package/dist/shared.js.map +1 -0
  808. package/dist/sides.d.ts +9 -3
  809. package/dist/sides.js +149 -0
  810. package/dist/sides.js.map +1 -0
  811. package/dist/sight.js +85 -0
  812. package/dist/sight.js.map +1 -0
  813. package/dist/simulate-worker.js +1 -1
  814. package/dist/simulate.d.ts +12 -8
  815. package/dist/{simulate-oXBiw1Ff.js → simulate.js} +10 -11
  816. package/dist/simulate.js.map +1 -0
  817. package/dist/smart.js +77 -0
  818. package/dist/smart.js.map +1 -0
  819. package/dist/spatial.d.ts +32 -16
  820. package/dist/spatial.js +234 -0
  821. package/dist/spatial.js.map +1 -0
  822. package/dist/spawning.d.ts +1 -0
  823. package/dist/spawning.js +224 -0
  824. package/dist/spawning.js.map +1 -0
  825. package/dist/stances.d.ts +6 -3
  826. package/dist/stances.js +169 -0
  827. package/dist/stances.js.map +1 -0
  828. package/dist/start.d.ts +10 -10
  829. package/dist/start.js +75 -0
  830. package/dist/start.js.map +1 -0
  831. package/dist/stats.d.ts +42 -16
  832. package/dist/stats.js +290 -0
  833. package/dist/stats.js.map +1 -0
  834. package/dist/summoned.d.ts +52 -0
  835. package/dist/summoned.js +38 -0
  836. package/dist/summoned.js.map +1 -0
  837. package/dist/summons.d.ts +10 -13
  838. package/dist/summons.js +271 -0
  839. package/dist/summons.js.map +1 -0
  840. package/dist/systems/abilities.js +224 -0
  841. package/dist/systems/abilities.js.map +1 -0
  842. package/dist/systems/combat.d.ts +35 -1
  843. package/dist/systems/combat.js +677 -0
  844. package/dist/systems/combat.js.map +1 -0
  845. package/dist/systems/combatTold.d.ts +3 -1
  846. package/dist/systems/combatTold.js +85 -0
  847. package/dist/systems/combatTold.js.map +1 -0
  848. package/dist/systems/construction.js +80 -0
  849. package/dist/systems/construction.js.map +1 -0
  850. package/dist/systems/economy.d.ts +0 -6
  851. package/dist/systems/economy.js +128 -0
  852. package/dist/systems/economy.js.map +1 -0
  853. package/dist/systems/fog.d.ts +1 -1
  854. package/dist/systems/fog.js +120 -0
  855. package/dist/systems/fog.js.map +1 -0
  856. package/dist/systems/life.js +32 -0
  857. package/dist/systems/life.js.map +1 -0
  858. package/dist/systems/movement.d.ts +24 -12
  859. package/dist/systems/movement.js +1247 -0
  860. package/dist/systems/movement.js.map +1 -0
  861. package/dist/systems/orders.js +64 -0
  862. package/dist/systems/orders.js.map +1 -0
  863. package/dist/systems/production.js +322 -0
  864. package/dist/systems/production.js.map +1 -0
  865. package/dist/systems/productionQueue.js +120 -0
  866. package/dist/systems/productionQueue.js.map +1 -0
  867. package/dist/systems/victory.d.ts +1 -1
  868. package/dist/systems/victory.js +56 -0
  869. package/dist/systems/victory.js.map +1 -0
  870. package/dist/talk.d.ts +6 -6
  871. package/dist/talk.js +153 -0
  872. package/dist/talk.js.map +1 -0
  873. package/dist/targeting.d.ts +142 -0
  874. package/dist/targeting.js +49 -0
  875. package/dist/targeting.js.map +1 -0
  876. package/dist/tech.d.ts +20 -3
  877. package/dist/tech.js +239 -0
  878. package/dist/tech.js.map +1 -0
  879. package/dist/techTree.d.ts +7 -0
  880. package/dist/techTree.js +90 -0
  881. package/dist/techTree.js.map +1 -0
  882. package/dist/terrain.d.ts +59 -7
  883. package/dist/terrain.js +389 -0
  884. package/dist/terrain.js.map +1 -0
  885. package/dist/terrainSave.d.ts +6 -0
  886. package/dist/terrainSave.js +74 -0
  887. package/dist/terrainSave.js.map +1 -0
  888. package/dist/testing.d.ts +8 -7
  889. package/dist/testing.js +13 -739
  890. package/dist/testing.js.map +1 -1
  891. package/dist/tiles.d.ts +1 -1
  892. package/dist/tiles.js +43 -0
  893. package/dist/tiles.js.map +1 -0
  894. package/dist/timers.d.ts +29 -4
  895. package/dist/timers.js +242 -0
  896. package/dist/timers.js.map +1 -0
  897. package/dist/tomes.d.ts +4 -4
  898. package/dist/tomes.js +94 -0
  899. package/dist/tomes.js.map +1 -0
  900. package/dist/trade.js +103 -0
  901. package/dist/trade.js.map +1 -0
  902. package/dist/transport.d.ts +6 -1
  903. package/dist/transport.js +281 -0
  904. package/dist/transport.js.map +1 -0
  905. package/dist/tunables.d.ts +10 -3
  906. package/dist/tunables.js +56 -0
  907. package/dist/tunables.js.map +1 -0
  908. package/dist/unitResources.d.ts +67 -0
  909. package/dist/unitResources.js +266 -0
  910. package/dist/unitResources.js.map +1 -0
  911. package/dist/upkeep.d.ts +6 -1
  912. package/dist/upkeep.js +26 -0
  913. package/dist/upkeep.js.map +1 -0
  914. package/dist/veterancy.d.ts +8 -3
  915. package/dist/veterancy.js +131 -0
  916. package/dist/veterancy.js.map +1 -0
  917. package/dist/vision.d.ts +36 -0
  918. package/dist/vision.js +133 -0
  919. package/dist/vision.js.map +1 -0
  920. package/dist/walls.d.ts +1 -1
  921. package/dist/walls.js +278 -0
  922. package/dist/walls.js.map +1 -0
  923. package/dist/world.d.ts +606 -88
  924. package/dist/world.js +1263 -0
  925. package/dist/world.js.map +1 -0
  926. package/package.json +2 -2
  927. package/dist/ai.js.map +0 -1
  928. package/dist/attributes.d.ts +0 -66
  929. package/dist/brain-BvVdUhX8.js +0 -7659
  930. package/dist/brain-BvVdUhX8.js.map +0 -1
  931. package/dist/builds-C6LfgvEU.js +0 -460
  932. package/dist/builds-C6LfgvEU.js.map +0 -1
  933. package/dist/coreComponents-syuh2fPG.js +0 -5149
  934. package/dist/coreComponents-syuh2fPG.js.map +0 -1
  935. package/dist/debugCommands-CzjrSm66.js +0 -14739
  936. package/dist/debugCommands-CzjrSm66.js.map +0 -1
  937. package/dist/determinism-BCymQwiE.js +0 -518
  938. package/dist/determinism-BCymQwiE.js.map +0 -1
  939. package/dist/game-DiJEN-Ks.js +0 -5800
  940. package/dist/game-DiJEN-Ks.js.map +0 -1
  941. package/dist/index.js.map +0 -1
  942. package/dist/inspect-D9dWHmZ0.js.map +0 -1
  943. package/dist/local-Dkovq42k.js +0 -1379
  944. package/dist/local-Dkovq42k.js.map +0 -1
  945. package/dist/missionRules-C-bGxm0Q.js.map +0 -1
  946. package/dist/navigation-worker.js.map +0 -1
  947. package/dist/packs-g5thvmGn.js +0 -3199
  948. package/dist/packs-g5thvmGn.js.map +0 -1
  949. package/dist/profiles-B3NS9jwk.js.map +0 -1
  950. package/dist/server.js.map +0 -1
  951. package/dist/simulate-oXBiw1Ff.js.map +0 -1
package/dist/stats.d.ts CHANGED
@@ -2,7 +2,7 @@ import { type DamageType, type StatChange, type StatKey, type Stats } from './de
2
2
  import type { Entity } from './entity';
3
3
  import type { World } from './world';
4
4
  /**
5
- * What adds up a unit's stats in the sum: what a stat source is handed (`StatPart.add`)
5
+ * What adds up a unit's stats in the sum: what a stat source is handed (`StatField.add`)
6
6
  *
7
7
  * @beta
8
8
  */
@@ -19,15 +19,13 @@ export interface StatSum {
19
19
  *
20
20
  * @beta
21
21
  */
22
- export interface StatPart {
22
+ export interface StatField {
23
+ /** The stat field's id, unique among the stat fields of a game */
23
24
  readonly id: string;
25
+ /** A number that changes whenever what this field adds to the entity's stats changes, and is 0 when it adds nothing */
24
26
  stamp(entity: Entity): number;
27
+ /** Adds this field's part to the entity's stat sum */
25
28
  add(world: World, entity: Entity, sum: StatSum): void;
26
- /**
27
- * What it makes of the stats once everything else is added (research, the packs' parts, items, buffs, the `stats`
28
- * hook), read with `sum.get`: a hero's strength into health, in the attributes pack (`withAttributes`)
29
- */
30
- derive?(world: World, entity: Entity, sum: StatSum): void;
31
29
  }
32
30
  /**
33
31
  * Says the stats of an entity, or of every entity when none is said, are to be added up again the next time they are
@@ -58,7 +56,7 @@ export interface StatsCache {
58
56
  def: Entity['def'];
59
57
  night: boolean;
60
58
  owner: number;
61
- /** What each of the packs' stat sources stamped it with (`StatPart.stamp`), in their order */
59
+ /** What each of the packs' stat sources stamped it with (`StatField.stamp`), in their order */
62
60
  stamps: number[];
63
61
  upgradesVersion: number;
64
62
  /** `World.statsVersion` when it was worked out: `invalidateStats` for every entity moves it on */
@@ -76,7 +74,7 @@ export interface StatsCache {
76
74
  *
77
75
  * The result is shared and must not be changed. It stays the same object for as long as the stats stay the same.
78
76
  *
79
- * @beta
77
+ * @public
80
78
  */
81
79
  export declare function statsOf(world: World, entity: Entity): Readonly<Stats>;
82
80
  /**
@@ -88,21 +86,47 @@ export declare function statsOf(world: World, entity: Entity): Readonly<Stats>;
88
86
  export declare function refreshVitals(world: World, entity: Entity): void;
89
87
  /**
90
88
  * What is left of damage once the armor or the magic resist of the target had its say, as a part of it: 100 of it
91
- * halve what arrives, and below 0 it adds. The engine's formula: the game's is `world.rules.combat.mitigation`, which
92
- * is this unless the game says (penetration: `withMobaStats`)
89
+ * halve what arrives, and below 0 it adds. The engine's formula: the game's is `world.settings.combat.mitigation`, which
90
+ * is this unless the game says (penetration: `mobaStatsPack`)
93
91
  *
94
92
  * @beta
95
93
  */
96
94
  export declare function mitigation(type: DamageType, target: Readonly<Stats>): number;
97
95
  /**
98
- * How long an attack of the entity takes: from the start of the swing to the hit, and from one swing to the next. Of
99
- * its first attack, or the one at that place (`UnitTypeDef.attacks`), by the speed stat it reads (`AttackDef.stats`)
96
+ * The stat that makes damage of a type more or less for whoever takes it, on top of `incomingDamage`:
97
+ * `incomingMagicDamage` for magic. Flat names, not `incomingDamage.magic`: a stat is one number by its id, and the
98
+ * data's paths (`stats.incomingMagicDamage`) read a dot as a step into an object
99
+ *
100
+ * @beta
101
+ */
102
+ export declare const INCOMING_DAMAGE: Readonly<Record<DamageType, 'incomingPhysicalDamage' | 'incomingMagicDamage' | 'incomingTrueDamage'>>;
103
+ /**
104
+ * What damage is multiplied by for who deals it and who takes it, once armor or magic resist had their say and before
105
+ * shields: the source's `outgoingDamage`, and the target's `incomingDamage` with the part of the damage's own type
106
+ * (`incomingMagicDamage`), each side's parts added up and never below none, so that nothing turns damage into healing.
107
+ * The engine's formula: the game's is `world.settings.combat.damageScale`
108
+ *
109
+ * @beta
110
+ */
111
+ export declare function damageScale(type: DamageType, target: Readonly<Stats>, source?: Readonly<Stats>): number;
112
+ /**
113
+ * What healing is multiplied by for who gets it: its `incomingHealing` (-0.4: an anti-heal), never below none, so that
114
+ * nothing turns healing into harm. The engine's formula: the game's is `world.settings.combat.healingScale`
115
+ *
116
+ * @beta
117
+ */
118
+ export declare function healingScale(target: Readonly<Stats>): number;
119
+ /**
120
+ * How long an attack of the entity takes: from the start of the swing to the hit (the windup), from one swing to the
121
+ * next, and how long it is held after the hit (`AttackDef.recovery`). Of its first attack, or the one at that place
122
+ * (`UnitTypeDef.attacks`), by the speed stat it reads (`AttackDef.stats`)
100
123
  *
101
124
  * @beta
102
125
  */
103
126
  export declare function attackTiming(world: World, entity: Entity, weapon?: number): {
104
127
  swing: number;
105
128
  period: number;
129
+ recovery: number;
106
130
  };
107
131
  /**
108
132
  * Seconds an ability of the entity takes to be ready again
@@ -111,12 +135,14 @@ export declare function attackTiming(world: World, entity: Entity, weapon?: numb
111
135
  */
112
136
  export declare function cooldownOf(world: World, entity: Entity, seconds: number): number;
113
137
  /**
114
- * How long an attack takes, from the start of the swing to the hit, and from one swing to the next, for a unit
115
- * whose type attacks `base` times a second and that now attacks `speed` times. Undefined for what does not attack
138
+ * How long an attack takes, from the start of the swing to the hit (the windup), from one swing to the next, and how
139
+ * long the unit is held after the hit (`AttackDef.recovery`, 0 when left out), for a unit whose type attacks `base`
140
+ * times a second and that now attacks `speed` times. Undefined for what does not attack
116
141
  *
117
142
  * @beta
118
143
  */
119
- export declare function swingTiming(damagePoint: number, base: number, speed: number): {
144
+ export declare function swingTiming(damagePoint: number, base: number, speed: number, recovery?: number): {
120
145
  swing: number;
121
146
  period: number;
147
+ recovery: number;
122
148
  } | undefined;
package/dist/stats.js ADDED
@@ -0,0 +1,290 @@
1
+ import { clamp } from "./math.js";
2
+ import { at, baseStats } from "./defs.js";
3
+ import { inventorySlots, slotsOf } from "./inventory.js";
4
+ //#region src/stats.ts
5
+ /** Adds up everything that changes the stats of one unit */
6
+ var Sum = class {
7
+ flat;
8
+ /** Parts by stat, for the stats something changes by a part */
9
+ percent = {};
10
+ /** Slows are kept apart from what makes faster: resistance only weakens the former */
11
+ slow = 0;
12
+ constructor(base) {
13
+ this.flat = { ...base };
14
+ }
15
+ add(change, times = 1) {
16
+ for (const key in change.stats) this.flat[key] += change.stats[key] * times;
17
+ for (const key in change.percent) this.part(key, change.percent[key] * times);
18
+ }
19
+ addScaled(change, level, times = 1) {
20
+ for (const key in change.stats) this.flat[key] += at(change.stats[key], level) * times;
21
+ for (const key in change.percent) this.part(key, at(change.percent[key], level) * times);
22
+ }
23
+ get(key) {
24
+ return (this.flat[key] ?? 0) * Math.max(1 + (this.percent[key] ?? 0), 0);
25
+ }
26
+ part(key, value) {
27
+ if (key === "moveSpeed" && value < 0) this.slow += value;
28
+ else this.percent[key] = (this.percent[key] ?? 0) + value;
29
+ }
30
+ /** The stats, kept within what the rules of the game allow, and its own stats within their bounds */
31
+ result(game) {
32
+ const { flat, percent } = this;
33
+ const stats = flat;
34
+ for (const key in percent) {
35
+ const part = percent[key];
36
+ if (part !== 0) stats[key] *= Math.max(1 + part, 0);
37
+ }
38
+ game.settings.combat.clampStats(stats, game.settings);
39
+ const slowed = this.slow === 0 ? 1 : Math.max(1 + game.settings.combat.slowTaken(stats, this.slow), 0);
40
+ stats.moveSpeed = Math.max(stats.moveSpeed * slowed, 0);
41
+ for (const { id, min, max } of game.stats) stats[id] = clamp(stats[id], min ?? -Infinity, max ?? Infinity);
42
+ stats.health = Math.max(Math.round(stats.health), 1);
43
+ stats.mana = Math.max(Math.round(stats.mana), 0);
44
+ return stats;
45
+ }
46
+ };
47
+ /** Whether anything changes the stats a unit started with */
48
+ function changed(world, entity) {
49
+ if (entity.buffs.length > 0 || entity.has(inventorySlots) || world.hooks.has("stats")) return true;
50
+ for (const source of world.registry.statFields) if (source.stamp(entity) !== 0) return true;
51
+ return world.player(entity.owner).upgrades.size > 0;
52
+ }
53
+ /** Adds up the stats of an entity from scratch. Use `statsOf`, which only does this when something changed */
54
+ function computeStats(world, entity, night) {
55
+ const base = baseStats(entity.def, world.registry, night);
56
+ if (!changed(world, entity)) return base;
57
+ const sum = new Sum(base);
58
+ for (const [id, level] of world.player(entity.owner).upgrades) for (const effect of world.registry.upgrade(id).effects) if (!effect.units || (typeof effect.units === "function" ? effect.units(entity.def) : effect.units.includes(entity.def.id))) sum.add(effect, level);
59
+ for (const source of world.registry.statFields) source.add(world, entity, sum);
60
+ const slots = slotsOf(entity);
61
+ if (slots) for (const instance of slots) {
62
+ const bonus = instance && world.registry.item(instance.item).bonus;
63
+ if (bonus) sum.add(bonus);
64
+ }
65
+ for (const instance of entity.buffs) {
66
+ const def = world.registry.buff(instance.id);
67
+ sum.addScaled(def, instance.level, def.perStack ? instance.stacks ?? 1 : 1);
68
+ const own = def.change?.(world, entity, instance);
69
+ if (own) sum.add(own);
70
+ }
71
+ if (world.hooks.has("stats")) world.hooks.run("stats", {
72
+ entity,
73
+ base,
74
+ add: (change, times) => sum.add(change, times)
75
+ });
76
+ const stats = sum.result(world.registry);
77
+ if (entity.def.uses) stats.health = entity.def.uses;
78
+ return stats;
79
+ }
80
+ /**
81
+ * Says the stats of an entity, or of every entity when none is said, are to be added up again the next time they are
82
+ * asked for: what a `stats` hook or a buff's `change` reads changed (an ally came near, a flag of the game's). What
83
+ * the engine knows about (buffs, items, levels, research, the time of day) it notices by itself
84
+ *
85
+ * @beta
86
+ */
87
+ function invalidateStats(world, entity) {
88
+ if (entity) entity.statsCache = null;
89
+ else world.statsVersion++;
90
+ }
91
+ /** Whether the packs' stat sources stamp the entity as they did when its stats were worked out */
92
+ function sameStamps(stamps, world, entity) {
93
+ const sources = world.registry.statFields;
94
+ for (let i = 0; i < sources.length; i++) if (sources[i].stamp(entity) !== stamps[i]) return false;
95
+ return true;
96
+ }
97
+ /** Whether the stats in the cache were worked out from what the entity is right now */
98
+ function stillHolds(cache, world, entity, night) {
99
+ if (cache.def !== entity.def || cache.night !== night || cache.owner !== entity.owner || !sameStamps(cache.stamps, world, entity) || cache.upgradesVersion !== world.player(entity.owner).upgradesVersion || cache.statsVersion !== world.statsVersion) return false;
100
+ const { buffs } = entity;
101
+ if (buffs.length !== cache.buffIds.length) return false;
102
+ for (let i = 0; i < buffs.length; i++) {
103
+ const buff = buffs[i];
104
+ if (buff.id !== cache.buffIds[i] || buff.level !== cache.buffLevels[i] || (buff.stacks ?? 0) !== cache.buffStacks[i]) return false;
105
+ }
106
+ const slots = slotsOf(entity);
107
+ if (!slots) return cache.items.length === 0;
108
+ let carried = 0;
109
+ for (let i = 0; i < slots.length; i++) {
110
+ const item = slots[i];
111
+ if (!item) continue;
112
+ if (item.item !== cache.items[carried]) return false;
113
+ carried++;
114
+ }
115
+ return carried === cache.items.length;
116
+ }
117
+ function buildCache(world, entity, night) {
118
+ const items = [];
119
+ const slots = slotsOf(entity);
120
+ if (slots) {
121
+ for (const item of slots) if (item) items.push(item.item);
122
+ }
123
+ return {
124
+ stats: computeStats(world, entity, night),
125
+ def: entity.def,
126
+ night,
127
+ owner: entity.owner,
128
+ stamps: world.registry.statFields.map((source) => source.stamp(entity)),
129
+ upgradesVersion: world.player(entity.owner).upgradesVersion,
130
+ statsVersion: world.statsVersion,
131
+ items,
132
+ buffIds: entity.buffs.map((buff) => buff.id),
133
+ buffLevels: entity.buffs.map((buff) => buff.level),
134
+ buffStacks: entity.buffs.map((buff) => buff.stacks ?? 0)
135
+ };
136
+ }
137
+ /**
138
+ * The stats of an entity as they are right now: what its type starts with at this time of day, and on top of that
139
+ * its levels, the research of its owner, what it carries and the buffs on it.
140
+ *
141
+ * The result is shared and must not be changed. It stays the same object for as long as the stats stay the same.
142
+ *
143
+ * @public
144
+ */
145
+ function statsOf(world, entity) {
146
+ const night = world.night;
147
+ const cache = entity.statsCache;
148
+ if (cache && stillHolds(cache, world, entity, night)) {
149
+ if (world.checks.stats) checkCache(world, entity, night, cache.stats);
150
+ return cache.stats;
151
+ }
152
+ entity.statsCache = buildCache(world, entity, night);
153
+ return entity.statsCache.stats;
154
+ }
155
+ function checkCache(world, entity, night, cached) {
156
+ const fresh = computeStats(world, entity, night);
157
+ for (const key in fresh) {
158
+ const k = key;
159
+ if (fresh[k] !== cached[k]) throw new Error(`Stale stats cache: ${entity.def.id}#${entity.id} has ${key} ${cached[k]}, should be ${fresh[k]}`);
160
+ }
161
+ }
162
+ /**
163
+ * The stats that are not what the type of the entity starts with by day, or undefined when all of them are
164
+ *
165
+ * @internal
166
+ */
167
+ function changedStats(world, entity) {
168
+ const base = baseStats(entity.def, world.registry);
169
+ const stats = statsOf(world, entity);
170
+ if (stats === base) return void 0;
171
+ const cache = entity.statsCache;
172
+ if (cache.changedFor === stats) return cache.changed;
173
+ let result;
174
+ for (const key in stats) if (stats[key] !== base[key]) (result ??= {})[key] = stats[key];
175
+ cache.changed = result;
176
+ cache.changedFor = stats;
177
+ return result;
178
+ }
179
+ /**
180
+ * Brings the most health and mana an entity can have in line with its stats.
181
+ * What is gained is added to what it has, what is lost is only taken when it has more than it can hold.
182
+ *
183
+ * @beta
184
+ */
185
+ function refreshVitals(world, entity) {
186
+ const stats = statsOf(world, entity);
187
+ if (stats.health !== entity.maxHealth) {
188
+ entity.health = Math.min(entity.health + Math.max(stats.health - entity.maxHealth, 0), stats.health);
189
+ entity.maxHealth = stats.health;
190
+ }
191
+ if (stats.mana !== entity.maxMana) {
192
+ entity.mana = Math.min(entity.mana + Math.max(stats.mana - entity.maxMana, 0), stats.mana);
193
+ entity.maxMana = stats.mana;
194
+ }
195
+ }
196
+ /**
197
+ * What is left of damage once the armor or the magic resist of the target had its say, as a part of it: 100 of it
198
+ * halve what arrives, and below 0 it adds. The engine's formula: the game's is `world.settings.combat.mitigation`, which
199
+ * is this unless the game says (penetration: `mobaStatsPack`)
200
+ *
201
+ * @beta
202
+ */
203
+ function mitigation(type, target) {
204
+ if (type === "true") return 1;
205
+ return resisted(type === "physical" ? target.armor : target.magicResist);
206
+ }
207
+ /**
208
+ * The stat that makes damage of a type more or less for whoever takes it, on top of `incomingDamage`:
209
+ * `incomingMagicDamage` for magic. Flat names, not `incomingDamage.magic`: a stat is one number by its id, and the
210
+ * data's paths (`stats.incomingMagicDamage`) read a dot as a step into an object
211
+ *
212
+ * @beta
213
+ */
214
+ var INCOMING_DAMAGE = Object.freeze({
215
+ physical: "incomingPhysicalDamage",
216
+ magic: "incomingMagicDamage",
217
+ true: "incomingTrueDamage"
218
+ });
219
+ /**
220
+ * What damage is multiplied by for who deals it and who takes it, once armor or magic resist had their say and before
221
+ * shields: the source's `outgoingDamage`, and the target's `incomingDamage` with the part of the damage's own type
222
+ * (`incomingMagicDamage`), each side's parts added up and never below none, so that nothing turns damage into healing.
223
+ * The engine's formula: the game's is `world.settings.combat.damageScale`
224
+ *
225
+ * @beta
226
+ */
227
+ function damageScale(type, target, source) {
228
+ return Math.max(1 + (target.incomingDamage ?? 0) + (target[INCOMING_DAMAGE[type]] ?? 0), 0) * (source ? Math.max(1 + (source.outgoingDamage ?? 0), 0) : 1);
229
+ }
230
+ /**
231
+ * What healing is multiplied by for who gets it: its `incomingHealing` (-0.4: an anti-heal), never below none, so that
232
+ * nothing turns healing into harm. The engine's formula: the game's is `world.settings.combat.healingScale`
233
+ *
234
+ * @beta
235
+ */
236
+ function healingScale(target) {
237
+ return Math.max(1 + (target.incomingHealing ?? 0), 0);
238
+ }
239
+ /**
240
+ * What is left of damage against a resistance: 100 of it halve what arrives, below 0 it adds
241
+ *
242
+ * @internal
243
+ */
244
+ var resisted = (resist) => resist >= 0 ? 100 / (100 + resist) : 2 - 100 / (100 - resist);
245
+ /**
246
+ * How long an attack of the entity takes: from the start of the swing to the hit (the windup), from one swing to the
247
+ * next, and how long it is held after the hit (`AttackDef.recovery`). Of its first attack, or the one at that place
248
+ * (`UnitTypeDef.attacks`), by the speed stat it reads (`AttackDef.stats`)
249
+ *
250
+ * @beta
251
+ */
252
+ function attackTiming(world, entity, weapon = 0) {
253
+ const attack = entity.def.attacks?.[weapon];
254
+ const speed = attack?.stats?.speed ?? "attackSpeed";
255
+ const base = baseStats(entity.def, world.registry)[speed] ?? 0;
256
+ return swingTiming(attack?.damagePoint ?? 0, base, statsOf(world, entity)[speed] ?? 0, attack?.recovery) ?? {
257
+ swing: 0,
258
+ period: Infinity,
259
+ recovery: 0
260
+ };
261
+ }
262
+ /**
263
+ * Seconds an ability of the entity takes to be ready again
264
+ *
265
+ * @beta
266
+ */
267
+ function cooldownOf(world, entity, seconds) {
268
+ return world.settings.combat.cooldown(seconds, statsOf(world, entity));
269
+ }
270
+ /**
271
+ * How long an attack takes, from the start of the swing to the hit (the windup), from one swing to the next, and how
272
+ * long the unit is held after the hit (`AttackDef.recovery`, 0 when left out), for a unit whose type attacks `base`
273
+ * times a second and that now attacks `speed` times. Undefined for what does not attack
274
+ *
275
+ * @beta
276
+ */
277
+ function swingTiming(damagePoint, base, speed, recovery = 0) {
278
+ if (!speed || !base) return void 0;
279
+ const period = 1 / speed;
280
+ const swing = Math.min(damagePoint * base / speed, period);
281
+ return {
282
+ swing,
283
+ period,
284
+ recovery: recovery > 0 ? Math.min(recovery * base / speed, period - swing) : 0
285
+ };
286
+ }
287
+ //#endregion
288
+ export { INCOMING_DAMAGE, attackTiming, changedStats, cooldownOf, damageScale, healingScale, invalidateStats, mitigation, refreshVitals, resisted, statsOf, swingTiming };
289
+
290
+ //# sourceMappingURL=stats.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stats.js","names":[],"sources":["../src/stats.ts"],"sourcesContent":["import { inventorySlots, slotsOf } from './inventory'\nimport { at, baseStats, type DamageType, type ScaledStatChange, type StatChange, type StatKey, type Stats } from './defs'\nimport type { Entity } from './entity'\nimport { clamp } from './math'\nimport type { Registry } from './registry'\nimport type { World } from './world'\n\n/** Adds up everything that changes the stats of one unit */\nclass Sum {\n\treadonly flat: Stats\n\t/** Parts by stat, for the stats something changes by a part */\n\treadonly percent: Record<string, number> = {}\n\t/** Slows are kept apart from what makes faster: resistance only weakens the former */\n\tslow = 0\n\n\tconstructor(base: Readonly<Stats>) {\n\t\tthis.flat = { ...base }\n\t}\n\n\tadd(change: StatChange, times = 1): void {\n\t\tfor (const key in change.stats) this.flat[key as StatKey] += change.stats[key as StatKey]! * times\n\t\tfor (const key in change.percent) this.part(key as StatKey, change.percent[key as StatKey]! * times)\n\t}\n\n\taddScaled(change: ScaledStatChange, level: number, times = 1): void {\n\t\tfor (const key in change.stats) this.flat[key as StatKey] += at(change.stats[key as StatKey], level) * times\n\t\tfor (const key in change.percent) this.part(key as StatKey, at(change.percent[key as StatKey], level) * times)\n\t}\n\n\tget(key: StatKey): number {\n\t\treturn (this.flat[key] ?? 0) * Math.max(1 + (this.percent[key] ?? 0), 0)\n\t}\n\n\tprivate part(key: StatKey, value: number): void {\n\t\tif (key === 'moveSpeed' && value < 0) this.slow += value\n\t\telse this.percent[key] = (this.percent[key] ?? 0) + value\n\t}\n\n\t/** The stats, kept within what the rules of the game allow, and its own stats within their bounds */\n\tresult(game: Registry): Stats {\n\t\tconst { flat, percent } = this\n\t\tconst stats = flat\n\t\tfor (const key in percent) {\n\t\t\tconst part = percent[key]\n\t\t\tif (part !== 0) stats[key] *= Math.max(1 + part, 0)\n\t\t}\n\t\tgame.settings.combat.clampStats(stats, game.settings)\n\t\tconst slowed = this.slow === 0 ? 1 : Math.max(1 + game.settings.combat.slowTaken(stats, this.slow), 0)\n\t\tstats.moveSpeed = Math.max(stats.moveSpeed * slowed, 0)\n\t\tfor (const { id, min, max } of game.stats) stats[id] = clamp(stats[id], min ?? -Infinity, max ?? Infinity)\n\t\tstats.health = Math.max(Math.round(stats.health), 1)\n\t\tstats.mana = Math.max(Math.round(stats.mana), 0)\n\t\treturn stats\n\t}\n}\n\n/**\n * What adds up a unit's stats in the sum: what a stat source is handed (`StatField.add`)\n *\n * @beta\n */\nexport interface StatSum {\n\t/** Adds a change to the stats, `times` over (1 when left out) */\n\tadd(change: StatChange, times?: number): void\n\t/** What a stat comes to so far: all that was added to it, by the parts it was made bigger or smaller by */\n\tget(stat: StatKey): number\n}\n\n/**\n * A part of the stats a pack adds (`GamePack.stats`): a hero's growth by its level, in the heroes pack. `stamp` is a\n * number that changes whenever what it adds does, and is 0 when it adds nothing: the stats are added up again when it\n * changes, however it changed (a game that sets a hero's level itself says nothing, and need not)\n *\n * @beta\n */\nexport interface StatField {\n\t/** The stat field's id, unique among the stat fields of a game */\n\treadonly id: string\n\t/** A number that changes whenever what this field adds to the entity's stats changes, and is 0 when it adds nothing */\n\tstamp(entity: Entity): number\n\t/** Adds this field's part to the entity's stat sum */\n\tadd(world: World, entity: Entity, sum: StatSum): void\n}\n\n/** Whether anything changes the stats a unit started with */\nfunction changed(world: World, entity: Entity): boolean {\n\tif (entity.buffs.length > 0 || entity.has(inventorySlots) || world.hooks.has('stats')) return true\n\tfor (const source of world.registry.statFields) if (source.stamp(entity) !== 0) return true\n\treturn world.player(entity.owner).upgrades.size > 0\n}\n\n/** Adds up the stats of an entity from scratch. Use `statsOf`, which only does this when something changed */\nfunction computeStats(world: World, entity: Entity, night: boolean): Readonly<Stats> {\n\tconst base = baseStats(entity.def, world.registry, night)\n\tif (!changed(world, entity)) return base\n\n\tconst sum = new Sum(base)\n\tfor (const [id, level] of world.player(entity.owner).upgrades) {\n\t\tfor (const effect of world.registry.upgrade(id).effects) {\n\t\t\tif (!effect.units || (typeof effect.units === 'function' ? effect.units(entity.def) : effect.units.includes(entity.def.id)))\n\t\t\t\tsum.add(effect, level)\n\t\t}\n\t}\n\t// what the packs add: a hero's growth by its level\n\tfor (const source of world.registry.statFields) source.add(world, entity, sum)\n\tconst slots = slotsOf(entity)\n\tif (slots) {\n\t\tfor (const instance of slots) {\n\t\t\tconst bonus = instance && world.registry.item(instance.item).bonus\n\t\t\tif (bonus) sum.add(bonus)\n\t\t}\n\t}\n\tfor (const instance of entity.buffs) {\n\t\tconst def = world.registry.buff(instance.id)\n\t\tsum.addScaled(def, instance.level, def.perStack ? (instance.stacks ?? 1) : 1)\n\t\tconst own = def.change?.(world, entity, instance)\n\t\tif (own) sum.add(own)\n\t}\n\t// and whatever the game adds in code: \"+2 armor for each ally near\"\n\tif (world.hooks.has('stats')) world.hooks.run('stats', { entity, base, add: (change, times) => sum.add(change, times) })\n\tconst stats = sum.result(world.registry)\n\t// a unit whose health counts hits keeps that many, whatever adds health\n\tif (entity.def.uses) stats.health = entity.def.uses\n\treturn stats\n}\n\n/**\n * Says the stats of an entity, or of every entity when none is said, are to be added up again the next time they are\n * asked for: what a `stats` hook or a buff's `change` reads changed (an ally came near, a flag of the game's). What\n * the engine knows about (buffs, items, levels, research, the time of day) it notices by itself\n *\n * @beta\n */\nexport function invalidateStats(world: World, entity?: Entity): void {\n\tif (entity) entity.statsCache = null\n\telse world.statsVersion++\n}\n\n/**\n * The stats of an entity the last time they were worked out, and everything they were worked out from.\n *\n * Stats are asked for all the time: on every hit (for both sides), every target search, every fog update.\n * Adding them up means going through the owner's research, what the unit carries and every buff on it,\n * and allocates. Checking whether any of that changed is a handful of comparisons and allocates nothing,\n * so `statsOf` does that first and only adds up again when something did.\n *\n * The inputs are compared, rather than the cache being thrown away wherever they change, so that nothing\n * can change a buff or an item and forget to say so: game modules and mods change them directly.\n *\n * Not game state: it can be dropped at any time (and is never saved or sent), it is rebuilt on the next ask.\n */\nexport interface StatsCache {\n\tstats: Readonly<Stats>\n\t/** `changedStats` of `stats`, once someone asked. The same object for as long as the stats stay the same */\n\tchanged?: Partial<Stats>\n\tchangedFor?: Readonly<Stats>\n\n\tdef: Entity['def']\n\tnight: boolean\n\towner: number\n\t/** What each of the packs' stat sources stamped it with (`StatField.stamp`), in their order */\n\tstamps: number[]\n\tupgradesVersion: number\n\t/** `World.statsVersion` when it was worked out: `invalidateStats` for every entity moves it on */\n\tstatsVersion: number\n\t/** Ids of what it carries, in slot order, empty slots left out */\n\titems: string[]\n\t/** Id, level and stacks of every buff, in order */\n\tbuffIds: string[]\n\tbuffLevels: number[]\n\tbuffStacks: number[]\n}\n\n/** Whether the packs' stat sources stamp the entity as they did when its stats were worked out */\nfunction sameStamps(stamps: number[], world: World, entity: Entity): boolean {\n\tconst sources = world.registry.statFields\n\tfor (let i = 0; i < sources.length; i++) if (sources[i].stamp(entity) !== stamps[i]) return false\n\treturn true\n}\n\n/** Whether the stats in the cache were worked out from what the entity is right now */\nfunction stillHolds(cache: StatsCache, world: World, entity: Entity, night: boolean): boolean {\n\tif (\n\t\tcache.def !== entity.def ||\n\t\tcache.night !== night ||\n\t\tcache.owner !== entity.owner ||\n\t\t!sameStamps(cache.stamps, world, entity) ||\n\t\tcache.upgradesVersion !== world.player(entity.owner).upgradesVersion ||\n\t\tcache.statsVersion !== world.statsVersion\n\t) {\n\t\treturn false\n\t}\n\tconst { buffs } = entity\n\tif (buffs.length !== cache.buffIds.length) return false\n\tfor (let i = 0; i < buffs.length; i++) {\n\t\tconst buff = buffs[i]\n\t\tif (buff.id !== cache.buffIds[i] || buff.level !== cache.buffLevels[i] || (buff.stacks ?? 0) !== cache.buffStacks[i]) return false\n\t}\n\t// asked of every unit many times a tick: what carries nothing makes no empty list to go through\n\tconst slots = slotsOf(entity)\n\tif (!slots) return cache.items.length === 0\n\tlet carried = 0\n\tfor (let i = 0; i < slots.length; i++) {\n\t\tconst item = slots[i]\n\t\tif (!item) continue\n\t\tif (item.item !== cache.items[carried]) return false\n\t\tcarried++\n\t}\n\treturn carried === cache.items.length\n}\n\nfunction buildCache(world: World, entity: Entity, night: boolean): StatsCache {\n\tconst items: string[] = []\n\tconst slots = slotsOf(entity)\n\tif (slots) for (const item of slots) if (item) items.push(item.item)\n\treturn {\n\t\tstats: computeStats(world, entity, night),\n\t\tdef: entity.def,\n\t\tnight,\n\t\towner: entity.owner,\n\t\tstamps: world.registry.statFields.map((source) => source.stamp(entity)),\n\t\tupgradesVersion: world.player(entity.owner).upgradesVersion,\n\t\tstatsVersion: world.statsVersion,\n\t\titems,\n\t\tbuffIds: entity.buffs.map((buff) => buff.id),\n\t\tbuffLevels: entity.buffs.map((buff) => buff.level),\n\t\tbuffStacks: entity.buffs.map((buff) => buff.stacks ?? 0)\n\t}\n}\n\n/**\n * The stats of an entity as they are right now: what its type starts with at this time of day, and on top of that\n * its levels, the research of its owner, what it carries and the buffs on it.\n *\n * The result is shared and must not be changed. It stays the same object for as long as the stats stay the same.\n *\n * @public\n */\nexport function statsOf(world: World, entity: Entity): Readonly<Stats> {\n\tconst night = world.night\n\tconst cache = entity.statsCache\n\tif (cache && stillHolds(cache, world, entity, night)) {\n\t\tif (world.checks.stats) checkCache(world, entity, night, cache.stats)\n\t\treturn cache.stats\n\t}\n\tentity.statsCache = buildCache(world, entity, night)\n\treturn entity.statsCache.stats\n}\n\nfunction checkCache(world: World, entity: Entity, night: boolean, cached: Readonly<Stats>): void {\n\tconst fresh = computeStats(world, entity, night)\n\tfor (const key in fresh) {\n\t\tconst k = key as StatKey\n\t\tif (fresh[k] !== cached[k]) {\n\t\t\tthrow new Error(`Stale stats cache: ${entity.def.id}#${entity.id} has ${key} ${cached[k]}, should be ${fresh[k]}`)\n\t\t}\n\t}\n}\n\n/**\n * The stats that are not what the type of the entity starts with by day, or undefined when all of them are\n *\n * @internal\n */\nexport function changedStats(world: World, entity: Entity): Partial<Stats> | undefined {\n\tconst base = baseStats(entity.def, world.registry)\n\tconst stats = statsOf(world, entity)\n\tif (stats === base) return undefined\n\t// the same stats give the same answer, as the same object: whoever keeps it (the client does) can tell nothing changed\n\tconst cache = entity.statsCache!\n\tif (cache.changedFor === stats) return cache.changed\n\tlet result: Partial<Stats> | undefined\n\tfor (const key in stats) {\n\t\tif (stats[key as StatKey] !== base[key as StatKey]) (result ??= {})[key as StatKey] = stats[key as StatKey]\n\t}\n\tcache.changed = result\n\tcache.changedFor = stats\n\treturn result\n}\n\n/**\n * Brings the most health and mana an entity can have in line with its stats.\n * What is gained is added to what it has, what is lost is only taken when it has more than it can hold.\n *\n * @beta\n */\nexport function refreshVitals(world: World, entity: Entity): void {\n\tconst stats = statsOf(world, entity)\n\tif (stats.health !== entity.maxHealth) {\n\t\tentity.health = Math.min(entity.health + Math.max(stats.health - entity.maxHealth, 0), stats.health)\n\t\tentity.maxHealth = stats.health\n\t}\n\tif (stats.mana !== entity.maxMana) {\n\t\tentity.mana = Math.min(entity.mana + Math.max(stats.mana - entity.maxMana, 0), stats.mana)\n\t\tentity.maxMana = stats.mana\n\t}\n}\n\n/**\n * What is left of damage once the armor or the magic resist of the target had its say, as a part of it: 100 of it\n * halve what arrives, and below 0 it adds. The engine's formula: the game's is `world.settings.combat.mitigation`, which\n * is this unless the game says (penetration: `mobaStatsPack`)\n *\n * @beta\n */\nexport function mitigation(type: DamageType, target: Readonly<Stats>): number {\n\tif (type === 'true') return 1\n\treturn resisted(type === 'physical' ? target.armor : target.magicResist)\n}\n\n/**\n * The stat that makes damage of a type more or less for whoever takes it, on top of `incomingDamage`:\n * `incomingMagicDamage` for magic. Flat names, not `incomingDamage.magic`: a stat is one number by its id, and the\n * data's paths (`stats.incomingMagicDamage`) read a dot as a step into an object\n *\n * @beta\n */\nexport const INCOMING_DAMAGE: Readonly<Record<DamageType, 'incomingPhysicalDamage' | 'incomingMagicDamage' | 'incomingTrueDamage'>> = Object.freeze({\n\tphysical: 'incomingPhysicalDamage',\n\tmagic: 'incomingMagicDamage',\n\ttrue: 'incomingTrueDamage'\n})\n\n/**\n * What damage is multiplied by for who deals it and who takes it, once armor or magic resist had their say and before\n * shields: the source's `outgoingDamage`, and the target's `incomingDamage` with the part of the damage's own type\n * (`incomingMagicDamage`), each side's parts added up and never below none, so that nothing turns damage into healing.\n * The engine's formula: the game's is `world.settings.combat.damageScale`\n *\n * @beta\n */\nexport function damageScale(type: DamageType, target: Readonly<Stats>, source?: Readonly<Stats>): number {\n\tconst taken = Math.max(1 + (target.incomingDamage ?? 0) + (target[INCOMING_DAMAGE[type]] ?? 0), 0)\n\tconst dealt = source ? Math.max(1 + (source.outgoingDamage ?? 0), 0) : 1\n\treturn taken * dealt\n}\n\n/**\n * What healing is multiplied by for who gets it: its `incomingHealing` (-0.4: an anti-heal), never below none, so that\n * nothing turns healing into harm. The engine's formula: the game's is `world.settings.combat.healingScale`\n *\n * @beta\n */\nexport function healingScale(target: Readonly<Stats>): number {\n\treturn Math.max(1 + (target.incomingHealing ?? 0), 0)\n}\n\n/**\n * What is left of damage against a resistance: 100 of it halve what arrives, below 0 it adds\n *\n * @internal\n */\nexport const resisted = (resist: number): number => (resist >= 0 ? 100 / (100 + resist) : 2 - 100 / (100 - resist))\n\n/**\n * How long an attack of the entity takes: from the start of the swing to the hit (the windup), from one swing to the\n * next, and how long it is held after the hit (`AttackDef.recovery`). Of its first attack, or the one at that place\n * (`UnitTypeDef.attacks`), by the speed stat it reads (`AttackDef.stats`)\n *\n * @beta\n */\nexport function attackTiming(world: World, entity: Entity, weapon = 0): { swing: number; period: number; recovery: number } {\n\tconst attack = entity.def.attacks?.[weapon]\n\tconst speed = attack?.stats?.speed ?? 'attackSpeed'\n\tconst base = baseStats(entity.def, world.registry)[speed] ?? 0\n\treturn (\n\t\tswingTiming(attack?.damagePoint ?? 0, base, statsOf(world, entity)[speed] ?? 0, attack?.recovery) ?? { swing: 0, period: Infinity, recovery: 0 }\n\t)\n}\n\n/**\n * Seconds an ability of the entity takes to be ready again\n *\n * @beta\n */\nexport function cooldownOf(world: World, entity: Entity, seconds: number): number {\n\treturn world.settings.combat.cooldown(seconds, statsOf(world, entity))\n}\n\n/**\n * How long an attack takes, from the start of the swing to the hit (the windup), from one swing to the next, and how\n * long the unit is held after the hit (`AttackDef.recovery`, 0 when left out), for a unit whose type attacks `base`\n * times a second and that now attacks `speed` times. Undefined for what does not attack\n *\n * @beta\n */\nexport function swingTiming(\n\tdamagePoint: number,\n\tbase: number,\n\tspeed: number,\n\trecovery = 0\n): { swing: number; period: number; recovery: number } | undefined {\n\tif (!speed || !base) return undefined\n\tconst period = 1 / speed\n\t// the swing gets faster with the attack, and so does the recovery, which ends at the next swing at the latest\n\tconst swing = Math.min((damagePoint * base) / speed, period)\n\treturn { swing, period, recovery: recovery > 0 ? Math.min((recovery * base) / speed, period - swing) : 0 }\n}\n"],"mappings":";;;;;AAQA,IAAM,MAAN,MAAU;CACT;;CAEA,UAA2C,CAAC;;CAE5C,OAAO;CAEP,YAAY,MAAuB;EAClC,KAAK,OAAO,EAAE,GAAG,KAAK;CACvB;CAEA,IAAI,QAAoB,QAAQ,GAAS;EACxC,KAAK,MAAM,OAAO,OAAO,OAAO,KAAK,KAAK,QAAmB,OAAO,MAAM,OAAmB;EAC7F,KAAK,MAAM,OAAO,OAAO,SAAS,KAAK,KAAK,KAAgB,OAAO,QAAQ,OAAmB,KAAK;CACpG;CAEA,UAAU,QAA0B,OAAe,QAAQ,GAAS;EACnE,KAAK,MAAM,OAAO,OAAO,OAAO,KAAK,KAAK,QAAmB,GAAG,OAAO,MAAM,MAAiB,KAAK,IAAI;EACvG,KAAK,MAAM,OAAO,OAAO,SAAS,KAAK,KAAK,KAAgB,GAAG,OAAO,QAAQ,MAAiB,KAAK,IAAI,KAAK;CAC9G;CAEA,IAAI,KAAsB;EACzB,QAAQ,KAAK,KAAK,QAAQ,KAAK,KAAK,IAAI,KAAK,KAAK,QAAQ,QAAQ,IAAI,CAAC;CACxE;CAEA,KAAa,KAAc,OAAqB;EAC/C,IAAI,QAAQ,eAAe,QAAQ,GAAG,KAAK,QAAQ;OAC9C,KAAK,QAAQ,QAAQ,KAAK,QAAQ,QAAQ,KAAK;CACrD;;CAGA,OAAO,MAAuB;EAC7B,MAAM,EAAE,MAAM,YAAY;EAC1B,MAAM,QAAQ;EACd,KAAK,MAAM,OAAO,SAAS;GAC1B,MAAM,OAAO,QAAQ;GACrB,IAAI,SAAS,GAAG,MAAM,QAAQ,KAAK,IAAI,IAAI,MAAM,CAAC;EACnD;EACA,KAAK,SAAS,OAAO,WAAW,OAAO,KAAK,QAAQ;EACpD,MAAM,SAAS,KAAK,SAAS,IAAI,IAAI,KAAK,IAAI,IAAI,KAAK,SAAS,OAAO,UAAU,OAAO,KAAK,IAAI,GAAG,CAAC;EACrG,MAAM,YAAY,KAAK,IAAI,MAAM,YAAY,QAAQ,CAAC;EACtD,KAAK,MAAM,EAAE,IAAI,KAAK,SAAS,KAAK,OAAO,MAAM,MAAM,MAAM,MAAM,KAAK,OAAO,WAAW,OAAO,QAAQ;EACzG,MAAM,SAAS,KAAK,IAAI,KAAK,MAAM,MAAM,MAAM,GAAG,CAAC;EACnD,MAAM,OAAO,KAAK,IAAI,KAAK,MAAM,MAAM,IAAI,GAAG,CAAC;EAC/C,OAAO;CACR;AACD;;AA+BA,SAAS,QAAQ,OAAc,QAAyB;CACvD,IAAI,OAAO,MAAM,SAAS,KAAK,OAAO,IAAI,cAAc,KAAK,MAAM,MAAM,IAAI,OAAO,GAAG,OAAO;CAC9F,KAAK,MAAM,UAAU,MAAM,SAAS,YAAY,IAAI,OAAO,MAAM,MAAM,MAAM,GAAG,OAAO;CACvF,OAAO,MAAM,OAAO,OAAO,KAAK,CAAC,CAAC,SAAS,OAAO;AACnD;;AAGA,SAAS,aAAa,OAAc,QAAgB,OAAiC;CACpF,MAAM,OAAO,UAAU,OAAO,KAAK,MAAM,UAAU,KAAK;CACxD,IAAI,CAAC,QAAQ,OAAO,MAAM,GAAG,OAAO;CAEpC,MAAM,MAAM,IAAI,IAAI,IAAI;CACxB,KAAK,MAAM,CAAC,IAAI,UAAU,MAAM,OAAO,OAAO,KAAK,CAAC,CAAC,UACpD,KAAK,MAAM,UAAU,MAAM,SAAS,QAAQ,EAAE,CAAC,CAAC,SAC/C,IAAI,CAAC,OAAO,UAAU,OAAO,OAAO,UAAU,aAAa,OAAO,MAAM,OAAO,GAAG,IAAI,OAAO,MAAM,SAAS,OAAO,IAAI,EAAE,IACxH,IAAI,IAAI,QAAQ,KAAK;CAIxB,KAAK,MAAM,UAAU,MAAM,SAAS,YAAY,OAAO,IAAI,OAAO,QAAQ,GAAG;CAC7E,MAAM,QAAQ,QAAQ,MAAM;CAC5B,IAAI,OACH,KAAK,MAAM,YAAY,OAAO;EAC7B,MAAM,QAAQ,YAAY,MAAM,SAAS,KAAK,SAAS,IAAI,CAAC,CAAC;EAC7D,IAAI,OAAO,IAAI,IAAI,KAAK;CACzB;CAED,KAAK,MAAM,YAAY,OAAO,OAAO;EACpC,MAAM,MAAM,MAAM,SAAS,KAAK,SAAS,EAAE;EAC3C,IAAI,UAAU,KAAK,SAAS,OAAO,IAAI,WAAY,SAAS,UAAU,IAAK,CAAC;EAC5E,MAAM,MAAM,IAAI,SAAS,OAAO,QAAQ,QAAQ;EAChD,IAAI,KAAK,IAAI,IAAI,GAAG;CACrB;CAEA,IAAI,MAAM,MAAM,IAAI,OAAO,GAAG,MAAM,MAAM,IAAI,SAAS;EAAE;EAAQ;EAAM,MAAM,QAAQ,UAAU,IAAI,IAAI,QAAQ,KAAK;CAAE,CAAC;CACvH,MAAM,QAAQ,IAAI,OAAO,MAAM,QAAQ;CAEvC,IAAI,OAAO,IAAI,MAAM,MAAM,SAAS,OAAO,IAAI;CAC/C,OAAO;AACR;;;;;;;;AASA,SAAgB,gBAAgB,OAAc,QAAuB;CACpE,IAAI,QAAQ,OAAO,aAAa;MAC3B,MAAM;AACZ;;AAsCA,SAAS,WAAW,QAAkB,OAAc,QAAyB;CAC5E,MAAM,UAAU,MAAM,SAAS;CAC/B,KAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK,IAAI,QAAQ,EAAE,CAAC,MAAM,MAAM,MAAM,OAAO,IAAI,OAAO;CAC5F,OAAO;AACR;;AAGA,SAAS,WAAW,OAAmB,OAAc,QAAgB,OAAyB;CAC7F,IACC,MAAM,QAAQ,OAAO,OACrB,MAAM,UAAU,SAChB,MAAM,UAAU,OAAO,SACvB,CAAC,WAAW,MAAM,QAAQ,OAAO,MAAM,KACvC,MAAM,oBAAoB,MAAM,OAAO,OAAO,KAAK,CAAC,CAAC,mBACrD,MAAM,iBAAiB,MAAM,cAE7B,OAAO;CAER,MAAM,EAAE,UAAU;CAClB,IAAI,MAAM,WAAW,MAAM,QAAQ,QAAQ,OAAO;CAClD,KAAK,IAAI,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;EACtC,MAAM,OAAO,MAAM;EACnB,IAAI,KAAK,OAAO,MAAM,QAAQ,MAAM,KAAK,UAAU,MAAM,WAAW,OAAO,KAAK,UAAU,OAAO,MAAM,WAAW,IAAI,OAAO;CAC9H;CAEA,MAAM,QAAQ,QAAQ,MAAM;CAC5B,IAAI,CAAC,OAAO,OAAO,MAAM,MAAM,WAAW;CAC1C,IAAI,UAAU;CACd,KAAK,IAAI,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;EACtC,MAAM,OAAO,MAAM;EACnB,IAAI,CAAC,MAAM;EACX,IAAI,KAAK,SAAS,MAAM,MAAM,UAAU,OAAO;EAC/C;CACD;CACA,OAAO,YAAY,MAAM,MAAM;AAChC;AAEA,SAAS,WAAW,OAAc,QAAgB,OAA4B;CAC7E,MAAM,QAAkB,CAAC;CACzB,MAAM,QAAQ,QAAQ,MAAM;CAC5B,IAAI,OAAY;OAAA,MAAM,QAAQ,OAAO,IAAI,MAAM,MAAM,KAAK,KAAK,IAAI;CAAA;CACnE,OAAO;EACN,OAAO,aAAa,OAAO,QAAQ,KAAK;EACxC,KAAK,OAAO;EACZ;EACA,OAAO,OAAO;EACd,QAAQ,MAAM,SAAS,WAAW,KAAK,WAAW,OAAO,MAAM,MAAM,CAAC;EACtE,iBAAiB,MAAM,OAAO,OAAO,KAAK,CAAC,CAAC;EAC5C,cAAc,MAAM;EACpB;EACA,SAAS,OAAO,MAAM,KAAK,SAAS,KAAK,EAAE;EAC3C,YAAY,OAAO,MAAM,KAAK,SAAS,KAAK,KAAK;EACjD,YAAY,OAAO,MAAM,KAAK,SAAS,KAAK,UAAU,CAAC;CACxD;AACD;;;;;;;;;AAUA,SAAgB,QAAQ,OAAc,QAAiC;CACtE,MAAM,QAAQ,MAAM;CACpB,MAAM,QAAQ,OAAO;CACrB,IAAI,SAAS,WAAW,OAAO,OAAO,QAAQ,KAAK,GAAG;EACrD,IAAI,MAAM,OAAO,OAAO,WAAW,OAAO,QAAQ,OAAO,MAAM,KAAK;EACpE,OAAO,MAAM;CACd;CACA,OAAO,aAAa,WAAW,OAAO,QAAQ,KAAK;CACnD,OAAO,OAAO,WAAW;AAC1B;AAEA,SAAS,WAAW,OAAc,QAAgB,OAAgB,QAA+B;CAChG,MAAM,QAAQ,aAAa,OAAO,QAAQ,KAAK;CAC/C,KAAK,MAAM,OAAO,OAAO;EACxB,MAAM,IAAI;EACV,IAAI,MAAM,OAAO,OAAO,IACvB,MAAM,IAAI,MAAM,sBAAsB,OAAO,IAAI,GAAG,GAAG,OAAO,GAAG,OAAO,IAAI,GAAG,OAAO,GAAG,cAAc,MAAM,IAAI;CAEnH;AACD;;;;;;AAOA,SAAgB,aAAa,OAAc,QAA4C;CACtF,MAAM,OAAO,UAAU,OAAO,KAAK,MAAM,QAAQ;CACjD,MAAM,QAAQ,QAAQ,OAAO,MAAM;CACnC,IAAI,UAAU,MAAM,OAAO,KAAA;CAE3B,MAAM,QAAQ,OAAO;CACrB,IAAI,MAAM,eAAe,OAAO,OAAO,MAAM;CAC7C,IAAI;CACJ,KAAK,MAAM,OAAO,OACjB,IAAI,MAAM,SAAoB,KAAK,MAAiB,CAAC,WAAW,CAAC,EAAA,CAAG,OAAkB,MAAM;CAE7F,MAAM,UAAU;CAChB,MAAM,aAAa;CACnB,OAAO;AACR;;;;;;;AAQA,SAAgB,cAAc,OAAc,QAAsB;CACjE,MAAM,QAAQ,QAAQ,OAAO,MAAM;CACnC,IAAI,MAAM,WAAW,OAAO,WAAW;EACtC,OAAO,SAAS,KAAK,IAAI,OAAO,SAAS,KAAK,IAAI,MAAM,SAAS,OAAO,WAAW,CAAC,GAAG,MAAM,MAAM;EACnG,OAAO,YAAY,MAAM;CAC1B;CACA,IAAI,MAAM,SAAS,OAAO,SAAS;EAClC,OAAO,OAAO,KAAK,IAAI,OAAO,OAAO,KAAK,IAAI,MAAM,OAAO,OAAO,SAAS,CAAC,GAAG,MAAM,IAAI;EACzF,OAAO,UAAU,MAAM;CACxB;AACD;;;;;;;;AASA,SAAgB,WAAW,MAAkB,QAAiC;CAC7E,IAAI,SAAS,QAAQ,OAAO;CAC5B,OAAO,SAAS,SAAS,aAAa,OAAO,QAAQ,OAAO,WAAW;AACxE;;;;;;;;AASA,IAAa,kBAAyH,OAAO,OAAO;CACnJ,UAAU;CACV,OAAO;CACP,MAAM;AACP,CAAC;;;;;;;;;AAUD,SAAgB,YAAY,MAAkB,QAAyB,QAAkC;CAGxG,OAFc,KAAK,IAAI,KAAK,OAAO,kBAAkB,MAAM,OAAO,gBAAgB,UAAU,IAAI,CAEzF,KADO,SAAS,KAAK,IAAI,KAAK,OAAO,kBAAkB,IAAI,CAAC,IAAI;AAExE;;;;;;;AAQA,SAAgB,aAAa,QAAiC;CAC7D,OAAO,KAAK,IAAI,KAAK,OAAO,mBAAmB,IAAI,CAAC;AACrD;;;;;;AAOA,IAAa,YAAY,WAA4B,UAAU,IAAI,OAAO,MAAM,UAAU,IAAI,OAAO,MAAM;;;;;;;;AAS3G,SAAgB,aAAa,OAAc,QAAgB,SAAS,GAAwD;CAC3H,MAAM,SAAS,OAAO,IAAI,UAAU;CACpC,MAAM,QAAQ,QAAQ,OAAO,SAAS;CACtC,MAAM,OAAO,UAAU,OAAO,KAAK,MAAM,QAAQ,CAAC,CAAC,UAAU;CAC7D,OACC,YAAY,QAAQ,eAAe,GAAG,MAAM,QAAQ,OAAO,MAAM,CAAC,CAAC,UAAU,GAAG,QAAQ,QAAQ,KAAK;EAAE,OAAO;EAAG,QAAQ;EAAU,UAAU;CAAE;AAEjJ;;;;;;AAOA,SAAgB,WAAW,OAAc,QAAgB,SAAyB;CACjF,OAAO,MAAM,SAAS,OAAO,SAAS,SAAS,QAAQ,OAAO,MAAM,CAAC;AACtE;;;;;;;;AASA,SAAgB,YACf,aACA,MACA,OACA,WAAW,GACuD;CAClE,IAAI,CAAC,SAAS,CAAC,MAAM,OAAO,KAAA;CAC5B,MAAM,SAAS,IAAI;CAEnB,MAAM,QAAQ,KAAK,IAAK,cAAc,OAAQ,OAAO,MAAM;CAC3D,OAAO;EAAE;EAAO;EAAQ,UAAU,WAAW,IAAI,KAAK,IAAK,WAAW,OAAQ,OAAO,SAAS,KAAK,IAAI;CAAE;AAC1G"}
@@ -0,0 +1,52 @@
1
+ import type { EntityId } from './entity';
2
+ import type { Entity } from './entity';
3
+ import type { World } from './world';
4
+ /**
5
+ * Whom a summon goes for, besides what it would find itself (`Summoned.aggro`)
6
+ *
7
+ * @beta
8
+ */
9
+ export type SummonAggro = 'nearest' | 'mastersAttacker' | 'none';
10
+ /**
11
+ * On a unit a spell brought: who brought it (`by`, its master). Dispelling hurts what carries it. A `summon` effect
12
+ * gives it the rest: whether it walks with its master when it has nothing to do, whom it goes for, and whether it dies
13
+ * with its master (`diesWithMaster`; a `raiseDead` unit has only `by`, and outlives the one that raised it)
14
+ *
15
+ * @beta
16
+ */
17
+ export interface Summoned {
18
+ /** The master: who cast the spell */
19
+ by: EntityId;
20
+ /** Walks with its master, within 2 cells, when it has no target (an idle summon) */
21
+ follow?: boolean;
22
+ /**
23
+ * Whom it takes up: `nearest` what any idle unit finds; `mastersAttacker` also whoever hits its master, at once and
24
+ * ahead of what is nearer; `none` leaves it to the game's `targetScore` and orders
25
+ */
26
+ aggro?: SummonAggro;
27
+ /** Dies when its master does */
28
+ diesWithMaster?: boolean;
29
+ /** The game's time, in seconds, it was brought at */
30
+ at?: number;
31
+ /** The last who hit its master (`aggro: 'mastersAttacker'`), and until when (game seconds) it counts for more */
32
+ foe?: EntityId;
33
+ /** Until when (game seconds) the last who hit the master counts for more */
34
+ foeUntil?: number;
35
+ }
36
+ /**
37
+ * On a unit a spell brought: see `Summoned`. Filed in the world's index, so that `summonsOf` goes through summons and
38
+ * nothing else
39
+ *
40
+ * @beta
41
+ */
42
+ export declare const summoned: import("./components").Component<Summoned, Summoned>;
43
+ /**
44
+ * The living units a spell brought for `master` (the `summon` effect's, and `raiseDead`'s), in the order of their ids
45
+ *
46
+ * @beta
47
+ */
48
+ export declare function summonsOf(world: World, master: Entity | EntityId): Entity[];
49
+ /** How long the master's last attacker counts for more with its summons, in seconds of the game */
50
+ export declare const FOE_MEMORY = 6;
51
+ /** What the master's attacker is worth more to a summon, in `targetScore` points (a unit of threat is worth 1000) */
52
+ export declare const FOE_BONUS = 5000;
@@ -0,0 +1,38 @@
1
+ import { defineComponent } from "./components.js";
2
+ //#region src/summoned.ts
3
+ /**
4
+ * On a unit a spell brought: see `Summoned`. Filed in the world's index, so that `summonsOf` goes through summons and
5
+ * nothing else
6
+ *
7
+ * @beta
8
+ */
9
+ var summoned = defineComponent({
10
+ id: "core.summoned",
11
+ replicate: "everyone",
12
+ index: true,
13
+ snapshot: ({ by, follow, aggro, diesWithMaster, at }) => ({
14
+ by,
15
+ follow,
16
+ aggro,
17
+ diesWithMaster,
18
+ at
19
+ }),
20
+ same: (a, b) => a.by === b.by && a.follow === b.follow && a.aggro === b.aggro && a.diesWithMaster === b.diesWithMaster && a.at === b.at
21
+ });
22
+ /**
23
+ * The living units a spell brought for `master` (the `summon` effect's, and `raiseDead`'s), in the order of their ids
24
+ *
25
+ * @beta
26
+ */
27
+ function summonsOf(world, master) {
28
+ const id = typeof master === "number" ? master : master.id;
29
+ const found = [];
30
+ for (const entity of world.index.with(summoned)) if (entity.alive && entity.get(summoned).by === id) found.push(entity);
31
+ return found.sort((a, b) => a.id - b.id);
32
+ }
33
+ /** What the master's attacker is worth more to a summon, in `targetScore` points (a unit of threat is worth 1000) */
34
+ var FOE_BONUS = 5e3;
35
+ //#endregion
36
+ export { FOE_BONUS, summoned, summonsOf };
37
+
38
+ //# sourceMappingURL=summoned.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"summoned.js","names":[],"sources":["../src/summoned.ts"],"sourcesContent":["import { defineComponent } from './components'\nimport type { EntityId } from './entity'\nimport type { Entity } from './entity'\nimport type { World } from './world'\n\n/**\n * Whom a summon goes for, besides what it would find itself (`Summoned.aggro`)\n *\n * @beta\n */\nexport type SummonAggro = 'nearest' | 'mastersAttacker' | 'none'\n\n/**\n * On a unit a spell brought: who brought it (`by`, its master). Dispelling hurts what carries it. A `summon` effect\n * gives it the rest: whether it walks with its master when it has nothing to do, whom it goes for, and whether it dies\n * with its master (`diesWithMaster`; a `raiseDead` unit has only `by`, and outlives the one that raised it)\n *\n * @beta\n */\nexport interface Summoned {\n\t/** The master: who cast the spell */\n\tby: EntityId\n\t/** Walks with its master, within 2 cells, when it has no target (an idle summon) */\n\tfollow?: boolean\n\t/**\n\t * Whom it takes up: `nearest` what any idle unit finds; `mastersAttacker` also whoever hits its master, at once and\n\t * ahead of what is nearer; `none` leaves it to the game's `targetScore` and orders\n\t */\n\taggro?: SummonAggro\n\t/** Dies when its master does */\n\tdiesWithMaster?: boolean\n\t/** The game's time, in seconds, it was brought at */\n\tat?: number\n\t/** The last who hit its master (`aggro: 'mastersAttacker'`), and until when (game seconds) it counts for more */\n\tfoe?: EntityId\n\t/** Until when (game seconds) the last who hit the master counts for more */\n\tfoeUntil?: number\n}\n\n/**\n * On a unit a spell brought: see `Summoned`. Filed in the world's index, so that `summonsOf` goes through summons and\n * nothing else\n *\n * @beta\n */\nexport const summoned = defineComponent<Summoned>({ id: 'core.summoned', replicate: 'everyone',\n\tindex: true,\n\t// what the screen reads of it; who the master was hit by is the simulation's\n\tsnapshot: ({ by, follow, aggro, diesWithMaster, at }) => ({ by, follow, aggro, diesWithMaster, at }),\n\tsame: (a, b) => a.by === b.by && a.follow === b.follow && a.aggro === b.aggro && a.diesWithMaster === b.diesWithMaster && a.at === b.at })\n\n/**\n * The living units a spell brought for `master` (the `summon` effect's, and `raiseDead`'s), in the order of their ids\n *\n * @beta\n */\nexport function summonsOf(world: World, master: Entity | EntityId): Entity[] {\n\tconst id = typeof master === 'number' ? master : master.id\n\tconst found: Entity[] = []\n\tfor (const entity of world.index.with(summoned)) if (entity.alive && entity.get(summoned)!.by === id) found.push(entity)\n\treturn found.sort((a, b) => a.id - b.id)\n}\n\n/** How long the master's last attacker counts for more with its summons, in seconds of the game */\nexport const FOE_MEMORY = 6\n/** What the master's attacker is worth more to a summon, in `targetScore` points (a unit of threat is worth 1000) */\nexport const FOE_BONUS = 5000\n"],"mappings":";;;;;;;;AA6CA,IAAa,WAAW,gBAA0B;CAAE,IAAI;CAAiB,WAAW;CACnF,OAAO;CAEP,WAAW,EAAE,IAAI,QAAQ,OAAO,gBAAgB,UAAU;EAAE;EAAI;EAAQ;EAAO;EAAgB;CAAG;CAClG,OAAO,GAAG,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,OAAO,EAAE;AAAG,CAAC;;;;;;AAO1I,SAAgB,UAAU,OAAc,QAAqC;CAC5E,MAAM,KAAK,OAAO,WAAW,WAAW,SAAS,OAAO;CACxD,MAAM,QAAkB,CAAC;CACzB,KAAK,MAAM,UAAU,MAAM,MAAM,KAAK,QAAQ,GAAG,IAAI,OAAO,SAAS,OAAO,IAAI,QAAQ,CAAC,CAAE,OAAO,IAAI,MAAM,KAAK,MAAM;CACvH,OAAO,MAAM,MAAM,GAAG,MAAM,EAAE,KAAK,EAAE,EAAE;AACxC;;AAKA,IAAa,YAAY"}
package/dist/summons.d.ts CHANGED
@@ -1,6 +1,8 @@
1
1
  import type { Entity, PlayerId } from './entity';
2
2
  import type { Vec2 } from './math';
3
3
  import type { World } from './world';
4
+ import { summoned } from './summoned';
5
+ export { summoned };
4
6
  /**
5
7
  * What is left of a unit that died, for a while (see `corpses`)
6
8
  *
@@ -9,9 +11,13 @@ import type { World } from './world';
9
11
  export interface Corpse {
10
12
  /** The id the unit had: the screen keeps its body lying for as long as the corpse is there */
11
13
  id: number;
14
+ /** The unit type the dead unit was */
12
15
  type: string;
16
+ /** The player who owned the dead unit */
13
17
  owner: PlayerId;
18
+ /** Where the corpse lies, east-west */
14
19
  x: number;
20
+ /** Where the corpse lies, north-south */
15
21
  z: number;
16
22
  /** When it is gone, in seconds of the game */
17
23
  until: number;
@@ -22,16 +28,6 @@ export interface Corpse {
22
28
  * @beta
23
29
  */
24
30
  export declare const corpses: import("./components").Component<Corpse[], Corpse[]>;
25
- /**
26
- * On a unit a spell brought: who brought it. Dispelling hurts what carries it
27
- *
28
- * @beta
29
- */
30
- export declare const summoned: import("./components").Component<{
31
- by: number;
32
- }, {
33
- by: number;
34
- }>;
35
31
  /**
36
32
  * On an illusion: whose copy it is, the part of its damage it deals, and how much more it takes. Told to its side
37
33
  * only: to everyone else it is the real one
@@ -48,11 +44,12 @@ export declare const illusion: import("./components").Component<{
48
44
  taken: number;
49
45
  }>;
50
46
  /**
51
- * Takes up to `most` corpses nearest a point, within `radius`, out of the world, and gives them
47
+ * Takes up to `most` corpses nearest a point, within `radius`, out of the world, and gives them; `which`, those of them
48
+ * it may take (the caster's allies', for a resurrection)
52
49
  *
53
50
  * @beta
54
51
  */
55
- export declare function takeCorpses(world: World, point: Vec2, radius: number, most: number): Corpse[];
52
+ export declare function takeCorpses(world: World, point: Vec2, radius: number, most: number, which?: (corpse: Corpse) => boolean): Corpse[];
56
53
  /**
57
54
  * Whether killing an entity gains its killer nothing: an illusion
58
55
  *
@@ -60,4 +57,4 @@ export declare function takeCorpses(world: World, point: Vec2, radius: number, m
60
57
  */
61
58
  export declare const worthless: (entity: Entity) => boolean;
62
59
  /** The corpses where the player sees (`Snapshot.corpses`): none to a computer, and left out where there are none */
63
- export declare const corpsesPart: import("./replication").SnapshotPart<keyof import(".").Snapshot>;
60
+ export declare const corpsesPart: import("./replication").SnapshotField<keyof import(".").Snapshot>;