@v12-engine/engine 0.1.1 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (951) hide show
  1. package/dist/abilities/amounts.d.ts +28 -0
  2. package/dist/abilities/amounts.js +74 -0
  3. package/dist/abilities/amounts.js.map +1 -0
  4. package/dist/abilities/buffs.d.ts +106 -6
  5. package/dist/abilities/buffs.js +443 -0
  6. package/dist/abilities/buffs.js.map +1 -0
  7. package/dist/abilities/castTold.d.ts +2 -0
  8. package/dist/abilities/castTold.js +66 -0
  9. package/dist/abilities/castTold.js.map +1 -0
  10. package/dist/abilities/chance.d.ts +38 -0
  11. package/dist/abilities/chance.js +77 -0
  12. package/dist/abilities/chance.js.map +1 -0
  13. package/dist/abilities/charges.d.ts +18 -0
  14. package/dist/abilities/charges.js +101 -0
  15. package/dist/abilities/charges.js.map +1 -0
  16. package/dist/abilities/control.d.ts +28 -0
  17. package/dist/abilities/control.js +113 -0
  18. package/dist/abilities/control.js.map +1 -0
  19. package/dist/abilities/dispel.js +51 -0
  20. package/dist/abilities/dispel.js.map +1 -0
  21. package/dist/abilities/effectFields.d.ts +1 -1
  22. package/dist/abilities/effectFields.js +676 -0
  23. package/dist/abilities/effectFields.js.map +1 -0
  24. package/dist/abilities/effectIndex.d.ts +27 -0
  25. package/dist/abilities/effectIndex.js +64 -0
  26. package/dist/abilities/effectIndex.js.map +1 -0
  27. package/dist/abilities/effects/buff.d.ts +9 -3
  28. package/dist/abilities/effects/buff.js +84 -0
  29. package/dist/abilities/effects/buff.js.map +1 -0
  30. package/dist/abilities/effects/conditions.d.ts +2 -0
  31. package/dist/abilities/effects/conditions.js +41 -0
  32. package/dist/abilities/effects/conditions.js.map +1 -0
  33. package/dist/abilities/effects/core.js +54 -0
  34. package/dist/abilities/effects/core.js.map +1 -0
  35. package/dist/abilities/effects/damage.d.ts +1 -1
  36. package/dist/abilities/effects/damage.js +43 -0
  37. package/dist/abilities/effects/damage.js.map +1 -0
  38. package/dist/abilities/effects/heal.d.ts +2 -2
  39. package/dist/abilities/effects/heal.js +51 -0
  40. package/dist/abilities/effects/heal.js.map +1 -0
  41. package/dist/abilities/effects/missile.d.ts +13 -1
  42. package/dist/abilities/effects/missile.js +104 -0
  43. package/dist/abilities/effects/missile.js.map +1 -0
  44. package/dist/abilities/effects/morph.d.ts +5 -0
  45. package/dist/abilities/effects/morph.js +43 -0
  46. package/dist/abilities/effects/morph.js.map +1 -0
  47. package/dist/abilities/effects/moves.d.ts +16 -4
  48. package/dist/abilities/effects/moves.js +212 -0
  49. package/dist/abilities/effects/moves.js.map +1 -0
  50. package/dist/abilities/effects/passives.d.ts +19 -9
  51. package/dist/abilities/effects/passives.js +131 -0
  52. package/dist/abilities/effects/passives.js.map +1 -0
  53. package/dist/abilities/effects/proxy.d.ts +5 -0
  54. package/dist/abilities/effects/proxy.js +60 -0
  55. package/dist/abilities/effects/proxy.js.map +1 -0
  56. package/dist/abilities/effects/sight.d.ts +2 -2
  57. package/dist/abilities/effects/sight.js +39 -0
  58. package/dist/abilities/effects/sight.js.map +1 -0
  59. package/dist/abilities/effects/spawn.d.ts +5 -2
  60. package/dist/abilities/effects/spawn.js +40 -0
  61. package/dist/abilities/effects/spawn.js.map +1 -0
  62. package/dist/abilities/effects/timed.d.ts +2 -2
  63. package/dist/abilities/effects/timed.js +96 -0
  64. package/dist/abilities/effects/timed.js.map +1 -0
  65. package/dist/abilities/effects/trade.d.ts +1 -1
  66. package/dist/abilities/effects/trade.js +25 -0
  67. package/dist/abilities/effects/trade.js.map +1 -0
  68. package/dist/abilities/effects.d.ts +97 -23
  69. package/dist/abilities/effects.js +860 -0
  70. package/dist/abilities/effects.js.map +1 -0
  71. package/dist/abilities/land.d.ts +38 -4
  72. package/dist/abilities/land.js +189 -0
  73. package/dist/abilities/land.js.map +1 -0
  74. package/dist/abilities/recast.d.ts +45 -0
  75. package/dist/abilities/recast.js +118 -0
  76. package/dist/abilities/recast.js.map +1 -0
  77. package/dist/abilities/scaled.js +40 -0
  78. package/dist/abilities/scaled.js.map +1 -0
  79. package/dist/abilities/screen.d.ts +6 -0
  80. package/dist/abilities/screen.js +83 -0
  81. package/dist/abilities/screen.js.map +1 -0
  82. package/dist/abilities/shapes.d.ts +66 -0
  83. package/dist/abilities/shapes.js +122 -0
  84. package/dist/abilities/shapes.js.map +1 -0
  85. package/dist/abilities/text.d.ts +14 -2
  86. package/dist/abilities/text.js +204 -0
  87. package/dist/abilities/text.js.map +1 -0
  88. package/dist/abilities/triggers.d.ts +98 -0
  89. package/dist/abilities/triggers.js +351 -0
  90. package/dist/abilities/triggers.js.map +1 -0
  91. package/dist/abilityChanges.d.ts +131 -0
  92. package/dist/abilityChanges.js +345 -0
  93. package/dist/abilityChanges.js.map +1 -0
  94. package/dist/ai/area.d.ts +4 -1
  95. package/dist/ai/brain.d.ts +4 -1
  96. package/dist/ai/brain.js +844 -0
  97. package/dist/ai/brain.js.map +1 -0
  98. package/dist/ai/budget.js +74 -0
  99. package/dist/ai/budget.js.map +1 -0
  100. package/dist/ai/checks.d.ts +9 -1
  101. package/dist/ai/checks.js +242 -0
  102. package/dist/ai/checks.js.map +1 -0
  103. package/dist/ai/computer.d.ts +11 -4
  104. package/dist/ai/computer.js +251 -0
  105. package/dist/ai/computer.js.map +1 -0
  106. package/dist/ai/defence.d.ts +4 -0
  107. package/dist/ai/defence.js +430 -0
  108. package/dist/ai/defence.js.map +1 -0
  109. package/dist/ai/define.d.ts +3 -2
  110. package/dist/ai/define.js +31 -0
  111. package/dist/ai/define.js.map +1 -0
  112. package/dist/ai/economy.d.ts +10 -7
  113. package/dist/ai/economy.js +780 -0
  114. package/dist/ai/economy.js.map +1 -0
  115. package/dist/ai/geometry.js +38 -0
  116. package/dist/ai/geometry.js.map +1 -0
  117. package/dist/ai/goals.d.ts +1 -0
  118. package/dist/ai/goals.js +560 -0
  119. package/dist/ai/goals.js.map +1 -0
  120. package/dist/ai/knowledge.d.ts +72 -7
  121. package/dist/ai/knowledge.js +804 -0
  122. package/dist/ai/knowledge.js.map +1 -0
  123. package/dist/ai/lanes.d.ts +10 -2
  124. package/dist/ai/lanes.js +715 -0
  125. package/dist/ai/lanes.js.map +1 -0
  126. package/dist/ai/melee/build.js +264 -0
  127. package/dist/ai/melee/build.js.map +1 -0
  128. package/dist/ai/melee/goals.d.ts +7 -0
  129. package/dist/ai/melee/goals.js +720 -0
  130. package/dist/ai/melee/goals.js.map +1 -0
  131. package/dist/ai/melee/heroes.js +68 -0
  132. package/dist/ai/melee/heroes.js.map +1 -0
  133. package/dist/ai/melee/index.d.ts +1 -1
  134. package/dist/ai/melee/index.js +51 -0
  135. package/dist/ai/melee/index.js.map +1 -0
  136. package/dist/ai/melee/production.js +29 -0
  137. package/dist/ai/melee/production.js.map +1 -0
  138. package/dist/ai/melee/surrender.js +64 -0
  139. package/dist/ai/melee/surrender.js.map +1 -0
  140. package/dist/ai/micro.d.ts +9 -0
  141. package/dist/ai/micro.js +1316 -0
  142. package/dist/ai/micro.js.map +1 -0
  143. package/dist/ai/mission.d.ts +9 -2
  144. package/dist/ai/mission.js +538 -0
  145. package/dist/ai/mission.js.map +1 -0
  146. package/dist/ai/missionRules.d.ts +1 -1
  147. package/dist/ai/missionRules.js +26 -0
  148. package/dist/ai/missionRules.js.map +1 -0
  149. package/dist/ai/module.d.ts +6 -2
  150. package/dist/ai/module.js +37 -0
  151. package/dist/ai/module.js.map +1 -0
  152. package/dist/ai/options.d.ts +3 -3
  153. package/dist/ai/plans/build.d.ts +20 -1
  154. package/dist/ai/plans/build.js +608 -0
  155. package/dist/ai/plans/build.js.map +1 -0
  156. package/dist/ai/plans/placement.d.ts +4 -1
  157. package/dist/ai/plans/placement.js +295 -0
  158. package/dist/ai/plans/placement.js.map +1 -0
  159. package/dist/ai/plans/plans.d.ts +9 -0
  160. package/dist/ai/plans/plans.js +110 -0
  161. package/dist/ai/plans/plans.js.map +1 -0
  162. package/dist/ai/plans/production.d.ts +14 -2
  163. package/dist/ai/plans/production.js +434 -0
  164. package/dist/ai/plans/production.js.map +1 -0
  165. package/dist/ai/plans/purse.d.ts +6 -3
  166. package/dist/ai/plans/purse.js +139 -0
  167. package/dist/ai/plans/purse.js.map +1 -0
  168. package/dist/ai/plans/tech.d.ts +6 -0
  169. package/dist/ai/plans/tech.js +122 -0
  170. package/dist/ai/plans/tech.js.map +1 -0
  171. package/dist/ai/profiles.d.ts +4 -4
  172. package/dist/{profiles-B3NS9jwk.js → ai/profiles.js} +3 -98
  173. package/dist/ai/profiles.js.map +1 -0
  174. package/dist/ai/reach.js +54 -0
  175. package/dist/ai/reach.js.map +1 -0
  176. package/dist/ai/report.d.ts +8 -0
  177. package/dist/ai/report.js +87 -0
  178. package/dist/ai/report.js.map +1 -0
  179. package/dist/ai/roles.d.ts +4 -0
  180. package/dist/ai/roles.js +207 -0
  181. package/dist/ai/roles.js.map +1 -0
  182. package/dist/ai/rules.d.ts +8 -2
  183. package/dist/ai/rules.js +416 -0
  184. package/dist/ai/rules.js.map +1 -0
  185. package/dist/ai/scouting.d.ts +6 -0
  186. package/dist/ai/scouting.js +324 -0
  187. package/dist/ai/scouting.js.map +1 -0
  188. package/dist/ai/settings.js +99 -0
  189. package/dist/ai/settings.js.map +1 -0
  190. package/dist/ai/squads.d.ts +21 -2
  191. package/dist/ai/squads.js +916 -0
  192. package/dist/ai/squads.js.map +1 -0
  193. package/dist/ai/strength.js +320 -0
  194. package/dist/ai/strength.js.map +1 -0
  195. package/dist/ai/task.d.ts +3 -1
  196. package/dist/ai/task.js +17 -0
  197. package/dist/ai/task.js.map +1 -0
  198. package/dist/ai/tasks/attack.js +24 -0
  199. package/dist/ai/tasks/attack.js.map +1 -0
  200. package/dist/ai/tasks/capture.d.ts +3 -3
  201. package/dist/ai/tasks/capture.js +37 -0
  202. package/dist/ai/tasks/capture.js.map +1 -0
  203. package/dist/ai/tasks/creep.js +29 -0
  204. package/dist/ai/tasks/creep.js.map +1 -0
  205. package/dist/ai/tasks/defend.js +61 -0
  206. package/dist/ai/tasks/defend.js.map +1 -0
  207. package/dist/ai/tasks/drop.js +81 -0
  208. package/dist/ai/tasks/drop.js.map +1 -0
  209. package/dist/ai/tasks/escort.js +59 -0
  210. package/dist/ai/tasks/escort.js.map +1 -0
  211. package/dist/ai/tasks/gather.js +48 -0
  212. package/dist/ai/tasks/gather.js.map +1 -0
  213. package/dist/ai/tasks/harass.js +39 -0
  214. package/dist/ai/tasks/harass.js.map +1 -0
  215. package/dist/ai/tasks/hold.js +32 -0
  216. package/dist/ai/tasks/hold.js.map +1 -0
  217. package/dist/ai/tasks/index.js +34 -0
  218. package/dist/ai/tasks/index.js.map +1 -0
  219. package/dist/ai/tasks/move.js +26 -0
  220. package/dist/ai/tasks/move.js.map +1 -0
  221. package/dist/ai/tasks/patrol.js +59 -0
  222. package/dist/ai/tasks/patrol.js.map +1 -0
  223. package/dist/ai/tasks/retreat.js +28 -0
  224. package/dist/ai/tasks/retreat.js.map +1 -0
  225. package/dist/ai/tasks/scout.js +73 -0
  226. package/dist/ai/tasks/scout.js.map +1 -0
  227. package/dist/ai/tasks/shared.d.ts +1 -1
  228. package/dist/ai/tasks/shared.js +137 -0
  229. package/dist/ai/tasks/shared.js.map +1 -0
  230. package/dist/ai/team.d.ts +18 -1
  231. package/dist/ai/team.js +492 -0
  232. package/dist/ai/team.js.map +1 -0
  233. package/dist/ai/threat.d.ts +6 -0
  234. package/dist/ai/threat.js +206 -0
  235. package/dist/ai/threat.js.map +1 -0
  236. package/dist/ai/view.d.ts +21 -7
  237. package/dist/ai/view.js +677 -0
  238. package/dist/ai/view.js.map +1 -0
  239. package/dist/ai/waves.d.ts +6 -0
  240. package/dist/ai/waves.js +410 -0
  241. package/dist/ai/waves.js.map +1 -0
  242. package/dist/ai.js +54 -6239
  243. package/dist/aiTesting.d.ts +6 -3
  244. package/dist/aiTesting.js +229 -0
  245. package/dist/aiTesting.js.map +1 -0
  246. package/dist/areas.d.ts +4 -1
  247. package/dist/areas.js +295 -0
  248. package/dist/areas.js.map +1 -0
  249. package/dist/attacks.d.ts +3 -3
  250. package/dist/attacks.js +127 -0
  251. package/dist/attacks.js.map +1 -0
  252. package/dist/burning.d.ts +267 -0
  253. package/dist/burning.js +795 -0
  254. package/dist/burning.js.map +1 -0
  255. package/dist/bytes.js +21 -0
  256. package/dist/bytes.js.map +1 -0
  257. package/dist/callings.d.ts +71 -0
  258. package/dist/callings.js +157 -0
  259. package/dist/callings.js.map +1 -0
  260. package/dist/cameraOrders.d.ts +78 -0
  261. package/dist/cameraOrders.js +114 -0
  262. package/dist/cameraOrders.js.map +1 -0
  263. package/dist/camps.d.ts +70 -4
  264. package/dist/camps.js +501 -0
  265. package/dist/camps.js.map +1 -0
  266. package/dist/capture.d.ts +15 -3
  267. package/dist/capture.js +304 -0
  268. package/dist/capture.js.map +1 -0
  269. package/dist/cellLayers.d.ts +78 -13
  270. package/dist/cellLayers.js +275 -0
  271. package/dist/cellLayers.js.map +1 -0
  272. package/dist/cellPatches.d.ts +24 -0
  273. package/dist/cellPatches.js +73 -0
  274. package/dist/cellPatches.js.map +1 -0
  275. package/dist/cinematics.d.ts +10 -5
  276. package/dist/cinematics.js +161 -0
  277. package/dist/cinematics.js.map +1 -0
  278. package/dist/clock.d.ts +2 -2
  279. package/dist/clock.js +78 -0
  280. package/dist/clock.js.map +1 -0
  281. package/dist/commands.d.ts +36 -4
  282. package/dist/commands.js +636 -0
  283. package/dist/commands.js.map +1 -0
  284. package/dist/components.d.ts +31 -10
  285. package/dist/components.js +74 -0
  286. package/dist/components.js.map +1 -0
  287. package/dist/computers.d.ts +4 -4
  288. package/dist/computers.js +194 -0
  289. package/dist/computers.js.map +1 -0
  290. package/dist/concealment.d.ts +25 -2
  291. package/dist/concealment.js +409 -0
  292. package/dist/concealment.js.map +1 -0
  293. package/dist/coreComponents.js +130 -0
  294. package/dist/coreComponents.js.map +1 -0
  295. package/dist/createGame.d.ts +306 -0
  296. package/dist/createGame.js +405 -0
  297. package/dist/createGame.js.map +1 -0
  298. package/dist/dashing.d.ts +18 -2
  299. package/dist/dashing.js +41 -0
  300. package/dist/dashing.js.map +1 -0
  301. package/dist/debug.d.ts +8 -0
  302. package/dist/debug.js +5 -3
  303. package/dist/debug2.js +76 -0
  304. package/dist/debug2.js.map +1 -0
  305. package/dist/debugCommands.d.ts +6 -6
  306. package/dist/debugCommands.js +537 -0
  307. package/dist/debugCommands.js.map +1 -0
  308. package/dist/debugging.d.ts +1 -0
  309. package/dist/defaultSets.d.ts +183 -0
  310. package/dist/defaultSets.js +216 -0
  311. package/dist/defaultSets.js.map +1 -0
  312. package/dist/definitions.d.ts +6 -0
  313. package/dist/definitions.js +78 -0
  314. package/dist/definitions.js.map +1 -0
  315. package/dist/defs.d.ts +1895 -165
  316. package/dist/defs.js +380 -0
  317. package/dist/defs.js.map +1 -0
  318. package/dist/denying.d.ts +4 -4
  319. package/dist/denying.js +106 -0
  320. package/dist/denying.js.map +1 -0
  321. package/dist/destructibles.d.ts +2 -2
  322. package/dist/destructibles.js +36 -0
  323. package/dist/destructibles.js.map +1 -0
  324. package/dist/determinism.d.ts +4 -4
  325. package/dist/determinism.js +247 -0
  326. package/dist/determinism.js.map +1 -0
  327. package/dist/dialog.d.ts +17 -2
  328. package/dist/dialog.js +108 -0
  329. package/dist/dialog.js.map +1 -0
  330. package/dist/effectRefs.js +28 -0
  331. package/dist/effectRefs.js.map +1 -0
  332. package/dist/effects.d.ts +27 -11
  333. package/dist/effects.js +110 -0
  334. package/dist/effects.js.map +1 -0
  335. package/dist/endings.d.ts +1 -1
  336. package/dist/endings.js +78 -0
  337. package/dist/endings.js.map +1 -0
  338. package/dist/engagement.d.ts +40 -6
  339. package/dist/engagement.js +530 -0
  340. package/dist/engagement.js.map +1 -0
  341. package/dist/engineEvents.d.ts +72 -9
  342. package/dist/engineEvents.js +520 -0
  343. package/dist/engineEvents.js.map +1 -0
  344. package/dist/entity.d.ts +275 -26
  345. package/dist/entity.js +441 -0
  346. package/dist/entity.js.map +1 -0
  347. package/dist/entityIndex.d.ts +10 -3
  348. package/dist/entityIndex.js +149 -0
  349. package/dist/entityIndex.js.map +1 -0
  350. package/dist/errors.d.ts +6 -2
  351. package/dist/errors.js +59 -0
  352. package/dist/errors.js.map +1 -0
  353. package/dist/events.d.ts +11 -5
  354. package/dist/events.js +158 -0
  355. package/dist/events.js.map +1 -0
  356. package/dist/exactMath.js +273 -0
  357. package/dist/exactMath.js.map +1 -0
  358. package/dist/features.d.ts +1 -1
  359. package/dist/features.js +127 -0
  360. package/dist/features.js.map +1 -0
  361. package/dist/fields.d.ts +25 -5
  362. package/dist/fields.js +140 -0
  363. package/dist/fields.js.map +1 -0
  364. package/dist/fixture.d.ts +3 -3
  365. package/dist/fixture.js +512 -0
  366. package/dist/fixture.js.map +1 -0
  367. package/dist/fog.d.ts +26 -3
  368. package/dist/fog.js +333 -0
  369. package/dist/fog.js.map +1 -0
  370. package/dist/foliage.d.ts +476 -0
  371. package/dist/foliage.js +1478 -0
  372. package/dist/foliage.js.map +1 -0
  373. package/dist/foliageDebug.d.ts +57 -0
  374. package/dist/foliageDebug.js +172 -0
  375. package/dist/foliageDebug.js.map +1 -0
  376. package/dist/foliageRegrowth.d.ts +20 -0
  377. package/dist/foliageRegrowth.js +332 -0
  378. package/dist/foliageRegrowth.js.map +1 -0
  379. package/dist/formState.d.ts +67 -0
  380. package/dist/formState.js +65 -0
  381. package/dist/formState.js.map +1 -0
  382. package/dist/formation.d.ts +46 -8
  383. package/dist/formation.js +297 -0
  384. package/dist/formation.js.map +1 -0
  385. package/dist/forms.d.ts +58 -0
  386. package/dist/forms.js +146 -0
  387. package/dist/forms.js.map +1 -0
  388. package/dist/friendlyFire.d.ts +2 -2
  389. package/dist/friendlyFire.js +37 -0
  390. package/dist/friendlyFire.js.map +1 -0
  391. package/dist/game.d.ts +141 -48
  392. package/dist/game.js +834 -0
  393. package/dist/game.js.map +1 -0
  394. package/dist/gameData.d.ts +96 -22
  395. package/dist/gameData.js +1690 -0
  396. package/dist/gameData.js.map +1 -0
  397. package/dist/gameFiles.d.ts +3 -3
  398. package/dist/gameFiles.js +14 -0
  399. package/dist/gameFiles.js.map +1 -0
  400. package/dist/gates.js +92 -0
  401. package/dist/gates.js.map +1 -0
  402. package/dist/generate.d.ts +28 -1
  403. package/dist/generate.js +1062 -0
  404. package/dist/generate.js.map +1 -0
  405. package/dist/generateWorker.d.ts +7 -3
  406. package/dist/generateWorker.js +86 -0
  407. package/dist/generateWorker.js.map +1 -0
  408. package/dist/grid.d.ts +9 -0
  409. package/dist/grid.js +102 -0
  410. package/dist/grid.js.map +1 -0
  411. package/dist/ground.d.ts +17 -1
  412. package/dist/ground.js +375 -0
  413. package/dist/ground.js.map +1 -0
  414. package/dist/groundObjects.d.ts +70 -0
  415. package/dist/groundObjects.js +371 -0
  416. package/dist/groundObjects.js.map +1 -0
  417. package/dist/groundSpeed.d.ts +20 -3
  418. package/dist/groundSpeed.js +117 -0
  419. package/dist/groundSpeed.js.map +1 -0
  420. package/dist/hero.d.ts +126 -10
  421. package/dist/hero.js +432 -0
  422. package/dist/hero.js.map +1 -0
  423. package/dist/holds.d.ts +94 -0
  424. package/dist/holds.js +305 -0
  425. package/dist/holds.js.map +1 -0
  426. package/dist/home.d.ts +1 -1
  427. package/dist/home.js +30 -0
  428. package/dist/home.js.map +1 -0
  429. package/dist/hooks.d.ts +339 -57
  430. package/dist/hooks.js +105 -0
  431. package/dist/hooks.js.map +1 -0
  432. package/dist/hotReload.d.ts +6 -5
  433. package/dist/hotReload.js +145 -0
  434. package/dist/hotReload.js.map +1 -0
  435. package/dist/ids.d.ts +3 -3
  436. package/dist/ids.js +30 -0
  437. package/dist/ids.js.map +1 -0
  438. package/dist/idsFile.d.ts +36 -0
  439. package/dist/idsFile.js +134 -0
  440. package/dist/idsFile.js.map +1 -0
  441. package/dist/index.d.ts +105 -68
  442. package/dist/index.js +194 -4701
  443. package/dist/inspect.d.ts +29 -2
  444. package/dist/{inspect-D9dWHmZ0.js → inspect.js} +21 -12
  445. package/dist/inspect.js.map +1 -0
  446. package/dist/inventory.d.ts +14 -1
  447. package/dist/inventory.js +84 -0
  448. package/dist/inventory.js.map +1 -0
  449. package/dist/items.d.ts +136 -8
  450. package/dist/items.js +585 -0
  451. package/dist/items.js.map +1 -0
  452. package/dist/lanes.d.ts +12 -3
  453. package/dist/lanes.js +496 -0
  454. package/dist/lanes.js.map +1 -0
  455. package/dist/life.d.ts +6 -2
  456. package/dist/life.js +287 -0
  457. package/dist/life.js.map +1 -0
  458. package/dist/log.d.ts +26 -3
  459. package/dist/log.js +192 -0
  460. package/dist/log.js.map +1 -0
  461. package/dist/manaBurn.d.ts +2 -2
  462. package/dist/manaBurn.js +75 -0
  463. package/dist/manaBurn.js.map +1 -0
  464. package/dist/map/file.d.ts +56 -3
  465. package/dist/map/file.js +264 -0
  466. package/dist/map/file.js.map +1 -0
  467. package/dist/map/images.js +61 -0
  468. package/dist/map/images.js.map +1 -0
  469. package/dist/map/look.d.ts +1 -1
  470. package/dist/map/look.js +30 -0
  471. package/dist/map/look.js.map +1 -0
  472. package/dist/map/pathProfile.js +183 -0
  473. package/dist/map/pathProfile.js.map +1 -0
  474. package/dist/map/resize.d.ts +4 -0
  475. package/dist/map/resize.js +136 -0
  476. package/dist/map/resize.js.map +1 -0
  477. package/dist/map/schema.js +257 -0
  478. package/dist/map/schema.js.map +1 -0
  479. package/dist/map/terrain.js +214 -0
  480. package/dist/map/terrain.js.map +1 -0
  481. package/dist/map/types.d.ts +92 -13
  482. package/dist/map/types.js +251 -0
  483. package/dist/map/types.js.map +1 -0
  484. package/dist/mapCheck/cells.js +94 -0
  485. package/dist/mapCheck/cells.js.map +1 -0
  486. package/dist/mapCheck/rules/foliage.d.ts +9 -0
  487. package/dist/mapCheck/rules/foliage.js +83 -0
  488. package/dist/mapCheck/rules/foliage.js.map +1 -0
  489. package/dist/mapCheck/rules/names.js +39 -0
  490. package/dist/mapCheck/rules/names.js.map +1 -0
  491. package/dist/mapCheck/rules/objects.d.ts +1 -1
  492. package/dist/mapCheck/rules/objects.js +56 -0
  493. package/dist/mapCheck/rules/objects.js.map +1 -0
  494. package/dist/mapCheck/rules/paths.js +32 -0
  495. package/dist/mapCheck/rules/paths.js.map +1 -0
  496. package/dist/mapCheck/rules/players.js +20 -0
  497. package/dist/mapCheck/rules/players.js.map +1 -0
  498. package/dist/mapCheck/rules/races.js +56 -0
  499. package/dist/mapCheck/rules/races.js.map +1 -0
  500. package/dist/mapCheck/rules/random.js +47 -0
  501. package/dist/mapCheck/rules/random.js.map +1 -0
  502. package/dist/mapCheck/rules/regions.js +30 -0
  503. package/dist/mapCheck/rules/regions.js.map +1 -0
  504. package/dist/mapCheck/rules/targets.js +31 -0
  505. package/dist/mapCheck/rules/targets.js.map +1 -0
  506. package/dist/mapCheck/rules/walking.js +45 -0
  507. package/dist/mapCheck/rules/walking.js.map +1 -0
  508. package/dist/mapCheck.d.ts +2 -2
  509. package/dist/mapCheck.js +63 -0
  510. package/dist/mapCheck.js.map +1 -0
  511. package/dist/mapFields.d.ts +25 -2
  512. package/dist/mapFields.js +134 -0
  513. package/dist/mapFields.js.map +1 -0
  514. package/dist/mapFile.js +176 -0
  515. package/dist/mapFile.js.map +1 -0
  516. package/dist/mapMeasure.d.ts +8 -0
  517. package/dist/mapMeasure.js +283 -0
  518. package/dist/mapMeasure.js.map +1 -0
  519. package/dist/mapMerge.d.ts +1 -0
  520. package/dist/mapMerge.js +172 -0
  521. package/dist/mapMerge.js.map +1 -0
  522. package/dist/mapObjectives.js +138 -0
  523. package/dist/mapObjectives.js.map +1 -0
  524. package/dist/mapObjects.js +80 -0
  525. package/dist/mapObjects.js.map +1 -0
  526. package/dist/math.d.ts +37 -7
  527. package/dist/math.js +155 -0
  528. package/dist/math.js.map +1 -0
  529. package/dist/messages.d.ts +71 -4
  530. package/dist/messages.js +29 -0
  531. package/dist/messages.js.map +1 -0
  532. package/dist/missionRules.d.ts +10 -2
  533. package/dist/{missionRules-C-bGxm0Q.js → missionRules.js} +30 -150
  534. package/dist/missionRules.js.map +1 -0
  535. package/dist/mods.d.ts +39 -20
  536. package/dist/mods.js +271 -0
  537. package/dist/mods.js.map +1 -0
  538. package/dist/moves.d.ts +87 -0
  539. package/dist/moves.js +539 -0
  540. package/dist/moves.js.map +1 -0
  541. package/dist/names.d.ts +7 -0
  542. package/dist/names.js +122 -0
  543. package/dist/names.js.map +1 -0
  544. package/dist/navigation/agentParams.js +14 -0
  545. package/dist/navigation/agentParams.js.map +1 -0
  546. package/dist/navigation/air.d.ts +7 -3
  547. package/dist/navigation/air.js +401 -0
  548. package/dist/navigation/air.js.map +1 -0
  549. package/dist/navigation/builds.d.ts +34 -2
  550. package/dist/navigation/builds.js +287 -0
  551. package/dist/navigation/builds.js.map +1 -0
  552. package/dist/navigation/groundAreas.d.ts +59 -1
  553. package/dist/navigation/groundAreas.js +407 -0
  554. package/dist/navigation/groundAreas.js.map +1 -0
  555. package/dist/navigation/navigation.d.ts +98 -9
  556. package/dist/navigation/recast.d.ts +194 -18
  557. package/dist/navigation/recast.js +1379 -0
  558. package/dist/navigation/recast.js.map +1 -0
  559. package/dist/navigation/sidePaths.d.ts +8 -3
  560. package/dist/navigation/sidePaths.js +241 -0
  561. package/dist/navigation/sidePaths.js.map +1 -0
  562. package/dist/navigation/sized.js +243 -0
  563. package/dist/navigation/sized.js.map +1 -0
  564. package/dist/nearest.js +32 -0
  565. package/dist/nearest.js.map +1 -0
  566. package/dist/noise.js +59 -0
  567. package/dist/noise.js.map +1 -0
  568. package/dist/objectives.d.ts +12 -3
  569. package/dist/objectives.js +144 -0
  570. package/dist/objectives.js.map +1 -0
  571. package/dist/orders/basic.d.ts +5 -5
  572. package/dist/orders/basic.js +417 -0
  573. package/dist/orders/basic.js.map +1 -0
  574. package/dist/orders/build.js +278 -0
  575. package/dist/orders/build.js.map +1 -0
  576. package/dist/orders/cast.d.ts +13 -3
  577. package/dist/orders/cast.js +558 -0
  578. package/dist/orders/cast.js.map +1 -0
  579. package/dist/orders/facts.js +16 -0
  580. package/dist/orders/facts.js.map +1 -0
  581. package/dist/orders/harvest.d.ts +21 -5
  582. package/dist/orders/harvest.js +540 -0
  583. package/dist/orders/harvest.js.map +1 -0
  584. package/dist/orders/idle.d.ts +3 -1
  585. package/dist/orders/idle.js +234 -0
  586. package/dist/orders/idle.js.map +1 -0
  587. package/dist/orders/items.js +92 -0
  588. package/dist/orders/items.js.map +1 -0
  589. package/dist/orders/queue.js +108 -0
  590. package/dist/orders/queue.js.map +1 -0
  591. package/dist/orders/waiting.d.ts +39 -0
  592. package/dist/orders/waiting.js +149 -0
  593. package/dist/orders/waiting.js.map +1 -0
  594. package/dist/pack.schema.js +13 -0
  595. package/dist/pack.schema.js.map +1 -0
  596. package/dist/pack.schema.json +7622 -841
  597. package/dist/packs/director/index.d.ts +13 -5
  598. package/dist/packs/director/index.js +204 -0
  599. package/dist/packs/director/index.js.map +1 -0
  600. package/dist/packs/heroes/campaign.d.ts +3 -2
  601. package/dist/packs/heroes/campaign.js +241 -0
  602. package/dist/packs/heroes/campaign.js.map +1 -0
  603. package/dist/packs/heroes/carry.d.ts +6 -0
  604. package/dist/packs/heroes/carry.js +112 -0
  605. package/dist/packs/heroes/carry.js.map +1 -0
  606. package/dist/packs/heroes/commands.js +115 -0
  607. package/dist/packs/heroes/commands.js.map +1 -0
  608. package/dist/packs/heroes/fallen.d.ts +43 -0
  609. package/dist/packs/heroes/fallen.js +61 -0
  610. package/dist/packs/heroes/fallen.js.map +1 -0
  611. package/dist/packs/heroes/hire.js +60 -0
  612. package/dist/packs/heroes/hire.js.map +1 -0
  613. package/dist/packs/heroes/index.d.ts +7 -6
  614. package/dist/packs/heroes/index.js +130 -0
  615. package/dist/packs/heroes/index.js.map +1 -0
  616. package/dist/packs/heroes/loop.d.ts +95 -0
  617. package/dist/packs/heroes/loop.js +250 -0
  618. package/dist/packs/heroes/loop.js.map +1 -0
  619. package/dist/packs/heroes/making.d.ts +6 -3
  620. package/dist/packs/heroes/making.js +55 -0
  621. package/dist/packs/heroes/making.js.map +1 -0
  622. package/dist/packs/heroes/respawn.d.ts +3 -3
  623. package/dist/packs/heroes/respawn.js +87 -0
  624. package/dist/packs/heroes/respawn.js.map +1 -0
  625. package/dist/packs/heroes/sets.d.ts +32 -0
  626. package/dist/packs/heroes/sets.js +51 -0
  627. package/dist/packs/heroes/sets.js.map +1 -0
  628. package/dist/packs/heroes/spells.d.ts +16 -0
  629. package/dist/packs/heroes/spells.js +269 -0
  630. package/dist/packs/heroes/spells.js.map +1 -0
  631. package/dist/packs/items/defaults.d.ts +43 -0
  632. package/dist/packs/items/defaults.js +1504 -0
  633. package/dist/packs/items/defaults.js.map +1 -0
  634. package/dist/packs/items/index.d.ts +27 -0
  635. package/dist/packs/items/index.js +214 -0
  636. package/dist/packs/items/index.js.map +1 -0
  637. package/dist/packs/moba/index.d.ts +3 -3
  638. package/dist/packs/moba/index.js +174 -0
  639. package/dist/packs/moba/index.js.map +1 -0
  640. package/dist/packs/pack.d.ts +15 -15
  641. package/dist/packs/pack.js +14 -0
  642. package/dist/packs/pack.js.map +1 -0
  643. package/dist/packs.d.ts +15 -7
  644. package/dist/packs.js +222 -0
  645. package/dist/packs.js.map +1 -0
  646. package/dist/paths.d.ts +2 -0
  647. package/dist/paths.js +109 -0
  648. package/dist/paths.js.map +1 -0
  649. package/dist/plain.js +57 -0
  650. package/dist/plain.js.map +1 -0
  651. package/dist/player.d.ts +33 -10
  652. package/dist/player.js +159 -0
  653. package/dist/player.js.map +1 -0
  654. package/dist/portals.d.ts +1 -1
  655. package/dist/portals.js +194 -0
  656. package/dist/portals.js.map +1 -0
  657. package/dist/prefabs.d.ts +25 -2
  658. package/dist/prefabs.js +239 -0
  659. package/dist/prefabs.js.map +1 -0
  660. package/dist/presetBuildings.js +58 -0
  661. package/dist/presetBuildings.js.map +1 -0
  662. package/dist/presetFoliage.d.ts +27 -0
  663. package/dist/presetFoliage.js +98 -0
  664. package/dist/presetFoliage.js.map +1 -0
  665. package/dist/presetGround.js +65 -0
  666. package/dist/presetGround.js.map +1 -0
  667. package/dist/proxies.d.ts +12 -0
  668. package/dist/proxies.js +79 -0
  669. package/dist/proxies.js.map +1 -0
  670. package/dist/query.d.ts +56 -0
  671. package/dist/query.js +88 -0
  672. package/dist/query.js.map +1 -0
  673. package/dist/races.d.ts +15 -14
  674. package/dist/races.js +172 -0
  675. package/dist/races.js.map +1 -0
  676. package/dist/randomGroups.js +91 -0
  677. package/dist/randomGroups.js.map +1 -0
  678. package/dist/registry.d.ts +117 -53
  679. package/dist/registry.js +323 -0
  680. package/dist/registry.js.map +1 -0
  681. package/dist/remains.d.ts +11 -9
  682. package/dist/remains.js +188 -0
  683. package/dist/remains.js.map +1 -0
  684. package/dist/replication.d.ts +12 -7
  685. package/dist/replication.js +100 -0
  686. package/dist/replication.js.map +1 -0
  687. package/dist/rng.d.ts +2 -0
  688. package/dist/rng.js +40 -0
  689. package/dist/rng.js.map +1 -0
  690. package/dist/rules.d.ts +186 -99
  691. package/dist/rules.js +179 -0
  692. package/dist/rules.js.map +1 -0
  693. package/dist/rulesCheck.d.ts +5 -4
  694. package/dist/rulesCheck.js +693 -0
  695. package/dist/rulesCheck.js.map +1 -0
  696. package/dist/runes.d.ts +2 -2
  697. package/dist/runes.js +80 -0
  698. package/dist/runes.js.map +1 -0
  699. package/dist/save.d.ts +37 -12
  700. package/dist/save.js +532 -0
  701. package/dist/save.js.map +1 -0
  702. package/dist/scenario.d.ts +2 -2
  703. package/dist/scenario.js +99 -0
  704. package/dist/scenario.js.map +1 -0
  705. package/dist/scheduler.d.ts +3 -0
  706. package/dist/scheduler.js +156 -0
  707. package/dist/scheduler.js.map +1 -0
  708. package/dist/score.d.ts +19 -19
  709. package/dist/score.js +709 -0
  710. package/dist/score.js.map +1 -0
  711. package/dist/sequences.d.ts +10 -6
  712. package/dist/sequences.js +206 -0
  713. package/dist/sequences.js.map +1 -0
  714. package/dist/server/doorman.js +154 -0
  715. package/dist/server/doorman.js.map +1 -0
  716. package/dist/server/gameServer.d.ts +16 -1
  717. package/dist/server/gameServer.js +643 -0
  718. package/dist/server/gameServer.js.map +1 -0
  719. package/dist/server/index.d.ts +1 -1
  720. package/dist/server/lobby.js +199 -0
  721. package/dist/server/lobby.js.map +1 -0
  722. package/dist/server/log.js +18 -0
  723. package/dist/server/log.js.map +1 -0
  724. package/dist/server/match.js +267 -0
  725. package/dist/server/match.js.map +1 -0
  726. package/dist/server/mode.d.ts +18 -9
  727. package/dist/server/mode.js +220 -0
  728. package/dist/server/mode.js.map +1 -0
  729. package/dist/{navigation-worker.js → server/navigation-worker.js} +1 -1
  730. package/dist/server/navigation-worker.js.map +1 -0
  731. package/dist/server/navigation.js +39 -0
  732. package/dist/server/navigation.js.map +1 -0
  733. package/dist/server/ops.d.ts +4 -0
  734. package/dist/server/ops.js +137 -0
  735. package/dist/server/ops.js.map +1 -0
  736. package/dist/server/packs.d.ts +3 -3
  737. package/dist/server/packs.js +32 -0
  738. package/dist/server/packs.js.map +1 -0
  739. package/dist/server/ratings.d.ts +5 -0
  740. package/dist/server/ratings.js +104 -0
  741. package/dist/server/ratings.js.map +1 -0
  742. package/dist/server/relay.d.ts +12 -2
  743. package/dist/server/relay.js +144 -0
  744. package/dist/server/relay.js.map +1 -0
  745. package/dist/server/rooms.d.ts +9 -2
  746. package/dist/server/rooms.js +442 -0
  747. package/dist/server/rooms.js.map +1 -0
  748. package/dist/server/seat.js +116 -0
  749. package/dist/server/seat.js.map +1 -0
  750. package/dist/server/seatSettings.d.ts +3 -3
  751. package/dist/server/seatSettings.js +63 -0
  752. package/dist/server/seatSettings.js.map +1 -0
  753. package/dist/server/secret.js +13 -0
  754. package/dist/server/secret.js.map +1 -0
  755. package/dist/server/start.d.ts +13 -6
  756. package/dist/server/start.js +76 -0
  757. package/dist/server/start.js.map +1 -0
  758. package/dist/server/websocket.d.ts +9 -1
  759. package/dist/server/websocket.js +306 -0
  760. package/dist/server/websocket.js.map +1 -0
  761. package/dist/server.js +15 -2861
  762. package/dist/session/can.js +26 -0
  763. package/dist/session/can.js.map +1 -0
  764. package/dist/session/commandReplay.d.ts +8 -2
  765. package/dist/session/commandReplay.js +293 -0
  766. package/dist/session/commandReplay.js.map +1 -0
  767. package/dist/session/debug.js +151 -0
  768. package/dist/session/debug.js.map +1 -0
  769. package/dist/session/delay.js +62 -0
  770. package/dist/session/delay.js.map +1 -0
  771. package/dist/session/delta.d.ts +14 -1
  772. package/dist/session/delta.js +407 -0
  773. package/dist/session/delta.js.map +1 -0
  774. package/dist/session/entityState.js +415 -0
  775. package/dist/session/entityState.js.map +1 -0
  776. package/dist/session/local.d.ts +47 -5
  777. package/dist/session/local.js +670 -0
  778. package/dist/session/local.js.map +1 -0
  779. package/dist/session/memory.d.ts +20 -2
  780. package/dist/session/memory.js +131 -0
  781. package/dist/session/memory.js.map +1 -0
  782. package/dist/session/protocol.d.ts +325 -31
  783. package/dist/session/protocol.js +55 -0
  784. package/dist/session/protocol.js.map +1 -0
  785. package/dist/session/remote.d.ts +74 -12
  786. package/dist/session/remote.js +1394 -0
  787. package/dist/session/remote.js.map +1 -0
  788. package/dist/session/replay.d.ts +11 -2
  789. package/dist/session/replay.js +160 -0
  790. package/dist/session/replay.js.map +1 -0
  791. package/dist/session/seed.js +12 -0
  792. package/dist/session/seed.js.map +1 -0
  793. package/dist/session/share.d.ts +5 -1
  794. package/dist/session/share.js +94 -0
  795. package/dist/session/share.js.map +1 -0
  796. package/dist/session/socket.d.ts +1 -1
  797. package/dist/session/socket.js +29 -0
  798. package/dist/session/socket.js.map +1 -0
  799. package/dist/session/wire.d.ts +5 -0
  800. package/dist/session/wire.js +84 -0
  801. package/dist/session/wire.js.map +1 -0
  802. package/dist/session/worker.d.ts +77 -12
  803. package/dist/session/worker.js +499 -0
  804. package/dist/session/worker.js.map +1 -0
  805. package/dist/shared.d.ts +31 -5
  806. package/dist/shared.js +166 -0
  807. package/dist/shared.js.map +1 -0
  808. package/dist/sides.d.ts +9 -3
  809. package/dist/sides.js +149 -0
  810. package/dist/sides.js.map +1 -0
  811. package/dist/sight.js +85 -0
  812. package/dist/sight.js.map +1 -0
  813. package/dist/simulate-worker.js +1 -1
  814. package/dist/simulate.d.ts +12 -8
  815. package/dist/{simulate-oXBiw1Ff.js → simulate.js} +10 -11
  816. package/dist/simulate.js.map +1 -0
  817. package/dist/smart.js +77 -0
  818. package/dist/smart.js.map +1 -0
  819. package/dist/spatial.d.ts +32 -16
  820. package/dist/spatial.js +234 -0
  821. package/dist/spatial.js.map +1 -0
  822. package/dist/spawning.d.ts +1 -0
  823. package/dist/spawning.js +224 -0
  824. package/dist/spawning.js.map +1 -0
  825. package/dist/stances.d.ts +6 -3
  826. package/dist/stances.js +169 -0
  827. package/dist/stances.js.map +1 -0
  828. package/dist/start.d.ts +10 -10
  829. package/dist/start.js +75 -0
  830. package/dist/start.js.map +1 -0
  831. package/dist/stats.d.ts +42 -16
  832. package/dist/stats.js +290 -0
  833. package/dist/stats.js.map +1 -0
  834. package/dist/summoned.d.ts +52 -0
  835. package/dist/summoned.js +38 -0
  836. package/dist/summoned.js.map +1 -0
  837. package/dist/summons.d.ts +10 -13
  838. package/dist/summons.js +271 -0
  839. package/dist/summons.js.map +1 -0
  840. package/dist/systems/abilities.js +224 -0
  841. package/dist/systems/abilities.js.map +1 -0
  842. package/dist/systems/combat.d.ts +35 -1
  843. package/dist/systems/combat.js +677 -0
  844. package/dist/systems/combat.js.map +1 -0
  845. package/dist/systems/combatTold.d.ts +3 -1
  846. package/dist/systems/combatTold.js +85 -0
  847. package/dist/systems/combatTold.js.map +1 -0
  848. package/dist/systems/construction.js +80 -0
  849. package/dist/systems/construction.js.map +1 -0
  850. package/dist/systems/economy.d.ts +0 -6
  851. package/dist/systems/economy.js +128 -0
  852. package/dist/systems/economy.js.map +1 -0
  853. package/dist/systems/fog.d.ts +1 -1
  854. package/dist/systems/fog.js +120 -0
  855. package/dist/systems/fog.js.map +1 -0
  856. package/dist/systems/life.js +32 -0
  857. package/dist/systems/life.js.map +1 -0
  858. package/dist/systems/movement.d.ts +24 -12
  859. package/dist/systems/movement.js +1247 -0
  860. package/dist/systems/movement.js.map +1 -0
  861. package/dist/systems/orders.js +64 -0
  862. package/dist/systems/orders.js.map +1 -0
  863. package/dist/systems/production.js +322 -0
  864. package/dist/systems/production.js.map +1 -0
  865. package/dist/systems/productionQueue.js +120 -0
  866. package/dist/systems/productionQueue.js.map +1 -0
  867. package/dist/systems/victory.d.ts +1 -1
  868. package/dist/systems/victory.js +56 -0
  869. package/dist/systems/victory.js.map +1 -0
  870. package/dist/talk.d.ts +6 -6
  871. package/dist/talk.js +153 -0
  872. package/dist/talk.js.map +1 -0
  873. package/dist/targeting.d.ts +142 -0
  874. package/dist/targeting.js +49 -0
  875. package/dist/targeting.js.map +1 -0
  876. package/dist/tech.d.ts +20 -3
  877. package/dist/tech.js +239 -0
  878. package/dist/tech.js.map +1 -0
  879. package/dist/techTree.d.ts +7 -0
  880. package/dist/techTree.js +90 -0
  881. package/dist/techTree.js.map +1 -0
  882. package/dist/terrain.d.ts +59 -7
  883. package/dist/terrain.js +389 -0
  884. package/dist/terrain.js.map +1 -0
  885. package/dist/terrainSave.d.ts +6 -0
  886. package/dist/terrainSave.js +74 -0
  887. package/dist/terrainSave.js.map +1 -0
  888. package/dist/testing.d.ts +8 -7
  889. package/dist/testing.js +13 -739
  890. package/dist/testing.js.map +1 -1
  891. package/dist/tiles.d.ts +1 -1
  892. package/dist/tiles.js +43 -0
  893. package/dist/tiles.js.map +1 -0
  894. package/dist/timers.d.ts +29 -4
  895. package/dist/timers.js +242 -0
  896. package/dist/timers.js.map +1 -0
  897. package/dist/tomes.d.ts +4 -4
  898. package/dist/tomes.js +94 -0
  899. package/dist/tomes.js.map +1 -0
  900. package/dist/trade.js +103 -0
  901. package/dist/trade.js.map +1 -0
  902. package/dist/transport.d.ts +6 -1
  903. package/dist/transport.js +281 -0
  904. package/dist/transport.js.map +1 -0
  905. package/dist/tunables.d.ts +10 -3
  906. package/dist/tunables.js +56 -0
  907. package/dist/tunables.js.map +1 -0
  908. package/dist/unitResources.d.ts +67 -0
  909. package/dist/unitResources.js +266 -0
  910. package/dist/unitResources.js.map +1 -0
  911. package/dist/upkeep.d.ts +6 -1
  912. package/dist/upkeep.js +26 -0
  913. package/dist/upkeep.js.map +1 -0
  914. package/dist/veterancy.d.ts +8 -3
  915. package/dist/veterancy.js +131 -0
  916. package/dist/veterancy.js.map +1 -0
  917. package/dist/vision.d.ts +36 -0
  918. package/dist/vision.js +133 -0
  919. package/dist/vision.js.map +1 -0
  920. package/dist/walls.d.ts +1 -1
  921. package/dist/walls.js +278 -0
  922. package/dist/walls.js.map +1 -0
  923. package/dist/world.d.ts +606 -88
  924. package/dist/world.js +1263 -0
  925. package/dist/world.js.map +1 -0
  926. package/package.json +2 -2
  927. package/dist/ai.js.map +0 -1
  928. package/dist/attributes.d.ts +0 -66
  929. package/dist/brain-BvVdUhX8.js +0 -7659
  930. package/dist/brain-BvVdUhX8.js.map +0 -1
  931. package/dist/builds-C6LfgvEU.js +0 -460
  932. package/dist/builds-C6LfgvEU.js.map +0 -1
  933. package/dist/coreComponents-syuh2fPG.js +0 -5149
  934. package/dist/coreComponents-syuh2fPG.js.map +0 -1
  935. package/dist/debugCommands-CzjrSm66.js +0 -14739
  936. package/dist/debugCommands-CzjrSm66.js.map +0 -1
  937. package/dist/determinism-BCymQwiE.js +0 -518
  938. package/dist/determinism-BCymQwiE.js.map +0 -1
  939. package/dist/game-DiJEN-Ks.js +0 -5800
  940. package/dist/game-DiJEN-Ks.js.map +0 -1
  941. package/dist/index.js.map +0 -1
  942. package/dist/inspect-D9dWHmZ0.js.map +0 -1
  943. package/dist/local-Dkovq42k.js +0 -1379
  944. package/dist/local-Dkovq42k.js.map +0 -1
  945. package/dist/missionRules-C-bGxm0Q.js.map +0 -1
  946. package/dist/navigation-worker.js.map +0 -1
  947. package/dist/packs-g5thvmGn.js +0 -3199
  948. package/dist/packs-g5thvmGn.js.map +0 -1
  949. package/dist/profiles-B3NS9jwk.js.map +0 -1
  950. package/dist/server.js.map +0 -1
  951. package/dist/simulate-oXBiw1Ff.js.map +0 -1
@@ -0,0 +1,243 @@
1
+ //#region src/navigation/sized.ts
2
+ /**
3
+ * The ground cut for units of several sizes (S38): a navigation for each, an agent on the one for the biggest size it
4
+ * is not smaller than, so a big unit keeps from walls as far as it needs and a small one still fits through a gap.
5
+ * What is not about an agent (obstacles, where one can stand, a path asked for) goes to each, or to the smallest.
6
+ * Each size has its own crowd (Detour's crowd walks one navmesh), and each agent also stands as a mirror in the crowds
7
+ * of the others (`AgentMirrors`), so that units of different sizes steer round, push and are pushed by each other as
8
+ * on one navigation. The crowds step from the smallest up, each told where the last left its units: the small unit
9
+ * gives way to the big one, and what is left of an overlap is the big one's, so it is not made good twice
10
+ *
11
+ * @internal
12
+ */
13
+ var SizedNavigation = class {
14
+ sizes;
15
+ sizeOf = /* @__PURE__ */ new Map();
16
+ /** The ids on each size, for telling the others where they went */
17
+ members;
18
+ motion = {
19
+ x: 0,
20
+ y: 0,
21
+ z: 0,
22
+ vx: 0,
23
+ vz: 0
24
+ };
25
+ /**
26
+ * `sizes` from the smallest up, each with the radius it was cut for, and the radius of the biggest unit it takes
27
+ * (`upTo`) where that is not the next size's own
28
+ */
29
+ constructor(sizes) {
30
+ this.sizes = sizes;
31
+ if (!sizes.length) throw new Error("Navigation: no sizes to cut the ground for");
32
+ this.members = sizes.map(() => /* @__PURE__ */ new Set());
33
+ }
34
+ /** The walkable-space version of the smallest size's navigation, bumped when obstacles are added or removed */
35
+ get version() {
36
+ return this.sizes[0].navigation.version;
37
+ }
38
+ /**
39
+ * The size an agent of a radius goes on: the first that takes it (`upTo`), or the biggest it is not smaller than,
40
+ * the smallest for one smaller than all
41
+ */
42
+ sizeFor(radius) {
43
+ if (this.sizes.every((size) => size.upTo !== void 0)) {
44
+ const taken = this.sizes.findIndex((size) => radius <= size.upTo);
45
+ return taken < 0 ? this.sizes.length - 1 : taken;
46
+ }
47
+ let chosen = 0;
48
+ this.sizes.forEach((size, i) => {
49
+ if (radius >= size.radius) chosen = i;
50
+ });
51
+ return chosen;
52
+ }
53
+ of(id) {
54
+ return this.sizes[this.sizeOf.get(id) ?? 0].navigation;
55
+ }
56
+ /** Puts an agent on the size its `params.radius` picks, and adds a mirror of it to every other size's crowd */
57
+ addAgent(id, position, params) {
58
+ this.removeAgent(id);
59
+ this.enrol(id, params.radius);
60
+ this.of(id).addAgent(id, position, params);
61
+ this.addMirrors(id, params.radius, false);
62
+ }
63
+ enrol(id, radius) {
64
+ const size = this.sizeFor(radius);
65
+ this.sizeOf.set(id, size);
66
+ this.members[size].add(id);
67
+ }
68
+ /** An agent's mirror put in the crowd of every other size: out of everyone's way there while it phases */
69
+ addMirrors(id, radius, ghost, phasing = false) {
70
+ const own = this.sizeOf.get(id);
71
+ if (!this.sizes[own].navigation.readMotion(id, this.motion)) return;
72
+ this.sizes.forEach(({ navigation }, i) => {
73
+ if (i === own) return;
74
+ navigation.addMirror(id, this.motion, radius, ghost);
75
+ if (phasing) navigation.setMirrorPhasing?.(id, true);
76
+ });
77
+ }
78
+ /** Every other size told where an agent is now */
79
+ tellOthers(id, own) {
80
+ if (!this.sizes[own].navigation.readMotion(id, this.motion)) return;
81
+ for (let i = 0; i < this.sizes.length; i++) if (i !== own) this.sizes[i].navigation.moveMirror(id, this.motion);
82
+ }
83
+ /** Takes an agent out of its own size's crowd and its mirror out of every other size's; does nothing for an unknown id */
84
+ removeAgent(id) {
85
+ const own = this.sizeOf.get(id);
86
+ if (own === void 0) return;
87
+ this.sizes.forEach(({ navigation }, i) => {
88
+ if (i === own) navigation.removeAgent(id);
89
+ else navigation.removeMirror(id);
90
+ });
91
+ this.members[own].delete(id);
92
+ this.sizeOf.delete(id);
93
+ }
94
+ /** Whether an agent of this id is enrolled on a size and present in that size's navigation */
95
+ hasAgent(id) {
96
+ return this.sizeOf.has(id) && this.of(id).hasAgent(id);
97
+ }
98
+ /** Asks the agent's own size for a path towards `target`; false when nothing walkable is near it */
99
+ setDestination(id, target) {
100
+ return this.of(id).setDestination(id, target);
101
+ }
102
+ /** Stops the agent's walk on its own size's navigation */
103
+ clearDestination(id) {
104
+ this.of(id).clearDestination(id);
105
+ }
106
+ /** Moves the agent to `position` on its own size and tells the other sizes' mirrors where it now is */
107
+ teleport(id, position) {
108
+ this.of(id).teleport(id, position);
109
+ const own = this.sizeOf.get(id);
110
+ if (own !== void 0) this.tellOthers(id, own);
111
+ }
112
+ /** Sets whether the agent holds its ground on its own size, and updates its mirrors in the other sizes */
113
+ setAnchored(id, anchored) {
114
+ this.of(id).setAnchored(id, anchored);
115
+ const own = this.sizeOf.get(id);
116
+ if (own !== void 0) this.tellOthers(id, own);
117
+ }
118
+ /** Sets whether the agent ignores other agents, on its own size and on its mirrors in the other sizes */
119
+ setGhost(id, ghost) {
120
+ this.of(id).setGhost(id, ghost);
121
+ const own = this.sizeOf.get(id);
122
+ this.sizes.forEach(({ navigation }, i) => {
123
+ if (i !== own) navigation.setMirrorGhost(id, ghost);
124
+ });
125
+ }
126
+ /** Has the agent walk through every other on its own size, and its mirrors out of everyone's way on the others */
127
+ setPhasing(id, phasing) {
128
+ const own = this.sizeOf.get(id);
129
+ if (own === void 0) return;
130
+ const navigation = this.of(id);
131
+ if (navigation.setPhasing) navigation.setPhasing(id, phasing);
132
+ else navigation.setGhost(id, phasing);
133
+ this.sizes.forEach((size, i) => {
134
+ if (i !== own) size.navigation.setMirrorPhasing?.(id, phasing);
135
+ });
136
+ }
137
+ /** Sets the agent's top speed on its own size's navigation */
138
+ setSpeed(id, speed) {
139
+ this.of(id).setSpeed(id, speed);
140
+ }
141
+ /** Reads the agent's state from its own size into `out`; false when the agent is unknown */
142
+ readAgent(id, out) {
143
+ return this.sizeOf.has(id) && this.of(id).readAgent(id, out);
144
+ }
145
+ /** What a save needs of the agent from its own size, or undefined when there is none of that id */
146
+ saveAgent(id) {
147
+ return this.sizeOf.has(id) ? this.of(id).saveAgent(id) : void 0;
148
+ }
149
+ /** Puts an agent back from its save on the size its saved radius picks, with its mirrors in the other sizes */
150
+ restoreAgent(id, save) {
151
+ this.removeAgent(id);
152
+ this.enrol(id, save.radius);
153
+ this.of(id).restoreAgent(id, save);
154
+ this.addMirrors(id, save.radius, save.ghost, !!save.phasing);
155
+ }
156
+ /** Puts the given agents back as a load does, each size anew in the save's order, then all the mirrors in that order */
157
+ reseat(agents) {
158
+ this.sizeOf.clear();
159
+ for (const members of this.members) members.clear();
160
+ for (const [id, save] of agents) this.enrol(id, save.radius);
161
+ this.sizes.forEach((size, i) => size.navigation.reseat(agents.filter(([id]) => this.sizeOf.get(id) === i)));
162
+ for (const [id, save] of agents) this.addMirrors(id, save.radius, save.ghost, !!save.phasing);
163
+ }
164
+ /** After a load: settles every size's navigation at `version`, then tells each size where the others' agents are */
165
+ settle(version) {
166
+ for (const size of this.sizes) size.navigation.settle(version);
167
+ this.tellAll();
168
+ }
169
+ tellAll() {
170
+ for (const [id, own] of this.sizeOf) this.tellOthers(id, own);
171
+ }
172
+ /** Slow ground weighed again on each size's navigation, where a slowing layer changed */
173
+ groundChanged(cells, walkability) {
174
+ for (const size of this.sizes) size.navigation.groundChanged?.(cells, walkability);
175
+ }
176
+ /** Each size's navigation cut again of the ground as it is now */
177
+ reshape(area) {
178
+ let any = false;
179
+ for (const size of this.sizes) any = !!size.navigation.reshape?.(area) || any;
180
+ return any;
181
+ }
182
+ /** What the ground's changes asked of each size's navigation done now */
183
+ settleGround() {
184
+ for (const size of this.sizes) size.navigation.settleGround?.();
185
+ }
186
+ /** Steps each size's crowd from the smallest up, telling the other sizes where its agents went after each step */
187
+ update(dt) {
188
+ for (let i = 0; i < this.sizes.length; i++) {
189
+ this.sizes[i].navigation.update(dt);
190
+ if (this.sizes.length > 1) for (const id of this.members[i]) this.tellOthers(id, i);
191
+ }
192
+ }
193
+ /** Adds the obstacle to every size; false, with the sizes already done taken back, when any size has no room for it */
194
+ addObstacle(key, rect) {
195
+ const added = [];
196
+ for (const { navigation } of this.sizes) {
197
+ if (!navigation.addObstacle(key, rect)) {
198
+ for (const done of added) done.removeObstacle(key);
199
+ return false;
200
+ }
201
+ added.push(navigation);
202
+ }
203
+ return true;
204
+ }
205
+ /** Removes the obstacle `key` from every size's navigation */
206
+ removeObstacle(key) {
207
+ for (const size of this.sizes) size.navigation.removeObstacle(key);
208
+ }
209
+ /** Holds back (true) or applies (false) obstacle changes on every size that supports it */
210
+ holdObstacles(hold) {
211
+ for (const size of this.sizes) size.navigation.holdObstacles?.(hold);
212
+ }
213
+ /** How many more obstacles fit: the smallest room among the sizes */
214
+ obstacleRoom() {
215
+ return Math.min(...this.sizes.map((size) => size.navigation.obstacleRoom()));
216
+ }
217
+ /** Whether two agents are both enrolled; true for any two since different sizes see each other as mirrors */
218
+ sameCrowd(a, b) {
219
+ return this.sizeOf.has(a) && this.sizeOf.has(b);
220
+ }
221
+ /** The closest walkable point to `point` on the smallest size, or null when none is within `searchRadius` */
222
+ closestPoint(point, searchRadius) {
223
+ return this.sizes[0].navigation.closestPoint(point, searchRadius);
224
+ }
225
+ /** A path from `from` to `to` on the smallest size's navigation, or null when there is none */
226
+ findPath(from, to) {
227
+ return this.sizes[0].navigation.findPath(from, to);
228
+ }
229
+ /** The smallest size's navigation geometry for the debug overlay */
230
+ debugGeometry() {
231
+ return this.sizes[0].navigation.debugGeometry();
232
+ }
233
+ /** Disposes every size's navigation and forgets which agents are on which size */
234
+ dispose() {
235
+ for (const size of this.sizes) size.navigation.dispose();
236
+ this.sizeOf.clear();
237
+ for (const members of this.members) members.clear();
238
+ }
239
+ };
240
+ //#endregion
241
+ export { SizedNavigation };
242
+
243
+ //# sourceMappingURL=sized.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sized.js","names":[],"sources":["../../src/navigation/sized.ts"],"sourcesContent":["import type { Rect, Vec2 } from '#engine/math'\nimport type { AgentMirrors, AgentMotion, AgentParams, AgentSave, AgentState, CellArea, NavDebugGeometry, Navigation } from './navigation'\n\n/**\n * The ground cut for units of several sizes (S38): a navigation for each, an agent on the one for the biggest size it\n * is not smaller than, so a big unit keeps from walls as far as it needs and a small one still fits through a gap.\n * What is not about an agent (obstacles, where one can stand, a path asked for) goes to each, or to the smallest.\n * Each size has its own crowd (Detour's crowd walks one navmesh), and each agent also stands as a mirror in the crowds\n * of the others (`AgentMirrors`), so that units of different sizes steer round, push and are pushed by each other as\n * on one navigation. The crowds step from the smallest up, each told where the last left its units: the small unit\n * gives way to the big one, and what is left of an overlap is the big one's, so it is not made good twice\n *\n * @internal\n */\nexport class SizedNavigation implements Navigation {\n\tprivate readonly sizeOf = new Map<number, number>()\n\t/** The ids on each size, for telling the others where they went */\n\tprivate readonly members: Set<number>[]\n\tprivate readonly motion: AgentMotion = { x: 0, y: 0, z: 0, vx: 0, vz: 0 }\n\n\t/**\n\t * `sizes` from the smallest up, each with the radius it was cut for, and the radius of the biggest unit it takes\n\t * (`upTo`) where that is not the next size's own\n\t */\n\tconstructor(\n\t\t/** The per-size navigations from the smallest up, each with the radius it was cut for and the radius of the biggest unit it takes (`upTo`) */\n\t\treadonly sizes: readonly { radius: number; upTo?: number; navigation: Navigation & AgentMirrors }[]\n\t) {\n\t\tif (!sizes.length) throw new Error('Navigation: no sizes to cut the ground for')\n\t\tthis.members = sizes.map(() => new Set())\n\t}\n\n\t/** The walkable-space version of the smallest size's navigation, bumped when obstacles are added or removed */\n\tget version(): number {\n\t\treturn this.sizes[0].navigation.version\n\t}\n\n\t/**\n\t * The size an agent of a radius goes on: the first that takes it (`upTo`), or the biggest it is not smaller than,\n\t * the smallest for one smaller than all\n\t */\n\tsizeFor(radius: number): number {\n\t\tif (this.sizes.every((size) => size.upTo !== undefined)) {\n\t\t\tconst taken = this.sizes.findIndex((size) => radius <= size.upTo!)\n\t\t\treturn taken < 0 ? this.sizes.length - 1 : taken\n\t\t}\n\t\tlet chosen = 0\n\t\tthis.sizes.forEach((size, i) => {\n\t\t\tif (radius >= size.radius) chosen = i\n\t\t})\n\t\treturn chosen\n\t}\n\n\tprivate of(id: number): Navigation {\n\t\treturn this.sizes[this.sizeOf.get(id) ?? 0].navigation\n\t}\n\n\t/** Puts an agent on the size its `params.radius` picks, and adds a mirror of it to every other size's crowd */\n\taddAgent(id: number, position: Vec2, params: AgentParams): void {\n\t\tthis.removeAgent(id)\n\t\tthis.enrol(id, params.radius)\n\t\tthis.of(id).addAgent(id, position, params)\n\t\tthis.addMirrors(id, params.radius, false)\n\t}\n\n\tprivate enrol(id: number, radius: number): void {\n\t\tconst size = this.sizeFor(radius)\n\t\tthis.sizeOf.set(id, size)\n\t\tthis.members[size].add(id)\n\t}\n\n\t/** An agent's mirror put in the crowd of every other size: out of everyone's way there while it phases */\n\tprivate addMirrors(id: number, radius: number, ghost: boolean, phasing = false): void {\n\t\tconst own = this.sizeOf.get(id)!\n\t\tif (!this.sizes[own].navigation.readMotion(id, this.motion)) return\n\t\tthis.sizes.forEach(({ navigation }, i) => {\n\t\t\tif (i === own) return\n\t\t\tnavigation.addMirror(id, this.motion, radius, ghost)\n\t\t\tif (phasing) navigation.setMirrorPhasing?.(id, true)\n\t\t})\n\t}\n\n\t/** Every other size told where an agent is now */\n\tprivate tellOthers(id: number, own: number): void {\n\t\tif (!this.sizes[own].navigation.readMotion(id, this.motion)) return\n\t\tfor (let i = 0; i < this.sizes.length; i++) if (i !== own) this.sizes[i].navigation.moveMirror(id, this.motion)\n\t}\n\n\t/** Takes an agent out of its own size's crowd and its mirror out of every other size's; does nothing for an unknown id */\n\tremoveAgent(id: number): void {\n\t\tconst own = this.sizeOf.get(id)\n\t\tif (own === undefined) return\n\t\tthis.sizes.forEach(({ navigation }, i) => {\n\t\t\tif (i === own) navigation.removeAgent(id)\n\t\t\telse navigation.removeMirror(id)\n\t\t})\n\t\tthis.members[own].delete(id)\n\t\tthis.sizeOf.delete(id)\n\t}\n\n\t/** Whether an agent of this id is enrolled on a size and present in that size's navigation */\n\thasAgent(id: number): boolean {\n\t\treturn this.sizeOf.has(id) && this.of(id).hasAgent(id)\n\t}\n\n\t/** Asks the agent's own size for a path towards `target`; false when nothing walkable is near it */\n\tsetDestination(id: number, target: Vec2): boolean {\n\t\treturn this.of(id).setDestination(id, target)\n\t}\n\n\t/** Stops the agent's walk on its own size's navigation */\n\tclearDestination(id: number): void {\n\t\tthis.of(id).clearDestination(id)\n\t}\n\n\t/** Moves the agent to `position` on its own size and tells the other sizes' mirrors where it now is */\n\tteleport(id: number, position: Vec2): void {\n\t\tthis.of(id).teleport(id, position)\n\t\tconst own = this.sizeOf.get(id)\n\t\tif (own !== undefined) this.tellOthers(id, own)\n\t}\n\n\t/** Sets whether the agent holds its ground on its own size, and updates its mirrors in the other sizes */\n\tsetAnchored(id: number, anchored: boolean): void {\n\t\tthis.of(id).setAnchored(id, anchored)\n\t\tconst own = this.sizeOf.get(id)\n\t\tif (own !== undefined) this.tellOthers(id, own)\n\t}\n\n\t/** Sets whether the agent ignores other agents, on its own size and on its mirrors in the other sizes */\n\tsetGhost(id: number, ghost: boolean): void {\n\t\tthis.of(id).setGhost(id, ghost)\n\t\tconst own = this.sizeOf.get(id)\n\t\tthis.sizes.forEach(({ navigation }, i) => {\n\t\t\tif (i !== own) navigation.setMirrorGhost(id, ghost)\n\t\t})\n\t}\n\n\t/** Has the agent walk through every other on its own size, and its mirrors out of everyone's way on the others */\n\tsetPhasing(id: number, phasing: boolean): void {\n\t\tconst own = this.sizeOf.get(id)\n\t\tif (own === undefined) return\n\t\tconst navigation = this.of(id)\n\t\tif (navigation.setPhasing) navigation.setPhasing(id, phasing)\n\t\telse navigation.setGhost(id, phasing)\n\t\tthis.sizes.forEach((size, i) => {\n\t\t\tif (i !== own) size.navigation.setMirrorPhasing?.(id, phasing)\n\t\t})\n\t}\n\n\t/** Sets the agent's top speed on its own size's navigation */\n\tsetSpeed(id: number, speed: number): void {\n\t\tthis.of(id).setSpeed(id, speed)\n\t}\n\n\t/** Reads the agent's state from its own size into `out`; false when the agent is unknown */\n\treadAgent(id: number, out: AgentState): boolean {\n\t\treturn this.sizeOf.has(id) && this.of(id).readAgent(id, out)\n\t}\n\n\t/** What a save needs of the agent from its own size, or undefined when there is none of that id */\n\tsaveAgent(id: number): AgentSave | undefined {\n\t\treturn this.sizeOf.has(id) ? this.of(id).saveAgent(id) : undefined\n\t}\n\n\t/** Puts an agent back from its save on the size its saved radius picks, with its mirrors in the other sizes */\n\trestoreAgent(id: number, save: AgentSave): void {\n\t\t// its size is in its radius, which the save has\n\t\tthis.removeAgent(id)\n\t\tthis.enrol(id, save.radius)\n\t\tthis.of(id).restoreAgent(id, save)\n\t\tthis.addMirrors(id, save.radius, save.ghost, !!save.phasing)\n\t}\n\n\t/** Puts the given agents back as a load does, each size anew in the save's order, then all the mirrors in that order */\n\treseat(agents: readonly (readonly [id: number, save: AgentSave])[]): void {\n\t\t// each size anew, with its agents in the save's order: its size is in its radius, which the save has\n\t\tthis.sizeOf.clear()\n\t\tfor (const members of this.members) members.clear()\n\t\tfor (const [id, save] of agents) this.enrol(id, save.radius)\n\t\tthis.sizes.forEach((size, i) => size.navigation.reseat(agents.filter(([id]) => this.sizeOf.get(id) === i)))\n\t\t// and then the mirrors, in the same order, each as its own navigation has just put it\n\t\tfor (const [id, save] of agents) this.addMirrors(id, save.radius, save.ghost, !!save.phasing)\n\t}\n\n\t/** After a load: settles every size's navigation at `version`, then tells each size where the others' agents are */\n\tsettle(version: number): void {\n\t\tfor (const size of this.sizes) size.navigation.settle(version)\n\t\tthis.tellAll()\n\t}\n\n\tprivate tellAll(): void {\n\t\tfor (const [id, own] of this.sizeOf) this.tellOthers(id, own)\n\t}\n\n\t/** Slow ground weighed again on each size's navigation, where a slowing layer changed */\n\tgroundChanged(cells: readonly number[], walkability?: boolean): void {\n\t\tfor (const size of this.sizes) size.navigation.groundChanged?.(cells, walkability)\n\t}\n\n\t/** Each size's navigation cut again of the ground as it is now */\n\treshape(area?: CellArea): boolean {\n\t\tlet any = false\n\t\tfor (const size of this.sizes) any = !!size.navigation.reshape?.(area) || any\n\t\treturn any\n\t}\n\n\t/** What the ground's changes asked of each size's navigation done now */\n\tsettleGround(): void {\n\t\tfor (const size of this.sizes) size.navigation.settleGround?.()\n\t}\n\n\t/** Steps each size's crowd from the smallest up, telling the other sizes where its agents went after each step */\n\tupdate(dt: number): void {\n\t\tfor (let i = 0; i < this.sizes.length; i++) {\n\t\t\tthis.sizes[i].navigation.update(dt)\n\t\t\tif (this.sizes.length > 1) for (const id of this.members[i]) this.tellOthers(id, i)\n\t\t}\n\t}\n\n\t/** Adds the obstacle to every size; false, with the sizes already done taken back, when any size has no room for it */\n\taddObstacle(key: number, rect: Rect): boolean {\n\t\t// in the way of every size, or of none: refused by one is taken back from those it went into\n\t\tconst added: Navigation[] = []\n\t\tfor (const { navigation } of this.sizes) {\n\t\t\tif (!navigation.addObstacle(key, rect)) {\n\t\t\t\tfor (const done of added) done.removeObstacle(key)\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tadded.push(navigation)\n\t\t}\n\t\treturn true\n\t}\n\n\t/** Removes the obstacle `key` from every size's navigation */\n\tremoveObstacle(key: number): void {\n\t\tfor (const size of this.sizes) size.navigation.removeObstacle(key)\n\t}\n\n\t/** Holds back (true) or applies (false) obstacle changes on every size that supports it */\n\tholdObstacles(hold: boolean): void {\n\t\tfor (const size of this.sizes) size.navigation.holdObstacles?.(hold)\n\t}\n\n\t/** How many more obstacles fit: the smallest room among the sizes */\n\tobstacleRoom(): number {\n\t\treturn Math.min(...this.sizes.map((size) => size.navigation.obstacleRoom()))\n\t}\n\n\t/** Whether two agents are both enrolled; true for any two since different sizes see each other as mirrors */\n\tsameCrowd(a: number, b: number): boolean {\n\t\t// the one crowd, or each in the other's as a mirror: all the same to who is in whose way\n\t\treturn this.sizeOf.has(a) && this.sizeOf.has(b)\n\t}\n\n\t/** The closest walkable point to `point` on the smallest size, or null when none is within `searchRadius` */\n\tclosestPoint(point: Vec2, searchRadius?: number): Vec2 | null {\n\t\treturn this.sizes[0].navigation.closestPoint(point, searchRadius)\n\t}\n\n\t/** A path from `from` to `to` on the smallest size's navigation, or null when there is none */\n\tfindPath(from: Vec2, to: Vec2): Vec2[] | null {\n\t\treturn this.sizes[0].navigation.findPath(from, to)\n\t}\n\n\t/** The smallest size's navigation geometry for the debug overlay */\n\tdebugGeometry(): NavDebugGeometry {\n\t\treturn this.sizes[0].navigation.debugGeometry()\n\t}\n\n\t/** Disposes every size's navigation and forgets which agents are on which size */\n\tdispose(): void {\n\t\tfor (const size of this.sizes) size.navigation.dispose()\n\t\tthis.sizeOf.clear()\n\t\tfor (const members of this.members) members.clear()\n\t}\n}\n"],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ //#region src/nearest.ts
2
+ /** The id of a set closest to one that is not in it, when one is close enough to have been meant: what a check says was meant */
3
+ function nearestId(id, known) {
4
+ let best;
5
+ let least = Math.max(2, Math.floor(id.length / 3)) + 1;
6
+ for (const other of known) {
7
+ const distance = editDistance(id.toLowerCase(), other.toLowerCase());
8
+ if (distance < least) {
9
+ least = distance;
10
+ best = other;
11
+ }
12
+ }
13
+ return best;
14
+ }
15
+ /**
16
+ * How many letters have to be changed, added or taken away to make one word of another: what says which id was meant
17
+ *
18
+ * @beta
19
+ */
20
+ function editDistance(a, b) {
21
+ let row = Array.from({ length: b.length + 1 }, (_, i) => i);
22
+ for (let i = 1; i <= a.length; i++) {
23
+ const next = [i];
24
+ for (let j = 1; j <= b.length; j++) next[j] = Math.min(row[j] + 1, next[j - 1] + 1, row[j - 1] + (a[i - 1] === b[j - 1] ? 0 : 1));
25
+ row = next;
26
+ }
27
+ return row[b.length];
28
+ }
29
+ //#endregion
30
+ export { editDistance, nearestId };
31
+
32
+ //# sourceMappingURL=nearest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nearest.js","names":[],"sources":["../src/nearest.ts"],"sourcesContent":["/** The id of a set closest to one that is not in it, when one is close enough to have been meant: what a check says was meant */\nexport function nearestId(id: string, known: Iterable<string>): string | undefined {\n\tlet best: string | undefined\n\tlet least = Math.max(2, Math.floor(id.length / 3)) + 1\n\tfor (const other of known) {\n\t\tconst distance = editDistance(id.toLowerCase(), other.toLowerCase())\n\t\tif (distance < least) {\n\t\t\tleast = distance\n\t\t\tbest = other\n\t\t}\n\t}\n\treturn best\n}\n\n/**\n * How many letters have to be changed, added or taken away to make one word of another: what says which id was meant\n *\n * @beta\n */\nexport function editDistance(a: string, b: string): number {\n\tlet row = Array.from({ length: b.length + 1 }, (_, i) => i)\n\tfor (let i = 1; i <= a.length; i++) {\n\t\tconst next = [i]\n\t\tfor (let j = 1; j <= b.length; j++) next[j] = Math.min(row[j] + 1, next[j - 1] + 1, row[j - 1] + (a[i - 1] === b[j - 1] ? 0 : 1))\n\t\trow = next\n\t}\n\treturn row[b.length]\n}\n"],"mappings":";;AACA,SAAgB,UAAU,IAAY,OAA6C;CAClF,IAAI;CACJ,IAAI,QAAQ,KAAK,IAAI,GAAG,KAAK,MAAM,GAAG,SAAS,CAAC,CAAC,IAAI;CACrD,KAAK,MAAM,SAAS,OAAO;EAC1B,MAAM,WAAW,aAAa,GAAG,YAAY,GAAG,MAAM,YAAY,CAAC;EACnE,IAAI,WAAW,OAAO;GACrB,QAAQ;GACR,OAAO;EACR;CACD;CACA,OAAO;AACR;;;;;;AAOA,SAAgB,aAAa,GAAW,GAAmB;CAC1D,IAAI,MAAM,MAAM,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,GAAG,MAAM,CAAC;CAC1D,KAAK,IAAI,IAAI,GAAG,KAAK,EAAE,QAAQ,KAAK;EACnC,MAAM,OAAO,CAAC,CAAC;EACf,KAAK,IAAI,IAAI,GAAG,KAAK,EAAE,QAAQ,KAAK,KAAK,KAAK,KAAK,IAAI,IAAI,KAAK,GAAG,KAAK,IAAI,KAAK,GAAG,IAAI,IAAI,MAAM,EAAE,IAAI,OAAO,EAAE,IAAI,KAAK,IAAI,EAAE;EAChI,MAAM;CACP;CACA,OAAO,IAAI,EAAE;AACd"}
package/dist/noise.js ADDED
@@ -0,0 +1,59 @@
1
+ import { Rng } from "./rng.js";
2
+ //#region src/noise.ts
3
+ /**
4
+ * Noise that repeats: a lattice of random values that wraps around, read smoothly between them, so that whatever is
5
+ * made of it tiles. Seeded (`Rng`), so the same seed makes the same noise everywhere. What the map generator shapes
6
+ * its ground with; the client makes the ground's textures with the same (`packages/client`, its own copy, so that a
7
+ * worker of the page's loads nothing of the engine)
8
+ */
9
+ /**
10
+ * A value noise that repeats every `period` cells of its lattice: between 0 and 1, smooth
11
+ *
12
+ * @internal
13
+ */
14
+ function tilingNoise(period, seed) {
15
+ const size = Math.max(1, Math.round(period));
16
+ const rng = new Rng(seed);
17
+ const values = Float32Array.from({ length: size * size }, () => rng.next());
18
+ return (u, v) => {
19
+ const x = u * size;
20
+ const z = v * size;
21
+ let x0 = Math.floor(x);
22
+ let z0 = Math.floor(z);
23
+ const fx = x - x0;
24
+ const fz = z - z0;
25
+ x0 = (x0 % size + size) % size;
26
+ z0 = (z0 % size + size) % size;
27
+ const x1 = x0 + 1 === size ? 0 : x0 + 1;
28
+ const z1 = z0 + 1 === size ? 0 : z0 + 1;
29
+ const sx = fx * fx * (3 - 2 * fx);
30
+ const sz = fz * fz * (3 - 2 * fz);
31
+ const r0 = z0 * size;
32
+ const r1 = z1 * size;
33
+ const top = values[r0 + x0] + (values[r0 + x1] - values[r0 + x0]) * sx;
34
+ return top + (values[r1 + x0] + (values[r1 + x1] - values[r1 + x0]) * sx - top) * sz;
35
+ };
36
+ }
37
+ /**
38
+ * Several noises, each finer and fainter than the one before: what looks like ground and not like a pattern. 0..1
39
+ *
40
+ * @beta
41
+ */
42
+ function layeredNoise(seed, periods) {
43
+ const noises = periods.map((period, i) => tilingNoise(period, seed + i * 101));
44
+ const weights = periods.map((_, i) => 1 / (1 << i));
45
+ const total = weights.reduce((sum, weight) => sum + weight, 0);
46
+ if (noises.length === 1) {
47
+ const [only] = noises;
48
+ return (u, v) => only(u, v);
49
+ }
50
+ return (u, v) => {
51
+ let sum = 0;
52
+ for (let i = 0; i < noises.length; i++) sum += noises[i](u, v) * weights[i];
53
+ return sum / total;
54
+ };
55
+ }
56
+ //#endregion
57
+ export { layeredNoise, tilingNoise };
58
+
59
+ //# sourceMappingURL=noise.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"noise.js","names":[],"sources":["../src/noise.ts"],"sourcesContent":["/**\n * Noise that repeats: a lattice of random values that wraps around, read smoothly between them, so that whatever is\n * made of it tiles. Seeded (`Rng`), so the same seed makes the same noise everywhere. What the map generator shapes\n * its ground with; the client makes the ground's textures with the same (`packages/client`, its own copy, so that a\n * worker of the page's loads nothing of the engine)\n */\nimport { Rng } from './rng'\n\n/**\n * Noise between 0 and 1 at a point, `u` and `v` 0..1 across the picture it repeats over\n *\n * @beta\n */\nexport type Noise2 = (u: number, v: number) => number\n\n/**\n * A value noise that repeats every `period` cells of its lattice: between 0 and 1, smooth\n *\n * @internal\n */\nexport function tilingNoise(period: number, seed: number): Noise2 {\n\tconst size = Math.max(1, Math.round(period))\n\tconst rng = new Rng(seed)\n\tconst values = Float32Array.from({ length: size * size }, () => rng.next())\n\t// written out, with no call in it: read a few hundred thousand times for a map\n\treturn (u, v) => {\n\t\tconst x = u * size\n\t\tconst z = v * size\n\t\tlet x0 = Math.floor(x)\n\t\tlet z0 = Math.floor(z)\n\t\tconst fx = x - x0\n\t\tconst fz = z - z0\n\t\tx0 = ((x0 % size) + size) % size\n\t\tz0 = ((z0 % size) + size) % size\n\t\tconst x1 = x0 + 1 === size ? 0 : x0 + 1\n\t\tconst z1 = z0 + 1 === size ? 0 : z0 + 1\n\t\tconst sx = fx * fx * (3 - 2 * fx)\n\t\tconst sz = fz * fz * (3 - 2 * fz)\n\t\tconst r0 = z0 * size\n\t\tconst r1 = z1 * size\n\t\tconst top = values[r0 + x0] + (values[r0 + x1] - values[r0 + x0]) * sx\n\t\tconst bottom = values[r1 + x0] + (values[r1 + x1] - values[r1 + x0]) * sx\n\t\treturn top + (bottom - top) * sz\n\t}\n}\n\n/**\n * Several noises, each finer and fainter than the one before: what looks like ground and not like a pattern. 0..1\n *\n * @beta\n */\nexport function layeredNoise(seed: number, periods: readonly number[]): Noise2 {\n\tconst noises = periods.map((period, i) => tilingNoise(period, seed + i * 101))\n\tconst weights = periods.map((_, i) => 1 / (1 << i))\n\tconst total = weights.reduce((sum, weight) => sum + weight, 0)\n\tif (noises.length === 1) {\n\t\tconst [only] = noises\n\t\treturn (u, v) => only(u, v)\n\t}\n\treturn (u, v) => {\n\t\tlet sum = 0\n\t\tfor (let i = 0; i < noises.length; i++) sum += noises[i](u, v) * weights[i]\n\t\treturn sum / total\n\t}\n}\n"],"mappings":";;;;;;;;;;;;;AAoBA,SAAgB,YAAY,QAAgB,MAAsB;CACjE,MAAM,OAAO,KAAK,IAAI,GAAG,KAAK,MAAM,MAAM,CAAC;CAC3C,MAAM,MAAM,IAAI,IAAI,IAAI;CACxB,MAAM,SAAS,aAAa,KAAK,EAAE,QAAQ,OAAO,KAAK,SAAS,IAAI,KAAK,CAAC;CAE1E,QAAQ,GAAG,MAAM;EAChB,MAAM,IAAI,IAAI;EACd,MAAM,IAAI,IAAI;EACd,IAAI,KAAK,KAAK,MAAM,CAAC;EACrB,IAAI,KAAK,KAAK,MAAM,CAAC;EACrB,MAAM,KAAK,IAAI;EACf,MAAM,KAAK,IAAI;EACf,MAAO,KAAK,OAAQ,QAAQ;EAC5B,MAAO,KAAK,OAAQ,QAAQ;EAC5B,MAAM,KAAK,KAAK,MAAM,OAAO,IAAI,KAAK;EACtC,MAAM,KAAK,KAAK,MAAM,OAAO,IAAI,KAAK;EACtC,MAAM,KAAK,KAAK,MAAM,IAAI,IAAI;EAC9B,MAAM,KAAK,KAAK,MAAM,IAAI,IAAI;EAC9B,MAAM,KAAK,KAAK;EAChB,MAAM,KAAK,KAAK;EAChB,MAAM,MAAM,OAAO,KAAK,OAAO,OAAO,KAAK,MAAM,OAAO,KAAK,OAAO;EAEpE,OAAO,OADQ,OAAO,KAAK,OAAO,OAAO,KAAK,MAAM,OAAO,KAAK,OAAO,KAChD,OAAO;CAC/B;AACD;;;;;;AAOA,SAAgB,aAAa,MAAc,SAAoC;CAC9E,MAAM,SAAS,QAAQ,KAAK,QAAQ,MAAM,YAAY,QAAQ,OAAO,IAAI,GAAG,CAAC;CAC7E,MAAM,UAAU,QAAQ,KAAK,GAAG,MAAM,KAAK,KAAK,EAAE;CAClD,MAAM,QAAQ,QAAQ,QAAQ,KAAK,WAAW,MAAM,QAAQ,CAAC;CAC7D,IAAI,OAAO,WAAW,GAAG;EACxB,MAAM,CAAC,QAAQ;EACf,QAAQ,GAAG,MAAM,KAAK,GAAG,CAAC;CAC3B;CACA,QAAQ,GAAG,MAAM;EAChB,IAAI,MAAM;EACV,KAAK,IAAI,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK,OAAO,OAAO,EAAE,CAAC,GAAG,CAAC,IAAI,QAAQ;EACzE,OAAO,MAAM;CACd;AACD"}
@@ -20,10 +20,14 @@ export interface ObjectiveDef {
20
20
  /**
21
21
  * Typed help for writing one
22
22
  *
23
- * @beta
23
+ * @public
24
24
  */
25
25
  export declare const defineObjective: (def: ObjectiveDef) => ObjectiveDef;
26
- /** @beta */
26
+ /**
27
+ * Where an objective stands: `open` while it can still be met, `done` once met, `failed` once it can no longer be
28
+ *
29
+ * @beta
30
+ */
27
31
  export type ObjectiveStatus = 'open' | 'done' | 'failed';
28
32
  /**
29
33
  * An objective of a player, as it stands. Plain data: it is kept in the player's state, and sent to their screen
@@ -31,9 +35,13 @@ export type ObjectiveStatus = 'open' | 'done' | 'failed';
31
35
  * @beta
32
36
  */
33
37
  export interface ObjectiveState {
38
+ /** The objective's id (`ObjectiveDef.id`), unique among one player's objectives */
34
39
  id: string;
40
+ /** What it says, as a message with its params resolved (`ObjectiveDef.text` plus params given to `Objectives.add`) */
35
41
  text: Message;
42
+ /** Whether the mission needs it (`ObjectiveDef.required`, true when left out): all required done is a victory, one required failed a defeat */
36
43
  required: boolean;
44
+ /** Where it stands now: open, done or failed */
37
45
  status: ObjectiveStatus;
38
46
  /** How far along it is, for the ones that count: 3 of 10 waves */
39
47
  progress?: {
@@ -75,6 +83,7 @@ export declare class Objectives {
75
83
  }): void;
76
84
  /** A player's objectives, in the order they were given */
77
85
  of(player: PlayerId): readonly ObjectiveState[];
86
+ /** The player's objective of this id; throws when the player has none */
78
87
  get(player: PlayerId, id: string): ObjectiveState;
79
88
  /** Whether a player has the objective, open or not */
80
89
  has(player: PlayerId, id: string): boolean;
@@ -86,7 +95,7 @@ export declare class Objectives {
86
95
  * them wins, for their team. Like a melee game, a team whose players are all out loses, and the last team standing
87
96
  * wins. A game uses it as its `victory`
88
97
  *
89
- * @beta
98
+ * @public
90
99
  */
91
100
  export declare const objectiveVictory: System;
92
101
  /** An objective changed, to whose it is */
@@ -0,0 +1,144 @@
1
+ import { defineComponent } from "./components.js";
2
+ import { gameOver, objectiveChanged } from "./engineEvents.js";
3
+ import { replicateEvent } from "./replication.js";
4
+ import { toMessage } from "./messages.js";
5
+ import { defeat } from "./systems/victory.js";
6
+ //#region src/objectives.ts
7
+ /**
8
+ * Typed help for writing one
9
+ *
10
+ * @public
11
+ */
12
+ var defineObjective = (def) => def;
13
+ /** A player's objectives, in the order they were given */
14
+ var objectives = defineComponent({
15
+ id: "core.objectives",
16
+ default: () => []
17
+ });
18
+ /**
19
+ * The objectives of the players of a world. What changes in them is the engine's `objectiveChanged` event, which
20
+ * the player is shown, and which a game's listeners and sequences can wait for
21
+ *
22
+ * @beta
23
+ */
24
+ var Objectives = class {
25
+ world;
26
+ constructor(world) {
27
+ this.world = world;
28
+ }
29
+ /** Gives a player an objective, open. Its words' params and its progress can be given with it */
30
+ add(player, def, options = {}) {
31
+ const list = this.of(player);
32
+ if (list.some((objective) => objective.id === def.id)) throw new Error(`Player ${player} has the objective "${def.id}" already`);
33
+ const text = toMessage(def.text);
34
+ const objective = {
35
+ id: def.id,
36
+ text: options.params ? {
37
+ key: text.key,
38
+ params: {
39
+ ...text.params,
40
+ ...options.params
41
+ }
42
+ } : text,
43
+ required: def.required ?? true,
44
+ status: "open",
45
+ progress: options.progress && { ...options.progress },
46
+ ...def.detail !== void 0 && { detail: toMessage(def.detail) }
47
+ };
48
+ list.push(objective);
49
+ this.changed(player, objective, void 0);
50
+ return objective;
51
+ }
52
+ /** Done. Only an open one can be */
53
+ complete(player, id) {
54
+ this.settle(player, id, "done");
55
+ }
56
+ /** Failed, and why when that is worth saying. Only an open one can be */
57
+ fail(player, id, reason) {
58
+ this.settle(player, id, "failed", reason === void 0 ? void 0 : toMessage(reason));
59
+ }
60
+ /** How far along an open one is. Its words' params can change with it: "wave 3 of 10" */
61
+ progress(player, id, value, options = {}) {
62
+ const objective = this.get(player, id);
63
+ if (objective.status !== "open") return;
64
+ const max = options.max ?? objective.progress?.max ?? 1;
65
+ if (objective.progress?.value === value && objective.progress.max === max && !options.params) return;
66
+ objective.progress = {
67
+ value,
68
+ max
69
+ };
70
+ if (options.params) objective.text = {
71
+ key: objective.text.key,
72
+ params: {
73
+ ...objective.text.params,
74
+ ...options.params
75
+ }
76
+ };
77
+ this.changed(player, objective, "open");
78
+ }
79
+ /** A player's objectives, in the order they were given */
80
+ of(player) {
81
+ return this.world.player(player).state(objectives);
82
+ }
83
+ /** The player's objective of this id; throws when the player has none */
84
+ get(player, id) {
85
+ const objective = this.of(player).find((candidate) => candidate.id === id);
86
+ if (!objective) throw new Error(`Player ${player} has no objective "${id}"`);
87
+ return objective;
88
+ }
89
+ /** Whether a player has the objective, open or not */
90
+ has(player, id) {
91
+ return this.of(player).some((objective) => objective.id === id);
92
+ }
93
+ settle(player, id, status, reason) {
94
+ const objective = this.get(player, id);
95
+ if (objective.status !== "open") return;
96
+ objective.status = status;
97
+ if (reason) objective.reason = reason;
98
+ this.changed(player, objective, "open");
99
+ }
100
+ changed(player, objective, was) {
101
+ this.world.events.emit(objectiveChanged, {
102
+ player,
103
+ objective,
104
+ was
105
+ });
106
+ }
107
+ };
108
+ /**
109
+ * The rule of a mission: a player who failed an objective the mission needs is out, and a player who did all of
110
+ * them wins, for their team. Like a melee game, a team whose players are all out loses, and the last team standing
111
+ * wins. A game uses it as its `victory`
112
+ *
113
+ * @public
114
+ */
115
+ var objectiveVictory = {
116
+ name: "victory",
117
+ phase: "cleanup",
118
+ update(world) {
119
+ if (world.winner !== null) return;
120
+ for (const player of world.players.values()) {
121
+ if (player.neutral || player.defeated) continue;
122
+ const required = world.objectives.of(player.id).filter((objective) => objective.required);
123
+ if (required.some((objective) => objective.status === "failed")) defeat(world, player.id);
124
+ else if (required.length && required.every((objective) => objective.status === "done")) return win(world, player.team);
125
+ }
126
+ const standing = /* @__PURE__ */ new Set();
127
+ for (const player of world.players.values()) if (!player.neutral && !player.defeated) standing.add(player.team);
128
+ if (standing.size === 1) win(world, [...standing][0]);
129
+ }
130
+ };
131
+ function win(world, team) {
132
+ world.winner = team;
133
+ world.events.emit(gameOver, { winner: team });
134
+ }
135
+ /** An objective changed, to whose it is */
136
+ var toldObjective = replicateEvent(objectiveChanged, "objective", ({ player, objective, was }, view) => player === view.player ? {
137
+ type: "objective",
138
+ objective: structuredClone(objective),
139
+ was
140
+ } : void 0);
141
+ //#endregion
142
+ export { Objectives, defineObjective, objectiveVictory, objectives, toldObjective };
143
+
144
+ //# sourceMappingURL=objectives.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"objectives.js","names":["objectiveChangedEvent"],"sources":["../src/objectives.ts"],"sourcesContent":["import { gameOver, objectiveChanged as objectiveChangedEvent } from '#engine/engineEvents'\nimport { defineComponent } from './components'\nimport type { PlayerId } from './entity'\nimport { type Message, type MessageRef, toMessage } from './messages'\nimport type { System } from './registry'\nimport { defeat } from './systems/victory'\nimport type { World } from './world'\nimport { replicateEvent } from './replication'\n\n/**\n * What a player is set to do, in a mission: survive ten waves, keep the hero alive, build a frost tower\n *\n * @beta\n */\nexport interface ObjectiveDef {\n\t/** Shared by every game, like other ids: give it a prefix of the game's (`'td.hold'`) */\n\tid: string\n\t/** What it says, in the words of the game: a message key, with params where it shows numbers */\n\ttext: MessageRef\n\t/** Whether the mission needs it: all of them done is a victory, one failed a defeat. True when left out */\n\trequired?: boolean\n\t/** More about it, in the words of the game: shown under it when the player opens it in the quest panel (campaign plan CP5) */\n\tdetail?: MessageRef\n}\n\n/**\n * Typed help for writing one\n *\n * @public\n */\nexport const defineObjective = (def: ObjectiveDef): ObjectiveDef => def\n\n/**\n * Where an objective stands: `open` while it can still be met, `done` once met, `failed` once it can no longer be\n *\n * @beta\n */\nexport type ObjectiveStatus = 'open' | 'done' | 'failed'\n\n/**\n * An objective of a player, as it stands. Plain data: it is kept in the player's state, and sent to their screen\n *\n * @beta\n */\nexport interface ObjectiveState {\n\t/** The objective's id (`ObjectiveDef.id`), unique among one player's objectives */\n\tid: string\n\t/** What it says, as a message with its params resolved (`ObjectiveDef.text` plus params given to `Objectives.add`) */\n\ttext: Message\n\t/** Whether the mission needs it (`ObjectiveDef.required`, true when left out): all required done is a victory, one required failed a defeat */\n\trequired: boolean\n\t/** Where it stands now: open, done or failed */\n\tstatus: ObjectiveStatus\n\t/** How far along it is, for the ones that count: 3 of 10 waves */\n\tprogress?: { value: number; max: number }\n\t/** Why it failed, for a failed one that says */\n\treason?: Message\n\t/** More about it (`ObjectiveDef.detail`) */\n\tdetail?: Message\n}\n\n/** A player's objectives, in the order they were given */\nexport const objectives = defineComponent<ObjectiveState[]>({ id: 'core.objectives', default: () => [] })\n\n/**\n * The objectives of the players of a world. What changes in them is the engine's `objectiveChanged` event, which\n * the player is shown, and which a game's listeners and sequences can wait for\n *\n * @beta\n */\nexport class Objectives {\n\tconstructor(private readonly world: World) {}\n\n\t/** Gives a player an objective, open. Its words' params and its progress can be given with it */\n\tadd(player: PlayerId, def: ObjectiveDef, options: { params?: Message['params']; progress?: { value: number; max: number } } = {}): ObjectiveState {\n\t\tconst list = this.of(player) as ObjectiveState[]\n\t\tif (list.some((objective) => objective.id === def.id)) throw new Error(`Player ${player} has the objective \"${def.id}\" already`)\n\t\tconst text = toMessage(def.text)\n\t\tconst objective: ObjectiveState = {\n\t\t\tid: def.id,\n\t\t\ttext: options.params ? { key: text.key, params: { ...text.params, ...options.params } } : text,\n\t\t\trequired: def.required ?? true,\n\t\t\tstatus: 'open',\n\t\t\tprogress: options.progress && { ...options.progress },\n\t\t\t...(def.detail !== undefined && { detail: toMessage(def.detail) })\n\t\t}\n\t\tlist.push(objective)\n\t\tthis.changed(player, objective, undefined)\n\t\treturn objective\n\t}\n\n\t/** Done. Only an open one can be */\n\tcomplete(player: PlayerId, id: string): void {\n\t\tthis.settle(player, id, 'done')\n\t}\n\n\t/** Failed, and why when that is worth saying. Only an open one can be */\n\tfail(player: PlayerId, id: string, reason?: MessageRef): void {\n\t\tthis.settle(player, id, 'failed', reason === undefined ? undefined : toMessage(reason))\n\t}\n\n\t/** How far along an open one is. Its words' params can change with it: \"wave 3 of 10\" */\n\tprogress(player: PlayerId, id: string, value: number, options: { max?: number; params?: Message['params'] } = {}): void {\n\t\tconst objective = this.get(player, id)\n\t\tif (objective.status !== 'open') return\n\t\tconst max = options.max ?? objective.progress?.max ?? 1\n\t\tif (objective.progress?.value === value && objective.progress.max === max && !options.params) return\n\t\tobjective.progress = { value, max }\n\t\tif (options.params) objective.text = { key: objective.text.key, params: { ...objective.text.params, ...options.params } }\n\t\tthis.changed(player, objective, 'open')\n\t}\n\n\t/** A player's objectives, in the order they were given */\n\tof(player: PlayerId): readonly ObjectiveState[] {\n\t\treturn this.world.player(player).state(objectives)\n\t}\n\n\t/** The player's objective of this id; throws when the player has none */\n\tget(player: PlayerId, id: string): ObjectiveState {\n\t\tconst objective = this.of(player).find((candidate) => candidate.id === id)\n\t\tif (!objective) throw new Error(`Player ${player} has no objective \"${id}\"`)\n\t\treturn objective\n\t}\n\n\t/** Whether a player has the objective, open or not */\n\thas(player: PlayerId, id: string): boolean {\n\t\treturn this.of(player).some((objective) => objective.id === id)\n\t}\n\n\tprivate settle(player: PlayerId, id: string, status: 'done' | 'failed', reason?: Message): void {\n\t\tconst objective = this.get(player, id)\n\t\tif (objective.status !== 'open') return\n\t\tobjective.status = status\n\t\tif (reason) objective.reason = reason\n\t\tthis.changed(player, objective, 'open')\n\t}\n\n\tprivate changed(player: PlayerId, objective: ObjectiveState, was: ObjectiveStatus | undefined): void {\n\t\tthis.world.events.emit(objectiveChangedEvent, { player, objective, was })\n\t}\n}\n\n/**\n * The rule of a mission: a player who failed an objective the mission needs is out, and a player who did all of\n * them wins, for their team. Like a melee game, a team whose players are all out loses, and the last team standing\n * wins. A game uses it as its `victory`\n *\n * @public\n */\nexport const objectiveVictory: System = {\n\tname: 'victory',\n\tphase: 'cleanup',\n\tupdate(world) {\n\t\tif (world.winner !== null) return\n\t\tfor (const player of world.players.values()) {\n\t\t\tif (player.neutral || player.defeated) continue\n\t\t\tconst required = world.objectives.of(player.id).filter((objective) => objective.required)\n\t\t\tif (required.some((objective) => objective.status === 'failed')) defeat(world, player.id)\n\t\t\telse if (required.length && required.every((objective) => objective.status === 'done')) return win(world, player.team)\n\t\t}\n\t\t// the last team with anyone still in it\n\t\tconst standing = new Set<number>()\n\t\tfor (const player of world.players.values()) if (!player.neutral && !player.defeated) standing.add(player.team)\n\t\tif (standing.size === 1) win(world, [...standing][0])\n\t}\n}\n\nfunction win(world: World, team: number): void {\n\tworld.winner = team\n\tworld.events.emit(gameOver, { winner: team })\n}\n\n/** An objective changed, to whose it is */\nexport const toldObjective = replicateEvent(objectiveChangedEvent, 'objective', ({ player, objective, was }, view) =>\n\tplayer === view.player ? { type: 'objective', objective: structuredClone(objective), was } : undefined\n)\n"],"mappings":";;;;;;;;;;;AA8BA,IAAa,mBAAmB,QAAoC;;AAgCpE,IAAa,aAAa,gBAAkC;CAAE,IAAI;CAAmB,eAAe,CAAC;AAAE,CAAC;;;;;;;AAQxG,IAAa,aAAb,MAAwB;CACM;CAA7B,YAAY,OAA+B;EAAd,KAAA,QAAA;CAAe;;CAG5C,IAAI,QAAkB,KAAmB,UAAqF,CAAC,GAAmB;EACjJ,MAAM,OAAO,KAAK,GAAG,MAAM;EAC3B,IAAI,KAAK,MAAM,cAAc,UAAU,OAAO,IAAI,EAAE,GAAG,MAAM,IAAI,MAAM,UAAU,OAAO,sBAAsB,IAAI,GAAG,UAAU;EAC/H,MAAM,OAAO,UAAU,IAAI,IAAI;EAC/B,MAAM,YAA4B;GACjC,IAAI,IAAI;GACR,MAAM,QAAQ,SAAS;IAAE,KAAK,KAAK;IAAK,QAAQ;KAAE,GAAG,KAAK;KAAQ,GAAG,QAAQ;IAAO;GAAE,IAAI;GAC1F,UAAU,IAAI,YAAY;GAC1B,QAAQ;GACR,UAAU,QAAQ,YAAY,EAAE,GAAG,QAAQ,SAAS;GACpD,GAAI,IAAI,WAAW,KAAA,KAAa,EAAE,QAAQ,UAAU,IAAI,MAAM,EAAE;EACjE;EACA,KAAK,KAAK,SAAS;EACnB,KAAK,QAAQ,QAAQ,WAAW,KAAA,CAAS;EACzC,OAAO;CACR;;CAGA,SAAS,QAAkB,IAAkB;EAC5C,KAAK,OAAO,QAAQ,IAAI,MAAM;CAC/B;;CAGA,KAAK,QAAkB,IAAY,QAA2B;EAC7D,KAAK,OAAO,QAAQ,IAAI,UAAU,WAAW,KAAA,IAAY,KAAA,IAAY,UAAU,MAAM,CAAC;CACvF;;CAGA,SAAS,QAAkB,IAAY,OAAe,UAAwD,CAAC,GAAS;EACvH,MAAM,YAAY,KAAK,IAAI,QAAQ,EAAE;EACrC,IAAI,UAAU,WAAW,QAAQ;EACjC,MAAM,MAAM,QAAQ,OAAO,UAAU,UAAU,OAAO;EACtD,IAAI,UAAU,UAAU,UAAU,SAAS,UAAU,SAAS,QAAQ,OAAO,CAAC,QAAQ,QAAQ;EAC9F,UAAU,WAAW;GAAE;GAAO;EAAI;EAClC,IAAI,QAAQ,QAAQ,UAAU,OAAO;GAAE,KAAK,UAAU,KAAK;GAAK,QAAQ;IAAE,GAAG,UAAU,KAAK;IAAQ,GAAG,QAAQ;GAAO;EAAE;EACxH,KAAK,QAAQ,QAAQ,WAAW,MAAM;CACvC;;CAGA,GAAG,QAA6C;EAC/C,OAAO,KAAK,MAAM,OAAO,MAAM,CAAC,CAAC,MAAM,UAAU;CAClD;;CAGA,IAAI,QAAkB,IAA4B;EACjD,MAAM,YAAY,KAAK,GAAG,MAAM,CAAC,CAAC,MAAM,cAAc,UAAU,OAAO,EAAE;EACzE,IAAI,CAAC,WAAW,MAAM,IAAI,MAAM,UAAU,OAAO,qBAAqB,GAAG,EAAE;EAC3E,OAAO;CACR;;CAGA,IAAI,QAAkB,IAAqB;EAC1C,OAAO,KAAK,GAAG,MAAM,CAAC,CAAC,MAAM,cAAc,UAAU,OAAO,EAAE;CAC/D;CAEA,OAAe,QAAkB,IAAY,QAA2B,QAAwB;EAC/F,MAAM,YAAY,KAAK,IAAI,QAAQ,EAAE;EACrC,IAAI,UAAU,WAAW,QAAQ;EACjC,UAAU,SAAS;EACnB,IAAI,QAAQ,UAAU,SAAS;EAC/B,KAAK,QAAQ,QAAQ,WAAW,MAAM;CACvC;CAEA,QAAgB,QAAkB,WAA2B,KAAwC;EACpG,KAAK,MAAM,OAAO,KAAKA,kBAAuB;GAAE;GAAQ;GAAW;EAAI,CAAC;CACzE;AACD;;;;;;;;AASA,IAAa,mBAA2B;CACvC,MAAM;CACN,OAAO;CACP,OAAO,OAAO;EACb,IAAI,MAAM,WAAW,MAAM;EAC3B,KAAK,MAAM,UAAU,MAAM,QAAQ,OAAO,GAAG;GAC5C,IAAI,OAAO,WAAW,OAAO,UAAU;GACvC,MAAM,WAAW,MAAM,WAAW,GAAG,OAAO,EAAE,CAAC,CAAC,QAAQ,cAAc,UAAU,QAAQ;GACxF,IAAI,SAAS,MAAM,cAAc,UAAU,WAAW,QAAQ,GAAG,OAAO,OAAO,OAAO,EAAE;QACnF,IAAI,SAAS,UAAU,SAAS,OAAO,cAAc,UAAU,WAAW,MAAM,GAAG,OAAO,IAAI,OAAO,OAAO,IAAI;EACtH;EAEA,MAAM,2BAAW,IAAI,IAAY;EACjC,KAAK,MAAM,UAAU,MAAM,QAAQ,OAAO,GAAG,IAAI,CAAC,OAAO,WAAW,CAAC,OAAO,UAAU,SAAS,IAAI,OAAO,IAAI;EAC9G,IAAI,SAAS,SAAS,GAAG,IAAI,OAAO,CAAC,GAAG,QAAQ,CAAC,CAAC,EAAE;CACrD;AACD;AAEA,SAAS,IAAI,OAAc,MAAoB;CAC9C,MAAM,SAAS;CACf,MAAM,OAAO,KAAK,UAAU,EAAE,QAAQ,KAAK,CAAC;AAC7C;;AAGA,IAAa,gBAAgB,eAAeA,kBAAuB,cAAc,EAAE,QAAQ,WAAW,OAAO,SAC5G,WAAW,KAAK,SAAS;CAAE,MAAM;CAAa,WAAW,gBAAgB,SAAS;CAAG;AAAI,IAAI,KAAA,CAC9F"}
@@ -1,6 +1,7 @@
1
1
  import { type EntityId } from '#engine/entity';
2
2
  import type { Vec2 } from '#engine/math';
3
3
  import type { OrderBehavior, OrderInits } from '#engine/registry';
4
+ import { type WaitState } from '#engine/orders/waiting';
4
5
  /**
5
6
  * What `hold` keeps in its order: what it is fighting, 0 for nothing
6
7
  *
@@ -11,11 +12,12 @@ export interface HoldState {
11
12
  target?: EntityId;
12
13
  }
13
14
  /**
14
- * What `attack` keeps: whether it lost sight and walks to where it last saw its target
15
+ * What `attack` keeps: whether it lost sight and walks to where it last saw its target, and whether it waits for room
16
+ * by it (`WaitState`)
15
17
  *
16
18
  * @beta
17
19
  */
18
- export interface AttackState {
20
+ export interface AttackState extends WaitState {
19
21
  /** Walking to where it last saw its target */
20
22
  searching?: boolean;
21
23
  /** Where it last saw it */
@@ -26,13 +28,11 @@ export interface AttackState {
26
28
  *
27
29
  * @beta
28
30
  */
29
- export interface AdvanceState {
31
+ export interface AdvanceState extends WaitState {
30
32
  /** What it fights, 0 for nothing */
31
33
  target?: EntityId;
32
34
  /** To walk on again once the fight is over */
33
35
  resume?: boolean;
34
- /** Held up behind its own, waiting */
35
- waiting?: boolean;
36
36
  /** The point it last set out for */
37
37
  heading?: Vec2;
38
38
  }