@v12-engine/engine 0.1.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (951) hide show
  1. package/dist/abilities/amounts.d.ts +28 -0
  2. package/dist/abilities/amounts.js +74 -0
  3. package/dist/abilities/amounts.js.map +1 -0
  4. package/dist/abilities/buffs.d.ts +106 -6
  5. package/dist/abilities/buffs.js +443 -0
  6. package/dist/abilities/buffs.js.map +1 -0
  7. package/dist/abilities/castTold.d.ts +2 -0
  8. package/dist/abilities/castTold.js +66 -0
  9. package/dist/abilities/castTold.js.map +1 -0
  10. package/dist/abilities/chance.d.ts +38 -0
  11. package/dist/abilities/chance.js +77 -0
  12. package/dist/abilities/chance.js.map +1 -0
  13. package/dist/abilities/charges.d.ts +18 -0
  14. package/dist/abilities/charges.js +101 -0
  15. package/dist/abilities/charges.js.map +1 -0
  16. package/dist/abilities/control.d.ts +28 -0
  17. package/dist/abilities/control.js +113 -0
  18. package/dist/abilities/control.js.map +1 -0
  19. package/dist/abilities/dispel.js +51 -0
  20. package/dist/abilities/dispel.js.map +1 -0
  21. package/dist/abilities/effectFields.d.ts +1 -1
  22. package/dist/abilities/effectFields.js +676 -0
  23. package/dist/abilities/effectFields.js.map +1 -0
  24. package/dist/abilities/effectIndex.d.ts +27 -0
  25. package/dist/abilities/effectIndex.js +64 -0
  26. package/dist/abilities/effectIndex.js.map +1 -0
  27. package/dist/abilities/effects/buff.d.ts +9 -3
  28. package/dist/abilities/effects/buff.js +84 -0
  29. package/dist/abilities/effects/buff.js.map +1 -0
  30. package/dist/abilities/effects/conditions.d.ts +2 -0
  31. package/dist/abilities/effects/conditions.js +41 -0
  32. package/dist/abilities/effects/conditions.js.map +1 -0
  33. package/dist/abilities/effects/core.js +54 -0
  34. package/dist/abilities/effects/core.js.map +1 -0
  35. package/dist/abilities/effects/damage.d.ts +1 -1
  36. package/dist/abilities/effects/damage.js +43 -0
  37. package/dist/abilities/effects/damage.js.map +1 -0
  38. package/dist/abilities/effects/heal.d.ts +2 -2
  39. package/dist/abilities/effects/heal.js +51 -0
  40. package/dist/abilities/effects/heal.js.map +1 -0
  41. package/dist/abilities/effects/missile.d.ts +13 -1
  42. package/dist/abilities/effects/missile.js +104 -0
  43. package/dist/abilities/effects/missile.js.map +1 -0
  44. package/dist/abilities/effects/morph.d.ts +5 -0
  45. package/dist/abilities/effects/morph.js +43 -0
  46. package/dist/abilities/effects/morph.js.map +1 -0
  47. package/dist/abilities/effects/moves.d.ts +16 -4
  48. package/dist/abilities/effects/moves.js +212 -0
  49. package/dist/abilities/effects/moves.js.map +1 -0
  50. package/dist/abilities/effects/passives.d.ts +19 -9
  51. package/dist/abilities/effects/passives.js +131 -0
  52. package/dist/abilities/effects/passives.js.map +1 -0
  53. package/dist/abilities/effects/proxy.d.ts +5 -0
  54. package/dist/abilities/effects/proxy.js +60 -0
  55. package/dist/abilities/effects/proxy.js.map +1 -0
  56. package/dist/abilities/effects/sight.d.ts +2 -2
  57. package/dist/abilities/effects/sight.js +39 -0
  58. package/dist/abilities/effects/sight.js.map +1 -0
  59. package/dist/abilities/effects/spawn.d.ts +5 -2
  60. package/dist/abilities/effects/spawn.js +40 -0
  61. package/dist/abilities/effects/spawn.js.map +1 -0
  62. package/dist/abilities/effects/timed.d.ts +2 -2
  63. package/dist/abilities/effects/timed.js +96 -0
  64. package/dist/abilities/effects/timed.js.map +1 -0
  65. package/dist/abilities/effects/trade.d.ts +1 -1
  66. package/dist/abilities/effects/trade.js +25 -0
  67. package/dist/abilities/effects/trade.js.map +1 -0
  68. package/dist/abilities/effects.d.ts +97 -23
  69. package/dist/abilities/effects.js +860 -0
  70. package/dist/abilities/effects.js.map +1 -0
  71. package/dist/abilities/land.d.ts +38 -4
  72. package/dist/abilities/land.js +189 -0
  73. package/dist/abilities/land.js.map +1 -0
  74. package/dist/abilities/recast.d.ts +45 -0
  75. package/dist/abilities/recast.js +118 -0
  76. package/dist/abilities/recast.js.map +1 -0
  77. package/dist/abilities/scaled.js +40 -0
  78. package/dist/abilities/scaled.js.map +1 -0
  79. package/dist/abilities/screen.d.ts +6 -0
  80. package/dist/abilities/screen.js +83 -0
  81. package/dist/abilities/screen.js.map +1 -0
  82. package/dist/abilities/shapes.d.ts +66 -0
  83. package/dist/abilities/shapes.js +122 -0
  84. package/dist/abilities/shapes.js.map +1 -0
  85. package/dist/abilities/text.d.ts +14 -2
  86. package/dist/abilities/text.js +204 -0
  87. package/dist/abilities/text.js.map +1 -0
  88. package/dist/abilities/triggers.d.ts +98 -0
  89. package/dist/abilities/triggers.js +351 -0
  90. package/dist/abilities/triggers.js.map +1 -0
  91. package/dist/abilityChanges.d.ts +131 -0
  92. package/dist/abilityChanges.js +345 -0
  93. package/dist/abilityChanges.js.map +1 -0
  94. package/dist/ai/area.d.ts +4 -1
  95. package/dist/ai/brain.d.ts +4 -1
  96. package/dist/ai/brain.js +844 -0
  97. package/dist/ai/brain.js.map +1 -0
  98. package/dist/ai/budget.js +74 -0
  99. package/dist/ai/budget.js.map +1 -0
  100. package/dist/ai/checks.d.ts +9 -1
  101. package/dist/ai/checks.js +242 -0
  102. package/dist/ai/checks.js.map +1 -0
  103. package/dist/ai/computer.d.ts +11 -4
  104. package/dist/ai/computer.js +251 -0
  105. package/dist/ai/computer.js.map +1 -0
  106. package/dist/ai/defence.d.ts +4 -0
  107. package/dist/ai/defence.js +430 -0
  108. package/dist/ai/defence.js.map +1 -0
  109. package/dist/ai/define.d.ts +3 -2
  110. package/dist/ai/define.js +31 -0
  111. package/dist/ai/define.js.map +1 -0
  112. package/dist/ai/economy.d.ts +10 -7
  113. package/dist/ai/economy.js +780 -0
  114. package/dist/ai/economy.js.map +1 -0
  115. package/dist/ai/geometry.js +38 -0
  116. package/dist/ai/geometry.js.map +1 -0
  117. package/dist/ai/goals.d.ts +1 -0
  118. package/dist/ai/goals.js +560 -0
  119. package/dist/ai/goals.js.map +1 -0
  120. package/dist/ai/knowledge.d.ts +72 -7
  121. package/dist/ai/knowledge.js +804 -0
  122. package/dist/ai/knowledge.js.map +1 -0
  123. package/dist/ai/lanes.d.ts +10 -2
  124. package/dist/ai/lanes.js +715 -0
  125. package/dist/ai/lanes.js.map +1 -0
  126. package/dist/ai/melee/build.js +264 -0
  127. package/dist/ai/melee/build.js.map +1 -0
  128. package/dist/ai/melee/goals.d.ts +7 -0
  129. package/dist/ai/melee/goals.js +720 -0
  130. package/dist/ai/melee/goals.js.map +1 -0
  131. package/dist/ai/melee/heroes.js +68 -0
  132. package/dist/ai/melee/heroes.js.map +1 -0
  133. package/dist/ai/melee/index.d.ts +1 -1
  134. package/dist/ai/melee/index.js +51 -0
  135. package/dist/ai/melee/index.js.map +1 -0
  136. package/dist/ai/melee/production.js +29 -0
  137. package/dist/ai/melee/production.js.map +1 -0
  138. package/dist/ai/melee/surrender.js +64 -0
  139. package/dist/ai/melee/surrender.js.map +1 -0
  140. package/dist/ai/micro.d.ts +9 -0
  141. package/dist/ai/micro.js +1316 -0
  142. package/dist/ai/micro.js.map +1 -0
  143. package/dist/ai/mission.d.ts +9 -2
  144. package/dist/ai/mission.js +538 -0
  145. package/dist/ai/mission.js.map +1 -0
  146. package/dist/ai/missionRules.d.ts +1 -1
  147. package/dist/ai/missionRules.js +26 -0
  148. package/dist/ai/missionRules.js.map +1 -0
  149. package/dist/ai/module.d.ts +6 -2
  150. package/dist/ai/module.js +37 -0
  151. package/dist/ai/module.js.map +1 -0
  152. package/dist/ai/options.d.ts +3 -3
  153. package/dist/ai/plans/build.d.ts +20 -1
  154. package/dist/ai/plans/build.js +608 -0
  155. package/dist/ai/plans/build.js.map +1 -0
  156. package/dist/ai/plans/placement.d.ts +4 -1
  157. package/dist/ai/plans/placement.js +295 -0
  158. package/dist/ai/plans/placement.js.map +1 -0
  159. package/dist/ai/plans/plans.d.ts +9 -0
  160. package/dist/ai/plans/plans.js +110 -0
  161. package/dist/ai/plans/plans.js.map +1 -0
  162. package/dist/ai/plans/production.d.ts +14 -2
  163. package/dist/ai/plans/production.js +434 -0
  164. package/dist/ai/plans/production.js.map +1 -0
  165. package/dist/ai/plans/purse.d.ts +6 -3
  166. package/dist/ai/plans/purse.js +139 -0
  167. package/dist/ai/plans/purse.js.map +1 -0
  168. package/dist/ai/plans/tech.d.ts +6 -0
  169. package/dist/ai/plans/tech.js +122 -0
  170. package/dist/ai/plans/tech.js.map +1 -0
  171. package/dist/ai/profiles.d.ts +4 -4
  172. package/dist/{profiles-B3NS9jwk.js → ai/profiles.js} +3 -98
  173. package/dist/ai/profiles.js.map +1 -0
  174. package/dist/ai/reach.js +54 -0
  175. package/dist/ai/reach.js.map +1 -0
  176. package/dist/ai/report.d.ts +8 -0
  177. package/dist/ai/report.js +87 -0
  178. package/dist/ai/report.js.map +1 -0
  179. package/dist/ai/roles.d.ts +4 -0
  180. package/dist/ai/roles.js +207 -0
  181. package/dist/ai/roles.js.map +1 -0
  182. package/dist/ai/rules.d.ts +8 -2
  183. package/dist/ai/rules.js +416 -0
  184. package/dist/ai/rules.js.map +1 -0
  185. package/dist/ai/scouting.d.ts +6 -0
  186. package/dist/ai/scouting.js +324 -0
  187. package/dist/ai/scouting.js.map +1 -0
  188. package/dist/ai/settings.js +99 -0
  189. package/dist/ai/settings.js.map +1 -0
  190. package/dist/ai/squads.d.ts +21 -2
  191. package/dist/ai/squads.js +916 -0
  192. package/dist/ai/squads.js.map +1 -0
  193. package/dist/ai/strength.js +320 -0
  194. package/dist/ai/strength.js.map +1 -0
  195. package/dist/ai/task.d.ts +3 -1
  196. package/dist/ai/task.js +17 -0
  197. package/dist/ai/task.js.map +1 -0
  198. package/dist/ai/tasks/attack.js +24 -0
  199. package/dist/ai/tasks/attack.js.map +1 -0
  200. package/dist/ai/tasks/capture.d.ts +3 -3
  201. package/dist/ai/tasks/capture.js +37 -0
  202. package/dist/ai/tasks/capture.js.map +1 -0
  203. package/dist/ai/tasks/creep.js +29 -0
  204. package/dist/ai/tasks/creep.js.map +1 -0
  205. package/dist/ai/tasks/defend.js +61 -0
  206. package/dist/ai/tasks/defend.js.map +1 -0
  207. package/dist/ai/tasks/drop.js +81 -0
  208. package/dist/ai/tasks/drop.js.map +1 -0
  209. package/dist/ai/tasks/escort.js +59 -0
  210. package/dist/ai/tasks/escort.js.map +1 -0
  211. package/dist/ai/tasks/gather.js +48 -0
  212. package/dist/ai/tasks/gather.js.map +1 -0
  213. package/dist/ai/tasks/harass.js +39 -0
  214. package/dist/ai/tasks/harass.js.map +1 -0
  215. package/dist/ai/tasks/hold.js +32 -0
  216. package/dist/ai/tasks/hold.js.map +1 -0
  217. package/dist/ai/tasks/index.js +34 -0
  218. package/dist/ai/tasks/index.js.map +1 -0
  219. package/dist/ai/tasks/move.js +26 -0
  220. package/dist/ai/tasks/move.js.map +1 -0
  221. package/dist/ai/tasks/patrol.js +59 -0
  222. package/dist/ai/tasks/patrol.js.map +1 -0
  223. package/dist/ai/tasks/retreat.js +28 -0
  224. package/dist/ai/tasks/retreat.js.map +1 -0
  225. package/dist/ai/tasks/scout.js +73 -0
  226. package/dist/ai/tasks/scout.js.map +1 -0
  227. package/dist/ai/tasks/shared.d.ts +1 -1
  228. package/dist/ai/tasks/shared.js +137 -0
  229. package/dist/ai/tasks/shared.js.map +1 -0
  230. package/dist/ai/team.d.ts +18 -1
  231. package/dist/ai/team.js +492 -0
  232. package/dist/ai/team.js.map +1 -0
  233. package/dist/ai/threat.d.ts +6 -0
  234. package/dist/ai/threat.js +206 -0
  235. package/dist/ai/threat.js.map +1 -0
  236. package/dist/ai/view.d.ts +21 -7
  237. package/dist/ai/view.js +677 -0
  238. package/dist/ai/view.js.map +1 -0
  239. package/dist/ai/waves.d.ts +6 -0
  240. package/dist/ai/waves.js +410 -0
  241. package/dist/ai/waves.js.map +1 -0
  242. package/dist/ai.js +54 -6239
  243. package/dist/aiTesting.d.ts +6 -3
  244. package/dist/aiTesting.js +229 -0
  245. package/dist/aiTesting.js.map +1 -0
  246. package/dist/areas.d.ts +4 -1
  247. package/dist/areas.js +295 -0
  248. package/dist/areas.js.map +1 -0
  249. package/dist/attacks.d.ts +3 -3
  250. package/dist/attacks.js +127 -0
  251. package/dist/attacks.js.map +1 -0
  252. package/dist/burning.d.ts +267 -0
  253. package/dist/burning.js +795 -0
  254. package/dist/burning.js.map +1 -0
  255. package/dist/bytes.js +21 -0
  256. package/dist/bytes.js.map +1 -0
  257. package/dist/callings.d.ts +71 -0
  258. package/dist/callings.js +157 -0
  259. package/dist/callings.js.map +1 -0
  260. package/dist/cameraOrders.d.ts +78 -0
  261. package/dist/cameraOrders.js +114 -0
  262. package/dist/cameraOrders.js.map +1 -0
  263. package/dist/camps.d.ts +70 -4
  264. package/dist/camps.js +501 -0
  265. package/dist/camps.js.map +1 -0
  266. package/dist/capture.d.ts +15 -3
  267. package/dist/capture.js +304 -0
  268. package/dist/capture.js.map +1 -0
  269. package/dist/cellLayers.d.ts +78 -13
  270. package/dist/cellLayers.js +275 -0
  271. package/dist/cellLayers.js.map +1 -0
  272. package/dist/cellPatches.d.ts +24 -0
  273. package/dist/cellPatches.js +73 -0
  274. package/dist/cellPatches.js.map +1 -0
  275. package/dist/cinematics.d.ts +10 -5
  276. package/dist/cinematics.js +161 -0
  277. package/dist/cinematics.js.map +1 -0
  278. package/dist/clock.d.ts +2 -2
  279. package/dist/clock.js +78 -0
  280. package/dist/clock.js.map +1 -0
  281. package/dist/commands.d.ts +36 -4
  282. package/dist/commands.js +636 -0
  283. package/dist/commands.js.map +1 -0
  284. package/dist/components.d.ts +31 -10
  285. package/dist/components.js +74 -0
  286. package/dist/components.js.map +1 -0
  287. package/dist/computers.d.ts +4 -4
  288. package/dist/computers.js +194 -0
  289. package/dist/computers.js.map +1 -0
  290. package/dist/concealment.d.ts +25 -2
  291. package/dist/concealment.js +409 -0
  292. package/dist/concealment.js.map +1 -0
  293. package/dist/coreComponents.js +130 -0
  294. package/dist/coreComponents.js.map +1 -0
  295. package/dist/createGame.d.ts +306 -0
  296. package/dist/createGame.js +405 -0
  297. package/dist/createGame.js.map +1 -0
  298. package/dist/dashing.d.ts +18 -2
  299. package/dist/dashing.js +41 -0
  300. package/dist/dashing.js.map +1 -0
  301. package/dist/debug.d.ts +8 -0
  302. package/dist/debug.js +5 -3
  303. package/dist/debug2.js +76 -0
  304. package/dist/debug2.js.map +1 -0
  305. package/dist/debugCommands.d.ts +6 -6
  306. package/dist/debugCommands.js +537 -0
  307. package/dist/debugCommands.js.map +1 -0
  308. package/dist/debugging.d.ts +1 -0
  309. package/dist/defaultSets.d.ts +183 -0
  310. package/dist/defaultSets.js +216 -0
  311. package/dist/defaultSets.js.map +1 -0
  312. package/dist/definitions.d.ts +6 -0
  313. package/dist/definitions.js +78 -0
  314. package/dist/definitions.js.map +1 -0
  315. package/dist/defs.d.ts +1895 -165
  316. package/dist/defs.js +380 -0
  317. package/dist/defs.js.map +1 -0
  318. package/dist/denying.d.ts +4 -4
  319. package/dist/denying.js +106 -0
  320. package/dist/denying.js.map +1 -0
  321. package/dist/destructibles.d.ts +2 -2
  322. package/dist/destructibles.js +36 -0
  323. package/dist/destructibles.js.map +1 -0
  324. package/dist/determinism.d.ts +4 -4
  325. package/dist/determinism.js +247 -0
  326. package/dist/determinism.js.map +1 -0
  327. package/dist/dialog.d.ts +17 -2
  328. package/dist/dialog.js +108 -0
  329. package/dist/dialog.js.map +1 -0
  330. package/dist/effectRefs.js +28 -0
  331. package/dist/effectRefs.js.map +1 -0
  332. package/dist/effects.d.ts +27 -11
  333. package/dist/effects.js +110 -0
  334. package/dist/effects.js.map +1 -0
  335. package/dist/endings.d.ts +1 -1
  336. package/dist/endings.js +78 -0
  337. package/dist/endings.js.map +1 -0
  338. package/dist/engagement.d.ts +40 -6
  339. package/dist/engagement.js +530 -0
  340. package/dist/engagement.js.map +1 -0
  341. package/dist/engineEvents.d.ts +72 -9
  342. package/dist/engineEvents.js +520 -0
  343. package/dist/engineEvents.js.map +1 -0
  344. package/dist/entity.d.ts +275 -26
  345. package/dist/entity.js +441 -0
  346. package/dist/entity.js.map +1 -0
  347. package/dist/entityIndex.d.ts +10 -3
  348. package/dist/entityIndex.js +149 -0
  349. package/dist/entityIndex.js.map +1 -0
  350. package/dist/errors.d.ts +6 -2
  351. package/dist/errors.js +59 -0
  352. package/dist/errors.js.map +1 -0
  353. package/dist/events.d.ts +11 -5
  354. package/dist/events.js +158 -0
  355. package/dist/events.js.map +1 -0
  356. package/dist/exactMath.js +273 -0
  357. package/dist/exactMath.js.map +1 -0
  358. package/dist/features.d.ts +1 -1
  359. package/dist/features.js +127 -0
  360. package/dist/features.js.map +1 -0
  361. package/dist/fields.d.ts +25 -5
  362. package/dist/fields.js +140 -0
  363. package/dist/fields.js.map +1 -0
  364. package/dist/fixture.d.ts +3 -3
  365. package/dist/fixture.js +512 -0
  366. package/dist/fixture.js.map +1 -0
  367. package/dist/fog.d.ts +26 -3
  368. package/dist/fog.js +333 -0
  369. package/dist/fog.js.map +1 -0
  370. package/dist/foliage.d.ts +476 -0
  371. package/dist/foliage.js +1478 -0
  372. package/dist/foliage.js.map +1 -0
  373. package/dist/foliageDebug.d.ts +57 -0
  374. package/dist/foliageDebug.js +172 -0
  375. package/dist/foliageDebug.js.map +1 -0
  376. package/dist/foliageRegrowth.d.ts +20 -0
  377. package/dist/foliageRegrowth.js +332 -0
  378. package/dist/foliageRegrowth.js.map +1 -0
  379. package/dist/formState.d.ts +67 -0
  380. package/dist/formState.js +65 -0
  381. package/dist/formState.js.map +1 -0
  382. package/dist/formation.d.ts +46 -8
  383. package/dist/formation.js +297 -0
  384. package/dist/formation.js.map +1 -0
  385. package/dist/forms.d.ts +58 -0
  386. package/dist/forms.js +146 -0
  387. package/dist/forms.js.map +1 -0
  388. package/dist/friendlyFire.d.ts +2 -2
  389. package/dist/friendlyFire.js +37 -0
  390. package/dist/friendlyFire.js.map +1 -0
  391. package/dist/game.d.ts +141 -48
  392. package/dist/game.js +834 -0
  393. package/dist/game.js.map +1 -0
  394. package/dist/gameData.d.ts +96 -22
  395. package/dist/gameData.js +1690 -0
  396. package/dist/gameData.js.map +1 -0
  397. package/dist/gameFiles.d.ts +3 -3
  398. package/dist/gameFiles.js +14 -0
  399. package/dist/gameFiles.js.map +1 -0
  400. package/dist/gates.js +92 -0
  401. package/dist/gates.js.map +1 -0
  402. package/dist/generate.d.ts +28 -1
  403. package/dist/generate.js +1062 -0
  404. package/dist/generate.js.map +1 -0
  405. package/dist/generateWorker.d.ts +7 -3
  406. package/dist/generateWorker.js +86 -0
  407. package/dist/generateWorker.js.map +1 -0
  408. package/dist/grid.d.ts +9 -0
  409. package/dist/grid.js +102 -0
  410. package/dist/grid.js.map +1 -0
  411. package/dist/ground.d.ts +17 -1
  412. package/dist/ground.js +375 -0
  413. package/dist/ground.js.map +1 -0
  414. package/dist/groundObjects.d.ts +70 -0
  415. package/dist/groundObjects.js +371 -0
  416. package/dist/groundObjects.js.map +1 -0
  417. package/dist/groundSpeed.d.ts +20 -3
  418. package/dist/groundSpeed.js +117 -0
  419. package/dist/groundSpeed.js.map +1 -0
  420. package/dist/hero.d.ts +126 -10
  421. package/dist/hero.js +432 -0
  422. package/dist/hero.js.map +1 -0
  423. package/dist/holds.d.ts +94 -0
  424. package/dist/holds.js +305 -0
  425. package/dist/holds.js.map +1 -0
  426. package/dist/home.d.ts +1 -1
  427. package/dist/home.js +30 -0
  428. package/dist/home.js.map +1 -0
  429. package/dist/hooks.d.ts +339 -57
  430. package/dist/hooks.js +105 -0
  431. package/dist/hooks.js.map +1 -0
  432. package/dist/hotReload.d.ts +6 -5
  433. package/dist/hotReload.js +145 -0
  434. package/dist/hotReload.js.map +1 -0
  435. package/dist/ids.d.ts +3 -3
  436. package/dist/ids.js +30 -0
  437. package/dist/ids.js.map +1 -0
  438. package/dist/idsFile.d.ts +36 -0
  439. package/dist/idsFile.js +134 -0
  440. package/dist/idsFile.js.map +1 -0
  441. package/dist/index.d.ts +105 -68
  442. package/dist/index.js +194 -4701
  443. package/dist/inspect.d.ts +29 -2
  444. package/dist/{inspect-D9dWHmZ0.js → inspect.js} +21 -12
  445. package/dist/inspect.js.map +1 -0
  446. package/dist/inventory.d.ts +14 -1
  447. package/dist/inventory.js +84 -0
  448. package/dist/inventory.js.map +1 -0
  449. package/dist/items.d.ts +136 -8
  450. package/dist/items.js +585 -0
  451. package/dist/items.js.map +1 -0
  452. package/dist/lanes.d.ts +12 -3
  453. package/dist/lanes.js +496 -0
  454. package/dist/lanes.js.map +1 -0
  455. package/dist/life.d.ts +6 -2
  456. package/dist/life.js +287 -0
  457. package/dist/life.js.map +1 -0
  458. package/dist/log.d.ts +26 -3
  459. package/dist/log.js +192 -0
  460. package/dist/log.js.map +1 -0
  461. package/dist/manaBurn.d.ts +2 -2
  462. package/dist/manaBurn.js +75 -0
  463. package/dist/manaBurn.js.map +1 -0
  464. package/dist/map/file.d.ts +56 -3
  465. package/dist/map/file.js +264 -0
  466. package/dist/map/file.js.map +1 -0
  467. package/dist/map/images.js +61 -0
  468. package/dist/map/images.js.map +1 -0
  469. package/dist/map/look.d.ts +1 -1
  470. package/dist/map/look.js +30 -0
  471. package/dist/map/look.js.map +1 -0
  472. package/dist/map/pathProfile.js +183 -0
  473. package/dist/map/pathProfile.js.map +1 -0
  474. package/dist/map/resize.d.ts +4 -0
  475. package/dist/map/resize.js +136 -0
  476. package/dist/map/resize.js.map +1 -0
  477. package/dist/map/schema.js +257 -0
  478. package/dist/map/schema.js.map +1 -0
  479. package/dist/map/terrain.js +214 -0
  480. package/dist/map/terrain.js.map +1 -0
  481. package/dist/map/types.d.ts +92 -13
  482. package/dist/map/types.js +251 -0
  483. package/dist/map/types.js.map +1 -0
  484. package/dist/mapCheck/cells.js +94 -0
  485. package/dist/mapCheck/cells.js.map +1 -0
  486. package/dist/mapCheck/rules/foliage.d.ts +9 -0
  487. package/dist/mapCheck/rules/foliage.js +83 -0
  488. package/dist/mapCheck/rules/foliage.js.map +1 -0
  489. package/dist/mapCheck/rules/names.js +39 -0
  490. package/dist/mapCheck/rules/names.js.map +1 -0
  491. package/dist/mapCheck/rules/objects.d.ts +1 -1
  492. package/dist/mapCheck/rules/objects.js +56 -0
  493. package/dist/mapCheck/rules/objects.js.map +1 -0
  494. package/dist/mapCheck/rules/paths.js +32 -0
  495. package/dist/mapCheck/rules/paths.js.map +1 -0
  496. package/dist/mapCheck/rules/players.js +20 -0
  497. package/dist/mapCheck/rules/players.js.map +1 -0
  498. package/dist/mapCheck/rules/races.js +56 -0
  499. package/dist/mapCheck/rules/races.js.map +1 -0
  500. package/dist/mapCheck/rules/random.js +47 -0
  501. package/dist/mapCheck/rules/random.js.map +1 -0
  502. package/dist/mapCheck/rules/regions.js +30 -0
  503. package/dist/mapCheck/rules/regions.js.map +1 -0
  504. package/dist/mapCheck/rules/targets.js +31 -0
  505. package/dist/mapCheck/rules/targets.js.map +1 -0
  506. package/dist/mapCheck/rules/walking.js +45 -0
  507. package/dist/mapCheck/rules/walking.js.map +1 -0
  508. package/dist/mapCheck.d.ts +2 -2
  509. package/dist/mapCheck.js +63 -0
  510. package/dist/mapCheck.js.map +1 -0
  511. package/dist/mapFields.d.ts +25 -2
  512. package/dist/mapFields.js +134 -0
  513. package/dist/mapFields.js.map +1 -0
  514. package/dist/mapFile.js +176 -0
  515. package/dist/mapFile.js.map +1 -0
  516. package/dist/mapMeasure.d.ts +8 -0
  517. package/dist/mapMeasure.js +283 -0
  518. package/dist/mapMeasure.js.map +1 -0
  519. package/dist/mapMerge.d.ts +1 -0
  520. package/dist/mapMerge.js +172 -0
  521. package/dist/mapMerge.js.map +1 -0
  522. package/dist/mapObjectives.js +138 -0
  523. package/dist/mapObjectives.js.map +1 -0
  524. package/dist/mapObjects.js +80 -0
  525. package/dist/mapObjects.js.map +1 -0
  526. package/dist/math.d.ts +37 -7
  527. package/dist/math.js +155 -0
  528. package/dist/math.js.map +1 -0
  529. package/dist/messages.d.ts +71 -4
  530. package/dist/messages.js +29 -0
  531. package/dist/messages.js.map +1 -0
  532. package/dist/missionRules.d.ts +10 -2
  533. package/dist/{missionRules-C-bGxm0Q.js → missionRules.js} +30 -150
  534. package/dist/missionRules.js.map +1 -0
  535. package/dist/mods.d.ts +39 -20
  536. package/dist/mods.js +271 -0
  537. package/dist/mods.js.map +1 -0
  538. package/dist/moves.d.ts +87 -0
  539. package/dist/moves.js +539 -0
  540. package/dist/moves.js.map +1 -0
  541. package/dist/names.d.ts +7 -0
  542. package/dist/names.js +122 -0
  543. package/dist/names.js.map +1 -0
  544. package/dist/navigation/agentParams.js +14 -0
  545. package/dist/navigation/agentParams.js.map +1 -0
  546. package/dist/navigation/air.d.ts +7 -3
  547. package/dist/navigation/air.js +401 -0
  548. package/dist/navigation/air.js.map +1 -0
  549. package/dist/navigation/builds.d.ts +34 -2
  550. package/dist/navigation/builds.js +287 -0
  551. package/dist/navigation/builds.js.map +1 -0
  552. package/dist/navigation/groundAreas.d.ts +59 -1
  553. package/dist/navigation/groundAreas.js +407 -0
  554. package/dist/navigation/groundAreas.js.map +1 -0
  555. package/dist/navigation/navigation.d.ts +98 -9
  556. package/dist/navigation/recast.d.ts +194 -18
  557. package/dist/navigation/recast.js +1379 -0
  558. package/dist/navigation/recast.js.map +1 -0
  559. package/dist/navigation/sidePaths.d.ts +8 -3
  560. package/dist/navigation/sidePaths.js +241 -0
  561. package/dist/navigation/sidePaths.js.map +1 -0
  562. package/dist/navigation/sized.js +243 -0
  563. package/dist/navigation/sized.js.map +1 -0
  564. package/dist/nearest.js +32 -0
  565. package/dist/nearest.js.map +1 -0
  566. package/dist/noise.js +59 -0
  567. package/dist/noise.js.map +1 -0
  568. package/dist/objectives.d.ts +12 -3
  569. package/dist/objectives.js +144 -0
  570. package/dist/objectives.js.map +1 -0
  571. package/dist/orders/basic.d.ts +5 -5
  572. package/dist/orders/basic.js +417 -0
  573. package/dist/orders/basic.js.map +1 -0
  574. package/dist/orders/build.js +278 -0
  575. package/dist/orders/build.js.map +1 -0
  576. package/dist/orders/cast.d.ts +13 -3
  577. package/dist/orders/cast.js +558 -0
  578. package/dist/orders/cast.js.map +1 -0
  579. package/dist/orders/facts.js +16 -0
  580. package/dist/orders/facts.js.map +1 -0
  581. package/dist/orders/harvest.d.ts +21 -5
  582. package/dist/orders/harvest.js +540 -0
  583. package/dist/orders/harvest.js.map +1 -0
  584. package/dist/orders/idle.d.ts +3 -1
  585. package/dist/orders/idle.js +234 -0
  586. package/dist/orders/idle.js.map +1 -0
  587. package/dist/orders/items.js +92 -0
  588. package/dist/orders/items.js.map +1 -0
  589. package/dist/orders/queue.js +108 -0
  590. package/dist/orders/queue.js.map +1 -0
  591. package/dist/orders/waiting.d.ts +39 -0
  592. package/dist/orders/waiting.js +149 -0
  593. package/dist/orders/waiting.js.map +1 -0
  594. package/dist/pack.schema.js +13 -0
  595. package/dist/pack.schema.js.map +1 -0
  596. package/dist/pack.schema.json +7622 -841
  597. package/dist/packs/director/index.d.ts +13 -5
  598. package/dist/packs/director/index.js +204 -0
  599. package/dist/packs/director/index.js.map +1 -0
  600. package/dist/packs/heroes/campaign.d.ts +3 -2
  601. package/dist/packs/heroes/campaign.js +241 -0
  602. package/dist/packs/heroes/campaign.js.map +1 -0
  603. package/dist/packs/heroes/carry.d.ts +6 -0
  604. package/dist/packs/heroes/carry.js +112 -0
  605. package/dist/packs/heroes/carry.js.map +1 -0
  606. package/dist/packs/heroes/commands.js +115 -0
  607. package/dist/packs/heroes/commands.js.map +1 -0
  608. package/dist/packs/heroes/fallen.d.ts +43 -0
  609. package/dist/packs/heroes/fallen.js +61 -0
  610. package/dist/packs/heroes/fallen.js.map +1 -0
  611. package/dist/packs/heroes/hire.js +60 -0
  612. package/dist/packs/heroes/hire.js.map +1 -0
  613. package/dist/packs/heroes/index.d.ts +7 -6
  614. package/dist/packs/heroes/index.js +130 -0
  615. package/dist/packs/heroes/index.js.map +1 -0
  616. package/dist/packs/heroes/loop.d.ts +95 -0
  617. package/dist/packs/heroes/loop.js +250 -0
  618. package/dist/packs/heroes/loop.js.map +1 -0
  619. package/dist/packs/heroes/making.d.ts +6 -3
  620. package/dist/packs/heroes/making.js +55 -0
  621. package/dist/packs/heroes/making.js.map +1 -0
  622. package/dist/packs/heroes/respawn.d.ts +3 -3
  623. package/dist/packs/heroes/respawn.js +87 -0
  624. package/dist/packs/heroes/respawn.js.map +1 -0
  625. package/dist/packs/heroes/sets.d.ts +32 -0
  626. package/dist/packs/heroes/sets.js +51 -0
  627. package/dist/packs/heroes/sets.js.map +1 -0
  628. package/dist/packs/heroes/spells.d.ts +16 -0
  629. package/dist/packs/heroes/spells.js +269 -0
  630. package/dist/packs/heroes/spells.js.map +1 -0
  631. package/dist/packs/items/defaults.d.ts +43 -0
  632. package/dist/packs/items/defaults.js +1504 -0
  633. package/dist/packs/items/defaults.js.map +1 -0
  634. package/dist/packs/items/index.d.ts +27 -0
  635. package/dist/packs/items/index.js +214 -0
  636. package/dist/packs/items/index.js.map +1 -0
  637. package/dist/packs/moba/index.d.ts +3 -3
  638. package/dist/packs/moba/index.js +174 -0
  639. package/dist/packs/moba/index.js.map +1 -0
  640. package/dist/packs/pack.d.ts +15 -15
  641. package/dist/packs/pack.js +14 -0
  642. package/dist/packs/pack.js.map +1 -0
  643. package/dist/packs.d.ts +15 -7
  644. package/dist/packs.js +222 -0
  645. package/dist/packs.js.map +1 -0
  646. package/dist/paths.d.ts +2 -0
  647. package/dist/paths.js +109 -0
  648. package/dist/paths.js.map +1 -0
  649. package/dist/plain.js +57 -0
  650. package/dist/plain.js.map +1 -0
  651. package/dist/player.d.ts +33 -10
  652. package/dist/player.js +159 -0
  653. package/dist/player.js.map +1 -0
  654. package/dist/portals.d.ts +1 -1
  655. package/dist/portals.js +194 -0
  656. package/dist/portals.js.map +1 -0
  657. package/dist/prefabs.d.ts +25 -2
  658. package/dist/prefabs.js +239 -0
  659. package/dist/prefabs.js.map +1 -0
  660. package/dist/presetBuildings.js +58 -0
  661. package/dist/presetBuildings.js.map +1 -0
  662. package/dist/presetFoliage.d.ts +27 -0
  663. package/dist/presetFoliage.js +98 -0
  664. package/dist/presetFoliage.js.map +1 -0
  665. package/dist/presetGround.js +65 -0
  666. package/dist/presetGround.js.map +1 -0
  667. package/dist/proxies.d.ts +12 -0
  668. package/dist/proxies.js +79 -0
  669. package/dist/proxies.js.map +1 -0
  670. package/dist/query.d.ts +56 -0
  671. package/dist/query.js +88 -0
  672. package/dist/query.js.map +1 -0
  673. package/dist/races.d.ts +15 -14
  674. package/dist/races.js +172 -0
  675. package/dist/races.js.map +1 -0
  676. package/dist/randomGroups.js +91 -0
  677. package/dist/randomGroups.js.map +1 -0
  678. package/dist/registry.d.ts +117 -53
  679. package/dist/registry.js +323 -0
  680. package/dist/registry.js.map +1 -0
  681. package/dist/remains.d.ts +11 -9
  682. package/dist/remains.js +188 -0
  683. package/dist/remains.js.map +1 -0
  684. package/dist/replication.d.ts +12 -7
  685. package/dist/replication.js +100 -0
  686. package/dist/replication.js.map +1 -0
  687. package/dist/rng.d.ts +2 -0
  688. package/dist/rng.js +40 -0
  689. package/dist/rng.js.map +1 -0
  690. package/dist/rules.d.ts +186 -99
  691. package/dist/rules.js +179 -0
  692. package/dist/rules.js.map +1 -0
  693. package/dist/rulesCheck.d.ts +5 -4
  694. package/dist/rulesCheck.js +693 -0
  695. package/dist/rulesCheck.js.map +1 -0
  696. package/dist/runes.d.ts +2 -2
  697. package/dist/runes.js +80 -0
  698. package/dist/runes.js.map +1 -0
  699. package/dist/save.d.ts +37 -12
  700. package/dist/save.js +532 -0
  701. package/dist/save.js.map +1 -0
  702. package/dist/scenario.d.ts +2 -2
  703. package/dist/scenario.js +99 -0
  704. package/dist/scenario.js.map +1 -0
  705. package/dist/scheduler.d.ts +3 -0
  706. package/dist/scheduler.js +156 -0
  707. package/dist/scheduler.js.map +1 -0
  708. package/dist/score.d.ts +19 -19
  709. package/dist/score.js +709 -0
  710. package/dist/score.js.map +1 -0
  711. package/dist/sequences.d.ts +10 -6
  712. package/dist/sequences.js +206 -0
  713. package/dist/sequences.js.map +1 -0
  714. package/dist/server/doorman.js +154 -0
  715. package/dist/server/doorman.js.map +1 -0
  716. package/dist/server/gameServer.d.ts +16 -1
  717. package/dist/server/gameServer.js +643 -0
  718. package/dist/server/gameServer.js.map +1 -0
  719. package/dist/server/index.d.ts +1 -1
  720. package/dist/server/lobby.js +199 -0
  721. package/dist/server/lobby.js.map +1 -0
  722. package/dist/server/log.js +18 -0
  723. package/dist/server/log.js.map +1 -0
  724. package/dist/server/match.js +267 -0
  725. package/dist/server/match.js.map +1 -0
  726. package/dist/server/mode.d.ts +18 -9
  727. package/dist/server/mode.js +220 -0
  728. package/dist/server/mode.js.map +1 -0
  729. package/dist/{navigation-worker.js → server/navigation-worker.js} +1 -1
  730. package/dist/server/navigation-worker.js.map +1 -0
  731. package/dist/server/navigation.js +39 -0
  732. package/dist/server/navigation.js.map +1 -0
  733. package/dist/server/ops.d.ts +4 -0
  734. package/dist/server/ops.js +137 -0
  735. package/dist/server/ops.js.map +1 -0
  736. package/dist/server/packs.d.ts +3 -3
  737. package/dist/server/packs.js +32 -0
  738. package/dist/server/packs.js.map +1 -0
  739. package/dist/server/ratings.d.ts +5 -0
  740. package/dist/server/ratings.js +104 -0
  741. package/dist/server/ratings.js.map +1 -0
  742. package/dist/server/relay.d.ts +12 -2
  743. package/dist/server/relay.js +144 -0
  744. package/dist/server/relay.js.map +1 -0
  745. package/dist/server/rooms.d.ts +9 -2
  746. package/dist/server/rooms.js +442 -0
  747. package/dist/server/rooms.js.map +1 -0
  748. package/dist/server/seat.js +116 -0
  749. package/dist/server/seat.js.map +1 -0
  750. package/dist/server/seatSettings.d.ts +3 -3
  751. package/dist/server/seatSettings.js +63 -0
  752. package/dist/server/seatSettings.js.map +1 -0
  753. package/dist/server/secret.js +13 -0
  754. package/dist/server/secret.js.map +1 -0
  755. package/dist/server/start.d.ts +13 -6
  756. package/dist/server/start.js +76 -0
  757. package/dist/server/start.js.map +1 -0
  758. package/dist/server/websocket.d.ts +9 -1
  759. package/dist/server/websocket.js +306 -0
  760. package/dist/server/websocket.js.map +1 -0
  761. package/dist/server.js +15 -2861
  762. package/dist/session/can.js +26 -0
  763. package/dist/session/can.js.map +1 -0
  764. package/dist/session/commandReplay.d.ts +8 -2
  765. package/dist/session/commandReplay.js +293 -0
  766. package/dist/session/commandReplay.js.map +1 -0
  767. package/dist/session/debug.js +151 -0
  768. package/dist/session/debug.js.map +1 -0
  769. package/dist/session/delay.js +62 -0
  770. package/dist/session/delay.js.map +1 -0
  771. package/dist/session/delta.d.ts +14 -1
  772. package/dist/session/delta.js +407 -0
  773. package/dist/session/delta.js.map +1 -0
  774. package/dist/session/entityState.js +415 -0
  775. package/dist/session/entityState.js.map +1 -0
  776. package/dist/session/local.d.ts +47 -5
  777. package/dist/session/local.js +670 -0
  778. package/dist/session/local.js.map +1 -0
  779. package/dist/session/memory.d.ts +20 -2
  780. package/dist/session/memory.js +131 -0
  781. package/dist/session/memory.js.map +1 -0
  782. package/dist/session/protocol.d.ts +325 -31
  783. package/dist/session/protocol.js +55 -0
  784. package/dist/session/protocol.js.map +1 -0
  785. package/dist/session/remote.d.ts +74 -12
  786. package/dist/session/remote.js +1394 -0
  787. package/dist/session/remote.js.map +1 -0
  788. package/dist/session/replay.d.ts +11 -2
  789. package/dist/session/replay.js +160 -0
  790. package/dist/session/replay.js.map +1 -0
  791. package/dist/session/seed.js +12 -0
  792. package/dist/session/seed.js.map +1 -0
  793. package/dist/session/share.d.ts +5 -1
  794. package/dist/session/share.js +94 -0
  795. package/dist/session/share.js.map +1 -0
  796. package/dist/session/socket.d.ts +1 -1
  797. package/dist/session/socket.js +29 -0
  798. package/dist/session/socket.js.map +1 -0
  799. package/dist/session/wire.d.ts +5 -0
  800. package/dist/session/wire.js +84 -0
  801. package/dist/session/wire.js.map +1 -0
  802. package/dist/session/worker.d.ts +77 -12
  803. package/dist/session/worker.js +499 -0
  804. package/dist/session/worker.js.map +1 -0
  805. package/dist/shared.d.ts +31 -5
  806. package/dist/shared.js +166 -0
  807. package/dist/shared.js.map +1 -0
  808. package/dist/sides.d.ts +9 -3
  809. package/dist/sides.js +149 -0
  810. package/dist/sides.js.map +1 -0
  811. package/dist/sight.js +85 -0
  812. package/dist/sight.js.map +1 -0
  813. package/dist/simulate-worker.js +1 -1
  814. package/dist/simulate.d.ts +12 -8
  815. package/dist/{simulate-oXBiw1Ff.js → simulate.js} +10 -11
  816. package/dist/simulate.js.map +1 -0
  817. package/dist/smart.js +77 -0
  818. package/dist/smart.js.map +1 -0
  819. package/dist/spatial.d.ts +32 -16
  820. package/dist/spatial.js +234 -0
  821. package/dist/spatial.js.map +1 -0
  822. package/dist/spawning.d.ts +1 -0
  823. package/dist/spawning.js +224 -0
  824. package/dist/spawning.js.map +1 -0
  825. package/dist/stances.d.ts +6 -3
  826. package/dist/stances.js +169 -0
  827. package/dist/stances.js.map +1 -0
  828. package/dist/start.d.ts +10 -10
  829. package/dist/start.js +75 -0
  830. package/dist/start.js.map +1 -0
  831. package/dist/stats.d.ts +42 -16
  832. package/dist/stats.js +290 -0
  833. package/dist/stats.js.map +1 -0
  834. package/dist/summoned.d.ts +52 -0
  835. package/dist/summoned.js +38 -0
  836. package/dist/summoned.js.map +1 -0
  837. package/dist/summons.d.ts +10 -13
  838. package/dist/summons.js +271 -0
  839. package/dist/summons.js.map +1 -0
  840. package/dist/systems/abilities.js +224 -0
  841. package/dist/systems/abilities.js.map +1 -0
  842. package/dist/systems/combat.d.ts +35 -1
  843. package/dist/systems/combat.js +677 -0
  844. package/dist/systems/combat.js.map +1 -0
  845. package/dist/systems/combatTold.d.ts +3 -1
  846. package/dist/systems/combatTold.js +85 -0
  847. package/dist/systems/combatTold.js.map +1 -0
  848. package/dist/systems/construction.js +80 -0
  849. package/dist/systems/construction.js.map +1 -0
  850. package/dist/systems/economy.d.ts +0 -6
  851. package/dist/systems/economy.js +128 -0
  852. package/dist/systems/economy.js.map +1 -0
  853. package/dist/systems/fog.d.ts +1 -1
  854. package/dist/systems/fog.js +120 -0
  855. package/dist/systems/fog.js.map +1 -0
  856. package/dist/systems/life.js +32 -0
  857. package/dist/systems/life.js.map +1 -0
  858. package/dist/systems/movement.d.ts +24 -12
  859. package/dist/systems/movement.js +1247 -0
  860. package/dist/systems/movement.js.map +1 -0
  861. package/dist/systems/orders.js +64 -0
  862. package/dist/systems/orders.js.map +1 -0
  863. package/dist/systems/production.js +322 -0
  864. package/dist/systems/production.js.map +1 -0
  865. package/dist/systems/productionQueue.js +120 -0
  866. package/dist/systems/productionQueue.js.map +1 -0
  867. package/dist/systems/victory.d.ts +1 -1
  868. package/dist/systems/victory.js +56 -0
  869. package/dist/systems/victory.js.map +1 -0
  870. package/dist/talk.d.ts +6 -6
  871. package/dist/talk.js +153 -0
  872. package/dist/talk.js.map +1 -0
  873. package/dist/targeting.d.ts +142 -0
  874. package/dist/targeting.js +49 -0
  875. package/dist/targeting.js.map +1 -0
  876. package/dist/tech.d.ts +20 -3
  877. package/dist/tech.js +239 -0
  878. package/dist/tech.js.map +1 -0
  879. package/dist/techTree.d.ts +7 -0
  880. package/dist/techTree.js +90 -0
  881. package/dist/techTree.js.map +1 -0
  882. package/dist/terrain.d.ts +59 -7
  883. package/dist/terrain.js +389 -0
  884. package/dist/terrain.js.map +1 -0
  885. package/dist/terrainSave.d.ts +6 -0
  886. package/dist/terrainSave.js +74 -0
  887. package/dist/terrainSave.js.map +1 -0
  888. package/dist/testing.d.ts +8 -7
  889. package/dist/testing.js +13 -739
  890. package/dist/testing.js.map +1 -1
  891. package/dist/tiles.d.ts +1 -1
  892. package/dist/tiles.js +43 -0
  893. package/dist/tiles.js.map +1 -0
  894. package/dist/timers.d.ts +29 -4
  895. package/dist/timers.js +242 -0
  896. package/dist/timers.js.map +1 -0
  897. package/dist/tomes.d.ts +4 -4
  898. package/dist/tomes.js +94 -0
  899. package/dist/tomes.js.map +1 -0
  900. package/dist/trade.js +103 -0
  901. package/dist/trade.js.map +1 -0
  902. package/dist/transport.d.ts +6 -1
  903. package/dist/transport.js +281 -0
  904. package/dist/transport.js.map +1 -0
  905. package/dist/tunables.d.ts +10 -3
  906. package/dist/tunables.js +56 -0
  907. package/dist/tunables.js.map +1 -0
  908. package/dist/unitResources.d.ts +67 -0
  909. package/dist/unitResources.js +266 -0
  910. package/dist/unitResources.js.map +1 -0
  911. package/dist/upkeep.d.ts +6 -1
  912. package/dist/upkeep.js +26 -0
  913. package/dist/upkeep.js.map +1 -0
  914. package/dist/veterancy.d.ts +8 -3
  915. package/dist/veterancy.js +131 -0
  916. package/dist/veterancy.js.map +1 -0
  917. package/dist/vision.d.ts +36 -0
  918. package/dist/vision.js +133 -0
  919. package/dist/vision.js.map +1 -0
  920. package/dist/walls.d.ts +1 -1
  921. package/dist/walls.js +278 -0
  922. package/dist/walls.js.map +1 -0
  923. package/dist/world.d.ts +606 -88
  924. package/dist/world.js +1263 -0
  925. package/dist/world.js.map +1 -0
  926. package/package.json +2 -2
  927. package/dist/ai.js.map +0 -1
  928. package/dist/attributes.d.ts +0 -66
  929. package/dist/brain-BvVdUhX8.js +0 -7659
  930. package/dist/brain-BvVdUhX8.js.map +0 -1
  931. package/dist/builds-C6LfgvEU.js +0 -460
  932. package/dist/builds-C6LfgvEU.js.map +0 -1
  933. package/dist/coreComponents-syuh2fPG.js +0 -5149
  934. package/dist/coreComponents-syuh2fPG.js.map +0 -1
  935. package/dist/debugCommands-CzjrSm66.js +0 -14739
  936. package/dist/debugCommands-CzjrSm66.js.map +0 -1
  937. package/dist/determinism-BCymQwiE.js +0 -518
  938. package/dist/determinism-BCymQwiE.js.map +0 -1
  939. package/dist/game-DiJEN-Ks.js +0 -5800
  940. package/dist/game-DiJEN-Ks.js.map +0 -1
  941. package/dist/index.js.map +0 -1
  942. package/dist/inspect-D9dWHmZ0.js.map +0 -1
  943. package/dist/local-Dkovq42k.js +0 -1379
  944. package/dist/local-Dkovq42k.js.map +0 -1
  945. package/dist/missionRules-C-bGxm0Q.js.map +0 -1
  946. package/dist/navigation-worker.js.map +0 -1
  947. package/dist/packs-g5thvmGn.js +0 -3199
  948. package/dist/packs-g5thvmGn.js.map +0 -1
  949. package/dist/profiles-B3NS9jwk.js.map +0 -1
  950. package/dist/server.js.map +0 -1
  951. package/dist/simulate-oXBiw1Ff.js.map +0 -1
@@ -0,0 +1,239 @@
1
+ import { cos, sin } from "./exactMath.js";
2
+ import { hashText } from "./math.js";
3
+ import { shapeAt } from "./areas.js";
4
+ import "./map/types.js";
5
+ import { spawnCamp } from "./camps.js";
6
+ //#region src/prefabs.ts
7
+ /**
8
+ * Typed help for writing a prefab
9
+ *
10
+ * @public
11
+ */
12
+ var definePrefab = (def) => def;
13
+ /**
14
+ * A prefab put down in the world as one: its objects spawned (`world.spawn`, for the owner given or as each says),
15
+ * its camps (`spawnCamp`: a world with camps seats the creeps, `PlayerInit.creeps`), its areas added under ids of
16
+ * their own; turned and sized around its middle as asked
17
+ *
18
+ * @beta
19
+ */
20
+ function spawnPrefab(world, prefab, options) {
21
+ return spawnWithin(world, prefab, options, []);
22
+ }
23
+ /** `spawnPrefab`, told the prefabs it is inside of: one inside itself is not spawned again */
24
+ function spawnWithin(world, prefab, options, within) {
25
+ const def = typeof prefab === "string" ? world.registry.prefab(prefab) : prefab;
26
+ const contents = typeof def.contents === "function" ? def.contents(options.at, world) : def.contents;
27
+ const turn = options.facing ?? 0;
28
+ const scale = options.scale ?? 1;
29
+ const c = cos(turn);
30
+ const s = sin(turn);
31
+ const place = (p) => {
32
+ const x = p.x * scale;
33
+ const z = p.z * scale;
34
+ return {
35
+ x: options.at.x + x * c + z * s,
36
+ z: options.at.z - x * s + z * c
37
+ };
38
+ };
39
+ const ownerOf = (owner) => owner === "neutral" ? 0 : owner === "creeps" ? 90 : typeof owner === "number" ? owner : options.owner ?? 0;
40
+ const out = {
41
+ entities: [],
42
+ camps: [],
43
+ areas: []
44
+ };
45
+ let suffix;
46
+ contents.objects?.forEach((object, i) => {
47
+ if (options.without?.objects?.includes(i)) return;
48
+ const entity = world.spawn(object.type, ownerOf(object.owner), place(object), {
49
+ facing: (object.facing ?? 0) + turn,
50
+ ...object.scale !== void 0 && { scale: object.scale * scale },
51
+ ...object.look !== void 0 && { look: object.look },
52
+ ...object.name !== void 0 && { name: freeName(world, object.name) },
53
+ ...object.underConstruction && { underConstruction: true }
54
+ });
55
+ if (object.health !== void 0 && object.health < 1) entity.health = Math.max(1, Math.round(entity.maxHealth * object.health));
56
+ out.entities.push(entity);
57
+ });
58
+ contents.camps?.forEach((camp, i) => {
59
+ if (options.without?.camps?.includes(i)) return;
60
+ const made = spawnCamp(world, 90, place(camp), camp.units);
61
+ if (camp.name) made.name = freeName(world, camp.name);
62
+ out.camps.push(made);
63
+ });
64
+ contents.areas?.forEach((area, i) => {
65
+ if (options.without?.areas?.includes(i)) return;
66
+ const at = place(area.shape);
67
+ const shape = shapeAt(area.shape, at, scale);
68
+ const id = `${area.id}#${suffix ??= world.newId()}`;
69
+ world.areas.add({
70
+ id,
71
+ shape
72
+ });
73
+ out.areas.push(id);
74
+ });
75
+ contents.prefabs?.forEach((inside, i) => {
76
+ if (options.without?.prefabs?.includes(i) || inside.prefab === def.id || within.includes(inside.prefab)) return;
77
+ const made = spawnWithin(world, inside.prefab, {
78
+ at: place(inside),
79
+ ...options.owner !== void 0 && { owner: options.owner },
80
+ facing: turn + (inside.facing ?? 0),
81
+ scale: scale * (inside.scale ?? 1)
82
+ }, [...within, def.id]);
83
+ out.entities.push(...made.entities);
84
+ out.camps.push(...made.camps);
85
+ out.areas.push(...made.areas);
86
+ });
87
+ return out;
88
+ }
89
+ /** A name of the prefab's, free on this world: as it is, or with a number */
90
+ function freeName(world, name) {
91
+ if (!world.named(name)) return name;
92
+ for (let n = 2;; n++) if (!world.named(`${name} ${n}`)) return `${name} ${n}`;
93
+ }
94
+ /** The lists of a file's copy the engine reads */
95
+ var KINDS = [
96
+ "objects",
97
+ "camps",
98
+ "regions"
99
+ ];
100
+ /**
101
+ * The id a part of a prefab inside another has in the outer one's copy, as the editor and `prefabsFrom` number it:
102
+ * made from the inner prefab's id there and the part's id in it (itself one of these, a level down), the same each
103
+ * time it is read; below zero, where a prefab's own parts (the map's ids they had) never are
104
+ *
105
+ * @beta
106
+ */
107
+ function nestedPartId(nested, id) {
108
+ return -(parseInt(hashText(`${nested}/${id}`), 16) || 1);
109
+ }
110
+ /**
111
+ * A file read through the others it names, as the editor places it: a variant's source with its overrides, the file's
112
+ * own parts, the prefabs inside it unpacked where it says; what holds itself or names a file there is not is left out
113
+ */
114
+ function readThrough(file, name, read, within) {
115
+ const path = [...within, name];
116
+ const out = {
117
+ objects: [],
118
+ camps: [],
119
+ regions: []
120
+ };
121
+ const join = (more) => {
122
+ for (const kind of KINDS) {
123
+ const taken = new Set(out[kind].map((part) => part.id));
124
+ for (const part of more[kind] ?? []) {
125
+ if (part.id !== void 0 && taken.has(part.id)) {
126
+ let next = 1;
127
+ while (taken.has(next)) next++;
128
+ part.id = next;
129
+ }
130
+ taken.add(part.id);
131
+ out[kind].push(part);
132
+ }
133
+ }
134
+ };
135
+ const through = (of) => {
136
+ const other = !path.includes(of) ? read(of) : void 0;
137
+ return other && readThrough(other, of, read, path);
138
+ };
139
+ if (file.variant) {
140
+ const source = through(file.variant.of);
141
+ if (source) join(overriddenClip(source, file.variant.over, file.variant.without));
142
+ }
143
+ join(structuredClone(file.contents ?? {}));
144
+ for (const nested of file.prefabs ?? []) {
145
+ const inner = through(nested.prefab);
146
+ if (!inner) continue;
147
+ const turn = nested.turn ?? 0;
148
+ const scale = nested.scale ?? 1;
149
+ const c = cos(turn);
150
+ const s = sin(turn);
151
+ const place = (p) => {
152
+ const x = p.x * scale;
153
+ const z = p.z * scale;
154
+ return {
155
+ ...p,
156
+ x: nested.x + x * c + z * s,
157
+ z: nested.z - x * s + z * c
158
+ };
159
+ };
160
+ const placed = overriddenClip(inner, nested.over, nested.without);
161
+ join({
162
+ objects: (placed.objects ?? []).map((object) => ({
163
+ ...place(object),
164
+ id: nestedPartId(nested.id, object.id ?? 0),
165
+ facing: (object.facing ?? 0) + turn,
166
+ ...scale !== 1 && { scale: (object.scale ?? 1) * scale }
167
+ })),
168
+ camps: (placed.camps ?? []).map((camp) => ({
169
+ ...place(camp),
170
+ id: nestedPartId(nested.id, camp.id ?? 0)
171
+ })),
172
+ regions: (placed.regions ?? []).map((region) => ({
173
+ ...region,
174
+ id: nestedPartId(nested.id, region.id ?? 0),
175
+ shape: shapeAt(region.shape, place(region.shape), scale)
176
+ }))
177
+ });
178
+ }
179
+ return out;
180
+ }
181
+ /** A copy with fields of its parts overridden and parts left out, by kind and id */
182
+ function overriddenClip(clip, over, without) {
183
+ const out = {};
184
+ for (const kind of KINDS) {
185
+ const left = new Set(without?.[kind] ?? []);
186
+ const fields = over?.[kind] ?? {};
187
+ out[kind] = (clip[kind] ?? []).filter((part) => part.id === void 0 || !left.has(part.id)).map((part) => ({
188
+ ...structuredClone(part),
189
+ ...part.id !== void 0 && structuredClone(fields[part.id])
190
+ }));
191
+ }
192
+ return out;
193
+ }
194
+ /**
195
+ * The prefabs a designer made in the editor (`prefabs/<name>.prefab.json` of the game's folder), as prefabs of the
196
+ * game's, by their file names: `prefabsFrom(import.meta.glob('./prefabs/*.prefab.json', { eager: true }))`, or any
197
+ * record of name to file. An object of a player's becomes the owner's; scenery, points and paths are left out. A
198
+ * variant is read through its source and a prefab with prefabs inside through those, as the editor places them, from
199
+ * the files given
200
+ *
201
+ * @public
202
+ */
203
+ function prefabsFrom(files, options = {}) {
204
+ const byName = /* @__PURE__ */ new Map();
205
+ for (const [path, data] of Object.entries(files)) {
206
+ const file = data?.default ?? data;
207
+ if (file?.contents?.kind !== "v12-clip") continue;
208
+ byName.set(file.name ?? path.replace(/^.*[\\/]/, "").replace(/\.prefab\.json$/, ""), file);
209
+ }
210
+ const out = [];
211
+ for (const [name, file] of byName) {
212
+ const clip = file.variant || file.prefabs?.length ? readThrough(file, name, (of) => byName.get(of), []) : file.contents;
213
+ out.push({
214
+ id: `${options.prefix ?? ""}${name}`,
215
+ name,
216
+ contents: {
217
+ objects: (clip.objects ?? []).map(({ owner, ...object }) => ({
218
+ ...object,
219
+ owner: owner === 0 ? "neutral" : owner === 90 ? "creeps" : "owner"
220
+ })),
221
+ camps: (clip.camps ?? []).map(({ x, z, units, name }) => ({
222
+ x,
223
+ z,
224
+ units,
225
+ ...name && { name }
226
+ })),
227
+ areas: (clip.regions ?? []).map((region) => ({
228
+ id: region.name,
229
+ shape: region.shape
230
+ }))
231
+ }
232
+ });
233
+ }
234
+ return out;
235
+ }
236
+ //#endregion
237
+ export { definePrefab, nestedPartId, prefabsFrom, spawnPrefab };
238
+
239
+ //# sourceMappingURL=prefabs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prefabs.js","names":[],"sources":["../src/prefabs.ts"],"sourcesContent":["import { type Camp, spawnCamp } from './camps'\nimport { type AreaShape, shapeAt } from './areas'\nimport type { Entity, PlayerId } from './entity'\nimport { MAP_CREEPS, MAP_NEUTRAL } from './map'\nimport { cos, sin } from './exactMath'\nimport { hashText, type Vec2 } from './math'\nimport type { World } from './world'\n\n/*\n * Prefabs in code (master plan FA4): a group of things a game spawns as one, at a place, for a player: a camp of a\n * kind, a base for the computer's expansion, a wave's fortress. The same shape the editor's prefab files have of their\n * contents, in the map's plain terms (no client types): the editor places one as a designer would, and a game spawns\n * one at tick 300, and they look the same. A game's own are `definePrefab`; the files a designer made are\n * `prefabsFrom(import.meta.glob('./prefabs/*.prefab.json', { eager: true }))`.\n *\n * What a prefab spawns at runtime is what the engine has at runtime: units and buildings (`world.spawn`), camps of\n * creeps (`spawnCamp`) and areas the rules watch (`world.areas.add`). Scenery, points and paths are the map's own\n * and have no life at runtime: a file's are left out, and said so once.\n */\n\n/** A unit or a building of a prefab, where it stands around the prefab's middle *\n * @beta\n */\nexport interface PrefabObject {\n\t/** The unit type id to spawn */\n\ttype: string\n\t/**\n\t * Whose: the player the prefab is spawned for (`'owner'`, the default), neutral, the creeps, or a player of the\n\t * map's by id (a file's objects say the id they had; one that is a player's becomes `'owner'` as the file is read)\n\t */\n\towner?: 'owner' | 'neutral' | 'creeps' | PlayerId\n\t/** Where it stands east-west, in cells from the prefab's middle before the prefab's turn and size */\n\tx: number\n\t/** Where it stands north-south, in cells from the prefab's middle before the prefab's turn and size */\n\tz: number\n\t/** Radians, the way entities face */\n\tfacing?: number\n\t/** Size of the entity as a multiple of its type's own; the prefab's scale is applied on top */\n\tscale?: number\n\t/** The id of the look the entity is drawn with, in place of its type's own */\n\tlook?: string\n\t/** A name of its own, for the rules to find it by: made free where it is taken (a number added) */\n\tname?: string\n\t/** 0..1 of its health, less than whole */\n\thealth?: number\n\t/** Structures: as a construction site */\n\tunderConstruction?: boolean\n}\n\n/** A camp of creeps of a prefab *\n * @beta\n */\nexport interface PrefabCamp {\n\t/** East-west position of the camp from the prefab's middle, in cells */\n\tx: number\n\t/** North-south position of the camp from the prefab's middle, in cells */\n\tz: number\n\t/** Unit type ids of the creeps the camp holds */\n\tunits: string[]\n\t/** A name for the camp, for the rules to find it by */\n\tname?: string\n}\n\n/** An area the rules watch, of a prefab: its id gets the spawn's own suffix, so that two of one prefab are two areas *\n * @beta\n */\nexport interface PrefabArea {\n\t/** The area's id before the spawn's own suffix is added, so two spawns of one prefab give two areas */\n\tid: string\n\t/** The area's shape, placed around the prefab's middle */\n\tshape: AreaShape\n}\n\n/** A prefab inside a prefab: spawned with it, its middle where it says from the outer one's, turned and sized with it *\n * @beta\n */\nexport interface PrefabInside {\n\t/** The prefab's id */\n\tprefab: string\n\t/** East-west position of the inner prefab's middle, from the outer one's middle, in cells */\n\tx: number\n\t/** North-south position of the inner prefab's middle, from the outer one's middle, in cells */\n\tz: number\n\t/** Radians, the way facings turn: on top of the outer prefab's turn */\n\tfacing?: number\n\t/** Size of the inner prefab as a multiple, on top of the outer prefab's scale */\n\tscale?: number\n}\n\n/** What a prefab is made of, around its middle (0, 0) *\n * @beta\n */\nexport interface PrefabContents {\n\t/** The units and buildings it spawns */\n\tobjects?: PrefabObject[]\n\t/** The camps of creeps it spawns */\n\tcamps?: PrefabCamp[]\n\t/** The areas it adds for the rules to watch */\n\tareas?: PrefabArea[]\n\t/** Prefabs inside it, spawned with it (a prefab that holds itself, at any depth, is not spawned past the first) */\n\tprefabs?: PrefabInside[]\n}\n\n/**\n * A prefab of a game's own: what `world.spawnPrefab` puts down as one. Its contents as data, or made for the place\n * and the world (a camp the stronger the farther from the starts)\n *\n * @beta\n */\nexport interface PrefabDef {\n\t/** Shared by every game: give it a prefix of the game's (`'td.fortress'`) */\n\tid: string\n\t/** A readable name for the prefab, for tools that list prefabs */\n\tname?: string\n\t/** What the prefab is made of: plain data, or a function of the spawn point and the world that returns it */\n\tcontents: PrefabContents | ((at: Vec2, world: World) => PrefabContents)\n}\n\n/**\n * Typed help for writing a prefab\n *\n * @public\n */\nexport const definePrefab = (def: PrefabDef): PrefabDef => def\n\n/** How a prefab is spawned: where its middle goes, for whom, turned and sized *\n * @beta\n */\nexport interface SpawnPrefabOptions {\n\t/** Where the prefab's middle goes, in world coordinates */\n\tat: Vec2\n\t/** The player the prefab's `'owner'` objects are spawned for: neutral when left out */\n\towner?: PlayerId\n\t/** Radians, the way facings turn: the prefab turned around its middle */\n\tfacing?: number\n\t/** Size multiplier of the prefab around its middle; whole size when left out */\n\tscale?: number\n\t/** Parts left out, by their index in the prefab's lists: a gate without its towers */\n\twithout?: { objects?: number[]; camps?: number[]; areas?: number[]; prefabs?: number[] }\n}\n\n/** What a prefab spawned became *\n * @beta\n */\nexport interface SpawnedPrefab {\n\t/** The units and buildings spawned */\n\tentities: Entity[]\n\t/** The camps of creeps spawned */\n\tcamps: Camp[]\n\t/** The ids of the areas added */\n\tareas: string[]\n}\n\n/**\n * A prefab put down in the world as one: its objects spawned (`world.spawn`, for the owner given or as each says),\n * its camps (`spawnCamp`: a world with camps seats the creeps, `PlayerInit.creeps`), its areas added under ids of\n * their own; turned and sized around its middle as asked\n *\n * @beta\n */\nexport function spawnPrefab(world: World, prefab: PrefabDef | string, options: SpawnPrefabOptions): SpawnedPrefab {\n\treturn spawnWithin(world, prefab, options, [])\n}\n\n/** `spawnPrefab`, told the prefabs it is inside of: one inside itself is not spawned again */\nfunction spawnWithin(world: World, prefab: PrefabDef | string, options: SpawnPrefabOptions, within: readonly string[]): SpawnedPrefab {\n\tconst def = typeof prefab === 'string' ? world.registry.prefab(prefab) : prefab\n\tconst contents = typeof def.contents === 'function' ? def.contents(options.at, world) : def.contents\n\tconst turn = options.facing ?? 0\n\tconst scale = options.scale ?? 1\n\tconst c = cos(turn)\n\tconst s = sin(turn)\n\t// the way facings turn: a quarter takes what was ahead (+z) to the right (+x)\n\tconst place = (p: Vec2): Vec2 => {\n\t\tconst x = p.x * scale\n\t\tconst z = p.z * scale\n\t\treturn { x: options.at.x + x * c + z * s, z: options.at.z - x * s + z * c }\n\t}\n\tconst ownerOf = (owner: PrefabObject['owner']): PlayerId =>\n\t\towner === 'neutral' ? MAP_NEUTRAL : owner === 'creeps' ? MAP_CREEPS : typeof owner === 'number' ? owner : (options.owner ?? MAP_NEUTRAL)\n\tconst out: SpawnedPrefab = { entities: [], camps: [], areas: [] }\n\t// the areas' ids are the world's: the same in every world played the same way, and in one loaded from a save\n\tlet suffix: number | undefined\n\tcontents.objects?.forEach((object, i) => {\n\t\tif (options.without?.objects?.includes(i)) return\n\t\tconst entity = world.spawn(object.type, ownerOf(object.owner), place(object), {\n\t\t\tfacing: (object.facing ?? 0) + turn,\n\t\t\t...(object.scale !== undefined && { scale: object.scale * scale }),\n\t\t\t...(object.look !== undefined && { look: object.look }),\n\t\t\t...(object.name !== undefined && { name: freeName(world, object.name) }),\n\t\t\t...(object.underConstruction && { underConstruction: true })\n\t\t})\n\t\tif (object.health !== undefined && object.health < 1) entity.health = Math.max(1, Math.round(entity.maxHealth * object.health))\n\t\tout.entities.push(entity)\n\t})\n\tcontents.camps?.forEach((camp, i) => {\n\t\tif (options.without?.camps?.includes(i)) return\n\t\tconst made = spawnCamp(world, MAP_CREEPS, place(camp), camp.units)\n\t\tif (camp.name) made.name = freeName(world, camp.name)\n\t\tout.camps.push(made)\n\t})\n\tcontents.areas?.forEach((area, i) => {\n\t\tif (options.without?.areas?.includes(i)) return\n\t\tconst at = place(area.shape)\n\t\tconst shape: AreaShape = shapeAt(area.shape, at, scale)\n\t\tconst id = `${area.id}#${(suffix ??= world.newId())}`\n\t\tworld.areas.add({ id, shape })\n\t\tout.areas.push(id)\n\t})\n\tcontents.prefabs?.forEach((inside, i) => {\n\t\tif (options.without?.prefabs?.includes(i) || inside.prefab === def.id || within.includes(inside.prefab)) return\n\t\tconst made = spawnWithin(\n\t\t\tworld,\n\t\t\tinside.prefab,\n\t\t\t{\n\t\t\t\tat: place(inside),\n\t\t\t\t...(options.owner !== undefined && { owner: options.owner }),\n\t\t\t\tfacing: turn + (inside.facing ?? 0),\n\t\t\t\tscale: scale * (inside.scale ?? 1)\n\t\t\t},\n\t\t\t[...within, def.id]\n\t\t)\n\t\tout.entities.push(...made.entities)\n\t\tout.camps.push(...made.camps)\n\t\tout.areas.push(...made.areas)\n\t})\n\treturn out\n}\n\n/** A name of the prefab's, free on this world: as it is, or with a number */\nfunction freeName(world: World, name: string): string {\n\tif (!world.named(name)) return name\n\tfor (let n = 2; ; n++) if (!world.named(`${name} ${n}`)) return `${name} ${n}`\n}\n\n/** What a prefab's file holds, as far as the engine reads it: the editor's shape (a copy with a name and a version), or the first files' bare copy */\ninterface PrefabFileLike {\n\tname?: string\n\tversion?: number\n\tcontents?: ClipLike\n\t/** A variant of another prefab of the files, by its name: the fields it overrides and the parts it leaves out, by kind and id */\n\tvariant?: { of: string; over?: Overrides; without?: Without }\n\t/** Prefabs of the files inside it, by name: where, turned and sized, and what it overrides and leaves out of each */\n\tprefabs?: { id: number; prefab: string; x: number; z: number; turn?: number; scale?: number; over?: Overrides; without?: Without }[]\n}\n\ntype Overrides = Partial<Record<string, Record<number, Record<string, unknown>>>>\ntype Without = Partial<Record<string, number[]>>\n\ninterface ClipObject {\n\tid?: number\n\ttype: string\n\towner: PlayerId\n\tx: number\n\tz: number\n\tfacing?: number\n\tscale?: number\n\tlook?: string\n\tname?: string\n\thealth?: number\n\tunderConstruction?: boolean\n}\n\ninterface ClipLike {\n\tkind?: string\n\tobjects?: ClipObject[]\n\tcamps?: { id?: number; x: number; z: number; units: string[]; name?: string }[]\n\tregions?: { id?: number; name: string; shape: AreaShape }[]\n}\n\n/** The lists of a file's copy the engine reads */\nconst KINDS = ['objects', 'camps', 'regions'] as const\n\n/**\n * The id a part of a prefab inside another has in the outer one's copy, as the editor and `prefabsFrom` number it:\n * made from the inner prefab's id there and the part's id in it (itself one of these, a level down), the same each\n * time it is read; below zero, where a prefab's own parts (the map's ids they had) never are\n *\n * @beta\n */\nexport function nestedPartId(nested: number, id: number): number {\n\treturn -(parseInt(hashText(`${nested}/${id}`), 16) || 1)\n}\n\n/**\n * A file read through the others it names, as the editor places it: a variant's source with its overrides, the file's\n * own parts, the prefabs inside it unpacked where it says; what holds itself or names a file there is not is left out\n */\nfunction readThrough(file: PrefabFileLike, name: string, read: (name: string) => PrefabFileLike | undefined, within: readonly string[]): ClipLike {\n\tconst path = [...within, name]\n\tconst out: Required<Omit<ClipLike, 'kind'>> = { objects: [], camps: [], regions: [] }\n\tconst join = (more: ClipLike) => {\n\t\tfor (const kind of KINDS) {\n\t\t\tconst taken = new Set(out[kind].map((part) => part.id))\n\t\t\tfor (const part of more[kind] ?? []) {\n\t\t\t\tif (part.id !== undefined && taken.has(part.id)) {\n\t\t\t\t\tlet next = 1\n\t\t\t\t\twhile (taken.has(next)) next++\n\t\t\t\t\tpart.id = next\n\t\t\t\t}\n\t\t\t\ttaken.add(part.id)\n\t\t\t\t;(out[kind] as unknown[]).push(part)\n\t\t\t}\n\t\t}\n\t}\n\tconst through = (of: string): ClipLike | undefined => {\n\t\tconst other = !path.includes(of) ? read(of) : undefined\n\t\treturn other && readThrough(other, of, read, path)\n\t}\n\tif (file.variant) {\n\t\tconst source = through(file.variant.of)\n\t\tif (source) join(overriddenClip(source, file.variant.over, file.variant.without))\n\t}\n\tjoin(structuredClone(file.contents ?? {}))\n\tfor (const nested of file.prefabs ?? []) {\n\t\tconst inner = through(nested.prefab)\n\t\tif (!inner) continue\n\t\tconst turn = nested.turn ?? 0\n\t\tconst scale = nested.scale ?? 1\n\t\t// the engine's own sines: a prefab read on any machine is the same prefab\n\t\tconst c = cos(turn)\n\t\tconst s = sin(turn)\n\t\tconst place = <T extends { x: number; z: number }>(p: T): T => {\n\t\t\tconst x = p.x * scale\n\t\t\tconst z = p.z * scale\n\t\t\treturn { ...p, x: nested.x + x * c + z * s, z: nested.z - x * s + z * c }\n\t\t}\n\t\tconst placed = overriddenClip(inner, nested.over, nested.without)\n\t\tjoin({\n\t\t\tobjects: (placed.objects ?? []).map((object) => ({\n\t\t\t\t...place(object),\n\t\t\t\tid: nestedPartId(nested.id, object.id ?? 0),\n\t\t\t\tfacing: (object.facing ?? 0) + turn,\n\t\t\t\t...(scale !== 1 && { scale: (object.scale ?? 1) * scale })\n\t\t\t})),\n\t\t\tcamps: (placed.camps ?? []).map((camp) => ({ ...place(camp), id: nestedPartId(nested.id, camp.id ?? 0) })),\n\t\t\tregions: (placed.regions ?? []).map((region) => ({\n\t\t\t\t...region,\n\t\t\t\tid: nestedPartId(nested.id, region.id ?? 0),\n\t\t\t\tshape: shapeAt(region.shape, place(region.shape), scale)\n\t\t\t}))\n\t\t})\n\t}\n\treturn out\n}\n\n/** A copy with fields of its parts overridden and parts left out, by kind and id */\nfunction overriddenClip(clip: ClipLike, over: Overrides | undefined, without: Without | undefined): ClipLike {\n\tconst out: ClipLike = {}\n\tfor (const kind of KINDS) {\n\t\tconst left = new Set(without?.[kind] ?? [])\n\t\tconst fields = over?.[kind] ?? {}\n\t\t;(out[kind] as unknown[]) = (clip[kind] ?? [])\n\t\t\t.filter((part) => part.id === undefined || !left.has(part.id))\n\t\t\t.map((part) => ({ ...structuredClone(part), ...(part.id !== undefined && structuredClone(fields[part.id])) }))\n\t}\n\treturn out\n}\n\n/**\n * The prefabs a designer made in the editor (`prefabs/<name>.prefab.json` of the game's folder), as prefabs of the\n * game's, by their file names: `prefabsFrom(import.meta.glob('./prefabs/*.prefab.json', { eager: true }))`, or any\n * record of name to file. An object of a player's becomes the owner's; scenery, points and paths are left out. A\n * variant is read through its source and a prefab with prefabs inside through those, as the editor places them, from\n * the files given\n *\n * @public\n */\nexport function prefabsFrom(files: Record<string, unknown>, options: { prefix?: string } = {}): PrefabDef[] {\n\tconst byName = new Map<string, PrefabFileLike>()\n\tfor (const [path, data] of Object.entries(files)) {\n\t\tconst file = ((data as { default?: unknown })?.default ?? data) as PrefabFileLike\n\t\tif (file?.contents?.kind !== 'v12-clip') continue\n\t\tbyName.set(file.name ?? path.replace(/^.*[\\\\/]/, '').replace(/\\.prefab\\.json$/, ''), file)\n\t}\n\tconst out: PrefabDef[] = []\n\tfor (const [name, file] of byName) {\n\t\tconst clip = file.variant || file.prefabs?.length ? readThrough(file, name, (of) => byName.get(of), []) : file.contents!\n\t\tout.push({\n\t\t\tid: `${options.prefix ?? ''}${name}`,\n\t\t\tname,\n\t\t\tcontents: {\n\t\t\t\tobjects: (clip.objects ?? []).map(({ owner, ...object }) => ({\n\t\t\t\t\t...object,\n\t\t\t\t\towner: owner === MAP_NEUTRAL ? 'neutral' : owner === MAP_CREEPS ? 'creeps' : 'owner'\n\t\t\t\t})),\n\t\t\t\tcamps: (clip.camps ?? []).map(({ x, z, units, name }) => ({ x, z, units, ...(name && { name }) })),\n\t\t\t\tareas: (clip.regions ?? []).map((region) => ({ id: region.name, shape: region.shape }))\n\t\t\t}\n\t\t})\n\t}\n\treturn out\n}\n"],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ //#region src/presetBuildings.ts
2
+ /**
3
+ * A fountain: a building that keeps the game's aura on who is around it (`aura`, the id of a passive ability with an
4
+ * `aura` effect: a fountain of health's regeneration, a fountain of mana's). It cannot be hurt; a map puts it down
5
+ * for the neutral player, so the aura says `affects: 'all'` to reach everyone (the neutral player is nobody's ally).
6
+ * What is given over the fountain's own goes over it: `presetFountain('healingWaters', { id: 'fountainOfHealth' })`
7
+ *
8
+ * @beta
9
+ */
10
+ function presetFountain(aura, over = {}) {
11
+ return {
12
+ id: "fountain",
13
+ name: "Fountain",
14
+ kind: "building",
15
+ radius: 1.5,
16
+ footprint: {
17
+ w: 3,
18
+ d: 3
19
+ },
20
+ stats: { health: 1e3 },
21
+ sight: 6,
22
+ invulnerable: true,
23
+ abilities: [aura],
24
+ ...over
25
+ };
26
+ }
27
+ /**
28
+ * A marketplace's abilities: one for each trade (`MarketRate`), cast at once (`target: 'none'`), with an `exchange`
29
+ * effect that trades the caster's owner's resources at its rate. A building of the game's lists their ids in its
30
+ * `abilities` (`abilities: market.map((ability) => ability.id)`), the abilities go in the rules' `abilities`. With
31
+ * less than the amount to sell, the player is told and nothing goes. The computer player does not cast them in a
32
+ * fight (their `ai` says not now); its brain's `spells` may
33
+ *
34
+ * @beta
35
+ */
36
+ function presetMarket(options) {
37
+ return options.rates.map(({ sell, buy, rate, amount = 100, id, name, hotkey }) => ({
38
+ id: id ?? `sell-${sell}-for-${buy}`,
39
+ name: name ?? `Sell ${sell} for ${buy}`,
40
+ description: `Trades ${amount} ${sell} for ${Math.floor(amount * rate + 1e-9)} ${buy}`,
41
+ target: "none",
42
+ maxLevel: 1,
43
+ ...hotkey !== void 0 && { hotkey },
44
+ ...options.cooldown !== void 0 && { cooldown: options.cooldown },
45
+ effects: [{
46
+ type: "exchange",
47
+ sell,
48
+ buy,
49
+ rate,
50
+ amount
51
+ }],
52
+ ai: () => null
53
+ }));
54
+ }
55
+ //#endregion
56
+ export { presetFountain, presetMarket };
57
+
58
+ //# sourceMappingURL=presetBuildings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"presetBuildings.js","names":[],"sources":["../src/presetBuildings.ts"],"sourcesContent":["import type { AbilityDef, UnitTypeDef } from './defs'\n\n/*\n * Ready-made places a game takes or leaves, beside its own (campaign plan GP4): a fountain, a building whose aura is\n * the game's, and a marketplace's abilities, one resource traded for another at a rate (`exchange` in `trade.ts`).\n * They say only what there is; the looks, the numbers and who stands where are the game's\n */\n\n/**\n * A fountain: a building that keeps the game's aura on who is around it (`aura`, the id of a passive ability with an\n * `aura` effect: a fountain of health's regeneration, a fountain of mana's). It cannot be hurt; a map puts it down\n * for the neutral player, so the aura says `affects: 'all'` to reach everyone (the neutral player is nobody's ally).\n * What is given over the fountain's own goes over it: `presetFountain('healingWaters', { id: 'fountainOfHealth' })`\n *\n * @beta\n */\nexport function presetFountain(aura: string, over: Partial<UnitTypeDef> = {}): UnitTypeDef {\n\treturn {\n\t\tid: 'fountain',\n\t\tname: 'Fountain',\n\t\tkind: 'building',\n\t\tradius: 1.5,\n\t\tfootprint: { w: 3, d: 3 },\n\t\tstats: { health: 1000 },\n\t\tsight: 6,\n\t\tinvulnerable: true,\n\t\tabilities: [aura],\n\t\t...over\n\t}\n}\n\n/**\n * One trade of a marketplace (`presetMarket`): `amount` of `sell` for `rate` of `buy` for each one sold\n *\n * @beta\n */\nexport interface MarketRate {\n\t/** The resource traded away, by id */\n\tsell: string\n\t/** The resource traded for, by id */\n\tbuy: string\n\t/** How much of `buy` comes for each one of `sell`: 0.5 is 100 lumber for 50 gold */\n\trate: number\n\t/** How much is sold at a time: 100 when left out */\n\tamount?: number\n\t/** The ability's id: `sell-<sell>-for-<buy>` when left out */\n\tid?: string\n\t/** The ability's name: `Sell <sell> for <buy>` when left out */\n\tname?: string\n\t/** The key the ability's button is pressed with */\n\thotkey?: string\n}\n\n/**\n * What `presetMarket` is given: the trades, and the seconds between two of each (none when left out)\n *\n * @beta\n */\nexport interface PresetMarketOptions {\n\t/** The trades, an ability each, in the order of the buttons */\n\trates: readonly MarketRate[]\n\t/** Seconds between two trades of each: none when left out */\n\tcooldown?: number\n}\n\n/**\n * A marketplace's abilities: one for each trade (`MarketRate`), cast at once (`target: 'none'`), with an `exchange`\n * effect that trades the caster's owner's resources at its rate. A building of the game's lists their ids in its\n * `abilities` (`abilities: market.map((ability) => ability.id)`), the abilities go in the rules' `abilities`. With\n * less than the amount to sell, the player is told and nothing goes. The computer player does not cast them in a\n * fight (their `ai` says not now); its brain's `spells` may\n *\n * @beta\n */\nexport function presetMarket(options: PresetMarketOptions): AbilityDef[] {\n\treturn options.rates.map(({ sell, buy, rate, amount = 100, id, name, hotkey }) => ({\n\t\tid: id ?? `sell-${sell}-for-${buy}`,\n\t\tname: name ?? `Sell ${sell} for ${buy}`,\n\t\tdescription: `Trades ${amount} ${sell} for ${Math.floor(amount * rate + 1e-9)} ${buy}`,\n\t\ttarget: 'none',\n\t\tmaxLevel: 1,\n\t\t...(hotkey !== undefined && { hotkey }),\n\t\t...(options.cooldown !== undefined && { cooldown: options.cooldown }),\n\t\teffects: [{ type: 'exchange', sell, buy, rate, amount }],\n\t\t// not a spell for a fight: the computer player trades as its brain says, not as the engine works out of effects\n\t\tai: () => null\n\t}))\n}\n"],"mappings":";;;;;;;;;AAgBA,SAAgB,eAAe,MAAc,OAA6B,CAAC,GAAgB;CAC1F,OAAO;EACN,IAAI;EACJ,MAAM;EACN,MAAM;EACN,QAAQ;EACR,WAAW;GAAE,GAAG;GAAG,GAAG;EAAE;EACxB,OAAO,EAAE,QAAQ,IAAK;EACtB,OAAO;EACP,cAAc;EACd,WAAW,CAAC,IAAI;EAChB,GAAG;CACJ;AACD;;;;;;;;;;AA6CA,SAAgB,aAAa,SAA4C;CACxE,OAAO,QAAQ,MAAM,KAAK,EAAE,MAAM,KAAK,MAAM,SAAS,KAAK,IAAI,MAAM,cAAc;EAClF,IAAI,MAAM,QAAQ,KAAK,OAAO;EAC9B,MAAM,QAAQ,QAAQ,KAAK,OAAO;EAClC,aAAa,UAAU,OAAO,GAAG,KAAK,OAAO,KAAK,MAAM,SAAS,OAAO,IAAI,EAAE,GAAG;EACjF,QAAQ;EACR,UAAU;EACV,GAAI,WAAW,KAAA,KAAa,EAAE,OAAO;EACrC,GAAI,QAAQ,aAAa,KAAA,KAAa,EAAE,UAAU,QAAQ,SAAS;EACnE,SAAS,CAAC;GAAE,MAAM;GAAY;GAAM;GAAK;GAAM;EAAO,CAAC;EAEvD,UAAU;CACX,EAAE;AACH"}
@@ -0,0 +1,27 @@
1
+ import type { FoliageStyleDef } from './foliage';
2
+ import type { World } from './world';
3
+ /**
4
+ * Ready-made kinds of grass to the rules, beside a game's own: what each hides, burns and slows, by the names of the
5
+ * client's ready-made looks (`presetFoliage`), so a style is the two of one name. And grass grown from the ground's
6
+ * paint made cells of the layer, for a game whose rules are to see it (`growOnTiles`)
7
+ */
8
+ /**
9
+ * Ready-made kinds of grass to the rules (`FoliageStyleDef`), by the names of the client's looks (`presetFoliage`):
10
+ * `values: [{ value: 1, name: 'Meadow', foliage: presetFoliageStyles.meadow }]`. A meadow burns and grows back, tall
11
+ * grass, reeds, wheat, a thicket and a hedge hide who stands in them; dry grass burns hottest, snow grass hardly; a
12
+ * thicket slows those on foot, reeds a little; nothing walks through a hedge (`walkable: false`). A game changes what it
13
+ * wants: `{ ...presetFoliageStyles.wheat, trample: 'none' }`
14
+ *
15
+ * @beta
16
+ */
17
+ export declare const presetFoliageStyles: Readonly<Record<'meadow' | 'tallGrass' | 'dryGrass' | 'reeds' | 'wheat' | 'snowGrass' | 'thicket' | 'hedge', FoliageStyleDef>>;
18
+ /**
19
+ * Grass grown from the ground's paint made cells of a layer the rules see: every cell whose tile is one of `tiles`
20
+ * (by id) and that nothing of the layer is painted on is set to `value` (`world.setCells`: saved, told to the players,
21
+ * remembered through the fog). What a game calls once, as its world begins, for the grass the client grows on those
22
+ * tiles (`FoliageLook.on`) to hide and burn as `value`'s style says: from then on they are cells as any painted, and a
23
+ * tile painted later grows nothing to the rules until it is called again. The cells set
24
+ *
25
+ * @beta
26
+ */
27
+ export declare function growOnTiles(world: World, layer: string, tiles: readonly string[], value: number): number[];
@@ -0,0 +1,98 @@
1
+ //#region src/presetFoliage.ts
2
+ /**
3
+ * Ready-made kinds of grass to the rules, beside a game's own: what each hides, burns and slows, by the names of the
4
+ * client's ready-made looks (`presetFoliage`), so a style is the two of one name. And grass grown from the ground's
5
+ * paint made cells of the layer, for a game whose rules are to see it (`growOnTiles`)
6
+ */
7
+ /**
8
+ * Ready-made kinds of grass to the rules (`FoliageStyleDef`), by the names of the client's looks (`presetFoliage`):
9
+ * `values: [{ value: 1, name: 'Meadow', foliage: presetFoliageStyles.meadow }]`. A meadow burns and grows back, tall
10
+ * grass, reeds, wheat, a thicket and a hedge hide who stands in them; dry grass burns hottest, snow grass hardly; a
11
+ * thicket slows those on foot, reeds a little; nothing walks through a hedge (`walkable: false`). A game changes what it
12
+ * wants: `{ ...presetFoliageStyles.wheat, trample: 'none' }`
13
+ *
14
+ * @beta
15
+ */
16
+ var presetFoliageStyles = {
17
+ meadow: {
18
+ flammable: .6,
19
+ burns: 6,
20
+ regrows: 90
21
+ },
22
+ tallGrass: {
23
+ conceals: true,
24
+ height: 1.4,
25
+ flammable: 1,
26
+ burns: 8,
27
+ regrows: 120
28
+ },
29
+ dryGrass: {
30
+ flammable: 1,
31
+ burns: 4,
32
+ fuel: 1.5,
33
+ regrows: 150
34
+ },
35
+ reeds: {
36
+ conceals: true,
37
+ height: 1.8,
38
+ speed: .85,
39
+ flammable: .3,
40
+ burns: 6,
41
+ regrows: 90
42
+ },
43
+ wheat: {
44
+ conceals: true,
45
+ concealsTaller: false,
46
+ height: 1.1,
47
+ flammable: .9,
48
+ burns: 5,
49
+ fuel: 1.2,
50
+ trample: "crush"
51
+ },
52
+ snowGrass: {
53
+ flammable: .1,
54
+ burns: 3,
55
+ regrows: 180
56
+ },
57
+ thicket: {
58
+ conceals: true,
59
+ height: 1.4,
60
+ speed: .6,
61
+ flammable: .4,
62
+ burns: 12,
63
+ fuel: 1.5,
64
+ regrows: 240
65
+ },
66
+ hedge: {
67
+ conceals: true,
68
+ height: 1.5,
69
+ walkable: false,
70
+ flammable: .3,
71
+ burns: 15,
72
+ fuel: 1.2
73
+ }
74
+ };
75
+ /**
76
+ * Grass grown from the ground's paint made cells of a layer the rules see: every cell whose tile is one of `tiles`
77
+ * (by id) and that nothing of the layer is painted on is set to `value` (`world.setCells`: saved, told to the players,
78
+ * remembered through the fog). What a game calls once, as its world begins, for the grass the client grows on those
79
+ * tiles (`FoliageLook.on`) to hide and burn as `value`'s style says: from then on they are cells as any painted, and a
80
+ * tile painted later grows nothing to the rules until it is called again. The cells set
81
+ *
82
+ * @beta
83
+ */
84
+ function growOnTiles(world, layer, tiles, value) {
85
+ if (!(Number.isInteger(value) && value >= 1 && value <= 255)) throw new Error(`growOnTiles: ${value} is no value of a layer (1 to 255)`);
86
+ const { terrain, registry } = world;
87
+ const ids = registry.tileIds;
88
+ const mask = /* @__PURE__ */ new Uint8Array(256);
89
+ for (let i = 0; i < ids.length && i < 255; i++) if (tiles.includes(ids[i])) mask[i + 1] = 1;
90
+ const painted = terrain.cells[layer];
91
+ const cells = [];
92
+ for (let c = 0, n = terrain.width * terrain.depth; c < n; c++) if (mask[terrain.tiles[c]] && !painted?.[c]) cells.push(c);
93
+ return cells.length ? world.setCells(layer, cells, value) : [];
94
+ }
95
+ //#endregion
96
+ export { growOnTiles, presetFoliageStyles };
97
+
98
+ //# sourceMappingURL=presetFoliage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"presetFoliage.js","names":[],"sources":["../src/presetFoliage.ts"],"sourcesContent":["import type { FoliageStyleDef } from './foliage'\nimport type { World } from './world'\n\n/**\n * Ready-made kinds of grass to the rules, beside a game's own: what each hides, burns and slows, by the names of the\n * client's ready-made looks (`presetFoliage`), so a style is the two of one name. And grass grown from the ground's\n * paint made cells of the layer, for a game whose rules are to see it (`growOnTiles`)\n */\n\n/**\n * Ready-made kinds of grass to the rules (`FoliageStyleDef`), by the names of the client's looks (`presetFoliage`):\n * `values: [{ value: 1, name: 'Meadow', foliage: presetFoliageStyles.meadow }]`. A meadow burns and grows back, tall\n * grass, reeds, wheat, a thicket and a hedge hide who stands in them; dry grass burns hottest, snow grass hardly; a\n * thicket slows those on foot, reeds a little; nothing walks through a hedge (`walkable: false`). A game changes what it\n * wants: `{ ...presetFoliageStyles.wheat, trample: 'none' }`\n *\n * @beta\n */\nexport const presetFoliageStyles: Readonly<\n\tRecord<'meadow' | 'tallGrass' | 'dryGrass' | 'reeds' | 'wheat' | 'snowGrass' | 'thicket' | 'hedge', FoliageStyleDef>\n> = {\n\tmeadow: { flammable: 0.6, burns: 6, regrows: 90 },\n\ttallGrass: { conceals: true, height: 1.4, flammable: 1, burns: 8, regrows: 120 },\n\tdryGrass: { flammable: 1, burns: 4, fuel: 1.5, regrows: 150 },\n\treeds: { conceals: true, height: 1.8, speed: 0.85, flammable: 0.3, burns: 6, regrows: 90 },\n\twheat: { conceals: true, concealsTaller: false, height: 1.1, flammable: 0.9, burns: 5, fuel: 1.2, trample: 'crush' },\n\tsnowGrass: { flammable: 0.1, burns: 3, regrows: 180 },\n\tthicket: { conceals: true, height: 1.4, speed: 0.6, flammable: 0.4, burns: 12, fuel: 1.5, regrows: 240 },\n\thedge: { conceals: true, height: 1.5, walkable: false, flammable: 0.3, burns: 15, fuel: 1.2 }\n}\n\n/**\n * Grass grown from the ground's paint made cells of a layer the rules see: every cell whose tile is one of `tiles`\n * (by id) and that nothing of the layer is painted on is set to `value` (`world.setCells`: saved, told to the players,\n * remembered through the fog). What a game calls once, as its world begins, for the grass the client grows on those\n * tiles (`FoliageLook.on`) to hide and burn as `value`'s style says: from then on they are cells as any painted, and a\n * tile painted later grows nothing to the rules until it is called again. The cells set\n *\n * @beta\n */\nexport function growOnTiles(world: World, layer: string, tiles: readonly string[], value: number): number[] {\n\tif (!(Number.isInteger(value) && value >= 1 && value <= 255)) throw new Error(`growOnTiles: ${value} is no value of a layer (1 to 255)`)\n\tconst { terrain, registry } = world\n\tconst ids = registry.tileIds\n\tconst mask = new Uint8Array(256)\n\tfor (let i = 0; i < ids.length && i < 255; i++) if (tiles.includes(ids[i])) mask[i + 1] = 1\n\tconst painted = terrain.cells[layer]\n\tconst cells: number[] = []\n\tfor (let c = 0, n = terrain.width * terrain.depth; c < n; c++) if (mask[terrain.tiles[c]] && !painted?.[c]) cells.push(c)\n\treturn cells.length ? world.setCells(layer, cells, value) : []\n}\n"],"mappings":";;;;;;;;;;;;;;;AAkBA,IAAa,sBAET;CACH,QAAQ;EAAE,WAAW;EAAK,OAAO;EAAG,SAAS;CAAG;CAChD,WAAW;EAAE,UAAU;EAAM,QAAQ;EAAK,WAAW;EAAG,OAAO;EAAG,SAAS;CAAI;CAC/E,UAAU;EAAE,WAAW;EAAG,OAAO;EAAG,MAAM;EAAK,SAAS;CAAI;CAC5D,OAAO;EAAE,UAAU;EAAM,QAAQ;EAAK,OAAO;EAAM,WAAW;EAAK,OAAO;EAAG,SAAS;CAAG;CACzF,OAAO;EAAE,UAAU;EAAM,gBAAgB;EAAO,QAAQ;EAAK,WAAW;EAAK,OAAO;EAAG,MAAM;EAAK,SAAS;CAAQ;CACnH,WAAW;EAAE,WAAW;EAAK,OAAO;EAAG,SAAS;CAAI;CACpD,SAAS;EAAE,UAAU;EAAM,QAAQ;EAAK,OAAO;EAAK,WAAW;EAAK,OAAO;EAAI,MAAM;EAAK,SAAS;CAAI;CACvG,OAAO;EAAE,UAAU;EAAM,QAAQ;EAAK,UAAU;EAAO,WAAW;EAAK,OAAO;EAAI,MAAM;CAAI;AAC7F;;;;;;;;;;AAWA,SAAgB,YAAY,OAAc,OAAe,OAA0B,OAAyB;CAC3G,IAAI,EAAE,OAAO,UAAU,KAAK,KAAK,SAAS,KAAK,SAAS,MAAM,MAAM,IAAI,MAAM,gBAAgB,MAAM,mCAAmC;CACvI,MAAM,EAAE,SAAS,aAAa;CAC9B,MAAM,MAAM,SAAS;CACrB,MAAM,uBAAO,IAAI,WAAW,GAAG;CAC/B,KAAK,IAAI,IAAI,GAAG,IAAI,IAAI,UAAU,IAAI,KAAK,KAAK,IAAI,MAAM,SAAS,IAAI,EAAE,GAAG,KAAK,IAAI,KAAK;CAC1F,MAAM,UAAU,QAAQ,MAAM;CAC9B,MAAM,QAAkB,CAAC;CACzB,KAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,QAAQ,QAAQ,OAAO,IAAI,GAAG,KAAK,IAAI,KAAK,QAAQ,MAAM,OAAO,CAAC,UAAU,IAAI,MAAM,KAAK,CAAC;CACxH,OAAO,MAAM,SAAS,MAAM,SAAS,OAAO,OAAO,KAAK,IAAI,CAAC;AAC9D"}
@@ -0,0 +1,65 @@
1
+ import { defineCellLayer } from "./cellLayers.js";
2
+ import { defineTile } from "./tiles.js";
3
+ //#region src/presetGround.ts
4
+ /**
5
+ * Ready-made grounds a game takes or leaves, beside its own: the tiles of an RTS's ground (grass, dark grass, dirt,
6
+ * road, sand, rock, snow), which the client draws with its `TILE_LOOKS`, and the blight a race spoils ground with,
7
+ * which the client draws with its `blightLook`. They say only what there is; what they do is the game's
8
+ */
9
+ /**
10
+ * The tiles of an RTS's ground, by the ids the client's `TILE_LOOKS` has looks for: `tiles: presetTiles` in the rules,
11
+ * `tiles: TILE_LOOKS` in the view. A game adds its own beside them, or takes some (`presetTiles.filter(...)`)
12
+ *
13
+ * @beta
14
+ */
15
+ var presetTiles = [
16
+ defineTile({
17
+ id: "grass",
18
+ name: "Grass"
19
+ }),
20
+ defineTile({
21
+ id: "darkGrass",
22
+ name: "Dark grass"
23
+ }),
24
+ defineTile({
25
+ id: "dirt",
26
+ name: "Dirt"
27
+ }),
28
+ defineTile({
29
+ id: "road",
30
+ name: "Road"
31
+ }),
32
+ defineTile({
33
+ id: "sand",
34
+ name: "Sand"
35
+ }),
36
+ defineTile({
37
+ id: "rock",
38
+ name: "Rock"
39
+ }),
40
+ defineTile({
41
+ id: "snow",
42
+ name: "Snow"
43
+ })
44
+ ];
45
+ /**
46
+ * Blight: ground spoiled, a layer of cells a map's maker paints and the rules spread (`world.setCells('blight', …)`),
47
+ * drawn by the client's `blightLook`. What it does (who builds on it, who heals on it) is the game's: melee's
48
+ * undead in the example
49
+ *
50
+ * @beta
51
+ */
52
+ var presetBlight = defineCellLayer({
53
+ id: "blight",
54
+ name: "Blight",
55
+ description: "Spoiled ground: what the game says of it, a race that builds on it, one that heals on it",
56
+ color: [
57
+ .45,
58
+ .3,
59
+ .55
60
+ ]
61
+ });
62
+ //#endregion
63
+ export { presetBlight, presetTiles };
64
+
65
+ //# sourceMappingURL=presetGround.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"presetGround.js","names":[],"sources":["../src/presetGround.ts"],"sourcesContent":["import { type CellLayerDef, defineCellLayer } from './cellLayers'\nimport { type TileDef, defineTile } from './tiles'\n\n/**\n * Ready-made grounds a game takes or leaves, beside its own: the tiles of an RTS's ground (grass, dark grass, dirt,\n * road, sand, rock, snow), which the client draws with its `TILE_LOOKS`, and the blight a race spoils ground with,\n * which the client draws with its `blightLook`. They say only what there is; what they do is the game's\n */\n\n/**\n * The tiles of an RTS's ground, by the ids the client's `TILE_LOOKS` has looks for: `tiles: presetTiles` in the rules,\n * `tiles: TILE_LOOKS` in the view. A game adds its own beside them, or takes some (`presetTiles.filter(...)`)\n *\n * @beta\n */\nexport const presetTiles: readonly TileDef[] = [\n\tdefineTile({ id: 'grass', name: 'Grass' }),\n\tdefineTile({ id: 'darkGrass', name: 'Dark grass' }),\n\tdefineTile({ id: 'dirt', name: 'Dirt' }),\n\tdefineTile({ id: 'road', name: 'Road' }),\n\tdefineTile({ id: 'sand', name: 'Sand' }),\n\tdefineTile({ id: 'rock', name: 'Rock' }),\n\tdefineTile({ id: 'snow', name: 'Snow' })\n]\n\n/**\n * Blight: ground spoiled, a layer of cells a map's maker paints and the rules spread (`world.setCells('blight', …)`),\n * drawn by the client's `blightLook`. What it does (who builds on it, who heals on it) is the game's: melee's\n * undead in the example\n *\n * @beta\n */\nexport const presetBlight: CellLayerDef = defineCellLayer({\n\tid: 'blight',\n\tname: 'Blight',\n\tdescription: 'Spoiled ground: what the game says of it, a race that builds on it, one that heals on it',\n\tcolor: [0.45, 0.3, 0.55]\n})\n"],"mappings":";;;;;;;;;;;;;;AAeA,IAAa,cAAkC;CAC9C,WAAW;EAAE,IAAI;EAAS,MAAM;CAAQ,CAAC;CACzC,WAAW;EAAE,IAAI;EAAa,MAAM;CAAa,CAAC;CAClD,WAAW;EAAE,IAAI;EAAQ,MAAM;CAAO,CAAC;CACvC,WAAW;EAAE,IAAI;EAAQ,MAAM;CAAO,CAAC;CACvC,WAAW;EAAE,IAAI;EAAQ,MAAM;CAAO,CAAC;CACvC,WAAW;EAAE,IAAI;EAAQ,MAAM;CAAO,CAAC;CACvC,WAAW;EAAE,IAAI;EAAQ,MAAM;CAAO,CAAC;AACxC;;;;;;;;AASA,IAAa,eAA6B,gBAAgB;CACzD,IAAI;CACJ,MAAM;CACN,aAAa;CACb,OAAO;EAAC;EAAM;EAAK;CAAI;AACxB,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { EffectContext } from './abilities/effects';
2
+ import type { ProxyOrigin } from './defs';
3
+ import type { Entity } from './entity';
4
+ /**
5
+ * The units of the caster's an effect with a proxy origin goes off from (`ProxyOrigin`), in the order it goes off from
6
+ * them: those of its type that are the caster's (put down by it: `madeBy`; or its owner's where nothing says who put one
7
+ * down), within its `range` of the caster and `near` where it was aimed, and of those the ones it picks. The caster is
8
+ * not among them (`ProxyOrigin.caster` says when it goes off from it too). For a game's own effect, and a screen
9
+ *
10
+ * @beta
11
+ */
12
+ export declare function proxiesOf(context: Pick<EffectContext, 'world' | 'caster' | 'point'>, origin: ProxyOrigin): Entity[];
@@ -0,0 +1,79 @@
1
+ import { hypot } from "./exactMath.js";
2
+ //#region src/proxies.ts
3
+ /** Who put a unit down, where the ground objects pack says (`madeBy`): read by its id, so that this brings in none of the pack */
4
+ var MADE_BY = "core.madeBy";
5
+ /** Whether a unit is the caster's: put down by it, or, where nothing says who put it down, its owner's */
6
+ function isOf(world, unit, caster) {
7
+ const component = world.registry.component(MADE_BY);
8
+ const made = component && unit.get(component);
9
+ return made ? made.by === caster.id : unit.owner === caster.owner;
10
+ }
11
+ /**
12
+ * The units of the caster's an effect with a proxy origin goes off from (`ProxyOrigin`), in the order it goes off from
13
+ * them: those of its type that are the caster's (put down by it: `madeBy`; or its owner's where nothing says who put one
14
+ * down), within its `range` of the caster and `near` where it was aimed, and of those the ones it picks. The caster is
15
+ * not among them (`ProxyOrigin.caster` says when it goes off from it too). For a game's own effect, and a screen
16
+ *
17
+ * @beta
18
+ */
19
+ function proxiesOf(context, origin) {
20
+ const { world, caster, point } = context;
21
+ const found = [];
22
+ const candidates = origin.range === void 0 ? world.units.values() : world.spatial.query(caster.pos.x, caster.pos.z, origin.range + 2);
23
+ for (const unit of candidates) {
24
+ if (unit === caster || !unit.alive || unit.hidden || unit.def.id !== origin.proxy || !isOf(world, unit, caster)) continue;
25
+ if (origin.range !== void 0 && hypot(unit.pos.x - caster.pos.x, unit.pos.z - caster.pos.z) > origin.range) continue;
26
+ if (origin.near !== void 0 && hypot(unit.pos.x - point.x, unit.pos.z - point.z) > origin.near) continue;
27
+ found.push(unit);
28
+ }
29
+ found.sort((a, b) => a.id - b.id);
30
+ switch (origin.pick ?? "nearest") {
31
+ case "all": return found;
32
+ case "newest": return found.slice(-1);
33
+ case "oldest": return found.slice(0, 1);
34
+ default: {
35
+ let best;
36
+ let gap = Infinity;
37
+ for (const unit of found) {
38
+ const d = hypot(unit.pos.x - point.x, unit.pos.z - point.z);
39
+ if (d < gap) [best, gap] = [unit, d];
40
+ }
41
+ return best ? [best] : [];
42
+ }
43
+ }
44
+ }
45
+ /**
46
+ * Runs an effect with a proxy origin (`EffectCommon.origin`): once from the caster where it says so, and once from each
47
+ * proxy it picks, that one the `origin` (its place the `point` with `at: 'proxy'`, and the `target` with `target`)
48
+ *
49
+ * @internal
50
+ */
51
+ function fromProxies(context, effect, each) {
52
+ const origin = effect.origin;
53
+ const picked = proxiesOf(context, origin);
54
+ const fromCaster = origin.caster === true || origin.caster === "otherwise" && !picked.length;
55
+ const atProxy = origin.at === "proxy";
56
+ if (fromCaster) each(atProxy ? {
57
+ ...context,
58
+ point: {
59
+ x: context.caster.pos.x,
60
+ z: context.caster.pos.z
61
+ }
62
+ } : context);
63
+ for (const proxy of picked) {
64
+ if (!proxy.alive) continue;
65
+ each({
66
+ ...context,
67
+ origin: proxy,
68
+ ...atProxy && { point: {
69
+ x: proxy.pos.x,
70
+ z: proxy.pos.z
71
+ } },
72
+ ...origin.target && { target: proxy }
73
+ });
74
+ }
75
+ }
76
+ //#endregion
77
+ export { fromProxies, proxiesOf };
78
+
79
+ //# sourceMappingURL=proxies.js.map