@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
@@ -1,5 +1,9 @@
1
1
  import type { GamePack } from '#engine/packs/pack';
2
- /** @beta */
2
+ /**
3
+ * The id of the director pack, the namespace of its commands and components
4
+ *
5
+ * @beta
6
+ */
3
7
  export declare const DIRECTOR = "director";
4
8
  /**
5
9
  * The cinematic playing on each player's screen, by its id, as their screen said (`cinematicPlaying`): whose
@@ -21,7 +25,11 @@ export declare const directorInvulnerable: import("#engine/components").Componen
21
25
  * @beta
22
26
  */
23
27
  export declare const DIRECTOR_ACTIONS: readonly ['spawn', 'remove', 'kill', 'teleport', 'scale', 'invulnerable', 'owner', 'order', 'facing'];
24
- /** @beta */
28
+ /**
29
+ * One of the `DIRECTOR_ACTIONS`: what a director's command does
30
+ *
31
+ * @beta
32
+ */
25
33
  export type DirectorAction = (typeof DIRECTOR_ACTIONS)[number];
26
34
  /**
27
35
  * The orders a director's command gives (`order`): to a spot, or at a unit
@@ -40,7 +48,7 @@ export declare const cinematicPlayingCommand: import("#engine/commands").Defined
40
48
  playing: import("#engine/fields").Check<boolean>;
41
49
  }>;
42
50
  /**
43
- * What a game's director takes (`withDirector(options)`)
51
+ * What a game's director takes (`directorPack(options)`)
44
52
  *
45
53
  * @beta
46
54
  */
@@ -74,8 +82,8 @@ export declare const directorCommand: import("#engine/commands").DefinedCommand<
74
82
  }>;
75
83
  /**
76
84
  * The director's pack (see the top of this file): its commands, what it keeps, and what keeps a unit it made
77
- * invulnerable so. `packs: [withDirector()]`, or `withDirector({ cinematics: ['intro'] })` for those alone
85
+ * invulnerable so. `packs: [directorPack()]`, or `directorPack({ cinematics: ['intro'] })` for those alone
78
86
  *
79
87
  * @beta
80
88
  */
81
- export declare function withDirector(options?: DirectorOptions): GamePack;
89
+ export declare function directorPack(options?: DirectorOptions): GamePack;
@@ -0,0 +1,204 @@
1
+ import { defineComponent } from "../../components.js";
2
+ import { commandRejected } from "../../engineEvents.js";
3
+ import { defineHook } from "../../hooks.js";
4
+ import { bool, id, number, oneOf, optional, point, string } from "../../fields.js";
5
+ import { createOrder, giveOrder, interrupt } from "../../orders/queue.js";
6
+ import { defineCommand } from "../../commands.js";
7
+ //#region src/packs/director/index.ts
8
+ /**
9
+ * The id of the director pack, the namespace of its commands and components
10
+ *
11
+ * @beta
12
+ */
13
+ var DIRECTOR = "director";
14
+ /**
15
+ * The cinematic playing on each player's screen, by its id, as their screen said (`cinematicPlaying`): whose
16
+ * director's commands are taken
17
+ *
18
+ * @beta
19
+ */
20
+ var directing = defineComponent({
21
+ id: "director.playing",
22
+ default: () => ({})
23
+ });
24
+ /**
25
+ * The units a cinematic made invulnerable (`director` with `invulnerable`): nothing hurts or kills them until it says
26
+ * otherwise
27
+ *
28
+ * @beta
29
+ */
30
+ var directorInvulnerable = defineComponent({ id: "director.invulnerable" });
31
+ /**
32
+ * What a director's command does (`DirectorCommand.action`)
33
+ *
34
+ * @beta
35
+ */
36
+ var DIRECTOR_ACTIONS = [
37
+ "spawn",
38
+ "remove",
39
+ "kill",
40
+ "teleport",
41
+ "scale",
42
+ "invulnerable",
43
+ "owner",
44
+ "order",
45
+ "facing"
46
+ ];
47
+ /**
48
+ * The orders a director's command gives (`order`): to a spot, or at a unit
49
+ *
50
+ * @beta
51
+ */
52
+ var DIRECTOR_ORDERS = [
53
+ "move",
54
+ "attack",
55
+ "attackMove",
56
+ "patrol",
57
+ "stop",
58
+ "hold"
59
+ ];
60
+ /**
61
+ * A player's screen says a cinematic began on it (`playing: true`, its id) or ended: while one plays there, the
62
+ * director's commands it sends are taken
63
+ *
64
+ * @beta
65
+ */
66
+ var cinematicPlayingCommand = defineCommand("cinematicPlaying", {
67
+ cinematic: string,
68
+ playing: bool
69
+ }, (world, player, command) => {
70
+ const known = directorOptions(world).cinematics;
71
+ if (command.playing && known && !known.includes(command.cinematic) && !world.debugPlayers.has(player)) return refuse(world, player, `"${command.cinematic}" is no cinematic the director plays in (directorPack's cinematics)`);
72
+ const now = { ...world.state(directing) };
73
+ if (command.playing) now[player] = command.cinematic;
74
+ else if (now[player] === command.cinematic) delete now[player];
75
+ world.setState(directing, now);
76
+ });
77
+ /** The options the game's director pack was made with */
78
+ var directorOptions = (world) => world.registry.module?.packs?.find((pack) => pack.id === "director")?.options ?? {};
79
+ /** Turned away, and counted as what the player's own client never sends */
80
+ var refuse = (world, player, reason) => world.events.emit(commandRejected, {
81
+ player,
82
+ type: "director",
83
+ kind: "notDirecting",
84
+ reason
85
+ });
86
+ /**
87
+ * A cinematic's say over the game (see the top of this file): `action` with what it takes. `unit` is the one it is
88
+ * done to (any player's); `spawn` puts one of `unitType` down for `owner` at `at`, turned to `facing`, named `name` for
89
+ * what comes after it in the cinematic (`world.named`)
90
+ *
91
+ * @beta
92
+ */
93
+ var directorCommand = defineCommand("director", {
94
+ cinematic: string,
95
+ action: oneOf(...DIRECTOR_ACTIONS),
96
+ unit: optional(id),
97
+ unitType: optional(string),
98
+ owner: optional(id),
99
+ at: optional(point),
100
+ facing: optional(number),
101
+ scale: optional(number),
102
+ on: optional(bool),
103
+ name: optional(string),
104
+ order: optional(oneOf(...DIRECTOR_ORDERS)),
105
+ target: optional(id)
106
+ }, (world, player, command) => {
107
+ const playing = world.state(directing)[player];
108
+ if (playing !== command.cinematic) {
109
+ refuse(world, player, playing ? `the cinematic playing is "${playing}", not "${command.cinematic}"` : "no cinematic plays on their screen");
110
+ return;
111
+ }
112
+ const { action } = command;
113
+ if (action === "spawn") {
114
+ if (!command.unitType || !world.registry.units.has(command.unitType)) return refuse(world, player, `there is no unit type "${command.unitType}"`);
115
+ const owner = command.owner ?? player;
116
+ if (!world.players.has(owner)) return refuse(world, player, `there is no player ${owner}`);
117
+ if (!command.at) return refuse(world, player, "a unit put down needs where (at)");
118
+ world.spawn(command.unitType, owner, command.at, {
119
+ ...command.facing !== void 0 && { facing: command.facing },
120
+ ...command.name && { name: command.name }
121
+ });
122
+ return;
123
+ }
124
+ const entity = command.unit === void 0 ? void 0 : world.get(command.unit);
125
+ if (!entity?.alive) return refuse(world, player, `there is no unit ${command.unit}`);
126
+ act(world, entity, command);
127
+ });
128
+ /** What a director's command does to a unit there is */
129
+ function act(world, entity, command) {
130
+ switch (command.action) {
131
+ case "remove":
132
+ world.kill(entity, void 0, false, "removed");
133
+ break;
134
+ case "kill":
135
+ world.kill(entity);
136
+ break;
137
+ case "teleport":
138
+ if (command.at) world.place(entity, command.at);
139
+ break;
140
+ case "scale":
141
+ if (command.scale !== void 0 && command.scale > 0) entity.scale = command.scale;
142
+ break;
143
+ case "invulnerable":
144
+ if (command.on === false) entity.remove(directorInvulnerable);
145
+ else entity.set(directorInvulnerable, true);
146
+ break;
147
+ case "owner":
148
+ if (command.owner !== void 0 && world.players.has(command.owner)) world.setOwner(entity, command.owner);
149
+ break;
150
+ case "facing":
151
+ if (command.facing !== void 0) entity.facing = command.facing;
152
+ break;
153
+ case "order": {
154
+ const kind = command.order ?? "move";
155
+ const target = command.target === void 0 ? void 0 : world.get(command.target);
156
+ if (kind === "stop") {
157
+ interrupt(world, entity);
158
+ break;
159
+ }
160
+ const init = kind === "hold" ? { type: kind } : kind === "attack" && target ? {
161
+ type: "attack",
162
+ target: target.id
163
+ } : command.at ? {
164
+ type: kind === "attack" ? "attackMove" : kind,
165
+ point: command.at
166
+ } : void 0;
167
+ if (init) giveOrder(world, entity, createOrder(world, init));
168
+ break;
169
+ }
170
+ }
171
+ }
172
+ /** Nothing hurts or kills a unit a cinematic made invulnerable */
173
+ var invulnerableHooks = [defineHook({
174
+ hook: "beforeDamage",
175
+ id: "director",
176
+ run(_world, damage) {
177
+ if (damage.target.has(directorInvulnerable)) damage.cancelled = true;
178
+ }
179
+ }), defineHook({
180
+ hook: "beforeDeath",
181
+ id: "director",
182
+ run(_world, death) {
183
+ if (death.entity.has(directorInvulnerable) && death.reason !== "removed") death.cancelled = true;
184
+ }
185
+ })];
186
+ /**
187
+ * The director's pack (see the top of this file): its commands, what it keeps, and what keeps a unit it made
188
+ * invulnerable so. `packs: [directorPack()]`, or `directorPack({ cinematics: ['intro'] })` for those alone
189
+ *
190
+ * @beta
191
+ */
192
+ function directorPack(options = {}) {
193
+ return {
194
+ id: DIRECTOR,
195
+ options,
196
+ commands: [cinematicPlayingCommand, directorCommand],
197
+ components: [directing, directorInvulnerable],
198
+ hooks: invulnerableHooks
199
+ };
200
+ }
201
+ //#endregion
202
+ export { DIRECTOR, DIRECTOR_ACTIONS, DIRECTOR_ORDERS, cinematicPlayingCommand, directing, directorCommand, directorInvulnerable, directorPack };
203
+
204
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../src/packs/director/index.ts"],"sourcesContent":["import { defineComponent } from '#engine/components'\nimport { type CommandDef, defineCommand } from '#engine/commands'\nimport { commandRejected } from '#engine/engineEvents'\nimport type { Entity, PlayerId } from '#engine/entity'\nimport { bool, id, number, oneOf, optional, point, string } from '#engine/fields'\nimport { defineHook, type HookDef } from '#engine/hooks'\nimport { createOrder, giveOrder, interrupt } from '#engine/orders/queue'\nimport type { GamePack } from '#engine/packs/pack'\nimport type { World } from '#engine/world'\n\n/*\n * The director (campaign plan CI1): a cinematic that changes the game itself, for any player's units, as a film's\n * director does. A cinematic plays on a player's screen, and the rules change only by commands, so that every machine\n * and a replay have the same game: the screen says a cinematic began and ended (`cinematicPlaying`), and while one\n * plays on it, its `director` commands are taken: a unit put down, taken away, killed, put elsewhere, sized, made\n * invulnerable, given to another player, ordered, turned. Outside a cinematic they are turned away and counted\n * (`commandRejected`, `notDirecting`), as a server counts what a player's own client never sends. A game takes them\n * where it says so (`packs: [directorPack()]`)\n */\n\n/**\n * The id of the director pack, the namespace of its commands and components\n *\n * @beta\n */\nexport const DIRECTOR = 'director'\n\n/**\n * The cinematic playing on each player's screen, by its id, as their screen said (`cinematicPlaying`): whose\n * director's commands are taken\n *\n * @beta\n */\nexport const directing = defineComponent<Record<number, string>>({ id: 'director.playing', default: () => ({}) })\n\n/**\n * The units a cinematic made invulnerable (`director` with `invulnerable`): nothing hurts or kills them until it says\n * otherwise\n *\n * @beta\n */\nexport const directorInvulnerable = defineComponent<true>({ id: 'director.invulnerable' })\n\n/**\n * What a director's command does (`DirectorCommand.action`)\n *\n * @beta\n */\nexport const DIRECTOR_ACTIONS = ['spawn', 'remove', 'kill', 'teleport', 'scale', 'invulnerable', 'owner', 'order', 'facing'] as const\n\n/**\n * One of the `DIRECTOR_ACTIONS`: what a director's command does\n *\n * @beta\n */\nexport type DirectorAction = (typeof DIRECTOR_ACTIONS)[number]\n\n/**\n * The orders a director's command gives (`order`): to a spot, or at a unit\n *\n * @beta\n */\nexport const DIRECTOR_ORDERS = ['move', 'attack', 'attackMove', 'patrol', 'stop', 'hold'] as const\n\n/**\n * A player's screen says a cinematic began on it (`playing: true`, its id) or ended: while one plays there, the\n * director's commands it sends are taken\n *\n * @beta\n */\nexport const cinematicPlayingCommand = defineCommand('cinematicPlaying', { cinematic: string, playing: bool }, (world, player, command) => {\n\t// a cinematic the game says its director plays in, where it says; a debug seat's screen (the editor's preview, Play\n\t// here with cheats) may say any, as it may cheat: the one being made is not in the game's list yet\n\tconst known = directorOptions(world).cinematics\n\tif (command.playing && known && !known.includes(command.cinematic) && !world.debugPlayers.has(player))\n\t\treturn refuse(world, player, `\"${command.cinematic}\" is no cinematic the director plays in (directorPack's cinematics)`)\n\tconst now = { ...world.state(directing) }\n\tif (command.playing) now[player] = command.cinematic\n\telse if (now[player] === command.cinematic) delete now[player]\n\tworld.setState(directing, now)\n})\n\n/**\n * What a game's director takes (`directorPack(options)`)\n *\n * @beta\n */\nexport interface DirectorOptions {\n\t/**\n\t * The cinematics it plays in, by id: a screen that says another began is turned away (and counted), so that on a\n\t * server a player's own client cannot direct a game with a cinematic made up. Any when left out\n\t */\n\tcinematics?: readonly string[]\n}\n\n/** The options the game's director pack was made with */\nconst directorOptions = (world: World): DirectorOptions =>\n\t(world.registry.module?.packs?.find((pack) => pack.id === DIRECTOR)?.options as DirectorOptions | undefined) ?? {}\n\n/** Turned away, and counted as what the player's own client never sends */\nconst refuse = (world: World, player: PlayerId, reason: string) =>\n\tworld.events.emit(commandRejected, { player, type: 'director', kind: 'notDirecting', reason })\n\n/**\n * A cinematic's say over the game (see the top of this file): `action` with what it takes. `unit` is the one it is\n * done to (any player's); `spawn` puts one of `unitType` down for `owner` at `at`, turned to `facing`, named `name` for\n * what comes after it in the cinematic (`world.named`)\n *\n * @beta\n */\nexport const directorCommand = defineCommand(\n\t'director',\n\t{\n\t\tcinematic: string,\n\t\taction: oneOf(...DIRECTOR_ACTIONS),\n\t\tunit: optional(id),\n\t\tunitType: optional(string),\n\t\towner: optional(id),\n\t\tat: optional(point),\n\t\tfacing: optional(number),\n\t\tscale: optional(number),\n\t\ton: optional(bool),\n\t\tname: optional(string),\n\t\torder: optional(oneOf(...DIRECTOR_ORDERS)),\n\t\ttarget: optional(id)\n\t},\n\t(world, player, command) => {\n\t\tconst playing = world.state(directing)[player]\n\t\tif (playing !== command.cinematic) {\n\t\t\trefuse(world, player, playing ? `the cinematic playing is \"${playing}\", not \"${command.cinematic}\"` : 'no cinematic plays on their screen')\n\t\t\treturn\n\t\t}\n\t\tconst { action } = command\n\t\tif (action === 'spawn') {\n\t\t\tif (!command.unitType || !world.registry.units.has(command.unitType))\n\t\t\t\treturn refuse(world, player, `there is no unit type \"${command.unitType}\"`)\n\t\t\tconst owner = command.owner ?? player\n\t\t\tif (!world.players.has(owner)) return refuse(world, player, `there is no player ${owner}`)\n\t\t\tif (!command.at) return refuse(world, player, 'a unit put down needs where (at)')\n\t\t\tworld.spawn(command.unitType, owner, command.at, {\n\t\t\t\t...(command.facing !== undefined && { facing: command.facing }),\n\t\t\t\t...(command.name && { name: command.name })\n\t\t\t})\n\t\t\treturn\n\t\t}\n\t\tconst entity = command.unit === undefined ? undefined : world.get(command.unit)\n\t\tif (!entity?.alive) return refuse(world, player, `there is no unit ${command.unit}`)\n\t\tact(world, entity, command)\n\t}\n)\n\n/** What a director's command does to a unit there is */\nfunction act(world: World, entity: Entity, command: Parameters<typeof directorCommand.execute>[2]): void {\n\tswitch (command.action) {\n\t\tcase 'remove':\n\t\t\tworld.kill(entity, undefined, false, 'removed')\n\t\t\tbreak\n\t\tcase 'kill':\n\t\t\tworld.kill(entity)\n\t\t\tbreak\n\t\tcase 'teleport':\n\t\t\tif (command.at) world.place(entity, command.at)\n\t\t\tbreak\n\t\tcase 'scale':\n\t\t\tif (command.scale !== undefined && command.scale > 0) entity.scale = command.scale\n\t\t\tbreak\n\t\tcase 'invulnerable':\n\t\t\tif (command.on === false) entity.remove(directorInvulnerable)\n\t\t\telse entity.set(directorInvulnerable, true)\n\t\t\tbreak\n\t\tcase 'owner':\n\t\t\tif (command.owner !== undefined && world.players.has(command.owner)) world.setOwner(entity, command.owner)\n\t\t\tbreak\n\t\tcase 'facing':\n\t\t\tif (command.facing !== undefined) entity.facing = command.facing\n\t\t\tbreak\n\t\tcase 'order': {\n\t\t\tconst kind = command.order ?? 'move'\n\t\t\tconst target = command.target === undefined ? undefined : world.get(command.target)\n\t\t\t// stop is a command, not an order type: the unit is interrupted, as stopCommand does\n\t\t\tif (kind === 'stop') {\n\t\t\t\tinterrupt(world, entity)\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tconst init =\n\t\t\t\tkind === 'hold'\n\t\t\t\t\t? { type: kind }\n\t\t\t\t\t: kind === 'attack' && target\n\t\t\t\t\t\t? { type: 'attack', target: target.id }\n\t\t\t\t\t\t: command.at\n\t\t\t\t\t\t\t? { type: kind === 'attack' ? 'attackMove' : kind, point: command.at }\n\t\t\t\t\t\t\t: undefined\n\t\t\tif (init) giveOrder(world, entity, createOrder(world, init as never))\n\t\t\tbreak\n\t\t}\n\t}\n}\n\n/** Nothing hurts or kills a unit a cinematic made invulnerable */\nconst invulnerableHooks: HookDef[] = [\n\tdefineHook({\n\t\thook: 'beforeDamage',\n\t\tid: 'director',\n\t\trun(_world, damage) {\n\t\t\tif (damage.target.has(directorInvulnerable)) damage.cancelled = true\n\t\t}\n\t}),\n\tdefineHook({\n\t\thook: 'beforeDeath',\n\t\tid: 'director',\n\t\trun(_world, death) {\n\t\t\tif (death.entity.has(directorInvulnerable) && death.reason !== 'removed') death.cancelled = true\n\t\t}\n\t})\n]\n\n/**\n * The director's pack (see the top of this file): its commands, what it keeps, and what keeps a unit it made\n * invulnerable so. `packs: [directorPack()]`, or `directorPack({ cinematics: ['intro'] })` for those alone\n *\n * @beta\n */\nexport function directorPack(options: DirectorOptions = {}): GamePack {\n\treturn {\n\t\tid: DIRECTOR,\n\t\toptions,\n\t\tcommands: [cinematicPlayingCommand, directorCommand] as unknown as CommandDef[],\n\t\tcomponents: [directing, directorInvulnerable],\n\t\thooks: invulnerableHooks\n\t}\n}\n"],"mappings":"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"}
@@ -26,6 +26,7 @@ export interface MissionResult {
26
26
  * @beta
27
27
  */
28
28
  export interface CampaignProgress<D extends object = Record<string, unknown>> {
29
+ /** The version of the progress file's format, so what was kept is read again when the format changes */
29
30
  format: number;
30
31
  /** The campaign it is of, by id */
31
32
  campaign: string;
@@ -62,7 +63,7 @@ export declare function readCampaignProgress(data: unknown): CampaignProgress;
62
63
  export declare function missionWon<D extends object = Record<string, unknown>>(progress: CampaignProgress<D>, mission: string, seconds: number, heroes: HeroRecord[], next?: string, data?: Partial<D>): CampaignProgress<D>;
63
64
  /**
64
65
  * A unit as plain data, to take from one mission into the next (`carryUnits`, `placeUnits`): what it is, the name the
65
- * rules knew it by, how much of its health it has (a share, 0 to 1), its veterancy (`withVeterancy`) and its items
66
+ * rules knew it by, how much of its health it has (a share, 0 to 1), its veterancy (`veterancyPack`) and its items
66
67
  * slot by slot. Not where it is: the next mission says where they come in. Heroes are carried as heroes (`carryOut`)
67
68
  *
68
69
  * @beta
@@ -74,7 +75,7 @@ export interface UnitRecord {
74
75
  name?: string;
75
76
  /** Its health, a share of the most it has: 1 for whole */
76
77
  health: number;
77
- /** Its experience and rank, where it has earned some (`withVeterancy`) */
78
+ /** Its experience and rank, where it has earned some (`veterancyPack`) */
78
79
  veterancy?: VeterancyState;
79
80
  /** Its inventory slot by slot, where it has one: null for an empty slot */
80
81
  items?: (HeroItem | null)[];
@@ -0,0 +1,241 @@
1
+ import { cos, sin } from "../../exactMath.js";
2
+ import { slotsOf } from "../../inventory.js";
3
+ import { refreshVitals } from "../../stats.js";
4
+ import { inventoryChanged } from "../../engineEvents.js";
5
+ import { heroOf, heroesOf } from "../../hero.js";
6
+ import { createItem } from "../../items.js";
7
+ import { veterancy } from "../../veterancy.js";
8
+ import { applyHeroRecord, heroFromRecord, heroRecord, readHeroRecord } from "./carry.js";
9
+ //#region src/packs/heroes/campaign.ts
10
+ /**
11
+ * The format campaign progress is written in now
12
+ *
13
+ * @internal
14
+ */
15
+ var CAMPAIGN_FORMAT = 1;
16
+ /**
17
+ * A campaign as it is before anything is played: at its first mission, with nothing carried
18
+ *
19
+ * @beta
20
+ */
21
+ function newCampaignProgress(campaign, first) {
22
+ return {
23
+ format: 1,
24
+ campaign,
25
+ at: first,
26
+ done: {},
27
+ heroes: [],
28
+ data: {}
29
+ };
30
+ }
31
+ /**
32
+ * Progress as it was kept, checked and brought up to date. Throws on what is wrong
33
+ *
34
+ * @beta
35
+ */
36
+ function readCampaignProgress(data) {
37
+ const kept = data;
38
+ if (typeof kept !== "object" || kept === null) throw new Error("A campaign's progress is an object");
39
+ if (typeof kept.format !== "number" || kept.format > 1) throw new Error(`Campaign progress of format ${kept.format}, which this engine does not know`);
40
+ if (typeof kept.campaign !== "string" || typeof kept.at !== "string") throw new Error("A campaign's progress says which campaign it is and where it is at");
41
+ const done = {};
42
+ for (const [mission, result] of Object.entries(kept.done ?? {})) {
43
+ const { seconds, best, finished } = result ?? {};
44
+ if (typeof seconds !== "number" || !Number.isFinite(seconds)) throw new Error(`How long ${mission} took is a number`);
45
+ done[mission] = {
46
+ seconds,
47
+ best: typeof best === "number" ? best : seconds,
48
+ finished: typeof finished === "number" ? finished : 0
49
+ };
50
+ }
51
+ return {
52
+ format: 1,
53
+ campaign: kept.campaign,
54
+ at: kept.at,
55
+ ...typeof kept.difficulty === "string" && { difficulty: kept.difficulty },
56
+ done,
57
+ heroes: (kept.heroes ?? []).map(readHeroRecord),
58
+ data: typeof kept.data === "object" && kept.data !== null ? kept.data : {}
59
+ };
60
+ }
61
+ /**
62
+ * A mission won: how long it took, the best time kept, the heroes it ends with to carry on, the campaign at the
63
+ * mission after it (`next`), or still at this one when it was the last, and what it carries of the game's own
64
+ * (`data`: its keys over the ones kept, the rest kept as they were). A new progress: the one given is left as it was
65
+ *
66
+ * @beta
67
+ */
68
+ function missionWon(progress, mission, seconds, heroes, next, data) {
69
+ const before = progress.done[mission];
70
+ return {
71
+ ...progress,
72
+ at: next ?? progress.at,
73
+ done: {
74
+ ...progress.done,
75
+ [mission]: {
76
+ seconds,
77
+ best: before ? Math.min(before.best, seconds) : seconds,
78
+ finished: Date.now()
79
+ }
80
+ },
81
+ heroes: structuredClone(heroes),
82
+ data: data ? {
83
+ ...progress.data,
84
+ ...structuredClone(data)
85
+ } : progress.data
86
+ };
87
+ }
88
+ /**
89
+ * A player's units as records to carry on (`UnitRecord`): those alive, not structures, not heroes (`carryOut` carries
90
+ * those), and of them what `filter` keeps (the footmen, the three nearest the gate). In the order of their ids
91
+ *
92
+ * @beta
93
+ */
94
+ function carryUnits(world, player, filter = () => true) {
95
+ return [...world.index.ownedBy(player)].filter((unit) => unit.alive && unit.isUnit && !heroOf(unit) && filter(unit)).sort((a, b) => a.id - b.id).map((unit) => {
96
+ const name = world.nameOf(unit);
97
+ const rank = unit.get(veterancy);
98
+ const slots = slotsOf(unit);
99
+ return {
100
+ type: unit.def.id,
101
+ ...name !== void 0 && { name },
102
+ health: unit.maxHealth > 0 ? Math.min(Math.max(unit.health / unit.maxHealth, 0), 1) : 1,
103
+ ...rank && { veterancy: { ...rank } },
104
+ ...slots && { items: slots.map((slot) => slot ? {
105
+ item: slot.item,
106
+ charges: slot.charges,
107
+ ...slot.data && { data: structuredClone(slot.data) }
108
+ } : null) }
109
+ };
110
+ });
111
+ }
112
+ /**
113
+ * Brings carried units into a mission for a player, round a point (`spread` apart, in rings: 1.5 when left out), each
114
+ * with its name, its share of health, its veterancy and its items. What the game no longer has, a type or an item, is
115
+ * left out. The units made, in the order of the records
116
+ *
117
+ * @beta
118
+ */
119
+ function placeUnits(world, player, records, at, spread = 1.5) {
120
+ const made = [];
121
+ records.filter((record) => world.registry.units.has(record.type)).forEach((record, i) => {
122
+ const point = ringPoint(at, i, spread);
123
+ const unit = world.spawn(record.type, player, point, record.name !== void 0 ? { name: record.name } : {});
124
+ if (record.veterancy) {
125
+ unit.set(veterancy, { ...record.veterancy });
126
+ refreshVitals(world, unit);
127
+ }
128
+ const slots = slotsOf(unit);
129
+ if (slots && record.items) {
130
+ slots.fill(null);
131
+ record.items.forEach((carried, slot) => {
132
+ if (!carried || slot >= slots.length || !world.registry.items.has(carried.item)) return;
133
+ const instance = createItem(world, carried.item, carried.charges);
134
+ if (carried.data) instance.data = structuredClone(carried.data);
135
+ slots[slot] = instance;
136
+ });
137
+ world.events.emit(inventoryChanged, { entity: unit });
138
+ }
139
+ unit.health = Math.max(1, Math.round(unit.maxHealth * Math.min(Math.max(record.health, 0), 1)));
140
+ made.push(unit);
141
+ });
142
+ return made;
143
+ }
144
+ /** The `index`-th place round a point: the point first, then rings of six, twelve, … `spread` apart */
145
+ function ringPoint(at, index, spread) {
146
+ if (index === 0) return {
147
+ x: at.x,
148
+ z: at.z
149
+ };
150
+ let ring = 1;
151
+ let first = 1;
152
+ while (index >= first + ring * 6) {
153
+ first += ring * 6;
154
+ ring++;
155
+ }
156
+ const angle = (index - first) / (ring * 6) * Math.PI * 2;
157
+ return {
158
+ x: at.x + sin(angle) * ring * spread,
159
+ z: at.z + cos(angle) * ring * spread
160
+ };
161
+ }
162
+ /**
163
+ * What a player has researched, to carry on (`giveResearch`): each upgrade's level, by its id
164
+ *
165
+ * @beta
166
+ */
167
+ function carryResearch(world, player) {
168
+ return Object.fromEntries([...world.player(player).upgrades].filter(([, level]) => level > 0));
169
+ }
170
+ /**
171
+ * Gives a player research carried in (`carryResearch`): each upgrade up to its level, never down, no further than it
172
+ * goes, and what it does besides stats (`UpgradeDef.apply`) to the units the player has, as research finishing does.
173
+ * What the game no longer has is left out
174
+ *
175
+ * @beta
176
+ */
177
+ function giveResearch(world, player, research) {
178
+ const who = world.player(player);
179
+ for (const [upgrade, carried] of Object.entries(research)) {
180
+ if (!world.registry.upgrades.has(upgrade)) continue;
181
+ const def = world.registry.upgrade(upgrade);
182
+ const to = Math.min(Math.max(Math.floor(carried), 0), def.maxLevel ?? 1);
183
+ for (let level = (who.upgrades.get(upgrade) ?? 0) + 1; level <= to; level++) {
184
+ who.setUpgrade(upgrade, level);
185
+ if (def.apply) {
186
+ for (const entity of [...world.index.ownedBy(player)]) if (entity.alive) def.apply(world, entity, level);
187
+ }
188
+ }
189
+ who.researching.delete(upgrade);
190
+ }
191
+ }
192
+ /**
193
+ * What a player has of each resource, to carry on (`giveResources`): a copy, all of it, or of the kinds named
194
+ *
195
+ * @beta
196
+ */
197
+ function carryResources(world, player, kinds) {
198
+ const resources = world.player(player).resources;
199
+ return Object.fromEntries(Object.entries(resources).filter(([kind]) => !kinds || kinds.includes(kind)));
200
+ }
201
+ /**
202
+ * Gives a player resources carried in (`carryResources`), on top of what the mission starts it with. What the game no
203
+ * longer has is left out
204
+ *
205
+ * @beta
206
+ */
207
+ function giveResources(world, player, resources) {
208
+ const purse = world.player(player).resources;
209
+ const known = new Set(world.registry.resources.map((resource) => resource.id));
210
+ for (const [kind, amount] of Object.entries(resources)) if (known.has(kind) && Number.isFinite(amount)) purse[kind] = (purse[kind] ?? 0) + amount;
211
+ }
212
+ /**
213
+ * The heroes of a player as records to carry on (see `heroRecord`): fallen ones too, as a campaign brings them back
214
+ *
215
+ * @beta
216
+ */
217
+ function carryOut(world, player) {
218
+ return heroesOf(world, player).map((hero) => heroRecord(world, hero));
219
+ }
220
+ /**
221
+ * Brings carried heroes into a mission for a player. Each takes the place of the hero the map has for it: the one of
222
+ * that player under the same name, else one of that player of the same type; a hero the map has none for is made at
223
+ * `at`. The heroes, in the order of the records
224
+ *
225
+ * @beta
226
+ */
227
+ function carryIn(world, heroes, player, at) {
228
+ const taken = /* @__PURE__ */ new Set();
229
+ return heroes.map((record) => {
230
+ const named = record.name !== void 0 ? world.named(record.name) : void 0;
231
+ const placed = named && named.owner === player && heroOf(named) && !taken.has(named) ? named : heroesOf(world, player).find((hero) => hero.def.id === record.type && !taken.has(hero));
232
+ const hero = placed ?? heroFromRecord(world, record, player, at);
233
+ if (placed) applyHeroRecord(world, placed, record);
234
+ taken.add(hero);
235
+ return hero;
236
+ });
237
+ }
238
+ //#endregion
239
+ export { CAMPAIGN_FORMAT, carryIn, carryOut, carryResearch, carryResources, carryUnits, giveResearch, giveResources, missionWon, newCampaignProgress, placeUnits, readCampaignProgress };
240
+
241
+ //# sourceMappingURL=campaign.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"campaign.js","names":[],"sources":["../../../src/packs/heroes/campaign.ts"],"sourcesContent":["import { applyHeroRecord, heroFromRecord, type HeroItem, type HeroRecord, heroRecord, readHeroRecord } from './carry'\nimport { inventoryChanged } from '#engine/engineEvents'\nimport type { Entity, PlayerId } from '#engine/entity'\nimport { heroOf, heroesOf } from '#engine/hero'\nimport { slotsOf } from '#engine/inventory'\nimport { createItem } from '#engine/items'\nimport { cos, sin } from '#engine/exactMath'\nimport type { Vec2 } from '#engine/math'\nimport type { Purse } from '#engine/player'\nimport { refreshVitals } from '#engine/stats'\nimport { veterancy, type VeterancyState } from '#engine/veterancy'\nimport type { World } from '#engine/world'\n\n/**\n * How a mission of a campaign went, the last time it was won\n *\n * @beta\n */\nexport interface MissionResult {\n\t/** How long it took, in seconds of the game */\n\tseconds: number\n\t/** The shortest it ever took */\n\tbest: number\n\t/** When it was won, in milliseconds since 1970 */\n\tfinished: number\n}\n\n/**\n * How far a campaign has got, as plain data to keep between games: the mission it is at, the missions won and how\n * long each took, the heroes carried out of the last one won, and the game's own state of it (`data`, of the type\n * `D` the campaign says: choices made, gold saved up, the units that go on; what each mission won carries, merged in).\n * It says which format it is in, so that what was kept is read again when the format changes\n *\n * @beta\n */\nexport interface CampaignProgress<D extends object = Record<string, unknown>> {\n\t/** The version of the progress file's format, so what was kept is read again when the format changes */\n\tformat: number\n\t/** The campaign it is of, by id */\n\tcampaign: string\n\t/** The mission to play next */\n\tat: string\n\t/** The difficulty chosen for it (`CampaignDef.difficulties`), by name: its missions' computers play on it */\n\tdifficulty?: string\n\t/** Missions won, by id */\n\tdone: Record<string, MissionResult>\n\t/** The heroes carried into the next mission */\n\theroes: HeroRecord[]\n\t/** The game's own, plain data: what the missions won carried (`MissionDef.carry`), each mission's keys over the ones before */\n\tdata: Partial<D>\n}\n\n/**\n * The format campaign progress is written in now\n *\n * @internal\n */\nexport const CAMPAIGN_FORMAT = 1\n\n/**\n * A campaign as it is before anything is played: at its first mission, with nothing carried\n *\n * @beta\n */\nexport function newCampaignProgress<D extends object = Record<string, unknown>>(campaign: string, first: string): CampaignProgress<D> {\n\treturn { format: CAMPAIGN_FORMAT, campaign, at: first, done: {}, heroes: [], data: {} }\n}\n\n/**\n * Progress as it was kept, checked and brought up to date. Throws on what is wrong\n *\n * @beta\n */\nexport function readCampaignProgress(data: unknown): CampaignProgress {\n\tconst kept = data as Partial<CampaignProgress> | null\n\tif (typeof kept !== 'object' || kept === null) throw new Error(\"A campaign's progress is an object\")\n\tif (typeof kept.format !== 'number' || kept.format > CAMPAIGN_FORMAT)\n\t\tthrow new Error(`Campaign progress of format ${kept.format}, which this engine does not know`)\n\tif (typeof kept.campaign !== 'string' || typeof kept.at !== 'string')\n\t\tthrow new Error(\"A campaign's progress says which campaign it is and where it is at\")\n\tconst done: Record<string, MissionResult> = {}\n\tfor (const [mission, result] of Object.entries(kept.done ?? {})) {\n\t\tconst { seconds, best, finished } = (result ?? {}) as Partial<MissionResult>\n\t\tif (typeof seconds !== 'number' || !Number.isFinite(seconds)) throw new Error(`How long ${mission} took is a number`)\n\t\tdone[mission] = { seconds, best: typeof best === 'number' ? best : seconds, finished: typeof finished === 'number' ? finished : 0 }\n\t}\n\treturn {\n\t\tformat: CAMPAIGN_FORMAT,\n\t\tcampaign: kept.campaign,\n\t\tat: kept.at,\n\t\t...(typeof kept.difficulty === 'string' && { difficulty: kept.difficulty }),\n\t\tdone,\n\t\theroes: (kept.heroes ?? []).map(readHeroRecord),\n\t\tdata: typeof kept.data === 'object' && kept.data !== null ? kept.data : {}\n\t}\n}\n\n/**\n * A mission won: how long it took, the best time kept, the heroes it ends with to carry on, the campaign at the\n * mission after it (`next`), or still at this one when it was the last, and what it carries of the game's own\n * (`data`: its keys over the ones kept, the rest kept as they were). A new progress: the one given is left as it was\n *\n * @beta\n */\nexport function missionWon<D extends object = Record<string, unknown>>(\n\tprogress: CampaignProgress<D>,\n\tmission: string,\n\tseconds: number,\n\theroes: HeroRecord[],\n\tnext?: string,\n\tdata?: Partial<D>\n): CampaignProgress<D> {\n\tconst before = progress.done[mission]\n\treturn {\n\t\t...progress,\n\t\tat: next ?? progress.at,\n\t\tdone: { ...progress.done, [mission]: { seconds, best: before ? Math.min(before.best, seconds) : seconds, finished: Date.now() } },\n\t\theroes: structuredClone(heroes),\n\t\tdata: data ? { ...progress.data, ...structuredClone(data) } : progress.data\n\t}\n}\n\n/**\n * A unit as plain data, to take from one mission into the next (`carryUnits`, `placeUnits`): what it is, the name the\n * rules knew it by, how much of its health it has (a share, 0 to 1), its veterancy (`veterancyPack`) and its items\n * slot by slot. Not where it is: the next mission says where they come in. Heroes are carried as heroes (`carryOut`)\n *\n * @beta\n */\nexport interface UnitRecord {\n\t/** Its unit type */\n\ttype: string\n\t/** The name it was known by in the rules (`world.named`), when it had one */\n\tname?: string\n\t/** Its health, a share of the most it has: 1 for whole */\n\thealth: number\n\t/** Its experience and rank, where it has earned some (`veterancyPack`) */\n\tveterancy?: VeterancyState\n\t/** Its inventory slot by slot, where it has one: null for an empty slot */\n\titems?: (HeroItem | null)[]\n}\n\n/**\n * A player's units as records to carry on (`UnitRecord`): those alive, not structures, not heroes (`carryOut` carries\n * those), and of them what `filter` keeps (the footmen, the three nearest the gate). In the order of their ids\n *\n * @beta\n */\nexport function carryUnits(world: World, player: PlayerId, filter: (unit: Entity) => boolean = () => true): UnitRecord[] {\n\tconst units = [...world.index.ownedBy(player)]\n\t\t.filter((unit) => unit.alive && unit.isUnit && !heroOf(unit) && filter(unit))\n\t\t.sort((a, b) => a.id - b.id)\n\treturn units.map((unit) => {\n\t\tconst name = world.nameOf(unit)\n\t\tconst rank = unit.get(veterancy)\n\t\tconst slots = slotsOf(unit)\n\t\treturn {\n\t\t\ttype: unit.def.id,\n\t\t\t...(name !== undefined && { name }),\n\t\t\thealth: unit.maxHealth > 0 ? Math.min(Math.max(unit.health / unit.maxHealth, 0), 1) : 1,\n\t\t\t...(rank && { veterancy: { ...rank } }),\n\t\t\t...(slots && {\n\t\t\t\titems: slots.map((slot) => (slot ? { item: slot.item, charges: slot.charges, ...(slot.data && { data: structuredClone(slot.data) }) } : null))\n\t\t\t})\n\t\t}\n\t})\n}\n\n/**\n * Brings carried units into a mission for a player, round a point (`spread` apart, in rings: 1.5 when left out), each\n * with its name, its share of health, its veterancy and its items. What the game no longer has, a type or an item, is\n * left out. The units made, in the order of the records\n *\n * @beta\n */\nexport function placeUnits(world: World, player: PlayerId, records: readonly UnitRecord[], at: Vec2, spread = 1.5): Entity[] {\n\tconst made: Entity[] = []\n\tconst kept = records.filter((record) => world.registry.units.has(record.type))\n\tkept.forEach((record, i) => {\n\t\tconst point = ringPoint(at, i, spread)\n\t\tconst unit = world.spawn(record.type, player, point, record.name !== undefined ? { name: record.name } : {})\n\t\tif (record.veterancy) {\n\t\t\tunit.set(veterancy, { ...record.veterancy })\n\t\t\trefreshVitals(world, unit)\n\t\t}\n\t\tconst slots = slotsOf(unit)\n\t\tif (slots && record.items) {\n\t\t\tslots.fill(null)\n\t\t\trecord.items.forEach((carried, slot) => {\n\t\t\t\tif (!carried || slot >= slots.length || !world.registry.items.has(carried.item)) return\n\t\t\t\tconst instance = createItem(world, carried.item, carried.charges)\n\t\t\t\tif (carried.data) instance.data = structuredClone(carried.data)\n\t\t\t\tslots[slot] = instance\n\t\t\t})\n\t\t\tworld.events.emit(inventoryChanged, { entity: unit })\n\t\t}\n\t\tunit.health = Math.max(1, Math.round(unit.maxHealth * Math.min(Math.max(record.health, 0), 1)))\n\t\tmade.push(unit)\n\t})\n\treturn made\n}\n\n/** The `index`-th place round a point: the point first, then rings of six, twelve, … `spread` apart */\nfunction ringPoint(at: Vec2, index: number, spread: number): Vec2 {\n\tif (index === 0) return { x: at.x, z: at.z }\n\tlet ring = 1\n\tlet first = 1\n\twhile (index >= first + ring * 6) {\n\t\tfirst += ring * 6\n\t\tring++\n\t}\n\tconst angle = ((index - first) / (ring * 6)) * Math.PI * 2\n\treturn { x: at.x + sin(angle) * ring * spread, z: at.z + cos(angle) * ring * spread }\n}\n\n/**\n * What a player has researched, to carry on (`giveResearch`): each upgrade's level, by its id\n *\n * @beta\n */\nexport function carryResearch(world: World, player: PlayerId): Record<string, number> {\n\treturn Object.fromEntries([...world.player(player).upgrades].filter(([, level]) => level > 0))\n}\n\n/**\n * Gives a player research carried in (`carryResearch`): each upgrade up to its level, never down, no further than it\n * goes, and what it does besides stats (`UpgradeDef.apply`) to the units the player has, as research finishing does.\n * What the game no longer has is left out\n *\n * @beta\n */\nexport function giveResearch(world: World, player: PlayerId, research: Readonly<Record<string, number>>): void {\n\tconst who = world.player(player)\n\tfor (const [upgrade, carried] of Object.entries(research)) {\n\t\tif (!world.registry.upgrades.has(upgrade)) continue\n\t\tconst def = world.registry.upgrade(upgrade)\n\t\tconst to = Math.min(Math.max(Math.floor(carried), 0), def.maxLevel ?? 1)\n\t\tfor (let level = (who.upgrades.get(upgrade) ?? 0) + 1; level <= to; level++) {\n\t\t\twho.setUpgrade(upgrade, level)\n\t\t\tif (def.apply) for (const entity of [...world.index.ownedBy(player)]) if (entity.alive) def.apply(world, entity, level)\n\t\t}\n\t\twho.researching.delete(upgrade)\n\t}\n}\n\n/**\n * What a player has of each resource, to carry on (`giveResources`): a copy, all of it, or of the kinds named\n *\n * @beta\n */\nexport function carryResources(world: World, player: PlayerId, kinds?: readonly string[]): Purse {\n\tconst resources = world.player(player).resources\n\treturn Object.fromEntries(Object.entries(resources).filter(([kind]) => !kinds || kinds.includes(kind)))\n}\n\n/**\n * Gives a player resources carried in (`carryResources`), on top of what the mission starts it with. What the game no\n * longer has is left out\n *\n * @beta\n */\nexport function giveResources(world: World, player: PlayerId, resources: Readonly<Purse>): void {\n\tconst purse = world.player(player).resources\n\tconst known = new Set(world.registry.resources.map((resource) => resource.id))\n\tfor (const [kind, amount] of Object.entries(resources)) if (known.has(kind) && Number.isFinite(amount)) purse[kind] = (purse[kind] ?? 0) + amount\n}\n\n/**\n * The heroes of a player as records to carry on (see `heroRecord`): fallen ones too, as a campaign brings them back\n *\n * @beta\n */\nexport function carryOut(world: World, player: PlayerId): HeroRecord[] {\n\treturn heroesOf(world, player).map((hero) => heroRecord(world, hero))\n}\n\n/**\n * Brings carried heroes into a mission for a player. Each takes the place of the hero the map has for it: the one of\n * that player under the same name, else one of that player of the same type; a hero the map has none for is made at\n * `at`. The heroes, in the order of the records\n *\n * @beta\n */\nexport function carryIn(world: World, heroes: readonly HeroRecord[], player: PlayerId, at: Vec2): Entity[] {\n\tconst taken = new Set<Entity>()\n\treturn heroes.map((record) => {\n\t\tconst named = record.name !== undefined ? world.named(record.name) : undefined\n\t\tconst placed =\n\t\t\tnamed && named.owner === player && heroOf(named) && !taken.has(named)\n\t\t\t\t? named\n\t\t\t\t: heroesOf(world, player).find((hero) => hero.def.id === record.type && !taken.has(hero))\n\t\tconst hero = placed ?? heroFromRecord(world, record, player, at)\n\t\tif (placed) applyHeroRecord(world, placed, record)\n\t\ttaken.add(hero)\n\t\treturn hero\n\t})\n}\n"],"mappings":";;;;;;;;;;;;;;AAyDA,IAAa,kBAAkB;;;;;;AAO/B,SAAgB,oBAAgE,UAAkB,OAAoC;CACrI,OAAO;EAAE,QAAA;EAAyB;EAAU,IAAI;EAAO,MAAM,CAAC;EAAG,QAAQ,CAAC;EAAG,MAAM,CAAC;CAAE;AACvF;;;;;;AAOA,SAAgB,qBAAqB,MAAiC;CACrE,MAAM,OAAO;CACb,IAAI,OAAO,SAAS,YAAY,SAAS,MAAM,MAAM,IAAI,MAAM,oCAAoC;CACnG,IAAI,OAAO,KAAK,WAAW,YAAY,KAAK,SAAA,GAC3C,MAAM,IAAI,MAAM,+BAA+B,KAAK,OAAO,kCAAkC;CAC9F,IAAI,OAAO,KAAK,aAAa,YAAY,OAAO,KAAK,OAAO,UAC3D,MAAM,IAAI,MAAM,oEAAoE;CACrF,MAAM,OAAsC,CAAC;CAC7C,KAAK,MAAM,CAAC,SAAS,WAAW,OAAO,QAAQ,KAAK,QAAQ,CAAC,CAAC,GAAG;EAChE,MAAM,EAAE,SAAS,MAAM,aAAc,UAAU,CAAC;EAChD,IAAI,OAAO,YAAY,YAAY,CAAC,OAAO,SAAS,OAAO,GAAG,MAAM,IAAI,MAAM,YAAY,QAAQ,kBAAkB;EACpH,KAAK,WAAW;GAAE;GAAS,MAAM,OAAO,SAAS,WAAW,OAAO;GAAS,UAAU,OAAO,aAAa,WAAW,WAAW;EAAE;CACnI;CACA,OAAO;EACN,QAAA;EACA,UAAU,KAAK;EACf,IAAI,KAAK;EACT,GAAI,OAAO,KAAK,eAAe,YAAY,EAAE,YAAY,KAAK,WAAW;EACzE;EACA,SAAS,KAAK,UAAU,CAAC,EAAA,CAAG,IAAI,cAAc;EAC9C,MAAM,OAAO,KAAK,SAAS,YAAY,KAAK,SAAS,OAAO,KAAK,OAAO,CAAC;CAC1E;AACD;;;;;;;;AASA,SAAgB,WACf,UACA,SACA,SACA,QACA,MACA,MACsB;CACtB,MAAM,SAAS,SAAS,KAAK;CAC7B,OAAO;EACN,GAAG;EACH,IAAI,QAAQ,SAAS;EACrB,MAAM;GAAE,GAAG,SAAS;IAAO,UAAU;IAAE;IAAS,MAAM,SAAS,KAAK,IAAI,OAAO,MAAM,OAAO,IAAI;IAAS,UAAU,KAAK,IAAI;GAAE;EAAE;EAChI,QAAQ,gBAAgB,MAAM;EAC9B,MAAM,OAAO;GAAE,GAAG,SAAS;GAAM,GAAG,gBAAgB,IAAI;EAAE,IAAI,SAAS;CACxE;AACD;;;;;;;AA4BA,SAAgB,WAAW,OAAc,QAAkB,eAA0C,MAAoB;CAIxH,OAHc,CAAC,GAAG,MAAM,MAAM,QAAQ,MAAM,CAAC,CAAC,CAC5C,QAAQ,SAAS,KAAK,SAAS,KAAK,UAAU,CAAC,OAAO,IAAI,KAAK,OAAO,IAAI,CAAC,CAAC,CAC5E,MAAM,GAAG,MAAM,EAAE,KAAK,EAAE,EACnB,CAAA,CAAM,KAAK,SAAS;EAC1B,MAAM,OAAO,MAAM,OAAO,IAAI;EAC9B,MAAM,OAAO,KAAK,IAAI,SAAS;EAC/B,MAAM,QAAQ,QAAQ,IAAI;EAC1B,OAAO;GACN,MAAM,KAAK,IAAI;GACf,GAAI,SAAS,KAAA,KAAa,EAAE,KAAK;GACjC,QAAQ,KAAK,YAAY,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,SAAS,KAAK,WAAW,CAAC,GAAG,CAAC,IAAI;GACtF,GAAI,QAAQ,EAAE,WAAW,EAAE,GAAG,KAAK,EAAE;GACrC,GAAI,SAAS,EACZ,OAAO,MAAM,KAAK,SAAU,OAAO;IAAE,MAAM,KAAK;IAAM,SAAS,KAAK;IAAS,GAAI,KAAK,QAAQ,EAAE,MAAM,gBAAgB,KAAK,IAAI,EAAE;GAAG,IAAI,IAAK,EAC9I;EACD;CACD,CAAC;AACF;;;;;;;;AASA,SAAgB,WAAW,OAAc,QAAkB,SAAgC,IAAU,SAAS,KAAe;CAC5H,MAAM,OAAiB,CAAC;CAExB,QADqB,QAAQ,WAAW,MAAM,SAAS,MAAM,IAAI,OAAO,IAAI,CAC5E,CAAA,CAAK,SAAS,QAAQ,MAAM;EAC3B,MAAM,QAAQ,UAAU,IAAI,GAAG,MAAM;EACrC,MAAM,OAAO,MAAM,MAAM,OAAO,MAAM,QAAQ,OAAO,OAAO,SAAS,KAAA,IAAY,EAAE,MAAM,OAAO,KAAK,IAAI,CAAC,CAAC;EAC3G,IAAI,OAAO,WAAW;GACrB,KAAK,IAAI,WAAW,EAAE,GAAG,OAAO,UAAU,CAAC;GAC3C,cAAc,OAAO,IAAI;EAC1B;EACA,MAAM,QAAQ,QAAQ,IAAI;EAC1B,IAAI,SAAS,OAAO,OAAO;GAC1B,MAAM,KAAK,IAAI;GACf,OAAO,MAAM,SAAS,SAAS,SAAS;IACvC,IAAI,CAAC,WAAW,QAAQ,MAAM,UAAU,CAAC,MAAM,SAAS,MAAM,IAAI,QAAQ,IAAI,GAAG;IACjF,MAAM,WAAW,WAAW,OAAO,QAAQ,MAAM,QAAQ,OAAO;IAChE,IAAI,QAAQ,MAAM,SAAS,OAAO,gBAAgB,QAAQ,IAAI;IAC9D,MAAM,QAAQ;GACf,CAAC;GACD,MAAM,OAAO,KAAK,kBAAkB,EAAE,QAAQ,KAAK,CAAC;EACrD;EACA,KAAK,SAAS,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,YAAY,KAAK,IAAI,KAAK,IAAI,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;EAC9F,KAAK,KAAK,IAAI;CACf,CAAC;CACD,OAAO;AACR;;AAGA,SAAS,UAAU,IAAU,OAAe,QAAsB;CACjE,IAAI,UAAU,GAAG,OAAO;EAAE,GAAG,GAAG;EAAG,GAAG,GAAG;CAAE;CAC3C,IAAI,OAAO;CACX,IAAI,QAAQ;CACZ,OAAO,SAAS,QAAQ,OAAO,GAAG;EACjC,SAAS,OAAO;EAChB;CACD;CACA,MAAM,SAAU,QAAQ,UAAU,OAAO,KAAM,KAAK,KAAK;CACzD,OAAO;EAAE,GAAG,GAAG,IAAI,IAAI,KAAK,IAAI,OAAO;EAAQ,GAAG,GAAG,IAAI,IAAI,KAAK,IAAI,OAAO;CAAO;AACrF;;;;;;AAOA,SAAgB,cAAc,OAAc,QAA0C;CACrF,OAAO,OAAO,YAAY,CAAC,GAAG,MAAM,OAAO,MAAM,CAAC,CAAC,QAAQ,CAAC,CAAC,QAAQ,GAAG,WAAW,QAAQ,CAAC,CAAC;AAC9F;;;;;;;;AASA,SAAgB,aAAa,OAAc,QAAkB,UAAkD;CAC9G,MAAM,MAAM,MAAM,OAAO,MAAM;CAC/B,KAAK,MAAM,CAAC,SAAS,YAAY,OAAO,QAAQ,QAAQ,GAAG;EAC1D,IAAI,CAAC,MAAM,SAAS,SAAS,IAAI,OAAO,GAAG;EAC3C,MAAM,MAAM,MAAM,SAAS,QAAQ,OAAO;EAC1C,MAAM,KAAK,KAAK,IAAI,KAAK,IAAI,KAAK,MAAM,OAAO,GAAG,CAAC,GAAG,IAAI,YAAY,CAAC;EACvE,KAAK,IAAI,SAAS,IAAI,SAAS,IAAI,OAAO,KAAK,KAAK,GAAG,SAAS,IAAI,SAAS;GAC5E,IAAI,WAAW,SAAS,KAAK;GAC7B,IAAI,IAAI,OAAY;SAAA,MAAM,UAAU,CAAC,GAAG,MAAM,MAAM,QAAQ,MAAM,CAAC,GAAG,IAAI,OAAO,OAAO,IAAI,MAAM,OAAO,QAAQ,KAAK;GAAA;EACvH;EACA,IAAI,YAAY,OAAO,OAAO;CAC/B;AACD;;;;;;AAOA,SAAgB,eAAe,OAAc,QAAkB,OAAkC;CAChG,MAAM,YAAY,MAAM,OAAO,MAAM,CAAC,CAAC;CACvC,OAAO,OAAO,YAAY,OAAO,QAAQ,SAAS,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,SAAS,MAAM,SAAS,IAAI,CAAC,CAAC;AACvG;;;;;;;AAQA,SAAgB,cAAc,OAAc,QAAkB,WAAkC;CAC/F,MAAM,QAAQ,MAAM,OAAO,MAAM,CAAC,CAAC;CACnC,MAAM,QAAQ,IAAI,IAAI,MAAM,SAAS,UAAU,KAAK,aAAa,SAAS,EAAE,CAAC;CAC7E,KAAK,MAAM,CAAC,MAAM,WAAW,OAAO,QAAQ,SAAS,GAAG,IAAI,MAAM,IAAI,IAAI,KAAK,OAAO,SAAS,MAAM,GAAG,MAAM,SAAS,MAAM,SAAS,KAAK;AAC5I;;;;;;AAOA,SAAgB,SAAS,OAAc,QAAgC;CACtE,OAAO,SAAS,OAAO,MAAM,CAAC,CAAC,KAAK,SAAS,WAAW,OAAO,IAAI,CAAC;AACrE;;;;;;;;AASA,SAAgB,QAAQ,OAAc,QAA+B,QAAkB,IAAoB;CAC1G,MAAM,wBAAQ,IAAI,IAAY;CAC9B,OAAO,OAAO,KAAK,WAAW;EAC7B,MAAM,QAAQ,OAAO,SAAS,KAAA,IAAY,MAAM,MAAM,OAAO,IAAI,IAAI,KAAA;EACrE,MAAM,SACL,SAAS,MAAM,UAAU,UAAU,OAAO,KAAK,KAAK,CAAC,MAAM,IAAI,KAAK,IACjE,QACA,SAAS,OAAO,MAAM,CAAC,CAAC,MAAM,SAAS,KAAK,IAAI,OAAO,OAAO,QAAQ,CAAC,MAAM,IAAI,IAAI,CAAC;EAC1F,MAAM,OAAO,UAAU,eAAe,OAAO,QAAQ,QAAQ,EAAE;EAC/D,IAAI,QAAQ,gBAAgB,OAAO,QAAQ,MAAM;EACjD,MAAM,IAAI,IAAI;EACd,OAAO;CACR,CAAC;AACF"}
@@ -7,8 +7,11 @@ import type { SpawnOptions, World } from '#engine/world';
7
7
  * @beta
8
8
  */
9
9
  export interface HeroItem {
10
+ /** The id of the item type carried */
10
11
  item: string;
12
+ /** Uses left of the item */
11
13
  charges: number;
14
+ /** The game's own state of the item, carried over as plain data */
12
15
  data?: Record<string, unknown>;
13
16
  }
14
17
  /**
@@ -23,8 +26,11 @@ export interface HeroRecord {
23
26
  type: string;
24
27
  /** The name it was known by in the rules (`world.named`), when it had one */
25
28
  name?: string;
29
+ /** The hero's level */
26
30
  level: number;
31
+ /** The hero's experience points */
27
32
  xp: number;
33
+ /** Skill points the hero has earned and not yet spent */
28
34
  points: number;
29
35
  /** Learned abilities and their level. Ones not learned are left out */
30
36
  abilities: Record<string, number>;