@v12-engine/engine 0.1.1 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (951) hide show
  1. package/dist/abilities/amounts.d.ts +28 -0
  2. package/dist/abilities/amounts.js +74 -0
  3. package/dist/abilities/amounts.js.map +1 -0
  4. package/dist/abilities/buffs.d.ts +106 -6
  5. package/dist/abilities/buffs.js +443 -0
  6. package/dist/abilities/buffs.js.map +1 -0
  7. package/dist/abilities/castTold.d.ts +2 -0
  8. package/dist/abilities/castTold.js +66 -0
  9. package/dist/abilities/castTold.js.map +1 -0
  10. package/dist/abilities/chance.d.ts +38 -0
  11. package/dist/abilities/chance.js +77 -0
  12. package/dist/abilities/chance.js.map +1 -0
  13. package/dist/abilities/charges.d.ts +18 -0
  14. package/dist/abilities/charges.js +101 -0
  15. package/dist/abilities/charges.js.map +1 -0
  16. package/dist/abilities/control.d.ts +28 -0
  17. package/dist/abilities/control.js +113 -0
  18. package/dist/abilities/control.js.map +1 -0
  19. package/dist/abilities/dispel.js +51 -0
  20. package/dist/abilities/dispel.js.map +1 -0
  21. package/dist/abilities/effectFields.d.ts +1 -1
  22. package/dist/abilities/effectFields.js +676 -0
  23. package/dist/abilities/effectFields.js.map +1 -0
  24. package/dist/abilities/effectIndex.d.ts +27 -0
  25. package/dist/abilities/effectIndex.js +64 -0
  26. package/dist/abilities/effectIndex.js.map +1 -0
  27. package/dist/abilities/effects/buff.d.ts +9 -3
  28. package/dist/abilities/effects/buff.js +84 -0
  29. package/dist/abilities/effects/buff.js.map +1 -0
  30. package/dist/abilities/effects/conditions.d.ts +2 -0
  31. package/dist/abilities/effects/conditions.js +41 -0
  32. package/dist/abilities/effects/conditions.js.map +1 -0
  33. package/dist/abilities/effects/core.js +54 -0
  34. package/dist/abilities/effects/core.js.map +1 -0
  35. package/dist/abilities/effects/damage.d.ts +1 -1
  36. package/dist/abilities/effects/damage.js +43 -0
  37. package/dist/abilities/effects/damage.js.map +1 -0
  38. package/dist/abilities/effects/heal.d.ts +2 -2
  39. package/dist/abilities/effects/heal.js +51 -0
  40. package/dist/abilities/effects/heal.js.map +1 -0
  41. package/dist/abilities/effects/missile.d.ts +13 -1
  42. package/dist/abilities/effects/missile.js +104 -0
  43. package/dist/abilities/effects/missile.js.map +1 -0
  44. package/dist/abilities/effects/morph.d.ts +5 -0
  45. package/dist/abilities/effects/morph.js +43 -0
  46. package/dist/abilities/effects/morph.js.map +1 -0
  47. package/dist/abilities/effects/moves.d.ts +16 -4
  48. package/dist/abilities/effects/moves.js +212 -0
  49. package/dist/abilities/effects/moves.js.map +1 -0
  50. package/dist/abilities/effects/passives.d.ts +19 -9
  51. package/dist/abilities/effects/passives.js +131 -0
  52. package/dist/abilities/effects/passives.js.map +1 -0
  53. package/dist/abilities/effects/proxy.d.ts +5 -0
  54. package/dist/abilities/effects/proxy.js +60 -0
  55. package/dist/abilities/effects/proxy.js.map +1 -0
  56. package/dist/abilities/effects/sight.d.ts +2 -2
  57. package/dist/abilities/effects/sight.js +39 -0
  58. package/dist/abilities/effects/sight.js.map +1 -0
  59. package/dist/abilities/effects/spawn.d.ts +5 -2
  60. package/dist/abilities/effects/spawn.js +40 -0
  61. package/dist/abilities/effects/spawn.js.map +1 -0
  62. package/dist/abilities/effects/timed.d.ts +2 -2
  63. package/dist/abilities/effects/timed.js +96 -0
  64. package/dist/abilities/effects/timed.js.map +1 -0
  65. package/dist/abilities/effects/trade.d.ts +1 -1
  66. package/dist/abilities/effects/trade.js +25 -0
  67. package/dist/abilities/effects/trade.js.map +1 -0
  68. package/dist/abilities/effects.d.ts +97 -23
  69. package/dist/abilities/effects.js +860 -0
  70. package/dist/abilities/effects.js.map +1 -0
  71. package/dist/abilities/land.d.ts +38 -4
  72. package/dist/abilities/land.js +189 -0
  73. package/dist/abilities/land.js.map +1 -0
  74. package/dist/abilities/recast.d.ts +45 -0
  75. package/dist/abilities/recast.js +118 -0
  76. package/dist/abilities/recast.js.map +1 -0
  77. package/dist/abilities/scaled.js +40 -0
  78. package/dist/abilities/scaled.js.map +1 -0
  79. package/dist/abilities/screen.d.ts +6 -0
  80. package/dist/abilities/screen.js +83 -0
  81. package/dist/abilities/screen.js.map +1 -0
  82. package/dist/abilities/shapes.d.ts +66 -0
  83. package/dist/abilities/shapes.js +122 -0
  84. package/dist/abilities/shapes.js.map +1 -0
  85. package/dist/abilities/text.d.ts +14 -2
  86. package/dist/abilities/text.js +204 -0
  87. package/dist/abilities/text.js.map +1 -0
  88. package/dist/abilities/triggers.d.ts +98 -0
  89. package/dist/abilities/triggers.js +351 -0
  90. package/dist/abilities/triggers.js.map +1 -0
  91. package/dist/abilityChanges.d.ts +131 -0
  92. package/dist/abilityChanges.js +345 -0
  93. package/dist/abilityChanges.js.map +1 -0
  94. package/dist/ai/area.d.ts +4 -1
  95. package/dist/ai/brain.d.ts +4 -1
  96. package/dist/ai/brain.js +844 -0
  97. package/dist/ai/brain.js.map +1 -0
  98. package/dist/ai/budget.js +74 -0
  99. package/dist/ai/budget.js.map +1 -0
  100. package/dist/ai/checks.d.ts +9 -1
  101. package/dist/ai/checks.js +242 -0
  102. package/dist/ai/checks.js.map +1 -0
  103. package/dist/ai/computer.d.ts +11 -4
  104. package/dist/ai/computer.js +251 -0
  105. package/dist/ai/computer.js.map +1 -0
  106. package/dist/ai/defence.d.ts +4 -0
  107. package/dist/ai/defence.js +430 -0
  108. package/dist/ai/defence.js.map +1 -0
  109. package/dist/ai/define.d.ts +3 -2
  110. package/dist/ai/define.js +31 -0
  111. package/dist/ai/define.js.map +1 -0
  112. package/dist/ai/economy.d.ts +10 -7
  113. package/dist/ai/economy.js +780 -0
  114. package/dist/ai/economy.js.map +1 -0
  115. package/dist/ai/geometry.js +38 -0
  116. package/dist/ai/geometry.js.map +1 -0
  117. package/dist/ai/goals.d.ts +1 -0
  118. package/dist/ai/goals.js +560 -0
  119. package/dist/ai/goals.js.map +1 -0
  120. package/dist/ai/knowledge.d.ts +72 -7
  121. package/dist/ai/knowledge.js +804 -0
  122. package/dist/ai/knowledge.js.map +1 -0
  123. package/dist/ai/lanes.d.ts +10 -2
  124. package/dist/ai/lanes.js +715 -0
  125. package/dist/ai/lanes.js.map +1 -0
  126. package/dist/ai/melee/build.js +264 -0
  127. package/dist/ai/melee/build.js.map +1 -0
  128. package/dist/ai/melee/goals.d.ts +7 -0
  129. package/dist/ai/melee/goals.js +720 -0
  130. package/dist/ai/melee/goals.js.map +1 -0
  131. package/dist/ai/melee/heroes.js +68 -0
  132. package/dist/ai/melee/heroes.js.map +1 -0
  133. package/dist/ai/melee/index.d.ts +1 -1
  134. package/dist/ai/melee/index.js +51 -0
  135. package/dist/ai/melee/index.js.map +1 -0
  136. package/dist/ai/melee/production.js +29 -0
  137. package/dist/ai/melee/production.js.map +1 -0
  138. package/dist/ai/melee/surrender.js +64 -0
  139. package/dist/ai/melee/surrender.js.map +1 -0
  140. package/dist/ai/micro.d.ts +9 -0
  141. package/dist/ai/micro.js +1316 -0
  142. package/dist/ai/micro.js.map +1 -0
  143. package/dist/ai/mission.d.ts +9 -2
  144. package/dist/ai/mission.js +538 -0
  145. package/dist/ai/mission.js.map +1 -0
  146. package/dist/ai/missionRules.d.ts +1 -1
  147. package/dist/ai/missionRules.js +26 -0
  148. package/dist/ai/missionRules.js.map +1 -0
  149. package/dist/ai/module.d.ts +6 -2
  150. package/dist/ai/module.js +37 -0
  151. package/dist/ai/module.js.map +1 -0
  152. package/dist/ai/options.d.ts +3 -3
  153. package/dist/ai/plans/build.d.ts +20 -1
  154. package/dist/ai/plans/build.js +608 -0
  155. package/dist/ai/plans/build.js.map +1 -0
  156. package/dist/ai/plans/placement.d.ts +4 -1
  157. package/dist/ai/plans/placement.js +295 -0
  158. package/dist/ai/plans/placement.js.map +1 -0
  159. package/dist/ai/plans/plans.d.ts +9 -0
  160. package/dist/ai/plans/plans.js +110 -0
  161. package/dist/ai/plans/plans.js.map +1 -0
  162. package/dist/ai/plans/production.d.ts +14 -2
  163. package/dist/ai/plans/production.js +434 -0
  164. package/dist/ai/plans/production.js.map +1 -0
  165. package/dist/ai/plans/purse.d.ts +6 -3
  166. package/dist/ai/plans/purse.js +139 -0
  167. package/dist/ai/plans/purse.js.map +1 -0
  168. package/dist/ai/plans/tech.d.ts +6 -0
  169. package/dist/ai/plans/tech.js +122 -0
  170. package/dist/ai/plans/tech.js.map +1 -0
  171. package/dist/ai/profiles.d.ts +4 -4
  172. package/dist/{profiles-B3NS9jwk.js → ai/profiles.js} +3 -98
  173. package/dist/ai/profiles.js.map +1 -0
  174. package/dist/ai/reach.js +54 -0
  175. package/dist/ai/reach.js.map +1 -0
  176. package/dist/ai/report.d.ts +8 -0
  177. package/dist/ai/report.js +87 -0
  178. package/dist/ai/report.js.map +1 -0
  179. package/dist/ai/roles.d.ts +4 -0
  180. package/dist/ai/roles.js +207 -0
  181. package/dist/ai/roles.js.map +1 -0
  182. package/dist/ai/rules.d.ts +8 -2
  183. package/dist/ai/rules.js +416 -0
  184. package/dist/ai/rules.js.map +1 -0
  185. package/dist/ai/scouting.d.ts +6 -0
  186. package/dist/ai/scouting.js +324 -0
  187. package/dist/ai/scouting.js.map +1 -0
  188. package/dist/ai/settings.js +99 -0
  189. package/dist/ai/settings.js.map +1 -0
  190. package/dist/ai/squads.d.ts +21 -2
  191. package/dist/ai/squads.js +916 -0
  192. package/dist/ai/squads.js.map +1 -0
  193. package/dist/ai/strength.js +320 -0
  194. package/dist/ai/strength.js.map +1 -0
  195. package/dist/ai/task.d.ts +3 -1
  196. package/dist/ai/task.js +17 -0
  197. package/dist/ai/task.js.map +1 -0
  198. package/dist/ai/tasks/attack.js +24 -0
  199. package/dist/ai/tasks/attack.js.map +1 -0
  200. package/dist/ai/tasks/capture.d.ts +3 -3
  201. package/dist/ai/tasks/capture.js +37 -0
  202. package/dist/ai/tasks/capture.js.map +1 -0
  203. package/dist/ai/tasks/creep.js +29 -0
  204. package/dist/ai/tasks/creep.js.map +1 -0
  205. package/dist/ai/tasks/defend.js +61 -0
  206. package/dist/ai/tasks/defend.js.map +1 -0
  207. package/dist/ai/tasks/drop.js +81 -0
  208. package/dist/ai/tasks/drop.js.map +1 -0
  209. package/dist/ai/tasks/escort.js +59 -0
  210. package/dist/ai/tasks/escort.js.map +1 -0
  211. package/dist/ai/tasks/gather.js +48 -0
  212. package/dist/ai/tasks/gather.js.map +1 -0
  213. package/dist/ai/tasks/harass.js +39 -0
  214. package/dist/ai/tasks/harass.js.map +1 -0
  215. package/dist/ai/tasks/hold.js +32 -0
  216. package/dist/ai/tasks/hold.js.map +1 -0
  217. package/dist/ai/tasks/index.js +34 -0
  218. package/dist/ai/tasks/index.js.map +1 -0
  219. package/dist/ai/tasks/move.js +26 -0
  220. package/dist/ai/tasks/move.js.map +1 -0
  221. package/dist/ai/tasks/patrol.js +59 -0
  222. package/dist/ai/tasks/patrol.js.map +1 -0
  223. package/dist/ai/tasks/retreat.js +28 -0
  224. package/dist/ai/tasks/retreat.js.map +1 -0
  225. package/dist/ai/tasks/scout.js +73 -0
  226. package/dist/ai/tasks/scout.js.map +1 -0
  227. package/dist/ai/tasks/shared.d.ts +1 -1
  228. package/dist/ai/tasks/shared.js +137 -0
  229. package/dist/ai/tasks/shared.js.map +1 -0
  230. package/dist/ai/team.d.ts +18 -1
  231. package/dist/ai/team.js +492 -0
  232. package/dist/ai/team.js.map +1 -0
  233. package/dist/ai/threat.d.ts +6 -0
  234. package/dist/ai/threat.js +206 -0
  235. package/dist/ai/threat.js.map +1 -0
  236. package/dist/ai/view.d.ts +21 -7
  237. package/dist/ai/view.js +677 -0
  238. package/dist/ai/view.js.map +1 -0
  239. package/dist/ai/waves.d.ts +6 -0
  240. package/dist/ai/waves.js +410 -0
  241. package/dist/ai/waves.js.map +1 -0
  242. package/dist/ai.js +54 -6239
  243. package/dist/aiTesting.d.ts +6 -3
  244. package/dist/aiTesting.js +229 -0
  245. package/dist/aiTesting.js.map +1 -0
  246. package/dist/areas.d.ts +4 -1
  247. package/dist/areas.js +295 -0
  248. package/dist/areas.js.map +1 -0
  249. package/dist/attacks.d.ts +3 -3
  250. package/dist/attacks.js +127 -0
  251. package/dist/attacks.js.map +1 -0
  252. package/dist/burning.d.ts +267 -0
  253. package/dist/burning.js +795 -0
  254. package/dist/burning.js.map +1 -0
  255. package/dist/bytes.js +21 -0
  256. package/dist/bytes.js.map +1 -0
  257. package/dist/callings.d.ts +71 -0
  258. package/dist/callings.js +157 -0
  259. package/dist/callings.js.map +1 -0
  260. package/dist/cameraOrders.d.ts +78 -0
  261. package/dist/cameraOrders.js +114 -0
  262. package/dist/cameraOrders.js.map +1 -0
  263. package/dist/camps.d.ts +70 -4
  264. package/dist/camps.js +501 -0
  265. package/dist/camps.js.map +1 -0
  266. package/dist/capture.d.ts +15 -3
  267. package/dist/capture.js +304 -0
  268. package/dist/capture.js.map +1 -0
  269. package/dist/cellLayers.d.ts +78 -13
  270. package/dist/cellLayers.js +275 -0
  271. package/dist/cellLayers.js.map +1 -0
  272. package/dist/cellPatches.d.ts +24 -0
  273. package/dist/cellPatches.js +73 -0
  274. package/dist/cellPatches.js.map +1 -0
  275. package/dist/cinematics.d.ts +10 -5
  276. package/dist/cinematics.js +161 -0
  277. package/dist/cinematics.js.map +1 -0
  278. package/dist/clock.d.ts +2 -2
  279. package/dist/clock.js +78 -0
  280. package/dist/clock.js.map +1 -0
  281. package/dist/commands.d.ts +36 -4
  282. package/dist/commands.js +636 -0
  283. package/dist/commands.js.map +1 -0
  284. package/dist/components.d.ts +31 -10
  285. package/dist/components.js +74 -0
  286. package/dist/components.js.map +1 -0
  287. package/dist/computers.d.ts +4 -4
  288. package/dist/computers.js +194 -0
  289. package/dist/computers.js.map +1 -0
  290. package/dist/concealment.d.ts +25 -2
  291. package/dist/concealment.js +409 -0
  292. package/dist/concealment.js.map +1 -0
  293. package/dist/coreComponents.js +130 -0
  294. package/dist/coreComponents.js.map +1 -0
  295. package/dist/createGame.d.ts +306 -0
  296. package/dist/createGame.js +405 -0
  297. package/dist/createGame.js.map +1 -0
  298. package/dist/dashing.d.ts +18 -2
  299. package/dist/dashing.js +41 -0
  300. package/dist/dashing.js.map +1 -0
  301. package/dist/debug.d.ts +8 -0
  302. package/dist/debug.js +5 -3
  303. package/dist/debug2.js +76 -0
  304. package/dist/debug2.js.map +1 -0
  305. package/dist/debugCommands.d.ts +6 -6
  306. package/dist/debugCommands.js +537 -0
  307. package/dist/debugCommands.js.map +1 -0
  308. package/dist/debugging.d.ts +1 -0
  309. package/dist/defaultSets.d.ts +183 -0
  310. package/dist/defaultSets.js +216 -0
  311. package/dist/defaultSets.js.map +1 -0
  312. package/dist/definitions.d.ts +6 -0
  313. package/dist/definitions.js +78 -0
  314. package/dist/definitions.js.map +1 -0
  315. package/dist/defs.d.ts +1895 -165
  316. package/dist/defs.js +380 -0
  317. package/dist/defs.js.map +1 -0
  318. package/dist/denying.d.ts +4 -4
  319. package/dist/denying.js +106 -0
  320. package/dist/denying.js.map +1 -0
  321. package/dist/destructibles.d.ts +2 -2
  322. package/dist/destructibles.js +36 -0
  323. package/dist/destructibles.js.map +1 -0
  324. package/dist/determinism.d.ts +4 -4
  325. package/dist/determinism.js +247 -0
  326. package/dist/determinism.js.map +1 -0
  327. package/dist/dialog.d.ts +17 -2
  328. package/dist/dialog.js +108 -0
  329. package/dist/dialog.js.map +1 -0
  330. package/dist/effectRefs.js +28 -0
  331. package/dist/effectRefs.js.map +1 -0
  332. package/dist/effects.d.ts +27 -11
  333. package/dist/effects.js +110 -0
  334. package/dist/effects.js.map +1 -0
  335. package/dist/endings.d.ts +1 -1
  336. package/dist/endings.js +78 -0
  337. package/dist/endings.js.map +1 -0
  338. package/dist/engagement.d.ts +40 -6
  339. package/dist/engagement.js +530 -0
  340. package/dist/engagement.js.map +1 -0
  341. package/dist/engineEvents.d.ts +72 -9
  342. package/dist/engineEvents.js +520 -0
  343. package/dist/engineEvents.js.map +1 -0
  344. package/dist/entity.d.ts +275 -26
  345. package/dist/entity.js +441 -0
  346. package/dist/entity.js.map +1 -0
  347. package/dist/entityIndex.d.ts +10 -3
  348. package/dist/entityIndex.js +149 -0
  349. package/dist/entityIndex.js.map +1 -0
  350. package/dist/errors.d.ts +6 -2
  351. package/dist/errors.js +59 -0
  352. package/dist/errors.js.map +1 -0
  353. package/dist/events.d.ts +11 -5
  354. package/dist/events.js +158 -0
  355. package/dist/events.js.map +1 -0
  356. package/dist/exactMath.js +273 -0
  357. package/dist/exactMath.js.map +1 -0
  358. package/dist/features.d.ts +1 -1
  359. package/dist/features.js +127 -0
  360. package/dist/features.js.map +1 -0
  361. package/dist/fields.d.ts +25 -5
  362. package/dist/fields.js +140 -0
  363. package/dist/fields.js.map +1 -0
  364. package/dist/fixture.d.ts +3 -3
  365. package/dist/fixture.js +512 -0
  366. package/dist/fixture.js.map +1 -0
  367. package/dist/fog.d.ts +26 -3
  368. package/dist/fog.js +333 -0
  369. package/dist/fog.js.map +1 -0
  370. package/dist/foliage.d.ts +476 -0
  371. package/dist/foliage.js +1478 -0
  372. package/dist/foliage.js.map +1 -0
  373. package/dist/foliageDebug.d.ts +57 -0
  374. package/dist/foliageDebug.js +172 -0
  375. package/dist/foliageDebug.js.map +1 -0
  376. package/dist/foliageRegrowth.d.ts +20 -0
  377. package/dist/foliageRegrowth.js +332 -0
  378. package/dist/foliageRegrowth.js.map +1 -0
  379. package/dist/formState.d.ts +67 -0
  380. package/dist/formState.js +65 -0
  381. package/dist/formState.js.map +1 -0
  382. package/dist/formation.d.ts +46 -8
  383. package/dist/formation.js +297 -0
  384. package/dist/formation.js.map +1 -0
  385. package/dist/forms.d.ts +58 -0
  386. package/dist/forms.js +146 -0
  387. package/dist/forms.js.map +1 -0
  388. package/dist/friendlyFire.d.ts +2 -2
  389. package/dist/friendlyFire.js +37 -0
  390. package/dist/friendlyFire.js.map +1 -0
  391. package/dist/game.d.ts +141 -48
  392. package/dist/game.js +834 -0
  393. package/dist/game.js.map +1 -0
  394. package/dist/gameData.d.ts +96 -22
  395. package/dist/gameData.js +1690 -0
  396. package/dist/gameData.js.map +1 -0
  397. package/dist/gameFiles.d.ts +3 -3
  398. package/dist/gameFiles.js +14 -0
  399. package/dist/gameFiles.js.map +1 -0
  400. package/dist/gates.js +92 -0
  401. package/dist/gates.js.map +1 -0
  402. package/dist/generate.d.ts +28 -1
  403. package/dist/generate.js +1062 -0
  404. package/dist/generate.js.map +1 -0
  405. package/dist/generateWorker.d.ts +7 -3
  406. package/dist/generateWorker.js +86 -0
  407. package/dist/generateWorker.js.map +1 -0
  408. package/dist/grid.d.ts +9 -0
  409. package/dist/grid.js +102 -0
  410. package/dist/grid.js.map +1 -0
  411. package/dist/ground.d.ts +17 -1
  412. package/dist/ground.js +375 -0
  413. package/dist/ground.js.map +1 -0
  414. package/dist/groundObjects.d.ts +70 -0
  415. package/dist/groundObjects.js +371 -0
  416. package/dist/groundObjects.js.map +1 -0
  417. package/dist/groundSpeed.d.ts +20 -3
  418. package/dist/groundSpeed.js +117 -0
  419. package/dist/groundSpeed.js.map +1 -0
  420. package/dist/hero.d.ts +126 -10
  421. package/dist/hero.js +432 -0
  422. package/dist/hero.js.map +1 -0
  423. package/dist/holds.d.ts +94 -0
  424. package/dist/holds.js +305 -0
  425. package/dist/holds.js.map +1 -0
  426. package/dist/home.d.ts +1 -1
  427. package/dist/home.js +30 -0
  428. package/dist/home.js.map +1 -0
  429. package/dist/hooks.d.ts +339 -57
  430. package/dist/hooks.js +105 -0
  431. package/dist/hooks.js.map +1 -0
  432. package/dist/hotReload.d.ts +6 -5
  433. package/dist/hotReload.js +145 -0
  434. package/dist/hotReload.js.map +1 -0
  435. package/dist/ids.d.ts +3 -3
  436. package/dist/ids.js +30 -0
  437. package/dist/ids.js.map +1 -0
  438. package/dist/idsFile.d.ts +36 -0
  439. package/dist/idsFile.js +134 -0
  440. package/dist/idsFile.js.map +1 -0
  441. package/dist/index.d.ts +105 -68
  442. package/dist/index.js +194 -4701
  443. package/dist/inspect.d.ts +29 -2
  444. package/dist/{inspect-D9dWHmZ0.js → inspect.js} +21 -12
  445. package/dist/inspect.js.map +1 -0
  446. package/dist/inventory.d.ts +14 -1
  447. package/dist/inventory.js +84 -0
  448. package/dist/inventory.js.map +1 -0
  449. package/dist/items.d.ts +136 -8
  450. package/dist/items.js +585 -0
  451. package/dist/items.js.map +1 -0
  452. package/dist/lanes.d.ts +12 -3
  453. package/dist/lanes.js +496 -0
  454. package/dist/lanes.js.map +1 -0
  455. package/dist/life.d.ts +6 -2
  456. package/dist/life.js +287 -0
  457. package/dist/life.js.map +1 -0
  458. package/dist/log.d.ts +26 -3
  459. package/dist/log.js +192 -0
  460. package/dist/log.js.map +1 -0
  461. package/dist/manaBurn.d.ts +2 -2
  462. package/dist/manaBurn.js +75 -0
  463. package/dist/manaBurn.js.map +1 -0
  464. package/dist/map/file.d.ts +56 -3
  465. package/dist/map/file.js +264 -0
  466. package/dist/map/file.js.map +1 -0
  467. package/dist/map/images.js +61 -0
  468. package/dist/map/images.js.map +1 -0
  469. package/dist/map/look.d.ts +1 -1
  470. package/dist/map/look.js +30 -0
  471. package/dist/map/look.js.map +1 -0
  472. package/dist/map/pathProfile.js +183 -0
  473. package/dist/map/pathProfile.js.map +1 -0
  474. package/dist/map/resize.d.ts +4 -0
  475. package/dist/map/resize.js +136 -0
  476. package/dist/map/resize.js.map +1 -0
  477. package/dist/map/schema.js +257 -0
  478. package/dist/map/schema.js.map +1 -0
  479. package/dist/map/terrain.js +214 -0
  480. package/dist/map/terrain.js.map +1 -0
  481. package/dist/map/types.d.ts +92 -13
  482. package/dist/map/types.js +251 -0
  483. package/dist/map/types.js.map +1 -0
  484. package/dist/mapCheck/cells.js +94 -0
  485. package/dist/mapCheck/cells.js.map +1 -0
  486. package/dist/mapCheck/rules/foliage.d.ts +9 -0
  487. package/dist/mapCheck/rules/foliage.js +83 -0
  488. package/dist/mapCheck/rules/foliage.js.map +1 -0
  489. package/dist/mapCheck/rules/names.js +39 -0
  490. package/dist/mapCheck/rules/names.js.map +1 -0
  491. package/dist/mapCheck/rules/objects.d.ts +1 -1
  492. package/dist/mapCheck/rules/objects.js +56 -0
  493. package/dist/mapCheck/rules/objects.js.map +1 -0
  494. package/dist/mapCheck/rules/paths.js +32 -0
  495. package/dist/mapCheck/rules/paths.js.map +1 -0
  496. package/dist/mapCheck/rules/players.js +20 -0
  497. package/dist/mapCheck/rules/players.js.map +1 -0
  498. package/dist/mapCheck/rules/races.js +56 -0
  499. package/dist/mapCheck/rules/races.js.map +1 -0
  500. package/dist/mapCheck/rules/random.js +47 -0
  501. package/dist/mapCheck/rules/random.js.map +1 -0
  502. package/dist/mapCheck/rules/regions.js +30 -0
  503. package/dist/mapCheck/rules/regions.js.map +1 -0
  504. package/dist/mapCheck/rules/targets.js +31 -0
  505. package/dist/mapCheck/rules/targets.js.map +1 -0
  506. package/dist/mapCheck/rules/walking.js +45 -0
  507. package/dist/mapCheck/rules/walking.js.map +1 -0
  508. package/dist/mapCheck.d.ts +2 -2
  509. package/dist/mapCheck.js +63 -0
  510. package/dist/mapCheck.js.map +1 -0
  511. package/dist/mapFields.d.ts +25 -2
  512. package/dist/mapFields.js +134 -0
  513. package/dist/mapFields.js.map +1 -0
  514. package/dist/mapFile.js +176 -0
  515. package/dist/mapFile.js.map +1 -0
  516. package/dist/mapMeasure.d.ts +8 -0
  517. package/dist/mapMeasure.js +283 -0
  518. package/dist/mapMeasure.js.map +1 -0
  519. package/dist/mapMerge.d.ts +1 -0
  520. package/dist/mapMerge.js +172 -0
  521. package/dist/mapMerge.js.map +1 -0
  522. package/dist/mapObjectives.js +138 -0
  523. package/dist/mapObjectives.js.map +1 -0
  524. package/dist/mapObjects.js +80 -0
  525. package/dist/mapObjects.js.map +1 -0
  526. package/dist/math.d.ts +37 -7
  527. package/dist/math.js +155 -0
  528. package/dist/math.js.map +1 -0
  529. package/dist/messages.d.ts +71 -4
  530. package/dist/messages.js +29 -0
  531. package/dist/messages.js.map +1 -0
  532. package/dist/missionRules.d.ts +10 -2
  533. package/dist/{missionRules-C-bGxm0Q.js → missionRules.js} +30 -150
  534. package/dist/missionRules.js.map +1 -0
  535. package/dist/mods.d.ts +39 -20
  536. package/dist/mods.js +271 -0
  537. package/dist/mods.js.map +1 -0
  538. package/dist/moves.d.ts +87 -0
  539. package/dist/moves.js +539 -0
  540. package/dist/moves.js.map +1 -0
  541. package/dist/names.d.ts +7 -0
  542. package/dist/names.js +122 -0
  543. package/dist/names.js.map +1 -0
  544. package/dist/navigation/agentParams.js +14 -0
  545. package/dist/navigation/agentParams.js.map +1 -0
  546. package/dist/navigation/air.d.ts +7 -3
  547. package/dist/navigation/air.js +401 -0
  548. package/dist/navigation/air.js.map +1 -0
  549. package/dist/navigation/builds.d.ts +34 -2
  550. package/dist/navigation/builds.js +287 -0
  551. package/dist/navigation/builds.js.map +1 -0
  552. package/dist/navigation/groundAreas.d.ts +59 -1
  553. package/dist/navigation/groundAreas.js +407 -0
  554. package/dist/navigation/groundAreas.js.map +1 -0
  555. package/dist/navigation/navigation.d.ts +98 -9
  556. package/dist/navigation/recast.d.ts +194 -18
  557. package/dist/navigation/recast.js +1379 -0
  558. package/dist/navigation/recast.js.map +1 -0
  559. package/dist/navigation/sidePaths.d.ts +8 -3
  560. package/dist/navigation/sidePaths.js +241 -0
  561. package/dist/navigation/sidePaths.js.map +1 -0
  562. package/dist/navigation/sized.js +243 -0
  563. package/dist/navigation/sized.js.map +1 -0
  564. package/dist/nearest.js +32 -0
  565. package/dist/nearest.js.map +1 -0
  566. package/dist/noise.js +59 -0
  567. package/dist/noise.js.map +1 -0
  568. package/dist/objectives.d.ts +12 -3
  569. package/dist/objectives.js +144 -0
  570. package/dist/objectives.js.map +1 -0
  571. package/dist/orders/basic.d.ts +5 -5
  572. package/dist/orders/basic.js +417 -0
  573. package/dist/orders/basic.js.map +1 -0
  574. package/dist/orders/build.js +278 -0
  575. package/dist/orders/build.js.map +1 -0
  576. package/dist/orders/cast.d.ts +13 -3
  577. package/dist/orders/cast.js +558 -0
  578. package/dist/orders/cast.js.map +1 -0
  579. package/dist/orders/facts.js +16 -0
  580. package/dist/orders/facts.js.map +1 -0
  581. package/dist/orders/harvest.d.ts +21 -5
  582. package/dist/orders/harvest.js +540 -0
  583. package/dist/orders/harvest.js.map +1 -0
  584. package/dist/orders/idle.d.ts +3 -1
  585. package/dist/orders/idle.js +234 -0
  586. package/dist/orders/idle.js.map +1 -0
  587. package/dist/orders/items.js +92 -0
  588. package/dist/orders/items.js.map +1 -0
  589. package/dist/orders/queue.js +108 -0
  590. package/dist/orders/queue.js.map +1 -0
  591. package/dist/orders/waiting.d.ts +39 -0
  592. package/dist/orders/waiting.js +149 -0
  593. package/dist/orders/waiting.js.map +1 -0
  594. package/dist/pack.schema.js +13 -0
  595. package/dist/pack.schema.js.map +1 -0
  596. package/dist/pack.schema.json +7622 -841
  597. package/dist/packs/director/index.d.ts +13 -5
  598. package/dist/packs/director/index.js +204 -0
  599. package/dist/packs/director/index.js.map +1 -0
  600. package/dist/packs/heroes/campaign.d.ts +3 -2
  601. package/dist/packs/heroes/campaign.js +241 -0
  602. package/dist/packs/heroes/campaign.js.map +1 -0
  603. package/dist/packs/heroes/carry.d.ts +6 -0
  604. package/dist/packs/heroes/carry.js +112 -0
  605. package/dist/packs/heroes/carry.js.map +1 -0
  606. package/dist/packs/heroes/commands.js +115 -0
  607. package/dist/packs/heroes/commands.js.map +1 -0
  608. package/dist/packs/heroes/fallen.d.ts +43 -0
  609. package/dist/packs/heroes/fallen.js +61 -0
  610. package/dist/packs/heroes/fallen.js.map +1 -0
  611. package/dist/packs/heroes/hire.js +60 -0
  612. package/dist/packs/heroes/hire.js.map +1 -0
  613. package/dist/packs/heroes/index.d.ts +7 -6
  614. package/dist/packs/heroes/index.js +130 -0
  615. package/dist/packs/heroes/index.js.map +1 -0
  616. package/dist/packs/heroes/loop.d.ts +95 -0
  617. package/dist/packs/heroes/loop.js +250 -0
  618. package/dist/packs/heroes/loop.js.map +1 -0
  619. package/dist/packs/heroes/making.d.ts +6 -3
  620. package/dist/packs/heroes/making.js +55 -0
  621. package/dist/packs/heroes/making.js.map +1 -0
  622. package/dist/packs/heroes/respawn.d.ts +3 -3
  623. package/dist/packs/heroes/respawn.js +87 -0
  624. package/dist/packs/heroes/respawn.js.map +1 -0
  625. package/dist/packs/heroes/sets.d.ts +32 -0
  626. package/dist/packs/heroes/sets.js +51 -0
  627. package/dist/packs/heroes/sets.js.map +1 -0
  628. package/dist/packs/heroes/spells.d.ts +16 -0
  629. package/dist/packs/heroes/spells.js +269 -0
  630. package/dist/packs/heroes/spells.js.map +1 -0
  631. package/dist/packs/items/defaults.d.ts +43 -0
  632. package/dist/packs/items/defaults.js +1504 -0
  633. package/dist/packs/items/defaults.js.map +1 -0
  634. package/dist/packs/items/index.d.ts +27 -0
  635. package/dist/packs/items/index.js +214 -0
  636. package/dist/packs/items/index.js.map +1 -0
  637. package/dist/packs/moba/index.d.ts +3 -3
  638. package/dist/packs/moba/index.js +174 -0
  639. package/dist/packs/moba/index.js.map +1 -0
  640. package/dist/packs/pack.d.ts +15 -15
  641. package/dist/packs/pack.js +14 -0
  642. package/dist/packs/pack.js.map +1 -0
  643. package/dist/packs.d.ts +15 -7
  644. package/dist/packs.js +222 -0
  645. package/dist/packs.js.map +1 -0
  646. package/dist/paths.d.ts +2 -0
  647. package/dist/paths.js +109 -0
  648. package/dist/paths.js.map +1 -0
  649. package/dist/plain.js +57 -0
  650. package/dist/plain.js.map +1 -0
  651. package/dist/player.d.ts +33 -10
  652. package/dist/player.js +159 -0
  653. package/dist/player.js.map +1 -0
  654. package/dist/portals.d.ts +1 -1
  655. package/dist/portals.js +194 -0
  656. package/dist/portals.js.map +1 -0
  657. package/dist/prefabs.d.ts +25 -2
  658. package/dist/prefabs.js +239 -0
  659. package/dist/prefabs.js.map +1 -0
  660. package/dist/presetBuildings.js +58 -0
  661. package/dist/presetBuildings.js.map +1 -0
  662. package/dist/presetFoliage.d.ts +27 -0
  663. package/dist/presetFoliage.js +98 -0
  664. package/dist/presetFoliage.js.map +1 -0
  665. package/dist/presetGround.js +65 -0
  666. package/dist/presetGround.js.map +1 -0
  667. package/dist/proxies.d.ts +12 -0
  668. package/dist/proxies.js +79 -0
  669. package/dist/proxies.js.map +1 -0
  670. package/dist/query.d.ts +56 -0
  671. package/dist/query.js +88 -0
  672. package/dist/query.js.map +1 -0
  673. package/dist/races.d.ts +15 -14
  674. package/dist/races.js +172 -0
  675. package/dist/races.js.map +1 -0
  676. package/dist/randomGroups.js +91 -0
  677. package/dist/randomGroups.js.map +1 -0
  678. package/dist/registry.d.ts +117 -53
  679. package/dist/registry.js +323 -0
  680. package/dist/registry.js.map +1 -0
  681. package/dist/remains.d.ts +11 -9
  682. package/dist/remains.js +188 -0
  683. package/dist/remains.js.map +1 -0
  684. package/dist/replication.d.ts +12 -7
  685. package/dist/replication.js +100 -0
  686. package/dist/replication.js.map +1 -0
  687. package/dist/rng.d.ts +2 -0
  688. package/dist/rng.js +40 -0
  689. package/dist/rng.js.map +1 -0
  690. package/dist/rules.d.ts +186 -99
  691. package/dist/rules.js +179 -0
  692. package/dist/rules.js.map +1 -0
  693. package/dist/rulesCheck.d.ts +5 -4
  694. package/dist/rulesCheck.js +693 -0
  695. package/dist/rulesCheck.js.map +1 -0
  696. package/dist/runes.d.ts +2 -2
  697. package/dist/runes.js +80 -0
  698. package/dist/runes.js.map +1 -0
  699. package/dist/save.d.ts +37 -12
  700. package/dist/save.js +532 -0
  701. package/dist/save.js.map +1 -0
  702. package/dist/scenario.d.ts +2 -2
  703. package/dist/scenario.js +99 -0
  704. package/dist/scenario.js.map +1 -0
  705. package/dist/scheduler.d.ts +3 -0
  706. package/dist/scheduler.js +156 -0
  707. package/dist/scheduler.js.map +1 -0
  708. package/dist/score.d.ts +19 -19
  709. package/dist/score.js +709 -0
  710. package/dist/score.js.map +1 -0
  711. package/dist/sequences.d.ts +10 -6
  712. package/dist/sequences.js +206 -0
  713. package/dist/sequences.js.map +1 -0
  714. package/dist/server/doorman.js +154 -0
  715. package/dist/server/doorman.js.map +1 -0
  716. package/dist/server/gameServer.d.ts +16 -1
  717. package/dist/server/gameServer.js +643 -0
  718. package/dist/server/gameServer.js.map +1 -0
  719. package/dist/server/index.d.ts +1 -1
  720. package/dist/server/lobby.js +199 -0
  721. package/dist/server/lobby.js.map +1 -0
  722. package/dist/server/log.js +18 -0
  723. package/dist/server/log.js.map +1 -0
  724. package/dist/server/match.js +267 -0
  725. package/dist/server/match.js.map +1 -0
  726. package/dist/server/mode.d.ts +18 -9
  727. package/dist/server/mode.js +220 -0
  728. package/dist/server/mode.js.map +1 -0
  729. package/dist/{navigation-worker.js → server/navigation-worker.js} +1 -1
  730. package/dist/server/navigation-worker.js.map +1 -0
  731. package/dist/server/navigation.js +39 -0
  732. package/dist/server/navigation.js.map +1 -0
  733. package/dist/server/ops.d.ts +4 -0
  734. package/dist/server/ops.js +137 -0
  735. package/dist/server/ops.js.map +1 -0
  736. package/dist/server/packs.d.ts +3 -3
  737. package/dist/server/packs.js +32 -0
  738. package/dist/server/packs.js.map +1 -0
  739. package/dist/server/ratings.d.ts +5 -0
  740. package/dist/server/ratings.js +104 -0
  741. package/dist/server/ratings.js.map +1 -0
  742. package/dist/server/relay.d.ts +12 -2
  743. package/dist/server/relay.js +144 -0
  744. package/dist/server/relay.js.map +1 -0
  745. package/dist/server/rooms.d.ts +9 -2
  746. package/dist/server/rooms.js +442 -0
  747. package/dist/server/rooms.js.map +1 -0
  748. package/dist/server/seat.js +116 -0
  749. package/dist/server/seat.js.map +1 -0
  750. package/dist/server/seatSettings.d.ts +3 -3
  751. package/dist/server/seatSettings.js +63 -0
  752. package/dist/server/seatSettings.js.map +1 -0
  753. package/dist/server/secret.js +13 -0
  754. package/dist/server/secret.js.map +1 -0
  755. package/dist/server/start.d.ts +13 -6
  756. package/dist/server/start.js +76 -0
  757. package/dist/server/start.js.map +1 -0
  758. package/dist/server/websocket.d.ts +9 -1
  759. package/dist/server/websocket.js +306 -0
  760. package/dist/server/websocket.js.map +1 -0
  761. package/dist/server.js +15 -2861
  762. package/dist/session/can.js +26 -0
  763. package/dist/session/can.js.map +1 -0
  764. package/dist/session/commandReplay.d.ts +8 -2
  765. package/dist/session/commandReplay.js +293 -0
  766. package/dist/session/commandReplay.js.map +1 -0
  767. package/dist/session/debug.js +151 -0
  768. package/dist/session/debug.js.map +1 -0
  769. package/dist/session/delay.js +62 -0
  770. package/dist/session/delay.js.map +1 -0
  771. package/dist/session/delta.d.ts +14 -1
  772. package/dist/session/delta.js +407 -0
  773. package/dist/session/delta.js.map +1 -0
  774. package/dist/session/entityState.js +415 -0
  775. package/dist/session/entityState.js.map +1 -0
  776. package/dist/session/local.d.ts +47 -5
  777. package/dist/session/local.js +670 -0
  778. package/dist/session/local.js.map +1 -0
  779. package/dist/session/memory.d.ts +20 -2
  780. package/dist/session/memory.js +131 -0
  781. package/dist/session/memory.js.map +1 -0
  782. package/dist/session/protocol.d.ts +325 -31
  783. package/dist/session/protocol.js +55 -0
  784. package/dist/session/protocol.js.map +1 -0
  785. package/dist/session/remote.d.ts +74 -12
  786. package/dist/session/remote.js +1394 -0
  787. package/dist/session/remote.js.map +1 -0
  788. package/dist/session/replay.d.ts +11 -2
  789. package/dist/session/replay.js +160 -0
  790. package/dist/session/replay.js.map +1 -0
  791. package/dist/session/seed.js +12 -0
  792. package/dist/session/seed.js.map +1 -0
  793. package/dist/session/share.d.ts +5 -1
  794. package/dist/session/share.js +94 -0
  795. package/dist/session/share.js.map +1 -0
  796. package/dist/session/socket.d.ts +1 -1
  797. package/dist/session/socket.js +29 -0
  798. package/dist/session/socket.js.map +1 -0
  799. package/dist/session/wire.d.ts +5 -0
  800. package/dist/session/wire.js +84 -0
  801. package/dist/session/wire.js.map +1 -0
  802. package/dist/session/worker.d.ts +77 -12
  803. package/dist/session/worker.js +499 -0
  804. package/dist/session/worker.js.map +1 -0
  805. package/dist/shared.d.ts +31 -5
  806. package/dist/shared.js +166 -0
  807. package/dist/shared.js.map +1 -0
  808. package/dist/sides.d.ts +9 -3
  809. package/dist/sides.js +149 -0
  810. package/dist/sides.js.map +1 -0
  811. package/dist/sight.js +85 -0
  812. package/dist/sight.js.map +1 -0
  813. package/dist/simulate-worker.js +1 -1
  814. package/dist/simulate.d.ts +12 -8
  815. package/dist/{simulate-oXBiw1Ff.js → simulate.js} +10 -11
  816. package/dist/simulate.js.map +1 -0
  817. package/dist/smart.js +77 -0
  818. package/dist/smart.js.map +1 -0
  819. package/dist/spatial.d.ts +32 -16
  820. package/dist/spatial.js +234 -0
  821. package/dist/spatial.js.map +1 -0
  822. package/dist/spawning.d.ts +1 -0
  823. package/dist/spawning.js +224 -0
  824. package/dist/spawning.js.map +1 -0
  825. package/dist/stances.d.ts +6 -3
  826. package/dist/stances.js +169 -0
  827. package/dist/stances.js.map +1 -0
  828. package/dist/start.d.ts +10 -10
  829. package/dist/start.js +75 -0
  830. package/dist/start.js.map +1 -0
  831. package/dist/stats.d.ts +42 -16
  832. package/dist/stats.js +290 -0
  833. package/dist/stats.js.map +1 -0
  834. package/dist/summoned.d.ts +52 -0
  835. package/dist/summoned.js +38 -0
  836. package/dist/summoned.js.map +1 -0
  837. package/dist/summons.d.ts +10 -13
  838. package/dist/summons.js +271 -0
  839. package/dist/summons.js.map +1 -0
  840. package/dist/systems/abilities.js +224 -0
  841. package/dist/systems/abilities.js.map +1 -0
  842. package/dist/systems/combat.d.ts +35 -1
  843. package/dist/systems/combat.js +677 -0
  844. package/dist/systems/combat.js.map +1 -0
  845. package/dist/systems/combatTold.d.ts +3 -1
  846. package/dist/systems/combatTold.js +85 -0
  847. package/dist/systems/combatTold.js.map +1 -0
  848. package/dist/systems/construction.js +80 -0
  849. package/dist/systems/construction.js.map +1 -0
  850. package/dist/systems/economy.d.ts +0 -6
  851. package/dist/systems/economy.js +128 -0
  852. package/dist/systems/economy.js.map +1 -0
  853. package/dist/systems/fog.d.ts +1 -1
  854. package/dist/systems/fog.js +120 -0
  855. package/dist/systems/fog.js.map +1 -0
  856. package/dist/systems/life.js +32 -0
  857. package/dist/systems/life.js.map +1 -0
  858. package/dist/systems/movement.d.ts +24 -12
  859. package/dist/systems/movement.js +1247 -0
  860. package/dist/systems/movement.js.map +1 -0
  861. package/dist/systems/orders.js +64 -0
  862. package/dist/systems/orders.js.map +1 -0
  863. package/dist/systems/production.js +322 -0
  864. package/dist/systems/production.js.map +1 -0
  865. package/dist/systems/productionQueue.js +120 -0
  866. package/dist/systems/productionQueue.js.map +1 -0
  867. package/dist/systems/victory.d.ts +1 -1
  868. package/dist/systems/victory.js +56 -0
  869. package/dist/systems/victory.js.map +1 -0
  870. package/dist/talk.d.ts +6 -6
  871. package/dist/talk.js +153 -0
  872. package/dist/talk.js.map +1 -0
  873. package/dist/targeting.d.ts +142 -0
  874. package/dist/targeting.js +49 -0
  875. package/dist/targeting.js.map +1 -0
  876. package/dist/tech.d.ts +20 -3
  877. package/dist/tech.js +239 -0
  878. package/dist/tech.js.map +1 -0
  879. package/dist/techTree.d.ts +7 -0
  880. package/dist/techTree.js +90 -0
  881. package/dist/techTree.js.map +1 -0
  882. package/dist/terrain.d.ts +59 -7
  883. package/dist/terrain.js +389 -0
  884. package/dist/terrain.js.map +1 -0
  885. package/dist/terrainSave.d.ts +6 -0
  886. package/dist/terrainSave.js +74 -0
  887. package/dist/terrainSave.js.map +1 -0
  888. package/dist/testing.d.ts +8 -7
  889. package/dist/testing.js +13 -739
  890. package/dist/testing.js.map +1 -1
  891. package/dist/tiles.d.ts +1 -1
  892. package/dist/tiles.js +43 -0
  893. package/dist/tiles.js.map +1 -0
  894. package/dist/timers.d.ts +29 -4
  895. package/dist/timers.js +242 -0
  896. package/dist/timers.js.map +1 -0
  897. package/dist/tomes.d.ts +4 -4
  898. package/dist/tomes.js +94 -0
  899. package/dist/tomes.js.map +1 -0
  900. package/dist/trade.js +103 -0
  901. package/dist/trade.js.map +1 -0
  902. package/dist/transport.d.ts +6 -1
  903. package/dist/transport.js +281 -0
  904. package/dist/transport.js.map +1 -0
  905. package/dist/tunables.d.ts +10 -3
  906. package/dist/tunables.js +56 -0
  907. package/dist/tunables.js.map +1 -0
  908. package/dist/unitResources.d.ts +67 -0
  909. package/dist/unitResources.js +266 -0
  910. package/dist/unitResources.js.map +1 -0
  911. package/dist/upkeep.d.ts +6 -1
  912. package/dist/upkeep.js +26 -0
  913. package/dist/upkeep.js.map +1 -0
  914. package/dist/veterancy.d.ts +8 -3
  915. package/dist/veterancy.js +131 -0
  916. package/dist/veterancy.js.map +1 -0
  917. package/dist/vision.d.ts +36 -0
  918. package/dist/vision.js +133 -0
  919. package/dist/vision.js.map +1 -0
  920. package/dist/walls.d.ts +1 -1
  921. package/dist/walls.js +278 -0
  922. package/dist/walls.js.map +1 -0
  923. package/dist/world.d.ts +606 -88
  924. package/dist/world.js +1263 -0
  925. package/dist/world.js.map +1 -0
  926. package/package.json +2 -2
  927. package/dist/ai.js.map +0 -1
  928. package/dist/attributes.d.ts +0 -66
  929. package/dist/brain-BvVdUhX8.js +0 -7659
  930. package/dist/brain-BvVdUhX8.js.map +0 -1
  931. package/dist/builds-C6LfgvEU.js +0 -460
  932. package/dist/builds-C6LfgvEU.js.map +0 -1
  933. package/dist/coreComponents-syuh2fPG.js +0 -5149
  934. package/dist/coreComponents-syuh2fPG.js.map +0 -1
  935. package/dist/debugCommands-CzjrSm66.js +0 -14739
  936. package/dist/debugCommands-CzjrSm66.js.map +0 -1
  937. package/dist/determinism-BCymQwiE.js +0 -518
  938. package/dist/determinism-BCymQwiE.js.map +0 -1
  939. package/dist/game-DiJEN-Ks.js +0 -5800
  940. package/dist/game-DiJEN-Ks.js.map +0 -1
  941. package/dist/index.js.map +0 -1
  942. package/dist/inspect-D9dWHmZ0.js.map +0 -1
  943. package/dist/local-Dkovq42k.js +0 -1379
  944. package/dist/local-Dkovq42k.js.map +0 -1
  945. package/dist/missionRules-C-bGxm0Q.js.map +0 -1
  946. package/dist/navigation-worker.js.map +0 -1
  947. package/dist/packs-g5thvmGn.js +0 -3199
  948. package/dist/packs-g5thvmGn.js.map +0 -1
  949. package/dist/profiles-B3NS9jwk.js.map +0 -1
  950. package/dist/server.js.map +0 -1
  951. package/dist/simulate-oXBiw1Ff.js.map +0 -1
@@ -1,23 +1,23 @@
1
- import type { EffectKind } from '#engine/abilities/effects';
1
+ import type { EffectType } from '#engine/abilities/effects';
2
2
  import type { CommandDef } from '#engine/commands';
3
3
  import type { Component } from '#engine/components';
4
4
  import type { ListenerDef } from '#engine/events';
5
5
  import type { HookDef } from '#engine/hooks';
6
6
  import type { OrderBehavior, SystemDef } from '#engine/registry';
7
- import type { StatPart } from '#engine/stats';
7
+ import type { StatField } from '#engine/stats';
8
8
  import type { StatDef } from '#engine/defs';
9
9
  import type { EventKey } from '#engine/events';
10
- import type { ReplicatedEvent, SnapshotPart } from '#engine/replication';
10
+ import type { ReplicatedEvent, SnapshotField } from '#engine/replication';
11
11
  import type { PlayerId } from '#engine/entity';
12
12
  import type { GameMap } from '#engine/map';
13
13
  import type { MapProblem } from '#engine/mapFields';
14
14
  import type { Registry } from '#engine/registry';
15
- import type { GameRules, RulesInit } from '#engine/rules';
15
+ import type { RuleSettings, RuleSettingsInit } from '#engine/rules';
16
16
  import type { World } from '#engine/world';
17
17
  import type { TimerDef } from '#engine/timers';
18
18
  /**
19
- * A part of the rules a game opts into (`GameModule.packs`): commands, orders, systems, hooks and the state it keeps,
20
- * which a game without it pays nothing for. The engine's heroes, camps and shops are one (`withHeroes`). A game's
19
+ * A part of the rules a game opts into (`Rules.packs`): commands, orders, systems, hooks and the state it keeps,
20
+ * which a game without it pays nothing for. The engine's heroes, camps and shops are one (`heroesPack`). A game's
21
21
  * own lists come after a pack's, so a command, an order, a hook or a system of the same id or name takes its place;
22
22
  * `withoutCommands`, `withoutOrders`, `withoutSystems` and `withoutHooks` take one of a pack's out as they do the
23
23
  * engine's
@@ -36,33 +36,33 @@ export interface GamePack {
36
36
  /** Its handlers of hooks, after the engine's and before the game's (`defineHook`) */
37
37
  hooks?: HookDef[];
38
38
  /** Kinds of ability effects it brings (`defineEffect`), beside the engine's: one of the game's of the same type takes its place */
39
- effects?: EffectKind[];
39
+ effects?: EffectType[];
40
40
  /** How it reacts to events (`defineListener`) */
41
41
  listeners?: ListenerDef[];
42
42
  /** The state it keeps on entities, players and the world (`defineComponent`) */
43
43
  components?: Component<any>[];
44
44
  /** What it sets to go off later (`defineTimer`): listed, so that a save finds them by id */
45
45
  timers?: TimerDef[];
46
- /** The stats it brings, next to the engine's and the game's own (`StatDef`, as `GameModule.stats`) */
46
+ /** The stats it brings, next to the engine's and the game's own (`StatDef`, as `Rules.stats`) */
47
47
  stats?: StatDef[];
48
- /** What it adds to a unit's stats, kept up to date as the engine keeps the rest (`StatPart`) */
49
- statParts?: StatPart[];
48
+ /** What it adds to a unit's stats, kept up to date as the engine keeps the rest (`StatField`) */
49
+ statFields?: StatField[];
50
50
  /** The events it tells of (`defineEvent`), listed as a game's are */
51
51
  events?: EventKey<any>[];
52
52
  /** How events of the world of its own are told to the players (`replicateEvent`), after the engine's */
53
53
  replications?: ReplicatedEvent[];
54
- /** Parts of the players' snapshots of its own (`SnapshotPart`), after the engine's */
55
- snapshotParts?: SnapshotPart[];
56
- /** What it adds to the game's report of a player at the end (`GameModule.report`), beside the game's own */
54
+ /** Parts of the players' snapshots of its own (`SnapshotField`), after the engine's */
55
+ snapshotFields?: SnapshotField[];
56
+ /** What it adds to the game's report of a player at the end (`Rules.report`), beside the game's own */
57
57
  report?(world: World, player: PlayerId): Record<string, unknown>;
58
- /** How a game with it is won, where the game says nothing of its own (`GameModule.victory`): the last pack's that says */
58
+ /** How a game with it is won, where the game says nothing of its own (`Rules.victory`): the last pack's that says */
59
59
  victory?: SystemDef | null;
60
60
  /**
61
61
  * The rules it changes: handed the game's as they come out (the engine's, the game's over them, the packs' before it),
62
62
  * it gives what it lays over them. A function of them, so that what it says can be made of what was there (the lanes'
63
63
  * supply: none for a minion, the game's own for the rest)
64
64
  */
65
- rules?(rules: Readonly<GameRules>): RulesInit;
65
+ settings?(settings: Readonly<RuleSettings>): RuleSettingsInit;
66
66
  /** What it finds wrong with a map in the editor, beside what the game finds (`MapEditorDef.check`) */
67
67
  check?(map: GameMap, registry: Registry): MapProblem[];
68
68
  /** The packs it is made to go with, by id: a game with it and without one of them is refused */
@@ -0,0 +1,14 @@
1
+ //#region src/packs/pack.ts
2
+ /**
3
+ * Whether a game has a pack on, by its id: `hasPack(game, HEROES)`, what the editor asks before it shows a hero's
4
+ * fields
5
+ *
6
+ * @beta
7
+ */
8
+ function hasPack(game, id) {
9
+ return !!game?.packs?.some((pack) => pack.id === id);
10
+ }
11
+ //#endregion
12
+ export { hasPack };
13
+
14
+ //# sourceMappingURL=pack.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pack.js","names":[],"sources":["../../src/packs/pack.ts"],"sourcesContent":["import type { EffectType } from '#engine/abilities/effects'\nimport type { CommandDef } from '#engine/commands'\nimport type { Component } from '#engine/components'\nimport type { ListenerDef } from '#engine/events'\nimport type { HookDef } from '#engine/hooks'\nimport type { OrderBehavior, SystemDef } from '#engine/registry'\nimport type { StatField } from '#engine/stats'\nimport type { StatDef } from '#engine/defs'\nimport type { EventKey } from '#engine/events'\nimport type { ReplicatedEvent, SnapshotField } from '#engine/replication'\nimport type { PlayerId } from '#engine/entity'\nimport type { GameMap } from '#engine/map'\nimport type { MapProblem } from '#engine/mapFields'\nimport type { Registry } from '#engine/registry'\nimport type { RuleSettings, RuleSettingsInit } from '#engine/rules'\nimport type { World } from '#engine/world'\nimport type { TimerDef } from '#engine/timers'\n\n/**\n * A part of the rules a game opts into (`Rules.packs`): commands, orders, systems, hooks and the state it keeps,\n * which a game without it pays nothing for. The engine's heroes, camps and shops are one (`heroesPack`). A game's\n * own lists come after a pack's, so a command, an order, a hook or a system of the same id or name takes its place;\n * `withoutCommands`, `withoutOrders`, `withoutSystems` and `withoutHooks` take one of a pack's out as they do the\n * engine's\n *\n * @beta\n */\nexport interface GamePack {\n\t/** Unique among a game's packs: how a game, a mod or the editor asks whether it is on (`hasPack`) */\n\tid: string\n\t/** Commands it takes, beside the engine's (`defineCommand`) */\n\tcommands?: CommandDef[]\n\t/** Orders its units can be given, beside the engine's */\n\torders?: OrderBehavior[]\n\t/** Systems, run with the engine's in the phase each says (see `System`) */\n\tsystems?: SystemDef[]\n\t/** Its handlers of hooks, after the engine's and before the game's (`defineHook`) */\n\thooks?: HookDef[]\n\t/** Kinds of ability effects it brings (`defineEffect`), beside the engine's: one of the game's of the same type takes its place */\n\teffects?: EffectType[]\n\t/** How it reacts to events (`defineListener`) */\n\tlisteners?: ListenerDef[]\n\t/** The state it keeps on entities, players and the world (`defineComponent`) */\n\tcomponents?: Component<any>[]\n\t/** What it sets to go off later (`defineTimer`): listed, so that a save finds them by id */\n\ttimers?: TimerDef[]\n\t/** The stats it brings, next to the engine's and the game's own (`StatDef`, as `Rules.stats`) */\n\tstats?: StatDef[]\n\t/** What it adds to a unit's stats, kept up to date as the engine keeps the rest (`StatField`) */\n\tstatFields?: StatField[]\n\t/** The events it tells of (`defineEvent`), listed as a game's are */\n\tevents?: EventKey<any>[]\n\t/** How events of the world of its own are told to the players (`replicateEvent`), after the engine's */\n\treplications?: ReplicatedEvent[]\n\t/** Parts of the players' snapshots of its own (`SnapshotField`), after the engine's */\n\tsnapshotFields?: SnapshotField[]\n\t/** What it adds to the game's report of a player at the end (`Rules.report`), beside the game's own */\n\treport?(world: World, player: PlayerId): Record<string, unknown>\n\t/** How a game with it is won, where the game says nothing of its own (`Rules.victory`): the last pack's that says */\n\tvictory?: SystemDef | null\n\t/**\n\t * The rules it changes: handed the game's as they come out (the engine's, the game's over them, the packs' before it),\n\t * it gives what it lays over them. A function of them, so that what it says can be made of what was there (the lanes'\n\t * supply: none for a minion, the game's own for the rest)\n\t */\n\tsettings?(settings: Readonly<RuleSettings>): RuleSettingsInit\n\t/** What it finds wrong with a map in the editor, beside what the game finds (`MapEditorDef.check`) */\n\tcheck?(map: GameMap, registry: Registry): MapProblem[]\n\t/** The packs it is made to go with, by id: a game with it and without one of them is refused */\n\trequires?: string[]\n\t/**\n\t * What it was made with, as plain data: what a game's hash names it by, beside its id (`gameHash`), so that one pack\n\t * made two ways is two games\n\t */\n\toptions?: unknown\n}\n\n/**\n * Whether a game has a pack on, by its id: `hasPack(game, HEROES)`, what the editor asks before it shows a hero's\n * fields\n *\n * @beta\n */\nexport function hasPack(game: { packs?: readonly GamePack[] } | null | undefined, id: string): boolean {\n\treturn !!game?.packs?.some((pack) => pack.id === id)\n}\n"],"mappings":";;;;;;;AAmFA,SAAgB,QAAQ,MAA0D,IAAqB;CACtG,OAAO,CAAC,CAAC,MAAM,OAAO,MAAM,SAAS,KAAK,OAAO,EAAE;AACpD"}
package/dist/packs.d.ts CHANGED
@@ -1,13 +1,13 @@
1
1
  import type { AbilityDef, BuffDef, ItemDef, UnitTypeDef, UpgradeDef } from './defs';
2
2
  import { type GameData } from './gameData';
3
- import type { GameModule } from './game';
3
+ import type { Rules } from './game';
4
4
  import type { ModDef } from './mods';
5
5
  import type { RaceDef } from './races';
6
- import type { RulesInit } from './rules';
6
+ import type { RuleSettingsInit } from './rules';
7
7
  /**
8
8
  * A pack of content as its file has it (`packs/<id>/pack.json`): plain data, checked against the pack's schema
9
9
  * (`@v12-engine/engine/schemas/pack.schema.json`) as it is read. Its definitions are added to the game's, or put in the place of those of the same id;
10
- * then its `data` is laid over the whole as a `data.json` is (`withData`), and its `rules` over the game's
10
+ * then its `data` is laid over the whole as a `data.json` is (`layData`), and its `settings` over the game's
11
11
  *
12
12
  * @beta
13
13
  */
@@ -16,17 +16,24 @@ export interface PackFile {
16
16
  id: string;
17
17
  /** `major.minor.patch` */
18
18
  version: string;
19
+ /** A human-readable name for the pack, shown where the id is not enough */
19
20
  name?: string;
20
21
  /** The game and the packs or mods it is made for, as a mod's (`ModDef.requires`) */
21
22
  requires?: string[];
23
+ /** Unit type definitions the pack adds to the game's or puts in the place of those of the same id */
22
24
  units?: UnitTypeDef[];
25
+ /** Ability definitions the pack adds or replaces */
23
26
  abilities?: AbilityDef[];
27
+ /** Buff definitions the pack adds or replaces */
24
28
  buffs?: BuffDef[];
29
+ /** Item definitions the pack adds or replaces */
25
30
  items?: ItemDef[];
31
+ /** Upgrade definitions the pack adds or replaces */
26
32
  upgrades?: UpgradeDef[];
33
+ /** Race definitions the pack adds or replaces */
27
34
  races?: RaceDef[];
28
- /** The rules it changes, as data (`GameBuilder.rules`) */
29
- rules?: RulesInit;
35
+ /** The rules it changes, as data (`GameBuilder.settings`) */
36
+ settings?: RuleSettingsInit;
30
37
  /** Values over the definitions, as a `data.json` has them (`GameData`): the editor's Data panel writes here for a pack */
31
38
  data?: GameData;
32
39
  /** What its units look like, as a `looks.json` has them: the client's to lay over the game's view */
@@ -38,6 +45,7 @@ export interface PackFile {
38
45
  * @beta
39
46
  */
40
47
  export interface PackMod extends ModDef {
48
+ /** The pack's file this mod was made from */
41
49
  readonly pack: PackFile;
42
50
  /** The hash of the pack's bytes as they were read: kept with the game's mods, so the game's hash has it */
43
51
  readonly hash: string;
@@ -68,7 +76,7 @@ export declare function checkPackSchema(json: unknown, schema: object): string |
68
76
  /**
69
77
  * Makes a mod of a pack's file (its text, or what was parsed of it): checked, then applying its definitions (each
70
78
  * list in the order of its ids, a definition the game has put in its place), its `data` over the whole and its
71
- * `rules`. Its hash, of the text as given, goes with the game's mods
79
+ * `settings`. Its hash, of the text as given, goes with the game's mods
72
80
  *
73
81
  * @beta
74
82
  */
@@ -78,7 +86,7 @@ export declare function packFromJson(json: string | unknown, where?: string): Pa
78
86
  *
79
87
  * @beta
80
88
  */
81
- export declare const packsOf: (game: Pick<GameModule, 'mods'>) => {
89
+ export declare const packsOf: (game: Pick<Rules, 'mods'>) => {
82
90
  id: string;
83
91
  version: string;
84
92
  }[];
package/dist/packs.js ADDED
@@ -0,0 +1,222 @@
1
+ import { DATA_KINDS, layData } from "./gameData.js";
2
+ //#region src/packs.ts
3
+ /**
4
+ * Why a pack's file is not one, where it is first wrong
5
+ *
6
+ * @beta
7
+ */
8
+ var PackError = class extends Error {};
9
+ var ID = /^[a-z0-9][a-z0-9._-]*$/i;
10
+ var VERSION = /^\d+(\.\d+){0,2}$/;
11
+ var isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
12
+ /**
13
+ * Checks a pack's file as it is read (the schema's rules a loader needs: the pack's schema has all of them):
14
+ * its id and version, and that each list is of definitions with an id, once each. Throws `PackError` saying where
15
+ *
16
+ * @beta
17
+ */
18
+ function checkPack(json, where = "the pack") {
19
+ const wrong = (why) => {
20
+ throw new PackError(`${where}: ${why}`);
21
+ };
22
+ if (!isRecord(json)) return wrong("is no object");
23
+ if (typeof json.id !== "string" || !ID.test(json.id)) wrong("its id is letters, digits, dots and dashes");
24
+ if (typeof json.version !== "string" || !VERSION.test(json.version)) wrong("its version is major.minor.patch");
25
+ if (json.requires !== void 0 && (!Array.isArray(json.requires) || json.requires.some((each) => typeof each !== "string"))) wrong("requires is a list of words");
26
+ for (const kind of DATA_KINDS) {
27
+ const list = json[kind];
28
+ if (list === void 0) continue;
29
+ if (!Array.isArray(list)) wrong(`${kind} is no list`);
30
+ const seen = /* @__PURE__ */ new Set();
31
+ for (const [at, def] of list.entries()) {
32
+ if (!isRecord(def) || typeof def.id !== "string" || !def.id) wrong(`${kind}[${at}] has no id`);
33
+ const id = def.id;
34
+ if (seen.has(id)) wrong(`${kind} has "${id}" twice`);
35
+ seen.add(id);
36
+ }
37
+ }
38
+ for (const part of [
39
+ "settings",
40
+ "data",
41
+ "looks"
42
+ ]) if (json[part] !== void 0 && !isRecord(json[part])) wrong(`${part} is no object`);
43
+ if (json.rules !== void 0) wrong("\"rules\" is now \"settings\": the rules' knobs a pack changes go under \"settings\"");
44
+ const known = /* @__PURE__ */ new Set([
45
+ "$schema",
46
+ "id",
47
+ "version",
48
+ "name",
49
+ "requires",
50
+ ...DATA_KINDS,
51
+ "settings",
52
+ "data",
53
+ "looks"
54
+ ]);
55
+ const unknown = Object.keys(json).find((key) => !known.has(key));
56
+ if (unknown) wrong(`"${unknown}" is nothing a pack has`);
57
+ return json;
58
+ }
59
+ /** A word with its article: an object, a number */
60
+ var an = (word) => `${/^[aeiou]/.test(word) ? "an" : "a"} ${word}`;
61
+ /** The type of a value as a schema says it */
62
+ var typeOf = (value) => value === null ? "null" : Array.isArray(value) ? "array" : Number.isInteger(value) ? "integer" : typeof value;
63
+ /**
64
+ * Checks a pack's file against the pack's schema (`@v12-engine/engine/schemas/pack.schema.json`, made of `PackFile`):
65
+ * where it is first wrong, in words with its place (`units[2].stats.health: is a string, not a number`), or nothing
66
+ * for one that is right. A small reader of the schema, as far as it uses JSON Schema: what a page that loads packs
67
+ * fetches with them, so that a game without packs carries none of it
68
+ *
69
+ * @beta
70
+ */
71
+ function checkPackSchema(json, schema) {
72
+ const root = schema;
73
+ const resolve = (part) => {
74
+ let at = part;
75
+ for (let hops = 0; at.$ref && hops < 32; hops++) at = root.definitions?.[decodeURIComponent(at.$ref.replace("#/definitions/", ""))] ?? {};
76
+ return at;
77
+ };
78
+ const check = (value, given, where) => {
79
+ const part = resolve(given);
80
+ const type = typeOf(value);
81
+ if (part.type !== void 0) {
82
+ const types = Array.isArray(part.type) ? part.type : [part.type];
83
+ if (!types.some((each) => each === type || each === "number" && type === "integer")) return `${where || "the pack"}: is ${an(type)}, not ${types.join(" or ")}`;
84
+ }
85
+ if ("const" in part && value !== part.const) return `${where || "the pack"}: is not ${JSON.stringify(part.const)}`;
86
+ if (part.enum && !part.enum.includes(value)) return `${where || "the pack"}: is none of ${part.enum.map((each) => JSON.stringify(each)).join(", ")}`;
87
+ if (part.not && check(value, part.not, where) === void 0) return `${where || "the pack"}: is what it may not be`;
88
+ if (part.anyOf) {
89
+ const wrongs = part.anyOf.map((each) => check(value, each, where));
90
+ if (wrongs.every((wrong) => wrong !== void 0)) return wrongs.reduce((deepest, wrong) => wrong.length > deepest.length ? wrong : deepest);
91
+ }
92
+ if (type === "object" && (part.properties || part.required || part.additionalProperties !== void 0 || part.propertyNames)) {
93
+ const object = value;
94
+ for (const field of part.required ?? []) if (!(field in object)) return `${where || "the pack"}: has no ${field}`;
95
+ for (const [field, each] of Object.entries(object)) {
96
+ const at = where ? `${where}.${field}` : field;
97
+ if (part.propertyNames) {
98
+ const name = check(field, part.propertyNames, at);
99
+ if (name) return name;
100
+ }
101
+ const own = part.properties?.[field];
102
+ if (own) {
103
+ const wrong = check(each, own, at);
104
+ if (wrong) return wrong;
105
+ } else if (part.additionalProperties === false) return `${at}: is nothing ${where || "a pack"} has`;
106
+ else if (typeof part.additionalProperties === "object") {
107
+ const wrong = check(each, part.additionalProperties, at);
108
+ if (wrong) return wrong;
109
+ }
110
+ }
111
+ }
112
+ if (type === "array") {
113
+ const list = value;
114
+ if (part.minItems !== void 0 && list.length < part.minItems) return `${where || "the pack"}: has fewer than ${part.minItems}`;
115
+ if (part.maxItems !== void 0 && list.length > part.maxItems) return `${where || "the pack"}: has more than ${part.maxItems}`;
116
+ if (part.items) for (const [at, each] of list.entries()) {
117
+ const item = Array.isArray(part.items) ? part.items[at] : part.items;
118
+ const wrong = item && check(each, item, `${where}[${at}]`);
119
+ if (wrong) return wrong;
120
+ }
121
+ }
122
+ };
123
+ return check(json, root, "");
124
+ }
125
+ /** FNV-1a, twice over with different starts, of a text: as the game's hash is */
126
+ function hashOf(text) {
127
+ let a = 2166136261;
128
+ let b = 1523705862;
129
+ for (let i = 0; i < text.length; i++) {
130
+ const c = text.charCodeAt(i);
131
+ a = Math.imul(a ^ c, 16777619);
132
+ b = Math.imul(b ^ c, 1540483477);
133
+ }
134
+ return (a >>> 0).toString(16).padStart(8, "0") + (b >>> 0).toString(16).padStart(8, "0");
135
+ }
136
+ var byId = (defs) => [...defs].sort((a, b) => a.id < b.id ? -1 : a.id > b.id ? 1 : 0);
137
+ /** The builder's collection of a kind of the game's data */
138
+ var collectionOf = (game, kind) => game[kind];
139
+ /**
140
+ * Makes a mod of a pack's file (its text, or what was parsed of it): checked, then applying its definitions (each
141
+ * list in the order of its ids, a definition the game has put in its place), its `data` over the whole and its
142
+ * `settings`. Its hash, of the text as given, goes with the game's mods
143
+ *
144
+ * @beta
145
+ */
146
+ function packFromJson(json, where) {
147
+ const text = typeof json === "string" ? json : JSON.stringify(json);
148
+ let parsed;
149
+ try {
150
+ parsed = typeof json === "string" ? JSON.parse(json) : json;
151
+ } catch (error) {
152
+ throw new PackError(`${where ?? "the pack"}: is not JSON (${error instanceof Error ? error.message : String(error)})`);
153
+ }
154
+ const pack = checkPack(parsed, where);
155
+ return {
156
+ id: pack.id,
157
+ version: pack.version,
158
+ ...pack.name !== void 0 && { name: pack.name },
159
+ ...pack.requires !== void 0 && { requires: pack.requires },
160
+ pack,
161
+ hash: hashOf(text),
162
+ apply(game) {
163
+ for (const kind of DATA_KINDS) {
164
+ const defs = pack[kind];
165
+ if (!defs) continue;
166
+ const collection = collectionOf(game, kind);
167
+ for (const def of byId(defs)) {
168
+ const own = structuredClone(def);
169
+ if (collection.has(def.id)) collection.override(def.id, () => own);
170
+ else collection.add(own);
171
+ }
172
+ }
173
+ if (pack.data) layPackData(game, pack.data);
174
+ if (pack.settings) game.settings(pack.settings);
175
+ }
176
+ };
177
+ }
178
+ /** A `data.json`'s values laid over the game as the builder has it: each definition it changes put in its place, those it takes out gone */
179
+ function layPackData(game, data) {
180
+ const before = game.current;
181
+ const after = layData(before, data);
182
+ for (const kind of DATA_KINDS) {
183
+ const collection = collectionOf(game, kind);
184
+ const was = new Map((before[kind] ?? []).map((def) => [def.id, def]));
185
+ const now = after[kind] ?? [];
186
+ for (const def of now) {
187
+ if (!was.has(def.id)) collection.add(def);
188
+ else if (was.get(def.id) !== def) collection.override(def.id, () => def);
189
+ was.delete(def.id);
190
+ }
191
+ for (const id of was.keys()) collection.remove(id);
192
+ }
193
+ if (after.ai !== before.ai) game.set("ai", after.ai);
194
+ const rules = data.rules;
195
+ if (rules?.supply || rules?.heroes) game.settings({
196
+ ...rules.supply && { supply: rules.supply },
197
+ ...rules.heroes && { heroes: rules.heroes }
198
+ });
199
+ if (after.upkeep !== before.upkeep) game.set("upkeep", after.upkeep);
200
+ if (after.resources !== before.resources) {
201
+ const was = new Set((before.resources ?? []).map((resource) => resource.id));
202
+ for (const resource of after.resources ?? []) {
203
+ if (was.has(resource.id)) game.resources.override(resource.id, () => resource);
204
+ else game.resources.add(resource);
205
+ was.delete(resource.id);
206
+ }
207
+ for (const id of was) game.resources.remove(id);
208
+ }
209
+ }
210
+ /**
211
+ * Whether a game was made with packs, and which: those of the mods its composition kept a hash of, by id and version
212
+ *
213
+ * @beta
214
+ */
215
+ var packsOf = (game) => (game.mods ?? []).filter((mod) => mod.hash !== void 0).map(({ id, version }) => ({
216
+ id,
217
+ version
218
+ }));
219
+ //#endregion
220
+ export { PackError, checkPack, checkPackSchema, packFromJson, packsOf };
221
+
222
+ //# sourceMappingURL=packs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"packs.js","names":[],"sources":["../src/packs.ts"],"sourcesContent":["import type { AbilityDef, BuffDef, ItemDef, UnitTypeDef, UpgradeDef } from './defs'\nimport { DATA_KINDS, type DataKind, type GameData, layData } from './gameData'\nimport type { Rules } from './game'\nimport type { GameBuilder, ModDef } from './mods'\nimport type { RaceDef } from './races'\nimport type { RuleSettingsInit } from './rules'\n\n/*\n * A pack of content as JSON (campaign plan RC6): definitions, data over them and rules, in a file a game names and\n * fetches before its world is made (`packs/<id>/pack.json`), made into a mod (`packFromJson`) that `composeGame`\n * applies as any other. The same bytes in the same order give the same game: each list is added in the order of its\n * ids, packs in the order they are named, and what a save and a lobby check (the game's hash) has each pack's own.\n */\n\n/**\n * A pack of content as its file has it (`packs/<id>/pack.json`): plain data, checked against the pack's schema\n * (`@v12-engine/engine/schemas/pack.schema.json`) as it is read. Its definitions are added to the game's, or put in the place of those of the same id;\n * then its `data` is laid over the whole as a `data.json` is (`layData`), and its `settings` over the game's\n *\n * @beta\n */\nexport interface PackFile {\n\t/** Letters, digits, dots and dashes: what the game composed of it is called by (`melee+<id>`) */\n\tid: string\n\t/** `major.minor.patch` */\n\tversion: string\n\t/** A human-readable name for the pack, shown where the id is not enough */\n\tname?: string\n\t/** The game and the packs or mods it is made for, as a mod's (`ModDef.requires`) */\n\trequires?: string[]\n\t/** Unit type definitions the pack adds to the game's or puts in the place of those of the same id */\n\tunits?: UnitTypeDef[]\n\t/** Ability definitions the pack adds or replaces */\n\tabilities?: AbilityDef[]\n\t/** Buff definitions the pack adds or replaces */\n\tbuffs?: BuffDef[]\n\t/** Item definitions the pack adds or replaces */\n\titems?: ItemDef[]\n\t/** Upgrade definitions the pack adds or replaces */\n\tupgrades?: UpgradeDef[]\n\t/** Race definitions the pack adds or replaces */\n\traces?: RaceDef[]\n\t/** The rules it changes, as data (`GameBuilder.settings`) */\n\tsettings?: RuleSettingsInit\n\t/** Values over the definitions, as a `data.json` has them (`GameData`): the editor's Data panel writes here for a pack */\n\tdata?: GameData\n\t/** What its units look like, as a `looks.json` has them: the client's to lay over the game's view */\n\tlooks?: Record<string, unknown>\n}\n\n/**\n * A mod made of a pack (`packFromJson`): the mod, and the pack's file it was made of\n *\n * @beta\n */\nexport interface PackMod extends ModDef {\n\t/** The pack's file this mod was made from */\n\treadonly pack: PackFile\n\t/** The hash of the pack's bytes as they were read: kept with the game's mods, so the game's hash has it */\n\treadonly hash: string\n}\n\n/**\n * Why a pack's file is not one, where it is first wrong\n *\n * @beta\n */\nexport class PackError extends Error {}\n\nconst ID = /^[a-z0-9][a-z0-9._-]*$/i\nconst VERSION = /^\\d+(\\.\\d+){0,2}$/\n\nconst isRecord = (value: unknown): value is Record<string, unknown> => typeof value === 'object' && value !== null && !Array.isArray(value)\n\n/**\n * Checks a pack's file as it is read (the schema's rules a loader needs: the pack's schema has all of them):\n * its id and version, and that each list is of definitions with an id, once each. Throws `PackError` saying where\n *\n * @beta\n */\nexport function checkPack(json: unknown, where = 'the pack'): PackFile {\n\tconst wrong = (why: string): never => {\n\t\tthrow new PackError(`${where}: ${why}`)\n\t}\n\tif (!isRecord(json)) return wrong('is no object')\n\tif (typeof json.id !== 'string' || !ID.test(json.id)) wrong('its id is letters, digits, dots and dashes')\n\tif (typeof json.version !== 'string' || !VERSION.test(json.version)) wrong('its version is major.minor.patch')\n\tif (json.requires !== undefined && (!Array.isArray(json.requires) || json.requires.some((each) => typeof each !== 'string')))\n\t\twrong('requires is a list of words')\n\tfor (const kind of DATA_KINDS) {\n\t\tconst list = json[kind]\n\t\tif (list === undefined) continue\n\t\tif (!Array.isArray(list)) wrong(`${kind} is no list`)\n\t\tconst seen = new Set<string>()\n\t\tfor (const [at, def] of (list as unknown[]).entries()) {\n\t\t\tif (!isRecord(def) || typeof def.id !== 'string' || !def.id) wrong(`${kind}[${at}] has no id`)\n\t\t\tconst id = (def as { id: string }).id\n\t\t\tif (seen.has(id)) wrong(`${kind} has \"${id}\" twice`)\n\t\t\tseen.add(id)\n\t\t}\n\t}\n\tfor (const part of ['settings', 'data', 'looks'] as const) if (json[part] !== undefined && !isRecord(json[part])) wrong(`${part} is no object`)\n\t// the rules' knobs are `settings`, as `PackFile` and the schema say: a pack that names them `rules` is told, not let pass\n\t// with them ignored\n\tif (json.rules !== undefined) wrong('\"rules\" is now \"settings\": the rules\\' knobs a pack changes go under \"settings\"')\n\tconst known = new Set(['$schema', 'id', 'version', 'name', 'requires', ...DATA_KINDS, 'settings', 'data', 'looks'])\n\tconst unknown = Object.keys(json).find((key) => !known.has(key))\n\tif (unknown) wrong(`\"${unknown}\" is nothing a pack has`)\n\treturn json as unknown as PackFile\n}\n\n/** A part of a JSON Schema, as far as the pack's schema uses one (`@v12-engine/engine/schemas/pack.schema.json`) */\ninterface SchemaPart {\n\t$ref?: string\n\ttype?: string | string[]\n\tconst?: unknown\n\tenum?: unknown[]\n\tanyOf?: SchemaPart[]\n\tnot?: SchemaPart\n\tproperties?: Record<string, SchemaPart>\n\trequired?: string[]\n\tadditionalProperties?: boolean | SchemaPart\n\tpropertyNames?: SchemaPart\n\titems?: SchemaPart | SchemaPart[]\n\tminItems?: number\n\tmaxItems?: number\n\tdefinitions?: Record<string, SchemaPart>\n}\n\n/** A word with its article: an object, a number */\nconst an = (word: string) => `${/^[aeiou]/.test(word) ? 'an' : 'a'} ${word}`\n\n/** The type of a value as a schema says it */\nconst typeOf = (value: unknown): string =>\n\tvalue === null ? 'null' : Array.isArray(value) ? 'array' : Number.isInteger(value) ? 'integer' : typeof value\n\n/**\n * Checks a pack's file against the pack's schema (`@v12-engine/engine/schemas/pack.schema.json`, made of `PackFile`):\n * where it is first wrong, in words with its place (`units[2].stats.health: is a string, not a number`), or nothing\n * for one that is right. A small reader of the schema, as far as it uses JSON Schema: what a page that loads packs\n * fetches with them, so that a game without packs carries none of it\n *\n * @beta\n */\nexport function checkPackSchema(json: unknown, schema: object): string | undefined {\n\tconst root = schema as SchemaPart\n\tconst resolve = (part: SchemaPart): SchemaPart => {\n\t\tlet at = part\n\t\tfor (let hops = 0; at.$ref && hops < 32; hops++) at = root.definitions?.[decodeURIComponent(at.$ref.replace('#/definitions/', ''))] ?? {}\n\t\treturn at\n\t}\n\tconst check = (value: unknown, given: SchemaPart, where: string): string | undefined => {\n\t\tconst part = resolve(given)\n\t\tconst type = typeOf(value)\n\t\tif (part.type !== undefined) {\n\t\t\tconst types = Array.isArray(part.type) ? part.type : [part.type]\n\t\t\tif (!types.some((each) => each === type || (each === 'number' && type === 'integer')))\n\t\t\t\treturn `${where || 'the pack'}: is ${an(type)}, not ${types.join(' or ')}`\n\t\t}\n\t\tif ('const' in part && value !== part.const) return `${where || 'the pack'}: is not ${JSON.stringify(part.const)}`\n\t\tif (part.enum && !part.enum.includes(value))\n\t\t\treturn `${where || 'the pack'}: is none of ${part.enum.map((each) => JSON.stringify(each)).join(', ')}`\n\t\tif (part.not && check(value, part.not, where) === undefined) return `${where || 'the pack'}: is what it may not be`\n\t\tif (part.anyOf) {\n\t\t\tconst wrongs = part.anyOf.map((each) => check(value, each, where))\n\t\t\tif (wrongs.every((wrong) => wrong !== undefined)) {\n\t\t\t\t// the form that went furthest says why: the one wrong deepest in\n\t\t\t\treturn wrongs.reduce((deepest, wrong) => (wrong!.length > deepest!.length ? wrong : deepest))\n\t\t\t}\n\t\t}\n\t\tif (type === 'object' && (part.properties || part.required || part.additionalProperties !== undefined || part.propertyNames)) {\n\t\t\tconst object = value as Record<string, unknown>\n\t\t\tfor (const field of part.required ?? []) if (!(field in object)) return `${where || 'the pack'}: has no ${field}`\n\t\t\tfor (const [field, each] of Object.entries(object)) {\n\t\t\t\tconst at = where ? `${where}.${field}` : field\n\t\t\t\tif (part.propertyNames) {\n\t\t\t\t\tconst name = check(field, part.propertyNames, at)\n\t\t\t\t\tif (name) return name\n\t\t\t\t}\n\t\t\t\tconst own = part.properties?.[field]\n\t\t\t\tif (own) {\n\t\t\t\t\tconst wrong = check(each, own, at)\n\t\t\t\t\tif (wrong) return wrong\n\t\t\t\t} else if (part.additionalProperties === false) return `${at}: is nothing ${where || 'a pack'} has`\n\t\t\t\telse if (typeof part.additionalProperties === 'object') {\n\t\t\t\t\tconst wrong = check(each, part.additionalProperties, at)\n\t\t\t\t\tif (wrong) return wrong\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (type === 'array') {\n\t\t\tconst list = value as unknown[]\n\t\t\tif (part.minItems !== undefined && list.length < part.minItems) return `${where || 'the pack'}: has fewer than ${part.minItems}`\n\t\t\tif (part.maxItems !== undefined && list.length > part.maxItems) return `${where || 'the pack'}: has more than ${part.maxItems}`\n\t\t\tif (part.items)\n\t\t\t\tfor (const [at, each] of list.entries()) {\n\t\t\t\t\tconst item = Array.isArray(part.items) ? part.items[at] : part.items\n\t\t\t\t\tconst wrong = item && check(each, item, `${where}[${at}]`)\n\t\t\t\t\tif (wrong) return wrong\n\t\t\t\t}\n\t\t}\n\t\treturn undefined\n\t}\n\treturn check(json, root, '')\n}\n\n/** FNV-1a, twice over with different starts, of a text: as the game's hash is */\nfunction hashOf(text: string): string {\n\tlet a = 0x811c9dc5\n\tlet b = 0x01000193 ^ 0x5bd1e995\n\tfor (let i = 0; i < text.length; i++) {\n\t\tconst c = text.charCodeAt(i)\n\t\ta = Math.imul(a ^ c, 0x01000193)\n\t\tb = Math.imul(b ^ c, 0x5bd1e995)\n\t}\n\treturn (a >>> 0).toString(16).padStart(8, '0') + (b >>> 0).toString(16).padStart(8, '0')\n}\n\nconst byId = <T extends { id: string }>(defs: readonly T[]) => [...defs].sort((a, b) => (a.id < b.id ? -1 : a.id > b.id ? 1 : 0))\n\n/** The builder's collection of a kind of the game's data */\nconst collectionOf = (game: GameBuilder, kind: DataKind) => game[kind] as unknown as GameBuilder['units']\n\n/**\n * Makes a mod of a pack's file (its text, or what was parsed of it): checked, then applying its definitions (each\n * list in the order of its ids, a definition the game has put in its place), its `data` over the whole and its\n * `settings`. Its hash, of the text as given, goes with the game's mods\n *\n * @beta\n */\nexport function packFromJson(json: string | unknown, where?: string): PackMod {\n\tconst text = typeof json === 'string' ? json : JSON.stringify(json)\n\tlet parsed: unknown\n\ttry {\n\t\tparsed = typeof json === 'string' ? JSON.parse(json) : json\n\t} catch (error) {\n\t\tthrow new PackError(`${where ?? 'the pack'}: is not JSON (${error instanceof Error ? error.message : String(error)})`)\n\t}\n\tconst pack = checkPack(parsed, where)\n\treturn {\n\t\tid: pack.id,\n\t\tversion: pack.version,\n\t\t...(pack.name !== undefined && { name: pack.name }),\n\t\t...(pack.requires !== undefined && { requires: pack.requires }),\n\t\tpack,\n\t\thash: hashOf(text),\n\t\tapply(game) {\n\t\t\tfor (const kind of DATA_KINDS) {\n\t\t\t\tconst defs = pack[kind] as { id: string }[] | undefined\n\t\t\t\tif (!defs) continue\n\t\t\t\tconst collection = collectionOf(game, kind)\n\t\t\t\tfor (const def of byId(defs)) {\n\t\t\t\t\tconst own = structuredClone(def) as UnitTypeDef\n\t\t\t\t\tif (collection.has(def.id)) collection.override(def.id, () => own)\n\t\t\t\t\telse collection.add(own)\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (pack.data) layPackData(game, pack.data)\n\t\t\tif (pack.settings) game.settings(pack.settings)\n\t\t}\n\t}\n}\n\n/** A `data.json`'s values laid over the game as the builder has it: each definition it changes put in its place, those it takes out gone */\nfunction layPackData(game: GameBuilder, data: GameData): void {\n\tconst before = game.current as Rules\n\tconst after = layData(before, data)\n\tfor (const kind of DATA_KINDS) {\n\t\tconst collection = collectionOf(game, kind)\n\t\tconst was = new Map(((before[kind] ?? []) as { id: string }[]).map((def) => [def.id, def]))\n\t\tconst now = (after[kind] ?? []) as unknown as UnitTypeDef[]\n\t\tfor (const def of now) {\n\t\t\tif (!was.has(def.id)) collection.add(def)\n\t\t\telse if (was.get(def.id) !== (def as unknown)) collection.override(def.id, () => def)\n\t\t\twas.delete(def.id)\n\t\t}\n\t\tfor (const id of was.keys()) collection.remove(id)\n\t}\n\tif (after.ai !== before.ai) game.set('ai', after.ai)\n\t// the rules as data (`GameData.rules`), as a `data.json`'s are laid: supply and heroes over the settings, the upkeep\n\t// tiers and the resources whole in place of the game's\n\tconst rules = data.rules\n\tif (rules?.supply || rules?.heroes)\n\t\tgame.settings({ ...(rules.supply && { supply: rules.supply }), ...(rules.heroes && { heroes: rules.heroes }) } as RuleSettingsInit)\n\tif (after.upkeep !== before.upkeep) game.set('upkeep', after.upkeep)\n\tif (after.resources !== before.resources) {\n\t\tconst was = new Set((before.resources ?? []).map((resource) => resource.id))\n\t\tfor (const resource of after.resources ?? []) {\n\t\t\tif (was.has(resource.id)) game.resources.override(resource.id, () => resource)\n\t\t\telse game.resources.add(resource)\n\t\t\twas.delete(resource.id)\n\t\t}\n\t\tfor (const id of was) game.resources.remove(id)\n\t}\n}\n\n/**\n * Whether a game was made with packs, and which: those of the mods its composition kept a hash of, by id and version\n *\n * @beta\n */\nexport const packsOf = (game: Pick<Rules, 'mods'>): { id: string; version: string }[] =>\n\t(game.mods ?? []).filter((mod) => (mod as { hash?: string }).hash !== undefined).map(({ id, version }) => ({ id, version }))\n"],"mappings":"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"}
package/dist/paths.d.ts CHANGED
@@ -29,7 +29,9 @@ export declare class Path {
29
29
  width: number);
30
30
  /** How long it is, from its first point to its last */
31
31
  get length(): number;
32
+ /** A copy of the path's first point */
32
33
  get start(): Vec2;
34
+ /** A copy of the path's last point */
33
35
  get end(): Vec2;
34
36
  /**
35
37
  * Where on the path something is that has gone `distance` along it from its start, facing the way it goes. Before
package/dist/paths.js ADDED
@@ -0,0 +1,109 @@
1
+ import { atan2, hypot } from "./exactMath.js";
2
+ import { clamp } from "./math.js";
3
+ //#region src/paths.ts
4
+ /**
5
+ * A line on the map, through points in order, with a width: a road, a patrol route, the way a wave walks. What the
6
+ * rules ask of one a game would otherwise write each time: how long it is, where along it something is, how far a
7
+ * point is from it, whether a point is on it
8
+ *
9
+ * @beta
10
+ */
11
+ var Path = class {
12
+ points;
13
+ width;
14
+ /** How far along the path each of its points is */
15
+ along;
16
+ constructor(points, width) {
17
+ this.points = points;
18
+ this.width = width;
19
+ this.along = [0];
20
+ for (let i = 1; i < points.length; i++) this.along.push(this.along[i - 1] + hypot(points[i].x - points[i - 1].x, points[i].z - points[i - 1].z));
21
+ }
22
+ /** How long it is, from its first point to its last */
23
+ get length() {
24
+ return this.along[this.along.length - 1] ?? 0;
25
+ }
26
+ /** A copy of the path's first point */
27
+ get start() {
28
+ return { ...this.points[0] };
29
+ }
30
+ /** A copy of the path's last point */
31
+ get end() {
32
+ return { ...this.points[this.points.length - 1] };
33
+ }
34
+ /**
35
+ * Where on the path something is that has gone `distance` along it from its start, facing the way it goes. Before
36
+ * the start is the start, past the end the end
37
+ */
38
+ at(distance) {
39
+ const { points, along } = this;
40
+ if (points.length === 1) return {
41
+ ...points[0],
42
+ facing: 0
43
+ };
44
+ const d = clamp(distance, 0, this.length);
45
+ let i = 1;
46
+ while (i < points.length - 1 && along[i] < d) i++;
47
+ const a = points[i - 1];
48
+ const b = points[i];
49
+ const stretch = along[i] - along[i - 1];
50
+ const t = stretch > 0 ? (d - along[i - 1]) / stretch : 0;
51
+ return {
52
+ x: a.x + (b.x - a.x) * t,
53
+ z: a.z + (b.z - a.z) * t,
54
+ facing: atan2(b.x - a.x, b.z - a.z)
55
+ };
56
+ }
57
+ /** The nearest point of its middle line to a point, and how far along the path that is */
58
+ nearest(point) {
59
+ const { points, along } = this;
60
+ if (points.length === 1) return {
61
+ at: { ...points[0] },
62
+ distance: hypot(point.x - points[0].x, point.z - points[0].z),
63
+ along: 0
64
+ };
65
+ let best = {
66
+ at: { ...points[0] },
67
+ distance: Infinity,
68
+ along: 0
69
+ };
70
+ for (let i = 1; i < points.length; i++) {
71
+ const a = points[i - 1];
72
+ const b = points[i];
73
+ const dx = b.x - a.x;
74
+ const dz = b.z - a.z;
75
+ const lengthSq = dx * dx + dz * dz;
76
+ const t = lengthSq > 0 ? clamp(((point.x - a.x) * dx + (point.z - a.z) * dz) / lengthSq, 0, 1) : 0;
77
+ const at = {
78
+ x: a.x + dx * t,
79
+ z: a.z + dz * t
80
+ };
81
+ const distance = hypot(point.x - at.x, point.z - at.z);
82
+ if (distance < best.distance) best = {
83
+ at,
84
+ distance,
85
+ along: along[i - 1] + (along[i] - along[i - 1]) * t
86
+ };
87
+ }
88
+ return best;
89
+ }
90
+ /** How far a point is from the middle of the path */
91
+ distanceTo(point) {
92
+ return this.nearest(point).distance;
93
+ }
94
+ /** Whether a point is on the path: no more than half its width from its middle */
95
+ contains(point) {
96
+ return this.distanceTo(point) <= this.width / 2;
97
+ }
98
+ /** Whether the middle of a cell of the map is on the path: what it paints, and keeps clear */
99
+ containsCell(cx, cz) {
100
+ return this.contains({
101
+ x: cx + .5,
102
+ z: cz + .5
103
+ });
104
+ }
105
+ };
106
+ //#endregion
107
+ export { Path };
108
+
109
+ //# sourceMappingURL=paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.js","names":[],"sources":["../src/paths.ts"],"sourcesContent":["import { clamp, type Vec2 } from './math'\nimport { atan2, hypot } from './exactMath'\n\n/**\n * A spot, and the way it faces: where a wave comes in, where a hero stands, where a camera looks from\n *\n * @beta\n */\nexport interface Spot extends Vec2 {\n\t/** Radians, the way entities face: 0 is along +z */\n\tfacing: number\n}\n\n/**\n * A line on the map, through points in order, with a width: a road, a patrol route, the way a wave walks. What the\n * rules ask of one a game would otherwise write each time: how long it is, where along it something is, how far a\n * point is from it, whether a point is on it\n *\n * @beta\n */\nexport class Path {\n\t/** How far along the path each of its points is */\n\tprivate readonly along: number[]\n\n\tconstructor(\n\t\t/** Its points, in order. Not to be changed: the path works out its length from them once */\n\t\treadonly points: readonly Vec2[],\n\t\t/** How wide it is: a point is on it when it is no more than half of this from its middle */\n\t\treadonly width: number\n\t) {\n\t\tthis.along = [0]\n\t\tfor (let i = 1; i < points.length; i++) this.along.push(this.along[i - 1] + hypot(points[i].x - points[i - 1].x, points[i].z - points[i - 1].z))\n\t}\n\n\t/** How long it is, from its first point to its last */\n\tget length(): number {\n\t\treturn this.along[this.along.length - 1] ?? 0\n\t}\n\n\t/** A copy of the path's first point */\n\tget start(): Vec2 {\n\t\treturn { ...this.points[0] }\n\t}\n\n\t/** A copy of the path's last point */\n\tget end(): Vec2 {\n\t\treturn { ...this.points[this.points.length - 1] }\n\t}\n\n\t/**\n\t * Where on the path something is that has gone `distance` along it from its start, facing the way it goes. Before\n\t * the start is the start, past the end the end\n\t */\n\tat(distance: number): Spot {\n\t\tconst { points, along } = this\n\t\tif (points.length === 1) return { ...points[0], facing: 0 }\n\t\tconst d = clamp(distance, 0, this.length)\n\t\tlet i = 1\n\t\twhile (i < points.length - 1 && along[i] < d) i++\n\t\tconst a = points[i - 1]\n\t\tconst b = points[i]\n\t\tconst stretch = along[i] - along[i - 1]\n\t\tconst t = stretch > 0 ? (d - along[i - 1]) / stretch : 0\n\t\treturn { x: a.x + (b.x - a.x) * t, z: a.z + (b.z - a.z) * t, facing: atan2(b.x - a.x, b.z - a.z) }\n\t}\n\n\t/** The nearest point of its middle line to a point, and how far along the path that is */\n\tnearest(point: Vec2): { at: Vec2; distance: number; along: number } {\n\t\tconst { points, along } = this\n\t\tif (points.length === 1) return { at: { ...points[0] }, distance: hypot(point.x - points[0].x, point.z - points[0].z), along: 0 }\n\t\tlet best = { at: { ...points[0] }, distance: Infinity, along: 0 }\n\t\tfor (let i = 1; i < points.length; i++) {\n\t\t\tconst a = points[i - 1]\n\t\t\tconst b = points[i]\n\t\t\tconst dx = b.x - a.x\n\t\t\tconst dz = b.z - a.z\n\t\t\tconst lengthSq = dx * dx + dz * dz\n\t\t\tconst t = lengthSq > 0 ? clamp(((point.x - a.x) * dx + (point.z - a.z) * dz) / lengthSq, 0, 1) : 0\n\t\t\tconst at = { x: a.x + dx * t, z: a.z + dz * t }\n\t\t\tconst distance = hypot(point.x - at.x, point.z - at.z)\n\t\t\tif (distance < best.distance) best = { at, distance, along: along[i - 1] + (along[i] - along[i - 1]) * t }\n\t\t}\n\t\treturn best\n\t}\n\n\t/** How far a point is from the middle of the path */\n\tdistanceTo(point: Vec2): number {\n\t\treturn this.nearest(point).distance\n\t}\n\n\t/** Whether a point is on the path: no more than half its width from its middle */\n\tcontains(point: Vec2): boolean {\n\t\treturn this.distanceTo(point) <= this.width / 2\n\t}\n\n\t/** Whether the middle of a cell of the map is on the path: what it paints, and keeps clear */\n\tcontainsCell(cx: number, cz: number): boolean {\n\t\treturn this.contains({ x: cx + 0.5, z: cz + 0.5 })\n\t}\n}\n"],"mappings":"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"}
package/dist/plain.js ADDED
@@ -0,0 +1,57 @@
1
+ //#region src/plain.ts
2
+ /**
3
+ * A copy of a value that is plain data all the way down: numbers, text, lists and plain objects, which is what a
4
+ * file and a wire can carry. Throws when something in it is not (a `Map`, a class, a function), saying where:
5
+ * `what` is whose data it is ("Save", "Map"), `where` the path so far, `advice` what to do about it
6
+ *
7
+ * @beta
8
+ */
9
+ function plain(value, where, what, advice = "") {
10
+ if (value === null || value === void 0 || typeof value === "number" || typeof value === "string" || typeof value === "boolean") return value;
11
+ if (Array.isArray(value)) return value.map((item, i) => plain(item, `${where}[${i}]`, what, advice));
12
+ if (typeof value === "object") {
13
+ const prototype = Object.getPrototypeOf(value);
14
+ if (prototype !== Object.prototype && prototype !== null) throw new Error(`${what}: ${where} is a ${prototype?.constructor?.name ?? "thing"}, not plain data${advice && `: ${advice}`}`);
15
+ const copy = {};
16
+ for (const [key, item] of Object.entries(value)) if (item !== void 0) copy[key] = plain(item, `${where}.${key}`, what, advice);
17
+ return copy;
18
+ }
19
+ throw new Error(`${what}: ${where} is a ${typeof value}, not plain data`);
20
+ }
21
+ /**
22
+ * The plain data of a value, and the paths of what was left out of it for not being plain (`settings.economy.workersPer`):
23
+ * a plain object's fields each kept or left out, a list as a whole. For what keeps the data of something that may hold
24
+ * code beside it (a computer player's options)
25
+ */
26
+ function plainParts(value, where = "") {
27
+ const prototype = typeof value === "object" && value !== null && !Array.isArray(value) ? Object.getPrototypeOf(value) : void 0;
28
+ if (prototype === Object.prototype || prototype === null) {
29
+ const kept = {};
30
+ const dropped = [];
31
+ for (const [key, item] of Object.entries(value)) {
32
+ if (item === void 0) continue;
33
+ const part = plainParts(item, where ? `${where}.${key}` : key);
34
+ if (part.kept !== void 0) kept[key] = part.kept;
35
+ dropped.push(...part.dropped);
36
+ }
37
+ return {
38
+ kept,
39
+ dropped
40
+ };
41
+ }
42
+ try {
43
+ return {
44
+ kept: plain(value, where, "Plain parts"),
45
+ dropped: []
46
+ };
47
+ } catch {
48
+ return {
49
+ kept: void 0,
50
+ dropped: [where]
51
+ };
52
+ }
53
+ }
54
+ //#endregion
55
+ export { plain, plainParts };
56
+
57
+ //# sourceMappingURL=plain.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plain.js","names":[],"sources":["../src/plain.ts"],"sourcesContent":["/**\n * A copy of a value that is plain data all the way down: numbers, text, lists and plain objects, which is what a\n * file and a wire can carry. Throws when something in it is not (a `Map`, a class, a function), saying where:\n * `what` is whose data it is (\"Save\", \"Map\"), `where` the path so far, `advice` what to do about it\n *\n * @beta\n */\nexport function plain(value: unknown, where: string, what: string, advice = ''): unknown {\n\tif (value === null || value === undefined || typeof value === 'number' || typeof value === 'string' || typeof value === 'boolean') return value\n\tif (Array.isArray(value)) return value.map((item, i) => plain(item, `${where}[${i}]`, what, advice))\n\tif (typeof value === 'object') {\n\t\tconst prototype = Object.getPrototypeOf(value)\n\t\tif (prototype !== Object.prototype && prototype !== null) {\n\t\t\tthrow new Error(`${what}: ${where} is a ${prototype?.constructor?.name ?? 'thing'}, not plain data${advice && `: ${advice}`}`)\n\t\t}\n\t\tconst copy: Record<string, unknown> = {}\n\t\tfor (const [key, item] of Object.entries(value)) if (item !== undefined) copy[key] = plain(item, `${where}.${key}`, what, advice)\n\t\treturn copy\n\t}\n\tthrow new Error(`${what}: ${where} is a ${typeof value}, not plain data`)\n}\n\n/**\n * The plain data of a value, and the paths of what was left out of it for not being plain (`settings.economy.workersPer`):\n * a plain object's fields each kept or left out, a list as a whole. For what keeps the data of something that may hold\n * code beside it (a computer player's options)\n */\nexport function plainParts(value: unknown, where = ''): { kept: unknown; dropped: string[] } {\n\tconst prototype = typeof value === 'object' && value !== null && !Array.isArray(value) ? Object.getPrototypeOf(value) : undefined\n\tif (prototype === Object.prototype || prototype === null) {\n\t\tconst kept: Record<string, unknown> = {}\n\t\tconst dropped: string[] = []\n\t\tfor (const [key, item] of Object.entries(value as object)) {\n\t\t\tif (item === undefined) continue\n\t\t\tconst part = plainParts(item, where ? `${where}.${key}` : key)\n\t\t\tif (part.kept !== undefined) kept[key] = part.kept\n\t\t\tdropped.push(...part.dropped)\n\t\t}\n\t\treturn { kept, dropped }\n\t}\n\ttry {\n\t\treturn { kept: plain(value, where, 'Plain parts'), dropped: [] }\n\t} catch {\n\t\treturn { kept: undefined, dropped: [where] }\n\t}\n}\n"],"mappings":";;;;;;;;AAOA,SAAgB,MAAM,OAAgB,OAAe,MAAc,SAAS,IAAa;CACxF,IAAI,UAAU,QAAQ,UAAU,KAAA,KAAa,OAAO,UAAU,YAAY,OAAO,UAAU,YAAY,OAAO,UAAU,WAAW,OAAO;CAC1I,IAAI,MAAM,QAAQ,KAAK,GAAG,OAAO,MAAM,KAAK,MAAM,MAAM,MAAM,MAAM,GAAG,MAAM,GAAG,EAAE,IAAI,MAAM,MAAM,CAAC;CACnG,IAAI,OAAO,UAAU,UAAU;EAC9B,MAAM,YAAY,OAAO,eAAe,KAAK;EAC7C,IAAI,cAAc,OAAO,aAAa,cAAc,MACnD,MAAM,IAAI,MAAM,GAAG,KAAK,IAAI,MAAM,QAAQ,WAAW,aAAa,QAAQ,QAAQ,kBAAkB,UAAU,KAAK,UAAU;EAE9H,MAAM,OAAgC,CAAC;EACvC,KAAK,MAAM,CAAC,KAAK,SAAS,OAAO,QAAQ,KAAK,GAAG,IAAI,SAAS,KAAA,GAAW,KAAK,OAAO,MAAM,MAAM,GAAG,MAAM,GAAG,OAAO,MAAM,MAAM;EAChI,OAAO;CACR;CACA,MAAM,IAAI,MAAM,GAAG,KAAK,IAAI,MAAM,QAAQ,OAAO,MAAM,iBAAiB;AACzE;;;;;;AAOA,SAAgB,WAAW,OAAgB,QAAQ,IAA0C;CAC5F,MAAM,YAAY,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK,IAAI,OAAO,eAAe,KAAK,IAAI,KAAA;CACxH,IAAI,cAAc,OAAO,aAAa,cAAc,MAAM;EACzD,MAAM,OAAgC,CAAC;EACvC,MAAM,UAAoB,CAAC;EAC3B,KAAK,MAAM,CAAC,KAAK,SAAS,OAAO,QAAQ,KAAe,GAAG;GAC1D,IAAI,SAAS,KAAA,GAAW;GACxB,MAAM,OAAO,WAAW,MAAM,QAAQ,GAAG,MAAM,GAAG,QAAQ,GAAG;GAC7D,IAAI,KAAK,SAAS,KAAA,GAAW,KAAK,OAAO,KAAK;GAC9C,QAAQ,KAAK,GAAG,KAAK,OAAO;EAC7B;EACA,OAAO;GAAE;GAAM;EAAQ;CACxB;CACA,IAAI;EACH,OAAO;GAAE,MAAM,MAAM,OAAO,OAAO,aAAa;GAAG,SAAS,CAAC;EAAE;CAChE,QAAQ;EACP,OAAO;GAAE,MAAM,KAAA;GAAW,SAAS,CAAC,KAAK;EAAE;CAC5C;AACD"}