@v12-engine/engine 0.1.1 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (951) hide show
  1. package/dist/abilities/amounts.d.ts +28 -0
  2. package/dist/abilities/amounts.js +74 -0
  3. package/dist/abilities/amounts.js.map +1 -0
  4. package/dist/abilities/buffs.d.ts +106 -6
  5. package/dist/abilities/buffs.js +443 -0
  6. package/dist/abilities/buffs.js.map +1 -0
  7. package/dist/abilities/castTold.d.ts +2 -0
  8. package/dist/abilities/castTold.js +66 -0
  9. package/dist/abilities/castTold.js.map +1 -0
  10. package/dist/abilities/chance.d.ts +38 -0
  11. package/dist/abilities/chance.js +77 -0
  12. package/dist/abilities/chance.js.map +1 -0
  13. package/dist/abilities/charges.d.ts +18 -0
  14. package/dist/abilities/charges.js +101 -0
  15. package/dist/abilities/charges.js.map +1 -0
  16. package/dist/abilities/control.d.ts +28 -0
  17. package/dist/abilities/control.js +113 -0
  18. package/dist/abilities/control.js.map +1 -0
  19. package/dist/abilities/dispel.js +51 -0
  20. package/dist/abilities/dispel.js.map +1 -0
  21. package/dist/abilities/effectFields.d.ts +1 -1
  22. package/dist/abilities/effectFields.js +676 -0
  23. package/dist/abilities/effectFields.js.map +1 -0
  24. package/dist/abilities/effectIndex.d.ts +27 -0
  25. package/dist/abilities/effectIndex.js +64 -0
  26. package/dist/abilities/effectIndex.js.map +1 -0
  27. package/dist/abilities/effects/buff.d.ts +9 -3
  28. package/dist/abilities/effects/buff.js +84 -0
  29. package/dist/abilities/effects/buff.js.map +1 -0
  30. package/dist/abilities/effects/conditions.d.ts +2 -0
  31. package/dist/abilities/effects/conditions.js +41 -0
  32. package/dist/abilities/effects/conditions.js.map +1 -0
  33. package/dist/abilities/effects/core.js +54 -0
  34. package/dist/abilities/effects/core.js.map +1 -0
  35. package/dist/abilities/effects/damage.d.ts +1 -1
  36. package/dist/abilities/effects/damage.js +43 -0
  37. package/dist/abilities/effects/damage.js.map +1 -0
  38. package/dist/abilities/effects/heal.d.ts +2 -2
  39. package/dist/abilities/effects/heal.js +51 -0
  40. package/dist/abilities/effects/heal.js.map +1 -0
  41. package/dist/abilities/effects/missile.d.ts +13 -1
  42. package/dist/abilities/effects/missile.js +104 -0
  43. package/dist/abilities/effects/missile.js.map +1 -0
  44. package/dist/abilities/effects/morph.d.ts +5 -0
  45. package/dist/abilities/effects/morph.js +43 -0
  46. package/dist/abilities/effects/morph.js.map +1 -0
  47. package/dist/abilities/effects/moves.d.ts +16 -4
  48. package/dist/abilities/effects/moves.js +212 -0
  49. package/dist/abilities/effects/moves.js.map +1 -0
  50. package/dist/abilities/effects/passives.d.ts +19 -9
  51. package/dist/abilities/effects/passives.js +131 -0
  52. package/dist/abilities/effects/passives.js.map +1 -0
  53. package/dist/abilities/effects/proxy.d.ts +5 -0
  54. package/dist/abilities/effects/proxy.js +60 -0
  55. package/dist/abilities/effects/proxy.js.map +1 -0
  56. package/dist/abilities/effects/sight.d.ts +2 -2
  57. package/dist/abilities/effects/sight.js +39 -0
  58. package/dist/abilities/effects/sight.js.map +1 -0
  59. package/dist/abilities/effects/spawn.d.ts +5 -2
  60. package/dist/abilities/effects/spawn.js +40 -0
  61. package/dist/abilities/effects/spawn.js.map +1 -0
  62. package/dist/abilities/effects/timed.d.ts +2 -2
  63. package/dist/abilities/effects/timed.js +96 -0
  64. package/dist/abilities/effects/timed.js.map +1 -0
  65. package/dist/abilities/effects/trade.d.ts +1 -1
  66. package/dist/abilities/effects/trade.js +25 -0
  67. package/dist/abilities/effects/trade.js.map +1 -0
  68. package/dist/abilities/effects.d.ts +97 -23
  69. package/dist/abilities/effects.js +860 -0
  70. package/dist/abilities/effects.js.map +1 -0
  71. package/dist/abilities/land.d.ts +38 -4
  72. package/dist/abilities/land.js +189 -0
  73. package/dist/abilities/land.js.map +1 -0
  74. package/dist/abilities/recast.d.ts +45 -0
  75. package/dist/abilities/recast.js +118 -0
  76. package/dist/abilities/recast.js.map +1 -0
  77. package/dist/abilities/scaled.js +40 -0
  78. package/dist/abilities/scaled.js.map +1 -0
  79. package/dist/abilities/screen.d.ts +6 -0
  80. package/dist/abilities/screen.js +83 -0
  81. package/dist/abilities/screen.js.map +1 -0
  82. package/dist/abilities/shapes.d.ts +66 -0
  83. package/dist/abilities/shapes.js +122 -0
  84. package/dist/abilities/shapes.js.map +1 -0
  85. package/dist/abilities/text.d.ts +14 -2
  86. package/dist/abilities/text.js +204 -0
  87. package/dist/abilities/text.js.map +1 -0
  88. package/dist/abilities/triggers.d.ts +98 -0
  89. package/dist/abilities/triggers.js +351 -0
  90. package/dist/abilities/triggers.js.map +1 -0
  91. package/dist/abilityChanges.d.ts +131 -0
  92. package/dist/abilityChanges.js +345 -0
  93. package/dist/abilityChanges.js.map +1 -0
  94. package/dist/ai/area.d.ts +4 -1
  95. package/dist/ai/brain.d.ts +4 -1
  96. package/dist/ai/brain.js +844 -0
  97. package/dist/ai/brain.js.map +1 -0
  98. package/dist/ai/budget.js +74 -0
  99. package/dist/ai/budget.js.map +1 -0
  100. package/dist/ai/checks.d.ts +9 -1
  101. package/dist/ai/checks.js +242 -0
  102. package/dist/ai/checks.js.map +1 -0
  103. package/dist/ai/computer.d.ts +11 -4
  104. package/dist/ai/computer.js +251 -0
  105. package/dist/ai/computer.js.map +1 -0
  106. package/dist/ai/defence.d.ts +4 -0
  107. package/dist/ai/defence.js +430 -0
  108. package/dist/ai/defence.js.map +1 -0
  109. package/dist/ai/define.d.ts +3 -2
  110. package/dist/ai/define.js +31 -0
  111. package/dist/ai/define.js.map +1 -0
  112. package/dist/ai/economy.d.ts +10 -7
  113. package/dist/ai/economy.js +780 -0
  114. package/dist/ai/economy.js.map +1 -0
  115. package/dist/ai/geometry.js +38 -0
  116. package/dist/ai/geometry.js.map +1 -0
  117. package/dist/ai/goals.d.ts +1 -0
  118. package/dist/ai/goals.js +560 -0
  119. package/dist/ai/goals.js.map +1 -0
  120. package/dist/ai/knowledge.d.ts +72 -7
  121. package/dist/ai/knowledge.js +804 -0
  122. package/dist/ai/knowledge.js.map +1 -0
  123. package/dist/ai/lanes.d.ts +10 -2
  124. package/dist/ai/lanes.js +715 -0
  125. package/dist/ai/lanes.js.map +1 -0
  126. package/dist/ai/melee/build.js +264 -0
  127. package/dist/ai/melee/build.js.map +1 -0
  128. package/dist/ai/melee/goals.d.ts +7 -0
  129. package/dist/ai/melee/goals.js +720 -0
  130. package/dist/ai/melee/goals.js.map +1 -0
  131. package/dist/ai/melee/heroes.js +68 -0
  132. package/dist/ai/melee/heroes.js.map +1 -0
  133. package/dist/ai/melee/index.d.ts +1 -1
  134. package/dist/ai/melee/index.js +51 -0
  135. package/dist/ai/melee/index.js.map +1 -0
  136. package/dist/ai/melee/production.js +29 -0
  137. package/dist/ai/melee/production.js.map +1 -0
  138. package/dist/ai/melee/surrender.js +64 -0
  139. package/dist/ai/melee/surrender.js.map +1 -0
  140. package/dist/ai/micro.d.ts +9 -0
  141. package/dist/ai/micro.js +1316 -0
  142. package/dist/ai/micro.js.map +1 -0
  143. package/dist/ai/mission.d.ts +9 -2
  144. package/dist/ai/mission.js +538 -0
  145. package/dist/ai/mission.js.map +1 -0
  146. package/dist/ai/missionRules.d.ts +1 -1
  147. package/dist/ai/missionRules.js +26 -0
  148. package/dist/ai/missionRules.js.map +1 -0
  149. package/dist/ai/module.d.ts +6 -2
  150. package/dist/ai/module.js +37 -0
  151. package/dist/ai/module.js.map +1 -0
  152. package/dist/ai/options.d.ts +3 -3
  153. package/dist/ai/plans/build.d.ts +20 -1
  154. package/dist/ai/plans/build.js +608 -0
  155. package/dist/ai/plans/build.js.map +1 -0
  156. package/dist/ai/plans/placement.d.ts +4 -1
  157. package/dist/ai/plans/placement.js +295 -0
  158. package/dist/ai/plans/placement.js.map +1 -0
  159. package/dist/ai/plans/plans.d.ts +9 -0
  160. package/dist/ai/plans/plans.js +110 -0
  161. package/dist/ai/plans/plans.js.map +1 -0
  162. package/dist/ai/plans/production.d.ts +14 -2
  163. package/dist/ai/plans/production.js +434 -0
  164. package/dist/ai/plans/production.js.map +1 -0
  165. package/dist/ai/plans/purse.d.ts +6 -3
  166. package/dist/ai/plans/purse.js +139 -0
  167. package/dist/ai/plans/purse.js.map +1 -0
  168. package/dist/ai/plans/tech.d.ts +6 -0
  169. package/dist/ai/plans/tech.js +122 -0
  170. package/dist/ai/plans/tech.js.map +1 -0
  171. package/dist/ai/profiles.d.ts +4 -4
  172. package/dist/{profiles-B3NS9jwk.js → ai/profiles.js} +3 -98
  173. package/dist/ai/profiles.js.map +1 -0
  174. package/dist/ai/reach.js +54 -0
  175. package/dist/ai/reach.js.map +1 -0
  176. package/dist/ai/report.d.ts +8 -0
  177. package/dist/ai/report.js +87 -0
  178. package/dist/ai/report.js.map +1 -0
  179. package/dist/ai/roles.d.ts +4 -0
  180. package/dist/ai/roles.js +207 -0
  181. package/dist/ai/roles.js.map +1 -0
  182. package/dist/ai/rules.d.ts +8 -2
  183. package/dist/ai/rules.js +416 -0
  184. package/dist/ai/rules.js.map +1 -0
  185. package/dist/ai/scouting.d.ts +6 -0
  186. package/dist/ai/scouting.js +324 -0
  187. package/dist/ai/scouting.js.map +1 -0
  188. package/dist/ai/settings.js +99 -0
  189. package/dist/ai/settings.js.map +1 -0
  190. package/dist/ai/squads.d.ts +21 -2
  191. package/dist/ai/squads.js +916 -0
  192. package/dist/ai/squads.js.map +1 -0
  193. package/dist/ai/strength.js +320 -0
  194. package/dist/ai/strength.js.map +1 -0
  195. package/dist/ai/task.d.ts +3 -1
  196. package/dist/ai/task.js +17 -0
  197. package/dist/ai/task.js.map +1 -0
  198. package/dist/ai/tasks/attack.js +24 -0
  199. package/dist/ai/tasks/attack.js.map +1 -0
  200. package/dist/ai/tasks/capture.d.ts +3 -3
  201. package/dist/ai/tasks/capture.js +37 -0
  202. package/dist/ai/tasks/capture.js.map +1 -0
  203. package/dist/ai/tasks/creep.js +29 -0
  204. package/dist/ai/tasks/creep.js.map +1 -0
  205. package/dist/ai/tasks/defend.js +61 -0
  206. package/dist/ai/tasks/defend.js.map +1 -0
  207. package/dist/ai/tasks/drop.js +81 -0
  208. package/dist/ai/tasks/drop.js.map +1 -0
  209. package/dist/ai/tasks/escort.js +59 -0
  210. package/dist/ai/tasks/escort.js.map +1 -0
  211. package/dist/ai/tasks/gather.js +48 -0
  212. package/dist/ai/tasks/gather.js.map +1 -0
  213. package/dist/ai/tasks/harass.js +39 -0
  214. package/dist/ai/tasks/harass.js.map +1 -0
  215. package/dist/ai/tasks/hold.js +32 -0
  216. package/dist/ai/tasks/hold.js.map +1 -0
  217. package/dist/ai/tasks/index.js +34 -0
  218. package/dist/ai/tasks/index.js.map +1 -0
  219. package/dist/ai/tasks/move.js +26 -0
  220. package/dist/ai/tasks/move.js.map +1 -0
  221. package/dist/ai/tasks/patrol.js +59 -0
  222. package/dist/ai/tasks/patrol.js.map +1 -0
  223. package/dist/ai/tasks/retreat.js +28 -0
  224. package/dist/ai/tasks/retreat.js.map +1 -0
  225. package/dist/ai/tasks/scout.js +73 -0
  226. package/dist/ai/tasks/scout.js.map +1 -0
  227. package/dist/ai/tasks/shared.d.ts +1 -1
  228. package/dist/ai/tasks/shared.js +137 -0
  229. package/dist/ai/tasks/shared.js.map +1 -0
  230. package/dist/ai/team.d.ts +18 -1
  231. package/dist/ai/team.js +492 -0
  232. package/dist/ai/team.js.map +1 -0
  233. package/dist/ai/threat.d.ts +6 -0
  234. package/dist/ai/threat.js +206 -0
  235. package/dist/ai/threat.js.map +1 -0
  236. package/dist/ai/view.d.ts +21 -7
  237. package/dist/ai/view.js +677 -0
  238. package/dist/ai/view.js.map +1 -0
  239. package/dist/ai/waves.d.ts +6 -0
  240. package/dist/ai/waves.js +410 -0
  241. package/dist/ai/waves.js.map +1 -0
  242. package/dist/ai.js +54 -6239
  243. package/dist/aiTesting.d.ts +6 -3
  244. package/dist/aiTesting.js +229 -0
  245. package/dist/aiTesting.js.map +1 -0
  246. package/dist/areas.d.ts +4 -1
  247. package/dist/areas.js +295 -0
  248. package/dist/areas.js.map +1 -0
  249. package/dist/attacks.d.ts +3 -3
  250. package/dist/attacks.js +127 -0
  251. package/dist/attacks.js.map +1 -0
  252. package/dist/burning.d.ts +267 -0
  253. package/dist/burning.js +795 -0
  254. package/dist/burning.js.map +1 -0
  255. package/dist/bytes.js +21 -0
  256. package/dist/bytes.js.map +1 -0
  257. package/dist/callings.d.ts +71 -0
  258. package/dist/callings.js +157 -0
  259. package/dist/callings.js.map +1 -0
  260. package/dist/cameraOrders.d.ts +78 -0
  261. package/dist/cameraOrders.js +114 -0
  262. package/dist/cameraOrders.js.map +1 -0
  263. package/dist/camps.d.ts +70 -4
  264. package/dist/camps.js +501 -0
  265. package/dist/camps.js.map +1 -0
  266. package/dist/capture.d.ts +15 -3
  267. package/dist/capture.js +304 -0
  268. package/dist/capture.js.map +1 -0
  269. package/dist/cellLayers.d.ts +78 -13
  270. package/dist/cellLayers.js +275 -0
  271. package/dist/cellLayers.js.map +1 -0
  272. package/dist/cellPatches.d.ts +24 -0
  273. package/dist/cellPatches.js +73 -0
  274. package/dist/cellPatches.js.map +1 -0
  275. package/dist/cinematics.d.ts +10 -5
  276. package/dist/cinematics.js +161 -0
  277. package/dist/cinematics.js.map +1 -0
  278. package/dist/clock.d.ts +2 -2
  279. package/dist/clock.js +78 -0
  280. package/dist/clock.js.map +1 -0
  281. package/dist/commands.d.ts +36 -4
  282. package/dist/commands.js +636 -0
  283. package/dist/commands.js.map +1 -0
  284. package/dist/components.d.ts +31 -10
  285. package/dist/components.js +74 -0
  286. package/dist/components.js.map +1 -0
  287. package/dist/computers.d.ts +4 -4
  288. package/dist/computers.js +194 -0
  289. package/dist/computers.js.map +1 -0
  290. package/dist/concealment.d.ts +25 -2
  291. package/dist/concealment.js +409 -0
  292. package/dist/concealment.js.map +1 -0
  293. package/dist/coreComponents.js +130 -0
  294. package/dist/coreComponents.js.map +1 -0
  295. package/dist/createGame.d.ts +306 -0
  296. package/dist/createGame.js +405 -0
  297. package/dist/createGame.js.map +1 -0
  298. package/dist/dashing.d.ts +18 -2
  299. package/dist/dashing.js +41 -0
  300. package/dist/dashing.js.map +1 -0
  301. package/dist/debug.d.ts +8 -0
  302. package/dist/debug.js +5 -3
  303. package/dist/debug2.js +76 -0
  304. package/dist/debug2.js.map +1 -0
  305. package/dist/debugCommands.d.ts +6 -6
  306. package/dist/debugCommands.js +537 -0
  307. package/dist/debugCommands.js.map +1 -0
  308. package/dist/debugging.d.ts +1 -0
  309. package/dist/defaultSets.d.ts +183 -0
  310. package/dist/defaultSets.js +216 -0
  311. package/dist/defaultSets.js.map +1 -0
  312. package/dist/definitions.d.ts +6 -0
  313. package/dist/definitions.js +78 -0
  314. package/dist/definitions.js.map +1 -0
  315. package/dist/defs.d.ts +1895 -165
  316. package/dist/defs.js +380 -0
  317. package/dist/defs.js.map +1 -0
  318. package/dist/denying.d.ts +4 -4
  319. package/dist/denying.js +106 -0
  320. package/dist/denying.js.map +1 -0
  321. package/dist/destructibles.d.ts +2 -2
  322. package/dist/destructibles.js +36 -0
  323. package/dist/destructibles.js.map +1 -0
  324. package/dist/determinism.d.ts +4 -4
  325. package/dist/determinism.js +247 -0
  326. package/dist/determinism.js.map +1 -0
  327. package/dist/dialog.d.ts +17 -2
  328. package/dist/dialog.js +108 -0
  329. package/dist/dialog.js.map +1 -0
  330. package/dist/effectRefs.js +28 -0
  331. package/dist/effectRefs.js.map +1 -0
  332. package/dist/effects.d.ts +27 -11
  333. package/dist/effects.js +110 -0
  334. package/dist/effects.js.map +1 -0
  335. package/dist/endings.d.ts +1 -1
  336. package/dist/endings.js +78 -0
  337. package/dist/endings.js.map +1 -0
  338. package/dist/engagement.d.ts +40 -6
  339. package/dist/engagement.js +530 -0
  340. package/dist/engagement.js.map +1 -0
  341. package/dist/engineEvents.d.ts +72 -9
  342. package/dist/engineEvents.js +520 -0
  343. package/dist/engineEvents.js.map +1 -0
  344. package/dist/entity.d.ts +275 -26
  345. package/dist/entity.js +441 -0
  346. package/dist/entity.js.map +1 -0
  347. package/dist/entityIndex.d.ts +10 -3
  348. package/dist/entityIndex.js +149 -0
  349. package/dist/entityIndex.js.map +1 -0
  350. package/dist/errors.d.ts +6 -2
  351. package/dist/errors.js +59 -0
  352. package/dist/errors.js.map +1 -0
  353. package/dist/events.d.ts +11 -5
  354. package/dist/events.js +158 -0
  355. package/dist/events.js.map +1 -0
  356. package/dist/exactMath.js +273 -0
  357. package/dist/exactMath.js.map +1 -0
  358. package/dist/features.d.ts +1 -1
  359. package/dist/features.js +127 -0
  360. package/dist/features.js.map +1 -0
  361. package/dist/fields.d.ts +25 -5
  362. package/dist/fields.js +140 -0
  363. package/dist/fields.js.map +1 -0
  364. package/dist/fixture.d.ts +3 -3
  365. package/dist/fixture.js +512 -0
  366. package/dist/fixture.js.map +1 -0
  367. package/dist/fog.d.ts +26 -3
  368. package/dist/fog.js +333 -0
  369. package/dist/fog.js.map +1 -0
  370. package/dist/foliage.d.ts +476 -0
  371. package/dist/foliage.js +1478 -0
  372. package/dist/foliage.js.map +1 -0
  373. package/dist/foliageDebug.d.ts +57 -0
  374. package/dist/foliageDebug.js +172 -0
  375. package/dist/foliageDebug.js.map +1 -0
  376. package/dist/foliageRegrowth.d.ts +20 -0
  377. package/dist/foliageRegrowth.js +332 -0
  378. package/dist/foliageRegrowth.js.map +1 -0
  379. package/dist/formState.d.ts +67 -0
  380. package/dist/formState.js +65 -0
  381. package/dist/formState.js.map +1 -0
  382. package/dist/formation.d.ts +46 -8
  383. package/dist/formation.js +297 -0
  384. package/dist/formation.js.map +1 -0
  385. package/dist/forms.d.ts +58 -0
  386. package/dist/forms.js +146 -0
  387. package/dist/forms.js.map +1 -0
  388. package/dist/friendlyFire.d.ts +2 -2
  389. package/dist/friendlyFire.js +37 -0
  390. package/dist/friendlyFire.js.map +1 -0
  391. package/dist/game.d.ts +141 -48
  392. package/dist/game.js +834 -0
  393. package/dist/game.js.map +1 -0
  394. package/dist/gameData.d.ts +96 -22
  395. package/dist/gameData.js +1690 -0
  396. package/dist/gameData.js.map +1 -0
  397. package/dist/gameFiles.d.ts +3 -3
  398. package/dist/gameFiles.js +14 -0
  399. package/dist/gameFiles.js.map +1 -0
  400. package/dist/gates.js +92 -0
  401. package/dist/gates.js.map +1 -0
  402. package/dist/generate.d.ts +28 -1
  403. package/dist/generate.js +1062 -0
  404. package/dist/generate.js.map +1 -0
  405. package/dist/generateWorker.d.ts +7 -3
  406. package/dist/generateWorker.js +86 -0
  407. package/dist/generateWorker.js.map +1 -0
  408. package/dist/grid.d.ts +9 -0
  409. package/dist/grid.js +102 -0
  410. package/dist/grid.js.map +1 -0
  411. package/dist/ground.d.ts +17 -1
  412. package/dist/ground.js +375 -0
  413. package/dist/ground.js.map +1 -0
  414. package/dist/groundObjects.d.ts +70 -0
  415. package/dist/groundObjects.js +371 -0
  416. package/dist/groundObjects.js.map +1 -0
  417. package/dist/groundSpeed.d.ts +20 -3
  418. package/dist/groundSpeed.js +117 -0
  419. package/dist/groundSpeed.js.map +1 -0
  420. package/dist/hero.d.ts +126 -10
  421. package/dist/hero.js +432 -0
  422. package/dist/hero.js.map +1 -0
  423. package/dist/holds.d.ts +94 -0
  424. package/dist/holds.js +305 -0
  425. package/dist/holds.js.map +1 -0
  426. package/dist/home.d.ts +1 -1
  427. package/dist/home.js +30 -0
  428. package/dist/home.js.map +1 -0
  429. package/dist/hooks.d.ts +339 -57
  430. package/dist/hooks.js +105 -0
  431. package/dist/hooks.js.map +1 -0
  432. package/dist/hotReload.d.ts +6 -5
  433. package/dist/hotReload.js +145 -0
  434. package/dist/hotReload.js.map +1 -0
  435. package/dist/ids.d.ts +3 -3
  436. package/dist/ids.js +30 -0
  437. package/dist/ids.js.map +1 -0
  438. package/dist/idsFile.d.ts +36 -0
  439. package/dist/idsFile.js +134 -0
  440. package/dist/idsFile.js.map +1 -0
  441. package/dist/index.d.ts +105 -68
  442. package/dist/index.js +194 -4701
  443. package/dist/inspect.d.ts +29 -2
  444. package/dist/{inspect-D9dWHmZ0.js → inspect.js} +21 -12
  445. package/dist/inspect.js.map +1 -0
  446. package/dist/inventory.d.ts +14 -1
  447. package/dist/inventory.js +84 -0
  448. package/dist/inventory.js.map +1 -0
  449. package/dist/items.d.ts +136 -8
  450. package/dist/items.js +585 -0
  451. package/dist/items.js.map +1 -0
  452. package/dist/lanes.d.ts +12 -3
  453. package/dist/lanes.js +496 -0
  454. package/dist/lanes.js.map +1 -0
  455. package/dist/life.d.ts +6 -2
  456. package/dist/life.js +287 -0
  457. package/dist/life.js.map +1 -0
  458. package/dist/log.d.ts +26 -3
  459. package/dist/log.js +192 -0
  460. package/dist/log.js.map +1 -0
  461. package/dist/manaBurn.d.ts +2 -2
  462. package/dist/manaBurn.js +75 -0
  463. package/dist/manaBurn.js.map +1 -0
  464. package/dist/map/file.d.ts +56 -3
  465. package/dist/map/file.js +264 -0
  466. package/dist/map/file.js.map +1 -0
  467. package/dist/map/images.js +61 -0
  468. package/dist/map/images.js.map +1 -0
  469. package/dist/map/look.d.ts +1 -1
  470. package/dist/map/look.js +30 -0
  471. package/dist/map/look.js.map +1 -0
  472. package/dist/map/pathProfile.js +183 -0
  473. package/dist/map/pathProfile.js.map +1 -0
  474. package/dist/map/resize.d.ts +4 -0
  475. package/dist/map/resize.js +136 -0
  476. package/dist/map/resize.js.map +1 -0
  477. package/dist/map/schema.js +257 -0
  478. package/dist/map/schema.js.map +1 -0
  479. package/dist/map/terrain.js +214 -0
  480. package/dist/map/terrain.js.map +1 -0
  481. package/dist/map/types.d.ts +92 -13
  482. package/dist/map/types.js +251 -0
  483. package/dist/map/types.js.map +1 -0
  484. package/dist/mapCheck/cells.js +94 -0
  485. package/dist/mapCheck/cells.js.map +1 -0
  486. package/dist/mapCheck/rules/foliage.d.ts +9 -0
  487. package/dist/mapCheck/rules/foliage.js +83 -0
  488. package/dist/mapCheck/rules/foliage.js.map +1 -0
  489. package/dist/mapCheck/rules/names.js +39 -0
  490. package/dist/mapCheck/rules/names.js.map +1 -0
  491. package/dist/mapCheck/rules/objects.d.ts +1 -1
  492. package/dist/mapCheck/rules/objects.js +56 -0
  493. package/dist/mapCheck/rules/objects.js.map +1 -0
  494. package/dist/mapCheck/rules/paths.js +32 -0
  495. package/dist/mapCheck/rules/paths.js.map +1 -0
  496. package/dist/mapCheck/rules/players.js +20 -0
  497. package/dist/mapCheck/rules/players.js.map +1 -0
  498. package/dist/mapCheck/rules/races.js +56 -0
  499. package/dist/mapCheck/rules/races.js.map +1 -0
  500. package/dist/mapCheck/rules/random.js +47 -0
  501. package/dist/mapCheck/rules/random.js.map +1 -0
  502. package/dist/mapCheck/rules/regions.js +30 -0
  503. package/dist/mapCheck/rules/regions.js.map +1 -0
  504. package/dist/mapCheck/rules/targets.js +31 -0
  505. package/dist/mapCheck/rules/targets.js.map +1 -0
  506. package/dist/mapCheck/rules/walking.js +45 -0
  507. package/dist/mapCheck/rules/walking.js.map +1 -0
  508. package/dist/mapCheck.d.ts +2 -2
  509. package/dist/mapCheck.js +63 -0
  510. package/dist/mapCheck.js.map +1 -0
  511. package/dist/mapFields.d.ts +25 -2
  512. package/dist/mapFields.js +134 -0
  513. package/dist/mapFields.js.map +1 -0
  514. package/dist/mapFile.js +176 -0
  515. package/dist/mapFile.js.map +1 -0
  516. package/dist/mapMeasure.d.ts +8 -0
  517. package/dist/mapMeasure.js +283 -0
  518. package/dist/mapMeasure.js.map +1 -0
  519. package/dist/mapMerge.d.ts +1 -0
  520. package/dist/mapMerge.js +172 -0
  521. package/dist/mapMerge.js.map +1 -0
  522. package/dist/mapObjectives.js +138 -0
  523. package/dist/mapObjectives.js.map +1 -0
  524. package/dist/mapObjects.js +80 -0
  525. package/dist/mapObjects.js.map +1 -0
  526. package/dist/math.d.ts +37 -7
  527. package/dist/math.js +155 -0
  528. package/dist/math.js.map +1 -0
  529. package/dist/messages.d.ts +71 -4
  530. package/dist/messages.js +29 -0
  531. package/dist/messages.js.map +1 -0
  532. package/dist/missionRules.d.ts +10 -2
  533. package/dist/{missionRules-C-bGxm0Q.js → missionRules.js} +30 -150
  534. package/dist/missionRules.js.map +1 -0
  535. package/dist/mods.d.ts +39 -20
  536. package/dist/mods.js +271 -0
  537. package/dist/mods.js.map +1 -0
  538. package/dist/moves.d.ts +87 -0
  539. package/dist/moves.js +539 -0
  540. package/dist/moves.js.map +1 -0
  541. package/dist/names.d.ts +7 -0
  542. package/dist/names.js +122 -0
  543. package/dist/names.js.map +1 -0
  544. package/dist/navigation/agentParams.js +14 -0
  545. package/dist/navigation/agentParams.js.map +1 -0
  546. package/dist/navigation/air.d.ts +7 -3
  547. package/dist/navigation/air.js +401 -0
  548. package/dist/navigation/air.js.map +1 -0
  549. package/dist/navigation/builds.d.ts +34 -2
  550. package/dist/navigation/builds.js +287 -0
  551. package/dist/navigation/builds.js.map +1 -0
  552. package/dist/navigation/groundAreas.d.ts +59 -1
  553. package/dist/navigation/groundAreas.js +407 -0
  554. package/dist/navigation/groundAreas.js.map +1 -0
  555. package/dist/navigation/navigation.d.ts +98 -9
  556. package/dist/navigation/recast.d.ts +194 -18
  557. package/dist/navigation/recast.js +1379 -0
  558. package/dist/navigation/recast.js.map +1 -0
  559. package/dist/navigation/sidePaths.d.ts +8 -3
  560. package/dist/navigation/sidePaths.js +241 -0
  561. package/dist/navigation/sidePaths.js.map +1 -0
  562. package/dist/navigation/sized.js +243 -0
  563. package/dist/navigation/sized.js.map +1 -0
  564. package/dist/nearest.js +32 -0
  565. package/dist/nearest.js.map +1 -0
  566. package/dist/noise.js +59 -0
  567. package/dist/noise.js.map +1 -0
  568. package/dist/objectives.d.ts +12 -3
  569. package/dist/objectives.js +144 -0
  570. package/dist/objectives.js.map +1 -0
  571. package/dist/orders/basic.d.ts +5 -5
  572. package/dist/orders/basic.js +417 -0
  573. package/dist/orders/basic.js.map +1 -0
  574. package/dist/orders/build.js +278 -0
  575. package/dist/orders/build.js.map +1 -0
  576. package/dist/orders/cast.d.ts +13 -3
  577. package/dist/orders/cast.js +558 -0
  578. package/dist/orders/cast.js.map +1 -0
  579. package/dist/orders/facts.js +16 -0
  580. package/dist/orders/facts.js.map +1 -0
  581. package/dist/orders/harvest.d.ts +21 -5
  582. package/dist/orders/harvest.js +540 -0
  583. package/dist/orders/harvest.js.map +1 -0
  584. package/dist/orders/idle.d.ts +3 -1
  585. package/dist/orders/idle.js +234 -0
  586. package/dist/orders/idle.js.map +1 -0
  587. package/dist/orders/items.js +92 -0
  588. package/dist/orders/items.js.map +1 -0
  589. package/dist/orders/queue.js +108 -0
  590. package/dist/orders/queue.js.map +1 -0
  591. package/dist/orders/waiting.d.ts +39 -0
  592. package/dist/orders/waiting.js +149 -0
  593. package/dist/orders/waiting.js.map +1 -0
  594. package/dist/pack.schema.js +13 -0
  595. package/dist/pack.schema.js.map +1 -0
  596. package/dist/pack.schema.json +7622 -841
  597. package/dist/packs/director/index.d.ts +13 -5
  598. package/dist/packs/director/index.js +204 -0
  599. package/dist/packs/director/index.js.map +1 -0
  600. package/dist/packs/heroes/campaign.d.ts +3 -2
  601. package/dist/packs/heroes/campaign.js +241 -0
  602. package/dist/packs/heroes/campaign.js.map +1 -0
  603. package/dist/packs/heroes/carry.d.ts +6 -0
  604. package/dist/packs/heroes/carry.js +112 -0
  605. package/dist/packs/heroes/carry.js.map +1 -0
  606. package/dist/packs/heroes/commands.js +115 -0
  607. package/dist/packs/heroes/commands.js.map +1 -0
  608. package/dist/packs/heroes/fallen.d.ts +43 -0
  609. package/dist/packs/heroes/fallen.js +61 -0
  610. package/dist/packs/heroes/fallen.js.map +1 -0
  611. package/dist/packs/heroes/hire.js +60 -0
  612. package/dist/packs/heroes/hire.js.map +1 -0
  613. package/dist/packs/heroes/index.d.ts +7 -6
  614. package/dist/packs/heroes/index.js +130 -0
  615. package/dist/packs/heroes/index.js.map +1 -0
  616. package/dist/packs/heroes/loop.d.ts +95 -0
  617. package/dist/packs/heroes/loop.js +250 -0
  618. package/dist/packs/heroes/loop.js.map +1 -0
  619. package/dist/packs/heroes/making.d.ts +6 -3
  620. package/dist/packs/heroes/making.js +55 -0
  621. package/dist/packs/heroes/making.js.map +1 -0
  622. package/dist/packs/heroes/respawn.d.ts +3 -3
  623. package/dist/packs/heroes/respawn.js +87 -0
  624. package/dist/packs/heroes/respawn.js.map +1 -0
  625. package/dist/packs/heroes/sets.d.ts +32 -0
  626. package/dist/packs/heroes/sets.js +51 -0
  627. package/dist/packs/heroes/sets.js.map +1 -0
  628. package/dist/packs/heroes/spells.d.ts +16 -0
  629. package/dist/packs/heroes/spells.js +269 -0
  630. package/dist/packs/heroes/spells.js.map +1 -0
  631. package/dist/packs/items/defaults.d.ts +43 -0
  632. package/dist/packs/items/defaults.js +1504 -0
  633. package/dist/packs/items/defaults.js.map +1 -0
  634. package/dist/packs/items/index.d.ts +27 -0
  635. package/dist/packs/items/index.js +214 -0
  636. package/dist/packs/items/index.js.map +1 -0
  637. package/dist/packs/moba/index.d.ts +3 -3
  638. package/dist/packs/moba/index.js +174 -0
  639. package/dist/packs/moba/index.js.map +1 -0
  640. package/dist/packs/pack.d.ts +15 -15
  641. package/dist/packs/pack.js +14 -0
  642. package/dist/packs/pack.js.map +1 -0
  643. package/dist/packs.d.ts +15 -7
  644. package/dist/packs.js +222 -0
  645. package/dist/packs.js.map +1 -0
  646. package/dist/paths.d.ts +2 -0
  647. package/dist/paths.js +109 -0
  648. package/dist/paths.js.map +1 -0
  649. package/dist/plain.js +57 -0
  650. package/dist/plain.js.map +1 -0
  651. package/dist/player.d.ts +33 -10
  652. package/dist/player.js +159 -0
  653. package/dist/player.js.map +1 -0
  654. package/dist/portals.d.ts +1 -1
  655. package/dist/portals.js +194 -0
  656. package/dist/portals.js.map +1 -0
  657. package/dist/prefabs.d.ts +25 -2
  658. package/dist/prefabs.js +239 -0
  659. package/dist/prefabs.js.map +1 -0
  660. package/dist/presetBuildings.js +58 -0
  661. package/dist/presetBuildings.js.map +1 -0
  662. package/dist/presetFoliage.d.ts +27 -0
  663. package/dist/presetFoliage.js +98 -0
  664. package/dist/presetFoliage.js.map +1 -0
  665. package/dist/presetGround.js +65 -0
  666. package/dist/presetGround.js.map +1 -0
  667. package/dist/proxies.d.ts +12 -0
  668. package/dist/proxies.js +79 -0
  669. package/dist/proxies.js.map +1 -0
  670. package/dist/query.d.ts +56 -0
  671. package/dist/query.js +88 -0
  672. package/dist/query.js.map +1 -0
  673. package/dist/races.d.ts +15 -14
  674. package/dist/races.js +172 -0
  675. package/dist/races.js.map +1 -0
  676. package/dist/randomGroups.js +91 -0
  677. package/dist/randomGroups.js.map +1 -0
  678. package/dist/registry.d.ts +117 -53
  679. package/dist/registry.js +323 -0
  680. package/dist/registry.js.map +1 -0
  681. package/dist/remains.d.ts +11 -9
  682. package/dist/remains.js +188 -0
  683. package/dist/remains.js.map +1 -0
  684. package/dist/replication.d.ts +12 -7
  685. package/dist/replication.js +100 -0
  686. package/dist/replication.js.map +1 -0
  687. package/dist/rng.d.ts +2 -0
  688. package/dist/rng.js +40 -0
  689. package/dist/rng.js.map +1 -0
  690. package/dist/rules.d.ts +186 -99
  691. package/dist/rules.js +179 -0
  692. package/dist/rules.js.map +1 -0
  693. package/dist/rulesCheck.d.ts +5 -4
  694. package/dist/rulesCheck.js +693 -0
  695. package/dist/rulesCheck.js.map +1 -0
  696. package/dist/runes.d.ts +2 -2
  697. package/dist/runes.js +80 -0
  698. package/dist/runes.js.map +1 -0
  699. package/dist/save.d.ts +37 -12
  700. package/dist/save.js +532 -0
  701. package/dist/save.js.map +1 -0
  702. package/dist/scenario.d.ts +2 -2
  703. package/dist/scenario.js +99 -0
  704. package/dist/scenario.js.map +1 -0
  705. package/dist/scheduler.d.ts +3 -0
  706. package/dist/scheduler.js +156 -0
  707. package/dist/scheduler.js.map +1 -0
  708. package/dist/score.d.ts +19 -19
  709. package/dist/score.js +709 -0
  710. package/dist/score.js.map +1 -0
  711. package/dist/sequences.d.ts +10 -6
  712. package/dist/sequences.js +206 -0
  713. package/dist/sequences.js.map +1 -0
  714. package/dist/server/doorman.js +154 -0
  715. package/dist/server/doorman.js.map +1 -0
  716. package/dist/server/gameServer.d.ts +16 -1
  717. package/dist/server/gameServer.js +643 -0
  718. package/dist/server/gameServer.js.map +1 -0
  719. package/dist/server/index.d.ts +1 -1
  720. package/dist/server/lobby.js +199 -0
  721. package/dist/server/lobby.js.map +1 -0
  722. package/dist/server/log.js +18 -0
  723. package/dist/server/log.js.map +1 -0
  724. package/dist/server/match.js +267 -0
  725. package/dist/server/match.js.map +1 -0
  726. package/dist/server/mode.d.ts +18 -9
  727. package/dist/server/mode.js +220 -0
  728. package/dist/server/mode.js.map +1 -0
  729. package/dist/{navigation-worker.js → server/navigation-worker.js} +1 -1
  730. package/dist/server/navigation-worker.js.map +1 -0
  731. package/dist/server/navigation.js +39 -0
  732. package/dist/server/navigation.js.map +1 -0
  733. package/dist/server/ops.d.ts +4 -0
  734. package/dist/server/ops.js +137 -0
  735. package/dist/server/ops.js.map +1 -0
  736. package/dist/server/packs.d.ts +3 -3
  737. package/dist/server/packs.js +32 -0
  738. package/dist/server/packs.js.map +1 -0
  739. package/dist/server/ratings.d.ts +5 -0
  740. package/dist/server/ratings.js +104 -0
  741. package/dist/server/ratings.js.map +1 -0
  742. package/dist/server/relay.d.ts +12 -2
  743. package/dist/server/relay.js +144 -0
  744. package/dist/server/relay.js.map +1 -0
  745. package/dist/server/rooms.d.ts +9 -2
  746. package/dist/server/rooms.js +442 -0
  747. package/dist/server/rooms.js.map +1 -0
  748. package/dist/server/seat.js +116 -0
  749. package/dist/server/seat.js.map +1 -0
  750. package/dist/server/seatSettings.d.ts +3 -3
  751. package/dist/server/seatSettings.js +63 -0
  752. package/dist/server/seatSettings.js.map +1 -0
  753. package/dist/server/secret.js +13 -0
  754. package/dist/server/secret.js.map +1 -0
  755. package/dist/server/start.d.ts +13 -6
  756. package/dist/server/start.js +76 -0
  757. package/dist/server/start.js.map +1 -0
  758. package/dist/server/websocket.d.ts +9 -1
  759. package/dist/server/websocket.js +306 -0
  760. package/dist/server/websocket.js.map +1 -0
  761. package/dist/server.js +15 -2861
  762. package/dist/session/can.js +26 -0
  763. package/dist/session/can.js.map +1 -0
  764. package/dist/session/commandReplay.d.ts +8 -2
  765. package/dist/session/commandReplay.js +293 -0
  766. package/dist/session/commandReplay.js.map +1 -0
  767. package/dist/session/debug.js +151 -0
  768. package/dist/session/debug.js.map +1 -0
  769. package/dist/session/delay.js +62 -0
  770. package/dist/session/delay.js.map +1 -0
  771. package/dist/session/delta.d.ts +14 -1
  772. package/dist/session/delta.js +407 -0
  773. package/dist/session/delta.js.map +1 -0
  774. package/dist/session/entityState.js +415 -0
  775. package/dist/session/entityState.js.map +1 -0
  776. package/dist/session/local.d.ts +47 -5
  777. package/dist/session/local.js +670 -0
  778. package/dist/session/local.js.map +1 -0
  779. package/dist/session/memory.d.ts +20 -2
  780. package/dist/session/memory.js +131 -0
  781. package/dist/session/memory.js.map +1 -0
  782. package/dist/session/protocol.d.ts +325 -31
  783. package/dist/session/protocol.js +55 -0
  784. package/dist/session/protocol.js.map +1 -0
  785. package/dist/session/remote.d.ts +74 -12
  786. package/dist/session/remote.js +1394 -0
  787. package/dist/session/remote.js.map +1 -0
  788. package/dist/session/replay.d.ts +11 -2
  789. package/dist/session/replay.js +160 -0
  790. package/dist/session/replay.js.map +1 -0
  791. package/dist/session/seed.js +12 -0
  792. package/dist/session/seed.js.map +1 -0
  793. package/dist/session/share.d.ts +5 -1
  794. package/dist/session/share.js +94 -0
  795. package/dist/session/share.js.map +1 -0
  796. package/dist/session/socket.d.ts +1 -1
  797. package/dist/session/socket.js +29 -0
  798. package/dist/session/socket.js.map +1 -0
  799. package/dist/session/wire.d.ts +5 -0
  800. package/dist/session/wire.js +84 -0
  801. package/dist/session/wire.js.map +1 -0
  802. package/dist/session/worker.d.ts +77 -12
  803. package/dist/session/worker.js +499 -0
  804. package/dist/session/worker.js.map +1 -0
  805. package/dist/shared.d.ts +31 -5
  806. package/dist/shared.js +166 -0
  807. package/dist/shared.js.map +1 -0
  808. package/dist/sides.d.ts +9 -3
  809. package/dist/sides.js +149 -0
  810. package/dist/sides.js.map +1 -0
  811. package/dist/sight.js +85 -0
  812. package/dist/sight.js.map +1 -0
  813. package/dist/simulate-worker.js +1 -1
  814. package/dist/simulate.d.ts +12 -8
  815. package/dist/{simulate-oXBiw1Ff.js → simulate.js} +10 -11
  816. package/dist/simulate.js.map +1 -0
  817. package/dist/smart.js +77 -0
  818. package/dist/smart.js.map +1 -0
  819. package/dist/spatial.d.ts +32 -16
  820. package/dist/spatial.js +234 -0
  821. package/dist/spatial.js.map +1 -0
  822. package/dist/spawning.d.ts +1 -0
  823. package/dist/spawning.js +224 -0
  824. package/dist/spawning.js.map +1 -0
  825. package/dist/stances.d.ts +6 -3
  826. package/dist/stances.js +169 -0
  827. package/dist/stances.js.map +1 -0
  828. package/dist/start.d.ts +10 -10
  829. package/dist/start.js +75 -0
  830. package/dist/start.js.map +1 -0
  831. package/dist/stats.d.ts +42 -16
  832. package/dist/stats.js +290 -0
  833. package/dist/stats.js.map +1 -0
  834. package/dist/summoned.d.ts +52 -0
  835. package/dist/summoned.js +38 -0
  836. package/dist/summoned.js.map +1 -0
  837. package/dist/summons.d.ts +10 -13
  838. package/dist/summons.js +271 -0
  839. package/dist/summons.js.map +1 -0
  840. package/dist/systems/abilities.js +224 -0
  841. package/dist/systems/abilities.js.map +1 -0
  842. package/dist/systems/combat.d.ts +35 -1
  843. package/dist/systems/combat.js +677 -0
  844. package/dist/systems/combat.js.map +1 -0
  845. package/dist/systems/combatTold.d.ts +3 -1
  846. package/dist/systems/combatTold.js +85 -0
  847. package/dist/systems/combatTold.js.map +1 -0
  848. package/dist/systems/construction.js +80 -0
  849. package/dist/systems/construction.js.map +1 -0
  850. package/dist/systems/economy.d.ts +0 -6
  851. package/dist/systems/economy.js +128 -0
  852. package/dist/systems/economy.js.map +1 -0
  853. package/dist/systems/fog.d.ts +1 -1
  854. package/dist/systems/fog.js +120 -0
  855. package/dist/systems/fog.js.map +1 -0
  856. package/dist/systems/life.js +32 -0
  857. package/dist/systems/life.js.map +1 -0
  858. package/dist/systems/movement.d.ts +24 -12
  859. package/dist/systems/movement.js +1247 -0
  860. package/dist/systems/movement.js.map +1 -0
  861. package/dist/systems/orders.js +64 -0
  862. package/dist/systems/orders.js.map +1 -0
  863. package/dist/systems/production.js +322 -0
  864. package/dist/systems/production.js.map +1 -0
  865. package/dist/systems/productionQueue.js +120 -0
  866. package/dist/systems/productionQueue.js.map +1 -0
  867. package/dist/systems/victory.d.ts +1 -1
  868. package/dist/systems/victory.js +56 -0
  869. package/dist/systems/victory.js.map +1 -0
  870. package/dist/talk.d.ts +6 -6
  871. package/dist/talk.js +153 -0
  872. package/dist/talk.js.map +1 -0
  873. package/dist/targeting.d.ts +142 -0
  874. package/dist/targeting.js +49 -0
  875. package/dist/targeting.js.map +1 -0
  876. package/dist/tech.d.ts +20 -3
  877. package/dist/tech.js +239 -0
  878. package/dist/tech.js.map +1 -0
  879. package/dist/techTree.d.ts +7 -0
  880. package/dist/techTree.js +90 -0
  881. package/dist/techTree.js.map +1 -0
  882. package/dist/terrain.d.ts +59 -7
  883. package/dist/terrain.js +389 -0
  884. package/dist/terrain.js.map +1 -0
  885. package/dist/terrainSave.d.ts +6 -0
  886. package/dist/terrainSave.js +74 -0
  887. package/dist/terrainSave.js.map +1 -0
  888. package/dist/testing.d.ts +8 -7
  889. package/dist/testing.js +13 -739
  890. package/dist/testing.js.map +1 -1
  891. package/dist/tiles.d.ts +1 -1
  892. package/dist/tiles.js +43 -0
  893. package/dist/tiles.js.map +1 -0
  894. package/dist/timers.d.ts +29 -4
  895. package/dist/timers.js +242 -0
  896. package/dist/timers.js.map +1 -0
  897. package/dist/tomes.d.ts +4 -4
  898. package/dist/tomes.js +94 -0
  899. package/dist/tomes.js.map +1 -0
  900. package/dist/trade.js +103 -0
  901. package/dist/trade.js.map +1 -0
  902. package/dist/transport.d.ts +6 -1
  903. package/dist/transport.js +281 -0
  904. package/dist/transport.js.map +1 -0
  905. package/dist/tunables.d.ts +10 -3
  906. package/dist/tunables.js +56 -0
  907. package/dist/tunables.js.map +1 -0
  908. package/dist/unitResources.d.ts +67 -0
  909. package/dist/unitResources.js +266 -0
  910. package/dist/unitResources.js.map +1 -0
  911. package/dist/upkeep.d.ts +6 -1
  912. package/dist/upkeep.js +26 -0
  913. package/dist/upkeep.js.map +1 -0
  914. package/dist/veterancy.d.ts +8 -3
  915. package/dist/veterancy.js +131 -0
  916. package/dist/veterancy.js.map +1 -0
  917. package/dist/vision.d.ts +36 -0
  918. package/dist/vision.js +133 -0
  919. package/dist/vision.js.map +1 -0
  920. package/dist/walls.d.ts +1 -1
  921. package/dist/walls.js +278 -0
  922. package/dist/walls.js.map +1 -0
  923. package/dist/world.d.ts +606 -88
  924. package/dist/world.js +1263 -0
  925. package/dist/world.js.map +1 -0
  926. package/package.json +2 -2
  927. package/dist/ai.js.map +0 -1
  928. package/dist/attributes.d.ts +0 -66
  929. package/dist/brain-BvVdUhX8.js +0 -7659
  930. package/dist/brain-BvVdUhX8.js.map +0 -1
  931. package/dist/builds-C6LfgvEU.js +0 -460
  932. package/dist/builds-C6LfgvEU.js.map +0 -1
  933. package/dist/coreComponents-syuh2fPG.js +0 -5149
  934. package/dist/coreComponents-syuh2fPG.js.map +0 -1
  935. package/dist/debugCommands-CzjrSm66.js +0 -14739
  936. package/dist/debugCommands-CzjrSm66.js.map +0 -1
  937. package/dist/determinism-BCymQwiE.js +0 -518
  938. package/dist/determinism-BCymQwiE.js.map +0 -1
  939. package/dist/game-DiJEN-Ks.js +0 -5800
  940. package/dist/game-DiJEN-Ks.js.map +0 -1
  941. package/dist/index.js.map +0 -1
  942. package/dist/inspect-D9dWHmZ0.js.map +0 -1
  943. package/dist/local-Dkovq42k.js +0 -1379
  944. package/dist/local-Dkovq42k.js.map +0 -1
  945. package/dist/missionRules-C-bGxm0Q.js.map +0 -1
  946. package/dist/navigation-worker.js.map +0 -1
  947. package/dist/packs-g5thvmGn.js +0 -3199
  948. package/dist/packs-g5thvmGn.js.map +0 -1
  949. package/dist/profiles-B3NS9jwk.js.map +0 -1
  950. package/dist/server.js.map +0 -1
  951. package/dist/simulate-oXBiw1Ff.js.map +0 -1
@@ -0,0 +1,6 @@
1
+ /**
2
+ * The areas of abilities on the ground the player is told of (`Snapshot.areas`): zones for their life and delayed
3
+ * blasts until they go off, with their shape, their place and the seconds left; their side's, and others' where the
4
+ * player sees them. None to a computer
5
+ */
6
+ export declare const areasPart: import("..").SnapshotField<keyof import("..").Snapshot>;
@@ -0,0 +1,83 @@
1
+ import { lowerChain } from "../defs.js";
2
+ import { snapshotField } from "../replication.js";
3
+ import { effectIndex, effectOfList } from "./effectIndex.js";
4
+ import { effectArea } from "./shapes.js";
5
+ import { zoneContext } from "./effects.js";
6
+ //#region src/abilities/screen.ts
7
+ /**
8
+ * What the screens are told of abilities for their looks (E2E-PLAN AB19): the areas on the ground that last
9
+ * (`Snapshot.areas`: a zone for its life, a delayed blast until it goes off), with their shape and time
10
+ */
11
+ /** What a list of effects covers where it lands, for the screen: the first of its effects with an area */
12
+ function listArea(context, effects) {
13
+ for (const effect of lowerChain(effects)) {
14
+ const area = effectArea(context, effect);
15
+ if (area) return area;
16
+ }
17
+ }
18
+ /** Rounded for the screen: a hundredth of a cell is nothing to see */
19
+ var r = (n) => Math.round(n * 100) / 100;
20
+ /**
21
+ * The areas of abilities on the ground the player is told of (`Snapshot.areas`): zones for their life and delayed
22
+ * blasts until they go off, with their shape, their place and the seconds left; their side's, and others' where the
23
+ * player sees them. None to a computer
24
+ */
25
+ var areasPart = snapshotField("areas", (view) => {
26
+ if (view.forComputer) return void 0;
27
+ const { world } = view;
28
+ if (!world.zones.length && !world.delayed.length) return void 0;
29
+ const areas = [];
30
+ const tell = (kind, context, shape, left, effect, extra) => {
31
+ const { caster, ability, level } = context;
32
+ const ours = view.isAlly(caster.owner);
33
+ if (!ours && !view.sees(shape.x, shape.z) && !view.sees(context.point.x, context.point.z)) return;
34
+ const index = effect && effectIndex(ability, effect);
35
+ areas.push({
36
+ kind,
37
+ ability: ability.id,
38
+ level,
39
+ ...index !== void 0 && { effect: index },
40
+ ...view.knows(caster) && { source: caster.id },
41
+ shape: shape.shape,
42
+ x: r(shape.x),
43
+ z: r(shape.z),
44
+ heading: r(shape.heading),
45
+ radius: r(shape.radius),
46
+ ...shape.length && { length: r(shape.length) },
47
+ ...shape.width && { width: r(shape.width) },
48
+ ...shape.angle && { angle: r(shape.angle) },
49
+ left: r(left),
50
+ ...ours && { ours },
51
+ ...extra
52
+ });
53
+ };
54
+ for (const zone of world.zones) {
55
+ const context = zoneContext(world, zone);
56
+ const area = effectArea(context, zone.effect) ?? listArea(context, zone.effect.effects ?? []);
57
+ if (!area) continue;
58
+ tell("zone", context, area, zone.left, zone.effect, {
59
+ id: zone.id,
60
+ ...zone.follows !== void 0 && { follows: zone.follows }
61
+ });
62
+ }
63
+ for (const entry of world.delayed) {
64
+ const { caster, ability, level, point, from, heading } = entry;
65
+ const context = {
66
+ world,
67
+ caster,
68
+ ability,
69
+ level,
70
+ point,
71
+ ...from && { origin: from },
72
+ ...heading !== void 0 && { heading }
73
+ };
74
+ const area = listArea(context, entry.effects);
75
+ if (!area) continue;
76
+ tell("delayed", context, area, entry.left, effectOfList(ability, entry.effects), entry.impact ? { impact: entry.impact } : {});
77
+ }
78
+ return areas.length ? areas : void 0;
79
+ });
80
+ //#endregion
81
+ export { areasPart };
82
+
83
+ //# sourceMappingURL=screen.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"screen.js","names":[],"sources":["../../src/abilities/screen.ts"],"sourcesContent":["/**\n * What the screens are told of abilities for their looks (E2E-PLAN AB19): the areas on the ground that last\n * (`Snapshot.areas`: a zone for its life, a delayed blast until it goes off), with their shape and time\n */\nimport { type EffectDef, type EffectShape, lowerChain } from '#engine/defs'\nimport { snapshotField } from '../replication'\nimport type { AreaState } from '../session/protocol'\nimport { type EffectContext, zoneContext } from './effects'\nimport { effectArea } from './shapes'\nimport { effectIndex, effectOfList } from './effectIndex'\n\n/** What a list of effects covers where it lands, for the screen: the first of its effects with an area */\nfunction listArea(context: EffectContext, effects: readonly EffectDef[]) {\n\tfor (const effect of lowerChain(effects)) {\n\t\tconst area = effectArea(context, effect)\n\t\tif (area) return area\n\t}\n\treturn undefined\n}\n\n/** Rounded for the screen: a hundredth of a cell is nothing to see */\nconst r = (n: number) => Math.round(n * 100) / 100\n\n/**\n * The areas of abilities on the ground the player is told of (`Snapshot.areas`): zones for their life and delayed\n * blasts until they go off, with their shape, their place and the seconds left; their side's, and others' where the\n * player sees them. None to a computer\n */\nexport const areasPart = snapshotField('areas', (view) => {\n\tif (view.forComputer) return undefined\n\tconst { world } = view\n\tif (!world.zones.length && !world.delayed.length) return undefined\n\tconst areas: AreaState[] = []\n\tconst tell = (\n\t\tkind: AreaState['kind'],\n\t\tcontext: EffectContext,\n\t\tshape: { shape: EffectShape; x: number; z: number; heading: number; radius: number; length: number; width: number; angle: number },\n\t\tleft: number,\n\t\teffect: EffectDef | undefined,\n\t\textra: Partial<AreaState>\n\t) => {\n\t\tconst { caster, ability, level } = context\n\t\tconst ours = view.isAlly(caster.owner)\n\t\tif (!ours && !view.sees(shape.x, shape.z) && !view.sees(context.point.x, context.point.z)) return\n\t\tconst index = effect && effectIndex(ability, effect)\n\t\tareas.push({\n\t\t\tkind,\n\t\t\tability: ability.id,\n\t\t\tlevel,\n\t\t\t...(index !== undefined && { effect: index }),\n\t\t\t...(view.knows(caster) && { source: caster.id }),\n\t\t\tshape: shape.shape,\n\t\t\tx: r(shape.x),\n\t\t\tz: r(shape.z),\n\t\t\theading: r(shape.heading),\n\t\t\tradius: r(shape.radius),\n\t\t\t...(shape.length && { length: r(shape.length) }),\n\t\t\t...(shape.width && { width: r(shape.width) }),\n\t\t\t...(shape.angle && { angle: r(shape.angle) }),\n\t\t\tleft: r(left),\n\t\t\t...(ours && { ours }),\n\t\t\t...extra\n\t\t})\n\t}\n\tfor (const zone of world.zones) {\n\t\tconst context = zoneContext(world, zone)\n\t\tconst area = effectArea(context, zone.effect) ?? listArea(context, zone.effect.effects ?? [])\n\t\tif (!area) continue\n\t\ttell('zone', context, area, zone.left, zone.effect, { id: zone.id, ...(zone.follows !== undefined && { follows: zone.follows }) })\n\t}\n\tfor (const entry of world.delayed) {\n\t\tconst { caster, ability, level, point, from, heading } = entry\n\t\tconst context: EffectContext = { world, caster, ability, level, point, ...(from && { origin: from }), ...(heading !== undefined && { heading }) }\n\t\tconst area = listArea(context, entry.effects)\n\t\tif (!area) continue\n\t\ttell('delayed', context, area, entry.left, effectOfList(ability, entry.effects), entry.impact ? { impact: entry.impact } : {})\n\t}\n\treturn areas.length ? areas : undefined\n})\n"],"mappings":";;;;;;;;;;;AAYA,SAAS,SAAS,SAAwB,SAA+B;CACxE,KAAK,MAAM,UAAU,WAAW,OAAO,GAAG;EACzC,MAAM,OAAO,WAAW,SAAS,MAAM;EACvC,IAAI,MAAM,OAAO;CAClB;AAED;;AAGA,IAAM,KAAK,MAAc,KAAK,MAAM,IAAI,GAAG,IAAI;;;;;;AAO/C,IAAa,YAAY,cAAc,UAAU,SAAS;CACzD,IAAI,KAAK,aAAa,OAAO,KAAA;CAC7B,MAAM,EAAE,UAAU;CAClB,IAAI,CAAC,MAAM,MAAM,UAAU,CAAC,MAAM,QAAQ,QAAQ,OAAO,KAAA;CACzD,MAAM,QAAqB,CAAC;CAC5B,MAAM,QACL,MACA,SACA,OACA,MACA,QACA,UACI;EACJ,MAAM,EAAE,QAAQ,SAAS,UAAU;EACnC,MAAM,OAAO,KAAK,OAAO,OAAO,KAAK;EACrC,IAAI,CAAC,QAAQ,CAAC,KAAK,KAAK,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,KAAK,QAAQ,MAAM,GAAG,QAAQ,MAAM,CAAC,GAAG;EAC3F,MAAM,QAAQ,UAAU,YAAY,SAAS,MAAM;EACnD,MAAM,KAAK;GACV;GACA,SAAS,QAAQ;GACjB;GACA,GAAI,UAAU,KAAA,KAAa,EAAE,QAAQ,MAAM;GAC3C,GAAI,KAAK,MAAM,MAAM,KAAK,EAAE,QAAQ,OAAO,GAAG;GAC9C,OAAO,MAAM;GACb,GAAG,EAAE,MAAM,CAAC;GACZ,GAAG,EAAE,MAAM,CAAC;GACZ,SAAS,EAAE,MAAM,OAAO;GACxB,QAAQ,EAAE,MAAM,MAAM;GACtB,GAAI,MAAM,UAAU,EAAE,QAAQ,EAAE,MAAM,MAAM,EAAE;GAC9C,GAAI,MAAM,SAAS,EAAE,OAAO,EAAE,MAAM,KAAK,EAAE;GAC3C,GAAI,MAAM,SAAS,EAAE,OAAO,EAAE,MAAM,KAAK,EAAE;GAC3C,MAAM,EAAE,IAAI;GACZ,GAAI,QAAQ,EAAE,KAAK;GACnB,GAAG;EACJ,CAAC;CACF;CACA,KAAK,MAAM,QAAQ,MAAM,OAAO;EAC/B,MAAM,UAAU,YAAY,OAAO,IAAI;EACvC,MAAM,OAAO,WAAW,SAAS,KAAK,MAAM,KAAK,SAAS,SAAS,KAAK,OAAO,WAAW,CAAC,CAAC;EAC5F,IAAI,CAAC,MAAM;EACX,KAAK,QAAQ,SAAS,MAAM,KAAK,MAAM,KAAK,QAAQ;GAAE,IAAI,KAAK;GAAI,GAAI,KAAK,YAAY,KAAA,KAAa,EAAE,SAAS,KAAK,QAAQ;EAAG,CAAC;CAClI;CACA,KAAK,MAAM,SAAS,MAAM,SAAS;EAClC,MAAM,EAAE,QAAQ,SAAS,OAAO,OAAO,MAAM,YAAY;EACzD,MAAM,UAAyB;GAAE;GAAO;GAAQ;GAAS;GAAO;GAAO,GAAI,QAAQ,EAAE,QAAQ,KAAK;GAAI,GAAI,YAAY,KAAA,KAAa,EAAE,QAAQ;EAAG;EAChJ,MAAM,OAAO,SAAS,SAAS,MAAM,OAAO;EAC5C,IAAI,CAAC,MAAM;EACX,KAAK,WAAW,SAAS,MAAM,MAAM,MAAM,aAAa,SAAS,MAAM,OAAO,GAAG,MAAM,SAAS,EAAE,QAAQ,MAAM,OAAO,IAAI,CAAC,CAAC;CAC9H;CACA,OAAO,MAAM,SAAS,QAAQ,KAAA;AAC/B,CAAC"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * The shapes of what an effect covers (E2E-PLAN AB10): a circle (its `radius`), a cone, a line, a rectangle, a ring, an
3
+ * arc and a cross, turned the way the ability was aimed, worked out where it lands (`effectArea`) and asked of each unit
4
+ * (`inArea`). `effectTargets` reads them for every effect, a zone for what is inside it
5
+ */
6
+ import type { EffectDef, EffectShape } from '#engine/defs';
7
+ import type { Entity } from '#engine/entity';
8
+ import type { Vec2 } from '#engine/math';
9
+ import type { EffectContext } from './effects';
10
+ /**
11
+ * What an effect covers where it lands (`effectArea`): its shape, where it is laid and the way it faces, with its sizes
12
+ * worked out. A circle, a ring, a rectangle and a cross lie around the point it landed on; a cone, a line and an arc go
13
+ * off from where the effects do (the caster, or the context's `origin`)
14
+ *
15
+ * @beta
16
+ */
17
+ export interface EffectArea {
18
+ /** Which shape it is: circle, cone, line, rect, ring, arc or cross (`EffectCommon.shape`) */
19
+ shape: EffectShape;
20
+ /** Where it is laid: its middle (circle, ring, rect, cross), or where it goes off from (cone, line, arc) */
21
+ x: number;
22
+ /** Where it is laid along z, as `x` is along x */
23
+ z: number;
24
+ /** The way it faces, as a unit's `facing` is (radians, 0 along +z) */
25
+ heading: number;
26
+ /** Of a circle, a ring and an arc: how far out it reaches */
27
+ radius: number;
28
+ /** Of a cone, a line, a rectangle and a cross: how long it is, end to end */
29
+ length: number;
30
+ /** Of a line, a rectangle and a cross: how far out it covers on either side; of a ring and an arc, how thick */
31
+ width: number;
32
+ /** Of a cone and an arc: how wide it opens, in radians */
33
+ angle: number;
34
+ }
35
+ /**
36
+ * The way the effects of a context face: its `heading` where it has one (a zone's, a missile's way), from where they go
37
+ * off from (`effectOrigin`) to where they landed otherwise, and the way the caster looks where those are one place
38
+ *
39
+ * @beta
40
+ */
41
+ export declare function effectHeading(context: EffectContext): number;
42
+ /**
43
+ * What an effect covers where it lands (`EffectCommon.shape`, its `radius`, `length`, `width` and `angle`, code asked as
44
+ * it lands): undefined for one that covers no area (no shape, and no radius), which is for its target alone. What a game's
45
+ * own effect asks to cover what the engine's would (`inArea` of each unit)
46
+ *
47
+ * @beta
48
+ */
49
+ export declare function effectArea(context: EffectContext, effect: EffectDef): EffectArea | undefined;
50
+ /**
51
+ * How far from where an area is laid (`EffectArea.x`, `z`) the farthest of it is: what to look for units within
52
+ *
53
+ * @beta
54
+ */
55
+ export declare function areaReach(area: EffectArea): number;
56
+ /**
57
+ * Whether something `radius` round at a place is in an area, any of it (`effectArea`): what an effect with a shape
58
+ * reaches
59
+ *
60
+ * @beta
61
+ */
62
+ export declare function inArea(area: EffectArea, at: Vec2, radius?: number): boolean;
63
+ /** How far round a unit is, for an area: its footprint's half, for a building */
64
+ export declare const edgeRadius: (entity: Entity) => number;
65
+ /** Whether an effect, or one it holds, covers an area of a shape other than a circle: what a zone and a delay keep the way of */
66
+ export declare function shaped(effects: readonly EffectDef[] | undefined): boolean;
@@ -0,0 +1,122 @@
1
+ import { atan2, cos, hypot, sin } from "../exactMath.js";
2
+ import { effectOrigin } from "./land.js";
3
+ import { valueOf } from "./amounts.js";
4
+ //#region src/abilities/shapes.ts
5
+ /** The shapes that go off from where the effects go off from, rather than lie around where they landed */
6
+ var FROM_ORIGIN = /* @__PURE__ */ new Set([
7
+ "cone",
8
+ "line",
9
+ "arc"
10
+ ]);
11
+ /**
12
+ * The way the effects of a context face: its `heading` where it has one (a zone's, a missile's way), from where they go
13
+ * off from (`effectOrigin`) to where they landed otherwise, and the way the caster looks where those are one place
14
+ *
15
+ * @beta
16
+ */
17
+ function effectHeading(context) {
18
+ if (context.heading !== void 0) return context.heading;
19
+ const from = effectOrigin(context);
20
+ const dx = context.point.x - from.x;
21
+ const dz = context.point.z - from.z;
22
+ return hypot(dx, dz) > .01 ? atan2(dx, dz) : context.caster.facing;
23
+ }
24
+ /**
25
+ * What an effect covers where it lands (`EffectCommon.shape`, its `radius`, `length`, `width` and `angle`, code asked as
26
+ * it lands): undefined for one that covers no area (no shape, and no radius), which is for its target alone. What a game's
27
+ * own effect asks to cover what the engine's would (`inArea` of each unit)
28
+ *
29
+ * @beta
30
+ */
31
+ function effectArea(context, effect) {
32
+ const fields = effect;
33
+ const radius = valueOf(context, fields.radius);
34
+ const shape = fields.shape ?? (radius ? "circle" : void 0);
35
+ if (!shape || shape === "circle" && !radius) return void 0;
36
+ const at = FROM_ORIGIN.has(shape) ? effectOrigin(context) : context.point;
37
+ return {
38
+ shape,
39
+ x: at.x,
40
+ z: at.z,
41
+ heading: shape === "circle" ? 0 : effectHeading(context),
42
+ radius,
43
+ length: valueOf(context, fields.length),
44
+ width: valueOf(context, fields.width, void 0, 1),
45
+ angle: valueOf(context, fields.angle)
46
+ };
47
+ }
48
+ /**
49
+ * How far from where an area is laid (`EffectArea.x`, `z`) the farthest of it is: what to look for units within
50
+ *
51
+ * @beta
52
+ */
53
+ function areaReach(area) {
54
+ switch (area.shape) {
55
+ case "circle":
56
+ case "ring":
57
+ case "arc": return area.radius;
58
+ case "cone": return area.length;
59
+ case "line": return hypot(area.length, area.width);
60
+ default: return hypot(area.length / 2, area.width);
61
+ }
62
+ }
63
+ /** How far a point is from a stretch along `heading`, `from` to `to` of the way, and `width` out on either side */
64
+ function fromBand(area, at, heading, from, to) {
65
+ const dx = at.x - area.x;
66
+ const dz = at.z - area.z;
67
+ const s = sin(heading);
68
+ const c = cos(heading);
69
+ const along = dx * s + dz * c;
70
+ const across = Math.abs(dx * c - dz * s);
71
+ return hypot(Math.max(from - along, along - to, 0), Math.max(across - area.width, 0));
72
+ }
73
+ /** How far round from the way an area faces a point lies, either way: 0 to π */
74
+ function turnFrom(heading, dx, dz) {
75
+ let turn = Math.abs(atan2(dx, dz) - heading) % (Math.PI * 2);
76
+ if (turn > Math.PI) turn = Math.PI * 2 - turn;
77
+ return turn;
78
+ }
79
+ /**
80
+ * Whether something `radius` round at a place is in an area, any of it (`effectArea`): what an effect with a shape
81
+ * reaches
82
+ *
83
+ * @beta
84
+ */
85
+ function inArea(area, at, radius = 0) {
86
+ const dx = at.x - area.x;
87
+ const dz = at.z - area.z;
88
+ const far = hypot(dx, dz);
89
+ switch (area.shape) {
90
+ case "circle": return far - radius <= area.radius;
91
+ case "ring": return Math.max(area.radius - area.width - far, far - area.radius, 0) <= radius;
92
+ case "line": return fromBand(area, at, area.heading, 0, area.length) <= radius;
93
+ case "rect": return fromBand(area, at, area.heading, -area.length / 2, area.length / 2) <= radius;
94
+ case "cross": return fromBand(area, at, area.heading + Math.PI / 4, -area.length / 2, area.length / 2) <= radius || fromBand(area, at, area.heading - Math.PI / 4, -area.length / 2, area.length / 2) <= radius;
95
+ case "cone": {
96
+ if (far - radius > area.length) return false;
97
+ if (far <= radius) return true;
98
+ const past = turnFrom(area.heading, dx, dz) - area.angle / 2;
99
+ return past <= 0 || (past < Math.PI / 2 ? far * sin(past) : far) <= radius;
100
+ }
101
+ case "arc": {
102
+ const out = Math.max(area.radius - area.width - far, far - area.radius, 0);
103
+ const past = turnFrom(area.heading, dx, dz) - area.angle / 2;
104
+ const round = past <= 0 ? 0 : far * sin(Math.min(past, Math.PI / 2));
105
+ return hypot(out, round) <= radius;
106
+ }
107
+ }
108
+ }
109
+ /** How far round a unit is, for an area: its footprint's half, for a building */
110
+ var edgeRadius = (entity) => entity.def.footprint ? Math.max(entity.def.footprint.w, entity.def.footprint.d) / 2 : entity.def.radius;
111
+ /** Whether an effect, or one it holds, covers an area of a shape other than a circle: what a zone and a delay keep the way of */
112
+ function shaped(effects) {
113
+ for (const effect of effects ?? []) {
114
+ const fields = effect;
115
+ if (fields.shape && fields.shape !== "circle" || shaped(fields.effects) || shaped(fields.onEnd) || shaped(fields.split) || shaped(fields.onWall)) return true;
116
+ }
117
+ return false;
118
+ }
119
+ //#endregion
120
+ export { areaReach, edgeRadius, effectArea, effectHeading, inArea, shaped };
121
+
122
+ //# sourceMappingURL=shapes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shapes.js","names":[],"sources":["../../src/abilities/shapes.ts"],"sourcesContent":["/**\n * The shapes of what an effect covers (E2E-PLAN AB10): a circle (its `radius`), a cone, a line, a rectangle, a ring, an\n * arc and a cross, turned the way the ability was aimed, worked out where it lands (`effectArea`) and asked of each unit\n * (`inArea`). `effectTargets` reads them for every effect, a zone for what is inside it\n */\nimport type { AnyEffect, EffectDef, EffectShape } from '#engine/defs'\nimport type { Entity } from '#engine/entity'\nimport { atan2, cos, hypot, sin } from '#engine/exactMath'\nimport type { Vec2 } from '#engine/math'\nimport { valueOf } from './amounts'\nimport type { EffectContext } from './effects'\nimport { effectOrigin } from './land'\n\n/**\n * What an effect covers where it lands (`effectArea`): its shape, where it is laid and the way it faces, with its sizes\n * worked out. A circle, a ring, a rectangle and a cross lie around the point it landed on; a cone, a line and an arc go\n * off from where the effects do (the caster, or the context's `origin`)\n *\n * @beta\n */\nexport interface EffectArea {\n\t/** Which shape it is: circle, cone, line, rect, ring, arc or cross (`EffectCommon.shape`) */\n\tshape: EffectShape\n\t/** Where it is laid: its middle (circle, ring, rect, cross), or where it goes off from (cone, line, arc) */\n\tx: number\n\t/** Where it is laid along z, as `x` is along x */\n\tz: number\n\t/** The way it faces, as a unit's `facing` is (radians, 0 along +z) */\n\theading: number\n\t/** Of a circle, a ring and an arc: how far out it reaches */\n\tradius: number\n\t/** Of a cone, a line, a rectangle and a cross: how long it is, end to end */\n\tlength: number\n\t/** Of a line, a rectangle and a cross: how far out it covers on either side; of a ring and an arc, how thick */\n\twidth: number\n\t/** Of a cone and an arc: how wide it opens, in radians */\n\tangle: number\n}\n\n/** The shapes that go off from where the effects go off from, rather than lie around where they landed */\nconst FROM_ORIGIN: ReadonlySet<EffectShape> = new Set(['cone', 'line', 'arc'])\n\n/**\n * The way the effects of a context face: its `heading` where it has one (a zone's, a missile's way), from where they go\n * off from (`effectOrigin`) to where they landed otherwise, and the way the caster looks where those are one place\n *\n * @beta\n */\nexport function effectHeading(context: EffectContext): number {\n\tif (context.heading !== undefined) return context.heading\n\tconst from = effectOrigin(context)\n\tconst dx = context.point.x - from.x\n\tconst dz = context.point.z - from.z\n\treturn hypot(dx, dz) > 0.01 ? atan2(dx, dz) : context.caster.facing\n}\n\n/**\n * What an effect covers where it lands (`EffectCommon.shape`, its `radius`, `length`, `width` and `angle`, code asked as\n * it lands): undefined for one that covers no area (no shape, and no radius), which is for its target alone. What a game's\n * own effect asks to cover what the engine's would (`inArea` of each unit)\n *\n * @beta\n */\nexport function effectArea(context: EffectContext, effect: EffectDef): EffectArea | undefined {\n\tconst fields = effect as AnyEffect\n\tconst radius = valueOf(context, fields.radius)\n\tconst shape = fields.shape ?? (radius ? 'circle' : undefined)\n\tif (!shape || (shape === 'circle' && !radius)) return undefined\n\tconst at = FROM_ORIGIN.has(shape) ? effectOrigin(context) : context.point\n\treturn {\n\t\tshape,\n\t\tx: at.x,\n\t\tz: at.z,\n\t\theading: shape === 'circle' ? 0 : effectHeading(context),\n\t\tradius,\n\t\tlength: valueOf(context, fields.length),\n\t\twidth: valueOf(context, fields.width, undefined, 1),\n\t\tangle: valueOf(context, fields.angle)\n\t}\n}\n\n/**\n * How far from where an area is laid (`EffectArea.x`, `z`) the farthest of it is: what to look for units within\n *\n * @beta\n */\nexport function areaReach(area: EffectArea): number {\n\tswitch (area.shape) {\n\t\tcase 'circle':\n\t\tcase 'ring':\n\t\tcase 'arc':\n\t\t\treturn area.radius\n\t\tcase 'cone':\n\t\t\treturn area.length\n\t\tcase 'line':\n\t\t\treturn hypot(area.length, area.width)\n\t\tdefault:\n\t\t\treturn hypot(area.length / 2, area.width)\n\t}\n}\n\n/** How far a point is from a stretch along `heading`, `from` to `to` of the way, and `width` out on either side */\nfunction fromBand(area: EffectArea, at: Vec2, heading: number, from: number, to: number): number {\n\tconst dx = at.x - area.x\n\tconst dz = at.z - area.z\n\tconst s = sin(heading)\n\tconst c = cos(heading)\n\tconst along = dx * s + dz * c\n\tconst across = Math.abs(dx * c - dz * s)\n\treturn hypot(Math.max(from - along, along - to, 0), Math.max(across - area.width, 0))\n}\n\n/** How far round from the way an area faces a point lies, either way: 0 to π */\nfunction turnFrom(heading: number, dx: number, dz: number): number {\n\tlet turn = Math.abs(atan2(dx, dz) - heading) % (Math.PI * 2)\n\tif (turn > Math.PI) turn = Math.PI * 2 - turn\n\treturn turn\n}\n\n/**\n * Whether something `radius` round at a place is in an area, any of it (`effectArea`): what an effect with a shape\n * reaches\n *\n * @beta\n */\nexport function inArea(area: EffectArea, at: Vec2, radius = 0): boolean {\n\tconst dx = at.x - area.x\n\tconst dz = at.z - area.z\n\tconst far = hypot(dx, dz)\n\tswitch (area.shape) {\n\t\tcase 'circle':\n\t\t\treturn far - radius <= area.radius\n\t\tcase 'ring':\n\t\t\treturn Math.max(area.radius - area.width - far, far - area.radius, 0) <= radius\n\t\tcase 'line':\n\t\t\treturn fromBand(area, at, area.heading, 0, area.length) <= radius\n\t\tcase 'rect':\n\t\t\treturn fromBand(area, at, area.heading, -area.length / 2, area.length / 2) <= radius\n\t\tcase 'cross':\n\t\t\treturn (\n\t\t\t\tfromBand(area, at, area.heading + Math.PI / 4, -area.length / 2, area.length / 2) <= radius ||\n\t\t\t\tfromBand(area, at, area.heading - Math.PI / 4, -area.length / 2, area.length / 2) <= radius\n\t\t\t)\n\t\tcase 'cone': {\n\t\t\tif (far - radius > area.length) return false\n\t\t\tif (far <= radius) return true\n\t\t\tconst past = turnFrom(area.heading, dx, dz) - area.angle / 2\n\t\t\t// within its opening, or near enough to one of its sides\n\t\t\treturn past <= 0 || (past < Math.PI / 2 ? far * sin(past) : far) <= radius\n\t\t}\n\t\tcase 'arc': {\n\t\t\tconst out = Math.max(area.radius - area.width - far, far - area.radius, 0)\n\t\t\tconst past = turnFrom(area.heading, dx, dz) - area.angle / 2\n\t\t\tconst round = past <= 0 ? 0 : far * sin(Math.min(past, Math.PI / 2))\n\t\t\treturn hypot(out, round) <= radius\n\t\t}\n\t}\n}\n\n/** How far round a unit is, for an area: its footprint's half, for a building */\nexport const edgeRadius = (entity: Entity): number =>\n\tentity.def.footprint ? Math.max(entity.def.footprint.w, entity.def.footprint.d) / 2 : entity.def.radius\n\n/** Whether an effect, or one it holds, covers an area of a shape other than a circle: what a zone and a delay keep the way of */\nexport function shaped(effects: readonly EffectDef[] | undefined): boolean {\n\tfor (const effect of effects ?? []) {\n\t\tconst fields = effect as AnyEffect\n\t\tif ((fields.shape && fields.shape !== 'circle') || shaped(fields.effects) || shaped(fields.onEnd) || shaped(fields.split) || shaped(fields.onWall)) return true\n\t}\n\treturn false\n}\n"],"mappings":"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"}
@@ -1,10 +1,11 @@
1
- import { type AbilityDef, type BuffDef, type Scaled, type Scaling, type StatKey, type Stats } from '#engine/defs';
1
+ import { type AbilityDef, type BuffDef, type EffectValue, type Scaled, type Scaling, type StatKey, type Stats } from '#engine/defs';
2
2
  /**
3
3
  * What the caster brings to an ability's numbers: its stats now, its level as a hero, and the attack damage of its own
4
4
  *
5
5
  * @beta
6
6
  */
7
7
  export interface CasterFacts {
8
+ /** The stats of the caster now, which the numbers of an ability scale from */
8
9
  stats: Readonly<Stats>;
9
10
  /** 1 for what is not a hero */
10
11
  heroLevel: number;
@@ -17,9 +18,11 @@ export interface CasterFacts {
17
18
  * @beta
18
19
  */
19
20
  export interface AbilityTextContext {
21
+ /** The ability the text is worked out for */
20
22
  ability: AbilityDef;
21
23
  /** The level of the ability: 1 for one that has no levels */
22
24
  level: number;
25
+ /** What the caster brings to the ability's numbers: its stats, hero level and own attack damage */
23
26
  caster: CasterFacts;
24
27
  /** A buff by id, for how long the ones the ability puts on last */
25
28
  buff?: (id: string) => BuffDef | undefined;
@@ -45,9 +48,11 @@ export interface ValuePart {
45
48
  * @beta
46
49
  */
47
50
  export interface AbilityValue {
51
+ /** The value in full: `base` and every part added up */
48
52
  total: number;
49
53
  /** What it is without the stats of the caster */
50
54
  base: number;
55
+ /** The stat-scaled parts of the value, one for each stat of the caster that adds to it */
51
56
  parts: ValuePart[];
52
57
  /** What follows the number: `s` for seconds, `%`. Nothing when left out */
53
58
  unit?: string;
@@ -72,10 +77,17 @@ export type TextSegment = string | {
72
77
  name: string;
73
78
  value: AbilityValue;
74
79
  };
80
+ /**
81
+ * The value of an amount for an ability's text (`abilityValues`): at the level, or what its code says for the caster
82
+ * as it is, with no effect landing and no target
83
+ *
84
+ * @beta
85
+ */
86
+ export declare function valueFor(value: EffectValue | undefined, level: number, caster: CasterFacts, fallback?: number): number;
75
87
  /**
76
88
  * The values of an ability at a level, for a caster, by name: its own (`AbilityDef.values`), and what its effects say
77
89
  * when it does not name them itself: `damage`, `heal`, `shield` and `amount` (the first effect of each kind with an
78
- * amount), `duration`, `radius`, `range`, `cooldown`, `charges` and `refill`, `mana`, `count` and `distance`
90
+ * amount), `duration`, `radius`, `chance` (in percent), `range`, `cooldown`, `charges` and `refill`, `mana`, `window` (a recast's), `count` and `distance`
79
91
  *
80
92
  * @beta
81
93
  */
@@ -0,0 +1,204 @@
1
+ import { anyEffect, at, innerEffects } from "../defs.js";
2
+ //#region src/abilities/text.ts
3
+ /**
4
+ * An amount with what the stats of the caster add to it, and the parts that come from each: the same arithmetic as
5
+ * the simulation (`scaled`)
6
+ *
7
+ * @internal
8
+ */
9
+ function scaledParts(amount, scaling, level, caster) {
10
+ const parts = [];
11
+ let total = amount;
12
+ if (scaling) for (const key in scaling) {
13
+ const stat = key;
14
+ const ratio = at(scaling[stat], level);
15
+ if (!ratio) continue;
16
+ const part = (stat === "level" ? caster.heroLevel - 1 : stat === "bonusAttackDamage" ? Math.max(caster.stats.attackDamage - caster.ownAttackDamage, 0) : caster.stats[stat]) * ratio;
17
+ total += part;
18
+ parts.push({
19
+ stat,
20
+ ratio,
21
+ amount: part
22
+ });
23
+ }
24
+ return {
25
+ total,
26
+ base: amount,
27
+ parts
28
+ };
29
+ }
30
+ /**
31
+ * The value of an amount for an ability's text (`abilityValues`): at the level, or what its code says for the caster
32
+ * as it is, with no effect landing and no target
33
+ *
34
+ * @beta
35
+ */
36
+ function valueFor(value, level, caster, fallback = 0) {
37
+ if (typeof value !== "function") return at(value, level, fallback);
38
+ return value({
39
+ level,
40
+ caster
41
+ });
42
+ }
43
+ /** The effects of an ability, those inside others (a missile's, a delay's) too, in order */
44
+ function* allEffects(effects) {
45
+ for (const effect of effects ?? []) {
46
+ yield effect;
47
+ yield* allEffects(innerEffects(effect));
48
+ }
49
+ }
50
+ /**
51
+ * The values of an ability at a level, for a caster, by name: its own (`AbilityDef.values`), and what its effects say
52
+ * when it does not name them itself: `damage`, `heal`, `shield` and `amount` (the first effect of each kind with an
53
+ * amount), `duration`, `radius`, `chance` (in percent), `range`, `cooldown`, `charges` and `refill`, `mana`, `window` (a recast's), `count` and `distance`
54
+ *
55
+ * @beta
56
+ */
57
+ function abilityValues(ability, level, caster, buff) {
58
+ const values = /* @__PURE__ */ new Map();
59
+ const context = {
60
+ ability,
61
+ level,
62
+ caster,
63
+ buff,
64
+ value: (name) => values.get(name)
65
+ };
66
+ const plain = (total, unit) => ({
67
+ total,
68
+ base: total,
69
+ parts: [],
70
+ unit
71
+ });
72
+ const found = (name, value) => {
73
+ if (value && !values.has(name)) values.set(name, value);
74
+ };
75
+ for (const effect of [...allEffects([...ability.effects, ...ability.passive ?? []])].map(anyEffect)) {
76
+ if (effect.amount !== void 0 || effect.scaling) {
77
+ const value = scaledParts(valueFor(effect.amount, level, caster), effect.scaling, level, caster);
78
+ if (effect.type === "damage" || effect.type === "heal") found(effect.type, value);
79
+ found("amount", value);
80
+ }
81
+ if (effect.duration !== void 0) found("duration", plain(valueFor(effect.duration, level, caster), "s"));
82
+ else if (effect.buff && buff) {
83
+ const lasting = buff(effect.buff)?.duration;
84
+ if (lasting !== void 0) found("duration", plain(at(lasting, level), "s"));
85
+ }
86
+ if (effect.radius !== void 0) found("radius", plain(valueFor(effect.radius, level, caster)));
87
+ if (effect.chance !== void 0) found("chance", plain(valueFor(effect.chance, level, caster) * 100, "%"));
88
+ if (effect.count !== void 0) found("count", plain(at(effect.count, level)));
89
+ if (effect.distance !== void 0) found("distance", plain(at(effect.distance, level)));
90
+ }
91
+ if (ability.range !== void 0) found("range", plain(at(ability.range, level)));
92
+ if (ability.cooldown !== void 0) found("cooldown", plain(at(ability.cooldown, level), "s"));
93
+ if (ability.charges) {
94
+ found("charges", plain(at(ability.charges.count, level)));
95
+ found("refill", plain(at(ability.charges.refill, level), "s"));
96
+ }
97
+ if (ability.manaCost !== void 0) found("mana", plain(at(ability.manaCost, level)));
98
+ if (ability.recast) found("window", plain(at(ability.recast.window, level), "s"));
99
+ for (const [name, def] of Object.entries(ability.values ?? {})) {
100
+ let value;
101
+ if (typeof def === "function") {
102
+ const made = def(context);
103
+ value = typeof made === "number" ? plain(made) : made;
104
+ } else {
105
+ value = scaledParts(at(def.amount, level), def.scaling, level, caster);
106
+ if (def.percent) {
107
+ value = {
108
+ total: value.total * 100,
109
+ base: value.base * 100,
110
+ parts: value.parts.map((part) => ({
111
+ ...part,
112
+ ratio: part.ratio * 100,
113
+ amount: part.amount * 100
114
+ }))
115
+ };
116
+ value.unit = "%";
117
+ }
118
+ if (def.unit) value.unit = def.unit;
119
+ }
120
+ values.set(name, value);
121
+ }
122
+ return values;
123
+ }
124
+ /**
125
+ * What the ability says it does, for this caster now: its description with each `{value}` worked out (or its own
126
+ * `describe`), as words and values. A name it has no value for is left as it is written, braces and all
127
+ *
128
+ * @beta
129
+ */
130
+ function describeAbility(ability, level, caster, buff) {
131
+ const values = abilityValues(ability, level, caster, buff);
132
+ const context = {
133
+ ability,
134
+ level,
135
+ caster,
136
+ buff,
137
+ value: (name) => values.get(name)
138
+ };
139
+ const said = ability.describe ? ability.describe(context) : ability.description ?? "";
140
+ if (typeof said !== "string") return said;
141
+ const segments = [];
142
+ let from = 0;
143
+ for (const match of said.matchAll(/\{([a-zA-Z][\w.]*)\}/g)) {
144
+ const value = values.get(match[1]);
145
+ if (!value) continue;
146
+ if (match.index > from) segments.push(said.slice(from, match.index));
147
+ segments.push({
148
+ name: match[1],
149
+ value
150
+ });
151
+ from = match.index + match[0].length;
152
+ }
153
+ if (from < said.length) segments.push(said.slice(from));
154
+ return segments;
155
+ }
156
+ /**
157
+ * How a stat is called in the text of an ability
158
+ *
159
+ * @beta
160
+ */
161
+ var STAT_WORDS = {
162
+ abilityPower: "ability power",
163
+ attackDamage: "attack damage",
164
+ bonusAttackDamage: "bonus attack damage",
165
+ health: "max health",
166
+ mana: "max mana",
167
+ armor: "armor",
168
+ magicResist: "magic resist",
169
+ moveSpeed: "move speed",
170
+ attackSpeed: "attack speed",
171
+ level: "per level"
172
+ };
173
+ /**
174
+ * A number as an ability's text shows it: whole, or with one decimal when it is small and has one
175
+ *
176
+ * @beta
177
+ */
178
+ function formatNumber(value) {
179
+ const rounded = Math.abs(value) < 10 ? Math.round(value * 10) / 10 : Math.round(value);
180
+ return String(rounded);
181
+ }
182
+ /**
183
+ * A value in words: `80`, or `80 (50 + 60% ability power)` when stats add to it
184
+ *
185
+ * @beta
186
+ */
187
+ function valueText(value) {
188
+ const total = `${formatNumber(value.total)}${value.unit ?? ""}`;
189
+ if (value.parts.length === 0) return total;
190
+ const parts = value.parts.map((part) => part.stat === "level" ? `${formatNumber(part.ratio)} per level` : `${formatNumber(part.ratio * 100)}% ${STAT_WORDS[part.stat] ?? part.stat}`);
191
+ return `${total} (${[...value.base ? [formatNumber(value.base)] : [], ...parts].join(" + ")})`;
192
+ }
193
+ /**
194
+ * The text of an ability as plain words: for a tooltip of words only, a log, a test
195
+ *
196
+ * @beta
197
+ */
198
+ function abilityText(segments) {
199
+ return segments.map((segment) => typeof segment === "string" ? segment : valueText(segment.value)).join("");
200
+ }
201
+ //#endregion
202
+ export { STAT_WORDS, abilityText, abilityValues, describeAbility, formatNumber, scaledParts, valueFor, valueText };
203
+
204
+ //# sourceMappingURL=text.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text.js","names":[],"sources":["../../src/abilities/text.ts"],"sourcesContent":["import {\n\ttype AbilityDef,\n\tanyEffect,\n\tat,\n\ttype BuffDef,\n\ttype EffectDef,\n\tinnerEffects,\n\ttype EffectValue,\n\ttype EffectValueContext,\n\ttype Scaled,\n\ttype Scaling,\n\ttype StatKey,\n\ttype Stats\n} from '#engine/defs'\n\n/*\n * What an ability says it does, worked out for the one who has it: \"deals 80 (50 + 60% ability power)\", not \"deals\n * 50/100/150 plus 60% of ability power\". Its description is a template with values in braces (`{damage}`), each worked\n * out from the caster's stats as they are now, the same way the simulation does it (`scaled`, `stats.ts`). The values\n * are the ability's own (`AbilityDef.values`), or found in its effects (`damage`, `heal`, `duration`...); and an ability\n * can say all of it in code instead (`AbilityDef.describe`).\n */\n\n/**\n * What the caster brings to an ability's numbers: its stats now, its level as a hero, and the attack damage of its own\n *\n * @beta\n */\nexport interface CasterFacts {\n\t/** The stats of the caster now, which the numbers of an ability scale from */\n\tstats: Readonly<Stats>\n\t/** 1 for what is not a hero */\n\theroLevel: number\n\t/** The attack damage it has from its type and its levels, without what it carries or what is on it */\n\townAttackDamage: number\n}\n\n/**\n * What the text of an ability is worked out from: the ability at a level, its caster, and the buffs it puts on\n *\n * @beta\n */\nexport interface AbilityTextContext {\n\t/** The ability the text is worked out for */\n\tability: AbilityDef\n\t/** The level of the ability: 1 for one that has no levels */\n\tlevel: number\n\t/** What the caster brings to the ability's numbers: its stats, hero level and own attack damage */\n\tcaster: CasterFacts\n\t/** A buff by id, for how long the ones the ability puts on last */\n\tbuff?: (id: string) => BuffDef | undefined\n\t/** A value of the ability, by name, worked out (see `abilityValues`) */\n\tvalue(name: string): AbilityValue | undefined\n}\n\n/**\n * A part of a value that comes from a stat of the caster: 60% of ability power\n *\n * @beta\n */\nexport interface ValuePart {\n\t/** The stat, `level` for each level of a hero past the first, `bonusAttackDamage` for what is added to its own */\n\tstat: StatKey | 'level' | 'bonusAttackDamage'\n\t/** How much of it: 0.6 */\n\tratio: number\n\t/** What that comes to now */\n\tamount: number\n}\n\n/**\n * A number of an ability, worked out: its total, and what it is made of\n *\n * @beta\n */\nexport interface AbilityValue {\n\t/** The value in full: `base` and every part added up */\n\ttotal: number\n\t/** What it is without the stats of the caster */\n\tbase: number\n\t/** The stat-scaled parts of the value, one for each stat of the caster that adds to it */\n\tparts: ValuePart[]\n\t/** What follows the number: `s` for seconds, `%`. Nothing when left out */\n\tunit?: string\n}\n\n/**\n * How a game gives a value of an ability: an amount and what scales it, or worked out in code\n *\n * @beta\n */\nexport type AbilityValueDef =\n\t{ amount?: Scaled; scaling?: Scaling; unit?: string; percent?: boolean } | ((context: AbilityTextContext) => number | AbilityValue)\n\n/**\n * A piece of the text of an ability: words, or a value to show as one (bold, its parts in their colours)\n *\n * @beta\n */\nexport type TextSegment = string | { name: string; value: AbilityValue }\n\n/**\n * An amount with what the stats of the caster add to it, and the parts that come from each: the same arithmetic as\n * the simulation (`scaled`)\n *\n * @internal\n */\nexport function scaledParts(amount: number, scaling: Scaling | undefined, level: number, caster: CasterFacts): AbilityValue {\n\tconst parts: ValuePart[] = []\n\tlet total = amount\n\tif (scaling) {\n\t\tfor (const key in scaling) {\n\t\t\tconst stat = key as ValuePart['stat']\n\t\t\tconst ratio = at(scaling[stat], level)\n\t\t\tif (!ratio) continue\n\t\t\tconst of =\n\t\t\t\tstat === 'level'\n\t\t\t\t\t? caster.heroLevel - 1\n\t\t\t\t\t: stat === 'bonusAttackDamage'\n\t\t\t\t\t\t? Math.max(caster.stats.attackDamage - caster.ownAttackDamage, 0)\n\t\t\t\t\t\t: caster.stats[stat]\n\t\t\tconst part = of * ratio\n\t\t\ttotal += part\n\t\t\tparts.push({ stat, ratio, amount: part })\n\t\t}\n\t}\n\treturn { total, base: amount, parts }\n}\n\n/**\n * The value of an amount for an ability's text (`abilityValues`): at the level, or what its code says for the caster\n * as it is, with no effect landing and no target\n *\n * @beta\n */\nexport function valueFor(value: EffectValue | undefined, level: number, caster: CasterFacts, fallback = 0): number {\n\tif (typeof value !== 'function') return at(value, level, fallback)\n\tconst asked: EffectValueContext = { level, caster }\n\treturn value(asked)\n}\n\n/** The effects of an ability, those inside others (a missile's, a delay's) too, in order */\nfunction* allEffects(effects: readonly EffectDef[] | undefined): Iterable<EffectDef> {\n\tfor (const effect of effects ?? []) {\n\t\tyield effect\n\t\tyield* allEffects(innerEffects(effect))\n\t}\n}\n\n/**\n * The values of an ability at a level, for a caster, by name: its own (`AbilityDef.values`), and what its effects say\n * when it does not name them itself: `damage`, `heal`, `shield` and `amount` (the first effect of each kind with an\n * amount), `duration`, `radius`, `chance` (in percent), `range`, `cooldown`, `charges` and `refill`, `mana`, `window` (a recast's), `count` and `distance`\n *\n * @beta\n */\nexport function abilityValues(\n\tability: AbilityDef,\n\tlevel: number,\n\tcaster: CasterFacts,\n\tbuff?: (id: string) => BuffDef | undefined\n): Map<string, AbilityValue> {\n\tconst values = new Map<string, AbilityValue>()\n\tconst context: AbilityTextContext = { ability, level, caster, buff, value: (name) => values.get(name) }\n\tconst plain = (total: number, unit?: string): AbilityValue => ({ total, base: total, parts: [], unit })\n\tconst found = (name: string, value: AbilityValue | undefined) => {\n\t\tif (value && !values.has(name)) values.set(name, value)\n\t}\n\n\t// what the effects say, first\n\tfor (const effect of [...allEffects([...ability.effects, ...(ability.passive ?? [])])].map(anyEffect)) {\n\t\tif (effect.amount !== undefined || effect.scaling) {\n\t\t\tconst value = scaledParts(valueFor(effect.amount, level, caster), effect.scaling, level, caster)\n\t\t\tif (effect.type === 'damage' || effect.type === 'heal') found(effect.type, value)\n\t\t\tfound('amount', value)\n\t\t}\n\t\tif (effect.duration !== undefined) found('duration', plain(valueFor(effect.duration, level, caster), 's'))\n\t\telse if (effect.buff && buff) {\n\t\t\tconst lasting = buff(effect.buff)?.duration\n\t\t\tif (lasting !== undefined) found('duration', plain(at(lasting as Scaled, level), 's'))\n\t\t}\n\t\tif (effect.radius !== undefined) found('radius', plain(valueFor(effect.radius, level, caster)))\n\t\tif (effect.chance !== undefined) found('chance', plain(valueFor(effect.chance, level, caster) * 100, '%'))\n\t\tif (effect.count !== undefined) found('count', plain(at(effect.count, level)))\n\t\tif (effect.distance !== undefined) found('distance', plain(at(effect.distance, level)))\n\t}\n\tif (ability.range !== undefined) found('range', plain(at(ability.range, level)))\n\tif (ability.cooldown !== undefined) found('cooldown', plain(at(ability.cooldown, level), 's'))\n\tif (ability.charges) {\n\t\tfound('charges', plain(at(ability.charges.count, level)))\n\t\tfound('refill', plain(at(ability.charges.refill, level), 's'))\n\t}\n\tif (ability.manaCost !== undefined) found('mana', plain(at(ability.manaCost, level)))\n\tif (ability.recast) found('window', plain(at(ability.recast.window, level), 's'))\n\n\t// the ability's own, over what was found: in the order given, so one may use another\n\tfor (const [name, def] of Object.entries(ability.values ?? {})) {\n\t\tlet value: AbilityValue\n\t\tif (typeof def === 'function') {\n\t\t\tconst made = def(context)\n\t\t\tvalue = typeof made === 'number' ? plain(made) : made\n\t\t} else {\n\t\t\tvalue = scaledParts(at(def.amount, level), def.scaling, level, caster)\n\t\t\tif (def.percent) {\n\t\t\t\tvalue = {\n\t\t\t\t\ttotal: value.total * 100,\n\t\t\t\t\tbase: value.base * 100,\n\t\t\t\t\tparts: value.parts.map((part) => ({ ...part, ratio: part.ratio * 100, amount: part.amount * 100 }))\n\t\t\t\t}\n\t\t\t\tvalue.unit = '%'\n\t\t\t}\n\t\t\tif (def.unit) value.unit = def.unit\n\t\t}\n\t\tvalues.set(name, value)\n\t}\n\treturn values\n}\n\n/**\n * What the ability says it does, for this caster now: its description with each `{value}` worked out (or its own\n * `describe`), as words and values. A name it has no value for is left as it is written, braces and all\n *\n * @beta\n */\nexport function describeAbility(ability: AbilityDef, level: number, caster: CasterFacts, buff?: (id: string) => BuffDef | undefined): TextSegment[] {\n\tconst values = abilityValues(ability, level, caster, buff)\n\tconst context: AbilityTextContext = { ability, level, caster, buff, value: (name) => values.get(name) }\n\tconst said = ability.describe ? ability.describe(context) : (ability.description ?? '')\n\tif (typeof said !== 'string') return said\n\tconst segments: TextSegment[] = []\n\tlet from = 0\n\tfor (const match of said.matchAll(/\\{([a-zA-Z][\\w.]*)\\}/g)) {\n\t\tconst value = values.get(match[1])\n\t\tif (!value) continue\n\t\tif (match.index > from) segments.push(said.slice(from, match.index))\n\t\tsegments.push({ name: match[1], value })\n\t\tfrom = match.index + match[0].length\n\t}\n\tif (from < said.length) segments.push(said.slice(from))\n\treturn segments\n}\n\n/**\n * How a stat is called in the text of an ability\n *\n * @beta\n */\nexport const STAT_WORDS: Partial<Record<ValuePart['stat'], string>> = {\n\tabilityPower: 'ability power',\n\tattackDamage: 'attack damage',\n\tbonusAttackDamage: 'bonus attack damage',\n\thealth: 'max health',\n\tmana: 'max mana',\n\tarmor: 'armor',\n\tmagicResist: 'magic resist',\n\tmoveSpeed: 'move speed',\n\tattackSpeed: 'attack speed',\n\tlevel: 'per level'\n}\n\n/**\n * A number as an ability's text shows it: whole, or with one decimal when it is small and has one\n *\n * @beta\n */\nexport function formatNumber(value: number): string {\n\tconst rounded = Math.abs(value) < 10 ? Math.round(value * 10) / 10 : Math.round(value)\n\treturn String(rounded)\n}\n\n/**\n * A value in words: `80`, or `80 (50 + 60% ability power)` when stats add to it\n *\n * @beta\n */\nexport function valueText(value: AbilityValue): string {\n\tconst total = `${formatNumber(value.total)}${value.unit ?? ''}`\n\tif (value.parts.length === 0) return total\n\tconst parts = value.parts.map((part) =>\n\t\tpart.stat === 'level' ? `${formatNumber(part.ratio)} per level` : `${formatNumber(part.ratio * 100)}% ${STAT_WORDS[part.stat] ?? part.stat}`\n\t)\n\t// nothing of its own: all of it comes from the stats\n\treturn `${total} (${[...(value.base ? [formatNumber(value.base)] : []), ...parts].join(' + ')})`\n}\n\n/**\n * The text of an ability as plain words: for a tooltip of words only, a log, a test\n *\n * @beta\n */\nexport function abilityText(segments: readonly TextSegment[]): string {\n\treturn segments.map((segment) => (typeof segment === 'string' ? segment : valueText(segment.value))).join('')\n}\n"],"mappings":"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"}