@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,271 @@
1
+ import { cos, hypot, sin } from "./exactMath.js";
2
+ import { at } from "./defs.js";
3
+ import { defineComponent } from "./components.js";
4
+ import { refreshVitals } from "./stats.js";
5
+ import { snapshotField } from "./replication.js";
6
+ import { heroOf } from "./hero.js";
7
+ import { defineHook } from "./hooks.js";
8
+ import { summoned } from "./summoned.js";
9
+ import { valueOf } from "./abilities/amounts.js";
10
+ import { defineEffect, mayReach } from "./abilities/effects.js";
11
+ //#region src/summons.ts
12
+ /**
13
+ * The corpses of a world. Saved with it
14
+ *
15
+ * @beta
16
+ */
17
+ var corpses = defineComponent({
18
+ id: "core.corpses",
19
+ default: () => []
20
+ });
21
+ /**
22
+ * On an illusion: whose copy it is, the part of its damage it deals, and how much more it takes. Told to its side
23
+ * only: to everyone else it is the real one
24
+ *
25
+ * @beta
26
+ */
27
+ var illusion = defineComponent({
28
+ id: "core.illusion",
29
+ replicate: "allies"
30
+ });
31
+ /** Whether a unit leaves a corpse: one of flesh (`UnitTypeDef.corpse`), and not one a spell brought */
32
+ /**
33
+ * How long a unit's corpse lies, in seconds, or nothing for none: a unit of flesh does, for the game's time, unless a
34
+ * spell brought it; its type may say no, or decide for this death (`UnitTypeDef.corpse`)
35
+ */
36
+ function corpseTime(world, entity) {
37
+ if (!entity.isUnit || entity.has(summoned) || entity.has(illusion)) return void 0;
38
+ const declared = entity.def.corpse;
39
+ const decided = typeof declared === "function" ? declared(world, entity) : declared ?? true;
40
+ if (decided === false) return void 0;
41
+ const seconds = decided === true ? world.settings.combat.corpseTime : decided;
42
+ return seconds > 0 ? seconds : void 0;
43
+ }
44
+ /**
45
+ * Takes up to `most` corpses nearest a point, within `radius`, out of the world, and gives them; `which`, those of them
46
+ * it may take (the caster's allies', for a resurrection)
47
+ *
48
+ * @beta
49
+ */
50
+ function takeCorpses(world, point, radius, most, which) {
51
+ const all = world.state(corpses);
52
+ const near = all.filter((corpse) => hypot(corpse.x - point.x, corpse.z - point.z) <= radius && (!which || which(corpse))).sort((a, b) => hypot(a.x - point.x, a.z - point.z) - hypot(b.x - point.x, b.z - point.z)).slice(0, most);
53
+ world.setState(corpses, all.filter((corpse) => !near.includes(corpse)));
54
+ return near;
55
+ }
56
+ /**
57
+ * Corpses rot away in their time. Once a second
58
+ *
59
+ * @internal
60
+ */
61
+ var corpseSystem = {
62
+ name: "corpses",
63
+ phase: "cleanup",
64
+ every: 30,
65
+ update(world) {
66
+ const all = world.state(corpses);
67
+ if (all.some((corpse) => corpse.until <= world.time)) world.setState(corpses, all.filter((corpse) => corpse.until > world.time));
68
+ }
69
+ };
70
+ /**
71
+ * What happens around the dead, and what illusions do: a corpse where a unit of flesh fell; nothing to gain for killing
72
+ * an illusion (see the core hooks of `features.ts`); and an illusion's blows and the blows it takes, changed
73
+ *
74
+ * @internal
75
+ */
76
+ var summonHooks = [defineHook({
77
+ hook: "death",
78
+ id: "corpse",
79
+ run(world, { entity }) {
80
+ const seconds = corpseTime(world, entity);
81
+ if (seconds === void 0) return;
82
+ world.state(corpses).push({
83
+ id: entity.id,
84
+ type: entity.def.id,
85
+ owner: entity.owner,
86
+ x: entity.pos.x,
87
+ z: entity.pos.z,
88
+ until: world.time + seconds
89
+ });
90
+ }
91
+ }), defineHook({
92
+ hook: "beforeDamage",
93
+ id: "illusions",
94
+ run(_world, event) {
95
+ const dealt = event.source?.get(illusion)?.dealt;
96
+ const taken = event.target.get(illusion)?.taken;
97
+ if (dealt !== void 0) event.amount *= dealt;
98
+ if (taken !== void 0) event.amount *= taken;
99
+ }
100
+ })];
101
+ /**
102
+ * Whether killing an entity gains its killer nothing: an illusion
103
+ *
104
+ * @beta
105
+ */
106
+ var worthless = (entity) => entity.has(illusion);
107
+ /**
108
+ * The effect types that bring units in: `summon`, `raiseDead` and `illusion`, registered with the engine's effects
109
+ *
110
+ * @internal
111
+ */
112
+ var summonEffects = [
113
+ defineEffect({
114
+ type: "summon",
115
+ run: (context, effect) => {
116
+ const { world, caster, point, level } = context;
117
+ if (!effect.unit) return;
118
+ const count = Math.max(Math.round(at(effect.count, level, 1)), 1);
119
+ const lifetime = effect.lifetime === void 0 ? void 0 : at(effect.lifetime, level);
120
+ const around = count > 1 ? effect.spread ?? 1.5 : 0;
121
+ for (let i = 0; i < count; i++) {
122
+ const angle = i / count * Math.PI * 2;
123
+ const where = {
124
+ x: point.x + sin(angle) * around,
125
+ z: point.z + cos(angle) * around
126
+ };
127
+ world.spawn(effect.unit, caster.owner, where, {
128
+ facing: caster.facing,
129
+ lifetime
130
+ }).set(summoned, {
131
+ by: caster.id,
132
+ follow: effect.follow ?? true,
133
+ aggro: effect.aggro ?? "mastersAttacker",
134
+ diesWithMaster: effect.diesWithMaster ?? true,
135
+ at: world.time
136
+ });
137
+ }
138
+ },
139
+ fields: [
140
+ "unit",
141
+ "count",
142
+ {
143
+ path: "lifetime",
144
+ kind: "number",
145
+ min: 0,
146
+ hint: "Seconds they stay: for good when left out"
147
+ },
148
+ {
149
+ path: "spread",
150
+ kind: "number",
151
+ min: 0,
152
+ hint: "How many cells around where it landed they appear"
153
+ },
154
+ {
155
+ path: "follow",
156
+ kind: "boolean",
157
+ hint: "Walk with the caster when there is nothing to attack: yes when left out"
158
+ },
159
+ {
160
+ path: "aggro",
161
+ options: [
162
+ "nearest",
163
+ "mastersAttacker",
164
+ "none"
165
+ ],
166
+ hint: "Whom they go for: whoever hits the caster first when left out"
167
+ },
168
+ {
169
+ path: "diesWithMaster",
170
+ kind: "boolean",
171
+ hint: "Die when the caster does: yes when left out"
172
+ }
173
+ ]
174
+ }),
175
+ defineEffect({
176
+ type: "raiseDead",
177
+ run: (context, effect) => {
178
+ const { world, caster, point, level } = context;
179
+ const themselves = effect.as === "themselves";
180
+ if (!effect.unit && !themselves) return;
181
+ const lifetime = effect.duration === void 0 ? void 0 : valueOf(context, effect.duration);
182
+ const which = themselves ? (corpse) => world.registry.units.has(corpse.type) : void 0;
183
+ for (const corpse of takeCorpses(world, point, valueOf(context, effect.radius, void 0, 6), Math.round(at(effect.count, level, 2)), which)) world.spawn(themselves ? corpse.type : effect.unit, caster.owner, corpse, {
184
+ facing: caster.facing,
185
+ lifetime
186
+ }).set(summoned, { by: caster.id });
187
+ },
188
+ fields: [
189
+ "unit",
190
+ "as",
191
+ "duration",
192
+ "count"
193
+ ]
194
+ }),
195
+ defineEffect({
196
+ type: "revive",
197
+ run: (context, effect) => {
198
+ const { world, caster, point, level } = context;
199
+ const most = effect.count === void 0 ? Infinity : Math.round(at(effect.count, level));
200
+ const which = (corpse) => world.registry.units.has(corpse.type) && world.areAllies(caster.owner, corpse.owner) && world.players.has(corpse.owner);
201
+ for (const corpse of takeCorpses(world, point, valueOf(context, effect.radius, void 0, 6), most, which)) world.spawn(corpse.type, corpse.owner, corpse, { facing: caster.facing });
202
+ },
203
+ fields: ["count"]
204
+ }),
205
+ defineEffect({
206
+ type: "illusion",
207
+ run: (context, effect) => {
208
+ const { world, caster, level } = context;
209
+ const original = context.target ?? caster;
210
+ if (original !== caster && !mayReach(context, effect, original)) return;
211
+ const count = Math.round(at(effect.count, level, 1));
212
+ const lifetime = valueOf(context, effect.duration, original, 30);
213
+ for (let i = 0; i < count; i++) {
214
+ const angle = i / count * Math.PI * 2 + world.rng.next();
215
+ const at2 = {
216
+ x: original.pos.x + sin(angle) * 1.5,
217
+ z: original.pos.z + cos(angle) * 1.5
218
+ };
219
+ const copy = world.spawn(original.def.id, caster.owner, at2, {
220
+ facing: original.facing,
221
+ lifetime
222
+ });
223
+ copy.set(illusion, {
224
+ of: original.id,
225
+ dealt: effect.dealt ?? 1 / 3,
226
+ taken: effect.taken ?? 2
227
+ });
228
+ const was = heroOf(original);
229
+ const hero = heroOf(copy);
230
+ if (was && hero) {
231
+ hero.level = was.level;
232
+ hero.xp = was.xp;
233
+ refreshVitals(world, copy);
234
+ }
235
+ copy.health = copy.maxHealth * (original.health / original.maxHealth);
236
+ copy.mana = Math.min(original.mana, copy.maxMana);
237
+ }
238
+ },
239
+ fields: [
240
+ "count",
241
+ "duration",
242
+ {
243
+ path: "dealt",
244
+ kind: "number",
245
+ min: 0,
246
+ hint: "What of its damage the copies deal: a third when left out"
247
+ },
248
+ {
249
+ path: "taken",
250
+ kind: "number",
251
+ min: 0,
252
+ hint: "Times what they are dealt the copies take: twice when left out"
253
+ }
254
+ ]
255
+ })
256
+ ];
257
+ /** The corpses where the player sees (`Snapshot.corpses`): none to a computer, and left out where there are none */
258
+ var corpsesPart = snapshotField("corpses", (view) => {
259
+ if (view.forComputer) return void 0;
260
+ const seen = view.world.state(corpses).filter((corpse) => view.sees(corpse.x, corpse.z)).map(({ id, type, x, z }) => ({
261
+ id,
262
+ type,
263
+ x,
264
+ z
265
+ }));
266
+ return seen.length ? seen : void 0;
267
+ });
268
+ //#endregion
269
+ export { corpseSystem, corpses, corpsesPart, illusion, summonEffects, summonHooks, summoned, takeCorpses, worthless };
270
+
271
+ //# sourceMappingURL=summons.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"summons.js","names":[],"sources":["../src/summons.ts"],"sourcesContent":["import { at } from './defs'\nimport { defineComponent } from './components'\nimport type { Entity, PlayerId } from './entity'\nimport { defineHook, type HookDef } from './hooks'\nimport type { Vec2 } from './math'\nimport { refreshVitals } from './stats'\nimport { defineEffect, type EffectType, mayReach } from './abilities/effects'\nimport { valueOf } from './abilities/amounts'\nimport type { World } from './world'\nimport { cos, hypot, sin } from './exactMath'\nimport { heroOf } from './hero'\nimport { snapshotField } from './replication'\nimport { summoned } from './summoned'\n\nexport { summoned }\n\n/*\n * Corpses, and what is brought into the world by a spell: units raised from the dead, and illusions. What dies of flesh\n * leaves a corpse for a while, which spells use up (`raiseDead`); what a spell brings is `summoned`, which dispelling\n * hurts; an illusion is a copy of a unit that deals a part of its damage and takes more, that its side can tell from\n * the real one and nobody else can\n */\n\n/**\n * What is left of a unit that died, for a while (see `corpses`)\n *\n * @beta\n */\nexport interface Corpse {\n\t/** The id the unit had: the screen keeps its body lying for as long as the corpse is there */\n\tid: number\n\t/** The unit type the dead unit was */\n\ttype: string\n\t/** The player who owned the dead unit */\n\towner: PlayerId\n\t/** Where the corpse lies, east-west */\n\tx: number\n\t/** Where the corpse lies, north-south */\n\tz: number\n\t/** When it is gone, in seconds of the game */\n\tuntil: number\n}\n\n/**\n * The corpses of a world. Saved with it\n *\n * @beta\n */\nexport const corpses = defineComponent<Corpse[]>({ id: 'core.corpses', default: () => [] })\n\n/**\n * On an illusion: whose copy it is, the part of its damage it deals, and how much more it takes. Told to its side\n * only: to everyone else it is the real one\n *\n * @beta\n */\nexport const illusion = defineComponent<{ of: number; dealt: number; taken: number }>({ id: 'core.illusion', replicate: 'allies' })\n\n/** Whether a unit leaves a corpse: one of flesh (`UnitTypeDef.corpse`), and not one a spell brought */\n/**\n * How long a unit's corpse lies, in seconds, or nothing for none: a unit of flesh does, for the game's time, unless a\n * spell brought it; its type may say no, or decide for this death (`UnitTypeDef.corpse`)\n */\nfunction corpseTime(world: World, entity: Entity): number | undefined {\n\tif (!entity.isUnit || entity.has(summoned) || entity.has(illusion)) return undefined\n\tconst declared = entity.def.corpse\n\tconst decided = typeof declared === 'function' ? declared(world, entity) : (declared ?? true)\n\tif (decided === false) return undefined\n\tconst seconds = decided === true ? world.settings.combat.corpseTime : decided\n\treturn seconds > 0 ? seconds : undefined\n}\n\n/**\n * Takes up to `most` corpses nearest a point, within `radius`, out of the world, and gives them; `which`, those of them\n * it may take (the caster's allies', for a resurrection)\n *\n * @beta\n */\nexport function takeCorpses(world: World, point: Vec2, radius: number, most: number, which?: (corpse: Corpse) => boolean): Corpse[] {\n\tconst all = world.state(corpses)\n\tconst near = all\n\t\t.filter((corpse) => hypot(corpse.x - point.x, corpse.z - point.z) <= radius && (!which || which(corpse)))\n\t\t.sort((a, b) => hypot(a.x - point.x, a.z - point.z) - hypot(b.x - point.x, b.z - point.z))\n\t\t.slice(0, most)\n\tworld.setState(\n\t\tcorpses,\n\t\tall.filter((corpse) => !near.includes(corpse))\n\t)\n\treturn near\n}\n\n/**\n * Corpses rot away in their time. Once a second\n *\n * @internal\n */\nexport const corpseSystem = {\n\tname: 'corpses',\n\tphase: 'cleanup' as const,\n\tevery: 30,\n\tupdate(world: World): void {\n\t\tconst all = world.state(corpses)\n\t\tif (all.some((corpse) => corpse.until <= world.time))\n\t\t\tworld.setState(\n\t\t\t\tcorpses,\n\t\t\t\tall.filter((corpse) => corpse.until > world.time)\n\t\t\t)\n\t}\n}\n\n/**\n * What happens around the dead, and what illusions do: a corpse where a unit of flesh fell; nothing to gain for killing\n * an illusion (see the core hooks of `features.ts`); and an illusion's blows and the blows it takes, changed\n *\n * @internal\n */\nexport const summonHooks: HookDef[] = [\n\tdefineHook({\n\t\thook: 'death',\n\t\tid: 'corpse',\n\t\trun(world, { entity }) {\n\t\t\tconst seconds = corpseTime(world, entity)\n\t\t\tif (seconds === undefined) return\n\t\t\tworld\n\t\t\t\t.state(corpses)\n\t\t\t\t.push({ id: entity.id, type: entity.def.id, owner: entity.owner, x: entity.pos.x, z: entity.pos.z, until: world.time + seconds })\n\t\t}\n\t}),\n\tdefineHook({\n\t\thook: 'beforeDamage',\n\t\tid: 'illusions',\n\t\trun(_world, event) {\n\t\t\tconst dealt = event.source?.get(illusion)?.dealt\n\t\t\tconst taken = event.target.get(illusion)?.taken\n\t\t\tif (dealt !== undefined) event.amount *= dealt\n\t\t\tif (taken !== undefined) event.amount *= taken\n\t\t}\n\t})\n]\n\n/**\n * Whether killing an entity gains its killer nothing: an illusion\n *\n * @beta\n */\nexport const worthless = (entity: Entity) => entity.has(illusion)\n\n/**\n * The effect types that bring units in: `summon`, `raiseDead` and `illusion`, registered with the engine's effects\n *\n * @internal\n */\nexport const summonEffects: EffectType[] = [\n\t/**\n\t * Brings `count` (1) units of `unit` into the world around where it landed, `spread` cells from it (1.5), for\n\t * `lifetime` seconds (for good when left out), the caster's owner's, its summons (`summoned`): with nothing to do\n\t * they walk with the caster when `follow` (true), they go for what an idle unit finds, and with `aggro` (default\n\t * `mastersAttacker`) for whoever hits the caster first; they die with the caster unless `diesWithMaster` is false\n\t *\n\t * @beta\n\t */\n\tdefineEffect({ type: 'summon', run: (context, effect) => {\n\t\t\tconst { world, caster, point, level } = context\n\t\t\tif (!effect.unit) return\n\t\t\tconst count = Math.max(Math.round(at(effect.count, level, 1)), 1)\n\t\t\tconst lifetime = effect.lifetime === undefined ? undefined : at(effect.lifetime, level)\n\t\t\tconst around = count > 1 ? (effect.spread ?? 1.5) : 0\n\t\t\tfor (let i = 0; i < count; i++) {\n\t\t\t\tconst angle = (i / count) * Math.PI * 2\n\t\t\t\tconst where = { x: point.x + sin(angle) * around, z: point.z + cos(angle) * around }\n\t\t\t\tconst brought = world.spawn(effect.unit, caster.owner, where, { facing: caster.facing, lifetime })\n\t\t\t\tbrought.set(summoned, {\n\t\t\t\t\tby: caster.id,\n\t\t\t\t\tfollow: effect.follow ?? true,\n\t\t\t\t\taggro: effect.aggro ?? 'mastersAttacker',\n\t\t\t\t\tdiesWithMaster: effect.diesWithMaster ?? true,\n\t\t\t\t\tat: world.time\n\t\t\t\t})\n\t\t\t}\n\t\t}, fields: [\n\t\t\t\t'unit',\n\t\t\t\t'count',\n\t\t\t\t{ path: 'lifetime', kind: 'number', min: 0, hint: 'Seconds they stay: for good when left out' },\n\t\t\t\t{ path: 'spread', kind: 'number', min: 0, hint: 'How many cells around where it landed they appear' },\n\t\t\t\t{ path: 'follow', kind: 'boolean', hint: 'Walk with the caster when there is nothing to attack: yes when left out' },\n\t\t\t\t{ path: 'aggro', options: ['nearest', 'mastersAttacker', 'none'], hint: 'Whom they go for: whoever hits the caster first when left out' },\n\t\t\t\t{ path: 'diesWithMaster', kind: 'boolean', hint: 'Die when the caster does: yes when left out' }\n\t\t\t] }),\n\t/**\n\t * Corpses near where it landed rise as `unit`s of the caster's, or as what they were (`as: 'themselves'`: Animate\n\t * Dead), for `duration` seconds: `count` of them at most (2 when left out), within `radius` (6)\n\t */\n\tdefineEffect({ type: 'raiseDead', run: (context, effect) => {\n\t\t\tconst { world, caster, point, level } = context\n\t\t\tconst themselves = effect.as === 'themselves'\n\t\t\tif (!effect.unit && !themselves) return\n\t\t\tconst lifetime = effect.duration === undefined ? undefined : valueOf(context, effect.duration)\n\t\t\tconst which = themselves ? (corpse: Corpse) => world.registry.units.has(corpse.type) : undefined\n\t\t\tfor (const corpse of takeCorpses(world, point, valueOf(context, effect.radius, undefined, 6), Math.round(at(effect.count, level, 2)), which)) {\n\t\t\t\tconst risen = world.spawn(themselves ? corpse.type : effect.unit!, caster.owner, corpse, { facing: caster.facing, lifetime })\n\t\t\t\trisen.set(summoned, { by: caster.id })\n\t\t\t}\n\t\t}, fields: ['unit', 'as', 'duration', 'count'] }),\n\n\t/**\n\t * The corpses of the caster's side near where it landed (within `radius`, 6) come back as what they were, their own\n\t * owners' again, whole: `count` of them at most, all when left out (Resurrection). Not summoned: they stay\n\t *\n\t * @beta\n\t */\n\tdefineEffect({ type: 'revive', run: (context, effect) => {\n\t\t\tconst { world, caster, point, level } = context\n\t\t\tconst most = effect.count === undefined ? Infinity : Math.round(at(effect.count, level))\n\t\t\tconst which = (corpse: Corpse) => world.registry.units.has(corpse.type) && world.areAllies(caster.owner, corpse.owner) && world.players.has(corpse.owner)\n\t\t\tfor (const corpse of takeCorpses(world, point, valueOf(context, effect.radius, undefined, 6), most, which))\n\t\t\t\tworld.spawn(corpse.type, corpse.owner, corpse, { facing: caster.facing })\n\t\t}, fields: ['count'] }),\n\n\t/**\n\t * Copies of the unit it was cast on (the caster, when none) appear around it, `count` of them (1), for `duration`\n\t * seconds (30): they deal `dealt` of its damage (a third) and take `taken` times as much (twice). A hero's\n\t * copies are of its level, with its health and mana as they are\n\t */\n\tdefineEffect({ type: 'illusion', run: (context, effect) => {\n\t\t\tconst { world, caster, level } = context\n\t\t\tconst original = context.target ?? caster\n\t\t\t// the game's say, as for any effect that reaches a unit (`beforeEffect`)\n\t\t\tif (original !== caster && !mayReach(context, effect, original)) return\n\t\t\tconst count = Math.round(at(effect.count, level, 1))\n\t\t\tconst lifetime = valueOf(context, effect.duration, original, 30)\n\t\t\tfor (let i = 0; i < count; i++) {\n\t\t\t\tconst angle = (i / count) * Math.PI * 2 + world.rng.next()\n\t\t\t\tconst at2 = { x: original.pos.x + sin(angle) * 1.5, z: original.pos.z + cos(angle) * 1.5 }\n\t\t\t\tconst copy = world.spawn(original.def.id, caster.owner, at2, { facing: original.facing, lifetime })\n\t\t\t\tcopy.set(illusion, { of: original.id, dealt: effect.dealt ?? 1 / 3, taken: effect.taken ?? 2 })\n\t\t\t\tconst was = heroOf(original)\n\t\t\t\tconst hero = heroOf(copy)\n\t\t\t\tif (was && hero) {\n\t\t\t\t\thero.level = was.level\n\t\t\t\t\thero.xp = was.xp\n\t\t\t\t\trefreshVitals(world, copy)\n\t\t\t\t}\n\t\t\t\tcopy.health = copy.maxHealth * (original.health / original.maxHealth)\n\t\t\t\tcopy.mana = Math.min(original.mana, copy.maxMana)\n\t\t\t}\n\t\t}, fields: [\n\t\t\t\t'count',\n\t\t\t\t'duration',\n\t\t\t\t{ path: 'dealt', kind: 'number', min: 0, hint: 'What of its damage the copies deal: a third when left out' },\n\t\t\t\t{ path: 'taken', kind: 'number', min: 0, hint: 'Times what they are dealt the copies take: twice when left out' }\n\t\t\t] })\n]\n\n/** The corpses where the player sees (`Snapshot.corpses`): none to a computer, and left out where there are none */\nexport const corpsesPart = snapshotField('corpses', (view) => {\n\tif (view.forComputer) return undefined\n\tconst seen = view.world\n\t\t.state(corpses)\n\t\t.filter((corpse) => view.sees(corpse.x, corpse.z))\n\t\t.map(({ id, type, x, z }) => ({ id, type, x, z }))\n\treturn seen.length ? seen : undefined\n})\n"],"mappings":"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"}
@@ -0,0 +1,224 @@
1
+ import { at, declaredAt, lowerChain, passiveEffects } from "../defs.js";
2
+ import { carriedPassives, inventorySlots, slotsOf } from "../inventory.js";
3
+ import { refreshVitals, statsOf } from "../stats.js";
4
+ import { buffRemoved } from "../engineEvents.js";
5
+ import { constructionSite } from "./construction.js";
6
+ import { edgeDistance, fighting, moving } from "../entity.js";
7
+ import { refillUses } from "../abilities/charges.js";
8
+ import { heroState } from "../hero.js";
9
+ import { hasTag } from "../abilities/chance.js";
10
+ import { buffEffects, buffEnded } from "../abilities/land.js";
11
+ import { AURA_LINGER, applyBuff, fullShield, hasBuff, isControlled, isRooted, isStunned } from "../abilities/buffs.js";
12
+ import { canSee } from "./combat.js";
13
+ import { valueOf } from "../abilities/amounts.js";
14
+ import { updateDashes, updateLingering, updateMissiles } from "../abilities/effects.js";
15
+ import { expirePurchases, refillItems, shopStock } from "../items.js";
16
+ import { createOrder, giveOrder } from "../orders/queue.js";
17
+ import { tickRecast } from "../abilities/recast.js";
18
+ import { castRange, notReady, validTarget } from "../orders/cast.js";
19
+ //#region src/systems/abilities.ts
20
+ /** Ticks between two rounds of upkeep: auras and autocast do not need to run every tick */
21
+ var UPKEEP_INTERVAL = 6;
22
+ /** How far beyond the reach of an ability a unit looks for something to autocast on */
23
+ var AUTOCAST_SEARCH = 3;
24
+ var found = [];
25
+ /** Marks the buff a unit's ability keeps up on another (or itself) as kept, not timed: what a plate shows of it */
26
+ function keptUp(target, buff, source) {
27
+ for (const instance of target.buffs) if (instance.id === buff && instance.source === source.id && !instance.kept) instance.kept = true;
28
+ }
29
+ /** What one ability does all the time, for one round */
30
+ function upkeep(world, entity, ability, level, lasting) {
31
+ for (const effect of lowerChain(passiveEffects(ability))) {
32
+ if (effect.type === "buff") {
33
+ if (effect.buff) {
34
+ applyBuff(world, entity, effect.buff, lasting ? Infinity : AURA_LINGER, entity, level);
35
+ if (!lasting) keptUp(entity, effect.buff, entity);
36
+ }
37
+ continue;
38
+ }
39
+ if (effect.type !== "aura") {
40
+ const point = {
41
+ x: entity.pos.x,
42
+ z: entity.pos.z
43
+ };
44
+ world.registry.effect(effect.type)({
45
+ world,
46
+ caster: entity,
47
+ ability,
48
+ level,
49
+ point,
50
+ interval: UPKEEP_INTERVAL * world.dt
51
+ }, effect);
52
+ continue;
53
+ }
54
+ const radius = typeof effect.radius === "function" ? valueOf({
55
+ world,
56
+ caster: entity,
57
+ ability,
58
+ level,
59
+ point: entity.pos
60
+ }, effect.radius) : at(effect.radius, level);
61
+ if (!effect.buff || !radius) continue;
62
+ const affects = effect.affects ?? (world.registry.buff(effect.buff).harmful ? "enemies" : "allies");
63
+ for (const other of world.spatial.query(entity.pos.x, entity.pos.z, radius, found)) {
64
+ if (!other.alive || other.hidden || !other.isUnit) continue;
65
+ if (other !== entity && edgeDistance(entity, other) > radius) continue;
66
+ if (affects === "enemies" && !world.areEnemies(entity.owner, other.owner)) continue;
67
+ if (affects === "allies" && !world.areAllies(entity.owner, other.owner)) continue;
68
+ if (effect.only === "heroes" && !other.has(heroState)) continue;
69
+ if (effect.kinds && !effect.kinds.includes(other.def.kind) || effect.tags && !hasTag(other, effect.tags)) continue;
70
+ applyBuff(world, other, effect.buff, AURA_LINGER, entity, level);
71
+ keptUp(other, effect.buff, entity);
72
+ }
73
+ }
74
+ }
75
+ function upkeepPassives(world, entity) {
76
+ for (const state of entity.abilities) if (state.level > 0) upkeep(world, entity, world.registry.ability(state.id), state.level, true);
77
+ for (const passive of carriedPassives(world, entity)) upkeep(world, entity, world.registry.ability(passive), 1, false);
78
+ }
79
+ /** Whether casting the ability on the target would do it any good */
80
+ function useful(ability, level, target) {
81
+ for (const effect of lowerChain(ability.effects)) {
82
+ if (effect.type === "heal" && target.health <= target.maxHealth - Math.min(declaredAt(effect.amount, level), target.maxHealth * .1)) return true;
83
+ if (effect.type === "buff" && effect.buff && !hasBuff(target, effect.buff)) return true;
84
+ if (effect.type === "damage") return true;
85
+ }
86
+ return false;
87
+ }
88
+ function autocast(world, entity) {
89
+ if (entity.orders.length > 0 || entity.hidden || entity.get(fighting)?.passive) return;
90
+ for (const state of entity.abilities) {
91
+ if (!state.autocast || state.cooldown > 0 || state.charges === 0 || state.level < 1) continue;
92
+ const ability = world.registry.ability(state.id);
93
+ if (ability.autoAim) {
94
+ if (notReady(world, entity, ability)) continue;
95
+ const aim = ability.autoAim(world, entity, state);
96
+ if (!aim) continue;
97
+ giveOrder(world, entity, createOrder(world, {
98
+ type: "cast",
99
+ ability: ability.id,
100
+ target: aim.target,
101
+ point: aim.point
102
+ }));
103
+ return;
104
+ }
105
+ if (ability.target !== "unit" || !world.cheats.noManaCosts && at(ability.manaCost, state.level) > entity.mana) continue;
106
+ const reach = castRange(world, entity, ability, state.level) + AUTOCAST_SEARCH;
107
+ let best;
108
+ let bestScore = Infinity;
109
+ for (const other of world.spatial.query(entity.pos.x, entity.pos.z, reach, found)) {
110
+ if (!validTarget(world, entity, ability, other) || !useful(ability, state.level, other)) continue;
111
+ if (other !== entity && (edgeDistance(entity, other) > reach || !canSee(world, entity, other))) continue;
112
+ const score = other.health / other.maxHealth + edgeDistance(entity, other) * .01;
113
+ if (score < bestScore) {
114
+ bestScore = score;
115
+ best = other;
116
+ }
117
+ }
118
+ if (best) {
119
+ giveOrder(world, entity, createOrder(world, {
120
+ type: "cast",
121
+ ability: ability.id,
122
+ target: best.id
123
+ }));
124
+ return;
125
+ }
126
+ }
127
+ }
128
+ /** Everything about abilities that happens on its own: regeneration, cooldowns, buffs running out, auras, autocast */
129
+ var abilitySystem = {
130
+ name: "abilities",
131
+ phase: "decide",
132
+ update(world, dt) {
133
+ updateMissiles(world, dt);
134
+ updateLingering(world, dt);
135
+ updateDashes(world, dt);
136
+ for (const entity of world.units.values()) {
137
+ if (!entity.alive) continue;
138
+ const pass = world.cheats.noCooldowns ? Infinity : dt;
139
+ for (const state of entity.abilities) {
140
+ if (state.cooldown > 0) state.cooldown = Math.max(state.cooldown - pass, 0);
141
+ if (state.charges !== void 0) refillUses(world, entity, state, pass);
142
+ if (state.recast) tickRecast(state, dt);
143
+ }
144
+ for (let i = entity.buffs.length - 1; i >= 0; i--) {
145
+ const buff = entity.buffs[i];
146
+ const before = buff.elapsed;
147
+ buff.remaining -= dt;
148
+ buff.elapsed += dt;
149
+ const def = world.registry.buff(buff.id);
150
+ const tick = def.onTick;
151
+ if (tick && tick.every > 0) {
152
+ const times = Math.floor(buff.elapsed / tick.every) - Math.floor(before / tick.every);
153
+ for (let n = 0; n < times && entity.alive; n++) {
154
+ tick.run?.(world, entity, buff);
155
+ if (tick.effects) buffEffects(world, entity, buff, tick.effects);
156
+ }
157
+ if (!entity.alive) break;
158
+ }
159
+ if (buff.remaining <= 0) {
160
+ entity.dropBuff(i);
161
+ buffEnded(world, entity, buff);
162
+ def.onRemove?.(world, entity, buff, true);
163
+ world.hooks.run("buffEnd", {
164
+ entity,
165
+ buff,
166
+ expired: true
167
+ });
168
+ world.events.emit(buffRemoved, {
169
+ entity,
170
+ buff: buff.id,
171
+ expired: true
172
+ });
173
+ continue;
174
+ }
175
+ if (def.recharge !== void 0 && world.time - entity.hurtAt >= def.recharge) buff.shield = fullShield(world, def, world.get(buff.source) ?? entity, buff.level);
176
+ }
177
+ const slots = slotsOf(entity);
178
+ if (slots) {
179
+ refillItems(world, entity, dt);
180
+ expirePurchases(world, entity);
181
+ for (const instance of slots) {
182
+ if (instance?.state && instance.state.cooldown > 0) instance.state.cooldown = Math.max(instance.state.cooldown - pass, 0);
183
+ if (instance?.state?.charges !== void 0) refillUses(world, entity, instance.state, pass, true);
184
+ if (instance?.state?.recast) tickRecast(instance.state, dt);
185
+ }
186
+ }
187
+ const stocks = entity.get(shopStock);
188
+ if (stocks) for (const stock of stocks) {
189
+ const max = world.registry.item(stock.item).stock?.max ?? 0;
190
+ if (stock.count >= max || !entity.operational) continue;
191
+ stock.restock -= dt;
192
+ if (stock.restock <= 0) {
193
+ stock.count++;
194
+ stock.restock = world.registry.item(stock.item).stock?.restock ?? 60;
195
+ }
196
+ }
197
+ const stats = statsOf(world, entity);
198
+ if (stats.health !== entity.maxHealth || stats.mana !== entity.maxMana) refreshVitals(world, entity);
199
+ if (entity.maxMana > 0 && stats.manaRegen !== 0) entity.mana = Math.min(entity.mana + stats.manaRegen * dt, entity.maxMana);
200
+ if (stats.healthRegen !== 0 && !(entity.isStructure && entity.has(constructionSite))) entity.health = Math.min(entity.health + stats.healthRegen * dt, entity.maxHealth);
201
+ const { recovers } = entity.def;
202
+ if (recovers !== void 0 && entity.health < entity.maxHealth && world.time - entity.hurtAt >= recovers) entity.health = entity.maxHealth;
203
+ if (entity.health <= 0) {
204
+ world.kill(entity);
205
+ continue;
206
+ }
207
+ const m = entity.get(moving);
208
+ if (m && !entity.hidden) {
209
+ const speed = entity.buffs.length && (isStunned(world, entity) || isRooted(world, entity)) ? 0 : Math.min(world.settings.movement.moveSpeed(world, entity, stats.moveSpeed), m.cap ?? Infinity);
210
+ if (Math.abs(speed - m.speed) > 1e-6) {
211
+ m.speed = speed;
212
+ world.nav.setSpeed(entity.id, speed);
213
+ }
214
+ }
215
+ if (entity.abilities.length === 0 && !entity.has(inventorySlots) || (world.tick + entity.id) % UPKEEP_INTERVAL !== 0) continue;
216
+ upkeepPassives(world, entity);
217
+ if (!isStunned(world, entity) && !entity.asleep && !isControlled(world, entity)) autocast(world, entity);
218
+ }
219
+ }
220
+ };
221
+ //#endregion
222
+ export { abilitySystem };
223
+
224
+ //# sourceMappingURL=abilities.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"abilities.js","names":[],"sources":["../../src/systems/abilities.ts"],"sourcesContent":["import { buffRemoved } from '#engine/engineEvents'\nimport { carriedPassives, inventorySlots, slotsOf } from '#engine/inventory'\nimport { constructionSite } from './construction'\nimport { AURA_LINGER, applyBuff, fullShield, hasBuff, isControlled, isRooted, isStunned } from '#engine/abilities/buffs'\nimport { expirePurchases, refillItems, shopStock } from '#engine/items'\nimport { updateDashes, updateLingering, updateMissiles } from '#engine/abilities/effects'\nimport { buffEffects, buffEnded } from '#engine/abilities/land'\nimport { refillUses } from '#engine/abilities/charges'\nimport { tickRecast } from '#engine/abilities/recast'\nimport { type AbilityDef, at, declaredAt, lowerChain, passiveEffects } from '#engine/defs'\nimport { valueOf } from '#engine/abilities/amounts'\nimport { edgeDistance, type Entity } from '#engine/entity'\nimport { castRange, notReady, validTarget } from '#engine/orders/cast'\nimport { createOrder, giveOrder } from '#engine/orders/queue'\nimport type { System } from '#engine/registry'\nimport { refreshVitals, statsOf } from '#engine/stats'\nimport type { World } from '#engine/world'\nimport { canSee } from './combat'\nimport { hasTag } from '#engine/abilities/chance'\nimport { heroState } from '#engine/hero'\nimport { moving, fighting } from '../entity'\n\n/** Ticks between two rounds of upkeep: auras and autocast do not need to run every tick */\nconst UPKEEP_INTERVAL = 6\n/** How far beyond the reach of an ability a unit looks for something to autocast on */\nconst AUTOCAST_SEARCH = 3\n\nconst found: Entity[] = []\n\n/** Marks the buff a unit's ability keeps up on another (or itself) as kept, not timed: what a plate shows of it */\nfunction keptUp(target: Entity, buff: string, source: Entity): void {\n\tfor (const instance of target.buffs) if (instance.id === buff && instance.source === source.id && !instance.kept) instance.kept = true\n}\n\n/** What one ability does all the time, for one round */\nfunction upkeep(world: World, entity: Entity, ability: AbilityDef, level: number, lasting: boolean): void {\n\tfor (const effect of lowerChain(passiveEffects(ability))) {\n\t\tif (effect.type === 'buff') {\n\t\t\t// renewed rather than left alone, so that it follows the level of the ability. What an item gives goes with the item\n\t\t\tif (effect.buff) {\n\t\t\t\tapplyBuff(world, entity, effect.buff, lasting ? Infinity : AURA_LINGER, entity, level)\n\t\t\t\tif (!lasting) keptUp(entity, effect.buff, entity)\n\t\t\t}\n\t\t\tcontinue\n\t\t}\n\t\tif (effect.type !== 'aura') {\n\t\t\t// whatever else a game came up with: it is asked every round. `onHit` has nothing to do here\n\t\t\tconst point = { x: entity.pos.x, z: entity.pos.z }\n\t\t\tworld.registry.effect(effect.type)({ world, caster: entity, ability, level, point, interval: UPKEEP_INTERVAL * world.dt }, effect)\n\t\t\tcontinue\n\t\t}\n\t\tconst radius = typeof effect.radius === 'function' ? valueOf({ world, caster: entity, ability, level, point: entity.pos }, effect.radius) : at(effect.radius, level)\n\t\tif (!effect.buff || !radius) continue\n\t\tconst affects = effect.affects ?? (world.registry.buff(effect.buff).harmful ? 'enemies' : 'allies')\n\t\tfor (const other of world.spatial.query(entity.pos.x, entity.pos.z, radius, found)) {\n\t\t\tif (!other.alive || other.hidden || !other.isUnit) continue\n\t\t\tif (other !== entity && edgeDistance(entity, other) > radius) continue\n\t\t\tif (affects === 'enemies' && !world.areEnemies(entity.owner, other.owner)) continue\n\t\t\tif (affects === 'allies' && !world.areAllies(entity.owner, other.owner)) continue\n\t\t\t// who it is for, as any effect says it (`only`, `kinds`, `tags`): an aura for heroes alone keeps off the rest\n\t\t\tif (effect.only === 'heroes' && !other.has(heroState)) continue\n\t\t\tif ((effect.kinds && !effect.kinds.includes(other.def.kind)) || (effect.tags && !hasTag(other, effect.tags))) continue\n\t\t\tapplyBuff(world, other, effect.buff, AURA_LINGER, entity, level)\n\t\t\tkeptUp(other, effect.buff, entity)\n\t\t}\n\t}\n}\n\nfunction upkeepPassives(world: World, entity: Entity): void {\n\tfor (const state of entity.abilities) {\n\t\tif (state.level > 0) upkeep(world, entity, world.registry.ability(state.id), state.level, true)\n\t}\n\tfor (const passive of carriedPassives(world, entity)) upkeep(world, entity, world.registry.ability(passive), 1, false)\n}\n\n/** Whether casting the ability on the target would do it any good */\nfunction useful(ability: AbilityDef, level: number, target: Entity): boolean {\n\tfor (const effect of lowerChain(ability.effects)) {\n\t\tif (effect.type === 'heal' && target.health <= target.maxHealth - Math.min(declaredAt(effect.amount, level), target.maxHealth * 0.1)) return true\n\t\tif (effect.type === 'buff' && effect.buff && !hasBuff(target, effect.buff)) return true\n\t\tif (effect.type === 'damage') return true\n\t}\n\treturn false\n}\n\nfunction autocast(world: World, entity: Entity): void {\n\tif (entity.orders.length > 0 || entity.hidden || entity.get(fighting)?.passive) return\n\tfor (const state of entity.abilities) {\n\t\tif (!state.autocast || state.cooldown > 0 || state.charges === 0 || state.level < 1) continue\n\t\tconst ability = world.registry.ability(state.id)\n\t\t// the game's own way: where to use it now, for any kind of ability\n\t\tif (ability.autoAim) {\n\t\t\tif (notReady(world, entity, ability)) continue\n\t\t\tconst aim = ability.autoAim(world, entity, state)\n\t\t\tif (!aim) continue\n\t\t\tgiveOrder(world, entity, createOrder(world, { type: 'cast', ability: ability.id, target: aim.target, point: aim.point }))\n\t\t\treturn\n\t\t}\n\t\tif (ability.target !== 'unit' || (!world.cheats.noManaCosts && at(ability.manaCost, state.level) > entity.mana)) continue\n\n\t\tconst reach = castRange(world, entity, ability, state.level) + AUTOCAST_SEARCH\n\t\tlet best: Entity | undefined\n\t\tlet bestScore = Infinity\n\t\tfor (const other of world.spatial.query(entity.pos.x, entity.pos.z, reach, found)) {\n\t\t\tif (!validTarget(world, entity, ability, other) || !useful(ability, state.level, other)) continue\n\t\t\tif (other !== entity && (edgeDistance(entity, other) > reach || !canSee(world, entity, other))) continue\n\t\t\t// whoever is worst off first, the closest one among equals\n\t\t\tconst score = other.health / other.maxHealth + edgeDistance(entity, other) * 0.01\n\t\t\tif (score < bestScore) {\n\t\t\t\tbestScore = score\n\t\t\t\tbest = other\n\t\t\t}\n\t\t}\n\t\tif (best) {\n\t\t\tgiveOrder(world, entity, createOrder(world, { type: 'cast', ability: ability.id, target: best.id }))\n\t\t\treturn\n\t\t}\n\t}\n}\n\n/** Everything about abilities that happens on its own: regeneration, cooldowns, buffs running out, auras, autocast */\nexport const abilitySystem: System = {\n\tname: 'abilities',\n\tphase: 'decide',\n\tupdate(world, dt) {\n\t\tupdateMissiles(world, dt)\n\t\tupdateLingering(world, dt)\n\t\tupdateDashes(world, dt)\n\t\tfor (const entity of world.units.values()) {\n\t\t\tif (!entity.alive) continue\n\n\t\t\t// with no cooldowns, the ones that were running when that was switched on are over too\n\t\t\tconst pass = world.cheats.noCooldowns ? Infinity : dt\n\t\t\tfor (const state of entity.abilities) {\n\t\t\t\tif (state.cooldown > 0) state.cooldown = Math.max(state.cooldown - pass, 0)\n\t\t\t\tif (state.charges !== undefined) refillUses(world, entity, state, pass)\n\t\t\t\tif (state.recast) tickRecast(state, dt)\n\t\t\t}\n\n\t\t\tfor (let i = entity.buffs.length - 1; i >= 0; i--) {\n\t\t\t\tconst buff = entity.buffs[i]\n\t\t\t\tconst before = buff.elapsed\n\t\t\t\tbuff.remaining -= dt\n\t\t\t\tbuff.elapsed += dt\n\t\t\t\tconst def = world.registry.buff(buff.id)\n\t\t\t\t// every so often while it lasts: as many times as `every` went by in this tick\n\t\t\t\tconst tick = def.onTick\n\t\t\t\tif (tick && tick.every > 0) {\n\t\t\t\t\t// from the time before this tick: worked out back from after it, rounding could lose one\n\t\t\t\t\tconst times = Math.floor(buff.elapsed / tick.every) - Math.floor(before / tick.every)\n\t\t\t\t\tfor (let n = 0; n < times && entity.alive; n++) {\n\t\t\t\t\t\ttick.run?.(world, entity, buff)\n\t\t\t\t\t\tif (tick.effects) buffEffects(world, entity, buff, tick.effects)\n\t\t\t\t\t}\n\t\t\t\t\tif (!entity.alive) break\n\t\t\t\t}\n\t\t\t\tif (buff.remaining <= 0) {\n\t\t\t\t\tentity.dropBuff(i)\n\t\t\t\t\tbuffEnded(world, entity, buff)\n\t\t\t\t\tdef.onRemove?.(world, entity, buff, true)\n\t\t\t\t\tworld.hooks.run('buffEnd', { entity, buff, expired: true })\n\t\t\t\t\tworld.events.emit(buffRemoved, { entity, buff: buff.id, expired: true })\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\t// a shield that grows back, once its owner has been left alone for long enough\n\t\t\t\tif (def.recharge !== undefined && world.time - entity.hurtAt >= def.recharge) {\n\t\t\t\t\tbuff.shield = fullShield(world, def, world.get(buff.source) ?? entity, buff.level)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// (no empty lists made for what carries nothing and sells nothing: most units, every tick)\n\t\t\tconst slots = slotsOf(entity)\n\t\t\tif (slots) {\n\t\t\t\trefillItems(world, entity, dt)\n\t\t\t\texpirePurchases(world, entity)\n\t\t\t\tfor (const instance of slots) {\n\t\t\t\t\tif (instance?.state && instance.state.cooldown > 0) instance.state.cooldown = Math.max(instance.state.cooldown - pass, 0)\n\t\t\t\t\tif (instance?.state?.charges !== undefined) refillUses(world, entity, instance.state, pass, true)\n\t\t\t\t\tif (instance?.state?.recast) tickRecast(instance.state, dt)\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst stocks = entity.get(shopStock)\n\t\t\tif (stocks) {\n\t\t\t\tfor (const stock of stocks) {\n\t\t\t\t\tconst max = world.registry.item(stock.item).stock?.max ?? 0\n\t\t\t\t\tif (stock.count >= max || !entity.operational) continue\n\t\t\t\t\tstock.restock -= dt\n\t\t\t\t\tif (stock.restock <= 0) {\n\t\t\t\t\t\tstock.count++\n\t\t\t\t\t\tstock.restock = world.registry.item(stock.item).stock?.restock ?? 60\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst stats = statsOf(world, entity)\n\t\t\t// what changed the stats may have changed how much health and mana there is room for\n\t\t\tif (stats.health !== entity.maxHealth || stats.mana !== entity.maxMana) refreshVitals(world, entity)\n\t\t\tif (entity.maxMana > 0 && stats.manaRegen !== 0) entity.mana = Math.min(entity.mana + stats.manaRegen * dt, entity.maxMana)\n\t\t\tif (stats.healthRegen !== 0 && !(entity.isStructure && entity.has(constructionSite)))\n\t\t\t\tentity.health = Math.min(entity.health + stats.healthRegen * dt, entity.maxHealth)\n\t\t\t// left alone for long enough, it is whole again\n\t\t\tconst { recovers } = entity.def\n\t\t\tif (recovers !== undefined && entity.health < entity.maxHealth && world.time - entity.hurtAt >= recovers) entity.health = entity.maxHealth\n\t\t\tif (entity.health <= 0) {\n\t\t\t\tworld.kill(entity)\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\t// slowed or hasted units have to be told to the navigation\n\t\t\tconst m = entity.get(moving)\n\t\t\tif (m && !entity.hidden) {\n\t\t\t\tconst speed =\n\t\t\t\t\tentity.buffs.length && (isStunned(world, entity) || isRooted(world, entity))\n\t\t\t\t\t\t? 0\n\t\t\t\t\t\t: Math.min(world.settings.movement.moveSpeed(world, entity, stats.moveSpeed), m.cap ?? Infinity)\n\t\t\t\tif (Math.abs(speed - m.speed) > 1e-6) {\n\t\t\t\t\tm.speed = speed\n\t\t\t\t\tworld.nav.setSpeed(entity.id, speed)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ((entity.abilities.length === 0 && !entity.has(inventorySlots)) || (world.tick + entity.id) % UPKEEP_INTERVAL !== 0) continue\n\t\t\tupkeepPassives(world, entity)\n\t\t\tif (!isStunned(world, entity) && !entity.asleep && !isControlled(world, entity)) autocast(world, entity)\n\t\t}\n\t}\n}\n"],"mappings":"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"}
@@ -2,6 +2,8 @@ import { type Entity } from '#engine/entity';
2
2
  import { type Vec2 } from '#engine/math';
3
3
  import type { System } from '#engine/registry';
4
4
  import type { World } from '#engine/world';
5
+ import { STRUCTURE_REACH } from '#engine/engagement';
6
+ export { STRUCTURE_REACH };
5
7
  export type EngageResult = 'invalid' | 'attacking' | 'chasing' | 'outOfRange';
6
8
  /**
7
9
  * Whether an attacker may attack a target: its attack reaches it, it is an enemy, and the `canAttack` hook agrees.
@@ -44,12 +46,44 @@ export declare const acquireTarget: (world: World, entity: Entity, range?: numbe
44
46
  * @beta
45
47
  */
46
48
  export declare function acquireInRange(world: World, entity: Entity, slack?: number): Entity | undefined;
49
+ /**
50
+ * What the `targetScore` hook makes of a target for an attacker, the engine's own score under it: what a search would
51
+ * weigh it at, or -Infinity for one a game's hook leaves out. For a rule that hands an attacker a target without
52
+ * searching (an ally's help), so that the game weighs it as it weighs any
53
+ */
54
+ export declare function scoreTarget(world: World, entity: Entity, other: Entity): number;
47
55
  /**
48
56
  * `acquireTarget`, and whether it passed over a target it leaves alone for now (`TargetFound`). What it gives back is
49
57
  * the search's own, used again by the next search: read it at once
50
58
  */
51
59
  export declare function searchTarget(world: World, entity: Entity, range?: number, shunned?: boolean, inRange?: number): Readonly<TargetFound>;
52
- export declare function cancelSwing(entity: Entity): void;
60
+ /**
61
+ * Calls off the swing under way, before its blow: said (`swingCancelled`) when there was one, for the screen to cut
62
+ * the attack to the walk. What has been swung already is not given back: the cooldown runs as it did
63
+ */
64
+ export declare function cancelSwing(world: World, entity: Entity): void;
65
+ /**
66
+ * A cleave as it is for one blow: a part of its damage, how far round the target, how wide a cone from the attacker
67
+ * through it (all round when none)
68
+ *
69
+ * @beta
70
+ */
71
+ export interface CleaveNow {
72
+ /** The part of the blow's damage each other enemy takes */
73
+ part: number;
74
+ /** How far from the target's edge they stand */
75
+ radius: number;
76
+ /** How wide the cone from the attacker through the target is, in radians: all round when left out */
77
+ angle?: number;
78
+ }
79
+ /**
80
+ * What a blow from up close of the attacker's weapon at that place cleaves (`AttackDef.cleave`, `BuffDef.cleave`): the
81
+ * attack's own, or a buff's at its level, whichever has the larger part. Nothing for none. The engine's
82
+ * `RuleSettings.combat.cleave`
83
+ *
84
+ * @beta
85
+ */
86
+ export declare function cleaveOf(world: World, attacker: Entity, _target: Entity, weapon: number): CleaveNow | undefined;
53
87
  export type BombardResult = 'attacking' | 'outOfRange';
54
88
  /** One tick of attacking a spot on the ground, for attacks that can. Getting into range is up to the caller */
55
89
  export declare function bombard(world: World, entity: Entity, point: Vec2, dt: number): BombardResult;