@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
package/dist/lanes.d.ts CHANGED
@@ -36,6 +36,7 @@ export declare const LANE_SPAWNER_KIND: {
36
36
  export interface Lane {
37
37
  /** The name of its path (`world.map.path(name)`), what orders that follow it are given */
38
38
  path: string;
39
+ /** The points of the lane's path, in order from its first end to its last */
39
40
  points: readonly Vec2[];
40
41
  /** Its spawners, by the end of the lane they are at: the first point's, then the last's. Either is missing on a map not finished */
41
42
  ends: [LaneEnd | undefined, LaneEnd | undefined];
@@ -46,8 +47,11 @@ export interface Lane {
46
47
  * @beta
47
48
  */
48
49
  export interface LaneEnd {
50
+ /** The map's spawner object at this end of the lane */
49
51
  spawner: MapThing;
52
+ /** The player whose waves start at this end */
50
53
  player: PlayerId;
54
+ /** The point the spawner stands at */
51
55
  at: Vec2;
52
56
  }
53
57
  /**
@@ -79,13 +83,17 @@ export declare function checkLanes(map: GameMap): MapProblem[];
79
83
  * @beta
80
84
  */
81
85
  export interface LaneWave {
86
+ /** The wave's number at its spawner, counting from 1 */
82
87
  number: number;
88
+ /** The lane the wave walks */
83
89
  lane: Lane;
90
+ /** Which end of the lane it starts from: 0 the first point's, 1 the last's */
84
91
  from: 0 | 1;
92
+ /** The player whose wave it is */
85
93
  player: PlayerId;
86
94
  }
87
95
  /**
88
- * What a game's lanes do (`withLanes`). Every part has the engine's own when left out
96
+ * What a game's lanes do (`lanesPack`). Every part has the engine's own when left out
89
97
  *
90
98
  * @beta
91
99
  */
@@ -104,6 +112,7 @@ export interface LanesOptions {
104
112
  wave?: (world: World, wave: LaneWave) => string[];
105
113
  /** Seconds from the start to the first wave, and between waves: 20 and 30 when left out */
106
114
  firstWave?: number;
115
+ /** Seconds between one wave and the next; 30 when left out */
107
116
  every?: number;
108
117
  /**
109
118
  * Where a minion goes once it is at the far end of its lane, fighting on the way: the nearest structure of another
@@ -118,7 +127,7 @@ export interface LanesOptions {
118
127
  /**
119
128
  * What the cores are: the unit type's id, or a test of a unit. A side whose cores have all fallen has lost, and the
120
129
  * last side with one wins. Said by the game (the engine names none); `false` keeps the game's own way of winning
121
- * (`GameModule.victory`)
130
+ * (`Rules.victory`)
122
131
  */
123
132
  cores: string | ((world: World, entity: Entity) => boolean) | false;
124
133
  /** Seconds a hero who hit a hero is the towers' first target for: 3 when left out */
@@ -192,7 +201,7 @@ export declare const wavesSent: (world: World, spawner: number) => number;
192
201
  *
193
202
  * @beta
194
203
  */
195
- export declare function withLanes(options: LanesOptions): GamePack;
204
+ export declare function lanesPack(options: LanesOptions): GamePack;
196
205
  /**
197
206
  * When a hero last hit a hero of another side, in seconds of the game's time: what the lane towers of the side it hit
198
207
  * go for first, for a while (`LanesOptions.towerAggro`)
package/dist/lanes.js ADDED
@@ -0,0 +1,496 @@
1
+ import { atan2, hypot } from "./exactMath.js";
2
+ import { distSq } from "./math.js";
3
+ import { defineComponent } from "./components.js";
4
+ import { defineListener } from "./events.js";
5
+ import { damaged, gameOver } from "./engineEvents.js";
6
+ import { fighting } from "./entity.js";
7
+ import { defineHook } from "./hooks.js";
8
+ import { engageWith } from "./engagement.js";
9
+ import { disengage } from "./systems/combat.js";
10
+ import { mapThings } from "./mapFields.js";
11
+ import { defineTimer } from "./timers.js";
12
+ import { defeat } from "./systems/victory.js";
13
+ //#region src/lanes.ts
14
+ /**
15
+ * The kind of thing a spawner is: where it is kept in the map's data, by this id
16
+ *
17
+ * @beta
18
+ */
19
+ var LANE_SPAWNERS = "lanes.spawners";
20
+ /**
21
+ * How near the end of its lane a spawner is to be that end's: in cells
22
+ *
23
+ * @internal
24
+ */
25
+ var LANE_END_REACH = 6;
26
+ /**
27
+ * The fields of a spawner: whose waves come out of it, and the lane they walk
28
+ *
29
+ * @internal
30
+ */
31
+ var LANE_SPAWNER_FIELDS = [{
32
+ id: "player",
33
+ name: "Player",
34
+ kind: "player",
35
+ default: 1,
36
+ hint: "Whose waves come out of it"
37
+ }, {
38
+ id: "lane",
39
+ name: "Lane",
40
+ kind: "path",
41
+ hint: "The path its waves walk, from the end it stands at to the other"
42
+ }];
43
+ /**
44
+ * A spawner as the editor offers it (a `MapKindDef` of `@v12-engine/client`): its tool, its fields, a ring at each, in
45
+ * the scene's `kinds`
46
+ *
47
+ * @beta
48
+ */
49
+ var LANE_SPAWNER_KIND = {
50
+ id: LANE_SPAWNERS,
51
+ name: "Spawner",
52
+ plural: "Spawners",
53
+ hint: "Where a side’s waves of minions come out, at one end of a lane: its player, and the path it is the end of",
54
+ icon: "tool.circle",
55
+ color: [
56
+ .95,
57
+ .75,
58
+ .25
59
+ ],
60
+ fields: LANE_SPAWNER_FIELDS,
61
+ reach: 3
62
+ };
63
+ /** The path a spawner is on, by the id its field keeps */
64
+ var pathOf = (paths, spawner) => {
65
+ const id = spawner.data?.lane;
66
+ return typeof id === "number" ? paths.find((path) => path.id === id) : typeof id === "string" ? paths.find((path) => path.name === id) : void 0;
67
+ };
68
+ /** Which end of a path a place is at: 0 the first point's, 1 the last's, or none when it is near neither */
69
+ function endOf(path, at) {
70
+ const first = path.points[0];
71
+ const last = path.points[path.points.length - 1];
72
+ if (!first || !last) return void 0;
73
+ const d0 = hypot(at.x - first.x, at.z - first.z);
74
+ const d1 = hypot(at.x - last.x, at.z - last.z);
75
+ if (Math.min(d0, d1) > 6) return void 0;
76
+ return d0 <= d1 ? 0 : 1;
77
+ }
78
+ /**
79
+ * The lanes of a map: every path a spawner is on, with what stands at each end
80
+ *
81
+ * @beta
82
+ */
83
+ function mapLanes(map) {
84
+ const lanes = /* @__PURE__ */ new Map();
85
+ for (const spawner of mapThings(map, LANE_SPAWNERS)) {
86
+ const path = pathOf(map.paths, spawner);
87
+ if (!path) continue;
88
+ let lane = lanes.get(path.id);
89
+ if (!lane) lanes.set(path.id, lane = {
90
+ path: path.name,
91
+ points: path.points,
92
+ ends: [void 0, void 0]
93
+ });
94
+ const end = endOf(path, spawner);
95
+ if (end === void 0) continue;
96
+ lane.ends[end] = {
97
+ spawner,
98
+ player: Number(spawner.data?.player ?? 1),
99
+ at: {
100
+ x: spawner.x,
101
+ z: spawner.z
102
+ }
103
+ };
104
+ }
105
+ return [...lanes.values()];
106
+ }
107
+ /**
108
+ * The lanes of a world's map (`mapLanes`): what waves walk
109
+ *
110
+ * @beta
111
+ */
112
+ var lanesOf = (world) => mapLanes({
113
+ paths: world.map.paths,
114
+ data: world.map.data
115
+ });
116
+ /**
117
+ * What is wrong with the lanes of a map, for the editor's checks (`MapEditorDef.check`): a spawner on no lane or away
118
+ * from its ends, a lane without a spawner at each end, or with the same side at both
119
+ *
120
+ * @beta
121
+ */
122
+ function checkLanes(map) {
123
+ const problems = [];
124
+ const teamOf = (player) => map.players.find((each) => each.id === player)?.team ?? player;
125
+ for (const spawner of mapThings(map, LANE_SPAWNERS)) {
126
+ const path = pathOf(map.paths, spawner);
127
+ const about = {
128
+ thing: spawner.id,
129
+ kind: LANE_SPAWNERS
130
+ };
131
+ if (!path) problems.push({
132
+ message: "A spawner is on no lane: pick the path its waves walk",
133
+ error: true,
134
+ rule: "lanes.spawner",
135
+ at: spawner,
136
+ about
137
+ });
138
+ else if (endOf(path, spawner) === void 0) problems.push({
139
+ message: `A spawner of "${path.name}" is at neither end of it`,
140
+ error: true,
141
+ rule: "lanes.spawner",
142
+ at: spawner,
143
+ about
144
+ });
145
+ }
146
+ for (const lane of mapLanes(map)) {
147
+ const path = map.paths.find((each) => each.name === lane.path);
148
+ const about = { path: path.id };
149
+ const [first, last] = lane.ends;
150
+ if (!first || !last) {
151
+ const missing = !first ? path.points[0] : path.points[path.points.length - 1];
152
+ problems.push({
153
+ message: `The lane "${lane.path}" has no spawner at one end: its waves start at both`,
154
+ error: true,
155
+ rule: "lanes.ends",
156
+ at: missing,
157
+ about
158
+ });
159
+ } else if (teamOf(first.player) === teamOf(last.player)) problems.push({
160
+ message: `The lane "${lane.path}" has the same side at both ends`,
161
+ error: true,
162
+ rule: "lanes.sides",
163
+ at: first.at,
164
+ about
165
+ });
166
+ }
167
+ return problems;
168
+ }
169
+ /**
170
+ * A minion of a lane: the lane it walks (its path's name), from which end. On every unit a wave brings
171
+ *
172
+ * @beta
173
+ */
174
+ var laneMinion = defineComponent({ id: "lanes.minion" });
175
+ /** How many waves each spawner has sent, by its id, and whether the waves were set going */
176
+ var lanesState = defineComponent({
177
+ id: "lanes.state",
178
+ default: () => ({
179
+ started: false,
180
+ waves: {}
181
+ })
182
+ });
183
+ /**
184
+ * The engine's waves: three close and two that shoot, one more close every fourth wave and one more that shoots every
185
+ * sixth, a siege every third wave (two from the twelfth). Of the types a game has
186
+ *
187
+ * @beta
188
+ */
189
+ function defaultWave(world, wave, minions) {
190
+ const { melee, ranged, siege } = minions;
191
+ const n = wave.number;
192
+ return [
193
+ ...Array(3 + Math.floor((n - 1) / 4)).fill(melee),
194
+ ...Array(2 + Math.floor((n - 1) / 6)).fill(ranged),
195
+ ...Array(siege && n % 3 === 0 ? 1 + Math.floor(n / 12) : 0).fill(siege ?? "")
196
+ ].filter((type) => world.registry.units.has(type));
197
+ }
198
+ /** The nearest structure of another team to a lane's far end, within reach of it: what a wave goes for once there */
199
+ function defaultGoal(world, minion, lane, from) {
200
+ const end = lane.points[from === 0 ? lane.points.length - 1 : 0];
201
+ let best;
202
+ let bestDistance = 576;
203
+ for (const entity of world.entities.values()) {
204
+ if (!entity.alive || !entity.isStructure || !world.areEnemies(entity.owner, minion.owner)) continue;
205
+ const d = distSq(entity.pos, end);
206
+ if (d < bestDistance) {
207
+ bestDistance = d;
208
+ best = entity;
209
+ }
210
+ }
211
+ return best ? {
212
+ x: best.pos.x,
213
+ z: best.pos.z
214
+ } : end;
215
+ }
216
+ /**
217
+ * Sends a spawner's next wave now, whatever its timer, as the game's lanes say (`LanesOptions`): for scripts, tests and debug tools. Its units come out by the
218
+ * spawner, walk the lane fighting what they meet (`attackPath`), then go for the goal at its far end. Gives back the
219
+ * units, none for a spawner on no lane
220
+ *
221
+ * @beta
222
+ */
223
+ function sendWave(world, spawner, options) {
224
+ for (const lane of lanesOf(world)) {
225
+ const from = lane.ends[0]?.spawner.id === spawner ? 0 : lane.ends[1]?.spawner.id === spawner ? 1 : void 0;
226
+ if (from === void 0) continue;
227
+ const end = lane.ends[from];
228
+ const state = world.state(lanesState);
229
+ const number = (state.waves[spawner] ?? 0) + 1;
230
+ state.waves[spawner] = number;
231
+ const wave = {
232
+ number,
233
+ lane,
234
+ from,
235
+ player: end.player
236
+ };
237
+ if (!options.wave && !options.minions) throw new Error("sendWave needs the wave (`wave`) or the unit types of its minions (`minions`)");
238
+ const types = options.wave ? options.wave(world, wave) : defaultWave(world, wave, options.minions);
239
+ const next = lane.points[from === 0 ? 1 : lane.points.length - 2] ?? end.at;
240
+ const length = hypot(next.x - end.at.x, next.z - end.at.z) || 1;
241
+ const ahead = {
242
+ x: (next.x - end.at.x) / length,
243
+ z: (next.z - end.at.z) / length
244
+ };
245
+ const units = types.map((type, i) => {
246
+ const row = Math.floor(i / 3);
247
+ const side = i % 3 - 1;
248
+ const at = {
249
+ x: end.at.x - ahead.x * row * 1.2 - ahead.z * side * 1.2,
250
+ z: end.at.z - ahead.z * row * 1.2 + ahead.x * side * 1.2
251
+ };
252
+ const unit = world.spawn(type, end.player, at, { facing: atan2(ahead.x, ahead.z) });
253
+ unit.set(laneMinion, {
254
+ lane: lane.path,
255
+ from
256
+ });
257
+ return unit;
258
+ });
259
+ if (!units.length) return units;
260
+ alongLane(world, units, lane, from, options);
261
+ return units;
262
+ }
263
+ return [];
264
+ }
265
+ /** Minions sent along their lane from where they are, the way they go (away from their end), then to the goal */
266
+ function alongLane(world, units, lane, from, options) {
267
+ const entities = units.map((unit) => unit.id);
268
+ const player = units[0].owner;
269
+ world.issue({
270
+ type: "order",
271
+ player,
272
+ entities,
273
+ order: {
274
+ type: "attackPath",
275
+ path: lane.path,
276
+ towards: from === 0 ? "last" : "first"
277
+ }
278
+ });
279
+ const goal = (options.goal ?? defaultGoal)(world, units[0], lane, from);
280
+ if (goal) world.issue({
281
+ type: "order",
282
+ player,
283
+ entities,
284
+ order: {
285
+ type: "attackMove",
286
+ point: goal
287
+ },
288
+ queue: true
289
+ });
290
+ }
291
+ /** How far a place is from a lane's line */
292
+ function offLane(lane, at) {
293
+ let best = Infinity;
294
+ const { points } = lane;
295
+ for (let i = 1; i < points.length; i++) {
296
+ const a = points[i - 1];
297
+ const dx = points[i].x - a.x;
298
+ const dz = points[i].z - a.z;
299
+ const length = dx * dx + dz * dz;
300
+ const t = length > 0 ? Math.min(Math.max(((at.x - a.x) * dx + (at.z - a.z) * dz) / length, 0), 1) : 0;
301
+ best = Math.min(best, hypot(at.x - (a.x + dx * t), at.z - (a.z + dz * t)));
302
+ }
303
+ return best;
304
+ }
305
+ /**
306
+ * How many waves a spawner has sent
307
+ *
308
+ * @beta
309
+ */
310
+ var wavesSent = (world, spawner) => world.state(lanesState).waves[spawner] ?? 0;
311
+ /**
312
+ * A game with lanes: its maps' lanes checked in the editor, and waves of minions sent along them from every spawner,
313
+ * the first `firstWave` seconds in and one every `every` seconds after, each from the `wave` of its number (see
314
+ * `LanesOptions`). What it adds goes with what the game has: its timers and components saved, its check after its own
315
+ *
316
+ * @beta
317
+ */
318
+ function lanesPack(options) {
319
+ if (!options.wave && !(options.minions?.melee && options.minions.ranged)) throw new Error("lanesPack needs the unit types of its waves (`minions: { melee, ranged }`) or a `wave` of its own");
320
+ if (options.cores === void 0) throw new Error("lanesPack needs to be told what the cores are (`cores`: a unit type's id, a test, or false)");
321
+ const firstWave = options.firstWave ?? 20;
322
+ const every = options.every ?? 30;
323
+ const waveDue = defineTimer({
324
+ id: "lanes.wave",
325
+ run: (world, data) => {
326
+ if (world.winner === null) sendWave(world, data.spawner, options);
327
+ }
328
+ });
329
+ const start = {
330
+ name: "lanes.start",
331
+ every: 15,
332
+ update(world) {
333
+ const state = world.state(lanesState);
334
+ if (state.started) return;
335
+ state.started = true;
336
+ for (const lane of lanesOf(world)) for (const end of lane.ends) if (end) world.timers.every(every, waveDue, {
337
+ first: firstWave,
338
+ data: { spawner: end.spawner.id }
339
+ });
340
+ }
341
+ };
342
+ const { hooks, listeners, systems } = towerRules(options);
343
+ return {
344
+ id: "lanes",
345
+ options,
346
+ components: [
347
+ laneMinion,
348
+ lanesState,
349
+ heroStrike
350
+ ],
351
+ timers: [waveDue],
352
+ systems: [start, ...systems],
353
+ hooks,
354
+ listeners,
355
+ ...options.cores !== false && { victory: coreVictory(coresOf(options.cores)) },
356
+ settings: (rules) => ({ supply: { of: (world, unit) => "has" in unit && unit.has(laneMinion) ? 0 : rules.supply.of(world, unit) } }),
357
+ check: (map) => checkLanes(map)
358
+ };
359
+ }
360
+ /**
361
+ * When a hero last hit a hero of another side, in seconds of the game's time: what the lane towers of the side it hit
362
+ * go for first, for a while (`LanesOptions.towerAggro`)
363
+ *
364
+ * @beta
365
+ */
366
+ var heroStrike = defineComponent({ id: "lanes.heroStrike" });
367
+ /** The engine's lane towers: structures that attack, other than cores */
368
+ var isTower = (world, entity, cores) => entity.isStructure && !!entity.def.attacks?.length && !(cores && coresOf(cores)(world, entity));
369
+ /** What the cores are, as a test of a unit: the unit type's id said, or the game's own test */
370
+ var coresOf = (cores) => typeof cores === "string" ? (_world, entity) => entity.def.id === cores : cores;
371
+ /**
372
+ * The rule of a lanes game: a side whose cores have all fallen is out, and the last side with a core wins. A side
373
+ * takes part once it has had a core
374
+ *
375
+ * @beta
376
+ */
377
+ function coreVictory(cores) {
378
+ return {
379
+ name: "victory",
380
+ phase: "cleanup",
381
+ every: 15,
382
+ update(world) {
383
+ if (world.winner !== null) return;
384
+ const standing = /* @__PURE__ */ new Set();
385
+ for (const entity of world.entities.values()) if (entity.alive && cores(world, entity)) standing.add(world.player(entity.owner).team);
386
+ const sides = /* @__PURE__ */ new Set();
387
+ for (const player of world.players.values()) {
388
+ if (player.neutral || player.creeps) continue;
389
+ if (standing.has(player.team)) player.established = true;
390
+ if (!player.established) continue;
391
+ sides.add(player.team);
392
+ if (!standing.has(player.team) && !player.defeated) defeat(world, player.id);
393
+ }
394
+ if (sides.size < 2 || standing.size !== 1) return;
395
+ const [winner] = standing;
396
+ world.winner = winner;
397
+ world.events.emit(gameOver, { winner });
398
+ }
399
+ };
400
+ }
401
+ /** The hooks and listeners of the lane towers: minions first, and a hero who hits one of theirs before that */
402
+ function towerRules(options) {
403
+ const towers = options.towers ?? ((world, entity) => isTower(world, entity, options.cores));
404
+ const aggro = options.towerAggro ?? 3;
405
+ const struckHero = (world, entity) => {
406
+ const strike = entity.get(heroStrike);
407
+ return !!strike && world.time - strike.at <= aggro;
408
+ };
409
+ const targetScore = defineHook({
410
+ hook: "targetScore",
411
+ id: "lanes.towers",
412
+ run(world, event) {
413
+ if (!towers(world, event.attacker)) return;
414
+ if (event.target.def.hero && struckHero(world, event.target)) event.score += 2e5;
415
+ else if (event.target.has(laneMinion)) event.score += 1e5;
416
+ }
417
+ });
418
+ const minions = options.minionAggro === false ? void 0 : {
419
+ radius: 7,
420
+ chase: 2.5,
421
+ leash: 10,
422
+ ...options.minionAggro
423
+ };
424
+ const heroHitHero = defineListener({
425
+ id: "lanes.heroHitHero",
426
+ event: damaged,
427
+ run(world, { target, source }) {
428
+ if (!source?.alive || !source.def.hero || !target.def.hero || !world.areEnemies(source.owner, target.owner)) return;
429
+ source.set(heroStrike, { at: world.time });
430
+ if (minions) {
431
+ const state = world.state(lanesState);
432
+ const turned = [];
433
+ for (const minion of world.spatial.query(target.pos.x, target.pos.z, minions.radius)) {
434
+ const lane = minion.get(laneMinion);
435
+ if (!lane || !minion.alive || lane.chase?.target === source.id || !world.areAllies(minion.owner, target.owner)) continue;
436
+ if (!world.isVisibleTo(source, world.player(minion.owner).team)) continue;
437
+ lane.chase = {
438
+ target: source.id,
439
+ until: world.time + minions.chase
440
+ };
441
+ turned.push(minion);
442
+ if (!(state.chasing ??= []).includes(minion.id)) state.chasing.push(minion.id);
443
+ }
444
+ for (const owner of new Set(turned.map((minion) => minion.owner))) {
445
+ const entities = turned.filter((minion) => minion.owner === owner).map((minion) => minion.id);
446
+ world.issue({
447
+ type: "order",
448
+ player: owner,
449
+ entities,
450
+ order: {
451
+ type: "attack",
452
+ target: source.id
453
+ }
454
+ });
455
+ }
456
+ }
457
+ for (const tower of world.spatial.query(source.pos.x, source.pos.z, 16)) {
458
+ if (!tower.alive || !tower.get(fighting) || !towers(world, tower) || !world.areAllies(tower.owner, target.owner)) continue;
459
+ const reach = world.settings.combat.acquisitionRange(world, tower) + tower.def.radius;
460
+ if (hypot(tower.pos.x - source.pos.x, tower.pos.z - source.pos.z) > reach) continue;
461
+ if (tower.get(fighting).autoTarget === source.id || !world.isVisibleTo(source, world.player(tower.owner).team)) continue;
462
+ disengage(world, tower);
463
+ engageWith(world, tower, source);
464
+ tower.get(fighting).autoTarget = source.id;
465
+ }
466
+ }
467
+ });
468
+ return {
469
+ hooks: [targetScore],
470
+ listeners: [heroHitHero],
471
+ systems: [{
472
+ name: "lanes.minions",
473
+ every: 6,
474
+ update(world) {
475
+ const state = world.state(lanesState);
476
+ if (!minions || !state.chasing?.length) return;
477
+ const lanes = lanesOf(world);
478
+ state.chasing = state.chasing.filter((id) => {
479
+ const minion = world.get(id);
480
+ const lane = minion?.get(laneMinion);
481
+ if (!minion?.alive || !lane?.chase) return false;
482
+ const path = lanes.find((each) => each.path === lane.lane);
483
+ const target = world.get(lane.chase.target);
484
+ if (!(world.time > lane.chase.until || !target?.alive || !world.isVisibleTo(target, world.player(minion.owner).team) || !!path && offLane(path, minion.pos) > minions.leash)) return true;
485
+ lane.chase = void 0;
486
+ if (path) alongLane(world, [minion], path, lane.from, options);
487
+ return false;
488
+ });
489
+ }
490
+ }]
491
+ };
492
+ }
493
+ //#endregion
494
+ export { LANE_END_REACH, LANE_SPAWNERS, LANE_SPAWNER_FIELDS, LANE_SPAWNER_KIND, checkLanes, coreVictory, defaultWave, heroStrike, laneMinion, lanesOf, lanesPack, lanesState, mapLanes, sendWave, wavesSent };
495
+
496
+ //# sourceMappingURL=lanes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lanes.js","names":[],"sources":["../src/lanes.ts"],"sourcesContent":["import { damaged, gameOver } from '#engine/engineEvents'\nimport { defineComponent } from './components'\nimport type { GamePack } from './packs/pack'\nimport { distSq } from './math'\nimport type { Entity } from './entity'\nimport { engageWith } from './engagement'\nimport { defineListener } from './events'\nimport { defineHook } from './hooks'\nimport { disengage } from './systems/combat'\nimport { defeat } from './systems/victory'\nimport type { GameMap, MapPath } from './map'\nimport { type MapFieldDef, type MapProblem, mapThings, type MapThing } from './mapFields'\nimport type { Vec2 } from './math'\nimport type { PlayerId } from './entity'\nimport type { System } from './registry'\nimport { defineTimer } from './timers'\nimport type { World } from './world'\nimport { atan2, hypot } from './exactMath'\nimport { fighting } from './entity'\n\n/*\n * Lanes (features-plan D): the roads of a MOBA, along which each side's waves of minions walk to the other's base,\n * fighting what they meet. A lane is one of the map's paths (`MapPath`) with a spawner at each end, of two sides: where\n * each side's waves come out. A spawner is a thing of the map's (`MapThing`, kind `lanes.spawners`), of a player, on\n * one lane: the editor puts them down (`LANE_SPAWNER_KIND`), and checks every lane has its two (`checkLanes`)\n */\n\n/**\n * The kind of thing a spawner is: where it is kept in the map's data, by this id\n *\n * @beta\n */\nexport const LANE_SPAWNERS = 'lanes.spawners'\n\n/**\n * How near the end of its lane a spawner is to be that end's: in cells\n *\n * @internal\n */\nexport const LANE_END_REACH = 6\n\n/**\n * The fields of a spawner: whose waves come out of it, and the lane they walk\n *\n * @internal\n */\nexport const LANE_SPAWNER_FIELDS: Omit<MapFieldDef, 'for'>[] = [\n\t{ id: 'player', name: 'Player', kind: 'player', default: 1, hint: 'Whose waves come out of it' },\n\t{ id: 'lane', name: 'Lane', kind: 'path', hint: 'The path its waves walk, from the end it stands at to the other' }\n]\n\n/**\n * A spawner as the editor offers it (a `MapKindDef` of `@v12-engine/client`): its tool, its fields, a ring at each, in\n * the scene's `kinds`\n *\n * @beta\n */\nexport const LANE_SPAWNER_KIND = {\n\tid: LANE_SPAWNERS,\n\tname: 'Spawner',\n\tplural: 'Spawners',\n\thint: 'Where a side’s waves of minions come out, at one end of a lane: its player, and the path it is the end of',\n\ticon: 'tool.circle',\n\tcolor: [0.95, 0.75, 0.25] as [number, number, number],\n\tfields: LANE_SPAWNER_FIELDS,\n\treach: LANE_END_REACH / 2\n}\n\n/**\n * A lane, as the rules read it: the path, and its two ends, each with the spawner of the side whose waves start there\n *\n * @beta\n */\nexport interface Lane {\n\t/** The name of its path (`world.map.path(name)`), what orders that follow it are given */\n\tpath: string\n\t/** The points of the lane's path, in order from its first end to its last */\n\tpoints: readonly Vec2[]\n\t/** Its spawners, by the end of the lane they are at: the first point's, then the last's. Either is missing on a map not finished */\n\tends: [LaneEnd | undefined, LaneEnd | undefined]\n}\n\n/**\n * One end of a lane: the spawner there, and whose\n *\n * @beta\n */\nexport interface LaneEnd {\n\t/** The map's spawner object at this end of the lane */\n\tspawner: MapThing\n\t/** The player whose waves start at this end */\n\tplayer: PlayerId\n\t/** The point the spawner stands at */\n\tat: Vec2\n}\n\n/** The path a spawner is on, by the id its field keeps */\nconst pathOf = (paths: readonly MapPath[], spawner: MapThing): MapPath | undefined => {\n\tconst id = spawner.data?.lane\n\treturn typeof id === 'number' ? paths.find((path) => path.id === id) : typeof id === 'string' ? paths.find((path) => path.name === id) : undefined\n}\n\n/** Which end of a path a place is at: 0 the first point's, 1 the last's, or none when it is near neither */\nfunction endOf(path: MapPath, at: Vec2): 0 | 1 | undefined {\n\tconst first = path.points[0]\n\tconst last = path.points[path.points.length - 1]\n\tif (!first || !last) return undefined\n\tconst d0 = hypot(at.x - first.x, at.z - first.z)\n\tconst d1 = hypot(at.x - last.x, at.z - last.z)\n\tif (Math.min(d0, d1) > LANE_END_REACH) return undefined\n\treturn d0 <= d1 ? 0 : 1\n}\n\n/**\n * The lanes of a map: every path a spawner is on, with what stands at each end\n *\n * @beta\n */\nexport function mapLanes(map: { paths: readonly MapPath[]; data: Record<string, unknown> }): Lane[] {\n\tconst lanes = new Map<number, Lane>()\n\tfor (const spawner of mapThings(map, LANE_SPAWNERS)) {\n\t\tconst path = pathOf(map.paths, spawner)\n\t\tif (!path) continue\n\t\tlet lane = lanes.get(path.id)\n\t\tif (!lane) lanes.set(path.id, (lane = { path: path.name, points: path.points, ends: [undefined, undefined] }))\n\t\tconst end = endOf(path, spawner)\n\t\tif (end === undefined) continue\n\t\tlane.ends[end] = { spawner, player: Number(spawner.data?.player ?? 1), at: { x: spawner.x, z: spawner.z } }\n\t}\n\treturn [...lanes.values()]\n}\n\n/**\n * The lanes of a world's map (`mapLanes`): what waves walk\n *\n * @beta\n */\nexport const lanesOf = (world: World): Lane[] => mapLanes({ paths: world.map.paths, data: world.map.data })\n\n/**\n * What is wrong with the lanes of a map, for the editor's checks (`MapEditorDef.check`): a spawner on no lane or away\n * from its ends, a lane without a spawner at each end, or with the same side at both\n *\n * @beta\n */\nexport function checkLanes(map: GameMap): MapProblem[] {\n\tconst problems: MapProblem[] = []\n\tconst teamOf = (player: number) => map.players.find((each) => each.id === player)?.team ?? player\n\tfor (const spawner of mapThings(map, LANE_SPAWNERS)) {\n\t\tconst path = pathOf(map.paths, spawner)\n\t\tconst about = { thing: spawner.id, kind: LANE_SPAWNERS }\n\t\tif (!path)\n\t\t\tproblems.push({ message: 'A spawner is on no lane: pick the path its waves walk', error: true, rule: 'lanes.spawner', at: spawner, about })\n\t\telse if (endOf(path, spawner) === undefined)\n\t\t\tproblems.push({ message: `A spawner of \"${path.name}\" is at neither end of it`, error: true, rule: 'lanes.spawner', at: spawner, about })\n\t}\n\tfor (const lane of mapLanes(map)) {\n\t\tconst path = map.paths.find((each) => each.name === lane.path)!\n\t\tconst about = { path: path.id }\n\t\tconst [first, last] = lane.ends\n\t\tif (!first || !last) {\n\t\t\tconst missing = !first ? path.points[0] : path.points[path.points.length - 1]\n\t\t\tproblems.push({\n\t\t\t\tmessage: `The lane \"${lane.path}\" has no spawner at one end: its waves start at both`,\n\t\t\t\terror: true,\n\t\t\t\trule: 'lanes.ends',\n\t\t\t\tat: missing,\n\t\t\t\tabout\n\t\t\t})\n\t\t} else if (teamOf(first.player) === teamOf(last.player))\n\t\t\tproblems.push({ message: `The lane \"${lane.path}\" has the same side at both ends`, error: true, rule: 'lanes.sides', at: first.at, about })\n\t}\n\treturn problems\n}\n\n// ---- waves (features-plan D2)\n\n/**\n * A wave about to come out of a spawner: which of that spawner's it is (1 and up), the lane and the end it walks from,\n * and whose. What `LanesOptions.wave` makes the units of\n *\n * @beta\n */\nexport interface LaneWave {\n\t/** The wave's number at its spawner, counting from 1 */\n\tnumber: number\n\t/** The lane the wave walks */\n\tlane: Lane\n\t/** Which end of the lane it starts from: 0 the first point's, 1 the last's */\n\tfrom: 0 | 1\n\t/** The player whose wave it is */\n\tplayer: PlayerId\n}\n\n/**\n * What a game's lanes do (`lanesPack`). Every part has the engine's own when left out\n *\n * @beta\n */\nexport interface LanesOptions {\n\t/**\n\t * The unit types of the engine's waves, by role: three to five close, two or three that shoot, a siege now and then\n\t * (`melee` and `ranged` are needed, `siege` is left out of the waves when it is). The engine names none: a game that\n\t * gives no `wave` of its own says these\n\t */\n\tminions?: { melee: string; ranged: string; siege?: string }\n\t/** The unit types of a wave, in the order they come out: the engine's grow with time, from `minions` */\n\twave?: (world: World, wave: LaneWave) => string[]\n\t/** Seconds from the start to the first wave, and between waves: 20 and 30 when left out */\n\tfirstWave?: number\n\t/** Seconds between one wave and the next; 30 when left out */\n\tevery?: number\n\t/**\n\t * Where a minion goes once it is at the far end of its lane, fighting on the way: the nearest structure of another\n\t * team to that end when left out (their core), the end itself when there is none\n\t */\n\tgoal?: (world: World, minion: Entity, lane: Lane, from: 0 | 1) => Vec2 | undefined\n\t/**\n\t * What the lane towers are: they hit minions before anything else, and a hero who hits a hero of their side within\n\t * their reach before minions (as in a MOBA). Structures that attack, other than cores, when left out\n\t */\n\ttowers?: (world: World, entity: Entity) => boolean\n\t/**\n\t * What the cores are: the unit type's id, or a test of a unit. A side whose cores have all fallen has lost, and the\n\t * last side with one wins. Said by the game (the engine names none); `false` keeps the game's own way of winning\n\t * (`Rules.victory`)\n\t */\n\tcores: string | ((world: World, entity: Entity) => boolean) | false\n\t/** Seconds a hero who hit a hero is the towers' first target for: 3 when left out */\n\ttowerAggro?: number\n\t/**\n\t * Minions turn on a hero who hits a hero of their side near them (within `radius` cells of it), chase it for `chase`\n\t * seconds at most and no further than `leash` cells from their lane, then go back to it the way they were going:\n\t * 7, 2.5 and 10 when left out. `false` for minions that keep to their lane\n\t */\n\tminionAggro?: { radius?: number; chase?: number; leash?: number } | false\n}\n\n/**\n * A minion of a lane: the lane it walks (its path's name), from which end. On every unit a wave brings\n *\n * @beta\n */\nexport const laneMinion = defineComponent<{ lane: string; from: 0 | 1; chase?: { target: number; until: number } }>({ id: 'lanes.minion' })\n\n/** How many waves each spawner has sent, by its id, and whether the waves were set going */\nexport const lanesState = defineComponent<{ started: boolean; waves: Record<string, number>; chasing?: number[] }>({ id: 'lanes.state', default: () => ({ started: false, waves: {} }) })\n\n/**\n * The engine's waves: three close and two that shoot, one more close every fourth wave and one more that shoots every\n * sixth, a siege every third wave (two from the twelfth). Of the types a game has\n *\n * @beta\n */\nexport function defaultWave(world: World, wave: LaneWave, minions: NonNullable<LanesOptions['minions']>): string[] {\n\tconst { melee, ranged, siege } = minions\n\tconst n = wave.number\n\tconst types = [\n\t\t...Array<string>(3 + Math.floor((n - 1) / 4)).fill(melee),\n\t\t...Array<string>(2 + Math.floor((n - 1) / 6)).fill(ranged),\n\t\t...Array<string>(siege && n % 3 === 0 ? 1 + Math.floor(n / 12) : 0).fill(siege ?? '')\n\t]\n\treturn types.filter((type) => world.registry.units.has(type))\n}\n\n/** The nearest structure of another team to a lane's far end, within reach of it: what a wave goes for once there */\nfunction defaultGoal(world: World, minion: Entity, lane: Lane, from: 0 | 1): Vec2 | undefined {\n\tconst end = lane.points[from === 0 ? lane.points.length - 1 : 0]\n\tlet best: Entity | undefined\n\tlet bestDistance = 24 * 24\n\tfor (const entity of world.entities.values()) {\n\t\tif (!entity.alive || !entity.isStructure || !world.areEnemies(entity.owner, minion.owner)) continue\n\t\tconst d = distSq(entity.pos, end)\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 } : end\n}\n\n/**\n * Sends a spawner's next wave now, whatever its timer, as the game's lanes say (`LanesOptions`): for scripts, tests and debug tools. Its units come out by the\n * spawner, walk the lane fighting what they meet (`attackPath`), then go for the goal at its far end. Gives back the\n * units, none for a spawner on no lane\n *\n * @beta\n */\nexport function sendWave(world: World, spawner: number, options: Partial<LanesOptions>): Entity[] {\n\tfor (const lane of lanesOf(world)) {\n\t\tconst from = lane.ends[0]?.spawner.id === spawner ? 0 : lane.ends[1]?.spawner.id === spawner ? 1 : undefined\n\t\tif (from === undefined) continue\n\t\tconst end = lane.ends[from]!\n\t\tconst state = world.state(lanesState)\n\t\tconst number = (state.waves[spawner] ?? 0) + 1\n\t\tstate.waves[spawner] = number\n\t\tconst wave: LaneWave = { number, lane, from, player: end.player }\n\t\tif (!options.wave && !options.minions) throw new Error('sendWave needs the wave (`wave`) or the unit types of its minions (`minions`)')\n\t\tconst types = options.wave ? options.wave(world, wave) : defaultWave(world, wave, options.minions!)\n\t\t// in a block behind the spawner, along the lane: the first out in front\n\t\tconst next = lane.points[from === 0 ? 1 : lane.points.length - 2] ?? end.at\n\t\tconst length = hypot(next.x - end.at.x, next.z - end.at.z) || 1\n\t\tconst ahead = { x: (next.x - end.at.x) / length, z: (next.z - end.at.z) / length }\n\t\tconst units = types.map((type, i) => {\n\t\t\tconst row = Math.floor(i / 3)\n\t\t\tconst side = (i % 3) - 1\n\t\t\tconst at = { x: end.at.x - ahead.x * row * 1.2 - ahead.z * side * 1.2, z: end.at.z - ahead.z * row * 1.2 + ahead.x * side * 1.2 }\n\t\t\tconst unit = world.spawn(type, end.player, at, { facing: atan2(ahead.x, ahead.z) })\n\t\t\tunit.set(laneMinion, { lane: lane.path, from })\n\t\t\treturn unit\n\t\t})\n\t\tif (!units.length) return units\n\t\talongLane(world, units, lane, from, options)\n\t\treturn units\n\t}\n\treturn []\n}\n\n/** Minions sent along their lane from where they are, the way they go (away from their end), then to the goal */\nfunction alongLane(world: World, units: Entity[], lane: Lane, from: 0 | 1, options: Partial<LanesOptions>): void {\n\tconst entities = units.map((unit) => unit.id)\n\tconst player = units[0].owner\n\tworld.issue({ type: 'order', player, entities, order: { type: 'attackPath', path: lane.path, towards: from === 0 ? 'last' : 'first' } })\n\tconst goal = (options.goal ?? defaultGoal)(world, units[0], lane, from)\n\tif (goal) world.issue({ type: 'order', player, entities, order: { type: 'attackMove', point: goal }, queue: true })\n}\n\n/** How far a place is from a lane's line */\nfunction offLane(lane: Lane, at: Vec2): number {\n\tlet best = Infinity\n\tconst { points } = lane\n\tfor (let i = 1; i < points.length; i++) {\n\t\tconst a = points[i - 1]\n\t\tconst dx = points[i].x - a.x\n\t\tconst dz = points[i].z - a.z\n\t\tconst length = dx * dx + dz * dz\n\t\tconst t = length > 0 ? Math.min(Math.max(((at.x - a.x) * dx + (at.z - a.z) * dz) / length, 0), 1) : 0\n\t\tbest = Math.min(best, hypot(at.x - (a.x + dx * t), at.z - (a.z + dz * t)))\n\t}\n\treturn best\n}\n\n/**\n * How many waves a spawner has sent\n *\n * @beta\n */\nexport const wavesSent = (world: World, spawner: number): number => world.state(lanesState).waves[spawner] ?? 0\n\n/**\n * A game with lanes: its maps' lanes checked in the editor, and waves of minions sent along them from every spawner,\n * the first `firstWave` seconds in and one every `every` seconds after, each from the `wave` of its number (see\n * `LanesOptions`). What it adds goes with what the game has: its timers and components saved, its check after its own\n *\n * @beta\n */\nexport function lanesPack(options: LanesOptions): GamePack {\n\t// the engine names no unit type: the game says what its minions and its cores are\n\tif (!options.wave && !(options.minions?.melee && options.minions.ranged))\n\t\tthrow new Error('lanesPack needs the unit types of its waves (`minions: { melee, ranged }`) or a `wave` of its own')\n\tif (options.cores === undefined) throw new Error(\"lanesPack needs to be told what the cores are (`cores`: a unit type's id, a test, or false)\")\n\tconst firstWave = options.firstWave ?? 20\n\tconst every = options.every ?? 30\n\tconst waveDue = defineTimer<{ spawner: number }>({ id: 'lanes.wave', run: (world, data) => {\n\t\tif (world.winner === null) sendWave(world, data.spawner, options)\n\t} })\n\t// the waves are set going once, as the game starts: a timer for every spawner, saved with the game from then on\n\tconst start: System = {\n\t\tname: 'lanes.start',\n\t\tevery: 15,\n\t\tupdate(world) {\n\t\t\tconst state = world.state(lanesState)\n\t\t\tif (state.started) return\n\t\t\tstate.started = true\n\t\t\tfor (const lane of lanesOf(world)) {\n\t\t\t\tfor (const end of lane.ends) if (end) world.timers.every(every, waveDue, { first: firstWave, data: { spawner: end.spawner.id } })\n\t\t\t}\n\t\t}\n\t}\n\tconst { hooks, listeners, systems } = towerRules(options)\n\treturn {\n\t\tid: 'lanes',\n\t\toptions,\n\t\tcomponents: [laneMinion, lanesState, heroStrike],\n\t\ttimers: [waveDue],\n\t\tsystems: [start, ...systems],\n\t\thooks,\n\t\tlisteners,\n\t\t...(options.cores !== false && { victory: coreVictory(coresOf(options.cores)) }),\n\t\t// minions are the lanes', not a player's army: they take no supply; the rest what the game says\n\t\tsettings: (rules) => ({ supply: { of: (world, unit) => ('has' in unit && unit.has(laneMinion) ? 0 : rules.supply.of(world, unit)) } }),\n\t\tcheck: (map) => checkLanes(map)\n\t}\n}\n\n// ---- towers and cores (features-plan D3)\n\n/**\n * When a hero last hit a hero of another side, in seconds of the game's time: what the lane towers of the side it hit\n * go for first, for a while (`LanesOptions.towerAggro`)\n *\n * @beta\n */\nexport const heroStrike = defineComponent<{ at: number }>({ id: 'lanes.heroStrike' })\n\n/** The engine's lane towers: structures that attack, other than cores */\nconst isTower = (world: World, entity: Entity, cores: LanesOptions['cores']) =>\n\tentity.isStructure && !!entity.def.attacks?.length && !(cores && coresOf(cores)(world, entity))\n\n/** What the cores are, as a test of a unit: the unit type's id said, or the game's own test */\nconst coresOf = (cores: string | ((world: World, entity: Entity) => boolean)): ((world: World, entity: Entity) => boolean) =>\n\ttypeof cores === 'string' ? (_world, entity) => entity.def.id === cores : cores\n\n/**\n * The rule of a lanes game: a side whose cores have all fallen is out, and the last side with a core wins. A side\n * takes part once it has had a core\n *\n * @beta\n */\nexport function coreVictory(cores: (world: World, entity: Entity) => boolean): System {\n\treturn {\n\t\tname: 'victory',\n\t\tphase: 'cleanup',\n\t\tevery: 15,\n\t\tupdate(world) {\n\t\t\tif (world.winner !== null) return\n\t\t\tconst standing = new Set<number>()\n\t\t\tfor (const entity of world.entities.values()) if (entity.alive && cores(world, entity)) standing.add(world.player(entity.owner).team)\n\t\t\tconst sides = new Set<number>()\n\t\t\tfor (const player of world.players.values()) {\n\t\t\t\tif (player.neutral || player.creeps) continue\n\t\t\t\tif (standing.has(player.team)) player.established = true\n\t\t\t\tif (!player.established) continue\n\t\t\t\tsides.add(player.team)\n\t\t\t\tif (!standing.has(player.team) && !player.defeated) defeat(world, player.id)\n\t\t\t}\n\t\t\tif (sides.size < 2 || standing.size !== 1) return\n\t\t\tconst [winner] = standing\n\t\t\tworld.winner = winner\n\t\t\tworld.events.emit(gameOver, { winner })\n\t\t}\n\t}\n}\n\n/** The hooks and listeners of the lane towers: minions first, and a hero who hits one of theirs before that */\nfunction towerRules(options: LanesOptions) {\n\tconst towers = options.towers ?? ((world: World, entity: Entity) => isTower(world, entity, options.cores))\n\tconst aggro = options.towerAggro ?? 3\n\tconst struckHero = (world: World, entity: Entity) => {\n\t\tconst strike = entity.get(heroStrike)\n\t\treturn !!strike && world.time - strike.at <= aggro\n\t}\n\tconst targetScore = defineHook({\n\t\thook: 'targetScore',\n\t\tid: 'lanes.towers',\n\t\trun(world, event) {\n\t\t\tif (!towers(world, event.attacker)) return\n\t\t\tif (event.target.def.hero && struckHero(world, event.target)) event.score += 200_000\n\t\t\telse if (event.target.has(laneMinion)) event.score += 100_000\n\t\t}\n\t})\n\tconst minions = options.minionAggro === false ? undefined : { radius: 7, chase: 2.5, leash: 10, ...options.minionAggro }\n\t// a hero hit one: the towers of that side within reach of the one who hit turn on it at once, and its minions near\n\tconst heroHitHero = defineListener({\n\t\tid: 'lanes.heroHitHero',\n\t\tevent: damaged,\n\t\trun(world, { target, source }) {\n\t\t\tif (!source?.alive || !source.def.hero || !target.def.hero || !world.areEnemies(source.owner, target.owner)) return\n\t\t\tsource.set(heroStrike, { at: world.time })\n\t\t\tif (minions) {\n\t\t\t\tconst state = world.state(lanesState)\n\t\t\t\tconst turned: Entity[] = []\n\t\t\t\tfor (const minion of world.spatial.query(target.pos.x, target.pos.z, minions.radius)) {\n\t\t\t\t\tconst lane = minion.get(laneMinion)\n\t\t\t\t\tif (!lane || !minion.alive || lane.chase?.target === source.id || !world.areAllies(minion.owner, target.owner)) continue\n\t\t\t\t\tif (!world.isVisibleTo(source, world.player(minion.owner).team)) continue\n\t\t\t\t\tlane.chase = { target: source.id, until: world.time + minions.chase }\n\t\t\t\t\tturned.push(minion)\n\t\t\t\t\tif (!(state.chasing ??= []).includes(minion.id)) state.chasing.push(minion.id)\n\t\t\t\t}\n\t\t\t\tfor (const owner of new Set(turned.map((minion) => minion.owner))) {\n\t\t\t\t\tconst entities = turned.filter((minion) => minion.owner === owner).map((minion) => minion.id)\n\t\t\t\t\tworld.issue({ type: 'order', player: owner, entities, order: { type: 'attack', target: source.id } })\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor (const tower of world.spatial.query(source.pos.x, source.pos.z, 16)) {\n\t\t\t\tif (!tower.alive || !tower.get(fighting) || !towers(world, tower) || !world.areAllies(tower.owner, target.owner)) continue\n\t\t\t\tconst reach = world.settings.combat.acquisitionRange(world, tower) + tower.def.radius\n\t\t\t\tif (hypot(tower.pos.x - source.pos.x, tower.pos.z - source.pos.z) > reach) continue\n\t\t\t\tif (tower.get(fighting)!.autoTarget === source.id || !world.isVisibleTo(source, world.player(tower.owner).team)) continue\n\t\t\t\tdisengage(world, tower)\n\t\t\t\tengageWith(world, tower, source)\n\t\t\t\ttower.get(fighting)!.autoTarget = source.id\n\t\t\t}\n\t\t}\n\t})\n\t// minions done chasing go back to their lane: the time is up, what they chased is gone, or they went too far from it\n\tconst back: System = {\n\t\tname: 'lanes.minions',\n\t\tevery: 6,\n\t\tupdate(world) {\n\t\t\tconst state = world.state(lanesState)\n\t\t\tif (!minions || !state.chasing?.length) return\n\t\t\tconst lanes = lanesOf(world)\n\t\t\tstate.chasing = state.chasing.filter((id) => {\n\t\t\t\tconst minion = world.get(id)\n\t\t\t\tconst lane = minion?.get(laneMinion)\n\t\t\t\tif (!minion?.alive || !lane?.chase) return false\n\t\t\t\tconst path = lanes.find((each) => each.path === lane.lane)\n\t\t\t\tconst target = world.get(lane.chase.target)\n\t\t\t\tconst done =\n\t\t\t\t\tworld.time > lane.chase.until ||\n\t\t\t\t\t!target?.alive ||\n\t\t\t\t\t!world.isVisibleTo(target, world.player(minion.owner).team) ||\n\t\t\t\t\t(!!path && offLane(path, minion.pos) > minions.leash)\n\t\t\t\tif (!done) return true\n\t\t\t\tlane.chase = undefined\n\t\t\t\tif (path) alongLane(world, [minion], path, lane.from, options)\n\t\t\t\treturn false\n\t\t\t})\n\t\t}\n\t}\n\treturn { hooks: [targetScore], listeners: [heroHitHero], systems: [back] }\n}\n"],"mappings":"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"}
package/dist/life.d.ts CHANGED
@@ -13,12 +13,16 @@ export declare class Life {
13
13
  /**
14
14
  * Deals damage. In order:
15
15
  * 1. the `beforeDamage` hook, which can change the amount or call it off;
16
- * 2. armor or magic resist, then shields, take their part;
16
+ * 2. armor or magic resist take their part, then the damage is made more or less (`incomingDamage`, `outgoingDamage`:
17
+ * `RuleSettings.combat.damageScale`), and shields take theirs;
17
18
  * 3. the rest comes off the target's health, and it dies when nothing is left (see `kill`);
18
19
  * 4. the `afterDamage` hook, for what follows from a hit: life steal, effects on hit.
19
20
  */
20
21
  damage(target: Entity, amount: number, source?: Entity, options?: DamageOptions): void;
21
- /** Gives health back, after the `beforeHeal` hook had its say. Returns how much of it was needed */
22
+ /**
23
+ * Gives health back, made more or less by what the target gets of it (`incomingHealing`:
24
+ * `RuleSettings.combat.healingScale`), then after the `beforeHeal` hook had its say. Returns how much of it was needed
25
+ */
22
26
  heal(target: Entity, amount: number, source?: Entity): number;
23
27
  /**
24
28
  * Kills an entity by the rules, not by damage: felled, cancelled, run out of time. `attack` says that an attack of