@v12-engine/engine 0.1.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (951) hide show
  1. package/dist/abilities/amounts.d.ts +28 -0
  2. package/dist/abilities/amounts.js +74 -0
  3. package/dist/abilities/amounts.js.map +1 -0
  4. package/dist/abilities/buffs.d.ts +106 -6
  5. package/dist/abilities/buffs.js +443 -0
  6. package/dist/abilities/buffs.js.map +1 -0
  7. package/dist/abilities/castTold.d.ts +2 -0
  8. package/dist/abilities/castTold.js +66 -0
  9. package/dist/abilities/castTold.js.map +1 -0
  10. package/dist/abilities/chance.d.ts +38 -0
  11. package/dist/abilities/chance.js +77 -0
  12. package/dist/abilities/chance.js.map +1 -0
  13. package/dist/abilities/charges.d.ts +18 -0
  14. package/dist/abilities/charges.js +101 -0
  15. package/dist/abilities/charges.js.map +1 -0
  16. package/dist/abilities/control.d.ts +28 -0
  17. package/dist/abilities/control.js +113 -0
  18. package/dist/abilities/control.js.map +1 -0
  19. package/dist/abilities/dispel.js +51 -0
  20. package/dist/abilities/dispel.js.map +1 -0
  21. package/dist/abilities/effectFields.d.ts +1 -1
  22. package/dist/abilities/effectFields.js +676 -0
  23. package/dist/abilities/effectFields.js.map +1 -0
  24. package/dist/abilities/effectIndex.d.ts +27 -0
  25. package/dist/abilities/effectIndex.js +64 -0
  26. package/dist/abilities/effectIndex.js.map +1 -0
  27. package/dist/abilities/effects/buff.d.ts +9 -3
  28. package/dist/abilities/effects/buff.js +84 -0
  29. package/dist/abilities/effects/buff.js.map +1 -0
  30. package/dist/abilities/effects/conditions.d.ts +2 -0
  31. package/dist/abilities/effects/conditions.js +41 -0
  32. package/dist/abilities/effects/conditions.js.map +1 -0
  33. package/dist/abilities/effects/core.js +54 -0
  34. package/dist/abilities/effects/core.js.map +1 -0
  35. package/dist/abilities/effects/damage.d.ts +1 -1
  36. package/dist/abilities/effects/damage.js +43 -0
  37. package/dist/abilities/effects/damage.js.map +1 -0
  38. package/dist/abilities/effects/heal.d.ts +2 -2
  39. package/dist/abilities/effects/heal.js +51 -0
  40. package/dist/abilities/effects/heal.js.map +1 -0
  41. package/dist/abilities/effects/missile.d.ts +13 -1
  42. package/dist/abilities/effects/missile.js +104 -0
  43. package/dist/abilities/effects/missile.js.map +1 -0
  44. package/dist/abilities/effects/morph.d.ts +5 -0
  45. package/dist/abilities/effects/morph.js +43 -0
  46. package/dist/abilities/effects/morph.js.map +1 -0
  47. package/dist/abilities/effects/moves.d.ts +16 -4
  48. package/dist/abilities/effects/moves.js +212 -0
  49. package/dist/abilities/effects/moves.js.map +1 -0
  50. package/dist/abilities/effects/passives.d.ts +19 -9
  51. package/dist/abilities/effects/passives.js +131 -0
  52. package/dist/abilities/effects/passives.js.map +1 -0
  53. package/dist/abilities/effects/proxy.d.ts +5 -0
  54. package/dist/abilities/effects/proxy.js +60 -0
  55. package/dist/abilities/effects/proxy.js.map +1 -0
  56. package/dist/abilities/effects/sight.d.ts +2 -2
  57. package/dist/abilities/effects/sight.js +39 -0
  58. package/dist/abilities/effects/sight.js.map +1 -0
  59. package/dist/abilities/effects/spawn.d.ts +5 -2
  60. package/dist/abilities/effects/spawn.js +40 -0
  61. package/dist/abilities/effects/spawn.js.map +1 -0
  62. package/dist/abilities/effects/timed.d.ts +2 -2
  63. package/dist/abilities/effects/timed.js +96 -0
  64. package/dist/abilities/effects/timed.js.map +1 -0
  65. package/dist/abilities/effects/trade.d.ts +1 -1
  66. package/dist/abilities/effects/trade.js +25 -0
  67. package/dist/abilities/effects/trade.js.map +1 -0
  68. package/dist/abilities/effects.d.ts +97 -23
  69. package/dist/abilities/effects.js +860 -0
  70. package/dist/abilities/effects.js.map +1 -0
  71. package/dist/abilities/land.d.ts +38 -4
  72. package/dist/abilities/land.js +189 -0
  73. package/dist/abilities/land.js.map +1 -0
  74. package/dist/abilities/recast.d.ts +45 -0
  75. package/dist/abilities/recast.js +118 -0
  76. package/dist/abilities/recast.js.map +1 -0
  77. package/dist/abilities/scaled.js +40 -0
  78. package/dist/abilities/scaled.js.map +1 -0
  79. package/dist/abilities/screen.d.ts +6 -0
  80. package/dist/abilities/screen.js +83 -0
  81. package/dist/abilities/screen.js.map +1 -0
  82. package/dist/abilities/shapes.d.ts +66 -0
  83. package/dist/abilities/shapes.js +122 -0
  84. package/dist/abilities/shapes.js.map +1 -0
  85. package/dist/abilities/text.d.ts +14 -2
  86. package/dist/abilities/text.js +204 -0
  87. package/dist/abilities/text.js.map +1 -0
  88. package/dist/abilities/triggers.d.ts +98 -0
  89. package/dist/abilities/triggers.js +351 -0
  90. package/dist/abilities/triggers.js.map +1 -0
  91. package/dist/abilityChanges.d.ts +131 -0
  92. package/dist/abilityChanges.js +345 -0
  93. package/dist/abilityChanges.js.map +1 -0
  94. package/dist/ai/area.d.ts +4 -1
  95. package/dist/ai/brain.d.ts +4 -1
  96. package/dist/ai/brain.js +844 -0
  97. package/dist/ai/brain.js.map +1 -0
  98. package/dist/ai/budget.js +74 -0
  99. package/dist/ai/budget.js.map +1 -0
  100. package/dist/ai/checks.d.ts +9 -1
  101. package/dist/ai/checks.js +242 -0
  102. package/dist/ai/checks.js.map +1 -0
  103. package/dist/ai/computer.d.ts +11 -4
  104. package/dist/ai/computer.js +251 -0
  105. package/dist/ai/computer.js.map +1 -0
  106. package/dist/ai/defence.d.ts +4 -0
  107. package/dist/ai/defence.js +430 -0
  108. package/dist/ai/defence.js.map +1 -0
  109. package/dist/ai/define.d.ts +3 -2
  110. package/dist/ai/define.js +31 -0
  111. package/dist/ai/define.js.map +1 -0
  112. package/dist/ai/economy.d.ts +10 -7
  113. package/dist/ai/economy.js +780 -0
  114. package/dist/ai/economy.js.map +1 -0
  115. package/dist/ai/geometry.js +38 -0
  116. package/dist/ai/geometry.js.map +1 -0
  117. package/dist/ai/goals.d.ts +1 -0
  118. package/dist/ai/goals.js +560 -0
  119. package/dist/ai/goals.js.map +1 -0
  120. package/dist/ai/knowledge.d.ts +72 -7
  121. package/dist/ai/knowledge.js +804 -0
  122. package/dist/ai/knowledge.js.map +1 -0
  123. package/dist/ai/lanes.d.ts +10 -2
  124. package/dist/ai/lanes.js +715 -0
  125. package/dist/ai/lanes.js.map +1 -0
  126. package/dist/ai/melee/build.js +264 -0
  127. package/dist/ai/melee/build.js.map +1 -0
  128. package/dist/ai/melee/goals.d.ts +7 -0
  129. package/dist/ai/melee/goals.js +720 -0
  130. package/dist/ai/melee/goals.js.map +1 -0
  131. package/dist/ai/melee/heroes.js +68 -0
  132. package/dist/ai/melee/heroes.js.map +1 -0
  133. package/dist/ai/melee/index.d.ts +1 -1
  134. package/dist/ai/melee/index.js +51 -0
  135. package/dist/ai/melee/index.js.map +1 -0
  136. package/dist/ai/melee/production.js +29 -0
  137. package/dist/ai/melee/production.js.map +1 -0
  138. package/dist/ai/melee/surrender.js +64 -0
  139. package/dist/ai/melee/surrender.js.map +1 -0
  140. package/dist/ai/micro.d.ts +9 -0
  141. package/dist/ai/micro.js +1316 -0
  142. package/dist/ai/micro.js.map +1 -0
  143. package/dist/ai/mission.d.ts +9 -2
  144. package/dist/ai/mission.js +538 -0
  145. package/dist/ai/mission.js.map +1 -0
  146. package/dist/ai/missionRules.d.ts +1 -1
  147. package/dist/ai/missionRules.js +26 -0
  148. package/dist/ai/missionRules.js.map +1 -0
  149. package/dist/ai/module.d.ts +6 -2
  150. package/dist/ai/module.js +37 -0
  151. package/dist/ai/module.js.map +1 -0
  152. package/dist/ai/options.d.ts +3 -3
  153. package/dist/ai/plans/build.d.ts +20 -1
  154. package/dist/ai/plans/build.js +608 -0
  155. package/dist/ai/plans/build.js.map +1 -0
  156. package/dist/ai/plans/placement.d.ts +4 -1
  157. package/dist/ai/plans/placement.js +295 -0
  158. package/dist/ai/plans/placement.js.map +1 -0
  159. package/dist/ai/plans/plans.d.ts +9 -0
  160. package/dist/ai/plans/plans.js +110 -0
  161. package/dist/ai/plans/plans.js.map +1 -0
  162. package/dist/ai/plans/production.d.ts +14 -2
  163. package/dist/ai/plans/production.js +434 -0
  164. package/dist/ai/plans/production.js.map +1 -0
  165. package/dist/ai/plans/purse.d.ts +6 -3
  166. package/dist/ai/plans/purse.js +139 -0
  167. package/dist/ai/plans/purse.js.map +1 -0
  168. package/dist/ai/plans/tech.d.ts +6 -0
  169. package/dist/ai/plans/tech.js +122 -0
  170. package/dist/ai/plans/tech.js.map +1 -0
  171. package/dist/ai/profiles.d.ts +4 -4
  172. package/dist/{profiles-B3NS9jwk.js → ai/profiles.js} +3 -98
  173. package/dist/ai/profiles.js.map +1 -0
  174. package/dist/ai/reach.js +54 -0
  175. package/dist/ai/reach.js.map +1 -0
  176. package/dist/ai/report.d.ts +8 -0
  177. package/dist/ai/report.js +87 -0
  178. package/dist/ai/report.js.map +1 -0
  179. package/dist/ai/roles.d.ts +4 -0
  180. package/dist/ai/roles.js +207 -0
  181. package/dist/ai/roles.js.map +1 -0
  182. package/dist/ai/rules.d.ts +8 -2
  183. package/dist/ai/rules.js +416 -0
  184. package/dist/ai/rules.js.map +1 -0
  185. package/dist/ai/scouting.d.ts +6 -0
  186. package/dist/ai/scouting.js +324 -0
  187. package/dist/ai/scouting.js.map +1 -0
  188. package/dist/ai/settings.js +99 -0
  189. package/dist/ai/settings.js.map +1 -0
  190. package/dist/ai/squads.d.ts +21 -2
  191. package/dist/ai/squads.js +916 -0
  192. package/dist/ai/squads.js.map +1 -0
  193. package/dist/ai/strength.js +320 -0
  194. package/dist/ai/strength.js.map +1 -0
  195. package/dist/ai/task.d.ts +3 -1
  196. package/dist/ai/task.js +17 -0
  197. package/dist/ai/task.js.map +1 -0
  198. package/dist/ai/tasks/attack.js +24 -0
  199. package/dist/ai/tasks/attack.js.map +1 -0
  200. package/dist/ai/tasks/capture.d.ts +3 -3
  201. package/dist/ai/tasks/capture.js +37 -0
  202. package/dist/ai/tasks/capture.js.map +1 -0
  203. package/dist/ai/tasks/creep.js +29 -0
  204. package/dist/ai/tasks/creep.js.map +1 -0
  205. package/dist/ai/tasks/defend.js +61 -0
  206. package/dist/ai/tasks/defend.js.map +1 -0
  207. package/dist/ai/tasks/drop.js +81 -0
  208. package/dist/ai/tasks/drop.js.map +1 -0
  209. package/dist/ai/tasks/escort.js +59 -0
  210. package/dist/ai/tasks/escort.js.map +1 -0
  211. package/dist/ai/tasks/gather.js +48 -0
  212. package/dist/ai/tasks/gather.js.map +1 -0
  213. package/dist/ai/tasks/harass.js +39 -0
  214. package/dist/ai/tasks/harass.js.map +1 -0
  215. package/dist/ai/tasks/hold.js +32 -0
  216. package/dist/ai/tasks/hold.js.map +1 -0
  217. package/dist/ai/tasks/index.js +34 -0
  218. package/dist/ai/tasks/index.js.map +1 -0
  219. package/dist/ai/tasks/move.js +26 -0
  220. package/dist/ai/tasks/move.js.map +1 -0
  221. package/dist/ai/tasks/patrol.js +59 -0
  222. package/dist/ai/tasks/patrol.js.map +1 -0
  223. package/dist/ai/tasks/retreat.js +28 -0
  224. package/dist/ai/tasks/retreat.js.map +1 -0
  225. package/dist/ai/tasks/scout.js +73 -0
  226. package/dist/ai/tasks/scout.js.map +1 -0
  227. package/dist/ai/tasks/shared.d.ts +1 -1
  228. package/dist/ai/tasks/shared.js +137 -0
  229. package/dist/ai/tasks/shared.js.map +1 -0
  230. package/dist/ai/team.d.ts +18 -1
  231. package/dist/ai/team.js +492 -0
  232. package/dist/ai/team.js.map +1 -0
  233. package/dist/ai/threat.d.ts +6 -0
  234. package/dist/ai/threat.js +206 -0
  235. package/dist/ai/threat.js.map +1 -0
  236. package/dist/ai/view.d.ts +21 -7
  237. package/dist/ai/view.js +677 -0
  238. package/dist/ai/view.js.map +1 -0
  239. package/dist/ai/waves.d.ts +6 -0
  240. package/dist/ai/waves.js +410 -0
  241. package/dist/ai/waves.js.map +1 -0
  242. package/dist/ai.js +54 -6239
  243. package/dist/aiTesting.d.ts +6 -3
  244. package/dist/aiTesting.js +229 -0
  245. package/dist/aiTesting.js.map +1 -0
  246. package/dist/areas.d.ts +4 -1
  247. package/dist/areas.js +295 -0
  248. package/dist/areas.js.map +1 -0
  249. package/dist/attacks.d.ts +3 -3
  250. package/dist/attacks.js +127 -0
  251. package/dist/attacks.js.map +1 -0
  252. package/dist/burning.d.ts +267 -0
  253. package/dist/burning.js +795 -0
  254. package/dist/burning.js.map +1 -0
  255. package/dist/bytes.js +21 -0
  256. package/dist/bytes.js.map +1 -0
  257. package/dist/callings.d.ts +71 -0
  258. package/dist/callings.js +157 -0
  259. package/dist/callings.js.map +1 -0
  260. package/dist/cameraOrders.d.ts +78 -0
  261. package/dist/cameraOrders.js +114 -0
  262. package/dist/cameraOrders.js.map +1 -0
  263. package/dist/camps.d.ts +70 -4
  264. package/dist/camps.js +501 -0
  265. package/dist/camps.js.map +1 -0
  266. package/dist/capture.d.ts +15 -3
  267. package/dist/capture.js +304 -0
  268. package/dist/capture.js.map +1 -0
  269. package/dist/cellLayers.d.ts +78 -13
  270. package/dist/cellLayers.js +275 -0
  271. package/dist/cellLayers.js.map +1 -0
  272. package/dist/cellPatches.d.ts +24 -0
  273. package/dist/cellPatches.js +73 -0
  274. package/dist/cellPatches.js.map +1 -0
  275. package/dist/cinematics.d.ts +10 -5
  276. package/dist/cinematics.js +161 -0
  277. package/dist/cinematics.js.map +1 -0
  278. package/dist/clock.d.ts +2 -2
  279. package/dist/clock.js +78 -0
  280. package/dist/clock.js.map +1 -0
  281. package/dist/commands.d.ts +36 -4
  282. package/dist/commands.js +636 -0
  283. package/dist/commands.js.map +1 -0
  284. package/dist/components.d.ts +31 -10
  285. package/dist/components.js +74 -0
  286. package/dist/components.js.map +1 -0
  287. package/dist/computers.d.ts +4 -4
  288. package/dist/computers.js +194 -0
  289. package/dist/computers.js.map +1 -0
  290. package/dist/concealment.d.ts +25 -2
  291. package/dist/concealment.js +409 -0
  292. package/dist/concealment.js.map +1 -0
  293. package/dist/coreComponents.js +130 -0
  294. package/dist/coreComponents.js.map +1 -0
  295. package/dist/createGame.d.ts +306 -0
  296. package/dist/createGame.js +405 -0
  297. package/dist/createGame.js.map +1 -0
  298. package/dist/dashing.d.ts +18 -2
  299. package/dist/dashing.js +41 -0
  300. package/dist/dashing.js.map +1 -0
  301. package/dist/debug.d.ts +8 -0
  302. package/dist/debug.js +5 -3
  303. package/dist/debug2.js +76 -0
  304. package/dist/debug2.js.map +1 -0
  305. package/dist/debugCommands.d.ts +6 -6
  306. package/dist/debugCommands.js +537 -0
  307. package/dist/debugCommands.js.map +1 -0
  308. package/dist/debugging.d.ts +1 -0
  309. package/dist/defaultSets.d.ts +183 -0
  310. package/dist/defaultSets.js +216 -0
  311. package/dist/defaultSets.js.map +1 -0
  312. package/dist/definitions.d.ts +6 -0
  313. package/dist/definitions.js +78 -0
  314. package/dist/definitions.js.map +1 -0
  315. package/dist/defs.d.ts +1895 -165
  316. package/dist/defs.js +380 -0
  317. package/dist/defs.js.map +1 -0
  318. package/dist/denying.d.ts +4 -4
  319. package/dist/denying.js +106 -0
  320. package/dist/denying.js.map +1 -0
  321. package/dist/destructibles.d.ts +2 -2
  322. package/dist/destructibles.js +36 -0
  323. package/dist/destructibles.js.map +1 -0
  324. package/dist/determinism.d.ts +4 -4
  325. package/dist/determinism.js +247 -0
  326. package/dist/determinism.js.map +1 -0
  327. package/dist/dialog.d.ts +17 -2
  328. package/dist/dialog.js +108 -0
  329. package/dist/dialog.js.map +1 -0
  330. package/dist/effectRefs.js +28 -0
  331. package/dist/effectRefs.js.map +1 -0
  332. package/dist/effects.d.ts +27 -11
  333. package/dist/effects.js +110 -0
  334. package/dist/effects.js.map +1 -0
  335. package/dist/endings.d.ts +1 -1
  336. package/dist/endings.js +78 -0
  337. package/dist/endings.js.map +1 -0
  338. package/dist/engagement.d.ts +40 -6
  339. package/dist/engagement.js +530 -0
  340. package/dist/engagement.js.map +1 -0
  341. package/dist/engineEvents.d.ts +72 -9
  342. package/dist/engineEvents.js +520 -0
  343. package/dist/engineEvents.js.map +1 -0
  344. package/dist/entity.d.ts +275 -26
  345. package/dist/entity.js +441 -0
  346. package/dist/entity.js.map +1 -0
  347. package/dist/entityIndex.d.ts +10 -3
  348. package/dist/entityIndex.js +149 -0
  349. package/dist/entityIndex.js.map +1 -0
  350. package/dist/errors.d.ts +6 -2
  351. package/dist/errors.js +59 -0
  352. package/dist/errors.js.map +1 -0
  353. package/dist/events.d.ts +11 -5
  354. package/dist/events.js +158 -0
  355. package/dist/events.js.map +1 -0
  356. package/dist/exactMath.js +273 -0
  357. package/dist/exactMath.js.map +1 -0
  358. package/dist/features.d.ts +1 -1
  359. package/dist/features.js +127 -0
  360. package/dist/features.js.map +1 -0
  361. package/dist/fields.d.ts +25 -5
  362. package/dist/fields.js +140 -0
  363. package/dist/fields.js.map +1 -0
  364. package/dist/fixture.d.ts +3 -3
  365. package/dist/fixture.js +512 -0
  366. package/dist/fixture.js.map +1 -0
  367. package/dist/fog.d.ts +26 -3
  368. package/dist/fog.js +333 -0
  369. package/dist/fog.js.map +1 -0
  370. package/dist/foliage.d.ts +476 -0
  371. package/dist/foliage.js +1478 -0
  372. package/dist/foliage.js.map +1 -0
  373. package/dist/foliageDebug.d.ts +57 -0
  374. package/dist/foliageDebug.js +172 -0
  375. package/dist/foliageDebug.js.map +1 -0
  376. package/dist/foliageRegrowth.d.ts +20 -0
  377. package/dist/foliageRegrowth.js +332 -0
  378. package/dist/foliageRegrowth.js.map +1 -0
  379. package/dist/formState.d.ts +67 -0
  380. package/dist/formState.js +65 -0
  381. package/dist/formState.js.map +1 -0
  382. package/dist/formation.d.ts +46 -8
  383. package/dist/formation.js +297 -0
  384. package/dist/formation.js.map +1 -0
  385. package/dist/forms.d.ts +58 -0
  386. package/dist/forms.js +146 -0
  387. package/dist/forms.js.map +1 -0
  388. package/dist/friendlyFire.d.ts +2 -2
  389. package/dist/friendlyFire.js +37 -0
  390. package/dist/friendlyFire.js.map +1 -0
  391. package/dist/game.d.ts +141 -48
  392. package/dist/game.js +834 -0
  393. package/dist/game.js.map +1 -0
  394. package/dist/gameData.d.ts +96 -22
  395. package/dist/gameData.js +1690 -0
  396. package/dist/gameData.js.map +1 -0
  397. package/dist/gameFiles.d.ts +3 -3
  398. package/dist/gameFiles.js +14 -0
  399. package/dist/gameFiles.js.map +1 -0
  400. package/dist/gates.js +92 -0
  401. package/dist/gates.js.map +1 -0
  402. package/dist/generate.d.ts +28 -1
  403. package/dist/generate.js +1062 -0
  404. package/dist/generate.js.map +1 -0
  405. package/dist/generateWorker.d.ts +7 -3
  406. package/dist/generateWorker.js +86 -0
  407. package/dist/generateWorker.js.map +1 -0
  408. package/dist/grid.d.ts +9 -0
  409. package/dist/grid.js +102 -0
  410. package/dist/grid.js.map +1 -0
  411. package/dist/ground.d.ts +17 -1
  412. package/dist/ground.js +375 -0
  413. package/dist/ground.js.map +1 -0
  414. package/dist/groundObjects.d.ts +70 -0
  415. package/dist/groundObjects.js +371 -0
  416. package/dist/groundObjects.js.map +1 -0
  417. package/dist/groundSpeed.d.ts +20 -3
  418. package/dist/groundSpeed.js +117 -0
  419. package/dist/groundSpeed.js.map +1 -0
  420. package/dist/hero.d.ts +126 -10
  421. package/dist/hero.js +432 -0
  422. package/dist/hero.js.map +1 -0
  423. package/dist/holds.d.ts +94 -0
  424. package/dist/holds.js +305 -0
  425. package/dist/holds.js.map +1 -0
  426. package/dist/home.d.ts +1 -1
  427. package/dist/home.js +30 -0
  428. package/dist/home.js.map +1 -0
  429. package/dist/hooks.d.ts +339 -57
  430. package/dist/hooks.js +105 -0
  431. package/dist/hooks.js.map +1 -0
  432. package/dist/hotReload.d.ts +6 -5
  433. package/dist/hotReload.js +145 -0
  434. package/dist/hotReload.js.map +1 -0
  435. package/dist/ids.d.ts +3 -3
  436. package/dist/ids.js +30 -0
  437. package/dist/ids.js.map +1 -0
  438. package/dist/idsFile.d.ts +36 -0
  439. package/dist/idsFile.js +134 -0
  440. package/dist/idsFile.js.map +1 -0
  441. package/dist/index.d.ts +105 -68
  442. package/dist/index.js +194 -4701
  443. package/dist/inspect.d.ts +29 -2
  444. package/dist/{inspect-D9dWHmZ0.js → inspect.js} +21 -12
  445. package/dist/inspect.js.map +1 -0
  446. package/dist/inventory.d.ts +14 -1
  447. package/dist/inventory.js +84 -0
  448. package/dist/inventory.js.map +1 -0
  449. package/dist/items.d.ts +136 -8
  450. package/dist/items.js +585 -0
  451. package/dist/items.js.map +1 -0
  452. package/dist/lanes.d.ts +12 -3
  453. package/dist/lanes.js +496 -0
  454. package/dist/lanes.js.map +1 -0
  455. package/dist/life.d.ts +6 -2
  456. package/dist/life.js +287 -0
  457. package/dist/life.js.map +1 -0
  458. package/dist/log.d.ts +26 -3
  459. package/dist/log.js +192 -0
  460. package/dist/log.js.map +1 -0
  461. package/dist/manaBurn.d.ts +2 -2
  462. package/dist/manaBurn.js +75 -0
  463. package/dist/manaBurn.js.map +1 -0
  464. package/dist/map/file.d.ts +56 -3
  465. package/dist/map/file.js +264 -0
  466. package/dist/map/file.js.map +1 -0
  467. package/dist/map/images.js +61 -0
  468. package/dist/map/images.js.map +1 -0
  469. package/dist/map/look.d.ts +1 -1
  470. package/dist/map/look.js +30 -0
  471. package/dist/map/look.js.map +1 -0
  472. package/dist/map/pathProfile.js +183 -0
  473. package/dist/map/pathProfile.js.map +1 -0
  474. package/dist/map/resize.d.ts +4 -0
  475. package/dist/map/resize.js +136 -0
  476. package/dist/map/resize.js.map +1 -0
  477. package/dist/map/schema.js +257 -0
  478. package/dist/map/schema.js.map +1 -0
  479. package/dist/map/terrain.js +214 -0
  480. package/dist/map/terrain.js.map +1 -0
  481. package/dist/map/types.d.ts +92 -13
  482. package/dist/map/types.js +251 -0
  483. package/dist/map/types.js.map +1 -0
  484. package/dist/mapCheck/cells.js +94 -0
  485. package/dist/mapCheck/cells.js.map +1 -0
  486. package/dist/mapCheck/rules/foliage.d.ts +9 -0
  487. package/dist/mapCheck/rules/foliage.js +83 -0
  488. package/dist/mapCheck/rules/foliage.js.map +1 -0
  489. package/dist/mapCheck/rules/names.js +39 -0
  490. package/dist/mapCheck/rules/names.js.map +1 -0
  491. package/dist/mapCheck/rules/objects.d.ts +1 -1
  492. package/dist/mapCheck/rules/objects.js +56 -0
  493. package/dist/mapCheck/rules/objects.js.map +1 -0
  494. package/dist/mapCheck/rules/paths.js +32 -0
  495. package/dist/mapCheck/rules/paths.js.map +1 -0
  496. package/dist/mapCheck/rules/players.js +20 -0
  497. package/dist/mapCheck/rules/players.js.map +1 -0
  498. package/dist/mapCheck/rules/races.js +56 -0
  499. package/dist/mapCheck/rules/races.js.map +1 -0
  500. package/dist/mapCheck/rules/random.js +47 -0
  501. package/dist/mapCheck/rules/random.js.map +1 -0
  502. package/dist/mapCheck/rules/regions.js +30 -0
  503. package/dist/mapCheck/rules/regions.js.map +1 -0
  504. package/dist/mapCheck/rules/targets.js +31 -0
  505. package/dist/mapCheck/rules/targets.js.map +1 -0
  506. package/dist/mapCheck/rules/walking.js +45 -0
  507. package/dist/mapCheck/rules/walking.js.map +1 -0
  508. package/dist/mapCheck.d.ts +2 -2
  509. package/dist/mapCheck.js +63 -0
  510. package/dist/mapCheck.js.map +1 -0
  511. package/dist/mapFields.d.ts +25 -2
  512. package/dist/mapFields.js +134 -0
  513. package/dist/mapFields.js.map +1 -0
  514. package/dist/mapFile.js +176 -0
  515. package/dist/mapFile.js.map +1 -0
  516. package/dist/mapMeasure.d.ts +8 -0
  517. package/dist/mapMeasure.js +283 -0
  518. package/dist/mapMeasure.js.map +1 -0
  519. package/dist/mapMerge.d.ts +1 -0
  520. package/dist/mapMerge.js +172 -0
  521. package/dist/mapMerge.js.map +1 -0
  522. package/dist/mapObjectives.js +138 -0
  523. package/dist/mapObjectives.js.map +1 -0
  524. package/dist/mapObjects.js +80 -0
  525. package/dist/mapObjects.js.map +1 -0
  526. package/dist/math.d.ts +37 -7
  527. package/dist/math.js +155 -0
  528. package/dist/math.js.map +1 -0
  529. package/dist/messages.d.ts +71 -4
  530. package/dist/messages.js +29 -0
  531. package/dist/messages.js.map +1 -0
  532. package/dist/missionRules.d.ts +10 -2
  533. package/dist/{missionRules-C-bGxm0Q.js → missionRules.js} +30 -150
  534. package/dist/missionRules.js.map +1 -0
  535. package/dist/mods.d.ts +39 -20
  536. package/dist/mods.js +271 -0
  537. package/dist/mods.js.map +1 -0
  538. package/dist/moves.d.ts +87 -0
  539. package/dist/moves.js +539 -0
  540. package/dist/moves.js.map +1 -0
  541. package/dist/names.d.ts +7 -0
  542. package/dist/names.js +122 -0
  543. package/dist/names.js.map +1 -0
  544. package/dist/navigation/agentParams.js +14 -0
  545. package/dist/navigation/agentParams.js.map +1 -0
  546. package/dist/navigation/air.d.ts +7 -3
  547. package/dist/navigation/air.js +401 -0
  548. package/dist/navigation/air.js.map +1 -0
  549. package/dist/navigation/builds.d.ts +34 -2
  550. package/dist/navigation/builds.js +287 -0
  551. package/dist/navigation/builds.js.map +1 -0
  552. package/dist/navigation/groundAreas.d.ts +59 -1
  553. package/dist/navigation/groundAreas.js +407 -0
  554. package/dist/navigation/groundAreas.js.map +1 -0
  555. package/dist/navigation/navigation.d.ts +98 -9
  556. package/dist/navigation/recast.d.ts +194 -18
  557. package/dist/navigation/recast.js +1379 -0
  558. package/dist/navigation/recast.js.map +1 -0
  559. package/dist/navigation/sidePaths.d.ts +8 -3
  560. package/dist/navigation/sidePaths.js +241 -0
  561. package/dist/navigation/sidePaths.js.map +1 -0
  562. package/dist/navigation/sized.js +243 -0
  563. package/dist/navigation/sized.js.map +1 -0
  564. package/dist/nearest.js +32 -0
  565. package/dist/nearest.js.map +1 -0
  566. package/dist/noise.js +59 -0
  567. package/dist/noise.js.map +1 -0
  568. package/dist/objectives.d.ts +12 -3
  569. package/dist/objectives.js +144 -0
  570. package/dist/objectives.js.map +1 -0
  571. package/dist/orders/basic.d.ts +5 -5
  572. package/dist/orders/basic.js +417 -0
  573. package/dist/orders/basic.js.map +1 -0
  574. package/dist/orders/build.js +278 -0
  575. package/dist/orders/build.js.map +1 -0
  576. package/dist/orders/cast.d.ts +13 -3
  577. package/dist/orders/cast.js +558 -0
  578. package/dist/orders/cast.js.map +1 -0
  579. package/dist/orders/facts.js +16 -0
  580. package/dist/orders/facts.js.map +1 -0
  581. package/dist/orders/harvest.d.ts +21 -5
  582. package/dist/orders/harvest.js +540 -0
  583. package/dist/orders/harvest.js.map +1 -0
  584. package/dist/orders/idle.d.ts +3 -1
  585. package/dist/orders/idle.js +234 -0
  586. package/dist/orders/idle.js.map +1 -0
  587. package/dist/orders/items.js +92 -0
  588. package/dist/orders/items.js.map +1 -0
  589. package/dist/orders/queue.js +108 -0
  590. package/dist/orders/queue.js.map +1 -0
  591. package/dist/orders/waiting.d.ts +39 -0
  592. package/dist/orders/waiting.js +149 -0
  593. package/dist/orders/waiting.js.map +1 -0
  594. package/dist/pack.schema.js +13 -0
  595. package/dist/pack.schema.js.map +1 -0
  596. package/dist/pack.schema.json +7622 -841
  597. package/dist/packs/director/index.d.ts +13 -5
  598. package/dist/packs/director/index.js +204 -0
  599. package/dist/packs/director/index.js.map +1 -0
  600. package/dist/packs/heroes/campaign.d.ts +3 -2
  601. package/dist/packs/heroes/campaign.js +241 -0
  602. package/dist/packs/heroes/campaign.js.map +1 -0
  603. package/dist/packs/heroes/carry.d.ts +6 -0
  604. package/dist/packs/heroes/carry.js +112 -0
  605. package/dist/packs/heroes/carry.js.map +1 -0
  606. package/dist/packs/heroes/commands.js +115 -0
  607. package/dist/packs/heroes/commands.js.map +1 -0
  608. package/dist/packs/heroes/fallen.d.ts +43 -0
  609. package/dist/packs/heroes/fallen.js +61 -0
  610. package/dist/packs/heroes/fallen.js.map +1 -0
  611. package/dist/packs/heroes/hire.js +60 -0
  612. package/dist/packs/heroes/hire.js.map +1 -0
  613. package/dist/packs/heroes/index.d.ts +7 -6
  614. package/dist/packs/heroes/index.js +130 -0
  615. package/dist/packs/heroes/index.js.map +1 -0
  616. package/dist/packs/heroes/loop.d.ts +95 -0
  617. package/dist/packs/heroes/loop.js +250 -0
  618. package/dist/packs/heroes/loop.js.map +1 -0
  619. package/dist/packs/heroes/making.d.ts +6 -3
  620. package/dist/packs/heroes/making.js +55 -0
  621. package/dist/packs/heroes/making.js.map +1 -0
  622. package/dist/packs/heroes/respawn.d.ts +3 -3
  623. package/dist/packs/heroes/respawn.js +87 -0
  624. package/dist/packs/heroes/respawn.js.map +1 -0
  625. package/dist/packs/heroes/sets.d.ts +32 -0
  626. package/dist/packs/heroes/sets.js +51 -0
  627. package/dist/packs/heroes/sets.js.map +1 -0
  628. package/dist/packs/heroes/spells.d.ts +16 -0
  629. package/dist/packs/heroes/spells.js +269 -0
  630. package/dist/packs/heroes/spells.js.map +1 -0
  631. package/dist/packs/items/defaults.d.ts +43 -0
  632. package/dist/packs/items/defaults.js +1504 -0
  633. package/dist/packs/items/defaults.js.map +1 -0
  634. package/dist/packs/items/index.d.ts +27 -0
  635. package/dist/packs/items/index.js +214 -0
  636. package/dist/packs/items/index.js.map +1 -0
  637. package/dist/packs/moba/index.d.ts +3 -3
  638. package/dist/packs/moba/index.js +174 -0
  639. package/dist/packs/moba/index.js.map +1 -0
  640. package/dist/packs/pack.d.ts +15 -15
  641. package/dist/packs/pack.js +14 -0
  642. package/dist/packs/pack.js.map +1 -0
  643. package/dist/packs.d.ts +15 -7
  644. package/dist/packs.js +222 -0
  645. package/dist/packs.js.map +1 -0
  646. package/dist/paths.d.ts +2 -0
  647. package/dist/paths.js +109 -0
  648. package/dist/paths.js.map +1 -0
  649. package/dist/plain.js +57 -0
  650. package/dist/plain.js.map +1 -0
  651. package/dist/player.d.ts +33 -10
  652. package/dist/player.js +159 -0
  653. package/dist/player.js.map +1 -0
  654. package/dist/portals.d.ts +1 -1
  655. package/dist/portals.js +194 -0
  656. package/dist/portals.js.map +1 -0
  657. package/dist/prefabs.d.ts +25 -2
  658. package/dist/prefabs.js +239 -0
  659. package/dist/prefabs.js.map +1 -0
  660. package/dist/presetBuildings.js +58 -0
  661. package/dist/presetBuildings.js.map +1 -0
  662. package/dist/presetFoliage.d.ts +27 -0
  663. package/dist/presetFoliage.js +98 -0
  664. package/dist/presetFoliage.js.map +1 -0
  665. package/dist/presetGround.js +65 -0
  666. package/dist/presetGround.js.map +1 -0
  667. package/dist/proxies.d.ts +12 -0
  668. package/dist/proxies.js +79 -0
  669. package/dist/proxies.js.map +1 -0
  670. package/dist/query.d.ts +56 -0
  671. package/dist/query.js +88 -0
  672. package/dist/query.js.map +1 -0
  673. package/dist/races.d.ts +15 -14
  674. package/dist/races.js +172 -0
  675. package/dist/races.js.map +1 -0
  676. package/dist/randomGroups.js +91 -0
  677. package/dist/randomGroups.js.map +1 -0
  678. package/dist/registry.d.ts +117 -53
  679. package/dist/registry.js +323 -0
  680. package/dist/registry.js.map +1 -0
  681. package/dist/remains.d.ts +11 -9
  682. package/dist/remains.js +188 -0
  683. package/dist/remains.js.map +1 -0
  684. package/dist/replication.d.ts +12 -7
  685. package/dist/replication.js +100 -0
  686. package/dist/replication.js.map +1 -0
  687. package/dist/rng.d.ts +2 -0
  688. package/dist/rng.js +40 -0
  689. package/dist/rng.js.map +1 -0
  690. package/dist/rules.d.ts +186 -99
  691. package/dist/rules.js +179 -0
  692. package/dist/rules.js.map +1 -0
  693. package/dist/rulesCheck.d.ts +5 -4
  694. package/dist/rulesCheck.js +693 -0
  695. package/dist/rulesCheck.js.map +1 -0
  696. package/dist/runes.d.ts +2 -2
  697. package/dist/runes.js +80 -0
  698. package/dist/runes.js.map +1 -0
  699. package/dist/save.d.ts +37 -12
  700. package/dist/save.js +532 -0
  701. package/dist/save.js.map +1 -0
  702. package/dist/scenario.d.ts +2 -2
  703. package/dist/scenario.js +99 -0
  704. package/dist/scenario.js.map +1 -0
  705. package/dist/scheduler.d.ts +3 -0
  706. package/dist/scheduler.js +156 -0
  707. package/dist/scheduler.js.map +1 -0
  708. package/dist/score.d.ts +19 -19
  709. package/dist/score.js +709 -0
  710. package/dist/score.js.map +1 -0
  711. package/dist/sequences.d.ts +10 -6
  712. package/dist/sequences.js +206 -0
  713. package/dist/sequences.js.map +1 -0
  714. package/dist/server/doorman.js +154 -0
  715. package/dist/server/doorman.js.map +1 -0
  716. package/dist/server/gameServer.d.ts +16 -1
  717. package/dist/server/gameServer.js +643 -0
  718. package/dist/server/gameServer.js.map +1 -0
  719. package/dist/server/index.d.ts +1 -1
  720. package/dist/server/lobby.js +199 -0
  721. package/dist/server/lobby.js.map +1 -0
  722. package/dist/server/log.js +18 -0
  723. package/dist/server/log.js.map +1 -0
  724. package/dist/server/match.js +267 -0
  725. package/dist/server/match.js.map +1 -0
  726. package/dist/server/mode.d.ts +18 -9
  727. package/dist/server/mode.js +220 -0
  728. package/dist/server/mode.js.map +1 -0
  729. package/dist/{navigation-worker.js → server/navigation-worker.js} +1 -1
  730. package/dist/server/navigation-worker.js.map +1 -0
  731. package/dist/server/navigation.js +39 -0
  732. package/dist/server/navigation.js.map +1 -0
  733. package/dist/server/ops.d.ts +4 -0
  734. package/dist/server/ops.js +137 -0
  735. package/dist/server/ops.js.map +1 -0
  736. package/dist/server/packs.d.ts +3 -3
  737. package/dist/server/packs.js +32 -0
  738. package/dist/server/packs.js.map +1 -0
  739. package/dist/server/ratings.d.ts +5 -0
  740. package/dist/server/ratings.js +104 -0
  741. package/dist/server/ratings.js.map +1 -0
  742. package/dist/server/relay.d.ts +12 -2
  743. package/dist/server/relay.js +144 -0
  744. package/dist/server/relay.js.map +1 -0
  745. package/dist/server/rooms.d.ts +9 -2
  746. package/dist/server/rooms.js +442 -0
  747. package/dist/server/rooms.js.map +1 -0
  748. package/dist/server/seat.js +116 -0
  749. package/dist/server/seat.js.map +1 -0
  750. package/dist/server/seatSettings.d.ts +3 -3
  751. package/dist/server/seatSettings.js +63 -0
  752. package/dist/server/seatSettings.js.map +1 -0
  753. package/dist/server/secret.js +13 -0
  754. package/dist/server/secret.js.map +1 -0
  755. package/dist/server/start.d.ts +13 -6
  756. package/dist/server/start.js +76 -0
  757. package/dist/server/start.js.map +1 -0
  758. package/dist/server/websocket.d.ts +9 -1
  759. package/dist/server/websocket.js +306 -0
  760. package/dist/server/websocket.js.map +1 -0
  761. package/dist/server.js +15 -2861
  762. package/dist/session/can.js +26 -0
  763. package/dist/session/can.js.map +1 -0
  764. package/dist/session/commandReplay.d.ts +8 -2
  765. package/dist/session/commandReplay.js +293 -0
  766. package/dist/session/commandReplay.js.map +1 -0
  767. package/dist/session/debug.js +151 -0
  768. package/dist/session/debug.js.map +1 -0
  769. package/dist/session/delay.js +62 -0
  770. package/dist/session/delay.js.map +1 -0
  771. package/dist/session/delta.d.ts +14 -1
  772. package/dist/session/delta.js +407 -0
  773. package/dist/session/delta.js.map +1 -0
  774. package/dist/session/entityState.js +415 -0
  775. package/dist/session/entityState.js.map +1 -0
  776. package/dist/session/local.d.ts +47 -5
  777. package/dist/session/local.js +670 -0
  778. package/dist/session/local.js.map +1 -0
  779. package/dist/session/memory.d.ts +20 -2
  780. package/dist/session/memory.js +131 -0
  781. package/dist/session/memory.js.map +1 -0
  782. package/dist/session/protocol.d.ts +325 -31
  783. package/dist/session/protocol.js +55 -0
  784. package/dist/session/protocol.js.map +1 -0
  785. package/dist/session/remote.d.ts +74 -12
  786. package/dist/session/remote.js +1394 -0
  787. package/dist/session/remote.js.map +1 -0
  788. package/dist/session/replay.d.ts +11 -2
  789. package/dist/session/replay.js +160 -0
  790. package/dist/session/replay.js.map +1 -0
  791. package/dist/session/seed.js +12 -0
  792. package/dist/session/seed.js.map +1 -0
  793. package/dist/session/share.d.ts +5 -1
  794. package/dist/session/share.js +94 -0
  795. package/dist/session/share.js.map +1 -0
  796. package/dist/session/socket.d.ts +1 -1
  797. package/dist/session/socket.js +29 -0
  798. package/dist/session/socket.js.map +1 -0
  799. package/dist/session/wire.d.ts +5 -0
  800. package/dist/session/wire.js +84 -0
  801. package/dist/session/wire.js.map +1 -0
  802. package/dist/session/worker.d.ts +77 -12
  803. package/dist/session/worker.js +499 -0
  804. package/dist/session/worker.js.map +1 -0
  805. package/dist/shared.d.ts +31 -5
  806. package/dist/shared.js +166 -0
  807. package/dist/shared.js.map +1 -0
  808. package/dist/sides.d.ts +9 -3
  809. package/dist/sides.js +149 -0
  810. package/dist/sides.js.map +1 -0
  811. package/dist/sight.js +85 -0
  812. package/dist/sight.js.map +1 -0
  813. package/dist/simulate-worker.js +1 -1
  814. package/dist/simulate.d.ts +12 -8
  815. package/dist/{simulate-oXBiw1Ff.js → simulate.js} +10 -11
  816. package/dist/simulate.js.map +1 -0
  817. package/dist/smart.js +77 -0
  818. package/dist/smart.js.map +1 -0
  819. package/dist/spatial.d.ts +32 -16
  820. package/dist/spatial.js +234 -0
  821. package/dist/spatial.js.map +1 -0
  822. package/dist/spawning.d.ts +1 -0
  823. package/dist/spawning.js +224 -0
  824. package/dist/spawning.js.map +1 -0
  825. package/dist/stances.d.ts +6 -3
  826. package/dist/stances.js +169 -0
  827. package/dist/stances.js.map +1 -0
  828. package/dist/start.d.ts +10 -10
  829. package/dist/start.js +75 -0
  830. package/dist/start.js.map +1 -0
  831. package/dist/stats.d.ts +42 -16
  832. package/dist/stats.js +290 -0
  833. package/dist/stats.js.map +1 -0
  834. package/dist/summoned.d.ts +52 -0
  835. package/dist/summoned.js +38 -0
  836. package/dist/summoned.js.map +1 -0
  837. package/dist/summons.d.ts +10 -13
  838. package/dist/summons.js +271 -0
  839. package/dist/summons.js.map +1 -0
  840. package/dist/systems/abilities.js +224 -0
  841. package/dist/systems/abilities.js.map +1 -0
  842. package/dist/systems/combat.d.ts +35 -1
  843. package/dist/systems/combat.js +677 -0
  844. package/dist/systems/combat.js.map +1 -0
  845. package/dist/systems/combatTold.d.ts +3 -1
  846. package/dist/systems/combatTold.js +85 -0
  847. package/dist/systems/combatTold.js.map +1 -0
  848. package/dist/systems/construction.js +80 -0
  849. package/dist/systems/construction.js.map +1 -0
  850. package/dist/systems/economy.d.ts +0 -6
  851. package/dist/systems/economy.js +128 -0
  852. package/dist/systems/economy.js.map +1 -0
  853. package/dist/systems/fog.d.ts +1 -1
  854. package/dist/systems/fog.js +120 -0
  855. package/dist/systems/fog.js.map +1 -0
  856. package/dist/systems/life.js +32 -0
  857. package/dist/systems/life.js.map +1 -0
  858. package/dist/systems/movement.d.ts +24 -12
  859. package/dist/systems/movement.js +1247 -0
  860. package/dist/systems/movement.js.map +1 -0
  861. package/dist/systems/orders.js +64 -0
  862. package/dist/systems/orders.js.map +1 -0
  863. package/dist/systems/production.js +322 -0
  864. package/dist/systems/production.js.map +1 -0
  865. package/dist/systems/productionQueue.js +120 -0
  866. package/dist/systems/productionQueue.js.map +1 -0
  867. package/dist/systems/victory.d.ts +1 -1
  868. package/dist/systems/victory.js +56 -0
  869. package/dist/systems/victory.js.map +1 -0
  870. package/dist/talk.d.ts +6 -6
  871. package/dist/talk.js +153 -0
  872. package/dist/talk.js.map +1 -0
  873. package/dist/targeting.d.ts +142 -0
  874. package/dist/targeting.js +49 -0
  875. package/dist/targeting.js.map +1 -0
  876. package/dist/tech.d.ts +20 -3
  877. package/dist/tech.js +239 -0
  878. package/dist/tech.js.map +1 -0
  879. package/dist/techTree.d.ts +7 -0
  880. package/dist/techTree.js +90 -0
  881. package/dist/techTree.js.map +1 -0
  882. package/dist/terrain.d.ts +59 -7
  883. package/dist/terrain.js +389 -0
  884. package/dist/terrain.js.map +1 -0
  885. package/dist/terrainSave.d.ts +6 -0
  886. package/dist/terrainSave.js +74 -0
  887. package/dist/terrainSave.js.map +1 -0
  888. package/dist/testing.d.ts +8 -7
  889. package/dist/testing.js +13 -739
  890. package/dist/testing.js.map +1 -1
  891. package/dist/tiles.d.ts +1 -1
  892. package/dist/tiles.js +43 -0
  893. package/dist/tiles.js.map +1 -0
  894. package/dist/timers.d.ts +29 -4
  895. package/dist/timers.js +242 -0
  896. package/dist/timers.js.map +1 -0
  897. package/dist/tomes.d.ts +4 -4
  898. package/dist/tomes.js +94 -0
  899. package/dist/tomes.js.map +1 -0
  900. package/dist/trade.js +103 -0
  901. package/dist/trade.js.map +1 -0
  902. package/dist/transport.d.ts +6 -1
  903. package/dist/transport.js +281 -0
  904. package/dist/transport.js.map +1 -0
  905. package/dist/tunables.d.ts +10 -3
  906. package/dist/tunables.js +56 -0
  907. package/dist/tunables.js.map +1 -0
  908. package/dist/unitResources.d.ts +67 -0
  909. package/dist/unitResources.js +266 -0
  910. package/dist/unitResources.js.map +1 -0
  911. package/dist/upkeep.d.ts +6 -1
  912. package/dist/upkeep.js +26 -0
  913. package/dist/upkeep.js.map +1 -0
  914. package/dist/veterancy.d.ts +8 -3
  915. package/dist/veterancy.js +131 -0
  916. package/dist/veterancy.js.map +1 -0
  917. package/dist/vision.d.ts +36 -0
  918. package/dist/vision.js +133 -0
  919. package/dist/vision.js.map +1 -0
  920. package/dist/walls.d.ts +1 -1
  921. package/dist/walls.js +278 -0
  922. package/dist/walls.js.map +1 -0
  923. package/dist/world.d.ts +606 -88
  924. package/dist/world.js +1263 -0
  925. package/dist/world.js.map +1 -0
  926. package/package.json +2 -2
  927. package/dist/ai.js.map +0 -1
  928. package/dist/attributes.d.ts +0 -66
  929. package/dist/brain-BvVdUhX8.js +0 -7659
  930. package/dist/brain-BvVdUhX8.js.map +0 -1
  931. package/dist/builds-C6LfgvEU.js +0 -460
  932. package/dist/builds-C6LfgvEU.js.map +0 -1
  933. package/dist/coreComponents-syuh2fPG.js +0 -5149
  934. package/dist/coreComponents-syuh2fPG.js.map +0 -1
  935. package/dist/debugCommands-CzjrSm66.js +0 -14739
  936. package/dist/debugCommands-CzjrSm66.js.map +0 -1
  937. package/dist/determinism-BCymQwiE.js +0 -518
  938. package/dist/determinism-BCymQwiE.js.map +0 -1
  939. package/dist/game-DiJEN-Ks.js +0 -5800
  940. package/dist/game-DiJEN-Ks.js.map +0 -1
  941. package/dist/index.js.map +0 -1
  942. package/dist/inspect-D9dWHmZ0.js.map +0 -1
  943. package/dist/local-Dkovq42k.js +0 -1379
  944. package/dist/local-Dkovq42k.js.map +0 -1
  945. package/dist/missionRules-C-bGxm0Q.js.map +0 -1
  946. package/dist/navigation-worker.js.map +0 -1
  947. package/dist/packs-g5thvmGn.js +0 -3199
  948. package/dist/packs-g5thvmGn.js.map +0 -1
  949. package/dist/profiles-B3NS9jwk.js.map +0 -1
  950. package/dist/server.js.map +0 -1
  951. package/dist/simulate-oXBiw1Ff.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"combat.js","names":[],"sources":["../../src/systems/combat.ts"],"sourcesContent":["import { attackStarted, impact, missed, projectileRemoved, projectileSpawned, swingCancelled } from '#engine/engineEvents'\nimport { isDisarmed, isInvulnerable, isUntargetable, layerOf } from '#engine/abilities/buffs'\nimport { type AttackDef, at } from '#engine/defs'\nimport { distanceToEdge, edgeDistance, type Entity, type PlayerId } from '#engine/entity'\nimport { angleDiff, dist, type Vec2 } from '#engine/math'\nimport { type CanAttack, cancellable, type TargetScore } from '#engine/hooks'\nimport type { System } from '#engine/registry'\nimport { attackTiming, statsOf } from '#engine/stats'\nimport type { Projectile, World } from '#engine/world'\nimport { faceTowards, halt, moveTo, moveToEntity, setAnchored } from './movement'\nimport { engagedLike, engageWith, isShunned, release, roomFor, STRUCTURE_REACH } from '#engine/engagement'\n\n// kept with the engagement rules, where an attacker's place by a building is worked out too\nexport { STRUCTURE_REACH }\nimport { atan2 } from '#engine/exactMath'\nimport { summoned, FOE_BONUS } from '#engine/summoned'\nimport { moving, fighting, type CombatState } from '../entity'\nimport { attackStat, farthestReach, groundAttack, pickAttack, rangeAgainst, reaches, tooNear } from '#engine/attacks'\n\n/** Extra reach allowed once a swing has started, so targets stepping back slightly still get hit */\n/**\n * How far past its range a swing already begun still lands (`engage`, and the stances pack, which lets go where the engine would chase)\n *\n * @internal\n */\nexport const SWING_SLACK = 0.75\nconst FACING_TOLERANCE = 0.4\n/** The least a swing takes: a hit is never in the tick its swing began */\nconst MIN_SWING = 1e-6\n\n/** What a swing is aimed at when it is aimed at the ground. No entity has this id */\nconst GROUND = -1\n/**\n * How often an attack up a cliff goes wide\n *\n * @internal\n */\nexport const UPHILL_MISS = 0.25\n\nexport type EngageResult = 'invalid' | 'attacking' | 'chasing' | 'outOfRange'\n\n/**\n * Handed to the `canAttack` handlers, again and again, so that asking allocates nothing: one for each question under\n * way, as a handler may ask again (could the target hit back?) while its caller's handlers are still being run\n */\nconst askings: CanAttack[] = []\n/** How many questions are under way, one inside the other */\nlet asked = 0\n\n/**\n * Whether an attacker may attack a target: its attack reaches it, it is an enemy, and the `canAttack` hook agrees.\n * `ordered`: a player told it to (an attack order), which a game may let it do to its own side (`CanAttack.ordered`)\n *\n * @beta\n */\nexport function canAttack(world: World, attacker: Entity, target: Entity, ordered = false): boolean {\n\t// what nothing can change: no attack, nothing there to hit\n\tif (!attacker.def.attacks?.length || !target.alive || target.hidden || target === attacker || target.def.invulnerable || target.def.targetableBy || target.isResource)\n\t\treturn false\n\t// what a buff puts out of harm's or out of reach (AB9): Divine Shield, Fizz's Playful\n\tif (target.buffs.length && (isInvulnerable(world, target) || isUntargetable(world, target))) return false\n\t// burrowed, or disarmed by a buff\n\tif (attacker.buffs.length && isDisarmed(world, attacker)) return false\n\t// an enemy first: the cheaper, and half of who is around is not\n\tconst allowed = world.areEnemies(attacker.owner, target.owner) && world.settings.combat.pickAttack(world, attacker, target) >= 0\n\tif (!world.hooks.has('canAttack')) return allowed\n\tconst asking = (askings[asked] ??= cancellable({ attacker: undefined!, target: undefined!, cancelled: true, ordered: false }))\n\tasking.attacker = attacker\n\tasking.target = target\n\tasking.cancelled = !allowed\n\tasking.ordered = ordered\n\tasked++\n\ttry {\n\t\treturn !world.hooks.run('canAttack', asking).cancelled\n\t} finally {\n\t\tasked--\n\t}\n}\n\n/**\n * Whether one of an attacker's attacks can hit a target where it is, whoever's it is: the ground, the air, the kinds it\n * names (`pickAttack`). For a `canAttack` handler that lets a unit attack what is not an enemy\n *\n * @beta\n */\nexport function attackReaches(world: World, attacker: Entity, target: Entity): boolean {\n\treturn pickAttack(world, attacker, target) >= 0\n}\n\nexport function canSee(world: World, viewer: Entity, target: Entity): boolean {\n\treturn world.isVisibleTo(target, world.player(viewer.owner).team)\n}\n\n/**\n * Whether the target stands on higher ground than the attacker. Nothing is uphill from the air\n *\n * @beta\n */\nexport function shootsUphill(world: World, attacker: Entity, target: Entity): boolean {\n\tif (layerOf(world, attacker) === 'air') return false\n\tconst { terrain } = world\n\treturn terrain.levelAt(target.pos.x, target.pos.z) > terrain.levelAt(attacker.pos.x, attacker.pos.z)\n}\n\n/**\n * What one search goes through: the entities around, and what is handed to the `targetScore` handlers for every\n * candidate, again and again, so that no search allocates. One per search under way: a handler may search again (who\n * the target would go for) while its caller's list is being gone through\n */\ninterface Search {\n\tcandidates: Entity[]\n\tscoring: TargetScore\n\t/** What it found, given back as it is (`searchTarget`): read before the next search at the same depth */\n\tfound: TargetFound\n}\n\n/**\n * What a search for a target found: the best, and whether it passed over one it would have taken but for leaving it\n * alone for now (`shun`): what asking again with `shunned` would have found something for, without looking again\n */\nexport interface TargetFound {\n\ttarget: Entity | undefined\n\tpassedOver: boolean\n}\nconst searches: Search[] = []\n/** How many searches are under way, one inside the other */\nlet searching = 0\n\n/** What a target with no room left for an attacker loses in its score: a free one of the same kind comes first, however far */\nconst CROWDED = 1000\n\n/**\n * Best enemy within `range` of the entity (its acquisition range by default), as the `targetScore` hook sees it. Those\n * it leaves alone for now (`shun`) are not, unless `shunned` says to count them too: to know whether a fight is still on\n */\nexport const acquireTarget = (world: World, entity: Entity, range?: number, shunned = false): Entity | undefined =>\n\tsearchTarget(world, entity, range, shunned).target\n\n/**\n * Best enemy it can hit from where it stands: within the range of the attack it would use against each (`pickAttack`),\n * and `slack` more. For one that holds its ground\n *\n * @beta\n */\nexport function acquireInRange(world: World, entity: Entity, slack = 0): Entity | undefined {\n\tconst attacks = entity.def.attacks\n\tif (!attacks?.length) return undefined\n\tconst stats = statsOf(world, entity)\n\t// one attack: its range is the reach. More: as far as the farthest, each target then by its own\n\tif (attacks.length === 1) return searchTarget(world, entity, attackStat(stats, attacks[0], 'range') + slack).target\n\treturn searchTarget(world, entity, farthestReach(entity.def, stats) + slack, false, slack).target\n}\n\n/**\n * What the `targetScore` hook makes of a target for an attacker, the engine's own score under it: what a search would\n * weigh it at, or -Infinity for one a game's hook leaves out. For a rule that hands an attacker a target without\n * searching (an ally's help), so that the game weighs it as it weighs any\n */\nexport function scoreTarget(world: World, entity: Entity, other: Entity): number {\n\tconst distance = edgeDistance(entity, other)\n\tconst threat = other.def.threat ?? (other.def.attacks?.length ? 2 : other.isBuilding ? 0 : 1)\n\tconst engaged = other.id === entity.get(fighting)?.engaged ? 0 : engagedLike(world, other, entity)\n\tconst room = roomFor(world, other, entity)\n\tconst score = threat * 1000 - distance - (engaged >= room ? CROWDED : 0)\n\tif (!world.hooks.has('targetScore')) return score\n\treturn world.hooks.run('targetScore', { attacker: entity, target: other, distance, engaged, room, score }).score\n}\n\n/** Nothing found, by an entity that does not attack */\nconst NOTHING: Readonly<TargetFound> = Object.freeze({ target: undefined, passedOver: false })\n\n/**\n * `acquireTarget`, and whether it passed over a target it leaves alone for now (`TargetFound`). What it gives back is\n * the search's own, used again by the next search: read it at once\n */\nexport function searchTarget(world: World, entity: Entity, range?: number, shunned = false, inRange?: number): Readonly<TargetFound> {\n\tif (!entity.def.attacks?.length) return NOTHING\n\tconst reach = range ?? world.settings.combat.acquisitionRange(world, entity)\n\t// an acquisition range of 0 is a unit that does not look for enemies by itself: not one that takes whoever it overlaps,\n\t// as it would when another unit is pushed onto it\n\tif (range === undefined && reach <= 0) return NOTHING\n\tconst search = (searches[searching] ??= {\n\t\tcandidates: [],\n\t\tscoring: { attacker: undefined!, target: undefined!, distance: 0, engaged: 0, room: 0, score: 0 },\n\t\tfound: { target: undefined, passedOver: false }\n\t})\n\tsearching++\n\ttry {\n\t\treturn bestTarget(world, entity, reach, shunned, search, inRange)\n\t} finally {\n\t\tsearching--\n\t\tsearch.candidates.length = 0\n\t}\n}\n\n/** By world, then by owner: whether another owner is on the owner's side, for the grid to leave out cells of theirs alone */\nconst sidesOf = new WeakMap<World, Map<PlayerId, (other: PlayerId) => boolean>>()\n\nfunction sideTest(world: World, owner: PlayerId): (other: PlayerId) => boolean {\n\tlet byOwner = sidesOf.get(world)\n\tif (!byOwner) sidesOf.set(world, (byOwner = new Map()))\n\tlet side = byOwner.get(owner)\n\t// asked as the search goes, so that a change of sides this tick is what it goes by\n\tif (!side) byOwner.set(owner, (side = (other) => world.areAllies(owner, other)))\n\treturn side\n}\n\nconst hasDeadZone = (attack: AttackDef): boolean => !!attack.minRange\nconst firesOnTheMove = (attack: AttackDef): boolean => !!attack.onTheMove\n\n/** `inRange`: only what the attack it would use reaches, and that much more (`acquireInRange`) */\nfunction bestTarget(\n\tworld: World,\n\tentity: Entity,\n\treach: number,\n\tshunned: boolean,\n\t{ candidates, scoring, found }: Search,\n\tinRange?: number\n): TargetFound {\n\tconst hooked = world.hooks.has('targetScore')\n\tworld.spatial.query(entity.pos.x, entity.pos.z, reach + entity.def.radius, candidates, sideTest(world, entity.owner))\n\tlet best: Entity | undefined\n\tlet bestScore = -Infinity\n\tlet passed = false\n\t// its own side's are never what it picks by itself (`CanAttack.ordered`): passed over before anything is asked of\n\t// them, as most of what stands around a unit in a crowd is its own (EN1). Asked once for each owner in a row\n\tconst { owner } = entity\n\tlet sideOf = owner\n\tlet ownSide = true\n\t// an attack with a dead zone (`AttackDef.minRange`): what is in it is not picked by itself\n\tconst nearest = entity.def.attacks?.some(hasDeadZone) ?? false\n\t// a summon goes for whoever hit its master, ahead of what is nearer (`Summoned.aggro`)\n\tconst brought = entity.get(summoned)\n\tconst foe = brought?.foe && brought.foeUntil! > world.time ? brought.foe : 0\n\tfor (const other of candidates) {\n\t\tif (other.def.ignored) continue\n\t\tif (other.owner !== sideOf) {\n\t\t\tsideOf = other.owner\n\t\t\townSide = world.areAllies(owner, sideOf)\n\t\t}\n\t\tif (ownSide) continue\n\t\t// the cheapest first: the grid gives the square around, much of it out of reach\n\t\tconst distance = edgeDistance(entity, other)\n\t\tif (distance > reach || !canAttack(world, entity, other) || !canSee(world, entity, other)) continue\n\t\tif (inRange !== undefined && distance > rangeAgainst(world, entity, other) + inRange) continue\n\t\tif (nearest && tooNear(entity, other, Math.max(pickAttack(world, entity, other), 0))) continue\n\t\tif (!shunned && isShunned(world, entity, other)) {\n\t\t\tpassed = true\n\t\t\tcontinue\n\t\t}\n\t\t// things that fight back first, then whatever is closest; one already surrounded by its like only when nothing\n\t\t// else is to be had\n\t\tconst threat = other.def.threat ?? (other.def.attacks?.length ? 2 : other.isBuilding ? 0 : 1)\n\t\tconst engaged = other.id === entity.get(fighting)?.engaged ? 0 : engagedLike(world, other, entity)\n\t\tconst room = roomFor(world, other, entity)\n\t\tlet score = threat * 1000 - distance - (engaged >= room ? CROWDED : 0)\n\t\tif (foe && other.id === foe) score += FOE_BONUS\n\t\tif (hooked) {\n\t\t\tscoring.attacker = entity\n\t\t\tscoring.target = other\n\t\t\tscoring.distance = distance\n\t\t\tscoring.engaged = engaged\n\t\t\tscoring.room = room\n\t\t\tscoring.score = score\n\t\t\tscore = world.hooks.run('targetScore', scoring).score\n\t\t}\n\t\tif (score > bestScore) {\n\t\t\tbestScore = score\n\t\t\tbest = other\n\t\t}\n\t}\n\tfound.target = best\n\tfound.passedOver = passed\n\treturn found\n}\n\n/**\n * Calls off the swing under way, before its blow: said (`swingCancelled`) when there was one, for the screen to cut\n * the attack to the walk. What has been swung already is not given back: the cooldown runs as it did\n */\nexport function cancelSwing(world: World, entity: Entity): void {\n\tconst combat = entity.get(fighting)\n\tif (!combat) return\n\tif (combat.swing > 0) {\n\t\tconst target = combat.swingTarget > 0 ? world.get(combat.swingTarget) : undefined\n\t\tcombat.swing = 0\n\t\tcombat.swingTarget = 0\n\t\tworld.events.emit(swingCancelled, { attacker: entity, target, weapon: combat.weapon ?? 0 })\n\t\treturn\n\t}\n\tcombat.swing = 0\n\tcombat.swingTarget = 0\n}\n\n/** What an attack arrives with */\ntype Hit = Pick<Projectile, 'damage' | 'type' | 'crit' | 'tags' | 'how' | 'weapon'>\n\nconst caught: Entity[] = []\n\n/** What an attack that hits an area does where it comes down */\nfunction explode(world: World, point: Vec2, hit: Hit, splash: NonNullable<Projectile['splash']>, owner: PlayerId, source?: Entity): void {\n\tconst { radius, fells, targets } = splash\n\t// the list is copied: what dies in here may set off more of the same\n\tfor (const other of [...world.spatial.query(point.x, point.z, radius, caught)]) {\n\t\tif (!other.alive || other.hidden) continue\n\t\tconst distance = distanceToEdge(point, other)\n\t\tif (distance > radius) continue\n\t\tif (other.def.fellable) {\n\t\t\tif (fells) world.kill(other, source, false, 'felled')\n\t\t\tcontinue\n\t\t}\n\t\tif (other.def.invulnerable || other.def.targetableBy) continue\n\t\tif (other.buffs.length && isUntargetable(world, other)) continue\n\t\tif (!reaches(targets, other, other.flying ? layerOf(world, other) : 'ground')) continue\n\t\t// friend or foe, whoever stands there, as the rules share it out: by default all but the one who fired\n\t\tconst share = world.settings.combat.splash(world, source, other, distance, radius)\n\t\tif (share <= 0) continue\n\t\tworld.damage(other, hit.damage * share, source, {\n\t\t\tdamageType: hit.type,\n\t\t\tcrit: hit.crit,\n\t\t\tattack: true,\n\t\t\ttags: hit.tags,\n\t\t\thow: hit.how\n\t\t})\n\t}\n\tworld.events.emit(impact, { x: point.x, z: point.z, radius, owner })\n}\n\nconst splashOf = (attack: AttackDef, radius = attack.splash) =>\n\tradius ? { radius, fells: attack.fells ?? false, targets: attack.targets } : undefined\n\n/** The attack of the entity at that place goes off: at the target, or at a spot on the ground */\nfunction landHit(world: World, attacker: Entity, weapon: number, target: Entity | undefined, point: Vec2 = target!.pos): void {\n\tconst attack = attacker.def.attacks?.[weapon]\n\t// (an attack that goes off is a type's that has one)\n\tif (!attack) return\n\tconst stats = statsOf(world, attacker)\n\t// a critical strike, as the game has them (none in the engine's rules), then whether it goes wide\n\tconst critical = world.settings.combat.critical(world, attacker, stats)\n\tlet crit = critical !== undefined\n\tconst chance = target ? world.settings.combat.missChance(world, attacker, target) : 0\n\tlet miss = chance > 0 && world.rng.next() < chance\n\tlet damage = attackStat(stats, attack, 'damage') * (critical ?? 1)\n\tlet type = attack.damageType ?? 'physical'\n\tlet splash = splashOf(attack)\n\tlet speed = attack.projectileSpeed ?? 0\n\tlet look: string | undefined\n\tlet tags: string[] | undefined\n\t// how what it kills dies, for the screen: the attack's word, or one it decides for this blow\n\tlet how = typeof attack.how === 'function' ? attack.how({ attacker, target, damage, type, crit, tags }) : attack.how\n\t// what the game makes of it, as it goes off: a bounce, a flaming arrow, a blow called off\n\tif (world.hooks.has('beforeAttack')) {\n\t\tconst before = world.hooks.run('beforeAttack', {\n\t\t\tattacker,\n\t\t\ttarget,\n\t\t\tpoint,\n\t\t\tweapon,\n\t\t\tdamage,\n\t\t\ttype,\n\t\t\tcrit,\n\t\t\tmiss,\n\t\t\tsplash: splash?.radius,\n\t\t\tprojectileSpeed: speed,\n\t\t\tlook,\n\t\t\ttags,\n\t\t\thow,\n\t\t\tcancelled: false\n\t\t})\n\t\tif (before.cancelled) return\n\t\t;({ damage, type, crit, miss, look, tags, how } = before)\n\t\tspeed = before.projectileSpeed\n\t\tsplash = splashOf(attack, before.splash)\n\t}\n\tif (speed > 0) {\n\t\tconst projectile: Projectile = {\n\t\t\tid: world.newId(),\n\t\t\tsource: attacker.id,\n\t\t\towner: attacker.owner,\n\t\t\t// what hits an area lands where it was aimed\n\t\t\ttarget: splash || !target ? 0 : target.id,\n\t\t\tx: attacker.pos.x,\n\t\t\tz: attacker.pos.z,\n\t\t\tprevX: attacker.pos.x,\n\t\t\tprevZ: attacker.pos.z,\n\t\t\tsx: attacker.pos.x,\n\t\t\tsz: attacker.pos.z,\n\t\t\ttx: point.x,\n\t\t\ttz: point.z,\n\t\t\tspeed,\n\t\t\tdamage,\n\t\t\ttype,\n\t\t\tcrit,\n\t\t\tmiss,\n\t\t\tsplash,\n\t\t\tkind: attacker.def.id,\n\t\t\tlook,\n\t\t\ttags,\n\t\t\t...(how && { how }),\n\t\t\t// a shot of the first attack says none\n\t\t\t...(weapon > 0 && { weapon })\n\t\t}\n\t\tworld.projectiles.push(projectile)\n\t\tworld.events.emit(projectileSpawned, projectile)\n\t} else if (miss) {\n\t\tworld.events.emit(missed, { x: point.x, z: point.z, source: attacker, target })\n\t} else if (splash) {\n\t\texplode(world, point, { damage, type, crit, tags, how, weapon }, splash, attacker.owner, attacker)\n\t} else if (target && !(target.buffs.length && isUntargetable(world, target))) {\n\t\tworld.damage(target, damage, attacker, { damageType: type, crit, attack: true, tags, how })\n\t\t// a blow from up close that cleaves: the enemies round the target take their part of it too\n\t\tconst cleave = attacker.alive ? world.settings.combat.cleave(world, attacker, target, weapon) : undefined\n\t\tif (cleave) cleaveAround(world, attacker, target, attack, cleave, { damage, type, crit, tags, how, weapon })\n\t}\n}\n\n/**\n * 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\n * through it (all round when none)\n *\n * @beta\n */\nexport interface CleaveNow {\n\t/** The part of the blow's damage each other enemy takes */\n\tpart: number\n\t/** How far from the target's edge they stand */\n\tradius: number\n\t/** How wide the cone from the attacker through the target is, in radians: all round when left out */\n\tangle?: number\n}\n\n/**\n * What a blow from up close of the attacker's weapon at that place cleaves (`AttackDef.cleave`, `BuffDef.cleave`): the\n * attack's own, or a buff's at its level, whichever has the larger part. Nothing for none. The engine's\n * `RuleSettings.combat.cleave`\n *\n * @beta\n */\nexport function cleaveOf(world: World, attacker: Entity, _target: Entity, weapon: number): CleaveNow | undefined {\n\tconst own = attacker.def.attacks?.[weapon]?.cleave\n\tlet best: CleaveNow | undefined = own && { part: at(own.part, 1), radius: own.radius, angle: own.angle }\n\tfor (const instance of attacker.buffs) {\n\t\tconst cleave = world.registry.buff(instance.id).cleave\n\t\tif (!cleave) continue\n\t\tconst part = at(cleave.part, instance.level)\n\t\tif (!best || part > best.part) best = { part, radius: cleave.radius, angle: cleave.angle }\n\t}\n\treturn best && best.part > 0 && best.radius > 0 ? best : undefined\n}\n\nconst cleft: Entity[] = []\n\n/**\n * The enemies of the attacker round a target it struck from up close take their part of the blow: within `radius` of\n * the target's edge, and within the cone of `angle` from the attacker through the target where it says. Not the target,\n * nor what the attack cannot hit. Not an attack of theirs: nothing an attack sets off (`onHit`, life steal) goes off\n * for each, and its tags say `cleave`\n */\nfunction cleaveAround(world: World, attacker: Entity, target: Entity, attack: AttackDef, cleave: CleaveNow, hit: Hit): void {\n\tconst facing = atan2(target.pos.x - attacker.pos.x, target.pos.z - attacker.pos.z)\n\tconst tags = hit.tags ? [...hit.tags, 'cleave'] : ['cleave']\n\tconst reach = cleave.radius + target.def.radius + 2\n\t// the list is copied: what dies in here may set off more of the same\n\tfor (const other of [...world.spatial.query(target.pos.x, target.pos.z, reach, cleft)]) {\n\t\tif (other === target || other === attacker || !other.alive || other.hidden || other.isResource) continue\n\t\tif (!world.areEnemies(attacker.owner, other.owner) || other.def.invulnerable || other.def.targetableBy) continue\n\t\tif (other.buffs.length && isUntargetable(world, other)) continue\n\t\tif (!reaches(attack.targets, other, other.flying ? layerOf(world, other) : 'ground')) continue\n\t\tif (edgeDistance(target, other) > cleave.radius) continue\n\t\tif (cleave.angle !== undefined && Math.abs(angleDiff(atan2(other.pos.x - attacker.pos.x, other.pos.z - attacker.pos.z), facing)) > cleave.angle / 2) continue\n\t\tworld.damage(other, hit.damage * cleave.part, attacker, { damageType: hit.type, crit: hit.crit, attack: false, tags, how: hit.how })\n\t}\n}\n\n/**\n * A swing of the attack at that place begun: its time to the hit less how late in the tick the swing was due (the\n * cooldown run past 0), so that the attacks keep to the attack speed instead of each waiting out a part of a tick (bug\n * 17). At least a moment, so that the hit is the next tick's. Which attack swings is kept for a unit with more than one\n */\nfunction startSwing(world: World, entity: Entity, combat: CombatState, weapon: number): void {\n\tcombat.swing = Math.max(attackTiming(world, entity, weapon).swing + Math.min(combat.cooldown, 0), MIN_SWING)\n\tcombat.cooldown = 0\n\tif (weapon > 0 || combat.weapon !== undefined) combat.weapon = weapon\n}\n\n/**\n * A swing landed: the time to the next, of whichever attack, is the period of the one that swung less its swing, less\n * how far past the hit this tick went; and where the attack has a recovery (`AttackDef.recovery`), what it is told is\n * held for so long. Gives the attack that swung, by place\n */\nfunction endSwing(world: World, entity: Entity, combat: CombatState): number {\n\tconst weapon = combat.weapon ?? 0\n\tconst { swing, period, recovery } = attackTiming(world, entity, weapon)\n\tcombat.cooldown = Math.max(period - swing + combat.swing, 0)\n\t// (none by default: the state of a unit that has none is as it always was)\n\tif (recovery > 0 && recovery + combat.swing > 0) combat.recovery = recovery + combat.swing\n\tcombat.swing = 0\n\tcombat.swingTarget = 0\n\treturn weapon\n}\n\nexport type BombardResult = 'attacking' | 'outOfRange'\n\n/** One tick of attacking a spot on the ground, for attacks that can. Getting into range is up to the caller */\nexport function bombard(world: World, entity: Entity, point: Vec2, dt: number): BombardResult {\n\tconst combat = entity.get(fighting)\n\tconst weapon = groundAttack(entity.def)\n\t// (only a unit that can attack the ground is asked to bombard)\n\tif (!combat || weapon < 0) return 'outOfRange'\n\tconst swinging = combat.swing > 0 && combat.swingTarget === GROUND\n\tconst range = attackStat(statsOf(world, entity), entity.def.attacks![swinging ? (combat.weapon ?? 0) : weapon], 'range')\n\tif (dist(entity.pos, point) - entity.def.radius > range + (swinging ? SWING_SLACK : 0)) {\n\t\tcancelSwing(world, entity)\n\t\treturn 'outOfRange'\n\t}\n\tconst m = entity.get(moving)\n\tif (m) {\n\t\tif (m.status === 'moving') halt(world, entity)\n\t\tsetAnchored(world, entity, true)\n\t}\n\tfaceTowards(world, entity, point, dt)\n\n\tif (swinging) {\n\t\tcombat.swing -= dt\n\t\tif (combat.swing <= 0) landHit(world, entity, endSwing(world, entity, combat), undefined, point)\n\t\treturn 'attacking'\n\t}\n\tconst facing = atan2(point.x - entity.pos.x, point.z - entity.pos.z)\n\tif (combat.cooldown <= 0 && Math.abs(angleDiff(entity.facing, facing)) < FACING_TOLERANCE) {\n\t\tstartSwing(world, entity, combat, weapon)\n\t\tcombat.swingTarget = GROUND\n\t\tworld.events.emit(attackStarted, { attacker: entity, weapon })\n\t}\n\treturn 'attacking'\n}\n\n/**\n * Drives one tick of fighting a target: close the distance, turn, swing, hit.\n * Every order that fights (attack, attack-move, hold, idle auto-attack) goes through here.\n */\nexport function engage(world: World, entity: Entity, target: Entity | undefined, dt: number, chase: boolean, ordered = false): EngageResult {\n\tconst combat = entity.get(fighting)\n\tconst attacks = entity.def.attacks\n\tif (!combat || !attacks?.length || !target || !canAttack(world, entity, target, ordered) || !canSee(world, entity, target)) {\n\t\tcancelSwing(world, entity)\n\t\trelease(entity, world)\n\t\treturn 'invalid'\n\t}\n\tengageWith(world, entity, target)\n\n\tconst distance = edgeDistance(entity, target)\n\tconst swinging = combat.swing > 0 && combat.swingTarget === target.id\n\t// the attack it uses against it (its first, where a game lets it attack what none reaches); a swing begun goes on as it began\n\tconst weapon = attacks.length === 1 ? 0 : swinging ? (combat.weapon ?? 0) : Math.max(world.settings.combat.pickAttack(world, entity, target), 0)\n\tconst range = attackStat(statsOf(world, entity), attacks[weapon], 'range') + (target.isStructure ? STRUCTURE_REACH : 0)\n\t// too near for the attack it has against it (`AttackDef.minRange`): told to, it steps back out of its dead zone;\n\t// by itself it lets it be\n\tconst near = !swinging ? attacks[weapon].minRange : undefined\n\tif (near && distance < near) {\n\t\tcancelSwing(world, entity)\n\t\tif (!ordered || !chase || !entity.get(moving)) {\n\t\t\trelease(entity, world)\n\t\t\treturn 'outOfRange'\n\t\t}\n\t\tconst away = dist(entity.pos, target.pos) || 1\n\t\t// to the middle of the band it can hit from, straight away from the target\n\t\tconst to = Math.min(near + 0.5, (near + range) / 2) + entity.def.radius + target.def.radius\n\t\tconst step = { x: target.pos.x + ((entity.pos.x - target.pos.x) / away) * to, z: target.pos.z + ((entity.pos.z - target.pos.z) / away) * to }\n\t\tconst m = entity.get(moving)!\n\t\tif (m.status !== 'moving' || m.goalEntity || dist(m.goal, step) > 0.5) moveTo(world, entity, step)\n\t\treturn 'chasing'\n\t}\n\tif (distance > range + (swinging ? SWING_SLACK : 0)) {\n\t\tcancelSwing(world, entity)\n\t\tif (!chase || !entity.get(moving)) {\n\t\t\trelease(entity, world)\n\t\t\treturn 'outOfRange'\n\t\t}\n\t\tmoveToEntity(world, entity, target, Math.max(range - 0.15, 0.05))\n\t\treturn 'chasing'\n\t}\n\n\tconst m = entity.get(moving)\n\tif (m) {\n\t\tif (m.status === 'moving') halt(world, entity)\n\t\tsetAnchored(world, entity, true)\n\t}\n\tfaceTowards(world, entity, target.pos, dt)\n\n\tif (swinging) {\n\t\tcombat.swing -= dt\n\t\tif (combat.swing <= 0) landHit(world, entity, endSwing(world, entity, combat), target)\n\t\treturn 'attacking'\n\t}\n\n\tconst facing = atan2(target.pos.x - entity.pos.x, target.pos.z - entity.pos.z)\n\tif (combat.cooldown <= 0 && Math.abs(angleDiff(entity.facing, facing)) < FACING_TOLERANCE) {\n\t\tstartSwing(world, entity, combat, weapon)\n\t\tcombat.swingTarget = target.id\n\t\tworld.events.emit(attackStarted, { attacker: entity, target, weapon })\n\t}\n\treturn 'attacking'\n}\n\n/**\n * One tick of an attack that fires as the unit walks (`AttackDef.onTheMove`): what it shot at last tick while it can\n * still be hit from where the unit is, else the best in range (looked for every fourth tick), swung at without a stop\n * or a turn. Gives back what it is shooting at, none for nothing\n *\n * @beta\n */\nexport function fireOnTheMove(world: World, entity: Entity, current: number | undefined, dt: number): number | undefined {\n\tconst combat = entity.get(fighting)\n\tconst attacks = entity.def.attacks\n\tif (!combat || !attacks?.some(firesOnTheMove)) return undefined\n\tif (attacks.length && entity.buffs.length && isDisarmed(world, entity)) return undefined\n\tconst usable = (target: Entity | undefined): target is Entity => {\n\t\tif (!target || !canAttack(world, entity, target) || !canSee(world, entity, target)) return false\n\t\tconst weapon = attacks.length === 1 ? 0 : Math.max(pickAttack(world, entity, target), 0)\n\t\tif (!attacks[weapon].onTheMove || tooNear(entity, target, weapon)) return false\n\t\treturn edgeDistance(entity, target) <= attackStat(statsOf(world, entity), attacks[weapon], 'range')\n\t}\n\tlet target = current === undefined ? undefined : world.get(current)\n\tif (!usable(target)) {\n\t\tif (combat.swing > 0 && combat.swingTarget === current) cancelSwing(world, entity)\n\t\ttarget = (world.tick + entity.id) % 4 === 0 ? acquireInRange(world, entity) : undefined\n\t\tif (!usable(target)) return undefined\n\t}\n\tif (combat.swing > 0 && combat.swingTarget === target.id) {\n\t\tcombat.swing -= dt\n\t\tif (combat.swing <= 0) landHit(world, entity, endSwing(world, entity, combat), target)\n\t\treturn target.id\n\t}\n\tif (combat.cooldown <= 0) {\n\t\tconst weapon = attacks.length === 1 ? 0 : Math.max(pickAttack(world, entity, target), 0)\n\t\tstartSwing(world, entity, combat, weapon)\n\t\tcombat.swingTarget = target.id\n\t\tworld.events.emit(attackStarted, { attacker: entity, target, weapon })\n\t}\n\treturn target.id\n}\n\n/** Stops fighting: aborts the swing and lets the unit be pushed around again. */\nexport function disengage(world: World, entity: Entity): void {\n\tcancelSwing(world, entity)\n\trelease(entity, world)\n\tsetAnchored(world, entity, false)\n}\n\nexport const combatSystem: System = {\n\tname: 'combat',\n\tphase: 'resolve',\n\tupdate(world, dt) {\n\t\tfor (const entity of world.index.with(fighting)) {\n\t\t\tconst combat = entity.get(fighting)\n\t\t\tif (!combat) continue\n\t\t\t// what is left over past 0 is the part of this tick the next swing was already due in: kept for the next tick's\n\t\t\t// swing, dropped where no swing took it\n\t\t\tif (combat.cooldown > 0) combat.cooldown -= dt\n\t\t\telse if (combat.cooldown < 0) combat.cooldown = 0\n\t\t\tif (combat.recovery !== undefined && (combat.recovery -= dt) <= 0) delete combat.recovery\n\t\t}\n\n\t\tconst { projectiles } = world\n\t\tfor (let i = projectiles.length - 1; i >= 0; i--) {\n\t\t\tconst p = projectiles[i]\n\t\t\tconst target = world.get(p.target)\n\t\t\tif (target && !target.hidden) {\n\t\t\t\tp.tx = target.pos.x\n\t\t\t\tp.tz = target.pos.z\n\t\t\t}\n\t\t\tp.prevX = p.x\n\t\t\tp.prevZ = p.z\n\t\t\tconst dx = p.x - p.tx\n\t\t\tconst dz = p.z - p.tz\n\t\t\tconst remaining = Math.sqrt(dx * dx + dz * dz)\n\t\t\tconst step = p.speed * dt\n\t\t\tif (remaining <= step + (target ? target.def.radius * 0.5 : 0)) {\n\t\t\t\tif (p.miss) world.events.emit(missed, { x: p.tx, z: p.tz, source: world.get(p.source), target })\n\t\t\t\telse if (p.splash) explode(world, { x: p.tx, z: p.tz }, p, p.splash, p.owner, world.get(p.source))\n\t\t\t\t// one out of reach as it arrives is not struck (AB9): it flies past\n\t\t\t\telse if (target && !(target.buffs.length && isUntargetable(world, target))) {\n\t\t\t\t\tconst source = world.get(p.source)\n\t\t\t\t\tworld.damage(target, p.damage, source, {\n\t\t\t\t\t\tdamageType: p.type,\n\t\t\t\t\t\tcrit: p.crit,\n\t\t\t\t\t\tattack: true,\n\t\t\t\t\t\ttags: p.tags,\n\t\t\t\t\t\thow: p.how\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t\tprojectiles.splice(i, 1)\n\t\t\t\tworld.events.emit(projectileRemoved, p)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tp.x += ((p.tx - p.x) / remaining) * step\n\t\t\tp.z += ((p.tz - p.z) / remaining) * step\n\t\t}\n\t}\n}\n"],"mappings":"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"}
@@ -4,6 +4,8 @@
4
4
  */
5
5
  /** A swing, to those who see the attacker */
6
6
  export declare const toldAttack: import("..").ReplicatedEvent;
7
+ /** A swing called off before its blow, to those who see the attacker */
8
+ export declare const toldAttackCancelled: import("..").ReplicatedEvent;
7
9
  /** A shot landing: to its side, and to those who see where */
8
10
  export declare const toldShot: import("..").ReplicatedEvent;
9
11
  /** A miss, to those who see who missed or who was missed */
@@ -11,4 +13,4 @@ export declare const toldMiss: import("..").ReplicatedEvent;
11
13
  /** A blast: to its side, and to those who see where */
12
14
  export declare const toldImpact: import("..").ReplicatedEvent;
13
15
  /** The projectiles in flight the player is told of: their side's, and those where they see (`Snapshot.projectiles`); none to a computer */
14
- export declare const projectilesPart: import("..").SnapshotPart<keyof import("..").Snapshot>;
16
+ export declare const projectilesPart: import("..").SnapshotField<keyof import("..").Snapshot>;
@@ -0,0 +1,85 @@
1
+ import { attackStarted, impact, missed, projectileRemoved, swingCancelled } from "../engineEvents.js";
2
+ import { replicateEvent, snapshotField } from "../replication.js";
3
+ //#region src/systems/combatTold.ts
4
+ /**
5
+ * What players are told of fights (the combat system's events): a swing, a shot landing, a miss, a blast. Beside the
6
+ * combat system, which emits them
7
+ */
8
+ /** A swing, to those who see the attacker */
9
+ var toldAttack = replicateEvent(attackStarted, "attack", ({ attacker, target, weapon }, view) => view.knows(attacker) ? {
10
+ type: "attack",
11
+ id: attacker.id,
12
+ target: target && view.knows(target) ? target.id : void 0,
13
+ ...weapon > 0 && { weapon }
14
+ } : void 0);
15
+ /** A swing called off before its blow, to those who see the attacker */
16
+ var toldAttackCancelled = replicateEvent(swingCancelled, "attackCancelled", ({ attacker }, view) => view.knows(attacker) ? {
17
+ type: "attackCancelled",
18
+ id: attacker.id
19
+ } : void 0);
20
+ /** A shot landing: to its side, and to those who see where */
21
+ var toldShot = replicateEvent(projectileRemoved, "shot", (shot, view) => {
22
+ if (!view.isAlly(shot.owner) && !view.sees(shot.tx, shot.tz)) return void 0;
23
+ const target = shot.splash ? void 0 : view.world.get(shot.target);
24
+ return {
25
+ type: "shot",
26
+ id: shot.id,
27
+ x: shot.tx,
28
+ z: shot.tz,
29
+ target: target && view.knows(target) ? target.id : void 0,
30
+ miss: shot.miss,
31
+ crit: shot.crit
32
+ };
33
+ });
34
+ /** A miss, to those who see who missed or who was missed */
35
+ var toldMiss = replicateEvent(missed, "miss", ({ x, z, source, target }, view) => source && view.knows(source) || target && view.knows(target) ? {
36
+ type: "miss",
37
+ x,
38
+ z
39
+ } : void 0);
40
+ /** A blast: to its side, and to those who see where */
41
+ var toldImpact = replicateEvent(impact, "impact", ({ x, z, radius, owner }, view) => view.isAlly(owner) || view.sees(x, z) ? {
42
+ type: "impact",
43
+ x,
44
+ z,
45
+ radius
46
+ } : void 0);
47
+ /** The projectiles in flight the player is told of: their side's, and those where they see (`Snapshot.projectiles`); none to a computer */
48
+ var projectilesPart = snapshotField("projectiles", (view) => {
49
+ const projectiles = [];
50
+ if (view.forComputer) return projectiles;
51
+ const { world } = view;
52
+ for (const p of world.projectiles) {
53
+ if (!view.isAlly(p.owner) && !view.sees(p.x, p.z)) continue;
54
+ const source = world.get(p.source);
55
+ const state = {
56
+ id: p.id,
57
+ x: p.x,
58
+ z: p.z,
59
+ kind: p.kind ?? "",
60
+ owner: p.owner,
61
+ crit: p.crit,
62
+ damageType: p.type,
63
+ look: p.look,
64
+ source: source && view.knows(source) ? source.id : void 0
65
+ };
66
+ const target = p.splash ? void 0 : world.get(p.target);
67
+ if (target && view.knows(target)) state.target = target.id;
68
+ if (p.splash) {
69
+ state.from = {
70
+ x: p.sx,
71
+ z: p.sz
72
+ };
73
+ state.to = {
74
+ x: p.tx,
75
+ z: p.tz
76
+ };
77
+ }
78
+ projectiles.push(state);
79
+ }
80
+ return projectiles;
81
+ });
82
+ //#endregion
83
+ export { projectilesPart, toldAttack, toldAttackCancelled, toldImpact, toldMiss, toldShot };
84
+
85
+ //# sourceMappingURL=combatTold.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"combatTold.js","names":["missedEvent"],"sources":["../../src/systems/combatTold.ts"],"sourcesContent":["import { attackStarted, impact, swingCancelled, missed as missedEvent, projectileRemoved } from '#engine/engineEvents'\nimport { replicateEvent, snapshotField } from '../replication'\nimport type { ProjectileState } from '../session/protocol'\n\n/**\n * What players are told of fights (the combat system's events): a swing, a shot landing, a miss, a blast. Beside the\n * combat system, which emits them\n */\n\n/** A swing, to those who see the attacker */\nexport const toldAttack = replicateEvent(attackStarted, 'attack', ({ attacker, target, weapon }, view) =>\n\tview.knows(attacker)\n\t\t? { type: 'attack', id: attacker.id, target: target && view.knows(target) ? target.id : undefined, ...(weapon > 0 && { weapon }) }\n\t\t: undefined\n)\n\n/** A swing called off before its blow, to those who see the attacker */\nexport const toldAttackCancelled = replicateEvent(swingCancelled, 'attackCancelled', ({ attacker }, view) =>\n\tview.knows(attacker) ? { type: 'attackCancelled', id: attacker.id } : undefined\n)\n\n/** A shot landing: to its side, and to those who see where */\nexport const toldShot = replicateEvent(projectileRemoved, 'shot', (shot, view) => {\n\tif (!view.isAlly(shot.owner) && !view.sees(shot.tx, shot.tz)) return undefined\n\tconst target = shot.splash ? undefined : view.world.get(shot.target)\n\treturn {\n\t\ttype: 'shot',\n\t\tid: shot.id,\n\t\tx: shot.tx,\n\t\tz: shot.tz,\n\t\ttarget: target && view.knows(target) ? target.id : undefined,\n\t\tmiss: shot.miss,\n\t\tcrit: shot.crit\n\t}\n})\n\n/** A miss, to those who see who missed or who was missed */\nexport const toldMiss = replicateEvent(missedEvent, 'miss', ({ x, z, source, target }, view) =>\n\t(source && view.knows(source)) || (target && view.knows(target)) ? { type: 'miss', x, z } : undefined\n)\n\n/** A blast: to its side, and to those who see where */\nexport const toldImpact = replicateEvent(impact, 'impact', ({ x, z, radius, owner }, view) =>\n\tview.isAlly(owner) || view.sees(x, z) ? { type: 'impact', x, z, radius } : undefined\n)\n\n/** The projectiles in flight the player is told of: their side's, and those where they see (`Snapshot.projectiles`); none to a computer */\nexport const projectilesPart = snapshotField('projectiles', (view) => {\n\tconst projectiles: ProjectileState[] = []\n\tif (view.forComputer) return projectiles\n\tconst { world } = view\n\tfor (const p of world.projectiles) {\n\t\tif (!view.isAlly(p.owner) && !view.sees(p.x, p.z)) continue\n\t\tconst source = world.get(p.source)\n\t\tconst state: ProjectileState = {\n\t\t\tid: p.id,\n\t\t\tx: p.x,\n\t\t\tz: p.z,\n\t\t\tkind: p.kind ?? '',\n\t\t\towner: p.owner,\n\t\t\tcrit: p.crit,\n\t\t\tdamageType: p.type,\n\t\t\tlook: p.look,\n\t\t\tsource: source && view.knows(source) ? source.id : undefined\n\t\t}\n\t\tconst target = p.splash ? undefined : world.get(p.target)\n\t\tif (target && view.knows(target)) state.target = target.id\n\t\tif (p.splash) {\n\t\t\tstate.from = { x: p.sx, z: p.sz }\n\t\t\tstate.to = { x: p.tx, z: p.tz }\n\t\t}\n\t\tprojectiles.push(state)\n\t}\n\treturn projectiles\n})\n"],"mappings":";;;;;;;;AAUA,IAAa,aAAa,eAAe,eAAe,WAAW,EAAE,UAAU,QAAQ,UAAU,SAChG,KAAK,MAAM,QAAQ,IAChB;CAAE,MAAM;CAAU,IAAI,SAAS;CAAI,QAAQ,UAAU,KAAK,MAAM,MAAM,IAAI,OAAO,KAAK,KAAA;CAAW,GAAI,SAAS,KAAK,EAAE,OAAO;AAAG,IAC/H,KAAA,CACJ;;AAGA,IAAa,sBAAsB,eAAe,gBAAgB,oBAAoB,EAAE,YAAY,SACnG,KAAK,MAAM,QAAQ,IAAI;CAAE,MAAM;CAAmB,IAAI,SAAS;AAAG,IAAI,KAAA,CACvE;;AAGA,IAAa,WAAW,eAAe,mBAAmB,SAAS,MAAM,SAAS;CACjF,IAAI,CAAC,KAAK,OAAO,KAAK,KAAK,KAAK,CAAC,KAAK,KAAK,KAAK,IAAI,KAAK,EAAE,GAAG,OAAO,KAAA;CACrE,MAAM,SAAS,KAAK,SAAS,KAAA,IAAY,KAAK,MAAM,IAAI,KAAK,MAAM;CACnE,OAAO;EACN,MAAM;EACN,IAAI,KAAK;EACT,GAAG,KAAK;EACR,GAAG,KAAK;EACR,QAAQ,UAAU,KAAK,MAAM,MAAM,IAAI,OAAO,KAAK,KAAA;EACnD,MAAM,KAAK;EACX,MAAM,KAAK;CACZ;AACD,CAAC;;AAGD,IAAa,WAAW,eAAeA,QAAa,SAAS,EAAE,GAAG,GAAG,QAAQ,UAAU,SACrF,UAAU,KAAK,MAAM,MAAM,KAAO,UAAU,KAAK,MAAM,MAAM,IAAK;CAAE,MAAM;CAAQ;CAAG;AAAE,IAAI,KAAA,CAC7F;;AAGA,IAAa,aAAa,eAAe,QAAQ,WAAW,EAAE,GAAG,GAAG,QAAQ,SAAS,SACpF,KAAK,OAAO,KAAK,KAAK,KAAK,KAAK,GAAG,CAAC,IAAI;CAAE,MAAM;CAAU;CAAG;CAAG;AAAO,IAAI,KAAA,CAC5E;;AAGA,IAAa,kBAAkB,cAAc,gBAAgB,SAAS;CACrE,MAAM,cAAiC,CAAC;CACxC,IAAI,KAAK,aAAa,OAAO;CAC7B,MAAM,EAAE,UAAU;CAClB,KAAK,MAAM,KAAK,MAAM,aAAa;EAClC,IAAI,CAAC,KAAK,OAAO,EAAE,KAAK,KAAK,CAAC,KAAK,KAAK,EAAE,GAAG,EAAE,CAAC,GAAG;EACnD,MAAM,SAAS,MAAM,IAAI,EAAE,MAAM;EACjC,MAAM,QAAyB;GAC9B,IAAI,EAAE;GACN,GAAG,EAAE;GACL,GAAG,EAAE;GACL,MAAM,EAAE,QAAQ;GAChB,OAAO,EAAE;GACT,MAAM,EAAE;GACR,YAAY,EAAE;GACd,MAAM,EAAE;GACR,QAAQ,UAAU,KAAK,MAAM,MAAM,IAAI,OAAO,KAAK,KAAA;EACpD;EACA,MAAM,SAAS,EAAE,SAAS,KAAA,IAAY,MAAM,IAAI,EAAE,MAAM;EACxD,IAAI,UAAU,KAAK,MAAM,MAAM,GAAG,MAAM,SAAS,OAAO;EACxD,IAAI,EAAE,QAAQ;GACb,MAAM,OAAO;IAAE,GAAG,EAAE;IAAI,GAAG,EAAE;GAAG;GAChC,MAAM,KAAK;IAAE,GAAG,EAAE;IAAI,GAAG,EAAE;GAAG;EAC/B;EACA,YAAY,KAAK,KAAK;CACvB;CACA,OAAO;AACR,CAAC"}
@@ -0,0 +1,80 @@
1
+ import { constructionOf } from "../defs.js";
2
+ import { defineComponent, snapshotOf } from "../components.js";
3
+ import { constructionCancelled, constructionFinished, constructionStarted, worked } from "../engineEvents.js";
4
+ import { replicateEvent } from "../replication.js";
5
+ //#region src/systems/construction.ts
6
+ /** Whether two parts done of a whole say the same to a screen: to a hundredth, what a bar shows and the wire sends */
7
+ var sameHundredth = (a, b) => Math.round(a * 100) === Math.round(b * 100);
8
+ /**
9
+ * A structure being built: how far it is, how long it takes, who works on it (`UnitTypeDef.construction`). Set as a
10
+ * site is put down (`SpawnOptions.underConstruction`), taken off once it stands; a structure's only (a unit given it is
11
+ * not seen as one). Everyone who sees it is told how far it is (0..1)
12
+ *
13
+ * @beta
14
+ */
15
+ var constructionSite = defineComponent({
16
+ id: "core.construction",
17
+ replicate: "everyone",
18
+ snapshot: (site) => site.progress,
19
+ same: sameHundredth
20
+ });
21
+ /**
22
+ * What a structure being built has done and needs: none once it stands, or for what was put down whole (`constructionSite`)
23
+ *
24
+ * @beta
25
+ */
26
+ var underConstruction = (entity) => entity.get(constructionSite);
27
+ /**
28
+ * How far a structure in a snapshot is built, 0..1: undefined for one that stands (a screen's, a computer player's view)
29
+ *
30
+ * @beta
31
+ */
32
+ var builtSoFar = (state) => snapshotOf(state, constructionSite);
33
+ var constructionSystem = {
34
+ name: "construction",
35
+ phase: "resolve",
36
+ over: constructionSite,
37
+ each(world, entity, dt) {
38
+ const site = entity.isStructure ? underConstruction(entity) : void 0;
39
+ if (!site || !entity.alive) return;
40
+ if (constructionOf(entity.def) === "self") site.builders = 1;
41
+ if (site.builders > 0) {
42
+ const { buildRate } = entity.def;
43
+ const rate = buildRate ? buildRate(site.builders, world, entity) : world.settings.production.buildRate(world, entity, site.builders);
44
+ const step = Math.min(dt * rate / site.buildTime, 1 - site.progress);
45
+ site.progress += step;
46
+ entity.health = Math.min(entity.health + step * entity.maxHealth * (1 - world.settings.production.constructionHealth), entity.maxHealth);
47
+ site.builders = 0;
48
+ }
49
+ if (site.progress >= 1 - 1e-9) {
50
+ if (entity.maxHealth - entity.health < 1e-6 * entity.maxHealth) entity.health = entity.maxHealth;
51
+ entity.remove(constructionSite);
52
+ world.events.emit(constructionFinished, entity);
53
+ }
54
+ }
55
+ };
56
+ /** A structure begun, to those who see it: with how long it takes */
57
+ var toldConstructionStarted = replicateEvent(constructionStarted, "constructionStarted", (entity, view) => view.knows(entity) ? {
58
+ type: "constructionStarted",
59
+ id: entity.id,
60
+ buildTime: underConstruction(entity)?.buildTime ?? 0
61
+ } : void 0);
62
+ /** A structure finished, to those who see it */
63
+ var toldBuilt = replicateEvent(constructionFinished, "built", (entity, view) => view.knows(entity) ? {
64
+ type: "built",
65
+ id: entity.id
66
+ } : void 0);
67
+ /** A structure called off while being built, to those who see it */
68
+ var toldConstructionCancelled = replicateEvent(constructionCancelled, "constructionCancelled", (entity, view) => view.knows(entity) ? {
69
+ type: "constructionCancelled",
70
+ id: entity.id
71
+ } : void 0);
72
+ /** A blow of a builder's hammer, to those who see the builder */
73
+ var toldWork = replicateEvent(worked, "work", ({ worker }, view) => view.knows(worker) ? {
74
+ type: "work",
75
+ id: worker.id
76
+ } : void 0);
77
+ //#endregion
78
+ export { builtSoFar, constructionSite, constructionSystem, sameHundredth, toldBuilt, toldConstructionCancelled, toldConstructionStarted, toldWork, underConstruction };
79
+
80
+ //# sourceMappingURL=construction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"construction.js","names":[],"sources":["../../src/systems/construction.ts"],"sourcesContent":["import { constructionCancelled, constructionFinished, constructionStarted, worked } from '#engine/engineEvents'\nimport { defineComponent, snapshotOf } from '#engine/components'\nimport { constructionOf } from '#engine/defs'\nimport type { ConstructionState, Entity } from '#engine/entity'\nimport type { EntityState } from '#engine/session/protocol'\nimport type { System } from '#engine/registry'\nimport { replicateEvent } from '../replication'\n\n/** Whether two parts done of a whole say the same to a screen: to a hundredth, what a bar shows and the wire sends */\nexport const sameHundredth = (a: number, b: number) => Math.round(a * 100) === Math.round(b * 100)\n\n/**\n * A structure being built: how far it is, how long it takes, who works on it (`UnitTypeDef.construction`). Set as a\n * site is put down (`SpawnOptions.underConstruction`), taken off once it stands; a structure's only (a unit given it is\n * not seen as one). Everyone who sees it is told how far it is (0..1)\n *\n * @beta\n */\nexport const constructionSite = defineComponent<ConstructionState, number>({ id: 'core.construction', replicate: 'everyone',\n\tsnapshot: (site) => site.progress,\n\t// a delta sent for every hundredth, not every tick\n\tsame: sameHundredth })\n\n/**\n * What a structure being built has done and needs: none once it stands, or for what was put down whole (`constructionSite`)\n *\n * @beta\n */\nexport const underConstruction = (entity: Entity): ConstructionState | undefined => entity.get(constructionSite)\n\n/**\n * How far a structure in a snapshot is built, 0..1: undefined for one that stands (a screen's, a computer player's view)\n *\n * @beta\n */\nexport const builtSoFar = (state: EntityState): number | undefined => snapshotOf(state, constructionSite)\n\nexport const constructionSystem: System = {\n\tname: 'construction',\n\tphase: 'resolve',\n\t// only the sites: not every unit and building of the map (OB5)\n\tover: constructionSite,\n\teach(world, entity, dt) {\n\t\tconst site = entity.isStructure ? underConstruction(entity) : undefined\n\t\tif (!site || !entity.alive) return\n\t\t// what goes up on its own does so as with one builder at it\n\t\tif (constructionOf(entity.def) === 'self') site.builders = 1\n\t\tif (site.builders > 0) {\n\t\t\tconst { buildRate } = entity.def\n\t\t\tconst rate = buildRate ? buildRate(site.builders, world, entity) : world.settings.production.buildRate(world, entity, site.builders)\n\t\t\tconst step = Math.min((dt * rate) / site.buildTime, 1 - site.progress)\n\t\t\tsite.progress += step\n\t\t\t// sites start with a part of their health (`RuleSettings.production.constructionHealth`) and gain the rest while being built\n\t\t\tentity.health = Math.min(entity.health + step * entity.maxHealth * (1 - world.settings.production.constructionHealth), entity.maxHealth)\n\t\t\tsite.builders = 0\n\t\t}\n\t\tif (site.progress >= 1 - 1e-9) {\n\t\t\t// what adding up the steps fell short of by rounding: a site nobody hurt is whole when it is done\n\t\t\tif (entity.maxHealth - entity.health < 1e-6 * entity.maxHealth) entity.health = entity.maxHealth\n\t\t\tentity.remove(constructionSite)\n\t\t\tworld.events.emit(constructionFinished, entity)\n\t\t}\n\t}\n}\n\n/** A structure begun, to those who see it: with how long it takes */\nexport const toldConstructionStarted = replicateEvent(constructionStarted, 'constructionStarted', (entity, view) =>\n\tview.knows(entity) ? { type: 'constructionStarted', id: entity.id, buildTime: underConstruction(entity)?.buildTime ?? 0 } : undefined\n)\n\n/** A structure finished, to those who see it */\nexport const toldBuilt = replicateEvent(constructionFinished, 'built', (entity, view) =>\n\tview.knows(entity) ? { type: 'built', id: entity.id } : undefined\n)\n\n/** A structure called off while being built, to those who see it */\nexport const toldConstructionCancelled = replicateEvent(constructionCancelled, 'constructionCancelled', (entity, view) =>\n\tview.knows(entity) ? { type: 'constructionCancelled', id: entity.id } : undefined\n)\n\n/** A blow of a builder's hammer, to those who see the builder */\nexport const toldWork = replicateEvent(worked, 'work', ({ worker }, view) => (view.knows(worker) ? { type: 'work', id: worker.id } : undefined))\n"],"mappings":";;;;;;AASA,IAAa,iBAAiB,GAAW,MAAc,KAAK,MAAM,IAAI,GAAG,MAAM,KAAK,MAAM,IAAI,GAAG;;;;;;;;AASjG,IAAa,mBAAmB,gBAA2C;CAAE,IAAI;CAAqB,WAAW;CAChH,WAAW,SAAS,KAAK;CAEzB,MAAM;AAAc,CAAC;;;;;;AAOtB,IAAa,qBAAqB,WAAkD,OAAO,IAAI,gBAAgB;;;;;;AAO/G,IAAa,cAAc,UAA2C,WAAW,OAAO,gBAAgB;AAExG,IAAa,qBAA6B;CACzC,MAAM;CACN,OAAO;CAEP,MAAM;CACN,KAAK,OAAO,QAAQ,IAAI;EACvB,MAAM,OAAO,OAAO,cAAc,kBAAkB,MAAM,IAAI,KAAA;EAC9D,IAAI,CAAC,QAAQ,CAAC,OAAO,OAAO;EAE5B,IAAI,eAAe,OAAO,GAAG,MAAM,QAAQ,KAAK,WAAW;EAC3D,IAAI,KAAK,WAAW,GAAG;GACtB,MAAM,EAAE,cAAc,OAAO;GAC7B,MAAM,OAAO,YAAY,UAAU,KAAK,UAAU,OAAO,MAAM,IAAI,MAAM,SAAS,WAAW,UAAU,OAAO,QAAQ,KAAK,QAAQ;GACnI,MAAM,OAAO,KAAK,IAAK,KAAK,OAAQ,KAAK,WAAW,IAAI,KAAK,QAAQ;GACrE,KAAK,YAAY;GAEjB,OAAO,SAAS,KAAK,IAAI,OAAO,SAAS,OAAO,OAAO,aAAa,IAAI,MAAM,SAAS,WAAW,qBAAqB,OAAO,SAAS;GACvI,KAAK,WAAW;EACjB;EACA,IAAI,KAAK,YAAY,IAAI,MAAM;GAE9B,IAAI,OAAO,YAAY,OAAO,SAAS,OAAO,OAAO,WAAW,OAAO,SAAS,OAAO;GACvF,OAAO,OAAO,gBAAgB;GAC9B,MAAM,OAAO,KAAK,sBAAsB,MAAM;EAC/C;CACD;AACD;;AAGA,IAAa,0BAA0B,eAAe,qBAAqB,wBAAwB,QAAQ,SAC1G,KAAK,MAAM,MAAM,IAAI;CAAE,MAAM;CAAuB,IAAI,OAAO;CAAI,WAAW,kBAAkB,MAAM,CAAC,EAAE,aAAa;AAAE,IAAI,KAAA,CAC7H;;AAGA,IAAa,YAAY,eAAe,sBAAsB,UAAU,QAAQ,SAC/E,KAAK,MAAM,MAAM,IAAI;CAAE,MAAM;CAAS,IAAI,OAAO;AAAG,IAAI,KAAA,CACzD;;AAGA,IAAa,4BAA4B,eAAe,uBAAuB,0BAA0B,QAAQ,SAChH,KAAK,MAAM,MAAM,IAAI;CAAE,MAAM;CAAyB,IAAI,OAAO;AAAG,IAAI,KAAA,CACzE;;AAGA,IAAa,WAAW,eAAe,QAAQ,SAAS,EAAE,UAAU,SAAU,KAAK,MAAM,MAAM,IAAI;CAAE,MAAM;CAAQ,IAAI,OAAO;AAAG,IAAI,KAAA,CAAU"}
@@ -1,12 +1,6 @@
1
1
  import type { System } from '#engine/registry';
2
2
  import type { SessionView } from '../replication';
3
3
  import type { MineInfo } from '../session/protocol';
4
- /**
5
- * Keeps every player's supply in sync with what they own and have queued: what their units take (`GameRules.supply.of`,
6
- * those in a queue too) against what their finished buildings provide, changed by the game's `supplyCap` hook and held
7
- * under the game's most. The same for each of the game's other pools (`GameRules.supply.pools`), from the types' `supplies`
8
- * and `suppliesProvided`
9
- */
10
4
  export declare const supplySystem: System;
11
5
  /** A tree chopped, to those who see the worker and the tree */
12
6
  export declare const toldChop: import("..").ReplicatedEvent;
@@ -0,0 +1,128 @@
1
+ import { supplyGivenOf } from "../defs.js";
2
+ import { chopped, resourceChanged } from "../engineEvents.js";
3
+ import { replicateEvent } from "../replication.js";
4
+ import { productionOf, productionQueue } from "./productionQueue.js";
5
+ import { heroState } from "../hero.js";
6
+ //#region src/systems/economy.ts
7
+ /**
8
+ * Keeps every player's supply in sync with what they own and have queued: what their units take (`RuleSettings.supply.of`,
9
+ * those in a queue too) against what their finished buildings provide, changed by the game's `supplyCap` hook and held
10
+ * under the game's most. The same for each of the game's other pools (`RuleSettings.supply.pools`), from the types' `supply`
11
+ * and `supplyGiven`
12
+ */
13
+ /** Adds what a type says by pool (`UnitTypeDef.supply`, `supplyGiven`) to the player's pools of that name, the one pool apart */
14
+ function poolsTaken(player, said, of) {
15
+ if (!said || typeof said === "number") return;
16
+ for (const name in said) if (name !== "supply" && player.supplies[name]) player.supplies[name][of] += said[name];
17
+ }
18
+ var supplySystem = {
19
+ name: "supply",
20
+ phase: "resolve",
21
+ update(world) {
22
+ const pools = world.settings.supply.pools ?? {};
23
+ const names = Object.keys(pools);
24
+ for (const player of world.players.values()) {
25
+ player.supplyUsed = 0;
26
+ player.supplyCap = 0;
27
+ const supplies = {};
28
+ for (const name of names) supplies[name] = {
29
+ used: 0,
30
+ cap: 0
31
+ };
32
+ player.supplies = supplies;
33
+ }
34
+ for (const entity of world.units.values()) {
35
+ if (!entity.alive && !entity.has(heroState)) continue;
36
+ const player = world.player(entity.owner);
37
+ const { def } = entity;
38
+ if (entity.isUnit) {
39
+ player.supplyUsed += world.settings.supply.of(world, entity);
40
+ poolsTaken(player, def.supply, "used");
41
+ } else if (entity.alive && entity.operational) {
42
+ player.supplyCap += supplyGivenOf(def);
43
+ poolsTaken(player, def.supplyGiven, "cap");
44
+ }
45
+ }
46
+ for (const entity of world.index.ordered(productionQueue)) {
47
+ if (entity.scenery || !entity.alive && !entity.has(heroState)) continue;
48
+ const player = world.player(entity.owner);
49
+ for (const item of productionOf(entity).queue) {
50
+ if (item.kind !== "unit") continue;
51
+ const queued = {
52
+ def: world.registry.unit(item.id),
53
+ owner: entity.owner,
54
+ queued: true
55
+ };
56
+ player.supplyUsed += world.settings.supply.of(world, queued);
57
+ poolsTaken(player, queued.def.supply, "used");
58
+ }
59
+ }
60
+ const asking = world.hooks.has("supplyCap");
61
+ for (const player of world.players.values()) {
62
+ if (asking) {
63
+ const main = {
64
+ player: player.id,
65
+ pool: "supply",
66
+ cap: player.supplyCap
67
+ };
68
+ world.hooks.run("supplyCap", main);
69
+ player.supplyCap = main.cap;
70
+ for (const name of names) {
71
+ const pool = {
72
+ player: player.id,
73
+ pool: name,
74
+ cap: player.supplies[name].cap
75
+ };
76
+ world.hooks.run("supplyCap", pool);
77
+ player.supplies[name].cap = pool.cap;
78
+ }
79
+ }
80
+ player.supplyCap = Math.max(0, Math.min(player.supplyCap, world.settings.supply.max));
81
+ for (const name of names) player.supplies[name].cap = Math.max(0, Math.min(player.supplies[name].cap, pools[name].max));
82
+ }
83
+ }
84
+ };
85
+ /** A tree chopped, to those who see the worker and the tree */
86
+ var toldChop = replicateEvent(chopped, "chop", ({ worker, source }, view) => view.knows(worker) && view.knows(source) ? {
87
+ type: "chop",
88
+ id: worker.id,
89
+ target: source.id
90
+ } : void 0);
91
+ /** What an entity carries or holds of a resource changed: its side's alone */
92
+ var toldResource = replicateEvent(resourceChanged, "resource", ({ entity, kind, amount, reason }, view) => view.isAlly(entity.owner) ? {
93
+ type: "resource",
94
+ id: entity.id,
95
+ kind,
96
+ amount,
97
+ reason
98
+ } : void 0);
99
+ /** What a seat says of the mines, once a tick (`minesFor`) */
100
+ var MINES = {};
101
+ /**
102
+ * Where the game's money is mined, as the map shows it, seen or not (`GameSession.mines`). Worked out once a tick: a
103
+ * walk of every entity, which twelve computers would each take a think. The same list every time within a tick, to read
104
+ *
105
+ * @beta
106
+ */
107
+ function minesFor(view) {
108
+ const kept = view.keep(MINES, () => ({
109
+ at: -1,
110
+ infos: []
111
+ }));
112
+ const { world } = view;
113
+ if (kept.at === world.tick) return kept.infos;
114
+ kept.at = world.tick;
115
+ const money = world.registry.currency;
116
+ const found = [];
117
+ for (const entity of world.entities.values()) if (entity.alive && money && entity.def.resource?.id === money) found.push({
118
+ id: entity.id,
119
+ x: entity.pos.x,
120
+ z: entity.pos.z
121
+ });
122
+ kept.infos = found;
123
+ return found;
124
+ }
125
+ //#endregion
126
+ export { minesFor, supplySystem, toldChop, toldResource };
127
+
128
+ //# sourceMappingURL=economy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"economy.js","names":["choppedEvent"],"sources":["../../src/systems/economy.ts"],"sourcesContent":["import { chopped as choppedEvent, resourceChanged } from '#engine/engineEvents'\nimport { MAIN_SUPPLY, supplyGivenOf, type UnitTypeDef } from '#engine/defs'\nimport type { SupplyCap } from '#engine/hooks'\nimport type { Player } from '#engine/player'\nimport { productionOf, productionQueue } from './productionQueue'\nimport type { QueuedUnit } from '#engine/rules'\nimport type { System } from '#engine/registry'\nimport { heroState } from '#engine/hero'\nimport { replicateEvent } from '../replication'\nimport type { SessionView } from '../replication'\nimport type { MineInfo } from '../session/protocol'\n\n/**\n * Keeps every player's supply in sync with what they own and have queued: what their units take (`RuleSettings.supply.of`,\n * those in a queue too) against what their finished buildings provide, changed by the game's `supplyCap` hook and held\n * under the game's most. The same for each of the game's other pools (`RuleSettings.supply.pools`), from the types' `supply`\n * and `supplyGiven`\n */\n/** Adds what a type says by pool (`UnitTypeDef.supply`, `supplyGiven`) to the player's pools of that name, the one pool apart */\nfunction poolsTaken(player: Player, said: UnitTypeDef['supply'], of: 'used' | 'cap'): void {\n\tif (!said || typeof said === 'number') return\n\tfor (const name in said) if (name !== MAIN_SUPPLY && player.supplies[name]) player.supplies[name][of] += said[name]\n}\n\nexport const supplySystem: System = {\n\tname: 'supply',\n\tphase: 'resolve',\n\tupdate(world) {\n\t\tconst pools = world.settings.supply.pools ?? {}\n\t\tconst names = Object.keys(pools)\n\t\tfor (const player of world.players.values()) {\n\t\t\tplayer.supplyUsed = 0\n\t\t\tplayer.supplyCap = 0\n\t\t\tconst supplies: Record<string, { used: number; cap: number }> = {}\n\t\t\tfor (const name of names) supplies[name] = { used: 0, cap: 0 }\n\t\t\tplayer.supplies = supplies\n\t\t}\n\t\tfor (const entity of world.units.values()) {\n\t\t\t// fallen heroes keep their place at the table\n\t\t\tif (!entity.alive && !entity.has(heroState)) continue\n\t\t\tconst player = world.player(entity.owner)\n\t\t\tconst { def } = entity\n\t\t\tif (entity.isUnit) {\n\t\t\t\tplayer.supplyUsed += world.settings.supply.of(world, entity)\n\t\t\t\tpoolsTaken(player, def.supply, 'used')\n\t\t\t} else if (entity.alive && entity.operational) {\n\t\t\t\tplayer.supplyCap += supplyGivenOf(def)\n\t\t\t\tpoolsTaken(player, def.supplyGiven, 'cap')\n\t\t\t}\n\t\t}\n\t\t// what is queued: only what trains, not every actor asked for a queue (OB5)\n\t\tfor (const entity of world.index.ordered(productionQueue)) {\n\t\t\tif (entity.scenery || (!entity.alive && !entity.has(heroState))) continue\n\t\t\tconst player = world.player(entity.owner)\n\t\t\tfor (const item of productionOf(entity)!.queue) {\n\t\t\t\tif (item.kind !== 'unit') continue\n\t\t\t\tconst queued: QueuedUnit = { def: world.registry.unit(item.id), owner: entity.owner, queued: true }\n\t\t\t\tplayer.supplyUsed += world.settings.supply.of(world, queued)\n\t\t\t\tpoolsTaken(player, queued.def.supply, 'used')\n\t\t\t}\n\t\t}\n\t\tconst asking = world.hooks.has('supplyCap')\n\t\tfor (const player of world.players.values()) {\n\t\t\tif (asking) {\n\t\t\t\tconst main: SupplyCap = { player: player.id, pool: 'supply', cap: player.supplyCap }\n\t\t\t\tworld.hooks.run('supplyCap', main)\n\t\t\t\tplayer.supplyCap = main.cap\n\t\t\t\tfor (const name of names) {\n\t\t\t\t\tconst pool: SupplyCap = { player: player.id, pool: name, cap: player.supplies[name].cap }\n\t\t\t\t\tworld.hooks.run('supplyCap', pool)\n\t\t\t\t\tplayer.supplies[name].cap = pool.cap\n\t\t\t\t}\n\t\t\t}\n\t\t\tplayer.supplyCap = Math.max(0, Math.min(player.supplyCap, world.settings.supply.max))\n\t\t\tfor (const name of names) player.supplies[name].cap = Math.max(0, Math.min(player.supplies[name].cap, pools[name].max))\n\t\t}\n\t}\n}\n\n/** A tree chopped, to those who see the worker and the tree */\nexport const toldChop = replicateEvent(choppedEvent, 'chop', ({ worker, source }, view) =>\n\tview.knows(worker) && view.knows(source) ? { type: 'chop', id: worker.id, target: source.id } : undefined\n)\n\n/** What an entity carries or holds of a resource changed: its side's alone */\nexport const toldResource = replicateEvent(resourceChanged, 'resource', ({ entity, kind, amount, reason }, view) =>\n\tview.isAlly(entity.owner) ? { type: 'resource', id: entity.id, kind, amount, reason } : undefined\n)\n\n/** What a seat says of the mines, once a tick (`minesFor`) */\nconst MINES = {}\n\n/**\n * Where the game's money is mined, as the map shows it, seen or not (`GameSession.mines`). Worked out once a tick: a\n * walk of every entity, which twelve computers would each take a think. The same list every time within a tick, to read\n *\n * @beta\n */\nexport function minesFor(view: SessionView): readonly MineInfo[] {\n\tconst kept = view.keep(MINES, () => ({ at: -1, infos: [] as readonly MineInfo[] }))\n\tconst { world } = view\n\tif (kept.at === world.tick) return kept.infos\n\tkept.at = world.tick\n\tconst money = world.registry.currency\n\tconst found: MineInfo[] = []\n\tfor (const entity of world.entities.values()) {\n\t\tif (entity.alive && money && entity.def.resource?.id === money) found.push({ id: entity.id, x: entity.pos.x, z: entity.pos.z })\n\t}\n\tkept.infos = found\n\treturn found\n}\n"],"mappings":"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"}
@@ -16,4 +16,4 @@ export declare const fogSystem: System;
16
16
  * What the player is told of the spots revealed (`Snapshot.reveals`): their team's own, and another's only where they see:
17
17
  * where an enemy's spell looks is the enemy's to know. A quiet one shows what it shows, and is nothing to draw; none to a computer
18
18
  */
19
- export declare const revealsPart: import("..").SnapshotPart<keyof import("..").Snapshot>;
19
+ export declare const revealsPart: import("..").SnapshotField<keyof import("..").Snapshot>;
@@ -0,0 +1,120 @@
1
+ import { statsOf } from "../stats.js";
2
+ import { snapshotField } from "../replication.js";
3
+ import { constructionSite } from "./construction.js";
4
+ import { detection, exposure } from "../entity.js";
5
+ import { layerOf } from "../abilities/buffs.js";
6
+ import { tellCellsInSight } from "../cellLayers.js";
7
+ //#region src/systems/fog.ts
8
+ /**
9
+ * Seconds an attacker stays in sight of the team it hit, wherever it stands
10
+ *
11
+ * @internal
12
+ */
13
+ var EXPOSED_FOR = 2;
14
+ /**
15
+ * Lets a team see the entity for a while, for having attacked it: from the dark, from high ground, from anywhere
16
+ *
17
+ * @beta
18
+ */
19
+ function expose(entity, team) {
20
+ let seconds = entity.get(exposure);
21
+ if (!seconds) entity.set(exposure, seconds = /* @__PURE__ */ new Map());
22
+ seconds.set(team, 2);
23
+ }
24
+ /**
25
+ * The level an entity looks out from. From the air, nothing is above
26
+ *
27
+ * @internal
28
+ */
29
+ var viewLevel = (world, entity) => layerOf(world, entity) === "air" ? Infinity : world.terrain.levelAt(entity.pos.x, entity.pos.z);
30
+ /**
31
+ * The circles lit during an update, four numbers each: team, x, z, radius. Kept between updates so nothing is allocated:
32
+ * written over from the start and cut to the update's at its end, as emptying it would let go of its room
33
+ */
34
+ var lit = [];
35
+ var found = [];
36
+ /**
37
+ * Works out what every team sees, every few ticks: clears the `visible` grids and lights a circle around
38
+ * everything that looks around (units and buildings by their sight, reveal spells, scouting missiles,
39
+ * invisible units that were found, attackers that gave themselves away).
40
+ */
41
+ var fogSystem = {
42
+ name: "fog",
43
+ phase: "cleanup",
44
+ every: 3,
45
+ update(world, dt) {
46
+ const { fog } = world;
47
+ let circles = 0;
48
+ const circle = (team, x, z, radius) => {
49
+ lit[circles++] = team;
50
+ lit[circles++] = x;
51
+ lit[circles++] = z;
52
+ lit[circles++] = radius;
53
+ };
54
+ const light = (team, x, z, radius, level) => {
55
+ fog.reveal(team, x, z, radius, level);
56
+ circle(team, x, z, radius);
57
+ for (const other of world.sides.visionOf(team)) {
58
+ fog.addTeam(other);
59
+ fog.reveal(other, x, z, radius, level);
60
+ circle(other, x, z, radius);
61
+ }
62
+ };
63
+ fog.beginUpdate();
64
+ for (const entity of world.units.values()) {
65
+ if (!entity.alive || entity.hidden) continue;
66
+ const owner = world.player(entity.owner);
67
+ if (owner.neutral) continue;
68
+ const { sight: full } = statsOf(world, entity);
69
+ const sight = entity.isStructure && entity.has(constructionSite) ? Math.min(full, entity.def.radius + 2) : full;
70
+ light(owner.team, entity.pos.x, entity.pos.z, sight, viewLevel(world, entity));
71
+ }
72
+ for (const reveal of world.reveals) light(reveal.team, reveal.x, reveal.z, reveal.radius);
73
+ for (const missile of world.missiles) if (missile.effect.sight) light(world.player(missile.owner).team, missile.x, missile.z, missile.effect.sight);
74
+ for (const entity of world.index.with(detection)) {
75
+ if (!entity.alive) continue;
76
+ for (const team of entity.get(detection).keys()) light(team, entity.pos.x, entity.pos.z, entity.def.radius + 1);
77
+ }
78
+ for (const entity of world.index.with(exposure)) {
79
+ const seconds = entity.get(exposure);
80
+ for (const [team, remaining] of seconds) {
81
+ const left = remaining - dt;
82
+ if (left > 0 && entity.alive && !entity.hidden) light(team, entity.pos.x, entity.pos.z, entity.def.radius + 1);
83
+ if (left > 0) seconds.set(team, left);
84
+ else seconds.delete(team);
85
+ }
86
+ if (seconds.size === 0) entity.remove(exposure);
87
+ }
88
+ fog.endUpdate();
89
+ lit.length = circles;
90
+ for (const inSight of world.sceneryInSight.values()) inSight.clear();
91
+ for (let i = 0; i < lit.length; i += 4) {
92
+ const team = lit[i];
93
+ const bit = fog.teamBit(team);
94
+ let inSight = world.sceneryInSight.get(team);
95
+ if (!inSight) world.sceneryInSight.set(team, inSight = /* @__PURE__ */ new Set());
96
+ for (const entity of world.spatial.queryStatic(lit[i + 1], lit[i + 2], lit[i + 3], found)) if (entity.scenery) {
97
+ if (inSight.has(entity) || !world.isVisibleTo(entity, team)) continue;
98
+ inSight.add(entity);
99
+ entity.seenBy |= bit;
100
+ } else if (!(entity.seenBy & bit) && world.isVisibleTo(entity, team)) entity.seenBy |= bit;
101
+ }
102
+ tellCellsInSight(world);
103
+ }
104
+ };
105
+ /**
106
+ * What the player is told of the spots revealed (`Snapshot.reveals`): their team's own, and another's only where they see:
107
+ * where an enemy's spell looks is the enemy's to know. A quiet one shows what it shows, and is nothing to draw; none to a computer
108
+ */
109
+ var revealsPart = snapshotField("reveals", (view) => view.forComputer ? [] : view.world.reveals.filter((reveal) => !reveal.quiet && (reveal.team === view.team || view.sees(reveal.x, reveal.z))).map(({ id, x, z, radius, left, team }) => ({
110
+ id,
111
+ x,
112
+ z,
113
+ radius,
114
+ left,
115
+ ours: team === view.team
116
+ })));
117
+ //#endregion
118
+ export { EXPOSED_FOR, expose, fogSystem, revealsPart, viewLevel };
119
+
120
+ //# sourceMappingURL=fog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fog.js","names":[],"sources":["../../src/systems/fog.ts"],"sourcesContent":["import { layerOf } from '#engine/abilities/buffs'\nimport { exposure, detection } from '../entity'\nimport { constructionSite } from './construction'\nimport type { Entity } from '#engine/entity'\nimport { statsOf } from '#engine/stats'\nimport type { System } from '#engine/registry'\nimport type { World } from '#engine/world'\nimport { snapshotField } from '../replication'\nimport { tellCellsInSight } from '#engine/cellLayers'\n\n/**\n * Seconds an attacker stays in sight of the team it hit, wherever it stands\n *\n * @internal\n */\nexport const EXPOSED_FOR = 2\n\n/**\n * Lets a team see the entity for a while, for having attacked it: from the dark, from high ground, from anywhere\n *\n * @beta\n */\nexport function expose(entity: Entity, team: number): void {\n\tlet seconds = entity.get(exposure)\n\tif (!seconds) entity.set(exposure, (seconds = new Map()))\n\tseconds.set(team, EXPOSED_FOR)\n}\n\n/**\n * The level an entity looks out from. From the air, nothing is above\n *\n * @internal\n */\nexport const viewLevel = (world: World, entity: Entity): number =>\n\tlayerOf(world, entity) === 'air' ? Infinity : world.terrain.levelAt(entity.pos.x, entity.pos.z)\n\n/**\n * The circles lit during an update, four numbers each: team, x, z, radius. Kept between updates so nothing is allocated:\n * written over from the start and cut to the update's at its end, as emptying it would let go of its room\n */\nconst lit: number[] = []\nconst found: Entity[] = []\n\n/**\n * Works out what every team sees, every few ticks: clears the `visible` grids and lights a circle around\n * everything that looks around (units and buildings by their sight, reveal spells, scouting missiles,\n * invisible units that were found, attackers that gave themselves away).\n */\nexport const fogSystem: System = {\n\tname: 'fog',\n\tphase: 'cleanup',\n\t// every few ticks is often enough for the eye\n\tevery: 3,\n\tupdate(world, dt) {\n\t\tconst { fog } = world\n\t\tlet circles = 0\n\t\tconst circle = (team: number, x: number, z: number, radius: number) => {\n\t\t\tlit[circles++] = team\n\t\t\tlit[circles++] = x\n\t\t\tlit[circles++] = z\n\t\t\tlit[circles++] = radius\n\t\t}\n\t\tconst light = (team: number, x: number, z: number, radius: number, level?: number) => {\n\t\t\tfog.reveal(team, x, z, radius, level)\n\t\t\tcircle(team, x, z, radius)\n\t\t\t// and the teams it shares what it sees with\n\t\t\tfor (const other of world.sides.visionOf(team)) {\n\t\t\t\t// a team that only gets sight shared with it (one from a save, with nobody on it yet) gets fog of its own\n\t\t\t\tfog.addTeam(other)\n\t\t\t\tfog.reveal(other, x, z, radius, level)\n\t\t\t\tcircle(other, x, z, radius)\n\t\t\t}\n\t\t}\n\n\t\tfog.beginUpdate()\n\t\tfor (const entity of world.units.values()) {\n\t\t\tif (!entity.alive || entity.hidden) continue\n\t\t\tconst owner = world.player(entity.owner)\n\t\t\tif (owner.neutral) continue\n\t\t\t// construction sites barely see past their own walls\n\t\t\tconst { sight: full } = statsOf(world, entity)\n\t\t\tconst sight = entity.isStructure && entity.has(constructionSite) ? Math.min(full, entity.def.radius + 2) : full\n\t\t\tlight(owner.team, entity.pos.x, entity.pos.z, sight, viewLevel(world, entity))\n\t\t}\n\t\tfor (const reveal of world.reveals) light(reveal.team, reveal.x, reveal.z, reveal.radius)\n\t\t// what an ability sent out to look around\n\t\tfor (const missile of world.missiles) {\n\t\t\tif (missile.effect.sight) light(world.player(missile.owner).team, missile.x, missile.z, missile.effect.sight)\n\t\t}\n\t\tfor (const entity of world.index.with(detection)) {\n\t\t\t// what was found is seen where it stands, in the dark too\n\t\t\tif (!entity.alive) continue\n\t\t\tfor (const team of entity.get(detection)!.keys()) light(team, entity.pos.x, entity.pos.z, entity.def.radius + 1)\n\t\t}\n\t\tfor (const entity of world.index.with(exposure)) {\n\t\t\tconst seconds = entity.get(exposure)!\n\t\t\tfor (const [team, remaining] of seconds) {\n\t\t\t\tconst left = remaining - dt\n\t\t\t\tif (left > 0 && entity.alive && !entity.hidden) light(team, entity.pos.x, entity.pos.z, entity.def.radius + 1)\n\t\t\t\tif (left > 0) seconds.set(team, left)\n\t\t\t\telse seconds.delete(team)\n\t\t\t}\n\t\t\tif (seconds.size === 0) entity.remove(exposure)\n\t\t}\n\t\tfog.endUpdate()\n\t\tlit.length = circles\n\n\t\t// Which structures each team sees now, and has ever seen (so they can still be pointed at once out of sight).\n\t\t// Nothing can be in sight outside the circles that were just lit, so only those are looked at: the cost follows\n\t\t// how much is looking around, not how many trees the map has\n\t\tfor (const inSight of world.sceneryInSight.values()) inSight.clear()\n\t\tfor (let i = 0; i < lit.length; i += 4) {\n\t\t\tconst team = lit[i]\n\t\t\tconst bit = fog.teamBit(team)\n\t\t\tlet inSight = world.sceneryInSight.get(team)\n\t\t\tif (!inSight) world.sceneryInSight.set(team, (inSight = new Set()))\n\t\t\t// structures alone: in a battle each circle holds hundreds of units, none of them looked for here\n\t\t\tfor (const entity of world.spatial.queryStatic(lit[i + 1], lit[i + 2], lit[i + 3], found)) {\n\t\t\t\tif (entity.scenery) {\n\t\t\t\t\tif (inSight.has(entity) || !world.isVisibleTo(entity, team)) continue\n\t\t\t\t\tinSight.add(entity)\n\t\t\t\t\tentity.seenBy |= bit\n\t\t\t\t} else if (!(entity.seenBy & bit) && world.isVisibleTo(entity, team)) entity.seenBy |= bit\n\t\t\t}\n\t\t}\n\t\t// the cells the rules changed out of a team's sight, told as they come into it (RV7)\n\t\ttellCellsInSight(world)\n\t}\n}\n\n/**\n * What the player is told of the spots revealed (`Snapshot.reveals`): their team's own, and another's only where they see:\n * where an enemy's spell looks is the enemy's to know. A quiet one shows what it shows, and is nothing to draw; none to a computer\n */\nexport const revealsPart = snapshotField('reveals', (view) =>\n\tview.forComputer\n\t\t? []\n\t\t: view.world.reveals\n\t\t\t\t.filter((reveal) => !reveal.quiet && (reveal.team === view.team || view.sees(reveal.x, reveal.z)))\n\t\t\t\t.map(({ id, x, z, radius, left, team }) => ({ id, x, z, radius, left, ours: team === view.team }))\n)\n"],"mappings":"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"}