@v12-engine/engine 0.1.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (951) hide show
  1. package/dist/abilities/amounts.d.ts +28 -0
  2. package/dist/abilities/amounts.js +74 -0
  3. package/dist/abilities/amounts.js.map +1 -0
  4. package/dist/abilities/buffs.d.ts +106 -6
  5. package/dist/abilities/buffs.js +443 -0
  6. package/dist/abilities/buffs.js.map +1 -0
  7. package/dist/abilities/castTold.d.ts +2 -0
  8. package/dist/abilities/castTold.js +66 -0
  9. package/dist/abilities/castTold.js.map +1 -0
  10. package/dist/abilities/chance.d.ts +38 -0
  11. package/dist/abilities/chance.js +77 -0
  12. package/dist/abilities/chance.js.map +1 -0
  13. package/dist/abilities/charges.d.ts +18 -0
  14. package/dist/abilities/charges.js +101 -0
  15. package/dist/abilities/charges.js.map +1 -0
  16. package/dist/abilities/control.d.ts +28 -0
  17. package/dist/abilities/control.js +113 -0
  18. package/dist/abilities/control.js.map +1 -0
  19. package/dist/abilities/dispel.js +51 -0
  20. package/dist/abilities/dispel.js.map +1 -0
  21. package/dist/abilities/effectFields.d.ts +1 -1
  22. package/dist/abilities/effectFields.js +676 -0
  23. package/dist/abilities/effectFields.js.map +1 -0
  24. package/dist/abilities/effectIndex.d.ts +27 -0
  25. package/dist/abilities/effectIndex.js +64 -0
  26. package/dist/abilities/effectIndex.js.map +1 -0
  27. package/dist/abilities/effects/buff.d.ts +9 -3
  28. package/dist/abilities/effects/buff.js +84 -0
  29. package/dist/abilities/effects/buff.js.map +1 -0
  30. package/dist/abilities/effects/conditions.d.ts +2 -0
  31. package/dist/abilities/effects/conditions.js +41 -0
  32. package/dist/abilities/effects/conditions.js.map +1 -0
  33. package/dist/abilities/effects/core.js +54 -0
  34. package/dist/abilities/effects/core.js.map +1 -0
  35. package/dist/abilities/effects/damage.d.ts +1 -1
  36. package/dist/abilities/effects/damage.js +43 -0
  37. package/dist/abilities/effects/damage.js.map +1 -0
  38. package/dist/abilities/effects/heal.d.ts +2 -2
  39. package/dist/abilities/effects/heal.js +51 -0
  40. package/dist/abilities/effects/heal.js.map +1 -0
  41. package/dist/abilities/effects/missile.d.ts +13 -1
  42. package/dist/abilities/effects/missile.js +104 -0
  43. package/dist/abilities/effects/missile.js.map +1 -0
  44. package/dist/abilities/effects/morph.d.ts +5 -0
  45. package/dist/abilities/effects/morph.js +43 -0
  46. package/dist/abilities/effects/morph.js.map +1 -0
  47. package/dist/abilities/effects/moves.d.ts +16 -4
  48. package/dist/abilities/effects/moves.js +212 -0
  49. package/dist/abilities/effects/moves.js.map +1 -0
  50. package/dist/abilities/effects/passives.d.ts +19 -9
  51. package/dist/abilities/effects/passives.js +131 -0
  52. package/dist/abilities/effects/passives.js.map +1 -0
  53. package/dist/abilities/effects/proxy.d.ts +5 -0
  54. package/dist/abilities/effects/proxy.js +60 -0
  55. package/dist/abilities/effects/proxy.js.map +1 -0
  56. package/dist/abilities/effects/sight.d.ts +2 -2
  57. package/dist/abilities/effects/sight.js +39 -0
  58. package/dist/abilities/effects/sight.js.map +1 -0
  59. package/dist/abilities/effects/spawn.d.ts +5 -2
  60. package/dist/abilities/effects/spawn.js +40 -0
  61. package/dist/abilities/effects/spawn.js.map +1 -0
  62. package/dist/abilities/effects/timed.d.ts +2 -2
  63. package/dist/abilities/effects/timed.js +96 -0
  64. package/dist/abilities/effects/timed.js.map +1 -0
  65. package/dist/abilities/effects/trade.d.ts +1 -1
  66. package/dist/abilities/effects/trade.js +25 -0
  67. package/dist/abilities/effects/trade.js.map +1 -0
  68. package/dist/abilities/effects.d.ts +97 -23
  69. package/dist/abilities/effects.js +860 -0
  70. package/dist/abilities/effects.js.map +1 -0
  71. package/dist/abilities/land.d.ts +38 -4
  72. package/dist/abilities/land.js +189 -0
  73. package/dist/abilities/land.js.map +1 -0
  74. package/dist/abilities/recast.d.ts +45 -0
  75. package/dist/abilities/recast.js +118 -0
  76. package/dist/abilities/recast.js.map +1 -0
  77. package/dist/abilities/scaled.js +40 -0
  78. package/dist/abilities/scaled.js.map +1 -0
  79. package/dist/abilities/screen.d.ts +6 -0
  80. package/dist/abilities/screen.js +83 -0
  81. package/dist/abilities/screen.js.map +1 -0
  82. package/dist/abilities/shapes.d.ts +66 -0
  83. package/dist/abilities/shapes.js +122 -0
  84. package/dist/abilities/shapes.js.map +1 -0
  85. package/dist/abilities/text.d.ts +14 -2
  86. package/dist/abilities/text.js +204 -0
  87. package/dist/abilities/text.js.map +1 -0
  88. package/dist/abilities/triggers.d.ts +98 -0
  89. package/dist/abilities/triggers.js +351 -0
  90. package/dist/abilities/triggers.js.map +1 -0
  91. package/dist/abilityChanges.d.ts +131 -0
  92. package/dist/abilityChanges.js +345 -0
  93. package/dist/abilityChanges.js.map +1 -0
  94. package/dist/ai/area.d.ts +4 -1
  95. package/dist/ai/brain.d.ts +4 -1
  96. package/dist/ai/brain.js +844 -0
  97. package/dist/ai/brain.js.map +1 -0
  98. package/dist/ai/budget.js +74 -0
  99. package/dist/ai/budget.js.map +1 -0
  100. package/dist/ai/checks.d.ts +9 -1
  101. package/dist/ai/checks.js +242 -0
  102. package/dist/ai/checks.js.map +1 -0
  103. package/dist/ai/computer.d.ts +11 -4
  104. package/dist/ai/computer.js +251 -0
  105. package/dist/ai/computer.js.map +1 -0
  106. package/dist/ai/defence.d.ts +4 -0
  107. package/dist/ai/defence.js +430 -0
  108. package/dist/ai/defence.js.map +1 -0
  109. package/dist/ai/define.d.ts +3 -2
  110. package/dist/ai/define.js +31 -0
  111. package/dist/ai/define.js.map +1 -0
  112. package/dist/ai/economy.d.ts +10 -7
  113. package/dist/ai/economy.js +780 -0
  114. package/dist/ai/economy.js.map +1 -0
  115. package/dist/ai/geometry.js +38 -0
  116. package/dist/ai/geometry.js.map +1 -0
  117. package/dist/ai/goals.d.ts +1 -0
  118. package/dist/ai/goals.js +560 -0
  119. package/dist/ai/goals.js.map +1 -0
  120. package/dist/ai/knowledge.d.ts +72 -7
  121. package/dist/ai/knowledge.js +804 -0
  122. package/dist/ai/knowledge.js.map +1 -0
  123. package/dist/ai/lanes.d.ts +10 -2
  124. package/dist/ai/lanes.js +715 -0
  125. package/dist/ai/lanes.js.map +1 -0
  126. package/dist/ai/melee/build.js +264 -0
  127. package/dist/ai/melee/build.js.map +1 -0
  128. package/dist/ai/melee/goals.d.ts +7 -0
  129. package/dist/ai/melee/goals.js +720 -0
  130. package/dist/ai/melee/goals.js.map +1 -0
  131. package/dist/ai/melee/heroes.js +68 -0
  132. package/dist/ai/melee/heroes.js.map +1 -0
  133. package/dist/ai/melee/index.d.ts +1 -1
  134. package/dist/ai/melee/index.js +51 -0
  135. package/dist/ai/melee/index.js.map +1 -0
  136. package/dist/ai/melee/production.js +29 -0
  137. package/dist/ai/melee/production.js.map +1 -0
  138. package/dist/ai/melee/surrender.js +64 -0
  139. package/dist/ai/melee/surrender.js.map +1 -0
  140. package/dist/ai/micro.d.ts +9 -0
  141. package/dist/ai/micro.js +1316 -0
  142. package/dist/ai/micro.js.map +1 -0
  143. package/dist/ai/mission.d.ts +9 -2
  144. package/dist/ai/mission.js +538 -0
  145. package/dist/ai/mission.js.map +1 -0
  146. package/dist/ai/missionRules.d.ts +1 -1
  147. package/dist/ai/missionRules.js +26 -0
  148. package/dist/ai/missionRules.js.map +1 -0
  149. package/dist/ai/module.d.ts +6 -2
  150. package/dist/ai/module.js +37 -0
  151. package/dist/ai/module.js.map +1 -0
  152. package/dist/ai/options.d.ts +3 -3
  153. package/dist/ai/plans/build.d.ts +20 -1
  154. package/dist/ai/plans/build.js +608 -0
  155. package/dist/ai/plans/build.js.map +1 -0
  156. package/dist/ai/plans/placement.d.ts +4 -1
  157. package/dist/ai/plans/placement.js +295 -0
  158. package/dist/ai/plans/placement.js.map +1 -0
  159. package/dist/ai/plans/plans.d.ts +9 -0
  160. package/dist/ai/plans/plans.js +110 -0
  161. package/dist/ai/plans/plans.js.map +1 -0
  162. package/dist/ai/plans/production.d.ts +14 -2
  163. package/dist/ai/plans/production.js +434 -0
  164. package/dist/ai/plans/production.js.map +1 -0
  165. package/dist/ai/plans/purse.d.ts +6 -3
  166. package/dist/ai/plans/purse.js +139 -0
  167. package/dist/ai/plans/purse.js.map +1 -0
  168. package/dist/ai/plans/tech.d.ts +6 -0
  169. package/dist/ai/plans/tech.js +122 -0
  170. package/dist/ai/plans/tech.js.map +1 -0
  171. package/dist/ai/profiles.d.ts +4 -4
  172. package/dist/{profiles-B3NS9jwk.js → ai/profiles.js} +3 -98
  173. package/dist/ai/profiles.js.map +1 -0
  174. package/dist/ai/reach.js +54 -0
  175. package/dist/ai/reach.js.map +1 -0
  176. package/dist/ai/report.d.ts +8 -0
  177. package/dist/ai/report.js +87 -0
  178. package/dist/ai/report.js.map +1 -0
  179. package/dist/ai/roles.d.ts +4 -0
  180. package/dist/ai/roles.js +207 -0
  181. package/dist/ai/roles.js.map +1 -0
  182. package/dist/ai/rules.d.ts +8 -2
  183. package/dist/ai/rules.js +416 -0
  184. package/dist/ai/rules.js.map +1 -0
  185. package/dist/ai/scouting.d.ts +6 -0
  186. package/dist/ai/scouting.js +324 -0
  187. package/dist/ai/scouting.js.map +1 -0
  188. package/dist/ai/settings.js +99 -0
  189. package/dist/ai/settings.js.map +1 -0
  190. package/dist/ai/squads.d.ts +21 -2
  191. package/dist/ai/squads.js +916 -0
  192. package/dist/ai/squads.js.map +1 -0
  193. package/dist/ai/strength.js +320 -0
  194. package/dist/ai/strength.js.map +1 -0
  195. package/dist/ai/task.d.ts +3 -1
  196. package/dist/ai/task.js +17 -0
  197. package/dist/ai/task.js.map +1 -0
  198. package/dist/ai/tasks/attack.js +24 -0
  199. package/dist/ai/tasks/attack.js.map +1 -0
  200. package/dist/ai/tasks/capture.d.ts +3 -3
  201. package/dist/ai/tasks/capture.js +37 -0
  202. package/dist/ai/tasks/capture.js.map +1 -0
  203. package/dist/ai/tasks/creep.js +29 -0
  204. package/dist/ai/tasks/creep.js.map +1 -0
  205. package/dist/ai/tasks/defend.js +61 -0
  206. package/dist/ai/tasks/defend.js.map +1 -0
  207. package/dist/ai/tasks/drop.js +81 -0
  208. package/dist/ai/tasks/drop.js.map +1 -0
  209. package/dist/ai/tasks/escort.js +59 -0
  210. package/dist/ai/tasks/escort.js.map +1 -0
  211. package/dist/ai/tasks/gather.js +48 -0
  212. package/dist/ai/tasks/gather.js.map +1 -0
  213. package/dist/ai/tasks/harass.js +39 -0
  214. package/dist/ai/tasks/harass.js.map +1 -0
  215. package/dist/ai/tasks/hold.js +32 -0
  216. package/dist/ai/tasks/hold.js.map +1 -0
  217. package/dist/ai/tasks/index.js +34 -0
  218. package/dist/ai/tasks/index.js.map +1 -0
  219. package/dist/ai/tasks/move.js +26 -0
  220. package/dist/ai/tasks/move.js.map +1 -0
  221. package/dist/ai/tasks/patrol.js +59 -0
  222. package/dist/ai/tasks/patrol.js.map +1 -0
  223. package/dist/ai/tasks/retreat.js +28 -0
  224. package/dist/ai/tasks/retreat.js.map +1 -0
  225. package/dist/ai/tasks/scout.js +73 -0
  226. package/dist/ai/tasks/scout.js.map +1 -0
  227. package/dist/ai/tasks/shared.d.ts +1 -1
  228. package/dist/ai/tasks/shared.js +137 -0
  229. package/dist/ai/tasks/shared.js.map +1 -0
  230. package/dist/ai/team.d.ts +18 -1
  231. package/dist/ai/team.js +492 -0
  232. package/dist/ai/team.js.map +1 -0
  233. package/dist/ai/threat.d.ts +6 -0
  234. package/dist/ai/threat.js +206 -0
  235. package/dist/ai/threat.js.map +1 -0
  236. package/dist/ai/view.d.ts +21 -7
  237. package/dist/ai/view.js +677 -0
  238. package/dist/ai/view.js.map +1 -0
  239. package/dist/ai/waves.d.ts +6 -0
  240. package/dist/ai/waves.js +410 -0
  241. package/dist/ai/waves.js.map +1 -0
  242. package/dist/ai.js +54 -6239
  243. package/dist/aiTesting.d.ts +6 -3
  244. package/dist/aiTesting.js +229 -0
  245. package/dist/aiTesting.js.map +1 -0
  246. package/dist/areas.d.ts +4 -1
  247. package/dist/areas.js +295 -0
  248. package/dist/areas.js.map +1 -0
  249. package/dist/attacks.d.ts +3 -3
  250. package/dist/attacks.js +127 -0
  251. package/dist/attacks.js.map +1 -0
  252. package/dist/burning.d.ts +267 -0
  253. package/dist/burning.js +795 -0
  254. package/dist/burning.js.map +1 -0
  255. package/dist/bytes.js +21 -0
  256. package/dist/bytes.js.map +1 -0
  257. package/dist/callings.d.ts +71 -0
  258. package/dist/callings.js +157 -0
  259. package/dist/callings.js.map +1 -0
  260. package/dist/cameraOrders.d.ts +78 -0
  261. package/dist/cameraOrders.js +114 -0
  262. package/dist/cameraOrders.js.map +1 -0
  263. package/dist/camps.d.ts +70 -4
  264. package/dist/camps.js +501 -0
  265. package/dist/camps.js.map +1 -0
  266. package/dist/capture.d.ts +15 -3
  267. package/dist/capture.js +304 -0
  268. package/dist/capture.js.map +1 -0
  269. package/dist/cellLayers.d.ts +78 -13
  270. package/dist/cellLayers.js +275 -0
  271. package/dist/cellLayers.js.map +1 -0
  272. package/dist/cellPatches.d.ts +24 -0
  273. package/dist/cellPatches.js +73 -0
  274. package/dist/cellPatches.js.map +1 -0
  275. package/dist/cinematics.d.ts +10 -5
  276. package/dist/cinematics.js +161 -0
  277. package/dist/cinematics.js.map +1 -0
  278. package/dist/clock.d.ts +2 -2
  279. package/dist/clock.js +78 -0
  280. package/dist/clock.js.map +1 -0
  281. package/dist/commands.d.ts +36 -4
  282. package/dist/commands.js +636 -0
  283. package/dist/commands.js.map +1 -0
  284. package/dist/components.d.ts +31 -10
  285. package/dist/components.js +74 -0
  286. package/dist/components.js.map +1 -0
  287. package/dist/computers.d.ts +4 -4
  288. package/dist/computers.js +194 -0
  289. package/dist/computers.js.map +1 -0
  290. package/dist/concealment.d.ts +25 -2
  291. package/dist/concealment.js +409 -0
  292. package/dist/concealment.js.map +1 -0
  293. package/dist/coreComponents.js +130 -0
  294. package/dist/coreComponents.js.map +1 -0
  295. package/dist/createGame.d.ts +306 -0
  296. package/dist/createGame.js +405 -0
  297. package/dist/createGame.js.map +1 -0
  298. package/dist/dashing.d.ts +18 -2
  299. package/dist/dashing.js +41 -0
  300. package/dist/dashing.js.map +1 -0
  301. package/dist/debug.d.ts +8 -0
  302. package/dist/debug.js +5 -3
  303. package/dist/debug2.js +76 -0
  304. package/dist/debug2.js.map +1 -0
  305. package/dist/debugCommands.d.ts +6 -6
  306. package/dist/debugCommands.js +537 -0
  307. package/dist/debugCommands.js.map +1 -0
  308. package/dist/debugging.d.ts +1 -0
  309. package/dist/defaultSets.d.ts +183 -0
  310. package/dist/defaultSets.js +216 -0
  311. package/dist/defaultSets.js.map +1 -0
  312. package/dist/definitions.d.ts +6 -0
  313. package/dist/definitions.js +78 -0
  314. package/dist/definitions.js.map +1 -0
  315. package/dist/defs.d.ts +1895 -165
  316. package/dist/defs.js +380 -0
  317. package/dist/defs.js.map +1 -0
  318. package/dist/denying.d.ts +4 -4
  319. package/dist/denying.js +106 -0
  320. package/dist/denying.js.map +1 -0
  321. package/dist/destructibles.d.ts +2 -2
  322. package/dist/destructibles.js +36 -0
  323. package/dist/destructibles.js.map +1 -0
  324. package/dist/determinism.d.ts +4 -4
  325. package/dist/determinism.js +247 -0
  326. package/dist/determinism.js.map +1 -0
  327. package/dist/dialog.d.ts +17 -2
  328. package/dist/dialog.js +108 -0
  329. package/dist/dialog.js.map +1 -0
  330. package/dist/effectRefs.js +28 -0
  331. package/dist/effectRefs.js.map +1 -0
  332. package/dist/effects.d.ts +27 -11
  333. package/dist/effects.js +110 -0
  334. package/dist/effects.js.map +1 -0
  335. package/dist/endings.d.ts +1 -1
  336. package/dist/endings.js +78 -0
  337. package/dist/endings.js.map +1 -0
  338. package/dist/engagement.d.ts +40 -6
  339. package/dist/engagement.js +530 -0
  340. package/dist/engagement.js.map +1 -0
  341. package/dist/engineEvents.d.ts +72 -9
  342. package/dist/engineEvents.js +520 -0
  343. package/dist/engineEvents.js.map +1 -0
  344. package/dist/entity.d.ts +275 -26
  345. package/dist/entity.js +441 -0
  346. package/dist/entity.js.map +1 -0
  347. package/dist/entityIndex.d.ts +10 -3
  348. package/dist/entityIndex.js +149 -0
  349. package/dist/entityIndex.js.map +1 -0
  350. package/dist/errors.d.ts +6 -2
  351. package/dist/errors.js +59 -0
  352. package/dist/errors.js.map +1 -0
  353. package/dist/events.d.ts +11 -5
  354. package/dist/events.js +158 -0
  355. package/dist/events.js.map +1 -0
  356. package/dist/exactMath.js +273 -0
  357. package/dist/exactMath.js.map +1 -0
  358. package/dist/features.d.ts +1 -1
  359. package/dist/features.js +127 -0
  360. package/dist/features.js.map +1 -0
  361. package/dist/fields.d.ts +25 -5
  362. package/dist/fields.js +140 -0
  363. package/dist/fields.js.map +1 -0
  364. package/dist/fixture.d.ts +3 -3
  365. package/dist/fixture.js +512 -0
  366. package/dist/fixture.js.map +1 -0
  367. package/dist/fog.d.ts +26 -3
  368. package/dist/fog.js +333 -0
  369. package/dist/fog.js.map +1 -0
  370. package/dist/foliage.d.ts +476 -0
  371. package/dist/foliage.js +1478 -0
  372. package/dist/foliage.js.map +1 -0
  373. package/dist/foliageDebug.d.ts +57 -0
  374. package/dist/foliageDebug.js +172 -0
  375. package/dist/foliageDebug.js.map +1 -0
  376. package/dist/foliageRegrowth.d.ts +20 -0
  377. package/dist/foliageRegrowth.js +332 -0
  378. package/dist/foliageRegrowth.js.map +1 -0
  379. package/dist/formState.d.ts +67 -0
  380. package/dist/formState.js +65 -0
  381. package/dist/formState.js.map +1 -0
  382. package/dist/formation.d.ts +46 -8
  383. package/dist/formation.js +297 -0
  384. package/dist/formation.js.map +1 -0
  385. package/dist/forms.d.ts +58 -0
  386. package/dist/forms.js +146 -0
  387. package/dist/forms.js.map +1 -0
  388. package/dist/friendlyFire.d.ts +2 -2
  389. package/dist/friendlyFire.js +37 -0
  390. package/dist/friendlyFire.js.map +1 -0
  391. package/dist/game.d.ts +141 -48
  392. package/dist/game.js +834 -0
  393. package/dist/game.js.map +1 -0
  394. package/dist/gameData.d.ts +96 -22
  395. package/dist/gameData.js +1690 -0
  396. package/dist/gameData.js.map +1 -0
  397. package/dist/gameFiles.d.ts +3 -3
  398. package/dist/gameFiles.js +14 -0
  399. package/dist/gameFiles.js.map +1 -0
  400. package/dist/gates.js +92 -0
  401. package/dist/gates.js.map +1 -0
  402. package/dist/generate.d.ts +28 -1
  403. package/dist/generate.js +1062 -0
  404. package/dist/generate.js.map +1 -0
  405. package/dist/generateWorker.d.ts +7 -3
  406. package/dist/generateWorker.js +86 -0
  407. package/dist/generateWorker.js.map +1 -0
  408. package/dist/grid.d.ts +9 -0
  409. package/dist/grid.js +102 -0
  410. package/dist/grid.js.map +1 -0
  411. package/dist/ground.d.ts +17 -1
  412. package/dist/ground.js +375 -0
  413. package/dist/ground.js.map +1 -0
  414. package/dist/groundObjects.d.ts +70 -0
  415. package/dist/groundObjects.js +371 -0
  416. package/dist/groundObjects.js.map +1 -0
  417. package/dist/groundSpeed.d.ts +20 -3
  418. package/dist/groundSpeed.js +117 -0
  419. package/dist/groundSpeed.js.map +1 -0
  420. package/dist/hero.d.ts +126 -10
  421. package/dist/hero.js +432 -0
  422. package/dist/hero.js.map +1 -0
  423. package/dist/holds.d.ts +94 -0
  424. package/dist/holds.js +305 -0
  425. package/dist/holds.js.map +1 -0
  426. package/dist/home.d.ts +1 -1
  427. package/dist/home.js +30 -0
  428. package/dist/home.js.map +1 -0
  429. package/dist/hooks.d.ts +339 -57
  430. package/dist/hooks.js +105 -0
  431. package/dist/hooks.js.map +1 -0
  432. package/dist/hotReload.d.ts +6 -5
  433. package/dist/hotReload.js +145 -0
  434. package/dist/hotReload.js.map +1 -0
  435. package/dist/ids.d.ts +3 -3
  436. package/dist/ids.js +30 -0
  437. package/dist/ids.js.map +1 -0
  438. package/dist/idsFile.d.ts +36 -0
  439. package/dist/idsFile.js +134 -0
  440. package/dist/idsFile.js.map +1 -0
  441. package/dist/index.d.ts +105 -68
  442. package/dist/index.js +194 -4701
  443. package/dist/inspect.d.ts +29 -2
  444. package/dist/{inspect-D9dWHmZ0.js → inspect.js} +21 -12
  445. package/dist/inspect.js.map +1 -0
  446. package/dist/inventory.d.ts +14 -1
  447. package/dist/inventory.js +84 -0
  448. package/dist/inventory.js.map +1 -0
  449. package/dist/items.d.ts +136 -8
  450. package/dist/items.js +585 -0
  451. package/dist/items.js.map +1 -0
  452. package/dist/lanes.d.ts +12 -3
  453. package/dist/lanes.js +496 -0
  454. package/dist/lanes.js.map +1 -0
  455. package/dist/life.d.ts +6 -2
  456. package/dist/life.js +287 -0
  457. package/dist/life.js.map +1 -0
  458. package/dist/log.d.ts +26 -3
  459. package/dist/log.js +192 -0
  460. package/dist/log.js.map +1 -0
  461. package/dist/manaBurn.d.ts +2 -2
  462. package/dist/manaBurn.js +75 -0
  463. package/dist/manaBurn.js.map +1 -0
  464. package/dist/map/file.d.ts +56 -3
  465. package/dist/map/file.js +264 -0
  466. package/dist/map/file.js.map +1 -0
  467. package/dist/map/images.js +61 -0
  468. package/dist/map/images.js.map +1 -0
  469. package/dist/map/look.d.ts +1 -1
  470. package/dist/map/look.js +30 -0
  471. package/dist/map/look.js.map +1 -0
  472. package/dist/map/pathProfile.js +183 -0
  473. package/dist/map/pathProfile.js.map +1 -0
  474. package/dist/map/resize.d.ts +4 -0
  475. package/dist/map/resize.js +136 -0
  476. package/dist/map/resize.js.map +1 -0
  477. package/dist/map/schema.js +257 -0
  478. package/dist/map/schema.js.map +1 -0
  479. package/dist/map/terrain.js +214 -0
  480. package/dist/map/terrain.js.map +1 -0
  481. package/dist/map/types.d.ts +92 -13
  482. package/dist/map/types.js +251 -0
  483. package/dist/map/types.js.map +1 -0
  484. package/dist/mapCheck/cells.js +94 -0
  485. package/dist/mapCheck/cells.js.map +1 -0
  486. package/dist/mapCheck/rules/foliage.d.ts +9 -0
  487. package/dist/mapCheck/rules/foliage.js +83 -0
  488. package/dist/mapCheck/rules/foliage.js.map +1 -0
  489. package/dist/mapCheck/rules/names.js +39 -0
  490. package/dist/mapCheck/rules/names.js.map +1 -0
  491. package/dist/mapCheck/rules/objects.d.ts +1 -1
  492. package/dist/mapCheck/rules/objects.js +56 -0
  493. package/dist/mapCheck/rules/objects.js.map +1 -0
  494. package/dist/mapCheck/rules/paths.js +32 -0
  495. package/dist/mapCheck/rules/paths.js.map +1 -0
  496. package/dist/mapCheck/rules/players.js +20 -0
  497. package/dist/mapCheck/rules/players.js.map +1 -0
  498. package/dist/mapCheck/rules/races.js +56 -0
  499. package/dist/mapCheck/rules/races.js.map +1 -0
  500. package/dist/mapCheck/rules/random.js +47 -0
  501. package/dist/mapCheck/rules/random.js.map +1 -0
  502. package/dist/mapCheck/rules/regions.js +30 -0
  503. package/dist/mapCheck/rules/regions.js.map +1 -0
  504. package/dist/mapCheck/rules/targets.js +31 -0
  505. package/dist/mapCheck/rules/targets.js.map +1 -0
  506. package/dist/mapCheck/rules/walking.js +45 -0
  507. package/dist/mapCheck/rules/walking.js.map +1 -0
  508. package/dist/mapCheck.d.ts +2 -2
  509. package/dist/mapCheck.js +63 -0
  510. package/dist/mapCheck.js.map +1 -0
  511. package/dist/mapFields.d.ts +25 -2
  512. package/dist/mapFields.js +134 -0
  513. package/dist/mapFields.js.map +1 -0
  514. package/dist/mapFile.js +176 -0
  515. package/dist/mapFile.js.map +1 -0
  516. package/dist/mapMeasure.d.ts +8 -0
  517. package/dist/mapMeasure.js +283 -0
  518. package/dist/mapMeasure.js.map +1 -0
  519. package/dist/mapMerge.d.ts +1 -0
  520. package/dist/mapMerge.js +172 -0
  521. package/dist/mapMerge.js.map +1 -0
  522. package/dist/mapObjectives.js +138 -0
  523. package/dist/mapObjectives.js.map +1 -0
  524. package/dist/mapObjects.js +80 -0
  525. package/dist/mapObjects.js.map +1 -0
  526. package/dist/math.d.ts +37 -7
  527. package/dist/math.js +155 -0
  528. package/dist/math.js.map +1 -0
  529. package/dist/messages.d.ts +71 -4
  530. package/dist/messages.js +29 -0
  531. package/dist/messages.js.map +1 -0
  532. package/dist/missionRules.d.ts +10 -2
  533. package/dist/{missionRules-C-bGxm0Q.js → missionRules.js} +30 -150
  534. package/dist/missionRules.js.map +1 -0
  535. package/dist/mods.d.ts +39 -20
  536. package/dist/mods.js +271 -0
  537. package/dist/mods.js.map +1 -0
  538. package/dist/moves.d.ts +87 -0
  539. package/dist/moves.js +539 -0
  540. package/dist/moves.js.map +1 -0
  541. package/dist/names.d.ts +7 -0
  542. package/dist/names.js +122 -0
  543. package/dist/names.js.map +1 -0
  544. package/dist/navigation/agentParams.js +14 -0
  545. package/dist/navigation/agentParams.js.map +1 -0
  546. package/dist/navigation/air.d.ts +7 -3
  547. package/dist/navigation/air.js +401 -0
  548. package/dist/navigation/air.js.map +1 -0
  549. package/dist/navigation/builds.d.ts +34 -2
  550. package/dist/navigation/builds.js +287 -0
  551. package/dist/navigation/builds.js.map +1 -0
  552. package/dist/navigation/groundAreas.d.ts +59 -1
  553. package/dist/navigation/groundAreas.js +407 -0
  554. package/dist/navigation/groundAreas.js.map +1 -0
  555. package/dist/navigation/navigation.d.ts +98 -9
  556. package/dist/navigation/recast.d.ts +194 -18
  557. package/dist/navigation/recast.js +1379 -0
  558. package/dist/navigation/recast.js.map +1 -0
  559. package/dist/navigation/sidePaths.d.ts +8 -3
  560. package/dist/navigation/sidePaths.js +241 -0
  561. package/dist/navigation/sidePaths.js.map +1 -0
  562. package/dist/navigation/sized.js +243 -0
  563. package/dist/navigation/sized.js.map +1 -0
  564. package/dist/nearest.js +32 -0
  565. package/dist/nearest.js.map +1 -0
  566. package/dist/noise.js +59 -0
  567. package/dist/noise.js.map +1 -0
  568. package/dist/objectives.d.ts +12 -3
  569. package/dist/objectives.js +144 -0
  570. package/dist/objectives.js.map +1 -0
  571. package/dist/orders/basic.d.ts +5 -5
  572. package/dist/orders/basic.js +417 -0
  573. package/dist/orders/basic.js.map +1 -0
  574. package/dist/orders/build.js +278 -0
  575. package/dist/orders/build.js.map +1 -0
  576. package/dist/orders/cast.d.ts +13 -3
  577. package/dist/orders/cast.js +558 -0
  578. package/dist/orders/cast.js.map +1 -0
  579. package/dist/orders/facts.js +16 -0
  580. package/dist/orders/facts.js.map +1 -0
  581. package/dist/orders/harvest.d.ts +21 -5
  582. package/dist/orders/harvest.js +540 -0
  583. package/dist/orders/harvest.js.map +1 -0
  584. package/dist/orders/idle.d.ts +3 -1
  585. package/dist/orders/idle.js +234 -0
  586. package/dist/orders/idle.js.map +1 -0
  587. package/dist/orders/items.js +92 -0
  588. package/dist/orders/items.js.map +1 -0
  589. package/dist/orders/queue.js +108 -0
  590. package/dist/orders/queue.js.map +1 -0
  591. package/dist/orders/waiting.d.ts +39 -0
  592. package/dist/orders/waiting.js +149 -0
  593. package/dist/orders/waiting.js.map +1 -0
  594. package/dist/pack.schema.js +13 -0
  595. package/dist/pack.schema.js.map +1 -0
  596. package/dist/pack.schema.json +7622 -841
  597. package/dist/packs/director/index.d.ts +13 -5
  598. package/dist/packs/director/index.js +204 -0
  599. package/dist/packs/director/index.js.map +1 -0
  600. package/dist/packs/heroes/campaign.d.ts +3 -2
  601. package/dist/packs/heroes/campaign.js +241 -0
  602. package/dist/packs/heroes/campaign.js.map +1 -0
  603. package/dist/packs/heroes/carry.d.ts +6 -0
  604. package/dist/packs/heroes/carry.js +112 -0
  605. package/dist/packs/heroes/carry.js.map +1 -0
  606. package/dist/packs/heroes/commands.js +115 -0
  607. package/dist/packs/heroes/commands.js.map +1 -0
  608. package/dist/packs/heroes/fallen.d.ts +43 -0
  609. package/dist/packs/heroes/fallen.js +61 -0
  610. package/dist/packs/heroes/fallen.js.map +1 -0
  611. package/dist/packs/heroes/hire.js +60 -0
  612. package/dist/packs/heroes/hire.js.map +1 -0
  613. package/dist/packs/heroes/index.d.ts +7 -6
  614. package/dist/packs/heroes/index.js +130 -0
  615. package/dist/packs/heroes/index.js.map +1 -0
  616. package/dist/packs/heroes/loop.d.ts +95 -0
  617. package/dist/packs/heroes/loop.js +250 -0
  618. package/dist/packs/heroes/loop.js.map +1 -0
  619. package/dist/packs/heroes/making.d.ts +6 -3
  620. package/dist/packs/heroes/making.js +55 -0
  621. package/dist/packs/heroes/making.js.map +1 -0
  622. package/dist/packs/heroes/respawn.d.ts +3 -3
  623. package/dist/packs/heroes/respawn.js +87 -0
  624. package/dist/packs/heroes/respawn.js.map +1 -0
  625. package/dist/packs/heroes/sets.d.ts +32 -0
  626. package/dist/packs/heroes/sets.js +51 -0
  627. package/dist/packs/heroes/sets.js.map +1 -0
  628. package/dist/packs/heroes/spells.d.ts +16 -0
  629. package/dist/packs/heroes/spells.js +269 -0
  630. package/dist/packs/heroes/spells.js.map +1 -0
  631. package/dist/packs/items/defaults.d.ts +43 -0
  632. package/dist/packs/items/defaults.js +1504 -0
  633. package/dist/packs/items/defaults.js.map +1 -0
  634. package/dist/packs/items/index.d.ts +27 -0
  635. package/dist/packs/items/index.js +214 -0
  636. package/dist/packs/items/index.js.map +1 -0
  637. package/dist/packs/moba/index.d.ts +3 -3
  638. package/dist/packs/moba/index.js +174 -0
  639. package/dist/packs/moba/index.js.map +1 -0
  640. package/dist/packs/pack.d.ts +15 -15
  641. package/dist/packs/pack.js +14 -0
  642. package/dist/packs/pack.js.map +1 -0
  643. package/dist/packs.d.ts +15 -7
  644. package/dist/packs.js +222 -0
  645. package/dist/packs.js.map +1 -0
  646. package/dist/paths.d.ts +2 -0
  647. package/dist/paths.js +109 -0
  648. package/dist/paths.js.map +1 -0
  649. package/dist/plain.js +57 -0
  650. package/dist/plain.js.map +1 -0
  651. package/dist/player.d.ts +33 -10
  652. package/dist/player.js +159 -0
  653. package/dist/player.js.map +1 -0
  654. package/dist/portals.d.ts +1 -1
  655. package/dist/portals.js +194 -0
  656. package/dist/portals.js.map +1 -0
  657. package/dist/prefabs.d.ts +25 -2
  658. package/dist/prefabs.js +239 -0
  659. package/dist/prefabs.js.map +1 -0
  660. package/dist/presetBuildings.js +58 -0
  661. package/dist/presetBuildings.js.map +1 -0
  662. package/dist/presetFoliage.d.ts +27 -0
  663. package/dist/presetFoliage.js +98 -0
  664. package/dist/presetFoliage.js.map +1 -0
  665. package/dist/presetGround.js +65 -0
  666. package/dist/presetGround.js.map +1 -0
  667. package/dist/proxies.d.ts +12 -0
  668. package/dist/proxies.js +79 -0
  669. package/dist/proxies.js.map +1 -0
  670. package/dist/query.d.ts +56 -0
  671. package/dist/query.js +88 -0
  672. package/dist/query.js.map +1 -0
  673. package/dist/races.d.ts +15 -14
  674. package/dist/races.js +172 -0
  675. package/dist/races.js.map +1 -0
  676. package/dist/randomGroups.js +91 -0
  677. package/dist/randomGroups.js.map +1 -0
  678. package/dist/registry.d.ts +117 -53
  679. package/dist/registry.js +323 -0
  680. package/dist/registry.js.map +1 -0
  681. package/dist/remains.d.ts +11 -9
  682. package/dist/remains.js +188 -0
  683. package/dist/remains.js.map +1 -0
  684. package/dist/replication.d.ts +12 -7
  685. package/dist/replication.js +100 -0
  686. package/dist/replication.js.map +1 -0
  687. package/dist/rng.d.ts +2 -0
  688. package/dist/rng.js +40 -0
  689. package/dist/rng.js.map +1 -0
  690. package/dist/rules.d.ts +186 -99
  691. package/dist/rules.js +179 -0
  692. package/dist/rules.js.map +1 -0
  693. package/dist/rulesCheck.d.ts +5 -4
  694. package/dist/rulesCheck.js +693 -0
  695. package/dist/rulesCheck.js.map +1 -0
  696. package/dist/runes.d.ts +2 -2
  697. package/dist/runes.js +80 -0
  698. package/dist/runes.js.map +1 -0
  699. package/dist/save.d.ts +37 -12
  700. package/dist/save.js +532 -0
  701. package/dist/save.js.map +1 -0
  702. package/dist/scenario.d.ts +2 -2
  703. package/dist/scenario.js +99 -0
  704. package/dist/scenario.js.map +1 -0
  705. package/dist/scheduler.d.ts +3 -0
  706. package/dist/scheduler.js +156 -0
  707. package/dist/scheduler.js.map +1 -0
  708. package/dist/score.d.ts +19 -19
  709. package/dist/score.js +709 -0
  710. package/dist/score.js.map +1 -0
  711. package/dist/sequences.d.ts +10 -6
  712. package/dist/sequences.js +206 -0
  713. package/dist/sequences.js.map +1 -0
  714. package/dist/server/doorman.js +154 -0
  715. package/dist/server/doorman.js.map +1 -0
  716. package/dist/server/gameServer.d.ts +16 -1
  717. package/dist/server/gameServer.js +643 -0
  718. package/dist/server/gameServer.js.map +1 -0
  719. package/dist/server/index.d.ts +1 -1
  720. package/dist/server/lobby.js +199 -0
  721. package/dist/server/lobby.js.map +1 -0
  722. package/dist/server/log.js +18 -0
  723. package/dist/server/log.js.map +1 -0
  724. package/dist/server/match.js +267 -0
  725. package/dist/server/match.js.map +1 -0
  726. package/dist/server/mode.d.ts +18 -9
  727. package/dist/server/mode.js +220 -0
  728. package/dist/server/mode.js.map +1 -0
  729. package/dist/{navigation-worker.js → server/navigation-worker.js} +1 -1
  730. package/dist/server/navigation-worker.js.map +1 -0
  731. package/dist/server/navigation.js +39 -0
  732. package/dist/server/navigation.js.map +1 -0
  733. package/dist/server/ops.d.ts +4 -0
  734. package/dist/server/ops.js +137 -0
  735. package/dist/server/ops.js.map +1 -0
  736. package/dist/server/packs.d.ts +3 -3
  737. package/dist/server/packs.js +32 -0
  738. package/dist/server/packs.js.map +1 -0
  739. package/dist/server/ratings.d.ts +5 -0
  740. package/dist/server/ratings.js +104 -0
  741. package/dist/server/ratings.js.map +1 -0
  742. package/dist/server/relay.d.ts +12 -2
  743. package/dist/server/relay.js +144 -0
  744. package/dist/server/relay.js.map +1 -0
  745. package/dist/server/rooms.d.ts +9 -2
  746. package/dist/server/rooms.js +442 -0
  747. package/dist/server/rooms.js.map +1 -0
  748. package/dist/server/seat.js +116 -0
  749. package/dist/server/seat.js.map +1 -0
  750. package/dist/server/seatSettings.d.ts +3 -3
  751. package/dist/server/seatSettings.js +63 -0
  752. package/dist/server/seatSettings.js.map +1 -0
  753. package/dist/server/secret.js +13 -0
  754. package/dist/server/secret.js.map +1 -0
  755. package/dist/server/start.d.ts +13 -6
  756. package/dist/server/start.js +76 -0
  757. package/dist/server/start.js.map +1 -0
  758. package/dist/server/websocket.d.ts +9 -1
  759. package/dist/server/websocket.js +306 -0
  760. package/dist/server/websocket.js.map +1 -0
  761. package/dist/server.js +15 -2861
  762. package/dist/session/can.js +26 -0
  763. package/dist/session/can.js.map +1 -0
  764. package/dist/session/commandReplay.d.ts +8 -2
  765. package/dist/session/commandReplay.js +293 -0
  766. package/dist/session/commandReplay.js.map +1 -0
  767. package/dist/session/debug.js +151 -0
  768. package/dist/session/debug.js.map +1 -0
  769. package/dist/session/delay.js +62 -0
  770. package/dist/session/delay.js.map +1 -0
  771. package/dist/session/delta.d.ts +14 -1
  772. package/dist/session/delta.js +407 -0
  773. package/dist/session/delta.js.map +1 -0
  774. package/dist/session/entityState.js +415 -0
  775. package/dist/session/entityState.js.map +1 -0
  776. package/dist/session/local.d.ts +47 -5
  777. package/dist/session/local.js +670 -0
  778. package/dist/session/local.js.map +1 -0
  779. package/dist/session/memory.d.ts +20 -2
  780. package/dist/session/memory.js +131 -0
  781. package/dist/session/memory.js.map +1 -0
  782. package/dist/session/protocol.d.ts +325 -31
  783. package/dist/session/protocol.js +55 -0
  784. package/dist/session/protocol.js.map +1 -0
  785. package/dist/session/remote.d.ts +74 -12
  786. package/dist/session/remote.js +1394 -0
  787. package/dist/session/remote.js.map +1 -0
  788. package/dist/session/replay.d.ts +11 -2
  789. package/dist/session/replay.js +160 -0
  790. package/dist/session/replay.js.map +1 -0
  791. package/dist/session/seed.js +12 -0
  792. package/dist/session/seed.js.map +1 -0
  793. package/dist/session/share.d.ts +5 -1
  794. package/dist/session/share.js +94 -0
  795. package/dist/session/share.js.map +1 -0
  796. package/dist/session/socket.d.ts +1 -1
  797. package/dist/session/socket.js +29 -0
  798. package/dist/session/socket.js.map +1 -0
  799. package/dist/session/wire.d.ts +5 -0
  800. package/dist/session/wire.js +84 -0
  801. package/dist/session/wire.js.map +1 -0
  802. package/dist/session/worker.d.ts +77 -12
  803. package/dist/session/worker.js +499 -0
  804. package/dist/session/worker.js.map +1 -0
  805. package/dist/shared.d.ts +31 -5
  806. package/dist/shared.js +166 -0
  807. package/dist/shared.js.map +1 -0
  808. package/dist/sides.d.ts +9 -3
  809. package/dist/sides.js +149 -0
  810. package/dist/sides.js.map +1 -0
  811. package/dist/sight.js +85 -0
  812. package/dist/sight.js.map +1 -0
  813. package/dist/simulate-worker.js +1 -1
  814. package/dist/simulate.d.ts +12 -8
  815. package/dist/{simulate-oXBiw1Ff.js → simulate.js} +10 -11
  816. package/dist/simulate.js.map +1 -0
  817. package/dist/smart.js +77 -0
  818. package/dist/smart.js.map +1 -0
  819. package/dist/spatial.d.ts +32 -16
  820. package/dist/spatial.js +234 -0
  821. package/dist/spatial.js.map +1 -0
  822. package/dist/spawning.d.ts +1 -0
  823. package/dist/spawning.js +224 -0
  824. package/dist/spawning.js.map +1 -0
  825. package/dist/stances.d.ts +6 -3
  826. package/dist/stances.js +169 -0
  827. package/dist/stances.js.map +1 -0
  828. package/dist/start.d.ts +10 -10
  829. package/dist/start.js +75 -0
  830. package/dist/start.js.map +1 -0
  831. package/dist/stats.d.ts +42 -16
  832. package/dist/stats.js +290 -0
  833. package/dist/stats.js.map +1 -0
  834. package/dist/summoned.d.ts +52 -0
  835. package/dist/summoned.js +38 -0
  836. package/dist/summoned.js.map +1 -0
  837. package/dist/summons.d.ts +10 -13
  838. package/dist/summons.js +271 -0
  839. package/dist/summons.js.map +1 -0
  840. package/dist/systems/abilities.js +224 -0
  841. package/dist/systems/abilities.js.map +1 -0
  842. package/dist/systems/combat.d.ts +35 -1
  843. package/dist/systems/combat.js +677 -0
  844. package/dist/systems/combat.js.map +1 -0
  845. package/dist/systems/combatTold.d.ts +3 -1
  846. package/dist/systems/combatTold.js +85 -0
  847. package/dist/systems/combatTold.js.map +1 -0
  848. package/dist/systems/construction.js +80 -0
  849. package/dist/systems/construction.js.map +1 -0
  850. package/dist/systems/economy.d.ts +0 -6
  851. package/dist/systems/economy.js +128 -0
  852. package/dist/systems/economy.js.map +1 -0
  853. package/dist/systems/fog.d.ts +1 -1
  854. package/dist/systems/fog.js +120 -0
  855. package/dist/systems/fog.js.map +1 -0
  856. package/dist/systems/life.js +32 -0
  857. package/dist/systems/life.js.map +1 -0
  858. package/dist/systems/movement.d.ts +24 -12
  859. package/dist/systems/movement.js +1247 -0
  860. package/dist/systems/movement.js.map +1 -0
  861. package/dist/systems/orders.js +64 -0
  862. package/dist/systems/orders.js.map +1 -0
  863. package/dist/systems/production.js +322 -0
  864. package/dist/systems/production.js.map +1 -0
  865. package/dist/systems/productionQueue.js +120 -0
  866. package/dist/systems/productionQueue.js.map +1 -0
  867. package/dist/systems/victory.d.ts +1 -1
  868. package/dist/systems/victory.js +56 -0
  869. package/dist/systems/victory.js.map +1 -0
  870. package/dist/talk.d.ts +6 -6
  871. package/dist/talk.js +153 -0
  872. package/dist/talk.js.map +1 -0
  873. package/dist/targeting.d.ts +142 -0
  874. package/dist/targeting.js +49 -0
  875. package/dist/targeting.js.map +1 -0
  876. package/dist/tech.d.ts +20 -3
  877. package/dist/tech.js +239 -0
  878. package/dist/tech.js.map +1 -0
  879. package/dist/techTree.d.ts +7 -0
  880. package/dist/techTree.js +90 -0
  881. package/dist/techTree.js.map +1 -0
  882. package/dist/terrain.d.ts +59 -7
  883. package/dist/terrain.js +389 -0
  884. package/dist/terrain.js.map +1 -0
  885. package/dist/terrainSave.d.ts +6 -0
  886. package/dist/terrainSave.js +74 -0
  887. package/dist/terrainSave.js.map +1 -0
  888. package/dist/testing.d.ts +8 -7
  889. package/dist/testing.js +13 -739
  890. package/dist/testing.js.map +1 -1
  891. package/dist/tiles.d.ts +1 -1
  892. package/dist/tiles.js +43 -0
  893. package/dist/tiles.js.map +1 -0
  894. package/dist/timers.d.ts +29 -4
  895. package/dist/timers.js +242 -0
  896. package/dist/timers.js.map +1 -0
  897. package/dist/tomes.d.ts +4 -4
  898. package/dist/tomes.js +94 -0
  899. package/dist/tomes.js.map +1 -0
  900. package/dist/trade.js +103 -0
  901. package/dist/trade.js.map +1 -0
  902. package/dist/transport.d.ts +6 -1
  903. package/dist/transport.js +281 -0
  904. package/dist/transport.js.map +1 -0
  905. package/dist/tunables.d.ts +10 -3
  906. package/dist/tunables.js +56 -0
  907. package/dist/tunables.js.map +1 -0
  908. package/dist/unitResources.d.ts +67 -0
  909. package/dist/unitResources.js +266 -0
  910. package/dist/unitResources.js.map +1 -0
  911. package/dist/upkeep.d.ts +6 -1
  912. package/dist/upkeep.js +26 -0
  913. package/dist/upkeep.js.map +1 -0
  914. package/dist/veterancy.d.ts +8 -3
  915. package/dist/veterancy.js +131 -0
  916. package/dist/veterancy.js.map +1 -0
  917. package/dist/vision.d.ts +36 -0
  918. package/dist/vision.js +133 -0
  919. package/dist/vision.js.map +1 -0
  920. package/dist/walls.d.ts +1 -1
  921. package/dist/walls.js +278 -0
  922. package/dist/walls.js.map +1 -0
  923. package/dist/world.d.ts +606 -88
  924. package/dist/world.js +1263 -0
  925. package/dist/world.js.map +1 -0
  926. package/package.json +2 -2
  927. package/dist/ai.js.map +0 -1
  928. package/dist/attributes.d.ts +0 -66
  929. package/dist/brain-BvVdUhX8.js +0 -7659
  930. package/dist/brain-BvVdUhX8.js.map +0 -1
  931. package/dist/builds-C6LfgvEU.js +0 -460
  932. package/dist/builds-C6LfgvEU.js.map +0 -1
  933. package/dist/coreComponents-syuh2fPG.js +0 -5149
  934. package/dist/coreComponents-syuh2fPG.js.map +0 -1
  935. package/dist/debugCommands-CzjrSm66.js +0 -14739
  936. package/dist/debugCommands-CzjrSm66.js.map +0 -1
  937. package/dist/determinism-BCymQwiE.js +0 -518
  938. package/dist/determinism-BCymQwiE.js.map +0 -1
  939. package/dist/game-DiJEN-Ks.js +0 -5800
  940. package/dist/game-DiJEN-Ks.js.map +0 -1
  941. package/dist/index.js.map +0 -1
  942. package/dist/inspect-D9dWHmZ0.js.map +0 -1
  943. package/dist/local-Dkovq42k.js +0 -1379
  944. package/dist/local-Dkovq42k.js.map +0 -1
  945. package/dist/missionRules-C-bGxm0Q.js.map +0 -1
  946. package/dist/navigation-worker.js.map +0 -1
  947. package/dist/packs-g5thvmGn.js +0 -3199
  948. package/dist/packs-g5thvmGn.js.map +0 -1
  949. package/dist/profiles-B3NS9jwk.js.map +0 -1
  950. package/dist/server.js.map +0 -1
  951. package/dist/simulate-oXBiw1Ff.js.map +0 -1
package/dist/inspect.d.ts CHANGED
@@ -8,6 +8,7 @@ import type { World } from './world';
8
8
  * @beta
9
9
  */
10
10
  export interface InspectedSection {
11
+ /** The heading of the section in the inspector, such as `stats` or a component's name */
11
12
  title: string;
12
13
  /** What it holds, plain data. Entities in it are written `footman#12`, for the inspector to link to */
13
14
  value: unknown;
@@ -34,17 +35,21 @@ export type InspectTarget = {
34
35
  * @beta
35
36
  */
36
37
  export interface Inspection {
38
+ /** What is inspected: an entity by id, a player by id, or the world itself */
37
39
  target: InspectTarget;
38
40
  /** What it is called: `Footman #14`, a player's name, `World` */
39
41
  title: string;
40
42
  /** What else says what it is: type and owner, team */
41
43
  about: string;
44
+ /** The tick of the simulation the inspection was taken at */
42
45
  tick: number;
46
+ /** Whether the inspected entity or player is still there; false once it has been removed or defeated */
43
47
  alive: boolean;
44
48
  /** Where it is, for an entity */
45
49
  at?: Vec2;
46
50
  /** What is so of it that is not a number: hidden, asleep, scenery */
47
51
  flags: string[];
52
+ /** The parts of it the inspector lists, in order */
48
53
  sections: InspectedSection[];
49
54
  /**
50
55
  * What the computer that plays a player is thinking, where a brain does (`Brain.report`, with the seat's timing):
@@ -64,16 +69,25 @@ export declare function inspect(world: World, target: InspectTarget): Inspection
64
69
  * @beta
65
70
  */
66
71
  export interface EntityRow {
72
+ /** The entity's id */
67
73
  id: EntityId;
74
+ /** The id of the entity's unit type */
68
75
  type: string;
76
+ /** The entity's display name */
69
77
  name: string;
78
+ /** The player that owns it */
70
79
  owner: PlayerId;
80
+ /** What kind of thing it is: `unit`, `building` or `resource` */
71
81
  kind: string;
72
- hp: number;
73
- maxHp: number;
82
+ /** Its health now */
83
+ health: number;
84
+ /** Its largest health */
85
+ maxHealth: number;
74
86
  /** Type of what it is doing, null for nothing */
75
87
  order: string | null;
88
+ /** Whether it is scenery, kept out of play and shown as ground dressing */
76
89
  scenery: boolean;
90
+ /** Whether it is hidden from the players */
77
91
  hidden: boolean;
78
92
  }
79
93
  /**
@@ -82,10 +96,15 @@ export interface EntityRow {
82
96
  * @beta
83
97
  */
84
98
  export interface PlayerRow {
99
+ /** The player's id */
85
100
  id: PlayerId;
101
+ /** The player's name */
86
102
  name: string;
103
+ /** The team the player is on */
87
104
  team: number;
105
+ /** Whether it is a neutral player (creeps and the like), not one of the sides */
88
106
  neutral: boolean;
107
+ /** Whether the player has lost the game */
89
108
  defeated: boolean;
90
109
  }
91
110
  /**
@@ -94,8 +113,11 @@ export interface PlayerRow {
94
113
  * @beta
95
114
  */
96
115
  export interface WorldListing {
116
+ /** The tick of the simulation the listing was taken at */
97
117
  tick: number;
118
+ /** Every player of the world, as `PlayerRow` */
98
119
  players: PlayerRow[];
120
+ /** Every entity of the world, as `EntityRow`, hidden and scenery ones too */
99
121
  entities: EntityRow[];
100
122
  }
101
123
  /**
@@ -108,6 +130,7 @@ export interface LoggedEvent {
108
130
  seq: number;
109
131
  /** The tick it happened in */
110
132
  tick: number;
133
+ /** Whether it is an engine `event` or a `hook` */
111
134
  kind: 'event' | 'hook';
112
135
  /** The engine's name for it, or a game's id */
113
136
  name: string;
@@ -163,12 +186,16 @@ export declare class EventLog implements Trace {
163
186
  attach(world: World): void;
164
187
  /** Stops following it. What was logged stays */
165
188
  detach(): void;
189
+ /** Whether the log is attached to a world, following what happens in it */
166
190
  get attached(): boolean;
167
191
  /** What was logged, oldest first. The same list, kept up to date: to read, not to keep */
168
192
  get entries(): readonly LoggedEvent[];
193
+ /** Empties the log and the hooks it is counting for the current tick */
169
194
  clear(): void;
170
195
  private event;
196
+ /** Notes that the listener with this id ran on the event going out; part of `Trace` */
171
197
  listener(id: string): void;
198
+ /** Notes that the hook ran, with the ids of its handlers and whether it is a game's own; a hook run again in the same tick only adds to its count */
172
199
  hook(name: string, handlers: readonly {
173
200
  id: string;
174
201
  }[], own: boolean, event: unknown): void;
@@ -1,4 +1,9 @@
1
- import { cl as fighting, id as isGameEvent, ll as moving, nl as Entity, pd as statsOf, rl as deposit, ro as dashing, wc as productionOf, zi as harvesterOf } from "./debugCommands-CzjrSm66.js";
1
+ import { statsOf } from "./stats.js";
2
+ import { isGameEvent } from "./events.js";
3
+ import { Entity, deposit, fighting, moving } from "./entity.js";
4
+ import { productionOf } from "./systems/productionQueue.js";
5
+ import { dashing } from "./dashing.js";
6
+ import { harvesterOf } from "./orders/harvest.js";
2
7
  //#region src/inspect.ts
3
8
  /**
4
9
  * What the debug tools see of the rules: everything in the world (`listWorld`), an entity, a player or the world as the
@@ -52,8 +57,8 @@ var PART_COMPONENTS = {
52
57
  };
53
58
  /** The numbers of an entity of its own, not in a part */
54
59
  var OWN_NUMBERS = [
55
- "hp",
56
- "maxHp",
60
+ "health",
61
+ "maxHealth",
57
62
  "mana",
58
63
  "maxMana",
59
64
  "facing",
@@ -102,7 +107,7 @@ function relationsOf(world, entity) {
102
107
  add("rallies to", productionOf(entity)?.rally?.target);
103
108
  for (const buff of entity.buffs) add(`buff ${buff.id} from`, buff.source);
104
109
  let after = 0;
105
- for (const other of world.actors.values()) {
110
+ for (const other of world.units.values()) {
106
111
  if (other === entity || !other.alive) continue;
107
112
  if (other.orders[0]?.init.target === entity.id || other.get(fighting)?.autoTarget === entity.id) {
108
113
  if (++after > 8) break;
@@ -254,7 +259,7 @@ function inspectWorld(world) {
254
259
  hour: world.registry.day ? world.hour : void 0,
255
260
  winner: world.winner,
256
261
  entities: world.entities.size,
257
- actors: world.actors.size,
262
+ actors: world.units.size,
258
263
  projectiles: world.projectiles.length,
259
264
  missiles: world.missiles.length,
260
265
  items: world.items.length
@@ -301,7 +306,7 @@ function holderOf(root, path) {
301
306
  return holder;
302
307
  }
303
308
  /**
304
- * Changes a number where `inspect` showed it: of an entity `['hp']`, `['abilities', 0, 'cooldown']`,
309
+ * Changes a number where `inspect` showed it: of an entity `['health']`, `['abilities', 0, 'cooldown']`,
305
310
  * `['components', 'td.bounty', 'gold']`; of a player `['resources', 'gold']`, `['upgrades', 'armor']`,
306
311
  * `['state', 'td.score', 'kills']`; of the world `['state', 'td.waves', 'wave']`. An entity's health is kept within what
307
312
  * it can have, and none left kills it. Whether it was changed: false for what is not a number or a switch (a boolean), or not to be changed
@@ -336,12 +341,12 @@ function setInspected(world, target, path, value) {
336
341
  if (!entity?.alive || !EDITABLE.has(String(path[0]))) return false;
337
342
  const holder = holderOf(entity, path);
338
343
  if (!holder || typeof holder[last] !== typeof value) return false;
339
- if (typeof value === "number" && path.length === 1 && last === "hp") {
344
+ if (typeof value === "number" && path.length === 1 && last === "health") {
340
345
  if (value <= 0) {
341
346
  world.kill(entity);
342
347
  return true;
343
348
  }
344
- value = Math.min(value, entity.maxHp);
349
+ value = Math.min(value, entity.maxHealth);
345
350
  }
346
351
  if (typeof value === "number" && path.length === 1 && last === "mana") value = Math.max(0, Math.min(value, entity.maxMana));
347
352
  holder[last] = value;
@@ -363,8 +368,8 @@ function listWorld(world) {
363
368
  name: entity.def.name,
364
369
  owner: entity.owner,
365
370
  kind: entity.def.kind,
366
- hp: Math.ceil(entity.hp),
367
- maxHp: Math.ceil(entity.maxHp),
371
+ health: Math.ceil(entity.health),
372
+ maxHealth: Math.ceil(entity.maxHealth),
368
373
  order: entity.orders[0]?.type ?? null,
369
374
  scenery: entity.scenery,
370
375
  hidden: entity.hidden
@@ -423,6 +428,7 @@ var EventLog = class {
423
428
  this.world = null;
424
429
  this.current = null;
425
430
  }
431
+ /** Whether the log is attached to a world, following what happens in it */
426
432
  get attached() {
427
433
  return this.world !== null;
428
434
  }
@@ -430,6 +436,7 @@ var EventLog = class {
430
436
  get entries() {
431
437
  return this.list;
432
438
  }
439
+ /** Empties the log and the hooks it is counting for the current tick */
433
440
  clear() {
434
441
  this.list.length = 0;
435
442
  this.hooks.clear();
@@ -447,9 +454,11 @@ var EventLog = class {
447
454
  ran: []
448
455
  });
449
456
  }
457
+ /** Notes that the listener with this id ran on the event going out; part of `Trace` */
450
458
  listener(id) {
451
459
  this.current?.ran.push(id);
452
460
  }
461
+ /** Notes that the hook ran, with the ids of its handlers and whether it is a game's own; a hook run again in the same tick only adds to its count */
453
462
  hook(name, handlers, own, event) {
454
463
  const { tick } = this.world;
455
464
  if (tick !== this.hooksAt) {
@@ -486,6 +495,6 @@ var EventLog = class {
486
495
  }
487
496
  };
488
497
  //#endregion
489
- export { summarize as a, setInspected as i, inspect as n, listWorld as r, EventLog as t };
498
+ export { EventLog, inspect, listWorld, setInspected, summarize };
490
499
 
491
- //# sourceMappingURL=inspect-D9dWHmZ0.js.map
500
+ //# sourceMappingURL=inspect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inspect.js","names":[],"sources":["../src/inspect.ts"],"sourcesContent":["import { harvesterOf } from './orders/harvest'\nimport { dashing } from './dashing'\nimport { productionOf } from './systems/productionQueue'\nimport { deposit, Entity, type EntityId, fighting, moving, type PlayerId } from './entity'\nimport { isGameEvent } from './events'\nimport type { AiReport } from './ai/report'\nimport type { Vec2 } from './math'\nimport { statsOf } from './stats'\nimport type { World } from './world'\n\n/**\n * What the debug tools see of the rules: everything in the world (`listWorld`), an entity, a player or the world as the\n * rules have it (`inspect`), a number of it changed (`setInspected`), and the events and hooks of the last seconds\n * (`EventLog`). Everything they give is plain data,\n * so that it can come from a simulation that runs somewhere else, the way the snapshots do\n */\n\n/**\n * A value as plain data, to be shown: entities become `footman#12`, definitions their id, numbers are rounded, and\n * what is deep or long is cut short\n *\n * @internal\n */\nexport function summarize(value: unknown, depth = 0): unknown {\n\tif (value === null || value === undefined || typeof value === 'string' || typeof value === 'boolean') return value\n\tif (typeof value === 'number') return Number.isInteger(value) || !Number.isFinite(value) ? value : Math.round(value * 1000) / 1000\n\tif (typeof value === 'function') return undefined\n\tif (typeof value !== 'object') return String(value)\n\tif (value instanceof Entity) return `${value.def.id}#${value.id}`\n\tif (value instanceof Map || value instanceof Set) return `${value.constructor.name}(${value.size})`\n\tif (ArrayBuffer.isView(value)) return `${value.constructor.name}(${(value as unknown as ArrayLike<number>).length})`\n\tif (Array.isArray(value)) {\n\t\tif (depth > 3) return `[${value.length}]`\n\t\tconst items = value.slice(0, 12).map((item) => summarize(item, depth + 1))\n\t\tif (value.length > 12) items.push(`… ${value.length - 12} more`)\n\t\treturn items\n\t}\n\tconst record = value as Record<string, unknown>\n\tconst plain = Object.getPrototypeOf(value) === Object.prototype || Object.getPrototypeOf(value) === null\n\t// what is inside something else and has an id of its own is said by that id: a definition, a projectile\n\tif (depth > 0 && typeof record.id === 'string' && (!plain || 'name' in record)) return record.id\n\tif (depth > 0 && typeof record.id === 'number' && !plain) return `${value.constructor.name.toLowerCase()} ${record.id}`\n\tif (depth > 3) return '{…}'\n\tconst out: Record<string, unknown> = {}\n\tfor (const key in record) {\n\t\tconst item = summarize(record[key], depth + 1)\n\t\tif (item !== undefined) out[key] = item\n\t}\n\treturn out\n}\n\n/**\n * A part of what is inspected, as the inspector shows it\n *\n * @beta\n */\nexport interface InspectedSection {\n\t/** The heading of the section in the inspector, such as `stats` or a component's name */\n\ttitle: string\n\t/** What it holds, plain data. Entities in it are written `footman#12`, for the inspector to link to */\n\tvalue: unknown\n\t/** Where it is kept, for `setInspected`. Left out for what is worked out, or not to be changed by hand, like stats */\n\tpath?: (string | number)[]\n\t/** State of the game's own (a component), rather than the engine's */\n\town?: boolean\n}\n\n/**\n * What the inspector can look at: an entity, a player, or the world itself\n *\n * @beta\n */\nexport type InspectTarget = { entity: EntityId } | { player: PlayerId } | { world: true }\n\n/**\n * Something as the simulation has it, for the inspector\n *\n * @beta\n */\nexport interface Inspection {\n\t/** What is inspected: an entity by id, a player by id, or the world itself */\n\ttarget: InspectTarget\n\t/** What it is called: `Footman #14`, a player's name, `World` */\n\ttitle: string\n\t/** What else says what it is: type and owner, team */\n\tabout: string\n\t/** The tick of the simulation the inspection was taken at */\n\ttick: number\n\t/** Whether the inspected entity or player is still there; false once it has been removed or defeated */\n\talive: boolean\n\t/** Where it is, for an entity */\n\tat?: Vec2\n\t/** What is so of it that is not a number: hidden, asleep, scenery */\n\tflags: string[]\n\t/** The parts of it the inspector lists, in order */\n\tsections: InspectedSection[]\n\t/**\n\t * What the computer that plays a player is thinking, where a brain does (`Brain.report`, with the seat's timing):\n\t * what the debug panel's AI tab draws. A computer player of another kind is a section (`Computer player`)\n\t */\n\tai?: AiReport\n}\n\n/** The parts of an entity the engine keeps, by field, with what the inspector calls them */\nconst PARTS: [keyof Entity, string][] = [\n\t['orders', 'Orders'],\n\t['abilities', 'Abilities'],\n\t['buffs', 'Buffs']\n]\n\n/** The engine's parts that are components, by id, with what the inspector calls them */\nconst PART_COMPONENTS: Record<string, string> = { [moving.id]: 'Movement', [fighting.id]: 'Combat', [deposit.id]: 'Resource' }\n\n/** The numbers of an entity of its own, not in a part */\nconst OWN_NUMBERS = ['health', 'maxHealth', 'mana', 'maxMana', 'facing', 'expires', 'unseenIn'] as const\n\n/** What `setInspected` may change of an entity: the numbers of its own, the parts and the components. Never where it is, nor its type */\nconst EDITABLE = new Set<string>([...OWN_NUMBERS, ...PARTS.map(([key]) => key), 'components'])\n\n/** The world's own state the inspector shows apart, rather than as a component */\nconst TIMERS_STATE = 'core.timers'\n\n/** Whether a timer's data says something about the entity: a field that names it by id */\nfunction mentions(data: unknown, id: EntityId, depth = 0): boolean {\n\tif (!data || typeof data !== 'object' || depth > 3) return false\n\tfor (const [key, value] of Object.entries(data)) {\n\t\tif (typeof value === 'number' && value === id && /id|entity|unit|target|source|caster|owner/i.test(key)) return true\n\t\tif (typeof value === 'object' && mentions(value, id, depth + 1)) return true\n\t}\n\treturn false\n}\n\n/** An entity by id as the inspector links to it, or nothing when there is none */\nconst named = (world: World, id: EntityId | undefined | null): string | undefined => {\n\tconst entity = id ? world.get(id) : undefined\n\treturn entity && `${entity.def.id}#${entity.id}`\n}\n\n/**\n * The other entities an entity has to do with, by what they are to it: what it is told to go for, fight, gather\n * from, who put a buff on it; and the other way, who is after it. The world has no tree of entities: these are its\n * relations\n */\nfunction relationsOf(world: World, entity: Entity): Record<string, string> {\n\tconst out: Record<string, string> = {}\n\tconst add = (what: string, id: EntityId | undefined | null) => {\n\t\tconst name = named(world, id)\n\t\tif (name && id !== entity.id) out[what] = name\n\t}\n\tentity.orders.forEach((order, index) => add(`orders[${index}] ${order.type}`, order.init.target))\n\tadd('goes to', entity.get(moving)?.goalEntity)\n\tadd('fights', entity.get(fighting)?.autoTarget)\n\tadd('swings at', entity.get(fighting)?.swingTarget)\n\tadd('was hit by', entity.get(fighting)?.lastAttacker)\n\tadd('gathers from', harvesterOf(entity)?.resource)\n\tadd('rallies to', productionOf(entity)?.rally?.target)\n\tfor (const buff of entity.buffs) add(`buff ${buff.id} from`, buff.source)\n\tlet after = 0\n\tfor (const other of world.units.values()) {\n\t\tif (other === entity || !other.alive) continue\n\t\tif (other.orders[0]?.init.target === entity.id || other.get(fighting)?.autoTarget === entity.id) {\n\t\t\tif (++after > 8) break\n\t\t\tadd(`after it ${after}`, other.id)\n\t\t}\n\t}\n\treturn out\n}\n\nfunction inspectEntity(world: World, id: EntityId): Inspection | null {\n\tconst entity = world.get(id)\n\tif (!entity) return null\n\tconst state: Record<string, unknown> = {}\n\tfor (const key of OWN_NUMBERS) if (entity[key] !== null) state[key] = summarize(entity[key])\n\tconst flags: string[] = []\n\tif (entity.hidden) flags.push('hidden')\n\tif (entity.asleep) flags.push('asleep')\n\tif (entity.unseen) flags.push('unseen')\n\tif (entity.scenery) flags.push('scenery')\n\tif (entity.get(dashing)) flags.push('dashing')\n\tif (entity.scale !== 1) flags.push(`scale ${entity.scale}`)\n\tif (entity.look) flags.push(`look ${entity.look}`)\n\tconst sections: InspectedSection[] = [\n\t\t{ title: 'State', value: state, path: [] },\n\t\t{ title: 'Stats', value: summarize({ ...statsOf(world, entity) }) }\n\t]\n\tconst related = relationsOf(world, entity)\n\tif (Object.keys(related).length) sections.push({ title: 'Related', value: related })\n\tfor (const [key, title] of PARTS) {\n\t\tconst value = entity[key]\n\t\tif (value === undefined || value === null || (Array.isArray(value) && !value.length)) continue\n\t\tsections.push({ title, value: summarize(value), path: [key] })\n\t}\n\tfor (const [component, value] of Object.entries(entity.components)) {\n\t\tconst part = PART_COMPONENTS[component]\n\t\tsections.push({ title: part ?? component, value: summarize(value), path: ['components', component], own: !part })\n\t}\n\tconst timers = world.timers.list().filter((timer) => mentions(timer.data, id))\n\tif (timers.length) sections.push({ title: 'Timers', value: summarize(timers) })\n\tconst owner = world.players.get(entity.owner)?.name ?? String(entity.owner)\n\treturn {\n\t\ttarget: { entity: id },\n\t\ttitle: `${entity.def.name} #${id}`,\n\t\tabout: `${entity.def.id}, ${owner}`,\n\t\ttick: world.tick,\n\t\talive: entity.alive,\n\t\tat: { x: entity.pos.x, z: entity.pos.z },\n\t\tflags,\n\t\tsections\n\t}\n}\n\n/** The components kept in a state store, each a section of its own */\nconst componentSections = (values: Record<string, unknown>): InspectedSection[] =>\n\tObject.entries(values)\n\t\t.filter(([id]) => id !== TIMERS_STATE)\n\t\t.map(([id, value]) => ({ title: id, value: summarize(value), path: ['state', id], own: true }))\n\nfunction inspectPlayer(world: World, id: PlayerId): Inspection | null {\n\tconst player = world.players.get(id)\n\tif (!player) return null\n\tconst objectives = world.objectives.of(id)\n\tconst sections: InspectedSection[] = [\n\t\t{ title: 'Resources', value: summarize(player.resources), path: ['resources'] },\n\t\t{\n\t\t\ttitle: 'Player',\n\t\t\tvalue: { team: player.team, supplyUsed: player.supplyUsed, supplyCap: player.supplyCap, entities: world.index.ownedBy(id).size }\n\t\t},\n\t\t{ title: 'Upgrades', value: Object.fromEntries(player.upgrades), path: ['upgrades'] }\n\t]\n\tif (player.researching.size) sections.push({ title: 'Researching', value: [...player.researching] })\n\tif (objectives.length) sections.push({ title: 'Objectives', value: summarize(objectives) })\n\tsections.push(...componentSections(player.states.values))\n\t// the computer that plays it, where one does: what it is thinking, as it says (`ComputerPlayer.inspect`). A brain's\n\t// is its report, with the seat's milliseconds: the AI tab's\n\tconst seat = world.computers.get(id)\n\tconst thinking = seat?.computer.inspect?.()\n\tconst ai = isReport(thinking) ? { ...thinking, timing: seat!.timing() } : undefined\n\tif (thinking !== undefined && !ai) sections.push({ title: 'Computer player', value: summarize(thinking) })\n\tconst flags = [player.neutral && 'neutral', player.creeps && 'creeps', player.defeated && 'defeated'].filter((flag): flag is string => !!flag)\n\treturn {\n\t\ttarget: { player: id },\n\t\ttitle: player.name,\n\t\tabout: `player ${id}, team ${player.team}`,\n\t\ttick: world.tick,\n\t\talive: !player.defeated,\n\t\tflags,\n\t\tsections,\n\t\t...(ai && { ai })\n\t}\n}\n\n/** Whether what a computer player says of itself is a brain's report */\nconst isReport = (value: unknown): value is AiReport =>\n\t!!value &&\n\ttypeof value === 'object' &&\n\t(value as AiReport).v === 1 &&\n\ttypeof (value as AiReport).brain === 'string' &&\n\tArray.isArray((value as AiReport).goals)\n\nfunction inspectWorld(world: World): Inspection {\n\tconst sections: InspectedSection[] = [\n\t\t{\n\t\t\ttitle: 'World',\n\t\t\tvalue: summarize({\n\t\t\t\ttick: world.tick,\n\t\t\t\ttime: world.time,\n\t\t\t\thour: world.registry.day ? world.hour : undefined,\n\t\t\t\twinner: world.winner,\n\t\t\t\tentities: world.entities.size,\n\t\t\t\tactors: world.units.size,\n\t\t\t\tprojectiles: world.projectiles.length,\n\t\t\t\tmissiles: world.missiles.length,\n\t\t\t\titems: world.items.length\n\t\t\t})\n\t\t},\n\t\t...componentSections(world.states.values),\n\t\t{ title: 'Timers', value: summarize(world.timers.list()) },\n\t\t{ title: 'Systems', value: world.systems.map((system) => `${system.name} (${system.phase})`) }\n\t]\n\treturn { target: { world: true }, title: 'World', about: `${world.players.size} players`, tick: world.tick, alive: true, flags: [], sections }\n}\n\n/**\n * Something as the simulation has it right now, or null when there is no such entity or player\n *\n * @beta\n */\nexport function inspect(world: World, target: InspectTarget): Inspection | null {\n\tif ('entity' in target) return inspectEntity(world, target.entity)\n\tif ('player' in target) return inspectPlayer(world, target.player)\n\treturn inspectWorld(world)\n}\n\n/** Walks a path to what holds the last key. Null when it does not lead anywhere */\nfunction holderOf(root: unknown, path: readonly (string | number)[]): Record<string | number, unknown> | null {\n\tlet holder = root as Record<string | number, unknown>\n\tfor (const key of path.slice(0, -1)) {\n\t\tconst next = holder[key]\n\t\tif (!next || typeof next !== 'object') return null\n\t\tholder = next as Record<string | number, unknown>\n\t}\n\treturn holder\n}\n\n/**\n * Changes a number where `inspect` showed it: of an entity `['health']`, `['abilities', 0, 'cooldown']`,\n * `['components', 'td.bounty', 'gold']`; of a player `['resources', 'gold']`, `['upgrades', 'armor']`,\n * `['state', 'td.score', 'kills']`; of the world `['state', 'td.waves', 'wave']`. An entity's health is kept within what\n * it can have, and none left kills it. Whether it was changed: false for what is not a number or a switch (a boolean), or not to be changed\n *\n * @internal\n */\nexport function setInspected(world: World, target: InspectTarget, path: readonly (string | number)[], value: number | boolean): boolean {\n\tif (!path.length || (typeof value === 'number' && !Number.isFinite(value))) return false\n\tconst last = path[path.length - 1]\n\tif ('player' in target) {\n\t\tconst player = world.players.get(target.player)\n\t\tif (!player) return false\n\t\t// upgrades go through the player, which tells whatever is worked out from them\n\t\tif (path[0] === 'upgrades' && path.length === 2) {\n\t\t\tif (typeof value !== 'number') return false\n\t\t\tplayer.setUpgrade(String(last), Math.max(0, Math.round(value)))\n\t\t\treturn true\n\t\t}\n\t\tconst root = path[0] === 'resources' ? player : path[0] === 'state' ? { state: player.states.values } : null\n\t\tconst holder = root && holderOf(root, path)\n\t\tif (!holder || typeof holder[last] !== typeof value) return false\n\t\tholder[last] = value\n\t\treturn true\n\t}\n\tif ('world' in target) {\n\t\tif (path[0] !== 'state' || path[1] === TIMERS_STATE) return false\n\t\tconst holder = holderOf({ state: world.states.values }, path)\n\t\tif (!holder || typeof holder[last] !== typeof value) return false\n\t\tholder[last] = value\n\t\treturn true\n\t}\n\tconst entity = world.get(target.entity)\n\tif (!entity?.alive || !EDITABLE.has(String(path[0]))) return false\n\tconst holder = holderOf(entity, path)\n\tif (!holder || typeof holder[last] !== typeof value) return false\n\tif (typeof value === 'number' && path.length === 1 && last === 'health') {\n\t\tif (value <= 0) {\n\t\t\tworld.kill(entity)\n\t\t\treturn true\n\t\t}\n\t\tvalue = Math.min(value, entity.maxHealth)\n\t}\n\tif (typeof value === 'number' && path.length === 1 && last === 'mana') value = Math.max(0, Math.min(value, entity.maxMana))\n\tholder[last] = value\n\t// levels, buffs and the like go into its stats: they are worked out again\n\tentity.statsCache = null\n\treturn true\n}\n\n/**\n * An entity as the list of all of them shows it\n *\n * @beta\n */\nexport interface EntityRow {\n\t/** The entity's id */\n\tid: EntityId\n\t/** The id of the entity's unit type */\n\ttype: string\n\t/** The entity's display name */\n\tname: string\n\t/** The player that owns it */\n\towner: PlayerId\n\t/** What kind of thing it is: `unit`, `building` or `resource` */\n\tkind: string\n\t/** Its health now */\n\thealth: number\n\t/** Its largest health */\n\tmaxHealth: number\n\t/** Type of what it is doing, null for nothing */\n\torder: string | null\n\t/** Whether it is scenery, kept out of play and shown as ground dressing */\n\tscenery: boolean\n\t/** Whether it is hidden from the players */\n\thidden: boolean\n}\n\n/**\n * A player as the list shows it\n *\n * @beta\n */\nexport interface PlayerRow {\n\t/** The player's id */\n\tid: PlayerId\n\t/** The player's name */\n\tname: string\n\t/** The team the player is on */\n\tteam: number\n\t/** Whether it is a neutral player (creeps and the like), not one of the sides */\n\tneutral: boolean\n\t/** Whether the player has lost the game */\n\tdefeated: boolean\n}\n\n/**\n * Everything in the world, for the list of the debug tools: what is out of sight, hidden or scenery too\n *\n * @beta\n */\nexport interface WorldListing {\n\t/** The tick of the simulation the listing was taken at */\n\ttick: number\n\t/** Every player of the world, as `PlayerRow` */\n\tplayers: PlayerRow[]\n\t/** Every entity of the world, as `EntityRow`, hidden and scenery ones too */\n\tentities: EntityRow[]\n}\n\n/**\n * Every player and entity of the world, in a few numbers each\n *\n * @internal\n */\nexport function listWorld(world: World): WorldListing {\n\tconst entities: EntityRow[] = []\n\tfor (const entity of world.entities.values()) {\n\t\tif (!entity.alive) continue\n\t\tentities.push({\n\t\t\tid: entity.id,\n\t\t\ttype: entity.def.id,\n\t\t\tname: entity.def.name,\n\t\t\towner: entity.owner,\n\t\t\tkind: entity.def.kind,\n\t\t\thealth: Math.ceil(entity.health),\n\t\t\tmaxHealth: Math.ceil(entity.maxHealth),\n\t\t\torder: entity.orders[0]?.type ?? null,\n\t\t\tscenery: entity.scenery,\n\t\t\thidden: entity.hidden\n\t\t})\n\t}\n\tconst players = [...world.players.values()].map(({ id, name, team, neutral, defeated }) => ({ id, name, team, neutral, defeated }))\n\treturn { tick: world.tick, players, entities }\n}\n\n/**\n * Something that happened in the rules, as the event log keeps it\n *\n * @beta\n */\nexport interface LoggedEvent {\n\t/** In the order they were logged, for asking for what came after */\n\tseq: number\n\t/** The tick it happened in */\n\ttick: number\n\t/** Whether it is an engine `event` or a `hook` */\n\tkind: 'event' | 'hook'\n\t/** The engine's name for it, or a game's id */\n\tname: string\n\t/** One of the game's own, rather than the engine's */\n\town: boolean\n\t/** What it said, plain data. For a hook, what the first run of it in the tick was given */\n\tdetail?: unknown\n\t/** The listeners that ran on an event, or the handlers of a hook */\n\tran: string[]\n\t/** How many times a hook ran in the tick */\n\tcount?: number\n}\n\n/**\n * What a world tells whoever follows it of the rules as they run, see `World.trace`\n *\n * @beta\n */\nexport interface Trace {\n\t/** A hook with handlers ran. `own`: a hook of the game's */\n\thook(name: string, handlers: readonly { id: string }[], own: boolean, event: unknown): void\n\t/** A listener of the game is about to run, on the event going out */\n\tlistener(id: string): void\n}\n\n/**\n * The events and hooks of the last seconds of a world, the game's own among them, with the listeners and handlers\n * that ran on them. Hooks run often (every target search asks one), so a hook is one line a tick, with how many times.\n * Following costs a little: it is only on while `attach`ed\n *\n * @beta\n */\nexport class EventLog implements Trace {\n\tprivate readonly list: LoggedEvent[] = []\n\tprivate seq = 0\n\t/** The hooks of the tick going on, by name */\n\tprivate hooks = new Map<string, LoggedEvent>()\n\tprivate hooksAt = -1\n\t/** The event going out, which listeners that run belong to */\n\tprivate current: LoggedEvent | null = null\n\tprivate world: World | null = null\n\tprivate untap: (() => void) | null = null\n\n\tconstructor(\n\t\t/** Seconds of it that are kept */\n\t\treadonly seconds = 10,\n\t\t/** Lines kept at most, however short a time they took */\n\t\treadonly max = 2000\n\t) {}\n\n\t/** Starts following a world */\n\tattach(world: World): void {\n\t\tthis.detach()\n\t\tthis.world = world\n\t\tworld.trace = this\n\t\tthis.untap = world.events.tap((type, payload) => this.event(type, payload))\n\t}\n\n\t/** Stops following it. What was logged stays */\n\tdetach(): void {\n\t\tconst { world } = this\n\t\tif (!world) return\n\t\tif (world.trace === this) world.trace = null\n\t\tthis.untap?.()\n\t\tthis.untap = null\n\t\tthis.world = null\n\t\tthis.current = null\n\t}\n\n\t/** Whether the log is attached to a world, following what happens in it */\n\tget attached(): boolean {\n\t\treturn this.world !== null\n\t}\n\n\t/** What was logged, oldest first. The same list, kept up to date: to read, not to keep */\n\tget entries(): readonly LoggedEvent[] {\n\t\treturn this.list\n\t}\n\n\t/** Empties the log and the hooks it is counting for the current tick */\n\tclear(): void {\n\t\tthis.list.length = 0\n\t\tthis.hooks.clear()\n\t}\n\n\tprivate event(type: PropertyKey, payload: unknown): void {\n\t\tconst world = this.world!\n\t\t// what is held for the end of a tick goes out once the tick is counted\n\t\tconst tick = world.events.releasing ? world.tick - 1 : world.tick\n\t\tconst name = String(type)\n\t\tthis.current = this.add({ tick, kind: 'event', name, own: isGameEvent(name), detail: summarize(payload, 1), ran: [] })\n\t}\n\n\t/** Notes that the listener with this id ran on the event going out; part of `Trace` */\n\tlistener(id: string): void {\n\t\tthis.current?.ran.push(id)\n\t}\n\n\t/** Notes that the hook ran, with the ids of its handlers and whether it is a game's own; a hook run again in the same tick only adds to its count */\n\thook(name: string, handlers: readonly { id: string }[], own: boolean, event: unknown): void {\n\t\tconst { tick } = this.world!\n\t\tif (tick !== this.hooksAt) {\n\t\t\tthis.hooks.clear()\n\t\t\tthis.hooksAt = tick\n\t\t}\n\t\tconst known = this.hooks.get(name)\n\t\tif (known) {\n\t\t\tknown.count!++\n\t\t\treturn\n\t\t}\n\t\tconst entry = this.add({ tick, kind: 'hook', name, own, detail: summarize(event, 1), ran: handlers.map((handler) => handler.id), count: 1 })\n\t\tthis.hooks.set(name, entry)\n\t}\n\n\tprivate add(entry: Omit<LoggedEvent, 'seq'>): LoggedEvent {\n\t\tconst logged = { seq: ++this.seq, ...entry }\n\t\tthis.list.push(logged)\n\t\tconst oldest = logged.tick - this.seconds * this.world!.tickRate\n\t\tlet drop = 0\n\t\twhile (drop < this.list.length && (this.list.length - drop > this.max || this.list[drop].tick < oldest)) drop++\n\t\tif (drop) this.list.splice(0, drop)\n\t\treturn logged\n\t}\n}\n"],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  import type { Entity, ItemInstance } from './entity';
2
2
  import type { InventoryInfo } from './session/protocol';
3
+ import type { World } from './world';
3
4
  /**
4
5
  * The slots of what a unit carries (`UnitTypeDef.inventory`), null for an empty one: set as it is spawned (and as its
5
6
  * type changes), for a type with slots. Sent to everyone who sees it as `InventoryInfo`: the items it carries, and to
@@ -14,5 +15,17 @@ export declare const inventorySlots: import("./components").Component<(ItemInsta
14
15
  * @beta
15
16
  */
16
17
  export declare const slotsOf: (entity: Entity) => (ItemInstance | null)[] | undefined;
17
- /** @beta */
18
+ /**
19
+ * The index of the first free slot of the entity's inventory, or -1 when it has none or no inventory
20
+ *
21
+ * @beta
22
+ */
18
23
  export declare const freeSlot: (entity: Entity) => number;
24
+ /**
25
+ * The passives of what an entity carries (`ItemDef.passive`), by ability id, in slot order: those of items sharing a
26
+ * `unique` name once, the first carried (unless the game says otherwise, `ItemSettings.unique`). What the abilities
27
+ * system keeps up and the triggers go by
28
+ *
29
+ * @beta
30
+ */
31
+ export declare function carriedPassives(world: World, entity: Entity): readonly string[];
@@ -0,0 +1,84 @@
1
+ import { defineComponent } from "./components.js";
2
+ //#region src/inventory.ts
3
+ /**
4
+ * What a unit carries (`UnitTypeDef.inventory`): its slots of items, the component the stats, the abilities and the
5
+ * shops read. Here alone, of nothing but components, so that what reads it (the stats, on every hit) loads nothing of
6
+ * the shops (`items.ts`)
7
+ */
8
+ /**
9
+ * The slots of what a unit carries (`UnitTypeDef.inventory`), null for an empty one: set as it is spawned (and as its
10
+ * type changes), for a type with slots. Sent to everyone who sees it as `InventoryInfo`: the items it carries, and to
11
+ * its owner and their allies the slots, for commands
12
+ *
13
+ * @beta
14
+ */
15
+ var inventorySlots = defineComponent({
16
+ id: "core.inventory",
17
+ refs: (slots) => ({ items: slots.flatMap((carried) => carried ? [carried.item] : []) }),
18
+ onSpawn: (entity) => {
19
+ if (entity.def.inventory) entity.set(inventorySlots, Array.from({ length: entity.def.inventory }, () => null));
20
+ },
21
+ replicate: "everyone",
22
+ snapshot(slots, _entity, { ally }) {
23
+ const items = [];
24
+ for (const slot of slots) if (slot) items.push(slot.item);
25
+ if (!ally) return items.length ? { items } : void 0;
26
+ return {
27
+ items,
28
+ slots: slots.map((slot) => slot && {
29
+ id: slot.id,
30
+ item: slot.item,
31
+ charges: slot.charges,
32
+ cooldown: slot.state?.cooldown ?? 0,
33
+ ...slot.state?.charges !== void 0 && { uses: slot.state.charges }
34
+ })
35
+ };
36
+ },
37
+ same: (a, b) => a.items.length === b.items.length && a.items.every((item, i) => item === b.items[i]) && a.slots === void 0 === (b.slots === void 0) && (!a.slots || a.slots.length === b.slots.length && a.slots.every((slot, i) => {
38
+ const other = b.slots[i];
39
+ return slot === other || !!slot && !!other && slot.id === other.id && slot.item === other.item && slot.charges === other.charges && slot.cooldown === other.cooldown && slot.uses === other.uses;
40
+ }))
41
+ });
42
+ /**
43
+ * The slots of what a unit carries, null for an empty one: none for a type that carries nothing (`inventorySlots`)
44
+ *
45
+ * @beta
46
+ */
47
+ var slotsOf = (entity) => entity.get(inventorySlots);
48
+ /**
49
+ * The index of the first free slot of the entity's inventory, or -1 when it has none or no inventory
50
+ *
51
+ * @beta
52
+ */
53
+ var freeSlot = (entity) => slotsOf(entity)?.findIndex((slot) => slot === null) ?? -1;
54
+ /** What carries no passive carries: one list for all of them */
55
+ var NONE = Object.freeze([]);
56
+ /**
57
+ * The passives of what an entity carries (`ItemDef.passive`), by ability id, in slot order: those of items sharing a
58
+ * `unique` name once, the first carried (unless the game says otherwise, `ItemSettings.unique`). What the abilities
59
+ * system keeps up and the triggers go by
60
+ *
61
+ * @beta
62
+ */
63
+ function carriedPassives(world, entity) {
64
+ const slots = slotsOf(entity);
65
+ if (!slots) return NONE;
66
+ let out;
67
+ let seen;
68
+ const unique = world.settings.items.unique;
69
+ for (const instance of slots) {
70
+ if (!instance) continue;
71
+ const def = world.registry.item(instance.item);
72
+ if (!def.passive) continue;
73
+ if (unique && def.unique !== void 0) {
74
+ if (seen?.has(def.unique)) continue;
75
+ (seen ??= /* @__PURE__ */ new Set()).add(def.unique);
76
+ }
77
+ (out ??= []).push(def.passive);
78
+ }
79
+ return out ?? NONE;
80
+ }
81
+ //#endregion
82
+ export { carriedPassives, freeSlot, inventorySlots, slotsOf };
83
+
84
+ //# sourceMappingURL=inventory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inventory.js","names":[],"sources":["../src/inventory.ts"],"sourcesContent":["/**\n * What a unit carries (`UnitTypeDef.inventory`): its slots of items, the component the stats, the abilities and the\n * shops read. Here alone, of nothing but components, so that what reads it (the stats, on every hit) loads nothing of\n * the shops (`items.ts`)\n */\nimport { defineComponent } from './components'\nimport type { Entity, ItemInstance } from './entity'\nimport type { CarriedItem, InventoryInfo } from './session/protocol'\nimport type { World } from './world'\n\n/**\n * The slots of what a unit carries (`UnitTypeDef.inventory`), null for an empty one: set as it is spawned (and as its\n * type changes), for a type with slots. Sent to everyone who sees it as `InventoryInfo`: the items it carries, and to\n * its owner and their allies the slots, for commands\n *\n * @beta\n */\nexport const inventorySlots = defineComponent<(ItemInstance | null)[], InventoryInfo>({ id: 'core.inventory', refs: (slots) => ({ items: (slots as (ItemInstance | null)[]).flatMap((carried) => (carried ? [carried.item] : [])) }),\n\t// its slots, empty, for a type that carries\n\tonSpawn: (entity) => {\n\t\tif (entity.def.inventory)\n\t\t\tentity.set(\n\t\t\t\tinventorySlots,\n\t\t\t\tArray.from({ length: entity.def.inventory }, () => null)\n\t\t\t)\n\t},\n\treplicate: 'everyone',\n\tsnapshot(slots, _entity, { ally }) {\n\t\tconst items: string[] = []\n\t\tfor (const slot of slots) if (slot) items.push(slot.item)\n\t\tif (!ally) return items.length ? { items } : undefined\n\t\treturn {\n\t\t\titems,\n\t\t\tslots: slots.map(\n\t\t\t\t(slot): CarriedItem | null =>\n\t\t\t\t\tslot && {\n\t\t\t\t\t\tid: slot.id,\n\t\t\t\t\t\titem: slot.item,\n\t\t\t\t\t\tcharges: slot.charges,\n\t\t\t\t\t\tcooldown: slot.state?.cooldown ?? 0,\n\t\t\t\t\t\t...(slot.state?.charges !== undefined && { uses: slot.state.charges })\n\t\t\t\t\t}\n\t\t\t)\n\t\t}\n\t},\n\tsame: (a, b) =>\n\t\ta.items.length === b.items.length &&\n\t\ta.items.every((item, i) => item === b.items[i]) &&\n\t\t(a.slots === undefined) === (b.slots === undefined) &&\n\t\t(!a.slots ||\n\t\t\t(a.slots.length === b.slots!.length &&\n\t\t\t\ta.slots.every((slot, i) => {\n\t\t\t\t\tconst other = b.slots![i]\n\t\t\t\t\treturn (\n\t\t\t\t\t\tslot === other ||\n\t\t\t\t\t\t(!!slot &&\n\t\t\t\t\t\t\t!!other &&\n\t\t\t\t\t\t\tslot.id === other.id &&\n\t\t\t\t\t\t\tslot.item === other.item &&\n\t\t\t\t\t\t\tslot.charges === other.charges &&\n\t\t\t\t\t\t\tslot.cooldown === other.cooldown &&\n\t\t\t\t\t\t\tslot.uses === other.uses)\n\t\t\t\t\t)\n\t\t\t\t}))) })\n\n/**\n * The slots of what a unit carries, null for an empty one: none for a type that carries nothing (`inventorySlots`)\n *\n * @beta\n */\nexport const slotsOf = (entity: Entity): (ItemInstance | null)[] | undefined => entity.get(inventorySlots)\n\n/**\n * The index of the first free slot of the entity's inventory, or -1 when it has none or no inventory\n *\n * @beta\n */\nexport const freeSlot = (entity: Entity) => slotsOf(entity)?.findIndex((slot) => slot === null) ?? -1\n\n/** What carries no passive carries: one list for all of them */\nconst NONE: readonly string[] = Object.freeze([])\n\n/**\n * The passives of what an entity carries (`ItemDef.passive`), by ability id, in slot order: those of items sharing a\n * `unique` name once, the first carried (unless the game says otherwise, `ItemSettings.unique`). What the abilities\n * system keeps up and the triggers go by\n *\n * @beta\n */\nexport function carriedPassives(world: World, entity: Entity): readonly string[] {\n\t// asked of every unit on every hit and every upkeep: what carries no passive makes no list\n\tconst slots = slotsOf(entity)\n\tif (!slots) return NONE\n\tlet out: string[] | undefined\n\tlet seen: Set<string> | undefined\n\tconst unique = world.settings.items.unique\n\tfor (const instance of slots) {\n\t\tif (!instance) continue\n\t\tconst def = world.registry.item(instance.item)\n\t\tif (!def.passive) continue\n\t\tif (unique && def.unique !== undefined) {\n\t\t\tif (seen?.has(def.unique)) continue\n\t\t\t;(seen ??= new Set()).add(def.unique)\n\t\t}\n\t\t;(out ??= []).push(def.passive)\n\t}\n\treturn out ?? NONE\n}\n"],"mappings":";;;;;;;;;;;;;;AAiBA,IAAa,iBAAiB,gBAAwD;CAAE,IAAI;CAAkB,OAAO,WAAW,EAAE,OAAQ,MAAkC,SAAS,YAAa,UAAU,CAAC,QAAQ,IAAI,IAAI,CAAC,CAAE,EAAE;CAEjO,UAAU,WAAW;EACpB,IAAI,OAAO,IAAI,WACd,OAAO,IACN,gBACA,MAAM,KAAK,EAAE,QAAQ,OAAO,IAAI,UAAU,SAAS,IAAI,CACxD;CACF;CACA,WAAW;CACX,SAAS,OAAO,SAAS,EAAE,QAAQ;EAClC,MAAM,QAAkB,CAAC;EACzB,KAAK,MAAM,QAAQ,OAAO,IAAI,MAAM,MAAM,KAAK,KAAK,IAAI;EACxD,IAAI,CAAC,MAAM,OAAO,MAAM,SAAS,EAAE,MAAM,IAAI,KAAA;EAC7C,OAAO;GACN;GACA,OAAO,MAAM,KACX,SACA,QAAQ;IACP,IAAI,KAAK;IACT,MAAM,KAAK;IACX,SAAS,KAAK;IACd,UAAU,KAAK,OAAO,YAAY;IAClC,GAAI,KAAK,OAAO,YAAY,KAAA,KAAa,EAAE,MAAM,KAAK,MAAM,QAAQ;GACrE,CACF;EACD;CACD;CACA,OAAO,GAAG,MACT,EAAE,MAAM,WAAW,EAAE,MAAM,UAC3B,EAAE,MAAM,OAAO,MAAM,MAAM,SAAS,EAAE,MAAM,EAAE,KAC7C,EAAE,UAAU,KAAA,OAAgB,EAAE,UAAU,KAAA,OACxC,CAAC,EAAE,SACF,EAAE,MAAM,WAAW,EAAE,MAAO,UAC5B,EAAE,MAAM,OAAO,MAAM,MAAM;EAC1B,MAAM,QAAQ,EAAE,MAAO;EACvB,OACC,SAAS,SACR,CAAC,CAAC,QACF,CAAC,CAAC,SACF,KAAK,OAAO,MAAM,MAClB,KAAK,SAAS,MAAM,QACpB,KAAK,YAAY,MAAM,WACvB,KAAK,aAAa,MAAM,YACxB,KAAK,SAAS,MAAM;CAEvB,CAAC;AAAI,CAAC;;;;;;AAOV,IAAa,WAAW,WAAwD,OAAO,IAAI,cAAc;;;;;;AAOzG,IAAa,YAAY,WAAmB,QAAQ,MAAM,CAAC,EAAE,WAAW,SAAS,SAAS,IAAI,KAAK;;AAGnG,IAAM,OAA0B,OAAO,OAAO,CAAC,CAAC;;;;;;;;AAShD,SAAgB,gBAAgB,OAAc,QAAmC;CAEhF,MAAM,QAAQ,QAAQ,MAAM;CAC5B,IAAI,CAAC,OAAO,OAAO;CACnB,IAAI;CACJ,IAAI;CACJ,MAAM,SAAS,MAAM,SAAS,MAAM;CACpC,KAAK,MAAM,YAAY,OAAO;EAC7B,IAAI,CAAC,UAAU;EACf,MAAM,MAAM,MAAM,SAAS,KAAK,SAAS,IAAI;EAC7C,IAAI,CAAC,IAAI,SAAS;EAClB,IAAI,UAAU,IAAI,WAAW,KAAA,GAAW;GACvC,IAAI,MAAM,IAAI,IAAI,MAAM,GAAG;GAC1B,CAAC,yBAAS,IAAI,IAAI,EAAA,CAAG,IAAI,IAAI,MAAM;EACrC;EACC,CAAC,QAAQ,CAAC,EAAA,CAAG,KAAK,IAAI,OAAO;CAC/B;CACA,OAAO,OAAO;AACf"}
package/dist/items.d.ts CHANGED
@@ -1,34 +1,106 @@
1
+ import type { Cost, ItemDef, ItemTier } from './defs';
1
2
  import type { Entity, ItemInstance, Placed, StockState } from './entity';
2
- import type { StockInfo } from './session/protocol';
3
+ import type { PurchaseInfo, StockInfo } from './session/protocol';
3
4
  import { type Vec2 } from './math';
4
5
  import type { World } from './world';
6
+ import { type Message } from './messages';
7
+ import type { Registry } from './registry';
5
8
  /**
6
9
  * An item lying on the ground
7
10
  *
8
11
  * @beta
9
12
  */
10
13
  export interface GroundItem {
14
+ /** The item instance's id, kept when it is picked up again */
11
15
  id: number;
16
+ /** The item type's id */
12
17
  item: string;
18
+ /** How many charges the item has left */
13
19
  charges: number;
20
+ /** The item's place on the map's x axis */
14
21
  x: number;
22
+ /** The item's place on the map's z axis */
15
23
  z: number;
16
24
  }
17
- /** @beta */
25
+ /**
26
+ * Makes an instance of an item type with an id of its own, with the charges given or those of the type (0 when it has none)
27
+ *
28
+ * @beta
29
+ */
18
30
  export declare function createItem(world: World, item: string, charges?: number): ItemInstance;
19
31
  /**
20
- * Puts an item into the first free slot. False when there is none
32
+ * The tier of an item, `epic` (the old word) read as `intermediate`: what the registry keeps of it (`ItemTier`)
33
+ *
34
+ * @beta
35
+ */
36
+ export declare function itemTier(def: Pick<ItemDef, 'tier'>): ItemTier | undefined;
37
+ /**
38
+ * The items of the game with a tag (`ItemDef.tags`), in the game's order: `itemsTagged(registry, 'lifesteal')`
39
+ *
40
+ * @beta
41
+ */
42
+ export declare function itemsTagged(registry: Pick<Registry, 'items'>, tag: string): ItemDef[];
43
+ /**
44
+ * The most of an item's group one carrier may have (`ItemDef.group`): the item's own limit, the game's of the group
45
+ * (`ItemSettings.groups`), or 1. No limit for an item of no group
46
+ *
47
+ * @beta
48
+ */
49
+ export declare function groupLimitOf(world: World, def: ItemDef): number;
50
+ /**
51
+ * Whether the entity has room for an item: a free slot, or a stack of it with room (`ItemDef.stack`)
52
+ *
53
+ * @beta
54
+ */
55
+ export declare function hasRoomFor(world: World, entity: Entity, item: string, charges?: number): boolean;
56
+ /**
57
+ * Why a carrier may not take an item, or nothing when it may: one more of its group than it may carry (`ItemDef.group`),
58
+ * or what the game's own rule says (`ItemSettings.mayCarry`). `uses`, the parts buying it uses up, by id: they go out as
59
+ * it comes in. `handed`: it is handed over, and the words say "they". Asked as an item is bought, picked up or handed
60
+ * over; room in the inventory is asked apart (`hasRoomFor`)
61
+ *
62
+ * @beta
63
+ */
64
+ export declare function carryRefusal(world: World, carrier: Entity, item: string, uses?: readonly string[], handed?: boolean): Message | undefined;
65
+ /**
66
+ * Why one who carries these items (by id) may not take one more of an item's group (`ItemDef.group`), or nothing when
67
+ * it may: the engine's part of `carryRefusal`, which a screen asks too, with the game's registry alone, to say so before
68
+ * the buy (the shop window). `uses` are the parts buying it uses up: they go out as it comes in, so they are not
69
+ * counted. The limit is the item's own, the game's of the group (`ItemSettings.groups`), or 1
70
+ *
71
+ * @beta
72
+ */
73
+ export declare function groupRefusal(registry: Pick<Registry, 'items' | 'settings'>, carried: readonly string[], item: string, uses?: readonly string[], handed?: boolean): Message | undefined;
74
+ /**
75
+ * Puts an item into the inventory: into a stack of it with room (`ItemDef.stack`, its charges added), or the first free
76
+ * slot. False when there is neither. The engine's rules of what may be carried are asked before (`carryRefusal`)
21
77
  *
22
78
  * @beta
23
79
  */
24
80
  export declare function giveItem(world: World, entity: Entity, instance: ItemInstance): boolean;
25
- /** @beta */
81
+ /**
82
+ * Takes the item instance with this id out of the entity's inventory and returns it; undefined when it does not carry it
83
+ *
84
+ * @beta
85
+ */
26
86
  export declare function takeItem(world: World, entity: Entity, instanceId: number): ItemInstance | undefined;
27
- /** @beta */
87
+ /**
88
+ * Finds the item instance with this id in the entity's inventory; undefined when it is not there or no id is given
89
+ *
90
+ * @beta
91
+ */
28
92
  export declare function findItem(entity: Entity, instanceId: number | undefined): ItemInstance | undefined;
29
- /** @beta */
93
+ /**
94
+ * Puts the item on the ground at the closest walkable point to `at`, tells the game (`itemDropped`) and returns the ground item
95
+ *
96
+ * @beta
97
+ */
30
98
  export declare function dropOnGround(world: World, instance: ItemInstance, at: Vec2): GroundItem;
31
- /** @beta */
99
+ /**
100
+ * Has the entity pick up the item lying on the ground by its id; returns false when none is there, no slot is free or `beforePickUp` refuses
101
+ *
102
+ * @beta
103
+ */
32
104
  export declare function pickUp(world: World, entity: Entity, groundId: number): boolean;
33
105
  /**
34
106
  * One use of an item that has charges. The last one takes the item with it
@@ -71,6 +143,62 @@ export declare function shopper(world: World, shop: Entity, player: number, item
71
143
  * @beta
72
144
  */
73
145
  export declare function buy(world: World, shop: Entity, item: string, player: number, buyer?: Entity): boolean;
146
+ /**
147
+ * A purchase that may still be undone (`undoBuy`), kept on the buyer (`purchases`) for `ShopSettings.undo` seconds
148
+ * while it stands at the shop and has not used the item
149
+ *
150
+ * @beta
151
+ */
152
+ export interface Purchase {
153
+ /** The purchase's id: the id of the item instance bought (what `undoBuy` names it by) */
154
+ id: number;
155
+ /** The item type's id */
156
+ item: string;
157
+ /** The shop it was bought at: the buyer has to be there still */
158
+ shop: number;
159
+ /** The game's time it was bought at */
160
+ at: number;
161
+ /** What was paid, given back whole */
162
+ paid: Cost;
163
+ /** The charges the item had as bought, or the stack had with it: fewer, and it was used */
164
+ charges: number;
165
+ /** The stack it went into (its instance id), when it was stacked onto one carried rather than put in a slot of its own */
166
+ into?: number;
167
+ /** The parts it used up, as they were, to come back */
168
+ used: ItemInstance[];
169
+ /** Whether the shop counted it off its stock, to count it back */
170
+ stocked: boolean;
171
+ }
172
+ /**
173
+ * The purchases a hero may still undo (`Purchase`, `undoBuy`): kept on the buyer, sent to its player (`PurchaseInfo`:
174
+ * each with the seconds left to undo it), dropped as they run out, as the hero leaves the shop or as the item is used
175
+ * (`expirePurchases`, the abilities system's every tick)
176
+ *
177
+ * @beta
178
+ */
179
+ export declare const purchases: import("./components").Component<Purchase[], PurchaseInfo[]>;
180
+ /**
181
+ * Whether a purchase may still be undone (`undoBuy`): within `ShopSettings.undo` seconds of it, the buyer alive and at
182
+ * the shop still, the shop standing, the item carried with its charges as bought and its ability not used
183
+ *
184
+ * @beta
185
+ */
186
+ export declare function undoable(world: World, entity: Entity, purchase: Purchase): boolean;
187
+ /**
188
+ * Why a purchase of the hero's may not be undone, or nothing when it may: nothing to undo (none within the time, the
189
+ * hero away from the shop, the item used), or no room for the parts to come back
190
+ *
191
+ * @beta
192
+ */
193
+ export declare function undoRefusal(world: World, entity: Entity, purchaseId?: number): Message | undefined;
194
+ /**
195
+ * Takes a purchase back (`ShopSettings.undo`): the latest the hero may still undo, or the one named by its id. The
196
+ * item goes (out of its stack, where it went into one), what it cost comes back whole, the parts it used up come back
197
+ * as they were, and the shop has it back in stock. False, and the player told why, where it cannot (`undoRefusal`)
198
+ *
199
+ * @beta
200
+ */
201
+ export declare function undoBuy(world: World, entity: Entity, purchaseId?: number): boolean;
74
202
  /**
75
203
  * Whether a shop the player can trade with is close enough to the entity
76
204
  *
@@ -88,4 +216,4 @@ export declare function dropLoot(world: World, entity: Entity, killer?: Entity):
88
216
  /** An item picked up, to those who see who picked it */
89
217
  export declare const toldPicked: import("./replication").ReplicatedEvent;
90
218
  /** The items on the ground where the player sees (`Snapshot.items`) */
91
- export declare const itemsPart: import("./replication").SnapshotPart<keyof import(".").Snapshot>;
219
+ export declare const itemsPart: import("./replication").SnapshotField<keyof import(".").Snapshot>;