@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,558 @@
1
+ import { atan2 } from "../exactMath.js";
2
+ import { dist } from "../math.js";
3
+ import { at } from "../defs.js";
4
+ import { cooldownOf, statsOf } from "../stats.js";
5
+ import { abilityCast, castCancelled, castStarted, channelEnded, channelStarted, manaChanged } from "../engineEvents.js";
6
+ import { edgeDistance, moving } from "../entity.js";
7
+ import { engineMessage, toMessage } from "../messages.js";
8
+ import { abilityReach, abilityRefusal, chargesLeft, targetRefusal } from "../shared.js";
9
+ import { spendUse } from "../abilities/charges.js";
10
+ import { heroState } from "../hero.js";
11
+ import { run } from "../abilities/land.js";
12
+ import { healthPerMana, isControlled, isGrounded, isInvulnerable, isSilenced, isSpellImmune, isStunned, isUntargetable, layerOf, pierces, removeBuff } from "../abilities/buffs.js";
13
+ import { refusalOf } from "../hooks.js";
14
+ import { faceTowards, halt, moveTo, moveToEntity, setAnchored } from "../systems/movement.js";
15
+ import { canSee } from "../systems/combat.js";
16
+ import { dashing } from "../dashing.js";
17
+ import { isCharged } from "../abilities/effects.js";
18
+ import { aimKind, targetingOf } from "../targeting.js";
19
+ import { findItem, spendCharge } from "../items.js";
20
+ import { clearOrders, createOrder } from "./queue.js";
21
+ import { abilityAsCast, markedBy, openRecast, recastMade } from "../abilities/recast.js";
22
+ //#region src/orders/cast.ts
23
+ /**
24
+ * Whether an ability may be used on a target: as its `targets` say, and the `canTarget` hook
25
+ *
26
+ * @beta
27
+ */
28
+ function validTarget(world, caster, ability, target) {
29
+ if (!target.alive || target.hidden) return false;
30
+ const refusal = targetRefusal(ability, targetFacts(world, caster, target, ability));
31
+ if (!world.hooks.has("canTarget")) return !refusal;
32
+ return !world.hooks.run("canTarget", {
33
+ caster,
34
+ ability,
35
+ target,
36
+ cancelled: !!refusal,
37
+ reason: refusal
38
+ }).cancelled;
39
+ }
40
+ /**
41
+ * What a target is to a caster, for `targetRefusal`
42
+ *
43
+ * @beta
44
+ */
45
+ function targetFacts(world, caster, target, ability) {
46
+ const relation = target === caster ? "self" : world.areAllies(caster.owner, target.owner) ? "ally" : world.areEnemies(caster.owner, target.owner) ? "enemy" : "neutral";
47
+ return {
48
+ kind: target.def.kind,
49
+ layer: layerOf(world, target),
50
+ hero: target.has(heroState),
51
+ invulnerable: isInvulnerable(world, target),
52
+ ...target !== caster && target.buffs.length && isUntargetable(world, target) && { untargetable: true },
53
+ ...target.def.targetableBy && { targetableBy: target.def.targetableBy },
54
+ ...target.def.tags && { tags: target.def.tags },
55
+ relation,
56
+ spellImmune: isSpellImmune(world, target) && !(ability && pierces(world, ability, target))
57
+ };
58
+ }
59
+ /**
60
+ * How far away the target of an ability may be: what it says, and for some as far as the caster's attacks reach on top
61
+ *
62
+ * @beta
63
+ */
64
+ function castRange(world, caster, ability, level) {
65
+ if (ability.rangeOf) return ability.rangeOf(world, caster, level);
66
+ return abilityReach(ability, level, ability.attackRange ? statsOf(world, caster).attackRange : 0);
67
+ }
68
+ /**
69
+ * Seconds of the wind-up of an ability: in code, or as it says
70
+ *
71
+ * @beta
72
+ */
73
+ var castTimeOf = (world, caster, ability, level) => ability.castTimeOf?.(world, caster, level) ?? ability.castTime ?? 0;
74
+ /** What a cast order uses: an ability of the caster, or the one of an item it carries */
75
+ function source(world, entity, from) {
76
+ if (from.item !== void 0) {
77
+ const item = findItem(entity, from.item);
78
+ if (!item?.state || !world.registry.abilities.has(item.state.id)) return void 0;
79
+ return {
80
+ ability: abilityAsCast(world.registry.ability(item.state.id), item.state),
81
+ state: item.state,
82
+ item
83
+ };
84
+ }
85
+ if (!from.ability || !world.registry.abilities.has(from.ability)) return void 0;
86
+ const state = entity.abilities.find((a) => a.id === from.ability);
87
+ return state && {
88
+ ability: abilityAsCast(world.registry.ability(from.ability), state),
89
+ state
90
+ };
91
+ }
92
+ /**
93
+ * Whether the ability is one of the spells the hero brought along, as opposed to what it learned
94
+ *
95
+ * @beta
96
+ */
97
+ var isSpell = (entity, ability) => entity.def.hero?.spells?.includes(ability.id) ?? false;
98
+ /**
99
+ * Why an ability cannot be used right now, or undefined when it can. Items ask for no mana, and silence does not stop them
100
+ *
101
+ * @beta
102
+ */
103
+ function notReady(world, entity, ability, item) {
104
+ let refusal = declaredRefusal(world, entity, ability, item);
105
+ const state = item ? item.state : entity.abilities.find((a) => a.id === ability.id);
106
+ if (!refusal && state?.recast && ability.recast?.mark && !markedBy(world, entity, ability.recast.mark)) refusal = engineMessage("noMark");
107
+ if (!world.hooks.has("canCast")) return refusal;
108
+ const level = state?.level ?? 0;
109
+ const decided = refusalOf(world.hooks.run("canCast", {
110
+ caster: entity,
111
+ ability,
112
+ level,
113
+ item,
114
+ cancelled: !!refusal,
115
+ reason: refusal
116
+ }));
117
+ return decided === void 0 ? void 0 : toMessage(decided);
118
+ }
119
+ /** Whether an ability rushes or jumps its caster of its own (a `dash`, a `blink`): what being grounded refuses */
120
+ var movesItself = (ability) => ability.effects.some((effect) => effect.type === "dash" || effect.type === "blink");
121
+ /**
122
+ * Why an ability cannot be used right now as its declared costs and the caster's state go: what the screen knows
123
+ *
124
+ * @internal
125
+ */
126
+ function declaredRefusal(world, entity, ability, item) {
127
+ if (item && item.charges <= 0 && world.registry.items.has(item.item) && world.registry.item(item.item).charges) return engineMessage("noCharges");
128
+ const state = item ? item.state : entity.abilities.find((a) => a.id === ability.id);
129
+ ability = abilityAsCast(ability, state);
130
+ return abilityRefusal(ability, {
131
+ level: state?.level ?? 0,
132
+ cooldown: state?.recast ? 0 : state?.cooldown ?? 0,
133
+ charges: state && chargesLeft(ability, state),
134
+ mana: entity.mana,
135
+ health: entity.health,
136
+ maxHealth: entity.maxHealth,
137
+ item: !!item,
138
+ spell: isSpell(entity, ability),
139
+ silenced: entity.buffs.length > 0 && isSilenced(world, entity, ability),
140
+ grounded: entity.buffs.length > 0 && movesItself(ability) && isGrounded(world, entity),
141
+ noManaCosts: world.cheats.noManaCosts,
142
+ healthPerMana: entity.buffs.length > 0 ? healthPerMana(world, entity) : 0
143
+ });
144
+ }
145
+ /**
146
+ * Pays for an ability and lets it happen. In order:
147
+ * 1. the `beforeCast` hook, which can change the mana cost and the cooldown, or call it off;
148
+ * 2. the caster pays, the cooldown starts, and one of its charges is spent where it has them;
149
+ * 3. the effects of the ability happen;
150
+ * 4. the `afterCast` hook, for what follows: the caster's passives that react to its casts.
151
+ *
152
+ * `held`: for an ability held and let go (`AbilityDef.hold`), how full it was (`EffectContext.held`), and the effects that
153
+ * go off in place of its own (a tap's)
154
+ */
155
+ function fire(world, caster, ability, target, item, held) {
156
+ const state = item?.state ?? caster.abilities.find((a) => a.id === ability.id);
157
+ const { level } = state;
158
+ ability = abilityAsCast(ability, state);
159
+ const recasting = !!state.recast && !!ability.recast;
160
+ const mark = recasting ? ability.recast.mark : void 0;
161
+ if (mark) {
162
+ target = markedBy(world, caster, mark);
163
+ if (!target) {
164
+ world.message(caster.owner, engineMessage("noMark"));
165
+ return;
166
+ }
167
+ }
168
+ const aimed = target?.pos ?? state.point ?? caster.pos;
169
+ const point = {
170
+ x: aimed.x,
171
+ z: aimed.z
172
+ };
173
+ const plain = !!item || isSpell(caster, ability);
174
+ const cooldown = recasting ? state.cooldown : world.cheats.noCooldowns ? 0 : plain ? at(ability.cooldown, level) : cooldownOf(world, caster, at(ability.cooldown, level));
175
+ const manaCost = item || world.cheats.noManaCosts ? 0 : at(ability.manaCost, level);
176
+ const before = world.hooks.run("beforeCast", {
177
+ caster,
178
+ ability,
179
+ level,
180
+ target,
181
+ point,
182
+ item,
183
+ manaCost,
184
+ cooldown,
185
+ cancelled: false
186
+ });
187
+ if (before.cancelled) {
188
+ if (before.reason) world.message(caster.owner, before.reason);
189
+ return;
190
+ }
191
+ const rate = !item && caster.buffs.length > 0 ? healthPerMana(world, caster) : 0;
192
+ const manaPaid = rate > 0 ? 0 : before.manaCost;
193
+ const healthPaid = before.manaCost * rate + (item ? 0 : at(ability.healthCost, level) * caster.maxHealth);
194
+ if (manaPaid > caster.mana) {
195
+ world.message(caster.owner, engineMessage("notEnoughMana"));
196
+ return;
197
+ }
198
+ if (rate > 0 && healthPaid >= caster.health) {
199
+ world.message(caster.owner, engineMessage("notEnoughHealth"));
200
+ return;
201
+ }
202
+ if (!item) {
203
+ caster.mana -= manaPaid;
204
+ caster.health -= healthPaid;
205
+ if (manaPaid > 0) world.events.emit(manaChanged, {
206
+ entity: caster,
207
+ amount: -manaPaid,
208
+ ability: ability.id
209
+ });
210
+ }
211
+ state.cooldown = before.cooldown;
212
+ if (!recasting) spendUse(world, caster, ability, state, plain);
213
+ if (!recasting && ability.recast) openRecast(ability, state);
214
+ const charged = !item && isCharged(world, caster, ability);
215
+ const context = aimedContext(world, {
216
+ world,
217
+ caster,
218
+ ability,
219
+ level,
220
+ target,
221
+ point,
222
+ charged,
223
+ ...held && { held: held.share }
224
+ }, state);
225
+ run(context, held?.effects ?? ability.effects);
226
+ if (recasting) recastMade(ability, state);
227
+ world.events.emit(abilityCast, {
228
+ caster,
229
+ ability,
230
+ level,
231
+ target: context.target,
232
+ point: context.point,
233
+ charged: charged || void 0
234
+ });
235
+ if (charged) removeBuff(world, caster, ability.charge);
236
+ if (item) spendCharge(world, caster, item);
237
+ world.hooks.run("afterCast", {
238
+ caster,
239
+ ability,
240
+ level,
241
+ target,
242
+ point,
243
+ item,
244
+ charged
245
+ });
246
+ }
247
+ /**
248
+ * Where an ability's effects go, as it was aimed: along two points (`vector`), from the first (the `origin`) the way
249
+ * of the second (the `point`); and over that, what a game's own way of aiming says (`Targeting.aim`). The context as
250
+ * it is for the rest
251
+ */
252
+ function aimedContext(world, context, state) {
253
+ const { ability, caster, level, target } = context;
254
+ const kind = aimKind(world.registry, ability);
255
+ const targeting = targetingOf(world.registry, ability);
256
+ if (kind !== "vector" && !targeting?.aim) return context;
257
+ let aimed = context;
258
+ if (kind === "vector" && state.point && state.to) aimed = {
259
+ ...aimed,
260
+ origin: {
261
+ x: state.point.x,
262
+ z: state.point.z
263
+ },
264
+ point: {
265
+ x: state.to.x,
266
+ z: state.to.z
267
+ }
268
+ };
269
+ const own = targeting?.aim?.(world, caster, ability, {
270
+ level,
271
+ target,
272
+ point: state.point,
273
+ to: state.to
274
+ });
275
+ return own ? {
276
+ ...aimed,
277
+ ...own,
278
+ point: own.point ? {
279
+ x: own.point.x,
280
+ z: own.point.z
281
+ } : aimed.point
282
+ } : aimed;
283
+ }
284
+ /** Why a game's own way of aiming will not have it aimed so (`Targeting.check`), or nothing */
285
+ function aimRefusal(world, caster, ability, aim) {
286
+ const said = targetingOf(world.registry, ability)?.check?.(world, caster, ability, aim);
287
+ return said === void 0 ? void 0 : toMessage(said);
288
+ }
289
+ /**
290
+ * Casts what goes off on the spot without the caster dropping what it is doing: a hero drinks a potion while it walks,
291
+ * and leaps in the middle of a run. `point` is where it is aimed, for what goes off towards somewhere.
292
+ * False when it cannot be cast this way, and takes an order. What the rules refuse as an order (`beforeOrder`) they
293
+ * refuse here too: it is not cast, and true is returned
294
+ */
295
+ function castAside(world, caster, from, point) {
296
+ const used = source(world, caster, from);
297
+ if (!used || used.state.level < 1) return false;
298
+ const { ability, item } = used;
299
+ const kind = aimKind(world.registry, ability);
300
+ const aimed = kind === "direction" && !!point;
301
+ if (kind !== "none" && !aimed || targetingOf(world.registry, ability) || ability.castTime || ability.channel || isStunned(world, caster) || caster.get(dashing)) return false;
302
+ if (caster.buffs.length && isControlled(world, caster)) return false;
303
+ if (world.hooks.has("beforeOrder")) {
304
+ const order = createOrder(world, {
305
+ type: "cast",
306
+ ...from.item === void 0 ? { ability: ability.id } : { item: from.item },
307
+ ...aimed && { point }
308
+ });
309
+ if (world.hooks.run("beforeOrder", {
310
+ entity: caster,
311
+ order,
312
+ queued: false,
313
+ rejected: false
314
+ }).rejected) return true;
315
+ }
316
+ const problem = notReady(world, caster, ability, item);
317
+ if (problem) {
318
+ world.message(caster.owner, problem);
319
+ return true;
320
+ }
321
+ if (aimed && dist(caster.pos, point) > .05) caster.facing = atan2(point.x - caster.pos.x, point.z - caster.pos.z);
322
+ used.state.point = aimed ? point : void 0;
323
+ world.events.emit(castStarted, {
324
+ caster,
325
+ ability,
326
+ point: aimed ? point : void 0,
327
+ duration: 0
328
+ });
329
+ fire(world, caster, ability, void 0, item);
330
+ return true;
331
+ }
332
+ /** Use an ability: walk into range, turn towards the target, wind up, fire */
333
+ var castOrder = {
334
+ type: "cast",
335
+ committed: (order) => order.state.locked === true,
336
+ channelling: (order) => !!order.state.channel,
337
+ accepts(world, entity, init) {
338
+ const used = source(world, entity, init);
339
+ if (!used || used.state.level < 1) return false;
340
+ const { ability } = used;
341
+ switch (aimKind(world.registry, ability)) {
342
+ case "passive": return false;
343
+ case "unit": {
344
+ const target = world.get(init.target);
345
+ return !!target && validTarget(world, entity, ability, target);
346
+ }
347
+ case "point":
348
+ case "direction": return !!init.point;
349
+ case "vector": return !!init.point && !!init.to;
350
+ default: return true;
351
+ }
352
+ },
353
+ start(world, entity, order) {
354
+ const { windup, channel, rushing } = order.state;
355
+ if (windup === void 0 || windup <= 0 || channel || rushing) return;
356
+ const used = source(world, entity, order.init);
357
+ if (!used) return;
358
+ const target = aimKind(world.registry, used.ability) === "unit" ? world.get(order.init.target) : void 0;
359
+ world.events.emit(castStarted, {
360
+ caster: entity,
361
+ ability: used.ability,
362
+ point: target?.pos ?? order.init.point,
363
+ duration: windup
364
+ });
365
+ },
366
+ update(world, entity, order, dt) {
367
+ if (order.state.rushing) return entity.get(dashing) ? "running" : "done";
368
+ if (order.state.channel) return channelling(world, entity, order.state.channel, dt);
369
+ const used = source(world, entity, order.init);
370
+ if (!used) return "done";
371
+ const { ability, item } = used;
372
+ const { state } = order;
373
+ const kind = aimKind(world.registry, ability);
374
+ const target = kind === "unit" ? world.get(order.init.target) : void 0;
375
+ if (kind === "unit") {
376
+ if (!target || !validTarget(world, entity, ability, target) || !canSee(world, entity, target)) return "done";
377
+ }
378
+ if (state.windup === void 0) {
379
+ const problem = notReady(world, entity, ability, item) ?? aimRefusal(world, entity, ability, {
380
+ level: used.state.level,
381
+ target,
382
+ point: order.init.point,
383
+ to: order.init.to
384
+ });
385
+ if (problem) {
386
+ world.message(entity.owner, problem);
387
+ return "failed";
388
+ }
389
+ const range = castRange(world, entity, ability, used.state.level);
390
+ const m = entity.get(moving);
391
+ if (target && target !== entity && edgeDistance(entity, target) > range) {
392
+ if (!m) return "failed";
393
+ moveToEntity(world, entity, target, Math.max(range - .25, .1));
394
+ return "running";
395
+ }
396
+ if ((kind === "point" || kind === "vector") && dist(entity.pos, order.init.point) > range) {
397
+ if (!m) return "failed";
398
+ if (m.status !== "moving") {
399
+ if (state.walked && m.status === "failed") return "failed";
400
+ state.walked = true;
401
+ moveTo(world, entity, order.init.point, { range: Math.max(range - .25, .1) });
402
+ }
403
+ return "running";
404
+ }
405
+ if (m) {
406
+ if (m.status === "moving") halt(world, entity);
407
+ setAnchored(world, entity, true);
408
+ }
409
+ state.windup = castTimeOf(world, entity, ability, used.state.level);
410
+ state.locked = state.windup > 0;
411
+ world.events.emit(castStarted, {
412
+ caster: entity,
413
+ ability,
414
+ point: target?.pos ?? order.init.point,
415
+ duration: state.windup
416
+ });
417
+ }
418
+ const aim = target?.pos ?? order.init.point;
419
+ if (aim && target !== entity) faceTowards(world, entity, aim, dt);
420
+ state.windup -= dt;
421
+ if (state.windup > 0) return "running";
422
+ const problem = notReady(world, entity, ability, item) ?? aimRefusal(world, entity, ability, {
423
+ level: used.state.level,
424
+ target,
425
+ point: order.init.point,
426
+ to: order.init.to
427
+ });
428
+ if (problem) {
429
+ world.message(entity.owner, problem);
430
+ return "failed";
431
+ }
432
+ used.state.point = order.init.point;
433
+ if (order.init.to) used.state.to = {
434
+ x: order.init.to.x,
435
+ z: order.init.to.z
436
+ };
437
+ else delete used.state.to;
438
+ fire(world, entity, ability, target, item);
439
+ if (ability.channel && !ability.channel.walks && !entity.get(dashing) && entity.alive) {
440
+ const { level } = used.state;
441
+ const { duration } = ability.channel;
442
+ const seconds = typeof duration === "function" ? duration(world, entity, level) : duration;
443
+ const point = target?.pos ?? order.init.point ?? entity.pos;
444
+ state.locked = false;
445
+ state.channel = {
446
+ ability: ability.id,
447
+ level,
448
+ target: target?.id,
449
+ point: {
450
+ x: point.x,
451
+ z: point.z
452
+ },
453
+ left: seconds,
454
+ elapsed: 0
455
+ };
456
+ world.events.emit(channelStarted, {
457
+ caster: entity,
458
+ ability,
459
+ duration: seconds
460
+ });
461
+ return "running";
462
+ }
463
+ if (!entity.get(dashing)) return "done";
464
+ state.rushing = true;
465
+ state.locked = true;
466
+ return "running";
467
+ },
468
+ end(world, entity, order) {
469
+ setAnchored(world, entity, false);
470
+ const { channel, windup } = order.state;
471
+ if (windup !== void 0 && windup > 0 && !channel && !order.state.rushing) world.events.emit(castCancelled, {
472
+ caster: entity,
473
+ ability: source(world, entity, order.init)?.ability
474
+ });
475
+ if (channel && !channel.done && world.registry.abilities.has(channel.ability)) {
476
+ channel.done = true;
477
+ const ability = world.registry.ability(channel.ability);
478
+ ability.channel?.interrupted?.(world, entity, channel.level);
479
+ world.events.emit(channelEnded, {
480
+ caster: entity,
481
+ ability,
482
+ interrupted: true
483
+ });
484
+ }
485
+ }
486
+ };
487
+ /**
488
+ * A tick of keeping a channelled ability up: what it does every so often, and the end of it; broken off (`interrupted`
489
+ * run, the end told) where it is tied to a target gone or out of its `leash`
490
+ *
491
+ * @internal
492
+ */
493
+ function channelling(world, caster, channel, dt) {
494
+ if (!world.registry.abilities.has(channel.ability)) return "done";
495
+ const ability = world.registry.ability(channel.ability);
496
+ const kept = ability.channel;
497
+ const target = world.get(channel.target);
498
+ if (kept.leash !== void 0 && channel.target !== void 0 && (!target?.alive || target.hidden || edgeDistance(caster, target) > kept.leash)) {
499
+ channel.done = true;
500
+ kept.interrupted?.(world, caster, channel.level);
501
+ world.events.emit(channelEnded, {
502
+ caster,
503
+ ability,
504
+ interrupted: true
505
+ });
506
+ return "done";
507
+ }
508
+ const before = channel.elapsed;
509
+ channel.elapsed += dt;
510
+ channel.left -= dt;
511
+ const every = kept.every ?? 0;
512
+ const times = every > 0 ? Math.floor(channel.elapsed / every) - Math.floor(before / every) : 0;
513
+ for (let n = 0; n < times && caster.alive; n++) {
514
+ const context = {
515
+ world,
516
+ caster,
517
+ ability,
518
+ level: channel.level,
519
+ target,
520
+ point: channel.point
521
+ };
522
+ run(context, kept.effects);
523
+ kept.run?.(world, caster, channel.level, target, channel.point);
524
+ }
525
+ if (channel.left > 0) return "running";
526
+ channel.done = true;
527
+ if (kept.finished?.length && caster.alive) {
528
+ const context = {
529
+ world,
530
+ caster,
531
+ ability,
532
+ level: channel.level,
533
+ target,
534
+ point: channel.point
535
+ };
536
+ run(context, kept.finished);
537
+ }
538
+ world.events.emit(channelEnded, {
539
+ caster,
540
+ ability,
541
+ interrupted: false
542
+ });
543
+ return "done";
544
+ }
545
+ /**
546
+ * A caster was hurt: a channelled ability it keeps up that breaks on damage (`channel.breaksOnDamage`, a recall) is
547
+ * broken off, as another order would
548
+ */
549
+ function hurtWhileChannelling(world, caster) {
550
+ const order = caster.orders[0];
551
+ const channel = order?.type === "cast" ? order.state.channel : void 0;
552
+ if (!channel || channel.done || !world.registry.abilities.has(channel.ability)) return;
553
+ if (world.registry.ability(channel.ability).channel?.breaksOnDamage) clearOrders(world, caster);
554
+ }
555
+ //#endregion
556
+ export { castAside, castOrder, castRange, castTimeOf, channelling, declaredRefusal, fire, hurtWhileChannelling, isSpell, notReady, targetFacts, validTarget };
557
+
558
+ //# sourceMappingURL=cast.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cast.js","names":[],"sources":["../../src/orders/cast.ts"],"sourcesContent":["import { abilityCast, castCancelled, castStarted, channelEnded, channelStarted, manaChanged } from '#engine/engineEvents'\nimport { refusalOf } from '#engine/hooks'\nimport { healthPerMana, isControlled, isGrounded, isInvulnerable, isSilenced, isSpellImmune, isStunned, isUntargetable, layerOf, pierces, removeBuff } from '#engine/abilities/buffs'\nimport { dashing } from '../dashing'\nimport { isCharged } from '#engine/abilities/effects'\nimport { run } from '#engine/abilities/land'\nimport { type AbilityDef, at, type EffectDef } from '#engine/defs'\nimport { type AbilityState, edgeDistance, type Entity, type ItemInstance } from '#engine/entity'\nimport { findItem, spendCharge } from '#engine/items'\nimport { dist, type Vec2 } from '#engine/math'\nimport type { OrderBehavior, OrderInits } from '#engine/registry'\nimport { canSee } from '#engine/systems/combat'\nimport { faceTowards, halt, moveTo, moveToEntity, setAnchored } from '#engine/systems/movement'\nimport { cooldownOf, statsOf } from '#engine/stats'\nimport type { World } from '#engine/world'\nimport { engineMessage, type Message, toMessage } from '#engine/messages'\nimport { clearOrders, createOrder } from './queue'\nimport { abilityReach, abilityRefusal, chargesLeft, targetRefusal, type TargetFacts } from '#engine/shared'\nimport { spendUse } from '#engine/abilities/charges'\nimport { abilityAsCast, markedBy, openRecast, recastMade } from '#engine/abilities/recast'\nimport { atan2 } from '#engine/exactMath'\nimport { heroState } from '#engine/hero'\nimport { moving } from '../entity'\nimport { aimKind, type CastAim, targetingOf } from '#engine/targeting'\nimport type { EffectContext } from '#engine/abilities/effects'\n\n/**\n * Whether an ability may be used on a target: as its `targets` say, and the `canTarget` hook\n *\n * @beta\n */\nexport function validTarget(world: World, caster: Entity, ability: AbilityDef, target: Entity): boolean {\n\tif (!target.alive || target.hidden) return false\n\tconst refusal = targetRefusal(ability, targetFacts(world, caster, target, ability))\n\tif (!world.hooks.has('canTarget')) return !refusal\n\treturn !world.hooks.run('canTarget', { caster, ability, target, cancelled: !!refusal, reason: refusal }).cancelled\n}\n\n/**\n * What a target is to a caster, for `targetRefusal`\n *\n * @beta\n */\nexport function targetFacts(world: World, caster: Entity, target: Entity, ability?: AbilityDef): TargetFacts {\n\tconst relation =\n\t\ttarget === caster\n\t\t\t? 'self'\n\t\t\t: world.areAllies(caster.owner, target.owner)\n\t\t\t\t? 'ally'\n\t\t\t\t: world.areEnemies(caster.owner, target.owner)\n\t\t\t\t\t? 'enemy'\n\t\t\t\t\t: 'neutral'\n\treturn {\n\t\tkind: target.def.kind,\n\t\tlayer: layerOf(world, target),\n\t\thero: target.has(heroState),\n\t\tinvulnerable: isInvulnerable(world, target),\n\t\t// out of everyone else's reach (AB9): said only where it is\n\t\t...(target !== caster && target.buffs.length && isUntargetable(world, target) && { untargetable: true }),\n\t\t...(target.def.targetableBy && { targetableBy: target.def.targetableBy }),\n\t\t...(target.def.tags && { tags: target.def.tags }),\n\t\trelation,\n\t\t// immune, unless this ability gets through, as its code may say for this target\n\t\tspellImmune: isSpellImmune(world, target) && !(ability && pierces(world, ability, target))\n\t}\n}\n\n/**\n * How far away the target of an ability may be: what it says, and for some as far as the caster's attacks reach on top\n *\n * @beta\n */\nexport function castRange(world: World, caster: Entity, ability: AbilityDef, level: number): number {\n\tif (ability.rangeOf) return ability.rangeOf(world, caster, level)\n\treturn abilityReach(ability, level, ability.attackRange ? statsOf(world, caster).attackRange : 0)\n}\n\n/**\n * Seconds of the wind-up of an ability: in code, or as it says\n *\n * @beta\n */\nexport const castTimeOf = (world: World, caster: Entity, ability: AbilityDef, level: number): number =>\n\tability.castTimeOf?.(world, caster, level) ?? ability.castTime ?? 0\n\n/** What a cast order uses: an ability of the caster, or the one of an item it carries */\nfunction source(\n\tworld: World,\n\tentity: Entity,\n\tfrom: { ability?: string; item?: number }\n): { ability: AbilityDef; state: AbilityState; item?: ItemInstance } | undefined {\n\tif (from.item !== undefined) {\n\t\tconst item = findItem(entity, from.item)\n\t\tif (!item?.state || !world.registry.abilities.has(item.state.id)) return undefined\n\t\treturn { ability: abilityAsCast(world.registry.ability(item.state.id), item.state), state: item.state, item }\n\t}\n\tif (!from.ability || !world.registry.abilities.has(from.ability)) return undefined\n\tconst state = entity.abilities.find((a) => a.id === from.ability)\n\t// with its window open, the recast (`AbilityDef.recast`): aimed, reaching and paid as that is\n\treturn state && { ability: abilityAsCast(world.registry.ability(from.ability), state), state }\n}\n\n/**\n * Whether the ability is one of the spells the hero brought along, as opposed to what it learned\n *\n * @beta\n */\nexport const isSpell = (entity: Entity, ability: AbilityDef) => entity.def.hero?.spells?.includes(ability.id) ?? false\n\n/**\n * Why an ability cannot be used right now, or undefined when it can. Items ask for no mana, and silence does not stop them\n *\n * @beta\n */\nexport function notReady(world: World, entity: Entity, ability: AbilityDef, item?: ItemInstance): Message | undefined {\n\tlet refusal = declaredRefusal(world, entity, ability, item)\n\t// a recast that goes to a mark, while nobody carries it\n\tconst state = item ? item.state : entity.abilities.find((a) => a.id === ability.id)\n\tif (!refusal && state?.recast && ability.recast?.mark && !markedBy(world, entity, ability.recast.mark)) refusal = engineMessage('noMark')\n\tif (!world.hooks.has('canCast')) return refusal\n\tconst level = state?.level ?? 0\n\tconst decided = refusalOf(world.hooks.run('canCast', { caster: entity, ability, level, item, cancelled: !!refusal, reason: refusal }))\n\treturn decided === undefined ? undefined : toMessage(decided)\n}\n\n/** Whether an ability rushes or jumps its caster of its own (a `dash`, a `blink`): what being grounded refuses */\nconst movesItself = (ability: AbilityDef) => ability.effects.some((effect) => effect.type === 'dash' || effect.type === 'blink')\n\n/**\n * Why an ability cannot be used right now as its declared costs and the caster's state go: what the screen knows\n *\n * @internal\n */\nexport function declaredRefusal(world: World, entity: Entity, ability: AbilityDef, item?: ItemInstance): Message | undefined {\n\t// an item that refills, kept with none of its charges left (`ItemDef.refill`)\n\tif (item && item.charges <= 0 && world.registry.items.has(item.item) && world.registry.item(item.item).charges) return engineMessage('noCharges')\n\tconst state = item ? item.state : entity.abilities.find((a) => a.id === ability.id)\n\t// with its window open, what the recast asks: no cooldown to wait for, no charges, its own cost\n\tability = abilityAsCast(ability, state)\n\treturn abilityRefusal(ability, {\n\t\tlevel: state?.level ?? 0,\n\t\tcooldown: state?.recast ? 0 : (state?.cooldown ?? 0),\n\t\tcharges: state && chargesLeft(ability, state),\n\t\tmana: entity.mana,\n\t\thealth: entity.health,\n\t\tmaxHealth: entity.maxHealth,\n\t\titem: !!item,\n\t\tspell: isSpell(entity, ability),\n\t\tsilenced: entity.buffs.length > 0 && isSilenced(world, entity, ability),\n\t\tgrounded: entity.buffs.length > 0 && movesItself(ability) && isGrounded(world, entity),\n\t\tnoManaCosts: world.cheats.noManaCosts,\n\t\thealthPerMana: entity.buffs.length > 0 ? healthPerMana(world, entity) : 0\n\t})\n}\n\n/**\n * Pays for an ability and lets it happen. In order:\n * 1. the `beforeCast` hook, which can change the mana cost and the cooldown, or call it off;\n * 2. the caster pays, the cooldown starts, and one of its charges is spent where it has them;\n * 3. the effects of the ability happen;\n * 4. the `afterCast` hook, for what follows: the caster's passives that react to its casts.\n *\n * `held`: for an ability held and let go (`AbilityDef.hold`), how full it was (`EffectContext.held`), and the effects that\n * go off in place of its own (a tap's)\n */\nexport function fire(\n\tworld: World,\n\tcaster: Entity,\n\tability: AbilityDef,\n\ttarget: Entity | undefined,\n\titem?: ItemInstance,\n\theld?: { share: number; effects?: EffectDef[] }\n): void {\n\tconst state = item?.state ?? caster.abilities.find((a) => a.id === ability.id)!\n\tconst { level } = state\n\t// cast again in its window (`AbilityDef.recast`): the recast, to the marked where it goes to one, its cooldown left as it is\n\tability = abilityAsCast(ability, state)\n\tconst recasting = !!state.recast && !!ability.recast\n\tconst mark = recasting ? ability.recast!.mark : undefined\n\tif (mark) {\n\t\ttarget = markedBy(world, caster, mark)\n\t\tif (!target) {\n\t\t\tworld.message(caster.owner, engineMessage('noMark'))\n\t\t\treturn\n\t\t}\n\t}\n\tconst aimed = target?.pos ?? state.point ?? caster.pos\n\tconst point = { x: aimed.x, z: aimed.z }\n\t// haste is for what the caster learned, not for what it carries or brought along\n\tconst plain = !!item || isSpell(caster, ability)\n\tconst cooldown = recasting\n\t\t? state.cooldown\n\t\t: world.cheats.noCooldowns\n\t\t\t? 0\n\t\t\t: plain\n\t\t\t\t? at(ability.cooldown, level)\n\t\t\t\t: cooldownOf(world, caster, at(ability.cooldown, level))\n\tconst manaCost = item || world.cheats.noManaCosts ? 0 : at(ability.manaCost, level)\n\tconst before = world.hooks.run('beforeCast', { caster, ability, level, target, point, item, manaCost, cooldown, cancelled: false })\n\tif (before.cancelled) {\n\t\tif (before.reason) world.message(caster.owner, before.reason)\n\t\treturn\n\t}\n\t// one that pays with health (`BuffDef.paysWithHealth`): the mana in health, and never down to nothing\n\tconst rate = !item && caster.buffs.length > 0 ? healthPerMana(world, caster) : 0\n\tconst manaPaid = rate > 0 ? 0 : before.manaCost\n\tconst healthPaid = before.manaCost * rate + (item ? 0 : at(ability.healthCost, level) * caster.maxHealth)\n\tif (manaPaid > caster.mana) {\n\t\tworld.message(caster.owner, engineMessage('notEnoughMana'))\n\t\treturn\n\t}\n\tif (rate > 0 && healthPaid >= caster.health) {\n\t\tworld.message(caster.owner, engineMessage('notEnoughHealth'))\n\t\treturn\n\t}\n\tif (!item) {\n\t\tcaster.mana -= manaPaid\n\t\tcaster.health -= healthPaid\n\t\tif (manaPaid > 0) world.events.emit(manaChanged, { entity: caster, amount: -manaPaid, ability: ability.id })\n\t}\n\tstate.cooldown = before.cooldown\n\tif (!recasting) spendUse(world, caster, ability, state, plain)\n\t// its window to be cast again opens, the cooldown kept for its end where it waits for it\n\tif (!recasting && ability.recast) openRecast(ability, state)\n\tconst charged = !item && isCharged(world, caster, ability)\n\tconst context = aimedContext(world, { world, caster, ability, level, target, point, charged, ...(held && { held: held.share }) }, state)\n\trun(context, held?.effects ?? ability.effects)\n\tif (recasting) recastMade(ability, state)\n\tworld.events.emit(abilityCast, { caster, ability, level, target: context.target, point: context.point, charged: charged || undefined })\n\t// what spends a charge does not count to the next one\n\tif (charged) removeBuff(world, caster, ability.charge!)\n\tif (item) spendCharge(world, caster, item)\n\tworld.hooks.run('afterCast', { caster, ability, level, target, point, item, charged })\n}\n\n/**\n * Where an ability's effects go, as it was aimed: along two points (`vector`), from the first (the `origin`) the way\n * of the second (the `point`); and over that, what a game's own way of aiming says (`Targeting.aim`). The context as\n * it is for the rest\n */\nfunction aimedContext(world: World, context: EffectContext, state: AbilityState): EffectContext {\n\tconst { ability, caster, level, target } = context\n\tconst kind = aimKind(world.registry, ability)\n\tconst targeting = targetingOf(world.registry, ability)\n\tif (kind !== 'vector' && !targeting?.aim) return context\n\tlet aimed = context\n\tif (kind === 'vector' && state.point && state.to) aimed = { ...aimed, origin: { x: state.point.x, z: state.point.z }, point: { x: state.to.x, z: state.to.z } }\n\tconst own = targeting?.aim?.(world, caster, ability, { level, target, point: state.point, to: state.to })\n\treturn own ? { ...aimed, ...own, point: own.point ? { x: own.point.x, z: own.point.z } : aimed.point } : aimed\n}\n\n/** Why a game's own way of aiming will not have it aimed so (`Targeting.check`), or nothing */\nfunction aimRefusal(world: World, caster: Entity, ability: AbilityDef, aim: CastAim): Message | undefined {\n\tconst said = targetingOf(world.registry, ability)?.check?.(world, caster, ability, aim)\n\treturn said === undefined ? undefined : toMessage(said)\n}\n\n/**\n * Casts what goes off on the spot without the caster dropping what it is doing: a hero drinks a potion while it walks,\n * and leaps in the middle of a run. `point` is where it is aimed, for what goes off towards somewhere.\n * False when it cannot be cast this way, and takes an order. What the rules refuse as an order (`beforeOrder`) they\n * refuse here too: it is not cast, and true is returned\n */\nexport function castAside(world: World, caster: Entity, from: { ability?: string; item?: number }, point?: Vec2): boolean {\n\tconst used = source(world, caster, from)\n\tif (!used || used.state.level < 1) return false\n\tconst { ability, item } = used\n\tconst kind = aimKind(world.registry, ability)\n\tconst aimed = kind === 'direction' && !!point\n\t// what is kept up (a channel) is an order the caster stands in, not something done on the side; a game's own way of aiming is an order\n\tif ((kind !== 'none' && !aimed) || targetingOf(world.registry, ability) || ability.castTime || ability.channel || isStunned(world, caster) || caster.get(dashing)) return false\n\tif (caster.buffs.length && isControlled(world, caster)) return false\n\t// asked as the order it stands for, which is made only for someone who asks: an id is taken from the world for it\n\tif (world.hooks.has('beforeOrder')) {\n\t\tconst order = createOrder(world, { type: 'cast', ...(from.item === undefined ? { ability: ability.id } : { item: from.item }), ...(aimed && { point }) })\n\t\tif (world.hooks.run('beforeOrder', { entity: caster, order, queued: false, rejected: false }).rejected) return true\n\t}\n\tconst problem = notReady(world, caster, ability, item)\n\tif (problem) {\n\t\tworld.message(caster.owner, problem)\n\t\treturn true\n\t}\n\tif (aimed && dist(caster.pos, point) > 0.05) caster.facing = atan2(point.x - caster.pos.x, point.z - caster.pos.z)\n\tused.state.point = aimed ? point : undefined\n\tworld.events.emit(castStarted, { caster, ability, point: aimed ? point : undefined, duration: 0 })\n\tfire(world, caster, ability, undefined, item)\n\treturn true\n}\n\n/**\n * What `cast` keeps in its order: the seconds of its wind-up left (from when it is in range), whether it walked to its\n * point already, whether it is past turning back (`isCommitted`), what it channels, and whether the ability carries the\n * caster off (a dash)\n *\n * @beta\n */\nexport interface CastState {\n\t/** Seconds of its wind-up left, from when it is in range */\n\twindup?: number\n\t/** It walked to its point already */\n\twalked?: boolean\n\t/** Past turning back (`isCommitted`) */\n\tlocked?: boolean\n\t/** What it channels, once it fired */\n\tchannel?: CastChannel\n\t/** The ability carries the caster off (a dash): the order is over when it lands */\n\trushing?: boolean\n}\n\n/** Use an ability: walk into range, turn towards the target, wind up, fire */\nexport const castOrder: OrderBehavior<CastState, OrderInits['cast']> = {\n\ttype: 'cast',\n\tcommitted: (order) => order.state.locked === true,\n\tchannelling: (order) => !!order.state.channel,\n\taccepts(world, entity, init) {\n\t\tconst used = source(world, entity, init)\n\t\tif (!used || used.state.level < 1) return false\n\t\tconst { ability } = used\n\t\t// what a game's own way of aiming refuses (`Targeting.check`) is refused as the order starts, the player told why\n\t\tswitch (aimKind(world.registry, ability)) {\n\t\t\tcase 'passive':\n\t\t\t\treturn false\n\t\t\tcase 'unit': {\n\t\t\t\tconst target = world.get(init.target)\n\t\t\t\treturn !!target && validTarget(world, entity, ability, target)\n\t\t\t}\n\t\t\tcase 'point':\n\t\t\tcase 'direction':\n\t\t\t\treturn !!init.point\n\t\t\tcase 'vector':\n\t\t\t\treturn !!init.point && !!init.to\n\t\t\tdefault:\n\t\t\t\treturn true\n\t\t}\n\t},\n\tstart(world, entity, order) {\n\t\t// taken up again mid wind-up (a fear, a charm let go of it: `putOff`): what is left of it told anew, as its shape\n\t\t// went when it was called off (B46)\n\t\tconst { windup, channel, rushing } = order.state\n\t\tif (windup === undefined || windup <= 0 || channel || rushing) return\n\t\tconst used = source(world, entity, order.init)\n\t\tif (!used) return\n\t\tconst target = aimKind(world.registry, used.ability) === 'unit' ? world.get(order.init.target) : undefined\n\t\tworld.events.emit(castStarted, { caster: entity, ability: used.ability, point: target?.pos ?? order.init.point, duration: windup })\n\t},\n\tupdate(world, entity, order, dt) {\n\t\t// it went off and carries the caster somewhere: the order is over when it gets there\n\t\tif (order.state.rushing) return entity.get(dashing) ? 'running' : 'done'\n\t\tif (order.state.channel) return channelling(world, entity, order.state.channel, dt)\n\t\tconst used = source(world, entity, order.init)\n\t\t// the item was used up, dropped or handed over in the meantime\n\t\tif (!used) return 'done'\n\t\tconst { ability, item } = used\n\t\tconst { state } = order\n\t\tconst kind = aimKind(world.registry, ability)\n\t\tconst target = kind === 'unit' ? world.get(order.init.target) : undefined\n\n\t\tif (kind === 'unit') {\n\t\t\tif (!target || !validTarget(world, entity, ability, target) || !canSee(world, entity, target)) return 'done'\n\t\t}\n\n\t\tif (state.windup === undefined) {\n\t\t\tconst problem =\n\t\t\t\tnotReady(world, entity, ability, item) ??\n\t\t\t\taimRefusal(world, entity, ability, { level: used.state.level, target, point: order.init.point, to: order.init.to })\n\t\t\tif (problem) {\n\t\t\t\tworld.message(entity.owner, problem)\n\t\t\t\treturn 'failed'\n\t\t\t}\n\n\t\t\tconst range = castRange(world, entity, ability, used.state.level)\n\t\t\tconst m = entity.get(moving)\n\t\t\tif (target && target !== entity && edgeDistance(entity, target) > range) {\n\t\t\t\tif (!m) return 'failed'\n\t\t\t\tmoveToEntity(world, entity, target, Math.max(range - 0.25, 0.1))\n\t\t\t\treturn 'running'\n\t\t\t}\n\t\t\tif ((kind === 'point' || kind === 'vector') && dist(entity.pos, order.init.point!) > range) {\n\t\t\t\tif (!m) return 'failed'\n\t\t\t\tif (m.status !== 'moving') {\n\t\t\t\t\tif (state.walked && m.status === 'failed') return 'failed'\n\t\t\t\t\tstate.walked = true\n\t\t\t\t\tmoveTo(world, entity, order.init.point!, { range: Math.max(range - 0.25, 0.1) })\n\t\t\t\t}\n\t\t\t\treturn 'running'\n\t\t\t}\n\n\t\t\tif (m) {\n\t\t\t\tif (m.status === 'moving') halt(world, entity)\n\t\t\t\tsetAnchored(world, entity, true)\n\t\t\t}\n\t\t\tstate.windup = castTimeOf(world, entity, ability, used.state.level)\n\t\t\t// from here on there is no turning back\n\t\t\tstate.locked = state.windup > 0\n\t\t\tworld.events.emit(castStarted, { caster: entity, ability, point: target?.pos ?? order.init.point, duration: state.windup })\n\t\t}\n\n\t\tconst aim = target?.pos ?? order.init.point\n\t\tif (aim && target !== entity) faceTowards(world, entity, aim, dt)\n\t\tstate.windup -= dt\n\t\tif (state.windup > 0) return 'running'\n\n\t\t// paid at the moment of casting: a lot can happen during the wind-up\n\t\tconst problem =\n\t\t\tnotReady(world, entity, ability, item) ??\n\t\t\taimRefusal(world, entity, ability, { level: used.state.level, target, point: order.init.point, to: order.init.to })\n\t\tif (problem) {\n\t\t\tworld.message(entity.owner, problem)\n\t\t\treturn 'failed'\n\t\t}\n\t\tused.state.point = order.init.point\n\t\tif (order.init.to) used.state.to = { x: order.init.to.x, z: order.init.to.z }\n\t\telse delete used.state.to\n\t\tfire(world, entity, ability, target, item)\n\t\t// one kept up as the caster walks is the holds pack's (`holdsPack`), not the order's\n\t\tif (ability.channel && !ability.channel.walks && !entity.get(dashing) && entity.alive) {\n\t\t\tconst { level } = used.state\n\t\t\tconst { duration } = ability.channel\n\t\t\tconst seconds = typeof duration === 'function' ? duration(world, entity, level) : duration\n\t\t\tconst point = target?.pos ?? order.init.point ?? entity.pos\n\t\t\tstate.locked = false\n\t\t\tstate.channel = { ability: ability.id, level, target: target?.id, point: { x: point.x, z: point.z }, left: seconds, elapsed: 0 }\n\t\t\tworld.events.emit(channelStarted, { caster: entity, ability, duration: seconds })\n\t\t\treturn 'running'\n\t\t}\n\t\tif (!entity.get(dashing)) return 'done'\n\t\tstate.rushing = true\n\t\tstate.locked = true\n\t\treturn 'running'\n\t},\n\tend(world, entity, order) {\n\t\tsetAnchored(world, entity, false)\n\t\tconst { channel, windup } = order.state\n\t\t// called off mid wind-up (dead, its orders dropped, a fear taking it): told, so that its shape on the ground goes at once (B46)\n\t\tif (windup !== undefined && windup > 0 && !channel && !order.state.rushing)\n\t\t\tworld.events.emit(castCancelled, { caster: entity, ability: source(world, entity, order.init)?.ability })\n\t\t// called away, stunned, or dead before it was done\n\t\tif (channel && !channel.done && world.registry.abilities.has(channel.ability)) {\n\t\t\tchannel.done = true\n\t\t\tconst ability = world.registry.ability(channel.ability)\n\t\t\tability.channel?.interrupted?.(world, entity, channel.level)\n\t\t\tworld.events.emit(channelEnded, { caster: entity, ability, interrupted: true })\n\t\t}\n\t}\n}\n\n/** A channelled ability being kept up: plain data, in the order's state, so that a save has it */\n/**\n * An ability being channelled, kept in the cast order (`CastState.channel`)\n *\n * @beta\n */\nexport interface CastChannel {\n\t/** The ability, and its level */\n\tability: string\n\t/** The level of the ability being channelled */\n\tlevel: number\n\t/** What it is aimed at, and where */\n\ttarget?: number\n\t/** The world point the channel is aimed at (the target's position, or the point cast at) */\n\tpoint: Vec2\n\t/** Seconds still to go, and gone */\n\tleft: number\n\t/** Seconds the channel has already gone on */\n\telapsed: number\n\t/** Over: kept up to its end, or broken off */\n\tdone?: boolean\n}\n\n/**\n * A tick of keeping a channelled ability up: what it does every so often, and the end of it; broken off (`interrupted`\n * run, the end told) where it is tied to a target gone or out of its `leash`\n *\n * @internal\n */\nexport function channelling(world: World, caster: Entity, channel: CastChannel, dt: number): 'running' | 'done' {\n\tif (!world.registry.abilities.has(channel.ability)) return 'done'\n\tconst ability = world.registry.ability(channel.ability)\n\tconst kept = ability.channel!\n\tconst target = world.get(channel.target)\n\t// a tether: it breaks as the one it is tied to dies, hides or gets too far away\n\tif (kept.leash !== undefined && channel.target !== undefined && (!target?.alive || target.hidden || edgeDistance(caster, target) > kept.leash)) {\n\t\tchannel.done = true\n\t\tkept.interrupted?.(world, caster, channel.level)\n\t\tworld.events.emit(channelEnded, { caster, ability, interrupted: true })\n\t\treturn 'done'\n\t}\n\t// how many times `every` went by in this tick, from the time before it: worked out back from after it, rounding\n\t// could lose one\n\tconst before = channel.elapsed\n\tchannel.elapsed += dt\n\tchannel.left -= dt\n\tconst every = kept.every ?? 0\n\tconst times = every > 0 ? Math.floor(channel.elapsed / every) - Math.floor(before / every) : 0\n\tfor (let n = 0; n < times && caster.alive; n++) {\n\t\tconst context = { world, caster, ability, level: channel.level, target, point: channel.point }\n\t\trun(context, kept.effects)\n\t\tkept.run?.(world, caster, channel.level, target, channel.point)\n\t}\n\tif (channel.left > 0) return 'running'\n\tchannel.done = true\n\t// kept up to the end: what it does then, and only then\n\tif (kept.finished?.length && caster.alive) {\n\t\tconst context = { world, caster, ability, level: channel.level, target, point: channel.point }\n\t\trun(context, kept.finished)\n\t}\n\tworld.events.emit(channelEnded, { caster, ability, interrupted: false })\n\treturn 'done'\n}\n\n/**\n * A caster was hurt: a channelled ability it keeps up that breaks on damage (`channel.breaksOnDamage`, a recall) is\n * broken off, as another order would\n */\nexport function hurtWhileChannelling(world: World, caster: Entity): void {\n\tconst order = caster.orders[0]\n\tconst channel = order?.type === 'cast' ? (order.state.channel as CastChannel | undefined) : undefined\n\tif (!channel || channel.done || !world.registry.abilities.has(channel.ability)) return\n\tif (world.registry.ability(channel.ability).channel?.breaksOnDamage) clearOrders(world, caster)\n}\n"],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ //#region src/orders/facts.ts
2
+ /**
3
+ * What an entity's current order says of a fact (`OrderFact`): false for an entity with no order, or an order whose
4
+ * behaviour says nothing of it
5
+ *
6
+ * @beta
7
+ */
8
+ function orderSays(world, entity, fact) {
9
+ const order = entity.orders[0];
10
+ if (!order) return false;
11
+ return world.registry.orders.find(order.type)?.[fact]?.(order) === true;
12
+ }
13
+ //#endregion
14
+ export { orderSays };
15
+
16
+ //# sourceMappingURL=facts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"facts.js","names":[],"sources":["../../src/orders/facts.ts"],"sourcesContent":["/**\n * What the engine asks of an entity's current order (`orderSays`): its behaviour's to say (`OrderBehavior.committed`,\n * `waiting`, `channelling`, `building`), where it once read those fields of any order's state by name\n */\nimport type { Entity } from '#engine/entity'\nimport type { OrderFact } from '#engine/registry'\nimport type { World } from '#engine/world'\n/**\n * What an entity's current order says of a fact (`OrderFact`): false for an entity with no order, or an order whose\n * behaviour says nothing of it\n *\n * @beta\n */\nexport function orderSays(world: World, entity: Entity, fact: OrderFact): boolean {\n\tconst order = entity.orders[0]\n\tif (!order) return false\n\treturn world.registry.orders.find(order.type)?.[fact]?.(order) === true\n}\n"],"mappings":";;;;;;;AAaA,SAAgB,UAAU,OAAc,QAAgB,MAA0B;CACjF,MAAM,QAAQ,OAAO,OAAO;CAC5B,IAAI,CAAC,OAAO,OAAO;CACnB,OAAO,MAAM,SAAS,OAAO,KAAK,MAAM,IAAI,CAAC,GAAG,KAAK,GAAG,KAAK,MAAM;AACpE"}