@v12-engine/engine 0.1.1 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (951) hide show
  1. package/dist/abilities/amounts.d.ts +28 -0
  2. package/dist/abilities/amounts.js +74 -0
  3. package/dist/abilities/amounts.js.map +1 -0
  4. package/dist/abilities/buffs.d.ts +106 -6
  5. package/dist/abilities/buffs.js +443 -0
  6. package/dist/abilities/buffs.js.map +1 -0
  7. package/dist/abilities/castTold.d.ts +2 -0
  8. package/dist/abilities/castTold.js +66 -0
  9. package/dist/abilities/castTold.js.map +1 -0
  10. package/dist/abilities/chance.d.ts +38 -0
  11. package/dist/abilities/chance.js +77 -0
  12. package/dist/abilities/chance.js.map +1 -0
  13. package/dist/abilities/charges.d.ts +18 -0
  14. package/dist/abilities/charges.js +101 -0
  15. package/dist/abilities/charges.js.map +1 -0
  16. package/dist/abilities/control.d.ts +28 -0
  17. package/dist/abilities/control.js +113 -0
  18. package/dist/abilities/control.js.map +1 -0
  19. package/dist/abilities/dispel.js +51 -0
  20. package/dist/abilities/dispel.js.map +1 -0
  21. package/dist/abilities/effectFields.d.ts +1 -1
  22. package/dist/abilities/effectFields.js +676 -0
  23. package/dist/abilities/effectFields.js.map +1 -0
  24. package/dist/abilities/effectIndex.d.ts +27 -0
  25. package/dist/abilities/effectIndex.js +64 -0
  26. package/dist/abilities/effectIndex.js.map +1 -0
  27. package/dist/abilities/effects/buff.d.ts +9 -3
  28. package/dist/abilities/effects/buff.js +84 -0
  29. package/dist/abilities/effects/buff.js.map +1 -0
  30. package/dist/abilities/effects/conditions.d.ts +2 -0
  31. package/dist/abilities/effects/conditions.js +41 -0
  32. package/dist/abilities/effects/conditions.js.map +1 -0
  33. package/dist/abilities/effects/core.js +54 -0
  34. package/dist/abilities/effects/core.js.map +1 -0
  35. package/dist/abilities/effects/damage.d.ts +1 -1
  36. package/dist/abilities/effects/damage.js +43 -0
  37. package/dist/abilities/effects/damage.js.map +1 -0
  38. package/dist/abilities/effects/heal.d.ts +2 -2
  39. package/dist/abilities/effects/heal.js +51 -0
  40. package/dist/abilities/effects/heal.js.map +1 -0
  41. package/dist/abilities/effects/missile.d.ts +13 -1
  42. package/dist/abilities/effects/missile.js +104 -0
  43. package/dist/abilities/effects/missile.js.map +1 -0
  44. package/dist/abilities/effects/morph.d.ts +5 -0
  45. package/dist/abilities/effects/morph.js +43 -0
  46. package/dist/abilities/effects/morph.js.map +1 -0
  47. package/dist/abilities/effects/moves.d.ts +16 -4
  48. package/dist/abilities/effects/moves.js +212 -0
  49. package/dist/abilities/effects/moves.js.map +1 -0
  50. package/dist/abilities/effects/passives.d.ts +19 -9
  51. package/dist/abilities/effects/passives.js +131 -0
  52. package/dist/abilities/effects/passives.js.map +1 -0
  53. package/dist/abilities/effects/proxy.d.ts +5 -0
  54. package/dist/abilities/effects/proxy.js +60 -0
  55. package/dist/abilities/effects/proxy.js.map +1 -0
  56. package/dist/abilities/effects/sight.d.ts +2 -2
  57. package/dist/abilities/effects/sight.js +39 -0
  58. package/dist/abilities/effects/sight.js.map +1 -0
  59. package/dist/abilities/effects/spawn.d.ts +5 -2
  60. package/dist/abilities/effects/spawn.js +40 -0
  61. package/dist/abilities/effects/spawn.js.map +1 -0
  62. package/dist/abilities/effects/timed.d.ts +2 -2
  63. package/dist/abilities/effects/timed.js +96 -0
  64. package/dist/abilities/effects/timed.js.map +1 -0
  65. package/dist/abilities/effects/trade.d.ts +1 -1
  66. package/dist/abilities/effects/trade.js +25 -0
  67. package/dist/abilities/effects/trade.js.map +1 -0
  68. package/dist/abilities/effects.d.ts +97 -23
  69. package/dist/abilities/effects.js +860 -0
  70. package/dist/abilities/effects.js.map +1 -0
  71. package/dist/abilities/land.d.ts +38 -4
  72. package/dist/abilities/land.js +189 -0
  73. package/dist/abilities/land.js.map +1 -0
  74. package/dist/abilities/recast.d.ts +45 -0
  75. package/dist/abilities/recast.js +118 -0
  76. package/dist/abilities/recast.js.map +1 -0
  77. package/dist/abilities/scaled.js +40 -0
  78. package/dist/abilities/scaled.js.map +1 -0
  79. package/dist/abilities/screen.d.ts +6 -0
  80. package/dist/abilities/screen.js +83 -0
  81. package/dist/abilities/screen.js.map +1 -0
  82. package/dist/abilities/shapes.d.ts +66 -0
  83. package/dist/abilities/shapes.js +122 -0
  84. package/dist/abilities/shapes.js.map +1 -0
  85. package/dist/abilities/text.d.ts +14 -2
  86. package/dist/abilities/text.js +204 -0
  87. package/dist/abilities/text.js.map +1 -0
  88. package/dist/abilities/triggers.d.ts +98 -0
  89. package/dist/abilities/triggers.js +351 -0
  90. package/dist/abilities/triggers.js.map +1 -0
  91. package/dist/abilityChanges.d.ts +131 -0
  92. package/dist/abilityChanges.js +345 -0
  93. package/dist/abilityChanges.js.map +1 -0
  94. package/dist/ai/area.d.ts +4 -1
  95. package/dist/ai/brain.d.ts +4 -1
  96. package/dist/ai/brain.js +844 -0
  97. package/dist/ai/brain.js.map +1 -0
  98. package/dist/ai/budget.js +74 -0
  99. package/dist/ai/budget.js.map +1 -0
  100. package/dist/ai/checks.d.ts +9 -1
  101. package/dist/ai/checks.js +242 -0
  102. package/dist/ai/checks.js.map +1 -0
  103. package/dist/ai/computer.d.ts +11 -4
  104. package/dist/ai/computer.js +251 -0
  105. package/dist/ai/computer.js.map +1 -0
  106. package/dist/ai/defence.d.ts +4 -0
  107. package/dist/ai/defence.js +430 -0
  108. package/dist/ai/defence.js.map +1 -0
  109. package/dist/ai/define.d.ts +3 -2
  110. package/dist/ai/define.js +31 -0
  111. package/dist/ai/define.js.map +1 -0
  112. package/dist/ai/economy.d.ts +10 -7
  113. package/dist/ai/economy.js +780 -0
  114. package/dist/ai/economy.js.map +1 -0
  115. package/dist/ai/geometry.js +38 -0
  116. package/dist/ai/geometry.js.map +1 -0
  117. package/dist/ai/goals.d.ts +1 -0
  118. package/dist/ai/goals.js +560 -0
  119. package/dist/ai/goals.js.map +1 -0
  120. package/dist/ai/knowledge.d.ts +72 -7
  121. package/dist/ai/knowledge.js +804 -0
  122. package/dist/ai/knowledge.js.map +1 -0
  123. package/dist/ai/lanes.d.ts +10 -2
  124. package/dist/ai/lanes.js +715 -0
  125. package/dist/ai/lanes.js.map +1 -0
  126. package/dist/ai/melee/build.js +264 -0
  127. package/dist/ai/melee/build.js.map +1 -0
  128. package/dist/ai/melee/goals.d.ts +7 -0
  129. package/dist/ai/melee/goals.js +720 -0
  130. package/dist/ai/melee/goals.js.map +1 -0
  131. package/dist/ai/melee/heroes.js +68 -0
  132. package/dist/ai/melee/heroes.js.map +1 -0
  133. package/dist/ai/melee/index.d.ts +1 -1
  134. package/dist/ai/melee/index.js +51 -0
  135. package/dist/ai/melee/index.js.map +1 -0
  136. package/dist/ai/melee/production.js +29 -0
  137. package/dist/ai/melee/production.js.map +1 -0
  138. package/dist/ai/melee/surrender.js +64 -0
  139. package/dist/ai/melee/surrender.js.map +1 -0
  140. package/dist/ai/micro.d.ts +9 -0
  141. package/dist/ai/micro.js +1316 -0
  142. package/dist/ai/micro.js.map +1 -0
  143. package/dist/ai/mission.d.ts +9 -2
  144. package/dist/ai/mission.js +538 -0
  145. package/dist/ai/mission.js.map +1 -0
  146. package/dist/ai/missionRules.d.ts +1 -1
  147. package/dist/ai/missionRules.js +26 -0
  148. package/dist/ai/missionRules.js.map +1 -0
  149. package/dist/ai/module.d.ts +6 -2
  150. package/dist/ai/module.js +37 -0
  151. package/dist/ai/module.js.map +1 -0
  152. package/dist/ai/options.d.ts +3 -3
  153. package/dist/ai/plans/build.d.ts +20 -1
  154. package/dist/ai/plans/build.js +608 -0
  155. package/dist/ai/plans/build.js.map +1 -0
  156. package/dist/ai/plans/placement.d.ts +4 -1
  157. package/dist/ai/plans/placement.js +295 -0
  158. package/dist/ai/plans/placement.js.map +1 -0
  159. package/dist/ai/plans/plans.d.ts +9 -0
  160. package/dist/ai/plans/plans.js +110 -0
  161. package/dist/ai/plans/plans.js.map +1 -0
  162. package/dist/ai/plans/production.d.ts +14 -2
  163. package/dist/ai/plans/production.js +434 -0
  164. package/dist/ai/plans/production.js.map +1 -0
  165. package/dist/ai/plans/purse.d.ts +6 -3
  166. package/dist/ai/plans/purse.js +139 -0
  167. package/dist/ai/plans/purse.js.map +1 -0
  168. package/dist/ai/plans/tech.d.ts +6 -0
  169. package/dist/ai/plans/tech.js +122 -0
  170. package/dist/ai/plans/tech.js.map +1 -0
  171. package/dist/ai/profiles.d.ts +4 -4
  172. package/dist/{profiles-B3NS9jwk.js → ai/profiles.js} +3 -98
  173. package/dist/ai/profiles.js.map +1 -0
  174. package/dist/ai/reach.js +54 -0
  175. package/dist/ai/reach.js.map +1 -0
  176. package/dist/ai/report.d.ts +8 -0
  177. package/dist/ai/report.js +87 -0
  178. package/dist/ai/report.js.map +1 -0
  179. package/dist/ai/roles.d.ts +4 -0
  180. package/dist/ai/roles.js +207 -0
  181. package/dist/ai/roles.js.map +1 -0
  182. package/dist/ai/rules.d.ts +8 -2
  183. package/dist/ai/rules.js +416 -0
  184. package/dist/ai/rules.js.map +1 -0
  185. package/dist/ai/scouting.d.ts +6 -0
  186. package/dist/ai/scouting.js +324 -0
  187. package/dist/ai/scouting.js.map +1 -0
  188. package/dist/ai/settings.js +99 -0
  189. package/dist/ai/settings.js.map +1 -0
  190. package/dist/ai/squads.d.ts +21 -2
  191. package/dist/ai/squads.js +916 -0
  192. package/dist/ai/squads.js.map +1 -0
  193. package/dist/ai/strength.js +320 -0
  194. package/dist/ai/strength.js.map +1 -0
  195. package/dist/ai/task.d.ts +3 -1
  196. package/dist/ai/task.js +17 -0
  197. package/dist/ai/task.js.map +1 -0
  198. package/dist/ai/tasks/attack.js +24 -0
  199. package/dist/ai/tasks/attack.js.map +1 -0
  200. package/dist/ai/tasks/capture.d.ts +3 -3
  201. package/dist/ai/tasks/capture.js +37 -0
  202. package/dist/ai/tasks/capture.js.map +1 -0
  203. package/dist/ai/tasks/creep.js +29 -0
  204. package/dist/ai/tasks/creep.js.map +1 -0
  205. package/dist/ai/tasks/defend.js +61 -0
  206. package/dist/ai/tasks/defend.js.map +1 -0
  207. package/dist/ai/tasks/drop.js +81 -0
  208. package/dist/ai/tasks/drop.js.map +1 -0
  209. package/dist/ai/tasks/escort.js +59 -0
  210. package/dist/ai/tasks/escort.js.map +1 -0
  211. package/dist/ai/tasks/gather.js +48 -0
  212. package/dist/ai/tasks/gather.js.map +1 -0
  213. package/dist/ai/tasks/harass.js +39 -0
  214. package/dist/ai/tasks/harass.js.map +1 -0
  215. package/dist/ai/tasks/hold.js +32 -0
  216. package/dist/ai/tasks/hold.js.map +1 -0
  217. package/dist/ai/tasks/index.js +34 -0
  218. package/dist/ai/tasks/index.js.map +1 -0
  219. package/dist/ai/tasks/move.js +26 -0
  220. package/dist/ai/tasks/move.js.map +1 -0
  221. package/dist/ai/tasks/patrol.js +59 -0
  222. package/dist/ai/tasks/patrol.js.map +1 -0
  223. package/dist/ai/tasks/retreat.js +28 -0
  224. package/dist/ai/tasks/retreat.js.map +1 -0
  225. package/dist/ai/tasks/scout.js +73 -0
  226. package/dist/ai/tasks/scout.js.map +1 -0
  227. package/dist/ai/tasks/shared.d.ts +1 -1
  228. package/dist/ai/tasks/shared.js +137 -0
  229. package/dist/ai/tasks/shared.js.map +1 -0
  230. package/dist/ai/team.d.ts +18 -1
  231. package/dist/ai/team.js +492 -0
  232. package/dist/ai/team.js.map +1 -0
  233. package/dist/ai/threat.d.ts +6 -0
  234. package/dist/ai/threat.js +206 -0
  235. package/dist/ai/threat.js.map +1 -0
  236. package/dist/ai/view.d.ts +21 -7
  237. package/dist/ai/view.js +677 -0
  238. package/dist/ai/view.js.map +1 -0
  239. package/dist/ai/waves.d.ts +6 -0
  240. package/dist/ai/waves.js +410 -0
  241. package/dist/ai/waves.js.map +1 -0
  242. package/dist/ai.js +54 -6239
  243. package/dist/aiTesting.d.ts +6 -3
  244. package/dist/aiTesting.js +229 -0
  245. package/dist/aiTesting.js.map +1 -0
  246. package/dist/areas.d.ts +4 -1
  247. package/dist/areas.js +295 -0
  248. package/dist/areas.js.map +1 -0
  249. package/dist/attacks.d.ts +3 -3
  250. package/dist/attacks.js +127 -0
  251. package/dist/attacks.js.map +1 -0
  252. package/dist/burning.d.ts +267 -0
  253. package/dist/burning.js +795 -0
  254. package/dist/burning.js.map +1 -0
  255. package/dist/bytes.js +21 -0
  256. package/dist/bytes.js.map +1 -0
  257. package/dist/callings.d.ts +71 -0
  258. package/dist/callings.js +157 -0
  259. package/dist/callings.js.map +1 -0
  260. package/dist/cameraOrders.d.ts +78 -0
  261. package/dist/cameraOrders.js +114 -0
  262. package/dist/cameraOrders.js.map +1 -0
  263. package/dist/camps.d.ts +70 -4
  264. package/dist/camps.js +501 -0
  265. package/dist/camps.js.map +1 -0
  266. package/dist/capture.d.ts +15 -3
  267. package/dist/capture.js +304 -0
  268. package/dist/capture.js.map +1 -0
  269. package/dist/cellLayers.d.ts +78 -13
  270. package/dist/cellLayers.js +275 -0
  271. package/dist/cellLayers.js.map +1 -0
  272. package/dist/cellPatches.d.ts +24 -0
  273. package/dist/cellPatches.js +73 -0
  274. package/dist/cellPatches.js.map +1 -0
  275. package/dist/cinematics.d.ts +10 -5
  276. package/dist/cinematics.js +161 -0
  277. package/dist/cinematics.js.map +1 -0
  278. package/dist/clock.d.ts +2 -2
  279. package/dist/clock.js +78 -0
  280. package/dist/clock.js.map +1 -0
  281. package/dist/commands.d.ts +36 -4
  282. package/dist/commands.js +636 -0
  283. package/dist/commands.js.map +1 -0
  284. package/dist/components.d.ts +31 -10
  285. package/dist/components.js +74 -0
  286. package/dist/components.js.map +1 -0
  287. package/dist/computers.d.ts +4 -4
  288. package/dist/computers.js +194 -0
  289. package/dist/computers.js.map +1 -0
  290. package/dist/concealment.d.ts +25 -2
  291. package/dist/concealment.js +409 -0
  292. package/dist/concealment.js.map +1 -0
  293. package/dist/coreComponents.js +130 -0
  294. package/dist/coreComponents.js.map +1 -0
  295. package/dist/createGame.d.ts +306 -0
  296. package/dist/createGame.js +405 -0
  297. package/dist/createGame.js.map +1 -0
  298. package/dist/dashing.d.ts +18 -2
  299. package/dist/dashing.js +41 -0
  300. package/dist/dashing.js.map +1 -0
  301. package/dist/debug.d.ts +8 -0
  302. package/dist/debug.js +5 -3
  303. package/dist/debug2.js +76 -0
  304. package/dist/debug2.js.map +1 -0
  305. package/dist/debugCommands.d.ts +6 -6
  306. package/dist/debugCommands.js +537 -0
  307. package/dist/debugCommands.js.map +1 -0
  308. package/dist/debugging.d.ts +1 -0
  309. package/dist/defaultSets.d.ts +183 -0
  310. package/dist/defaultSets.js +216 -0
  311. package/dist/defaultSets.js.map +1 -0
  312. package/dist/definitions.d.ts +6 -0
  313. package/dist/definitions.js +78 -0
  314. package/dist/definitions.js.map +1 -0
  315. package/dist/defs.d.ts +1895 -165
  316. package/dist/defs.js +380 -0
  317. package/dist/defs.js.map +1 -0
  318. package/dist/denying.d.ts +4 -4
  319. package/dist/denying.js +106 -0
  320. package/dist/denying.js.map +1 -0
  321. package/dist/destructibles.d.ts +2 -2
  322. package/dist/destructibles.js +36 -0
  323. package/dist/destructibles.js.map +1 -0
  324. package/dist/determinism.d.ts +4 -4
  325. package/dist/determinism.js +247 -0
  326. package/dist/determinism.js.map +1 -0
  327. package/dist/dialog.d.ts +17 -2
  328. package/dist/dialog.js +108 -0
  329. package/dist/dialog.js.map +1 -0
  330. package/dist/effectRefs.js +28 -0
  331. package/dist/effectRefs.js.map +1 -0
  332. package/dist/effects.d.ts +27 -11
  333. package/dist/effects.js +110 -0
  334. package/dist/effects.js.map +1 -0
  335. package/dist/endings.d.ts +1 -1
  336. package/dist/endings.js +78 -0
  337. package/dist/endings.js.map +1 -0
  338. package/dist/engagement.d.ts +40 -6
  339. package/dist/engagement.js +530 -0
  340. package/dist/engagement.js.map +1 -0
  341. package/dist/engineEvents.d.ts +72 -9
  342. package/dist/engineEvents.js +520 -0
  343. package/dist/engineEvents.js.map +1 -0
  344. package/dist/entity.d.ts +275 -26
  345. package/dist/entity.js +441 -0
  346. package/dist/entity.js.map +1 -0
  347. package/dist/entityIndex.d.ts +10 -3
  348. package/dist/entityIndex.js +149 -0
  349. package/dist/entityIndex.js.map +1 -0
  350. package/dist/errors.d.ts +6 -2
  351. package/dist/errors.js +59 -0
  352. package/dist/errors.js.map +1 -0
  353. package/dist/events.d.ts +11 -5
  354. package/dist/events.js +158 -0
  355. package/dist/events.js.map +1 -0
  356. package/dist/exactMath.js +273 -0
  357. package/dist/exactMath.js.map +1 -0
  358. package/dist/features.d.ts +1 -1
  359. package/dist/features.js +127 -0
  360. package/dist/features.js.map +1 -0
  361. package/dist/fields.d.ts +25 -5
  362. package/dist/fields.js +140 -0
  363. package/dist/fields.js.map +1 -0
  364. package/dist/fixture.d.ts +3 -3
  365. package/dist/fixture.js +512 -0
  366. package/dist/fixture.js.map +1 -0
  367. package/dist/fog.d.ts +26 -3
  368. package/dist/fog.js +333 -0
  369. package/dist/fog.js.map +1 -0
  370. package/dist/foliage.d.ts +476 -0
  371. package/dist/foliage.js +1478 -0
  372. package/dist/foliage.js.map +1 -0
  373. package/dist/foliageDebug.d.ts +57 -0
  374. package/dist/foliageDebug.js +172 -0
  375. package/dist/foliageDebug.js.map +1 -0
  376. package/dist/foliageRegrowth.d.ts +20 -0
  377. package/dist/foliageRegrowth.js +332 -0
  378. package/dist/foliageRegrowth.js.map +1 -0
  379. package/dist/formState.d.ts +67 -0
  380. package/dist/formState.js +65 -0
  381. package/dist/formState.js.map +1 -0
  382. package/dist/formation.d.ts +46 -8
  383. package/dist/formation.js +297 -0
  384. package/dist/formation.js.map +1 -0
  385. package/dist/forms.d.ts +58 -0
  386. package/dist/forms.js +146 -0
  387. package/dist/forms.js.map +1 -0
  388. package/dist/friendlyFire.d.ts +2 -2
  389. package/dist/friendlyFire.js +37 -0
  390. package/dist/friendlyFire.js.map +1 -0
  391. package/dist/game.d.ts +141 -48
  392. package/dist/game.js +834 -0
  393. package/dist/game.js.map +1 -0
  394. package/dist/gameData.d.ts +96 -22
  395. package/dist/gameData.js +1690 -0
  396. package/dist/gameData.js.map +1 -0
  397. package/dist/gameFiles.d.ts +3 -3
  398. package/dist/gameFiles.js +14 -0
  399. package/dist/gameFiles.js.map +1 -0
  400. package/dist/gates.js +92 -0
  401. package/dist/gates.js.map +1 -0
  402. package/dist/generate.d.ts +28 -1
  403. package/dist/generate.js +1062 -0
  404. package/dist/generate.js.map +1 -0
  405. package/dist/generateWorker.d.ts +7 -3
  406. package/dist/generateWorker.js +86 -0
  407. package/dist/generateWorker.js.map +1 -0
  408. package/dist/grid.d.ts +9 -0
  409. package/dist/grid.js +102 -0
  410. package/dist/grid.js.map +1 -0
  411. package/dist/ground.d.ts +17 -1
  412. package/dist/ground.js +375 -0
  413. package/dist/ground.js.map +1 -0
  414. package/dist/groundObjects.d.ts +70 -0
  415. package/dist/groundObjects.js +371 -0
  416. package/dist/groundObjects.js.map +1 -0
  417. package/dist/groundSpeed.d.ts +20 -3
  418. package/dist/groundSpeed.js +117 -0
  419. package/dist/groundSpeed.js.map +1 -0
  420. package/dist/hero.d.ts +126 -10
  421. package/dist/hero.js +432 -0
  422. package/dist/hero.js.map +1 -0
  423. package/dist/holds.d.ts +94 -0
  424. package/dist/holds.js +305 -0
  425. package/dist/holds.js.map +1 -0
  426. package/dist/home.d.ts +1 -1
  427. package/dist/home.js +30 -0
  428. package/dist/home.js.map +1 -0
  429. package/dist/hooks.d.ts +339 -57
  430. package/dist/hooks.js +105 -0
  431. package/dist/hooks.js.map +1 -0
  432. package/dist/hotReload.d.ts +6 -5
  433. package/dist/hotReload.js +145 -0
  434. package/dist/hotReload.js.map +1 -0
  435. package/dist/ids.d.ts +3 -3
  436. package/dist/ids.js +30 -0
  437. package/dist/ids.js.map +1 -0
  438. package/dist/idsFile.d.ts +36 -0
  439. package/dist/idsFile.js +134 -0
  440. package/dist/idsFile.js.map +1 -0
  441. package/dist/index.d.ts +105 -68
  442. package/dist/index.js +194 -4701
  443. package/dist/inspect.d.ts +29 -2
  444. package/dist/{inspect-D9dWHmZ0.js → inspect.js} +21 -12
  445. package/dist/inspect.js.map +1 -0
  446. package/dist/inventory.d.ts +14 -1
  447. package/dist/inventory.js +84 -0
  448. package/dist/inventory.js.map +1 -0
  449. package/dist/items.d.ts +136 -8
  450. package/dist/items.js +585 -0
  451. package/dist/items.js.map +1 -0
  452. package/dist/lanes.d.ts +12 -3
  453. package/dist/lanes.js +496 -0
  454. package/dist/lanes.js.map +1 -0
  455. package/dist/life.d.ts +6 -2
  456. package/dist/life.js +287 -0
  457. package/dist/life.js.map +1 -0
  458. package/dist/log.d.ts +26 -3
  459. package/dist/log.js +192 -0
  460. package/dist/log.js.map +1 -0
  461. package/dist/manaBurn.d.ts +2 -2
  462. package/dist/manaBurn.js +75 -0
  463. package/dist/manaBurn.js.map +1 -0
  464. package/dist/map/file.d.ts +56 -3
  465. package/dist/map/file.js +264 -0
  466. package/dist/map/file.js.map +1 -0
  467. package/dist/map/images.js +61 -0
  468. package/dist/map/images.js.map +1 -0
  469. package/dist/map/look.d.ts +1 -1
  470. package/dist/map/look.js +30 -0
  471. package/dist/map/look.js.map +1 -0
  472. package/dist/map/pathProfile.js +183 -0
  473. package/dist/map/pathProfile.js.map +1 -0
  474. package/dist/map/resize.d.ts +4 -0
  475. package/dist/map/resize.js +136 -0
  476. package/dist/map/resize.js.map +1 -0
  477. package/dist/map/schema.js +257 -0
  478. package/dist/map/schema.js.map +1 -0
  479. package/dist/map/terrain.js +214 -0
  480. package/dist/map/terrain.js.map +1 -0
  481. package/dist/map/types.d.ts +92 -13
  482. package/dist/map/types.js +251 -0
  483. package/dist/map/types.js.map +1 -0
  484. package/dist/mapCheck/cells.js +94 -0
  485. package/dist/mapCheck/cells.js.map +1 -0
  486. package/dist/mapCheck/rules/foliage.d.ts +9 -0
  487. package/dist/mapCheck/rules/foliage.js +83 -0
  488. package/dist/mapCheck/rules/foliage.js.map +1 -0
  489. package/dist/mapCheck/rules/names.js +39 -0
  490. package/dist/mapCheck/rules/names.js.map +1 -0
  491. package/dist/mapCheck/rules/objects.d.ts +1 -1
  492. package/dist/mapCheck/rules/objects.js +56 -0
  493. package/dist/mapCheck/rules/objects.js.map +1 -0
  494. package/dist/mapCheck/rules/paths.js +32 -0
  495. package/dist/mapCheck/rules/paths.js.map +1 -0
  496. package/dist/mapCheck/rules/players.js +20 -0
  497. package/dist/mapCheck/rules/players.js.map +1 -0
  498. package/dist/mapCheck/rules/races.js +56 -0
  499. package/dist/mapCheck/rules/races.js.map +1 -0
  500. package/dist/mapCheck/rules/random.js +47 -0
  501. package/dist/mapCheck/rules/random.js.map +1 -0
  502. package/dist/mapCheck/rules/regions.js +30 -0
  503. package/dist/mapCheck/rules/regions.js.map +1 -0
  504. package/dist/mapCheck/rules/targets.js +31 -0
  505. package/dist/mapCheck/rules/targets.js.map +1 -0
  506. package/dist/mapCheck/rules/walking.js +45 -0
  507. package/dist/mapCheck/rules/walking.js.map +1 -0
  508. package/dist/mapCheck.d.ts +2 -2
  509. package/dist/mapCheck.js +63 -0
  510. package/dist/mapCheck.js.map +1 -0
  511. package/dist/mapFields.d.ts +25 -2
  512. package/dist/mapFields.js +134 -0
  513. package/dist/mapFields.js.map +1 -0
  514. package/dist/mapFile.js +176 -0
  515. package/dist/mapFile.js.map +1 -0
  516. package/dist/mapMeasure.d.ts +8 -0
  517. package/dist/mapMeasure.js +283 -0
  518. package/dist/mapMeasure.js.map +1 -0
  519. package/dist/mapMerge.d.ts +1 -0
  520. package/dist/mapMerge.js +172 -0
  521. package/dist/mapMerge.js.map +1 -0
  522. package/dist/mapObjectives.js +138 -0
  523. package/dist/mapObjectives.js.map +1 -0
  524. package/dist/mapObjects.js +80 -0
  525. package/dist/mapObjects.js.map +1 -0
  526. package/dist/math.d.ts +37 -7
  527. package/dist/math.js +155 -0
  528. package/dist/math.js.map +1 -0
  529. package/dist/messages.d.ts +71 -4
  530. package/dist/messages.js +29 -0
  531. package/dist/messages.js.map +1 -0
  532. package/dist/missionRules.d.ts +10 -2
  533. package/dist/{missionRules-C-bGxm0Q.js → missionRules.js} +30 -150
  534. package/dist/missionRules.js.map +1 -0
  535. package/dist/mods.d.ts +39 -20
  536. package/dist/mods.js +271 -0
  537. package/dist/mods.js.map +1 -0
  538. package/dist/moves.d.ts +87 -0
  539. package/dist/moves.js +539 -0
  540. package/dist/moves.js.map +1 -0
  541. package/dist/names.d.ts +7 -0
  542. package/dist/names.js +122 -0
  543. package/dist/names.js.map +1 -0
  544. package/dist/navigation/agentParams.js +14 -0
  545. package/dist/navigation/agentParams.js.map +1 -0
  546. package/dist/navigation/air.d.ts +7 -3
  547. package/dist/navigation/air.js +401 -0
  548. package/dist/navigation/air.js.map +1 -0
  549. package/dist/navigation/builds.d.ts +34 -2
  550. package/dist/navigation/builds.js +287 -0
  551. package/dist/navigation/builds.js.map +1 -0
  552. package/dist/navigation/groundAreas.d.ts +59 -1
  553. package/dist/navigation/groundAreas.js +407 -0
  554. package/dist/navigation/groundAreas.js.map +1 -0
  555. package/dist/navigation/navigation.d.ts +98 -9
  556. package/dist/navigation/recast.d.ts +194 -18
  557. package/dist/navigation/recast.js +1379 -0
  558. package/dist/navigation/recast.js.map +1 -0
  559. package/dist/navigation/sidePaths.d.ts +8 -3
  560. package/dist/navigation/sidePaths.js +241 -0
  561. package/dist/navigation/sidePaths.js.map +1 -0
  562. package/dist/navigation/sized.js +243 -0
  563. package/dist/navigation/sized.js.map +1 -0
  564. package/dist/nearest.js +32 -0
  565. package/dist/nearest.js.map +1 -0
  566. package/dist/noise.js +59 -0
  567. package/dist/noise.js.map +1 -0
  568. package/dist/objectives.d.ts +12 -3
  569. package/dist/objectives.js +144 -0
  570. package/dist/objectives.js.map +1 -0
  571. package/dist/orders/basic.d.ts +5 -5
  572. package/dist/orders/basic.js +417 -0
  573. package/dist/orders/basic.js.map +1 -0
  574. package/dist/orders/build.js +278 -0
  575. package/dist/orders/build.js.map +1 -0
  576. package/dist/orders/cast.d.ts +13 -3
  577. package/dist/orders/cast.js +558 -0
  578. package/dist/orders/cast.js.map +1 -0
  579. package/dist/orders/facts.js +16 -0
  580. package/dist/orders/facts.js.map +1 -0
  581. package/dist/orders/harvest.d.ts +21 -5
  582. package/dist/orders/harvest.js +540 -0
  583. package/dist/orders/harvest.js.map +1 -0
  584. package/dist/orders/idle.d.ts +3 -1
  585. package/dist/orders/idle.js +234 -0
  586. package/dist/orders/idle.js.map +1 -0
  587. package/dist/orders/items.js +92 -0
  588. package/dist/orders/items.js.map +1 -0
  589. package/dist/orders/queue.js +108 -0
  590. package/dist/orders/queue.js.map +1 -0
  591. package/dist/orders/waiting.d.ts +39 -0
  592. package/dist/orders/waiting.js +149 -0
  593. package/dist/orders/waiting.js.map +1 -0
  594. package/dist/pack.schema.js +13 -0
  595. package/dist/pack.schema.js.map +1 -0
  596. package/dist/pack.schema.json +7622 -841
  597. package/dist/packs/director/index.d.ts +13 -5
  598. package/dist/packs/director/index.js +204 -0
  599. package/dist/packs/director/index.js.map +1 -0
  600. package/dist/packs/heroes/campaign.d.ts +3 -2
  601. package/dist/packs/heroes/campaign.js +241 -0
  602. package/dist/packs/heroes/campaign.js.map +1 -0
  603. package/dist/packs/heroes/carry.d.ts +6 -0
  604. package/dist/packs/heroes/carry.js +112 -0
  605. package/dist/packs/heroes/carry.js.map +1 -0
  606. package/dist/packs/heroes/commands.js +115 -0
  607. package/dist/packs/heroes/commands.js.map +1 -0
  608. package/dist/packs/heroes/fallen.d.ts +43 -0
  609. package/dist/packs/heroes/fallen.js +61 -0
  610. package/dist/packs/heroes/fallen.js.map +1 -0
  611. package/dist/packs/heroes/hire.js +60 -0
  612. package/dist/packs/heroes/hire.js.map +1 -0
  613. package/dist/packs/heroes/index.d.ts +7 -6
  614. package/dist/packs/heroes/index.js +130 -0
  615. package/dist/packs/heroes/index.js.map +1 -0
  616. package/dist/packs/heroes/loop.d.ts +95 -0
  617. package/dist/packs/heroes/loop.js +250 -0
  618. package/dist/packs/heroes/loop.js.map +1 -0
  619. package/dist/packs/heroes/making.d.ts +6 -3
  620. package/dist/packs/heroes/making.js +55 -0
  621. package/dist/packs/heroes/making.js.map +1 -0
  622. package/dist/packs/heroes/respawn.d.ts +3 -3
  623. package/dist/packs/heroes/respawn.js +87 -0
  624. package/dist/packs/heroes/respawn.js.map +1 -0
  625. package/dist/packs/heroes/sets.d.ts +32 -0
  626. package/dist/packs/heroes/sets.js +51 -0
  627. package/dist/packs/heroes/sets.js.map +1 -0
  628. package/dist/packs/heroes/spells.d.ts +16 -0
  629. package/dist/packs/heroes/spells.js +269 -0
  630. package/dist/packs/heroes/spells.js.map +1 -0
  631. package/dist/packs/items/defaults.d.ts +43 -0
  632. package/dist/packs/items/defaults.js +1504 -0
  633. package/dist/packs/items/defaults.js.map +1 -0
  634. package/dist/packs/items/index.d.ts +27 -0
  635. package/dist/packs/items/index.js +214 -0
  636. package/dist/packs/items/index.js.map +1 -0
  637. package/dist/packs/moba/index.d.ts +3 -3
  638. package/dist/packs/moba/index.js +174 -0
  639. package/dist/packs/moba/index.js.map +1 -0
  640. package/dist/packs/pack.d.ts +15 -15
  641. package/dist/packs/pack.js +14 -0
  642. package/dist/packs/pack.js.map +1 -0
  643. package/dist/packs.d.ts +15 -7
  644. package/dist/packs.js +222 -0
  645. package/dist/packs.js.map +1 -0
  646. package/dist/paths.d.ts +2 -0
  647. package/dist/paths.js +109 -0
  648. package/dist/paths.js.map +1 -0
  649. package/dist/plain.js +57 -0
  650. package/dist/plain.js.map +1 -0
  651. package/dist/player.d.ts +33 -10
  652. package/dist/player.js +159 -0
  653. package/dist/player.js.map +1 -0
  654. package/dist/portals.d.ts +1 -1
  655. package/dist/portals.js +194 -0
  656. package/dist/portals.js.map +1 -0
  657. package/dist/prefabs.d.ts +25 -2
  658. package/dist/prefabs.js +239 -0
  659. package/dist/prefabs.js.map +1 -0
  660. package/dist/presetBuildings.js +58 -0
  661. package/dist/presetBuildings.js.map +1 -0
  662. package/dist/presetFoliage.d.ts +27 -0
  663. package/dist/presetFoliage.js +98 -0
  664. package/dist/presetFoliage.js.map +1 -0
  665. package/dist/presetGround.js +65 -0
  666. package/dist/presetGround.js.map +1 -0
  667. package/dist/proxies.d.ts +12 -0
  668. package/dist/proxies.js +79 -0
  669. package/dist/proxies.js.map +1 -0
  670. package/dist/query.d.ts +56 -0
  671. package/dist/query.js +88 -0
  672. package/dist/query.js.map +1 -0
  673. package/dist/races.d.ts +15 -14
  674. package/dist/races.js +172 -0
  675. package/dist/races.js.map +1 -0
  676. package/dist/randomGroups.js +91 -0
  677. package/dist/randomGroups.js.map +1 -0
  678. package/dist/registry.d.ts +117 -53
  679. package/dist/registry.js +323 -0
  680. package/dist/registry.js.map +1 -0
  681. package/dist/remains.d.ts +11 -9
  682. package/dist/remains.js +188 -0
  683. package/dist/remains.js.map +1 -0
  684. package/dist/replication.d.ts +12 -7
  685. package/dist/replication.js +100 -0
  686. package/dist/replication.js.map +1 -0
  687. package/dist/rng.d.ts +2 -0
  688. package/dist/rng.js +40 -0
  689. package/dist/rng.js.map +1 -0
  690. package/dist/rules.d.ts +186 -99
  691. package/dist/rules.js +179 -0
  692. package/dist/rules.js.map +1 -0
  693. package/dist/rulesCheck.d.ts +5 -4
  694. package/dist/rulesCheck.js +693 -0
  695. package/dist/rulesCheck.js.map +1 -0
  696. package/dist/runes.d.ts +2 -2
  697. package/dist/runes.js +80 -0
  698. package/dist/runes.js.map +1 -0
  699. package/dist/save.d.ts +37 -12
  700. package/dist/save.js +532 -0
  701. package/dist/save.js.map +1 -0
  702. package/dist/scenario.d.ts +2 -2
  703. package/dist/scenario.js +99 -0
  704. package/dist/scenario.js.map +1 -0
  705. package/dist/scheduler.d.ts +3 -0
  706. package/dist/scheduler.js +156 -0
  707. package/dist/scheduler.js.map +1 -0
  708. package/dist/score.d.ts +19 -19
  709. package/dist/score.js +709 -0
  710. package/dist/score.js.map +1 -0
  711. package/dist/sequences.d.ts +10 -6
  712. package/dist/sequences.js +206 -0
  713. package/dist/sequences.js.map +1 -0
  714. package/dist/server/doorman.js +154 -0
  715. package/dist/server/doorman.js.map +1 -0
  716. package/dist/server/gameServer.d.ts +16 -1
  717. package/dist/server/gameServer.js +643 -0
  718. package/dist/server/gameServer.js.map +1 -0
  719. package/dist/server/index.d.ts +1 -1
  720. package/dist/server/lobby.js +199 -0
  721. package/dist/server/lobby.js.map +1 -0
  722. package/dist/server/log.js +18 -0
  723. package/dist/server/log.js.map +1 -0
  724. package/dist/server/match.js +267 -0
  725. package/dist/server/match.js.map +1 -0
  726. package/dist/server/mode.d.ts +18 -9
  727. package/dist/server/mode.js +220 -0
  728. package/dist/server/mode.js.map +1 -0
  729. package/dist/{navigation-worker.js → server/navigation-worker.js} +1 -1
  730. package/dist/server/navigation-worker.js.map +1 -0
  731. package/dist/server/navigation.js +39 -0
  732. package/dist/server/navigation.js.map +1 -0
  733. package/dist/server/ops.d.ts +4 -0
  734. package/dist/server/ops.js +137 -0
  735. package/dist/server/ops.js.map +1 -0
  736. package/dist/server/packs.d.ts +3 -3
  737. package/dist/server/packs.js +32 -0
  738. package/dist/server/packs.js.map +1 -0
  739. package/dist/server/ratings.d.ts +5 -0
  740. package/dist/server/ratings.js +104 -0
  741. package/dist/server/ratings.js.map +1 -0
  742. package/dist/server/relay.d.ts +12 -2
  743. package/dist/server/relay.js +144 -0
  744. package/dist/server/relay.js.map +1 -0
  745. package/dist/server/rooms.d.ts +9 -2
  746. package/dist/server/rooms.js +442 -0
  747. package/dist/server/rooms.js.map +1 -0
  748. package/dist/server/seat.js +116 -0
  749. package/dist/server/seat.js.map +1 -0
  750. package/dist/server/seatSettings.d.ts +3 -3
  751. package/dist/server/seatSettings.js +63 -0
  752. package/dist/server/seatSettings.js.map +1 -0
  753. package/dist/server/secret.js +13 -0
  754. package/dist/server/secret.js.map +1 -0
  755. package/dist/server/start.d.ts +13 -6
  756. package/dist/server/start.js +76 -0
  757. package/dist/server/start.js.map +1 -0
  758. package/dist/server/websocket.d.ts +9 -1
  759. package/dist/server/websocket.js +306 -0
  760. package/dist/server/websocket.js.map +1 -0
  761. package/dist/server.js +15 -2861
  762. package/dist/session/can.js +26 -0
  763. package/dist/session/can.js.map +1 -0
  764. package/dist/session/commandReplay.d.ts +8 -2
  765. package/dist/session/commandReplay.js +293 -0
  766. package/dist/session/commandReplay.js.map +1 -0
  767. package/dist/session/debug.js +151 -0
  768. package/dist/session/debug.js.map +1 -0
  769. package/dist/session/delay.js +62 -0
  770. package/dist/session/delay.js.map +1 -0
  771. package/dist/session/delta.d.ts +14 -1
  772. package/dist/session/delta.js +407 -0
  773. package/dist/session/delta.js.map +1 -0
  774. package/dist/session/entityState.js +415 -0
  775. package/dist/session/entityState.js.map +1 -0
  776. package/dist/session/local.d.ts +47 -5
  777. package/dist/session/local.js +670 -0
  778. package/dist/session/local.js.map +1 -0
  779. package/dist/session/memory.d.ts +20 -2
  780. package/dist/session/memory.js +131 -0
  781. package/dist/session/memory.js.map +1 -0
  782. package/dist/session/protocol.d.ts +325 -31
  783. package/dist/session/protocol.js +55 -0
  784. package/dist/session/protocol.js.map +1 -0
  785. package/dist/session/remote.d.ts +74 -12
  786. package/dist/session/remote.js +1394 -0
  787. package/dist/session/remote.js.map +1 -0
  788. package/dist/session/replay.d.ts +11 -2
  789. package/dist/session/replay.js +160 -0
  790. package/dist/session/replay.js.map +1 -0
  791. package/dist/session/seed.js +12 -0
  792. package/dist/session/seed.js.map +1 -0
  793. package/dist/session/share.d.ts +5 -1
  794. package/dist/session/share.js +94 -0
  795. package/dist/session/share.js.map +1 -0
  796. package/dist/session/socket.d.ts +1 -1
  797. package/dist/session/socket.js +29 -0
  798. package/dist/session/socket.js.map +1 -0
  799. package/dist/session/wire.d.ts +5 -0
  800. package/dist/session/wire.js +84 -0
  801. package/dist/session/wire.js.map +1 -0
  802. package/dist/session/worker.d.ts +77 -12
  803. package/dist/session/worker.js +499 -0
  804. package/dist/session/worker.js.map +1 -0
  805. package/dist/shared.d.ts +31 -5
  806. package/dist/shared.js +166 -0
  807. package/dist/shared.js.map +1 -0
  808. package/dist/sides.d.ts +9 -3
  809. package/dist/sides.js +149 -0
  810. package/dist/sides.js.map +1 -0
  811. package/dist/sight.js +85 -0
  812. package/dist/sight.js.map +1 -0
  813. package/dist/simulate-worker.js +1 -1
  814. package/dist/simulate.d.ts +12 -8
  815. package/dist/{simulate-oXBiw1Ff.js → simulate.js} +10 -11
  816. package/dist/simulate.js.map +1 -0
  817. package/dist/smart.js +77 -0
  818. package/dist/smart.js.map +1 -0
  819. package/dist/spatial.d.ts +32 -16
  820. package/dist/spatial.js +234 -0
  821. package/dist/spatial.js.map +1 -0
  822. package/dist/spawning.d.ts +1 -0
  823. package/dist/spawning.js +224 -0
  824. package/dist/spawning.js.map +1 -0
  825. package/dist/stances.d.ts +6 -3
  826. package/dist/stances.js +169 -0
  827. package/dist/stances.js.map +1 -0
  828. package/dist/start.d.ts +10 -10
  829. package/dist/start.js +75 -0
  830. package/dist/start.js.map +1 -0
  831. package/dist/stats.d.ts +42 -16
  832. package/dist/stats.js +290 -0
  833. package/dist/stats.js.map +1 -0
  834. package/dist/summoned.d.ts +52 -0
  835. package/dist/summoned.js +38 -0
  836. package/dist/summoned.js.map +1 -0
  837. package/dist/summons.d.ts +10 -13
  838. package/dist/summons.js +271 -0
  839. package/dist/summons.js.map +1 -0
  840. package/dist/systems/abilities.js +224 -0
  841. package/dist/systems/abilities.js.map +1 -0
  842. package/dist/systems/combat.d.ts +35 -1
  843. package/dist/systems/combat.js +677 -0
  844. package/dist/systems/combat.js.map +1 -0
  845. package/dist/systems/combatTold.d.ts +3 -1
  846. package/dist/systems/combatTold.js +85 -0
  847. package/dist/systems/combatTold.js.map +1 -0
  848. package/dist/systems/construction.js +80 -0
  849. package/dist/systems/construction.js.map +1 -0
  850. package/dist/systems/economy.d.ts +0 -6
  851. package/dist/systems/economy.js +128 -0
  852. package/dist/systems/economy.js.map +1 -0
  853. package/dist/systems/fog.d.ts +1 -1
  854. package/dist/systems/fog.js +120 -0
  855. package/dist/systems/fog.js.map +1 -0
  856. package/dist/systems/life.js +32 -0
  857. package/dist/systems/life.js.map +1 -0
  858. package/dist/systems/movement.d.ts +24 -12
  859. package/dist/systems/movement.js +1247 -0
  860. package/dist/systems/movement.js.map +1 -0
  861. package/dist/systems/orders.js +64 -0
  862. package/dist/systems/orders.js.map +1 -0
  863. package/dist/systems/production.js +322 -0
  864. package/dist/systems/production.js.map +1 -0
  865. package/dist/systems/productionQueue.js +120 -0
  866. package/dist/systems/productionQueue.js.map +1 -0
  867. package/dist/systems/victory.d.ts +1 -1
  868. package/dist/systems/victory.js +56 -0
  869. package/dist/systems/victory.js.map +1 -0
  870. package/dist/talk.d.ts +6 -6
  871. package/dist/talk.js +153 -0
  872. package/dist/talk.js.map +1 -0
  873. package/dist/targeting.d.ts +142 -0
  874. package/dist/targeting.js +49 -0
  875. package/dist/targeting.js.map +1 -0
  876. package/dist/tech.d.ts +20 -3
  877. package/dist/tech.js +239 -0
  878. package/dist/tech.js.map +1 -0
  879. package/dist/techTree.d.ts +7 -0
  880. package/dist/techTree.js +90 -0
  881. package/dist/techTree.js.map +1 -0
  882. package/dist/terrain.d.ts +59 -7
  883. package/dist/terrain.js +389 -0
  884. package/dist/terrain.js.map +1 -0
  885. package/dist/terrainSave.d.ts +6 -0
  886. package/dist/terrainSave.js +74 -0
  887. package/dist/terrainSave.js.map +1 -0
  888. package/dist/testing.d.ts +8 -7
  889. package/dist/testing.js +13 -739
  890. package/dist/testing.js.map +1 -1
  891. package/dist/tiles.d.ts +1 -1
  892. package/dist/tiles.js +43 -0
  893. package/dist/tiles.js.map +1 -0
  894. package/dist/timers.d.ts +29 -4
  895. package/dist/timers.js +242 -0
  896. package/dist/timers.js.map +1 -0
  897. package/dist/tomes.d.ts +4 -4
  898. package/dist/tomes.js +94 -0
  899. package/dist/tomes.js.map +1 -0
  900. package/dist/trade.js +103 -0
  901. package/dist/trade.js.map +1 -0
  902. package/dist/transport.d.ts +6 -1
  903. package/dist/transport.js +281 -0
  904. package/dist/transport.js.map +1 -0
  905. package/dist/tunables.d.ts +10 -3
  906. package/dist/tunables.js +56 -0
  907. package/dist/tunables.js.map +1 -0
  908. package/dist/unitResources.d.ts +67 -0
  909. package/dist/unitResources.js +266 -0
  910. package/dist/unitResources.js.map +1 -0
  911. package/dist/upkeep.d.ts +6 -1
  912. package/dist/upkeep.js +26 -0
  913. package/dist/upkeep.js.map +1 -0
  914. package/dist/veterancy.d.ts +8 -3
  915. package/dist/veterancy.js +131 -0
  916. package/dist/veterancy.js.map +1 -0
  917. package/dist/vision.d.ts +36 -0
  918. package/dist/vision.js +133 -0
  919. package/dist/vision.js.map +1 -0
  920. package/dist/walls.d.ts +1 -1
  921. package/dist/walls.js +278 -0
  922. package/dist/walls.js.map +1 -0
  923. package/dist/world.d.ts +606 -88
  924. package/dist/world.js +1263 -0
  925. package/dist/world.js.map +1 -0
  926. package/package.json +2 -2
  927. package/dist/ai.js.map +0 -1
  928. package/dist/attributes.d.ts +0 -66
  929. package/dist/brain-BvVdUhX8.js +0 -7659
  930. package/dist/brain-BvVdUhX8.js.map +0 -1
  931. package/dist/builds-C6LfgvEU.js +0 -460
  932. package/dist/builds-C6LfgvEU.js.map +0 -1
  933. package/dist/coreComponents-syuh2fPG.js +0 -5149
  934. package/dist/coreComponents-syuh2fPG.js.map +0 -1
  935. package/dist/debugCommands-CzjrSm66.js +0 -14739
  936. package/dist/debugCommands-CzjrSm66.js.map +0 -1
  937. package/dist/determinism-BCymQwiE.js +0 -518
  938. package/dist/determinism-BCymQwiE.js.map +0 -1
  939. package/dist/game-DiJEN-Ks.js +0 -5800
  940. package/dist/game-DiJEN-Ks.js.map +0 -1
  941. package/dist/index.js.map +0 -1
  942. package/dist/inspect-D9dWHmZ0.js.map +0 -1
  943. package/dist/local-Dkovq42k.js +0 -1379
  944. package/dist/local-Dkovq42k.js.map +0 -1
  945. package/dist/missionRules-C-bGxm0Q.js.map +0 -1
  946. package/dist/navigation-worker.js.map +0 -1
  947. package/dist/packs-g5thvmGn.js +0 -3199
  948. package/dist/packs-g5thvmGn.js.map +0 -1
  949. package/dist/profiles-B3NS9jwk.js.map +0 -1
  950. package/dist/server.js.map +0 -1
  951. package/dist/simulate-oXBiw1Ff.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hero.js","names":[],"sources":["../src/hero.ts"],"sourcesContent":["import { heroLevelUp, heroRevived, xpGained } from '#engine/engineEvents'\nimport { type CallingDef, defaultCallings } from './callings'\nimport { defineComponent, snapshotOf } from './components'\nimport type { Cost } from './defs'\nimport { type Entity, type EntityId, fighting, moving, type PlayerId } from './entity'\nimport { defineEngineEvent } from './events'\nimport type { Vec2 } from './math'\nimport { refreshVitals, statsOf } from './stats'\nimport { readyAgain } from './abilities/charges'\nimport type { World } from './world'\nimport { agentParamsOf } from './navigation/agentParams'\nimport { engineMessage } from './messages'\nimport type { EntityState, LearnableInfo, XpInfo } from './session/protocol'\nimport { currencyOf } from './player'\nimport type { GamePack } from './packs/pack'\nimport { replicateEvent } from './replication'\nimport type { HeroSummary } from './session/protocol'\nimport { productionOf } from './systems/productionQueue'\nimport { learnedInForm, learnsOf } from './formState'\n\n/**\n * The id of the heroes pack (`heroesPack`): `hasPack(game, HEROES)`\n *\n * @beta\n */\nexport const HEROES = 'core.heroes'\n\n/**\n * The numbers and formulas of heroes, the heroes pack's (`heroesPack(rules)`): how many heroes a player may\n * have, how much experience a level takes, what bringing one back costs. The classic RTS numbers for\n * those left out\n *\n * @beta\n */\nexport interface HeroSettings {\n\t/** Heroes a player can have at once, fallen ones and ones being trained included */\n\tmaxHeroes: number\n\t/** The level heroes stop at, unless their type says otherwise (`HeroDef.maxLevel`) */\n\tmaxHeroLevel: number\n\t/** Heroes this close to a kill get a share of the experience */\n\txpRange: number\n\t/** Experience needed in total to be of a level. Level 1 must need none */\n\txpForLevel(level: number): number\n\t/** Experience a kill is worth, for units whose type does not say (`UnitTypeDef.xp`) */\n\tkillXp(world: World, dead: Entity): number\n\t/** What it costs to bring a fallen hero back, in the game's money, and how long it takes in seconds */\n\trevive(world: World, hero: Entity): { cost: Cost; time: number }\n\t/** Ability points a hero gets for reaching a level. One, when left out */\n\tpointsForLevel(level: number): number\n\t/** Seconds a fallen hero is remembered as it fell (`fallenHeroes`): 8 when left out */\n\tfallenFor: number\n\t/**\n\t * Seconds within which a hero that hurt a hero, or healed, shielded or buffed the hero that killed it, assists the\n\t * kill (`heroAssists`): it shares the kill's experience wherever it is, and is paid `assistGold`. 10 when left out;\n\t * 0 for no assists\n\t */\n\tassistTime: number\n\t/**\n\t * Which heroes assist a hero's kill, of those the engine found (`foundAssists`: who hurt it and who helped its\n\t * killer within `assistTime`): all of them when left out. A game's own rule (only those near, only damage)\n\t */\n\tassists(world: World, victim: Entity, killer: Entity | undefined, found: readonly Entity[]): readonly Entity[]\n\t/**\n\t * Gold the player of each hero that assists a hero's kill is paid. Half of what the kill is worth (its bounty's\n\t * middle, or 100 and 25 a level of the victim's: `heroKillWorth`), shared out among them, when left out\n\t */\n\tassistGold(world: World, victim: Entity, killer: Entity | undefined, assists: readonly Entity[]): number\n\t/**\n\t * Gold a hero's death pays its killer's player on top of the kill, for the kills it made in a row without dying\n\t * (`streak`): the shutdown that ends a streak. None under 3, then 100, and 50 more for each kill past it, 500 at\n\t * most, when left out\n\t */\n\tshutdownGold(world: World, victim: Entity, streak: number): number\n\t/**\n\t * What buying a fallen hero back costs its player (`buyBack`): 100 and 40 a level of its, in the game's money, when\n\t * left out. Nothing for a hero that cannot be bought back: a game without buyback says `() => undefined`\n\t */\n\tbuybackCost(world: World, hero: Entity): Cost | undefined\n\t/** Seconds a hero bought back waits before it may be again: 120 when left out */\n\tbuybackCooldown: number\n\t/**\n\t * The callings a hero may have (`HeroDef.callings`): the engine's when left out (`defaultCallings`), or a game's\n\t * own, some of them, renamed or added to: `heroesPack({ callings: [...] })`\n\t *\n\t * @beta\n\t */\n\tcallings: readonly CallingDef[]\n}\n\n/**\n * What the kill of a hero is worth in the game's money, as the engine's rules have it (what assists share,\n * `HeroSettings.assistGold`): the middle of its bounty (`UnitTypeDef.bounty`), or 100 and 25 a level\n *\n * @beta\n */\nexport function heroKillWorth(victim: Entity): number {\n\tconst bounty = victim.def.bounty\n\tif (bounty) return (bounty[0] + bounty[1]) / 2\n\treturn 100 + 25 * (heroOf(victim)?.level ?? 1)\n}\n\n/**\n * The heroes pack's rules where a game says nothing: the classic RTS numbers\n *\n * @internal\n */\nexport const defaultHeroSettings: Readonly<HeroSettings> = Object.freeze({\n\tmaxHeroes: 3,\n\tmaxHeroLevel: 10,\n\txpRange: 20,\n\t// 200, 500, 900, 1400, ...\n\txpForLevel: (level: number) => 50 * (level - 1) * (level + 2),\n\tkillXp(world: World, dead: Entity) {\n\t\tconst hero = heroOf(dead)\n\t\tif (hero) return 100 * hero.level\n\t\tif (!dead.isUnit) return 0\n\t\t// a quarter of what it cost in the game's money\n\t\treturn Math.max(Math.round(currencyOf(world.registry, dead.def.cost) / 4), 10)\n\t},\n\trevive(world: World, hero: Entity) {\n\t\tconst level = heroOf(hero)?.level ?? 1\n\t\tconst { currency } = world.registry\n\t\tconst paid = currencyOf(world.registry, hero.def.cost)\n\t\tconst cost: Cost = currency ? { [currency]: Math.min(Math.round(paid * (0.4 + 0.1 * level)), 700) } : {}\n\t\treturn { cost, time: Math.min((hero.def.buildTime ?? 30) * 0.5 + 4 * level, 110) }\n\t},\n\tpointsForLevel: () => 1,\n\tfallenFor: 8,\n\tassistTime: 10,\n\tassists: (_world: World, _victim: Entity, _killer: Entity | undefined, found: readonly Entity[]) => found,\n\tassistGold: (_world: World, victim: Entity, _killer: Entity | undefined, assists: readonly Entity[]) =>\n\t\tassists.length ? Math.round(heroKillWorth(victim) / 2 / assists.length) : 0,\n\tshutdownGold: (_world: World, _victim: Entity, streak: number) => (streak < 3 ? 0 : Math.min(100 + 50 * (streak - 3), 500)),\n\tbuybackCost(world: World, hero: Entity) {\n\t\tconst { currency } = world.registry\n\t\treturn currency ? { [currency]: 100 + 40 * (heroOf(hero)?.level ?? 1) } : undefined\n\t},\n\tbuybackCooldown: 120,\n\tcallings: Object.freeze(defaultCallings())\n})\n\n/**\n * The heroes pack, as `heroesPack` makes it: its rules beside its parts\n *\n * @beta\n */\nexport interface HeroesPack extends GamePack {\n\t/** What the game says of heroes, over the engine's (`defaultHeroSettings`): what the pack was made with (`RuleSettings.heroes`) */\n\toptions: Partial<HeroSettings>\n\t/** The callings its heroes may have: the game's (`heroesPack({ callings })`) or the engine's (`defaultCallings`) @beta */\n\tcallings: readonly CallingDef[]\n}\n\n/**\n * What a hero has earned: its level, its experience, the points it has to put into abilities (`heroState`)\n *\n * @beta\n */\nexport interface HeroState {\n\t/** The hero's level */\n\tlevel: number\n\t/** Experience in total */\n\txp: number\n\t/** Points that can be put into abilities */\n\tpoints: number\n}\n\n/**\n * What a player is told of a hero (`heroState`): its level, to everyone who sees it; its experience to its side, and to\n * everyone where the rules share it (`RuleSettings.hud.shareXp`); the points it has to spend and what it can learn, to its\n * side\n *\n * @beta\n */\nexport interface HeroSent {\n\t/** The hero's level, which everyone who sees the hero is told */\n\tlevel: number\n\t/** Its experience: its side's, and everyone's where the rules share it */\n\txp?: XpInfo\n\t/** Points it has to put into abilities: its side's */\n\tpoints?: number\n\t/** The abilities it can put points into, how far and whether now: its side's */\n\tlearnable?: LearnableInfo[]\n}\n\n/** A hero's experience: what it has, what its level took and what the next takes */\nfunction xpOf(world: World, entity: Entity, hero: HeroState): XpInfo {\n\treturn {\n\t\txp: Math.floor(hero.xp),\n\t\tlevelXp: world.settings.heroes.xpForLevel(hero.level),\n\t\tnextXp: world.settings.heroes.xpForLevel(Math.min(hero.level + 1, maxLevelOf(world, entity)))\n\t}\n}\n\nconst sameXp = (a: XpInfo | undefined, b: XpInfo | undefined) =>\n\ta === b || (!!a && !!b && a.xp === b.xp && a.levelXp === b.levelXp && a.nextXp === b.nextXp)\n\n/**\n * A hero: what it has earned (`HeroState`). Set as a unit of a type that says it is one (`UnitTypeDef.hero`) is made,\n * filed by owner (`world.index.with(heroState, player)`, `heroesOf`). What is a hero is what has it: a fallen hero stays\n * in the world's entities, out of the world, to be brought back\n *\n * @beta\n */\nexport const heroState = defineComponent<HeroState, HeroSent>({ id: 'core.hero', replicate: 'everyone',\n\tindex: 'owner',\n\tsnapshot(hero, entity, { world, ally }) {\n\t\tconst sent: HeroSent = { level: hero.level }\n\t\tconst def = entity.def.hero\n\t\tif (!def) return sent\n\t\tconst shareXp = world.settings.hud.shareXp\n\t\tconst shared =\n\t\t\tshareXp !== undefined && (typeof shareXp === 'function' ? (shareXp as (world: World, entity: Entity) => boolean)(world, entity) : shareXp)\n\t\tif (ally || shared) sent.xp = xpOf(world, entity, hero)\n\t\tif (!ally) return sent\n\t\tsent.points = hero.points\n\t\tsent.learnable = learnsOf(entity).map((id) => ({\n\t\t\tid,\n\t\t\tlevel: entity.abilities.find((ability) => ability.id === id)?.level ?? 0,\n\t\t\tmaxLevel: world.registry.ability(id).maxLevel ?? 3,\n\t\t\tneeds: levelNeeded(world, entity, id),\n\t\t\tavailable: canLearn(world, entity, id)\n\t\t}))\n\t\treturn sent\n\t},\n\tsame: (a, b) =>\n\t\ta.level === b.level &&\n\t\tsameXp(a.xp, b.xp) &&\n\t\ta.points === b.points &&\n\t\t(a.learnable === b.learnable ||\n\t\t\t(!!a.learnable &&\n\t\t\t\t!!b.learnable &&\n\t\t\t\ta.learnable.length === b.learnable.length &&\n\t\t\t\ta.learnable.every((info, i) => {\n\t\t\t\t\tconst other = b.learnable![i]\n\t\t\t\t\treturn (\n\t\t\t\t\t\tinfo.id === other.id &&\n\t\t\t\t\t\tinfo.level === other.level &&\n\t\t\t\t\t\tinfo.maxLevel === other.maxLevel &&\n\t\t\t\t\t\tinfo.needs === other.needs &&\n\t\t\t\t\t\tinfo.available === other.available\n\t\t\t\t\t)\n\t\t\t\t}))) })\n\n/**\n * What a hero has earned: none for what is no hero (`heroState`)\n *\n * @public\n */\nexport const heroOf = (entity: Entity): HeroState | undefined => entity.get(heroState)\n\n/**\n * What a player was told of a hero in their snapshot (`heroState`): its level to everyone, its experience, points and\n * what it can learn to its side. None for what is no hero\n *\n * @beta\n */\nexport const heroOfState = (state: EntityState): HeroSent | undefined => snapshotOf(state, heroState)\n\n/**\n * The level a hero stops at\n *\n * @beta\n */\nexport const maxLevelOf = (world: World, entity: Entity) => entity.def.hero?.maxLevel ?? world.settings.heroes.maxHeroLevel\n\n/**\n * Gives a hero experience: `from` what was killed, when that is where it comes from. The `beforeXp` hook has its say\n *\n * @beta\n */\nexport function grantXp(world: World, entity: Entity, amount: number, from?: Entity): void {\n\tconst hero = heroOf(entity)\n\tconst max = maxLevelOf(world, entity)\n\tconst { xpForLevel, pointsForLevel } = world.settings.heroes\n\tif (!hero || !entity.alive || hero.level >= max) return\n\tif (world.hooks.has('beforeXp')) amount = world.hooks.run('beforeXp', { hero: entity, from, amount }).amount\n\tif (amount <= 0) return\n\thero.xp += amount\n\twhile (hero.level < max && hero.xp >= xpForLevel(hero.level + 1)) {\n\t\thero.level++\n\t\thero.points += pointsForLevel(hero.level)\n\t\trefreshVitals(world, entity)\n\t\tkeepInnate(world, entity)\n\t\tworld.events.emit(heroLevelUp, { hero: entity, level: hero.level })\n\t\tworld.message(entity.owner, engineMessage('heroLevel', { unit: entity.def.id, level: hero.level }), 'info')\n\t}\n\tif (hero.level >= max) hero.xp = xpForLevel(max)\n\tworld.events.emit(xpGained, { hero: entity, amount, level: hero.level, from })\n}\n\n/**\n * The level of a hero's innate (`HeroDef.innate`) at a level of the hero: one for each of `innateLevels` it reached,\n * or the hero's own level where it says none; never past the ability's `maxLevel` where it says one. 0 before the first\n *\n * @beta\n */\nexport function innateLevel(world: World, entity: Entity, heroLevel = heroOf(entity)?.level ?? 1): number {\n\tconst def = entity.def.hero\n\tif (!def?.innate) return 0\n\tconst own = def.innateLevels ? def.innateLevels.filter((at) => heroLevel >= at).length : heroLevel\n\treturn Math.max(Math.min(own, world.registry.ability(def.innate).maxLevel ?? Infinity), 0)\n}\n\n/**\n * Gives a hero its innate (`HeroDef.innate`) where it has it not, at the level its own level says (`innateLevel`): as it\n * is made, as it gains a level, as it takes another form. It costs no point, and is none of those it learns\n *\n * @beta\n */\nexport function keepInnate(world: World, entity: Entity): void {\n\tconst id = entity.def.hero?.innate\n\tif (!id || !entity.has(heroState)) return\n\tconst level = innateLevel(world, entity)\n\tconst state = entity.abilities.find((each) => each.id === id)\n\tif (!state) entity.addAbility({ id: world.registry.ability(id).id, level, cooldown: 0, autocast: world.registry.ability(id).autocast ?? false })\n\telse if (state.level !== level) state.level = level\n}\n\n/**\n * Puts a hero at a level as if it had got there: the points to spend, the stats that grew, the experience of that\n * level. No message, no event and no `beforeXp`: for a hero that starts a map at that level, not one that earns it.\n * Never down\n *\n * @beta\n */\nexport function setHeroLevel(world: World, entity: Entity, level: number): void {\n\tconst hero = heroOf(entity)\n\tif (!hero) return\n\tconst to = Math.min(Math.floor(level), maxLevelOf(world, entity))\n\tif (to <= hero.level) return\n\twhile (hero.level < to) {\n\t\thero.level++\n\t\thero.points += world.settings.heroes.pointsForLevel(hero.level)\n\t}\n\thero.xp = world.settings.heroes.xpForLevel(to)\n\trefreshVitals(world, entity)\n\tkeepInnate(world, entity)\n}\n\n/**\n * Experience a kill is worth\n *\n * @beta\n */\nexport function xpWorth(world: World, entity: Entity): number {\n\treturn entity.def.xp ?? world.settings.heroes.killXp(world, entity)\n}\n\n/**\n * Hero level needed to put the next point into an ability\n *\n * @beta\n */\nexport function levelNeeded(world: World, hero: Entity, ability: string): number {\n\tconst def = world.registry.ability(ability)\n\tconst state = hero.abilities.find((a) => a.id === ability)\n\treturn (def.requiresLevel ?? (def.ultimate ? 6 : 1)) + (def.levelStep ?? 2) * (state?.level ?? 0)\n}\n\n/**\n * Whether a hero may put a point into an ability now: by points, levels and its learning, and the `canLearn` hook\n *\n * @beta\n */\nexport function canLearn(world: World, hero: Entity, ability: string): boolean {\n\tconst state = heroOf(hero)\n\tif (!state || !hero.alive || state.points <= 0) return false\n\tif (!hero.def.hero || !learnsOf(hero).includes(ability) || !world.registry.abilities.has(ability)) return false\n\tconst learned = hero.abilities.find((a) => a.id === ability)\n\tif (!learned || learned.level >= (world.registry.ability(ability).maxLevel ?? 3)) return false\n\tconst allowed = state.level >= levelNeeded(world, hero, ability)\n\treturn world.hooks.has('canLearn') ? !world.hooks.run('canLearn', { hero, ability, cancelled: !allowed }).cancelled : allowed\n}\n\n/**\n * Teaches the hero one level of an ability and spends a point on it; returns false when `canLearn` says it cannot\n *\n * @public\n */\nexport function learn(world: World, hero: Entity, ability: string): boolean {\n\tif (!canLearn(world, hero, ability)) return false\n\tconst state = hero.abilities.find((a) => a.id === ability)!\n\tstate.level++\n\theroOf(hero)!.points--\n\tif (state.level === 1) state.autocast = world.registry.ability(ability).autocast ?? false\n\t// in a form, its own whose level it has too\n\tlearnedInForm(hero, ability)\n\treturn true\n}\n\n/**\n * Heroes a player has, fallen ones included\n *\n * @beta\n */\nexport function heroesOf(world: World, player: number): Entity[] {\n\treturn [...world.index.with(heroState, player)]\n}\n\n/**\n * What it costs to bring a hero back, in the game's money, and how long it takes\n *\n * @beta\n */\nexport function reviveCost(world: World, hero: Entity): { cost: Cost; time: number } {\n\treturn world.settings.heroes.revive(world, hero)\n}\n\n/**\n * Puts a fallen hero back into the world\n *\n * @beta\n */\nexport function reviveHero(world: World, hero: Entity, at: Vec2): void {\n\tif (hero.alive || !hero.has(heroState)) return\n\tconst point = (hero.flying ? world.air : world.nav).closestPoint(at, 8) ?? at\n\thero.setAlive(true)\n\thero.setInside(false)\n\thero.reviving = false\n\thero.health = hero.maxHealth\n\thero.mana = hero.maxMana\n\thero.clearBuffs()\n\thero.keepOrders()\n\tfor (const ability of hero.abilities) readyAgain(ability)\n\thero.moveTo(point.x, point.z)\n\thero.prevPos.x = point.x\n\thero.prevPos.z = point.z\n\tconst m = hero.get(moving)\n\tif (m) {\n\t\tm.status = 'idle'\n\t\tm.anchored = false\n\t\tm.ghost = false\n\t\tdelete m.phased\n\t\tm.finalFacing = null\n\t\tm.speed = statsOf(world, hero).moveSpeed\n\t\tworld.nav.addAgent(hero.id, point, agentParamsOf(hero, m.speed))\n\t}\n\tif (hero.get(fighting))\n\t\tObject.assign(hero.get(fighting)!, { cooldown: 0, swing: 0, swingTarget: 0, autoTarget: 0, lastAttacker: 0, guard: null, passive: false })\n\tworld.events.emit(heroRevived, hero)\n}\n\n/**\n * A fallen hero waiting to come back: when it fell, and how long it waits, in seconds of the game\n *\n * @internal\n */\nexport const respawning = defineComponent<{ since: number; wait: number }>({ id: 'core.respawning' })\n\n/**\n * How long until a fallen hero comes back by itself, in seconds: none for one that is not waiting\n *\n * @beta\n */\nexport function respawnIn(world: World, hero: Entity): number | undefined {\n\tconst waiting = hero.get(respawning)\n\treturn waiting && !hero.alive ? Math.max(0, waiting.since + waiting.wait - world.time) : undefined\n}\n\n/** A hero back, to those who see it */\nexport const toldRevived = replicateEvent(heroRevived, 'revived', (hero, view) => (view.knows(hero) ? { type: 'revived', id: hero.id } : undefined))\n\n/** A hero's new level, to those who see it */\nexport const toldLevelUp = replicateEvent(heroLevelUp, 'levelUp', ({ hero, level }, view) =>\n\tview.knows(hero) ? { type: 'levelUp', id: hero.id, level } : undefined\n)\n\n/** Experience gained: its side's alone, an enemy sees a bar move, not why */\nexport const toldXp = replicateEvent(xpGained, 'xp', ({ hero, amount, level }, view) =>\n\tview.isAlly(hero.owner) ? { type: 'xp', id: hero.id, amount, level } : undefined\n)\n\n/**\n * A player's heroes, as their portraits show them (`PlayerState.own.heroes`): their level, health and mana, and how far\n * a fallen one is through being brought back, at an altar or by itself\n *\n * @beta\n */\nexport function heroSummaries(world: World, player: PlayerId): HeroSummary[] {\n\tconst reviving = new Map<number, number>()\n\tfor (const entity of world.index.ownedBy(player)) {\n\t\tconst production = productionOf(entity)\n\t\tif (!production) continue\n\t\tfor (const item of production.queue) if (item.kind === 'revive') reviving.set(Number(item.id), item.progress / item.duration)\n\t}\n\treturn heroesOf(world, player).map((entity) => ({\n\t\tid: entity.id,\n\t\ttype: entity.def.id,\n\t\tlevel: heroOf(entity)!.level,\n\t\talive: entity.alive,\n\t\thealth: entity.alive ? entity.health / entity.maxHealth : 0,\n\t\tmana: entity.alive && entity.maxMana > 0 ? entity.mana / entity.maxMana : 0,\n\t\tpoints: heroOf(entity)!.points,\n\t\treviving: reviving.get(entity.id) ?? respawnProgress(world, entity),\n\t\t...(respawnIn(world, entity) !== undefined && { respawnIn: respawnIn(world, entity) }),\n\t\treviveCost: entity.alive ? undefined : reviveCost(world, entity).cost\n\t}))\n}\n\n/** How far a fallen hero is through its wait to come back by itself, 0..1: none for one that is not waiting */\nfunction respawnProgress(world: World, hero: Entity): number | undefined {\n\tconst waiting = hero.get(respawning)\n\tif (!waiting || hero.alive) return undefined\n\treturn waiting.wait > 0 ? Math.min(1, (world.time - waiting.since) / waiting.wait) : 1\n}\n\n// ---- the hero loop's events (the heroes pack's `packs/heroes/loop.ts`), here for the score to count\n\n/**\n * A hero shared a kill as an assist (`heroAssists`): who, of whom, who killed it, and the gold its player was paid for it\n *\n * @beta\n */\nexport const heroAssisted = defineEngineEvent<{ hero: EntityId; type: string; player: PlayerId; victim: EntityId; killer?: EntityId; gold: number }>({\n\tid: 'core.heroAssisted',\n\treplicate: 'everyone'\n})\n\n/**\n * A hero killed another and is on a streak of this many since it last died\n *\n * @beta\n */\nexport const killStreak = defineEngineEvent<{ hero: EntityId; type: string; player: PlayerId; streak: number }>({\n\tid: 'core.killStreak',\n\treplicate: 'everyone'\n})\n\n/**\n * A hero on a streak fell (`HeroSettings.shutdownGold`): whose streak of how many, and the gold its killer's player was\n * paid on top of the kill for ending it\n *\n * @beta\n */\nexport const heroShutdown = defineEngineEvent<{ hero: EntityId; streak: number; killer?: EntityId; player?: PlayerId; gold: number }>({\n\tid: 'core.shutdown',\n\treplicate: 'everyone'\n})\n\n/**\n * A fallen hero was bought back (`buyBack`): who, for whom, at what cost\n *\n * @beta\n */\nexport const boughtBack = defineEngineEvent<{ hero: EntityId; type: string; player: PlayerId; cost: Cost }>({\n\tid: 'core.boughtBack',\n\treplicate: 'everyone'\n})\n"],"mappings":"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"}
@@ -0,0 +1,94 @@
1
+ import type { Entity } from './entity';
2
+ import type { Vec2 } from './math';
3
+ import { type CastChannel } from './orders/cast';
4
+ import type { GamePack } from './packs/pack';
5
+ import type { World } from './world';
6
+ /**
7
+ * The holds pack's id
8
+ *
9
+ * @beta
10
+ */
11
+ export declare const HOLDS = "core.holds";
12
+ /**
13
+ * What a unit aims as it goes, told to its owner (whose pointer aims it): an ability it holds to charge (`held`: the
14
+ * seconds held), or one it channels aimed (`AbilityDef.channel.aimed`, no `held`); where it was last aimed
15
+ *
16
+ * @beta
17
+ */
18
+ export interface Aiming {
19
+ /** The ability */
20
+ ability: string;
21
+ /** The level it is cast at */
22
+ level: number;
23
+ /** Seconds it has been held, for one held to charge: none for a channel */
24
+ held?: number;
25
+ /** Where it was last aimed */
26
+ point?: Vec2;
27
+ }
28
+ /**
29
+ * What a unit aims as it goes (`Aiming`): while it holds an ability to charge, or channels one aimed. Told to its owner
30
+ *
31
+ * @beta
32
+ */
33
+ export declare const aiming: import("./components").Component<Aiming, Aiming>;
34
+ /**
35
+ * A channel a unit keeps up as it walks (`AbilityDef.channel.walks`), as the cast order keeps one it stands in
36
+ * (`CastChannel`)
37
+ *
38
+ * @beta
39
+ */
40
+ export declare const walkingChannel: import("./components").Component<CastChannel, CastChannel>;
41
+ /**
42
+ * How full an ability held to charge is (`AbilityDef.hold`), 0 to 1: none where the unit holds nothing
43
+ *
44
+ * @beta
45
+ */
46
+ export declare function heldShare(world: World, entity: Entity): number | undefined;
47
+ /**
48
+ * Lets go of what a unit holds to charge (`AbilityDef.hold`), at `point` (where it was last aimed when left out): it
49
+ * goes off as full as it was held, paid for then (`fire`), or a tap's effects where it was let go soon. False where it
50
+ * held nothing, or what it held could not go off (the player told why)
51
+ *
52
+ * @beta
53
+ */
54
+ export declare function releaseHold(world: World, entity: Entity, point?: Vec2): boolean;
55
+ /**
56
+ * Aims what a unit aims as it goes (`Aiming`) at a point: what it holds to charge, or the channel it keeps up aimed
57
+ * (`channel.aimed`: where it goes off at from now on, the caster turned to it). What the `aim` command does
58
+ *
59
+ * @beta
60
+ */
61
+ export declare function aimAt(_world: World, entity: Entity, point: Vec2): void;
62
+ /**
63
+ * Lets go of what the player's units hold of an ability (`releaseHold`): what the screen sends as the key is let go, or
64
+ * on a click, with where the pointer is
65
+ *
66
+ * @beta
67
+ */
68
+ export declare const releaseCommand: import("#engine/commands").DefinedCommand<"release", {
69
+ entities: import("./fields").Check<number[] | undefined>;
70
+ ability: import("./fields").Check<string>;
71
+ point: import("./fields").Check<Vec2 | undefined>;
72
+ }>;
73
+ /**
74
+ * Aims what the player's units aim as they go of an ability (`aimAt`): what the screen sends, ten times a second at the
75
+ * most, while one holds or channels it, for where the pointer is
76
+ *
77
+ * @beta
78
+ */
79
+ export declare const aimCommand: import("#engine/commands").DefinedCommand<"aim", {
80
+ ability: import("./fields").Check<string>;
81
+ point: import("./fields").Check<Vec2>;
82
+ }>;
83
+ /**
84
+ * Holds and channels aimed as they go: what a game with it (`Rules.packs`) gets for abilities held to charge and let go
85
+ * (`AbilityDef.hold`: cast, the hold starts where the caster stands, and it goes on with what it was doing; the `release`
86
+ * command, the key let go or a click, sets it off as full as it was held: `HoldDef.range`, `scale`, a `tap`'s other
87
+ * effects; it goes off by itself at `upTo`; a stun, a silence or its death lets go of it for nothing), channels aimed as
88
+ * they go (`channel.aimed`: the `aim` command moves where they go off at) and channels kept up as the caster walks
89
+ * (`channel.walks`). What a unit aims as it goes is the `aiming` component, told to its owner; `releaseHold`, `aimAt` and
90
+ * `heldShare` in code
91
+ *
92
+ * @beta
93
+ */
94
+ export declare function holdsPack(): GamePack;
package/dist/holds.js ADDED
@@ -0,0 +1,305 @@
1
+ import { atan2, cos, hypot, sin } from "./exactMath.js";
2
+ import { defineComponent } from "./components.js";
3
+ import { defineListener } from "./events.js";
4
+ import { channelEnded, channelStarted } from "./engineEvents.js";
5
+ import { applyBuff, isSilenced, isStunned, removeBuff } from "./abilities/buffs.js";
6
+ import { defineHook } from "./hooks.js";
7
+ import { ids, optional, point, string } from "./fields.js";
8
+ import { channelling, fire, notReady } from "./orders/cast.js";
9
+ import { defineCommand } from "./commands.js";
10
+ //#region src/holds.ts
11
+ /**
12
+ * The holds pack's id
13
+ *
14
+ * @beta
15
+ */
16
+ var HOLDS = "core.holds";
17
+ /**
18
+ * What a unit aims as it goes (`Aiming`): while it holds an ability to charge, or channels one aimed. Told to its owner
19
+ *
20
+ * @beta
21
+ */
22
+ var aiming = /* @__PURE__ */ defineComponent({
23
+ id: "core.aiming",
24
+ replicate: "owner",
25
+ index: true,
26
+ refs: (saved) => ({ abilities: [saved.ability] })
27
+ });
28
+ /**
29
+ * A channel a unit keeps up as it walks (`AbilityDef.channel.walks`), as the cast order keeps one it stands in
30
+ * (`CastChannel`)
31
+ *
32
+ * @beta
33
+ */
34
+ var walkingChannel = /* @__PURE__ */ defineComponent({
35
+ id: "core.walkingChannel",
36
+ index: true,
37
+ refs: (saved) => ({ abilities: [saved.ability] })
38
+ });
39
+ /**
40
+ * How full an ability held to charge is (`AbilityDef.hold`), 0 to 1: none where the unit holds nothing
41
+ *
42
+ * @beta
43
+ */
44
+ function heldShare(world, entity) {
45
+ const held = entity.get(aiming);
46
+ if (held?.held === void 0 || !world.registry.abilities.has(held.ability)) return void 0;
47
+ const hold = world.registry.ability(held.ability).hold;
48
+ return hold ? Math.min(held.held / Math.max(hold.max, 1e-6), 1) : void 0;
49
+ }
50
+ /** Where a hold let go at `aimed` goes off: brought as near as its reach held so long */
51
+ function reachedPoint(caster, ability, share, aimed) {
52
+ const range = ability.hold?.range;
53
+ if (!range) return aimed;
54
+ const reach = range.from + (range.to - range.from) * share;
55
+ const dx = aimed.x - caster.pos.x;
56
+ const dz = aimed.z - caster.pos.z;
57
+ const far = hypot(dx, dz);
58
+ if (far <= reach) return aimed;
59
+ const way = far > 1e-6 ? atan2(dx, dz) : caster.facing;
60
+ return {
61
+ x: caster.pos.x + sin(way) * reach,
62
+ z: caster.pos.z + cos(way) * reach
63
+ };
64
+ }
65
+ /** No longer held: the hold's buff off, the component gone */
66
+ function drop(world, entity, held) {
67
+ entity.remove(aiming);
68
+ if (!world.registry.abilities.has(held.ability)) return;
69
+ const buff = world.registry.ability(held.ability).hold?.buff;
70
+ if (buff) removeBuff(world, entity, buff, entity);
71
+ }
72
+ /**
73
+ * Lets go of what a unit holds to charge (`AbilityDef.hold`), at `point` (where it was last aimed when left out): it
74
+ * goes off as full as it was held, paid for then (`fire`), or a tap's effects where it was let go soon. False where it
75
+ * held nothing, or what it held could not go off (the player told why)
76
+ *
77
+ * @beta
78
+ */
79
+ function releaseHold(world, entity, point) {
80
+ const held = entity.get(aiming);
81
+ if (held?.held === void 0 || !world.registry.abilities.has(held.ability)) return false;
82
+ const ability = world.registry.ability(held.ability);
83
+ const hold = ability.hold;
84
+ const share = heldShare(world, entity) ?? 0;
85
+ drop(world, entity, held);
86
+ const state = entity.abilities.find((each) => each.id === ability.id);
87
+ if (!hold || !state || !entity.alive) return false;
88
+ const problem = notReady(world, entity, ability);
89
+ if (problem) {
90
+ world.message(entity.owner, problem);
91
+ return false;
92
+ }
93
+ const at = reachedPoint(entity, ability, share, point ?? held.point ?? entity.pos);
94
+ if (hypot(at.x - entity.pos.x, at.z - entity.pos.z) > .05) entity.facing = atan2(at.x - entity.pos.x, at.z - entity.pos.z);
95
+ state.point = {
96
+ x: at.x,
97
+ z: at.z
98
+ };
99
+ const tap = hold.tap && held.held < hold.tap.under ? hold.tap.effects : void 0;
100
+ fire(world, entity, ability, void 0, void 0, {
101
+ share,
102
+ ...tap && { effects: tap }
103
+ });
104
+ return true;
105
+ }
106
+ /**
107
+ * Aims what a unit aims as it goes (`Aiming`) at a point: what it holds to charge, or the channel it keeps up aimed
108
+ * (`channel.aimed`: where it goes off at from now on, the caster turned to it). What the `aim` command does
109
+ *
110
+ * @beta
111
+ */
112
+ function aimAt(_world, entity, point) {
113
+ const held = entity.get(aiming);
114
+ if (!held) return;
115
+ held.point = {
116
+ x: point.x,
117
+ z: point.z
118
+ };
119
+ if (held.held !== void 0) return;
120
+ const channel = channelOf(entity, held.ability);
121
+ if (!channel) return;
122
+ channel.point = {
123
+ x: point.x,
124
+ z: point.z
125
+ };
126
+ if (hypot(point.x - entity.pos.x, point.z - entity.pos.z) > .05) entity.facing = atan2(point.x - entity.pos.x, point.z - entity.pos.z);
127
+ }
128
+ /** The channel of an ability a unit keeps up: in its cast order, or as it walks */
129
+ function channelOf(entity, ability) {
130
+ const walking = entity.get(walkingChannel);
131
+ if (walking?.ability === ability) return walking;
132
+ const order = entity.orders[0];
133
+ const channel = order?.type === "cast" ? order.state.channel : void 0;
134
+ return channel?.ability === ability && !channel.done ? channel : void 0;
135
+ }
136
+ /**
137
+ * Lets go of what the player's units hold of an ability (`releaseHold`): what the screen sends as the key is let go, or
138
+ * on a click, with where the pointer is
139
+ *
140
+ * @beta
141
+ */
142
+ var releaseCommand = /* @__PURE__ */ defineCommand("release", {
143
+ entities: optional(ids),
144
+ ability: string,
145
+ point: optional(point)
146
+ }, (world, player, command) => {
147
+ for (const entity of [...world.index.with(aiming)]) {
148
+ if (entity.owner !== player || command.entities && !command.entities.includes(entity.id)) continue;
149
+ if (entity.get(aiming)?.ability === command.ability) releaseHold(world, entity, command.point);
150
+ }
151
+ });
152
+ /**
153
+ * Aims what the player's units aim as they go of an ability (`aimAt`): what the screen sends, ten times a second at the
154
+ * most, while one holds or channels it, for where the pointer is
155
+ *
156
+ * @beta
157
+ */
158
+ var aimCommand = /* @__PURE__ */ defineCommand("aim", {
159
+ ability: string,
160
+ point
161
+ }, (world, player, command) => {
162
+ for (const entity of world.index.with(aiming)) if (entity.owner === player && entity.get(aiming)?.ability === command.ability) aimAt(world, entity, command.point);
163
+ });
164
+ /** Holds charging, let go by themselves at their time; channels kept up as their casters walk */
165
+ var holdsSystem = {
166
+ name: "holds",
167
+ phase: "decide",
168
+ before: ["abilities"],
169
+ update(world, dt) {
170
+ for (const entity of [...world.index.with(aiming)]) {
171
+ const held = entity.get(aiming);
172
+ if (held?.held === void 0) continue;
173
+ const ability = world.registry.abilities.has(held.ability) ? world.registry.ability(held.ability) : void 0;
174
+ if (!ability?.hold || !entity.alive || isStunned(world, entity) || isSilenced(world, entity, ability)) {
175
+ drop(world, entity, held);
176
+ continue;
177
+ }
178
+ held.held += dt;
179
+ if (held.held >= (ability.hold.upTo ?? ability.hold.max)) releaseHold(world, entity);
180
+ }
181
+ for (const entity of [...world.index.with(walkingChannel)]) {
182
+ const channel = entity.get(walkingChannel);
183
+ if (!channel) continue;
184
+ const ability = world.registry.abilities.has(channel.ability) ? world.registry.ability(channel.ability) : void 0;
185
+ if (ability && entity.alive && !isStunned(world, entity) && !isSilenced(world, entity, ability)) {
186
+ if (channelling(world, entity, channel, dt) === "running") continue;
187
+ } else if (ability && !channel.done) {
188
+ channel.done = true;
189
+ ability.channel?.interrupted?.(world, entity, channel.level);
190
+ world.events.emit(channelEnded, {
191
+ caster: entity,
192
+ ability,
193
+ interrupted: true
194
+ });
195
+ }
196
+ entity.remove(walkingChannel);
197
+ }
198
+ }
199
+ };
200
+ /**
201
+ * Holds and channels aimed as they go: what a game with it (`Rules.packs`) gets for abilities held to charge and let go
202
+ * (`AbilityDef.hold`: cast, the hold starts where the caster stands, and it goes on with what it was doing; the `release`
203
+ * command, the key let go or a click, sets it off as full as it was held: `HoldDef.range`, `scale`, a `tap`'s other
204
+ * effects; it goes off by itself at `upTo`; a stun, a silence or its death lets go of it for nothing), channels aimed as
205
+ * they go (`channel.aimed`: the `aim` command moves where they go off at) and channels kept up as the caster walks
206
+ * (`channel.walks`). What a unit aims as it goes is the `aiming` component, told to its owner; `releaseHold`, `aimAt` and
207
+ * `heldShare` in code
208
+ *
209
+ * @beta
210
+ */
211
+ function holdsPack() {
212
+ const press = defineHook({
213
+ hook: "beforeOrder",
214
+ id: "holds",
215
+ run(world, event) {
216
+ const { order, entity } = event;
217
+ const init = order.init;
218
+ if (order.type !== "cast" || !init.ability || init.item !== void 0 || !world.registry.abilities.has(init.ability)) return;
219
+ const ability = world.registry.ability(init.ability);
220
+ if (!ability.hold) return;
221
+ event.rejected = true;
222
+ const held = entity.get(aiming);
223
+ if (held?.ability === ability.id && held.held !== void 0) {
224
+ releaseHold(world, entity, init.point);
225
+ return;
226
+ }
227
+ const state = entity.abilities.find((each) => each.id === ability.id);
228
+ if (!state || state.level < 1 || held || isStunned(world, entity)) return;
229
+ const problem = notReady(world, entity, ability);
230
+ if (problem) {
231
+ world.message(entity.owner, problem);
232
+ return;
233
+ }
234
+ entity.set(aiming, {
235
+ ability: ability.id,
236
+ level: state.level,
237
+ held: 0,
238
+ ...init.point && { point: {
239
+ x: init.point.x,
240
+ z: init.point.z
241
+ } }
242
+ });
243
+ if (ability.hold.buff && world.registry.buffs.has(ability.hold.buff)) applyBuff(world, entity, ability.hold.buff, void 0, entity, state.level, ability.id);
244
+ }
245
+ });
246
+ const walks = defineHook({
247
+ hook: "afterCast",
248
+ id: "holds",
249
+ run(world, event) {
250
+ const { caster, ability, level, target, point, item } = event;
251
+ const kept = ability.channel;
252
+ if (!kept?.walks || item || !caster.alive) return;
253
+ const seconds = typeof kept.duration === "function" ? kept.duration(world, caster, level) : kept.duration;
254
+ caster.set(walkingChannel, {
255
+ ability: ability.id,
256
+ level,
257
+ target: target?.id,
258
+ point: {
259
+ x: point.x,
260
+ z: point.z
261
+ },
262
+ left: seconds,
263
+ elapsed: 0
264
+ });
265
+ world.events.emit(channelStarted, {
266
+ caster,
267
+ ability,
268
+ duration: seconds
269
+ });
270
+ }
271
+ });
272
+ const aimed = defineListener({
273
+ id: "holds.aimed",
274
+ event: channelStarted,
275
+ run(_world, { caster, ability }) {
276
+ if (ability.channel?.aimed && caster.alive && !caster.get(aiming)) {
277
+ const level = caster.abilities.find((each) => each.id === ability.id)?.level ?? 1;
278
+ caster.set(aiming, {
279
+ ability: ability.id,
280
+ level
281
+ });
282
+ }
283
+ }
284
+ });
285
+ const ended = defineListener({
286
+ id: "holds.ended",
287
+ event: channelEnded,
288
+ run(_world, { caster, ability }) {
289
+ const held = caster.get(aiming);
290
+ if (held && held.held === void 0 && held.ability === ability.id && !channelOf(caster, ability.id)) caster.remove(aiming);
291
+ }
292
+ });
293
+ return {
294
+ id: HOLDS,
295
+ components: [aiming, walkingChannel],
296
+ commands: [releaseCommand, aimCommand],
297
+ systems: [holdsSystem],
298
+ hooks: [press, walks],
299
+ listeners: [aimed, ended]
300
+ };
301
+ }
302
+ //#endregion
303
+ export { HOLDS, aimAt, aimCommand, aiming, heldShare, holdsPack, releaseCommand, releaseHold, walkingChannel };
304
+
305
+ //# sourceMappingURL=holds.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"holds.js","names":[],"sources":["../src/holds.ts"],"sourcesContent":["import { applyBuff, isSilenced, isStunned, removeBuff } from './abilities/buffs'\nimport { defineComponent } from './components'\nimport { defineCommand } from './commands'\nimport type { AbilityDef } from './defs'\nimport { channelEnded, channelStarted } from './engineEvents'\nimport type { Entity } from './entity'\nimport { atan2, cos, hypot, sin } from './exactMath'\nimport { defineListener } from './events'\nimport { ids, optional, point, string } from './fields'\nimport { defineHook } from './hooks'\nimport type { Vec2 } from './math'\nimport { type CastChannel, channelling, fire, notReady } from './orders/cast'\nimport type { GamePack } from './packs/pack'\nimport type { System } from './registry'\nimport type { World } from './world'\n\n/*\n * Holds and channels aimed as they go, an opt-in pack (E2E-PLAN AB15): an ability held to charge and let go (farther,\n * harder, or a tap's other effects), a channel whose aim follows the player's, and one kept up as the caster walks. A\n * game without it pays nothing for these; a tether (`channel.leash`) is the engine's own\n */\n\n/**\n * The holds pack's id\n *\n * @beta\n */\nexport const HOLDS = 'core.holds'\n\n/**\n * What a unit aims as it goes, told to its owner (whose pointer aims it): an ability it holds to charge (`held`: the\n * seconds held), or one it channels aimed (`AbilityDef.channel.aimed`, no `held`); where it was last aimed\n *\n * @beta\n */\nexport interface Aiming {\n\t/** The ability */\n\tability: string\n\t/** The level it is cast at */\n\tlevel: number\n\t/** Seconds it has been held, for one held to charge: none for a channel */\n\theld?: number\n\t/** Where it was last aimed */\n\tpoint?: Vec2\n}\n\n/**\n * What a unit aims as it goes (`Aiming`): while it holds an ability to charge, or channels one aimed. Told to its owner\n *\n * @beta\n */\nexport const aiming = /* @__PURE__ */ defineComponent<Aiming>({\n\tid: 'core.aiming',\n\treplicate: 'owner',\n\tindex: true,\n\trefs: (saved) => ({ abilities: [(saved as Aiming).ability] })\n})\n\n/**\n * A channel a unit keeps up as it walks (`AbilityDef.channel.walks`), as the cast order keeps one it stands in\n * (`CastChannel`)\n *\n * @beta\n */\nexport const walkingChannel = /* @__PURE__ */ defineComponent<CastChannel>({\n\tid: 'core.walkingChannel',\n\tindex: true,\n\trefs: (saved) => ({ abilities: [(saved as CastChannel).ability] })\n})\n\n/**\n * How full an ability held to charge is (`AbilityDef.hold`), 0 to 1: none where the unit holds nothing\n *\n * @beta\n */\nexport function heldShare(world: World, entity: Entity): number | undefined {\n\tconst held = entity.get(aiming)\n\tif (held?.held === undefined || !world.registry.abilities.has(held.ability)) return undefined\n\tconst hold = world.registry.ability(held.ability).hold\n\treturn hold ? Math.min(held.held / Math.max(hold.max, 1e-6), 1) : undefined\n}\n\n/** Where a hold let go at `aimed` goes off: brought as near as its reach held so long */\nfunction reachedPoint(caster: Entity, ability: AbilityDef, share: number, aimed: Vec2): Vec2 {\n\tconst range = ability.hold?.range\n\tif (!range) return aimed\n\tconst reach = range.from + (range.to - range.from) * share\n\tconst dx = aimed.x - caster.pos.x\n\tconst dz = aimed.z - caster.pos.z\n\tconst far = hypot(dx, dz)\n\tif (far <= reach) return aimed\n\t// aimed at its feet: the way it faces\n\tconst way = far > 1e-6 ? atan2(dx, dz) : caster.facing\n\treturn { x: caster.pos.x + sin(way) * reach, z: caster.pos.z + cos(way) * reach }\n}\n\n/** No longer held: the hold's buff off, the component gone */\nfunction drop(world: World, entity: Entity, held: Aiming): void {\n\tentity.remove(aiming)\n\tif (!world.registry.abilities.has(held.ability)) return\n\tconst buff = world.registry.ability(held.ability).hold?.buff\n\tif (buff) removeBuff(world, entity, buff, entity)\n}\n\n/**\n * Lets go of what a unit holds to charge (`AbilityDef.hold`), at `point` (where it was last aimed when left out): it\n * goes off as full as it was held, paid for then (`fire`), or a tap's effects where it was let go soon. False where it\n * held nothing, or what it held could not go off (the player told why)\n *\n * @beta\n */\nexport function releaseHold(world: World, entity: Entity, point?: Vec2): boolean {\n\tconst held = entity.get(aiming)\n\tif (held?.held === undefined || !world.registry.abilities.has(held.ability)) return false\n\tconst ability = world.registry.ability(held.ability)\n\tconst hold = ability.hold\n\tconst share = heldShare(world, entity) ?? 0\n\tdrop(world, entity, held)\n\tconst state = entity.abilities.find((each) => each.id === ability.id)\n\tif (!hold || !state || !entity.alive) return false\n\tconst problem = notReady(world, entity, ability)\n\tif (problem) {\n\t\tworld.message(entity.owner, problem)\n\t\treturn false\n\t}\n\tconst aimed = point ?? held.point ?? entity.pos\n\tconst at = reachedPoint(entity, ability, share, aimed)\n\tif (hypot(at.x - entity.pos.x, at.z - entity.pos.z) > 0.05) entity.facing = atan2(at.x - entity.pos.x, at.z - entity.pos.z)\n\tstate.point = { x: at.x, z: at.z }\n\tconst tap = hold.tap && held.held < hold.tap.under ? hold.tap.effects : undefined\n\tfire(world, entity, ability, undefined, undefined, { share, ...(tap && { effects: tap }) })\n\treturn true\n}\n\n/**\n * Aims what a unit aims as it goes (`Aiming`) at a point: what it holds to charge, or the channel it keeps up aimed\n * (`channel.aimed`: where it goes off at from now on, the caster turned to it). What the `aim` command does\n *\n * @beta\n */\nexport function aimAt(_world: World, entity: Entity, point: Vec2): void {\n\tconst held = entity.get(aiming)\n\tif (!held) return\n\theld.point = { x: point.x, z: point.z }\n\tif (held.held !== undefined) return\n\tconst channel = channelOf(entity, held.ability)\n\tif (!channel) return\n\tchannel.point = { x: point.x, z: point.z }\n\tif (hypot(point.x - entity.pos.x, point.z - entity.pos.z) > 0.05) entity.facing = atan2(point.x - entity.pos.x, point.z - entity.pos.z)\n}\n\n/** The channel of an ability a unit keeps up: in its cast order, or as it walks */\nfunction channelOf(entity: Entity, ability: string): CastChannel | undefined {\n\tconst walking = entity.get(walkingChannel)\n\tif (walking?.ability === ability) return walking\n\tconst order = entity.orders[0]\n\tconst channel = order?.type === 'cast' ? (order.state.channel as CastChannel | undefined) : undefined\n\treturn channel?.ability === ability && !channel.done ? channel : undefined\n}\n\n/**\n * Lets go of what the player's units hold of an ability (`releaseHold`): what the screen sends as the key is let go, or\n * on a click, with where the pointer is\n *\n * @beta\n */\nexport const releaseCommand = /* @__PURE__ */ defineCommand('release', { entities: optional(ids), ability: string, point: optional(point) }, (world, player, command) => {\n\tfor (const entity of [...world.index.with(aiming)]) {\n\t\tif (entity.owner !== player || (command.entities && !command.entities.includes(entity.id))) continue\n\t\tif (entity.get(aiming)?.ability === command.ability) releaseHold(world, entity, command.point)\n\t}\n})\n\n/**\n * Aims what the player's units aim as they go of an ability (`aimAt`): what the screen sends, ten times a second at the\n * most, while one holds or channels it, for where the pointer is\n *\n * @beta\n */\nexport const aimCommand = /* @__PURE__ */ defineCommand('aim', { ability: string, point }, (world, player, command) => {\n\tfor (const entity of world.index.with(aiming)) if (entity.owner === player && entity.get(aiming)?.ability === command.ability) aimAt(world, entity, command.point)\n})\n\n/** Holds charging, let go by themselves at their time; channels kept up as their casters walk */\nconst holdsSystem: System = {\n\tname: 'holds',\n\tphase: 'decide',\n\tbefore: ['abilities'],\n\tupdate(world, dt) {\n\t\tfor (const entity of [...world.index.with(aiming)]) {\n\t\t\tconst held = entity.get(aiming)\n\t\t\tif (held?.held === undefined) continue\n\t\t\tconst ability = world.registry.abilities.has(held.ability) ? world.registry.ability(held.ability) : undefined\n\t\t\t// stunned, silenced or dead: let go of, for nothing\n\t\t\tif (!ability?.hold || !entity.alive || isStunned(world, entity) || isSilenced(world, entity, ability)) {\n\t\t\t\tdrop(world, entity, held)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\theld.held += dt\n\t\t\tif (held.held >= (ability.hold.upTo ?? ability.hold.max)) releaseHold(world, entity)\n\t\t}\n\t\tfor (const entity of [...world.index.with(walkingChannel)]) {\n\t\t\tconst channel = entity.get(walkingChannel)\n\t\t\tif (!channel) continue\n\t\t\tconst ability = world.registry.abilities.has(channel.ability) ? world.registry.ability(channel.ability) : undefined\n\t\t\tif (ability && entity.alive && !isStunned(world, entity) && !isSilenced(world, entity, ability)) {\n\t\t\t\tif (channelling(world, entity, channel, dt) === 'running') continue\n\t\t\t} else if (ability && !channel.done) {\n\t\t\t\tchannel.done = true\n\t\t\t\tability.channel?.interrupted?.(world, entity, channel.level)\n\t\t\t\tworld.events.emit(channelEnded, { caster: entity, ability, interrupted: true })\n\t\t\t}\n\t\t\tentity.remove(walkingChannel)\n\t\t}\n\t}\n}\n\n/**\n * Holds and channels aimed as they go: what a game with it (`Rules.packs`) gets for abilities held to charge and let go\n * (`AbilityDef.hold`: cast, the hold starts where the caster stands, and it goes on with what it was doing; the `release`\n * command, the key let go or a click, sets it off as full as it was held: `HoldDef.range`, `scale`, a `tap`'s other\n * effects; it goes off by itself at `upTo`; a stun, a silence or its death lets go of it for nothing), channels aimed as\n * they go (`channel.aimed`: the `aim` command moves where they go off at) and channels kept up as the caster walks\n * (`channel.walks`). What a unit aims as it goes is the `aiming` component, told to its owner; `releaseHold`, `aimAt` and\n * `heldShare` in code\n *\n * @beta\n */\nexport function holdsPack(): GamePack {\n\t// cast: the hold starts, in place of the order; cast again while held, it is let go\n\tconst press = defineHook({\n\t\thook: 'beforeOrder',\n\t\tid: 'holds',\n\t\trun(world, event) {\n\t\t\tconst { order, entity } = event\n\t\t\tconst init = order.init as { ability?: string; point?: Vec2; item?: number }\n\t\t\tif (order.type !== 'cast' || !init.ability || init.item !== undefined || !world.registry.abilities.has(init.ability)) return\n\t\t\tconst ability = world.registry.ability(init.ability)\n\t\t\tif (!ability.hold) return\n\t\t\tevent.rejected = true\n\t\t\tconst held = entity.get(aiming)\n\t\t\tif (held?.ability === ability.id && held.held !== undefined) {\n\t\t\t\treleaseHold(world, entity, init.point)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst state = entity.abilities.find((each) => each.id === ability.id)\n\t\t\tif (!state || state.level < 1 || held || isStunned(world, entity)) return\n\t\t\tconst problem = notReady(world, entity, ability)\n\t\t\tif (problem) {\n\t\t\t\tworld.message(entity.owner, problem)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tentity.set(aiming, { ability: ability.id, level: state.level, held: 0, ...(init.point && { point: { x: init.point.x, z: init.point.z } }) })\n\t\t\tif (ability.hold.buff && world.registry.buffs.has(ability.hold.buff)) applyBuff(world, entity, ability.hold.buff, undefined, entity, state.level, ability.id)\n\t\t}\n\t})\n\t// a channel kept up as the caster walks: the cast order is done, the pack keeps it up\n\tconst walks = defineHook({\n\t\thook: 'afterCast',\n\t\tid: 'holds',\n\t\trun(world, event) {\n\t\t\tconst { caster, ability, level, target, point, item } = event\n\t\t\tconst kept = ability.channel\n\t\t\tif (!kept?.walks || item || !caster.alive) return\n\t\t\tconst seconds = typeof kept.duration === 'function' ? kept.duration(world, caster, level) : kept.duration\n\t\t\tcaster.set(walkingChannel, { 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, ability, duration: seconds })\n\t\t}\n\t})\n\t// a channel aimed as it goes: its caster aims it while it lasts\n\tconst aimed = defineListener({\n\t\tid: 'holds.aimed',\n\t\tevent: channelStarted,\n\t\trun(_world, { caster, ability }) {\n\t\t\tif (ability.channel?.aimed && caster.alive && !caster.get(aiming)) {\n\t\t\t\tconst level = caster.abilities.find((each) => each.id === ability.id)?.level ?? 1\n\t\t\t\tcaster.set(aiming, { ability: ability.id, level })\n\t\t\t}\n\t\t}\n\t})\n\tconst ended = defineListener({\n\t\tid: 'holds.ended',\n\t\tevent: channelEnded,\n\t\trun(_world, { caster, ability }) {\n\t\t\tconst held = caster.get(aiming)\n\t\t\tif (held && held.held === undefined && held.ability === ability.id && !channelOf(caster, ability.id)) caster.remove(aiming)\n\t\t}\n\t})\n\treturn {\n\t\tid: HOLDS,\n\t\tcomponents: [aiming, walkingChannel],\n\t\tcommands: [releaseCommand, aimCommand],\n\t\tsystems: [holdsSystem],\n\t\thooks: [press, walks],\n\t\tlisteners: [aimed, ended]\n\t}\n}\n"],"mappings":"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"}
package/dist/home.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * A side's home (`homeOf`): where its heroes come back (`withRespawn`) and are recalled to (an ability's `teleport` to
2
+ * A side's home (`homeOf`): where its heroes come back (`respawnPack`) and are recalled to (an ability's `teleport` to
3
3
  * `home`). Of nothing but the world, so that an ability's effects and the heroes' respawn each read it alone
4
4
  */
5
5
  import type { PlayerId } from './entity';
package/dist/home.js ADDED
@@ -0,0 +1,30 @@
1
+ import { distSq } from "./math.js";
2
+ //#region src/home.ts
3
+ /**
4
+ * A side's home, where its heroes come back and are recalled to: the map's point named `home.<team>` (`home.1`), or
5
+ * else the structure of the player's side nearest `near` (its core, its hall), or else nothing
6
+ *
7
+ * @beta
8
+ */
9
+ function homeOf(world, player, near) {
10
+ const name = `home.${world.player(player).team}`;
11
+ if (world.map.points.some((point) => point.name === name)) return world.map.point(name);
12
+ let best;
13
+ let bestDistance = Infinity;
14
+ for (const entity of world.entities.values()) {
15
+ if (!entity.alive || !entity.isStructure || !world.areAllies(entity.owner, player)) continue;
16
+ const d = near ? distSq(entity.pos, near) : entity.id;
17
+ if (d < bestDistance) {
18
+ bestDistance = d;
19
+ best = entity;
20
+ }
21
+ }
22
+ return best && {
23
+ x: best.pos.x,
24
+ z: best.pos.z
25
+ };
26
+ }
27
+ //#endregion
28
+ export { homeOf };
29
+
30
+ //# sourceMappingURL=home.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"home.js","names":[],"sources":["../src/home.ts"],"sourcesContent":["/**\n * A side's home (`homeOf`): where its heroes come back (`respawnPack`) and are recalled to (an ability's `teleport` to\n * `home`). Of nothing but the world, so that an ability's effects and the heroes' respawn each read it alone\n */\nimport type { Entity, PlayerId } from './entity'\nimport { distSq, type Vec2 } from './math'\nimport type { World } from './world'\n\n/**\n * A side's home, where its heroes come back and are recalled to: the map's point named `home.<team>` (`home.1`), or\n * else the structure of the player's side nearest `near` (its core, its hall), or else nothing\n *\n * @beta\n */\nexport function homeOf(world: World, player: PlayerId, near?: Vec2): Vec2 | undefined {\n\tconst team = world.player(player).team\n\tconst name = `home.${team}`\n\tif (world.map.points.some((point) => point.name === name)) return world.map.point(name)\n\tlet best: Entity | undefined\n\tlet bestDistance = Infinity\n\tfor (const entity of world.entities.values()) {\n\t\tif (!entity.alive || !entity.isStructure || !world.areAllies(entity.owner, player)) continue\n\t\tconst d = near ? distSq(entity.pos, near) : entity.id\n\t\tif (d < bestDistance) {\n\t\t\tbestDistance = d\n\t\t\tbest = entity\n\t\t}\n\t}\n\treturn best && { x: best.pos.x, z: best.pos.z }\n}\n"],"mappings":";;;;;;;;AAcA,SAAgB,OAAO,OAAc,QAAkB,MAA+B;CAErF,MAAM,OAAO,QADA,MAAM,OAAO,MAAM,CAAC,CAAC;CAElC,IAAI,MAAM,IAAI,OAAO,MAAM,UAAU,MAAM,SAAS,IAAI,GAAG,OAAO,MAAM,IAAI,MAAM,IAAI;CACtF,IAAI;CACJ,IAAI,eAAe;CACnB,KAAK,MAAM,UAAU,MAAM,SAAS,OAAO,GAAG;EAC7C,IAAI,CAAC,OAAO,SAAS,CAAC,OAAO,eAAe,CAAC,MAAM,UAAU,OAAO,OAAO,MAAM,GAAG;EACpF,MAAM,IAAI,OAAO,OAAO,OAAO,KAAK,IAAI,IAAI,OAAO;EACnD,IAAI,IAAI,cAAc;GACrB,eAAe;GACf,OAAO;EACR;CACD;CACA,OAAO,QAAQ;EAAE,GAAG,KAAK,IAAI;EAAG,GAAG,KAAK,IAAI;CAAE;AAC/C"}