@v12-engine/engine 0.1.1 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (951) hide show
  1. package/dist/abilities/amounts.d.ts +28 -0
  2. package/dist/abilities/amounts.js +74 -0
  3. package/dist/abilities/amounts.js.map +1 -0
  4. package/dist/abilities/buffs.d.ts +106 -6
  5. package/dist/abilities/buffs.js +443 -0
  6. package/dist/abilities/buffs.js.map +1 -0
  7. package/dist/abilities/castTold.d.ts +2 -0
  8. package/dist/abilities/castTold.js +66 -0
  9. package/dist/abilities/castTold.js.map +1 -0
  10. package/dist/abilities/chance.d.ts +38 -0
  11. package/dist/abilities/chance.js +77 -0
  12. package/dist/abilities/chance.js.map +1 -0
  13. package/dist/abilities/charges.d.ts +18 -0
  14. package/dist/abilities/charges.js +101 -0
  15. package/dist/abilities/charges.js.map +1 -0
  16. package/dist/abilities/control.d.ts +28 -0
  17. package/dist/abilities/control.js +113 -0
  18. package/dist/abilities/control.js.map +1 -0
  19. package/dist/abilities/dispel.js +51 -0
  20. package/dist/abilities/dispel.js.map +1 -0
  21. package/dist/abilities/effectFields.d.ts +1 -1
  22. package/dist/abilities/effectFields.js +676 -0
  23. package/dist/abilities/effectFields.js.map +1 -0
  24. package/dist/abilities/effectIndex.d.ts +27 -0
  25. package/dist/abilities/effectIndex.js +64 -0
  26. package/dist/abilities/effectIndex.js.map +1 -0
  27. package/dist/abilities/effects/buff.d.ts +9 -3
  28. package/dist/abilities/effects/buff.js +84 -0
  29. package/dist/abilities/effects/buff.js.map +1 -0
  30. package/dist/abilities/effects/conditions.d.ts +2 -0
  31. package/dist/abilities/effects/conditions.js +41 -0
  32. package/dist/abilities/effects/conditions.js.map +1 -0
  33. package/dist/abilities/effects/core.js +54 -0
  34. package/dist/abilities/effects/core.js.map +1 -0
  35. package/dist/abilities/effects/damage.d.ts +1 -1
  36. package/dist/abilities/effects/damage.js +43 -0
  37. package/dist/abilities/effects/damage.js.map +1 -0
  38. package/dist/abilities/effects/heal.d.ts +2 -2
  39. package/dist/abilities/effects/heal.js +51 -0
  40. package/dist/abilities/effects/heal.js.map +1 -0
  41. package/dist/abilities/effects/missile.d.ts +13 -1
  42. package/dist/abilities/effects/missile.js +104 -0
  43. package/dist/abilities/effects/missile.js.map +1 -0
  44. package/dist/abilities/effects/morph.d.ts +5 -0
  45. package/dist/abilities/effects/morph.js +43 -0
  46. package/dist/abilities/effects/morph.js.map +1 -0
  47. package/dist/abilities/effects/moves.d.ts +16 -4
  48. package/dist/abilities/effects/moves.js +212 -0
  49. package/dist/abilities/effects/moves.js.map +1 -0
  50. package/dist/abilities/effects/passives.d.ts +19 -9
  51. package/dist/abilities/effects/passives.js +131 -0
  52. package/dist/abilities/effects/passives.js.map +1 -0
  53. package/dist/abilities/effects/proxy.d.ts +5 -0
  54. package/dist/abilities/effects/proxy.js +60 -0
  55. package/dist/abilities/effects/proxy.js.map +1 -0
  56. package/dist/abilities/effects/sight.d.ts +2 -2
  57. package/dist/abilities/effects/sight.js +39 -0
  58. package/dist/abilities/effects/sight.js.map +1 -0
  59. package/dist/abilities/effects/spawn.d.ts +5 -2
  60. package/dist/abilities/effects/spawn.js +40 -0
  61. package/dist/abilities/effects/spawn.js.map +1 -0
  62. package/dist/abilities/effects/timed.d.ts +2 -2
  63. package/dist/abilities/effects/timed.js +96 -0
  64. package/dist/abilities/effects/timed.js.map +1 -0
  65. package/dist/abilities/effects/trade.d.ts +1 -1
  66. package/dist/abilities/effects/trade.js +25 -0
  67. package/dist/abilities/effects/trade.js.map +1 -0
  68. package/dist/abilities/effects.d.ts +97 -23
  69. package/dist/abilities/effects.js +860 -0
  70. package/dist/abilities/effects.js.map +1 -0
  71. package/dist/abilities/land.d.ts +38 -4
  72. package/dist/abilities/land.js +189 -0
  73. package/dist/abilities/land.js.map +1 -0
  74. package/dist/abilities/recast.d.ts +45 -0
  75. package/dist/abilities/recast.js +118 -0
  76. package/dist/abilities/recast.js.map +1 -0
  77. package/dist/abilities/scaled.js +40 -0
  78. package/dist/abilities/scaled.js.map +1 -0
  79. package/dist/abilities/screen.d.ts +6 -0
  80. package/dist/abilities/screen.js +83 -0
  81. package/dist/abilities/screen.js.map +1 -0
  82. package/dist/abilities/shapes.d.ts +66 -0
  83. package/dist/abilities/shapes.js +122 -0
  84. package/dist/abilities/shapes.js.map +1 -0
  85. package/dist/abilities/text.d.ts +14 -2
  86. package/dist/abilities/text.js +204 -0
  87. package/dist/abilities/text.js.map +1 -0
  88. package/dist/abilities/triggers.d.ts +98 -0
  89. package/dist/abilities/triggers.js +351 -0
  90. package/dist/abilities/triggers.js.map +1 -0
  91. package/dist/abilityChanges.d.ts +131 -0
  92. package/dist/abilityChanges.js +345 -0
  93. package/dist/abilityChanges.js.map +1 -0
  94. package/dist/ai/area.d.ts +4 -1
  95. package/dist/ai/brain.d.ts +4 -1
  96. package/dist/ai/brain.js +844 -0
  97. package/dist/ai/brain.js.map +1 -0
  98. package/dist/ai/budget.js +74 -0
  99. package/dist/ai/budget.js.map +1 -0
  100. package/dist/ai/checks.d.ts +9 -1
  101. package/dist/ai/checks.js +242 -0
  102. package/dist/ai/checks.js.map +1 -0
  103. package/dist/ai/computer.d.ts +11 -4
  104. package/dist/ai/computer.js +251 -0
  105. package/dist/ai/computer.js.map +1 -0
  106. package/dist/ai/defence.d.ts +4 -0
  107. package/dist/ai/defence.js +430 -0
  108. package/dist/ai/defence.js.map +1 -0
  109. package/dist/ai/define.d.ts +3 -2
  110. package/dist/ai/define.js +31 -0
  111. package/dist/ai/define.js.map +1 -0
  112. package/dist/ai/economy.d.ts +10 -7
  113. package/dist/ai/economy.js +780 -0
  114. package/dist/ai/economy.js.map +1 -0
  115. package/dist/ai/geometry.js +38 -0
  116. package/dist/ai/geometry.js.map +1 -0
  117. package/dist/ai/goals.d.ts +1 -0
  118. package/dist/ai/goals.js +560 -0
  119. package/dist/ai/goals.js.map +1 -0
  120. package/dist/ai/knowledge.d.ts +72 -7
  121. package/dist/ai/knowledge.js +804 -0
  122. package/dist/ai/knowledge.js.map +1 -0
  123. package/dist/ai/lanes.d.ts +10 -2
  124. package/dist/ai/lanes.js +715 -0
  125. package/dist/ai/lanes.js.map +1 -0
  126. package/dist/ai/melee/build.js +264 -0
  127. package/dist/ai/melee/build.js.map +1 -0
  128. package/dist/ai/melee/goals.d.ts +7 -0
  129. package/dist/ai/melee/goals.js +720 -0
  130. package/dist/ai/melee/goals.js.map +1 -0
  131. package/dist/ai/melee/heroes.js +68 -0
  132. package/dist/ai/melee/heroes.js.map +1 -0
  133. package/dist/ai/melee/index.d.ts +1 -1
  134. package/dist/ai/melee/index.js +51 -0
  135. package/dist/ai/melee/index.js.map +1 -0
  136. package/dist/ai/melee/production.js +29 -0
  137. package/dist/ai/melee/production.js.map +1 -0
  138. package/dist/ai/melee/surrender.js +64 -0
  139. package/dist/ai/melee/surrender.js.map +1 -0
  140. package/dist/ai/micro.d.ts +9 -0
  141. package/dist/ai/micro.js +1316 -0
  142. package/dist/ai/micro.js.map +1 -0
  143. package/dist/ai/mission.d.ts +9 -2
  144. package/dist/ai/mission.js +538 -0
  145. package/dist/ai/mission.js.map +1 -0
  146. package/dist/ai/missionRules.d.ts +1 -1
  147. package/dist/ai/missionRules.js +26 -0
  148. package/dist/ai/missionRules.js.map +1 -0
  149. package/dist/ai/module.d.ts +6 -2
  150. package/dist/ai/module.js +37 -0
  151. package/dist/ai/module.js.map +1 -0
  152. package/dist/ai/options.d.ts +3 -3
  153. package/dist/ai/plans/build.d.ts +20 -1
  154. package/dist/ai/plans/build.js +608 -0
  155. package/dist/ai/plans/build.js.map +1 -0
  156. package/dist/ai/plans/placement.d.ts +4 -1
  157. package/dist/ai/plans/placement.js +295 -0
  158. package/dist/ai/plans/placement.js.map +1 -0
  159. package/dist/ai/plans/plans.d.ts +9 -0
  160. package/dist/ai/plans/plans.js +110 -0
  161. package/dist/ai/plans/plans.js.map +1 -0
  162. package/dist/ai/plans/production.d.ts +14 -2
  163. package/dist/ai/plans/production.js +434 -0
  164. package/dist/ai/plans/production.js.map +1 -0
  165. package/dist/ai/plans/purse.d.ts +6 -3
  166. package/dist/ai/plans/purse.js +139 -0
  167. package/dist/ai/plans/purse.js.map +1 -0
  168. package/dist/ai/plans/tech.d.ts +6 -0
  169. package/dist/ai/plans/tech.js +122 -0
  170. package/dist/ai/plans/tech.js.map +1 -0
  171. package/dist/ai/profiles.d.ts +4 -4
  172. package/dist/{profiles-B3NS9jwk.js → ai/profiles.js} +3 -98
  173. package/dist/ai/profiles.js.map +1 -0
  174. package/dist/ai/reach.js +54 -0
  175. package/dist/ai/reach.js.map +1 -0
  176. package/dist/ai/report.d.ts +8 -0
  177. package/dist/ai/report.js +87 -0
  178. package/dist/ai/report.js.map +1 -0
  179. package/dist/ai/roles.d.ts +4 -0
  180. package/dist/ai/roles.js +207 -0
  181. package/dist/ai/roles.js.map +1 -0
  182. package/dist/ai/rules.d.ts +8 -2
  183. package/dist/ai/rules.js +416 -0
  184. package/dist/ai/rules.js.map +1 -0
  185. package/dist/ai/scouting.d.ts +6 -0
  186. package/dist/ai/scouting.js +324 -0
  187. package/dist/ai/scouting.js.map +1 -0
  188. package/dist/ai/settings.js +99 -0
  189. package/dist/ai/settings.js.map +1 -0
  190. package/dist/ai/squads.d.ts +21 -2
  191. package/dist/ai/squads.js +916 -0
  192. package/dist/ai/squads.js.map +1 -0
  193. package/dist/ai/strength.js +320 -0
  194. package/dist/ai/strength.js.map +1 -0
  195. package/dist/ai/task.d.ts +3 -1
  196. package/dist/ai/task.js +17 -0
  197. package/dist/ai/task.js.map +1 -0
  198. package/dist/ai/tasks/attack.js +24 -0
  199. package/dist/ai/tasks/attack.js.map +1 -0
  200. package/dist/ai/tasks/capture.d.ts +3 -3
  201. package/dist/ai/tasks/capture.js +37 -0
  202. package/dist/ai/tasks/capture.js.map +1 -0
  203. package/dist/ai/tasks/creep.js +29 -0
  204. package/dist/ai/tasks/creep.js.map +1 -0
  205. package/dist/ai/tasks/defend.js +61 -0
  206. package/dist/ai/tasks/defend.js.map +1 -0
  207. package/dist/ai/tasks/drop.js +81 -0
  208. package/dist/ai/tasks/drop.js.map +1 -0
  209. package/dist/ai/tasks/escort.js +59 -0
  210. package/dist/ai/tasks/escort.js.map +1 -0
  211. package/dist/ai/tasks/gather.js +48 -0
  212. package/dist/ai/tasks/gather.js.map +1 -0
  213. package/dist/ai/tasks/harass.js +39 -0
  214. package/dist/ai/tasks/harass.js.map +1 -0
  215. package/dist/ai/tasks/hold.js +32 -0
  216. package/dist/ai/tasks/hold.js.map +1 -0
  217. package/dist/ai/tasks/index.js +34 -0
  218. package/dist/ai/tasks/index.js.map +1 -0
  219. package/dist/ai/tasks/move.js +26 -0
  220. package/dist/ai/tasks/move.js.map +1 -0
  221. package/dist/ai/tasks/patrol.js +59 -0
  222. package/dist/ai/tasks/patrol.js.map +1 -0
  223. package/dist/ai/tasks/retreat.js +28 -0
  224. package/dist/ai/tasks/retreat.js.map +1 -0
  225. package/dist/ai/tasks/scout.js +73 -0
  226. package/dist/ai/tasks/scout.js.map +1 -0
  227. package/dist/ai/tasks/shared.d.ts +1 -1
  228. package/dist/ai/tasks/shared.js +137 -0
  229. package/dist/ai/tasks/shared.js.map +1 -0
  230. package/dist/ai/team.d.ts +18 -1
  231. package/dist/ai/team.js +492 -0
  232. package/dist/ai/team.js.map +1 -0
  233. package/dist/ai/threat.d.ts +6 -0
  234. package/dist/ai/threat.js +206 -0
  235. package/dist/ai/threat.js.map +1 -0
  236. package/dist/ai/view.d.ts +21 -7
  237. package/dist/ai/view.js +677 -0
  238. package/dist/ai/view.js.map +1 -0
  239. package/dist/ai/waves.d.ts +6 -0
  240. package/dist/ai/waves.js +410 -0
  241. package/dist/ai/waves.js.map +1 -0
  242. package/dist/ai.js +54 -6239
  243. package/dist/aiTesting.d.ts +6 -3
  244. package/dist/aiTesting.js +229 -0
  245. package/dist/aiTesting.js.map +1 -0
  246. package/dist/areas.d.ts +4 -1
  247. package/dist/areas.js +295 -0
  248. package/dist/areas.js.map +1 -0
  249. package/dist/attacks.d.ts +3 -3
  250. package/dist/attacks.js +127 -0
  251. package/dist/attacks.js.map +1 -0
  252. package/dist/burning.d.ts +267 -0
  253. package/dist/burning.js +795 -0
  254. package/dist/burning.js.map +1 -0
  255. package/dist/bytes.js +21 -0
  256. package/dist/bytes.js.map +1 -0
  257. package/dist/callings.d.ts +71 -0
  258. package/dist/callings.js +157 -0
  259. package/dist/callings.js.map +1 -0
  260. package/dist/cameraOrders.d.ts +78 -0
  261. package/dist/cameraOrders.js +114 -0
  262. package/dist/cameraOrders.js.map +1 -0
  263. package/dist/camps.d.ts +70 -4
  264. package/dist/camps.js +501 -0
  265. package/dist/camps.js.map +1 -0
  266. package/dist/capture.d.ts +15 -3
  267. package/dist/capture.js +304 -0
  268. package/dist/capture.js.map +1 -0
  269. package/dist/cellLayers.d.ts +78 -13
  270. package/dist/cellLayers.js +275 -0
  271. package/dist/cellLayers.js.map +1 -0
  272. package/dist/cellPatches.d.ts +24 -0
  273. package/dist/cellPatches.js +73 -0
  274. package/dist/cellPatches.js.map +1 -0
  275. package/dist/cinematics.d.ts +10 -5
  276. package/dist/cinematics.js +161 -0
  277. package/dist/cinematics.js.map +1 -0
  278. package/dist/clock.d.ts +2 -2
  279. package/dist/clock.js +78 -0
  280. package/dist/clock.js.map +1 -0
  281. package/dist/commands.d.ts +36 -4
  282. package/dist/commands.js +636 -0
  283. package/dist/commands.js.map +1 -0
  284. package/dist/components.d.ts +31 -10
  285. package/dist/components.js +74 -0
  286. package/dist/components.js.map +1 -0
  287. package/dist/computers.d.ts +4 -4
  288. package/dist/computers.js +194 -0
  289. package/dist/computers.js.map +1 -0
  290. package/dist/concealment.d.ts +25 -2
  291. package/dist/concealment.js +409 -0
  292. package/dist/concealment.js.map +1 -0
  293. package/dist/coreComponents.js +130 -0
  294. package/dist/coreComponents.js.map +1 -0
  295. package/dist/createGame.d.ts +306 -0
  296. package/dist/createGame.js +405 -0
  297. package/dist/createGame.js.map +1 -0
  298. package/dist/dashing.d.ts +18 -2
  299. package/dist/dashing.js +41 -0
  300. package/dist/dashing.js.map +1 -0
  301. package/dist/debug.d.ts +8 -0
  302. package/dist/debug.js +5 -3
  303. package/dist/debug2.js +76 -0
  304. package/dist/debug2.js.map +1 -0
  305. package/dist/debugCommands.d.ts +6 -6
  306. package/dist/debugCommands.js +537 -0
  307. package/dist/debugCommands.js.map +1 -0
  308. package/dist/debugging.d.ts +1 -0
  309. package/dist/defaultSets.d.ts +183 -0
  310. package/dist/defaultSets.js +216 -0
  311. package/dist/defaultSets.js.map +1 -0
  312. package/dist/definitions.d.ts +6 -0
  313. package/dist/definitions.js +78 -0
  314. package/dist/definitions.js.map +1 -0
  315. package/dist/defs.d.ts +1895 -165
  316. package/dist/defs.js +380 -0
  317. package/dist/defs.js.map +1 -0
  318. package/dist/denying.d.ts +4 -4
  319. package/dist/denying.js +106 -0
  320. package/dist/denying.js.map +1 -0
  321. package/dist/destructibles.d.ts +2 -2
  322. package/dist/destructibles.js +36 -0
  323. package/dist/destructibles.js.map +1 -0
  324. package/dist/determinism.d.ts +4 -4
  325. package/dist/determinism.js +247 -0
  326. package/dist/determinism.js.map +1 -0
  327. package/dist/dialog.d.ts +17 -2
  328. package/dist/dialog.js +108 -0
  329. package/dist/dialog.js.map +1 -0
  330. package/dist/effectRefs.js +28 -0
  331. package/dist/effectRefs.js.map +1 -0
  332. package/dist/effects.d.ts +27 -11
  333. package/dist/effects.js +110 -0
  334. package/dist/effects.js.map +1 -0
  335. package/dist/endings.d.ts +1 -1
  336. package/dist/endings.js +78 -0
  337. package/dist/endings.js.map +1 -0
  338. package/dist/engagement.d.ts +40 -6
  339. package/dist/engagement.js +530 -0
  340. package/dist/engagement.js.map +1 -0
  341. package/dist/engineEvents.d.ts +72 -9
  342. package/dist/engineEvents.js +520 -0
  343. package/dist/engineEvents.js.map +1 -0
  344. package/dist/entity.d.ts +275 -26
  345. package/dist/entity.js +441 -0
  346. package/dist/entity.js.map +1 -0
  347. package/dist/entityIndex.d.ts +10 -3
  348. package/dist/entityIndex.js +149 -0
  349. package/dist/entityIndex.js.map +1 -0
  350. package/dist/errors.d.ts +6 -2
  351. package/dist/errors.js +59 -0
  352. package/dist/errors.js.map +1 -0
  353. package/dist/events.d.ts +11 -5
  354. package/dist/events.js +158 -0
  355. package/dist/events.js.map +1 -0
  356. package/dist/exactMath.js +273 -0
  357. package/dist/exactMath.js.map +1 -0
  358. package/dist/features.d.ts +1 -1
  359. package/dist/features.js +127 -0
  360. package/dist/features.js.map +1 -0
  361. package/dist/fields.d.ts +25 -5
  362. package/dist/fields.js +140 -0
  363. package/dist/fields.js.map +1 -0
  364. package/dist/fixture.d.ts +3 -3
  365. package/dist/fixture.js +512 -0
  366. package/dist/fixture.js.map +1 -0
  367. package/dist/fog.d.ts +26 -3
  368. package/dist/fog.js +333 -0
  369. package/dist/fog.js.map +1 -0
  370. package/dist/foliage.d.ts +476 -0
  371. package/dist/foliage.js +1478 -0
  372. package/dist/foliage.js.map +1 -0
  373. package/dist/foliageDebug.d.ts +57 -0
  374. package/dist/foliageDebug.js +172 -0
  375. package/dist/foliageDebug.js.map +1 -0
  376. package/dist/foliageRegrowth.d.ts +20 -0
  377. package/dist/foliageRegrowth.js +332 -0
  378. package/dist/foliageRegrowth.js.map +1 -0
  379. package/dist/formState.d.ts +67 -0
  380. package/dist/formState.js +65 -0
  381. package/dist/formState.js.map +1 -0
  382. package/dist/formation.d.ts +46 -8
  383. package/dist/formation.js +297 -0
  384. package/dist/formation.js.map +1 -0
  385. package/dist/forms.d.ts +58 -0
  386. package/dist/forms.js +146 -0
  387. package/dist/forms.js.map +1 -0
  388. package/dist/friendlyFire.d.ts +2 -2
  389. package/dist/friendlyFire.js +37 -0
  390. package/dist/friendlyFire.js.map +1 -0
  391. package/dist/game.d.ts +141 -48
  392. package/dist/game.js +834 -0
  393. package/dist/game.js.map +1 -0
  394. package/dist/gameData.d.ts +96 -22
  395. package/dist/gameData.js +1690 -0
  396. package/dist/gameData.js.map +1 -0
  397. package/dist/gameFiles.d.ts +3 -3
  398. package/dist/gameFiles.js +14 -0
  399. package/dist/gameFiles.js.map +1 -0
  400. package/dist/gates.js +92 -0
  401. package/dist/gates.js.map +1 -0
  402. package/dist/generate.d.ts +28 -1
  403. package/dist/generate.js +1062 -0
  404. package/dist/generate.js.map +1 -0
  405. package/dist/generateWorker.d.ts +7 -3
  406. package/dist/generateWorker.js +86 -0
  407. package/dist/generateWorker.js.map +1 -0
  408. package/dist/grid.d.ts +9 -0
  409. package/dist/grid.js +102 -0
  410. package/dist/grid.js.map +1 -0
  411. package/dist/ground.d.ts +17 -1
  412. package/dist/ground.js +375 -0
  413. package/dist/ground.js.map +1 -0
  414. package/dist/groundObjects.d.ts +70 -0
  415. package/dist/groundObjects.js +371 -0
  416. package/dist/groundObjects.js.map +1 -0
  417. package/dist/groundSpeed.d.ts +20 -3
  418. package/dist/groundSpeed.js +117 -0
  419. package/dist/groundSpeed.js.map +1 -0
  420. package/dist/hero.d.ts +126 -10
  421. package/dist/hero.js +432 -0
  422. package/dist/hero.js.map +1 -0
  423. package/dist/holds.d.ts +94 -0
  424. package/dist/holds.js +305 -0
  425. package/dist/holds.js.map +1 -0
  426. package/dist/home.d.ts +1 -1
  427. package/dist/home.js +30 -0
  428. package/dist/home.js.map +1 -0
  429. package/dist/hooks.d.ts +339 -57
  430. package/dist/hooks.js +105 -0
  431. package/dist/hooks.js.map +1 -0
  432. package/dist/hotReload.d.ts +6 -5
  433. package/dist/hotReload.js +145 -0
  434. package/dist/hotReload.js.map +1 -0
  435. package/dist/ids.d.ts +3 -3
  436. package/dist/ids.js +30 -0
  437. package/dist/ids.js.map +1 -0
  438. package/dist/idsFile.d.ts +36 -0
  439. package/dist/idsFile.js +134 -0
  440. package/dist/idsFile.js.map +1 -0
  441. package/dist/index.d.ts +105 -68
  442. package/dist/index.js +194 -4701
  443. package/dist/inspect.d.ts +29 -2
  444. package/dist/{inspect-D9dWHmZ0.js → inspect.js} +21 -12
  445. package/dist/inspect.js.map +1 -0
  446. package/dist/inventory.d.ts +14 -1
  447. package/dist/inventory.js +84 -0
  448. package/dist/inventory.js.map +1 -0
  449. package/dist/items.d.ts +136 -8
  450. package/dist/items.js +585 -0
  451. package/dist/items.js.map +1 -0
  452. package/dist/lanes.d.ts +12 -3
  453. package/dist/lanes.js +496 -0
  454. package/dist/lanes.js.map +1 -0
  455. package/dist/life.d.ts +6 -2
  456. package/dist/life.js +287 -0
  457. package/dist/life.js.map +1 -0
  458. package/dist/log.d.ts +26 -3
  459. package/dist/log.js +192 -0
  460. package/dist/log.js.map +1 -0
  461. package/dist/manaBurn.d.ts +2 -2
  462. package/dist/manaBurn.js +75 -0
  463. package/dist/manaBurn.js.map +1 -0
  464. package/dist/map/file.d.ts +56 -3
  465. package/dist/map/file.js +264 -0
  466. package/dist/map/file.js.map +1 -0
  467. package/dist/map/images.js +61 -0
  468. package/dist/map/images.js.map +1 -0
  469. package/dist/map/look.d.ts +1 -1
  470. package/dist/map/look.js +30 -0
  471. package/dist/map/look.js.map +1 -0
  472. package/dist/map/pathProfile.js +183 -0
  473. package/dist/map/pathProfile.js.map +1 -0
  474. package/dist/map/resize.d.ts +4 -0
  475. package/dist/map/resize.js +136 -0
  476. package/dist/map/resize.js.map +1 -0
  477. package/dist/map/schema.js +257 -0
  478. package/dist/map/schema.js.map +1 -0
  479. package/dist/map/terrain.js +214 -0
  480. package/dist/map/terrain.js.map +1 -0
  481. package/dist/map/types.d.ts +92 -13
  482. package/dist/map/types.js +251 -0
  483. package/dist/map/types.js.map +1 -0
  484. package/dist/mapCheck/cells.js +94 -0
  485. package/dist/mapCheck/cells.js.map +1 -0
  486. package/dist/mapCheck/rules/foliage.d.ts +9 -0
  487. package/dist/mapCheck/rules/foliage.js +83 -0
  488. package/dist/mapCheck/rules/foliage.js.map +1 -0
  489. package/dist/mapCheck/rules/names.js +39 -0
  490. package/dist/mapCheck/rules/names.js.map +1 -0
  491. package/dist/mapCheck/rules/objects.d.ts +1 -1
  492. package/dist/mapCheck/rules/objects.js +56 -0
  493. package/dist/mapCheck/rules/objects.js.map +1 -0
  494. package/dist/mapCheck/rules/paths.js +32 -0
  495. package/dist/mapCheck/rules/paths.js.map +1 -0
  496. package/dist/mapCheck/rules/players.js +20 -0
  497. package/dist/mapCheck/rules/players.js.map +1 -0
  498. package/dist/mapCheck/rules/races.js +56 -0
  499. package/dist/mapCheck/rules/races.js.map +1 -0
  500. package/dist/mapCheck/rules/random.js +47 -0
  501. package/dist/mapCheck/rules/random.js.map +1 -0
  502. package/dist/mapCheck/rules/regions.js +30 -0
  503. package/dist/mapCheck/rules/regions.js.map +1 -0
  504. package/dist/mapCheck/rules/targets.js +31 -0
  505. package/dist/mapCheck/rules/targets.js.map +1 -0
  506. package/dist/mapCheck/rules/walking.js +45 -0
  507. package/dist/mapCheck/rules/walking.js.map +1 -0
  508. package/dist/mapCheck.d.ts +2 -2
  509. package/dist/mapCheck.js +63 -0
  510. package/dist/mapCheck.js.map +1 -0
  511. package/dist/mapFields.d.ts +25 -2
  512. package/dist/mapFields.js +134 -0
  513. package/dist/mapFields.js.map +1 -0
  514. package/dist/mapFile.js +176 -0
  515. package/dist/mapFile.js.map +1 -0
  516. package/dist/mapMeasure.d.ts +8 -0
  517. package/dist/mapMeasure.js +283 -0
  518. package/dist/mapMeasure.js.map +1 -0
  519. package/dist/mapMerge.d.ts +1 -0
  520. package/dist/mapMerge.js +172 -0
  521. package/dist/mapMerge.js.map +1 -0
  522. package/dist/mapObjectives.js +138 -0
  523. package/dist/mapObjectives.js.map +1 -0
  524. package/dist/mapObjects.js +80 -0
  525. package/dist/mapObjects.js.map +1 -0
  526. package/dist/math.d.ts +37 -7
  527. package/dist/math.js +155 -0
  528. package/dist/math.js.map +1 -0
  529. package/dist/messages.d.ts +71 -4
  530. package/dist/messages.js +29 -0
  531. package/dist/messages.js.map +1 -0
  532. package/dist/missionRules.d.ts +10 -2
  533. package/dist/{missionRules-C-bGxm0Q.js → missionRules.js} +30 -150
  534. package/dist/missionRules.js.map +1 -0
  535. package/dist/mods.d.ts +39 -20
  536. package/dist/mods.js +271 -0
  537. package/dist/mods.js.map +1 -0
  538. package/dist/moves.d.ts +87 -0
  539. package/dist/moves.js +539 -0
  540. package/dist/moves.js.map +1 -0
  541. package/dist/names.d.ts +7 -0
  542. package/dist/names.js +122 -0
  543. package/dist/names.js.map +1 -0
  544. package/dist/navigation/agentParams.js +14 -0
  545. package/dist/navigation/agentParams.js.map +1 -0
  546. package/dist/navigation/air.d.ts +7 -3
  547. package/dist/navigation/air.js +401 -0
  548. package/dist/navigation/air.js.map +1 -0
  549. package/dist/navigation/builds.d.ts +34 -2
  550. package/dist/navigation/builds.js +287 -0
  551. package/dist/navigation/builds.js.map +1 -0
  552. package/dist/navigation/groundAreas.d.ts +59 -1
  553. package/dist/navigation/groundAreas.js +407 -0
  554. package/dist/navigation/groundAreas.js.map +1 -0
  555. package/dist/navigation/navigation.d.ts +98 -9
  556. package/dist/navigation/recast.d.ts +194 -18
  557. package/dist/navigation/recast.js +1379 -0
  558. package/dist/navigation/recast.js.map +1 -0
  559. package/dist/navigation/sidePaths.d.ts +8 -3
  560. package/dist/navigation/sidePaths.js +241 -0
  561. package/dist/navigation/sidePaths.js.map +1 -0
  562. package/dist/navigation/sized.js +243 -0
  563. package/dist/navigation/sized.js.map +1 -0
  564. package/dist/nearest.js +32 -0
  565. package/dist/nearest.js.map +1 -0
  566. package/dist/noise.js +59 -0
  567. package/dist/noise.js.map +1 -0
  568. package/dist/objectives.d.ts +12 -3
  569. package/dist/objectives.js +144 -0
  570. package/dist/objectives.js.map +1 -0
  571. package/dist/orders/basic.d.ts +5 -5
  572. package/dist/orders/basic.js +417 -0
  573. package/dist/orders/basic.js.map +1 -0
  574. package/dist/orders/build.js +278 -0
  575. package/dist/orders/build.js.map +1 -0
  576. package/dist/orders/cast.d.ts +13 -3
  577. package/dist/orders/cast.js +558 -0
  578. package/dist/orders/cast.js.map +1 -0
  579. package/dist/orders/facts.js +16 -0
  580. package/dist/orders/facts.js.map +1 -0
  581. package/dist/orders/harvest.d.ts +21 -5
  582. package/dist/orders/harvest.js +540 -0
  583. package/dist/orders/harvest.js.map +1 -0
  584. package/dist/orders/idle.d.ts +3 -1
  585. package/dist/orders/idle.js +234 -0
  586. package/dist/orders/idle.js.map +1 -0
  587. package/dist/orders/items.js +92 -0
  588. package/dist/orders/items.js.map +1 -0
  589. package/dist/orders/queue.js +108 -0
  590. package/dist/orders/queue.js.map +1 -0
  591. package/dist/orders/waiting.d.ts +39 -0
  592. package/dist/orders/waiting.js +149 -0
  593. package/dist/orders/waiting.js.map +1 -0
  594. package/dist/pack.schema.js +13 -0
  595. package/dist/pack.schema.js.map +1 -0
  596. package/dist/pack.schema.json +7622 -841
  597. package/dist/packs/director/index.d.ts +13 -5
  598. package/dist/packs/director/index.js +204 -0
  599. package/dist/packs/director/index.js.map +1 -0
  600. package/dist/packs/heroes/campaign.d.ts +3 -2
  601. package/dist/packs/heroes/campaign.js +241 -0
  602. package/dist/packs/heroes/campaign.js.map +1 -0
  603. package/dist/packs/heroes/carry.d.ts +6 -0
  604. package/dist/packs/heroes/carry.js +112 -0
  605. package/dist/packs/heroes/carry.js.map +1 -0
  606. package/dist/packs/heroes/commands.js +115 -0
  607. package/dist/packs/heroes/commands.js.map +1 -0
  608. package/dist/packs/heroes/fallen.d.ts +43 -0
  609. package/dist/packs/heroes/fallen.js +61 -0
  610. package/dist/packs/heroes/fallen.js.map +1 -0
  611. package/dist/packs/heroes/hire.js +60 -0
  612. package/dist/packs/heroes/hire.js.map +1 -0
  613. package/dist/packs/heroes/index.d.ts +7 -6
  614. package/dist/packs/heroes/index.js +130 -0
  615. package/dist/packs/heroes/index.js.map +1 -0
  616. package/dist/packs/heroes/loop.d.ts +95 -0
  617. package/dist/packs/heroes/loop.js +250 -0
  618. package/dist/packs/heroes/loop.js.map +1 -0
  619. package/dist/packs/heroes/making.d.ts +6 -3
  620. package/dist/packs/heroes/making.js +55 -0
  621. package/dist/packs/heroes/making.js.map +1 -0
  622. package/dist/packs/heroes/respawn.d.ts +3 -3
  623. package/dist/packs/heroes/respawn.js +87 -0
  624. package/dist/packs/heroes/respawn.js.map +1 -0
  625. package/dist/packs/heroes/sets.d.ts +32 -0
  626. package/dist/packs/heroes/sets.js +51 -0
  627. package/dist/packs/heroes/sets.js.map +1 -0
  628. package/dist/packs/heroes/spells.d.ts +16 -0
  629. package/dist/packs/heroes/spells.js +269 -0
  630. package/dist/packs/heroes/spells.js.map +1 -0
  631. package/dist/packs/items/defaults.d.ts +43 -0
  632. package/dist/packs/items/defaults.js +1504 -0
  633. package/dist/packs/items/defaults.js.map +1 -0
  634. package/dist/packs/items/index.d.ts +27 -0
  635. package/dist/packs/items/index.js +214 -0
  636. package/dist/packs/items/index.js.map +1 -0
  637. package/dist/packs/moba/index.d.ts +3 -3
  638. package/dist/packs/moba/index.js +174 -0
  639. package/dist/packs/moba/index.js.map +1 -0
  640. package/dist/packs/pack.d.ts +15 -15
  641. package/dist/packs/pack.js +14 -0
  642. package/dist/packs/pack.js.map +1 -0
  643. package/dist/packs.d.ts +15 -7
  644. package/dist/packs.js +222 -0
  645. package/dist/packs.js.map +1 -0
  646. package/dist/paths.d.ts +2 -0
  647. package/dist/paths.js +109 -0
  648. package/dist/paths.js.map +1 -0
  649. package/dist/plain.js +57 -0
  650. package/dist/plain.js.map +1 -0
  651. package/dist/player.d.ts +33 -10
  652. package/dist/player.js +159 -0
  653. package/dist/player.js.map +1 -0
  654. package/dist/portals.d.ts +1 -1
  655. package/dist/portals.js +194 -0
  656. package/dist/portals.js.map +1 -0
  657. package/dist/prefabs.d.ts +25 -2
  658. package/dist/prefabs.js +239 -0
  659. package/dist/prefabs.js.map +1 -0
  660. package/dist/presetBuildings.js +58 -0
  661. package/dist/presetBuildings.js.map +1 -0
  662. package/dist/presetFoliage.d.ts +27 -0
  663. package/dist/presetFoliage.js +98 -0
  664. package/dist/presetFoliage.js.map +1 -0
  665. package/dist/presetGround.js +65 -0
  666. package/dist/presetGround.js.map +1 -0
  667. package/dist/proxies.d.ts +12 -0
  668. package/dist/proxies.js +79 -0
  669. package/dist/proxies.js.map +1 -0
  670. package/dist/query.d.ts +56 -0
  671. package/dist/query.js +88 -0
  672. package/dist/query.js.map +1 -0
  673. package/dist/races.d.ts +15 -14
  674. package/dist/races.js +172 -0
  675. package/dist/races.js.map +1 -0
  676. package/dist/randomGroups.js +91 -0
  677. package/dist/randomGroups.js.map +1 -0
  678. package/dist/registry.d.ts +117 -53
  679. package/dist/registry.js +323 -0
  680. package/dist/registry.js.map +1 -0
  681. package/dist/remains.d.ts +11 -9
  682. package/dist/remains.js +188 -0
  683. package/dist/remains.js.map +1 -0
  684. package/dist/replication.d.ts +12 -7
  685. package/dist/replication.js +100 -0
  686. package/dist/replication.js.map +1 -0
  687. package/dist/rng.d.ts +2 -0
  688. package/dist/rng.js +40 -0
  689. package/dist/rng.js.map +1 -0
  690. package/dist/rules.d.ts +186 -99
  691. package/dist/rules.js +179 -0
  692. package/dist/rules.js.map +1 -0
  693. package/dist/rulesCheck.d.ts +5 -4
  694. package/dist/rulesCheck.js +693 -0
  695. package/dist/rulesCheck.js.map +1 -0
  696. package/dist/runes.d.ts +2 -2
  697. package/dist/runes.js +80 -0
  698. package/dist/runes.js.map +1 -0
  699. package/dist/save.d.ts +37 -12
  700. package/dist/save.js +532 -0
  701. package/dist/save.js.map +1 -0
  702. package/dist/scenario.d.ts +2 -2
  703. package/dist/scenario.js +99 -0
  704. package/dist/scenario.js.map +1 -0
  705. package/dist/scheduler.d.ts +3 -0
  706. package/dist/scheduler.js +156 -0
  707. package/dist/scheduler.js.map +1 -0
  708. package/dist/score.d.ts +19 -19
  709. package/dist/score.js +709 -0
  710. package/dist/score.js.map +1 -0
  711. package/dist/sequences.d.ts +10 -6
  712. package/dist/sequences.js +206 -0
  713. package/dist/sequences.js.map +1 -0
  714. package/dist/server/doorman.js +154 -0
  715. package/dist/server/doorman.js.map +1 -0
  716. package/dist/server/gameServer.d.ts +16 -1
  717. package/dist/server/gameServer.js +643 -0
  718. package/dist/server/gameServer.js.map +1 -0
  719. package/dist/server/index.d.ts +1 -1
  720. package/dist/server/lobby.js +199 -0
  721. package/dist/server/lobby.js.map +1 -0
  722. package/dist/server/log.js +18 -0
  723. package/dist/server/log.js.map +1 -0
  724. package/dist/server/match.js +267 -0
  725. package/dist/server/match.js.map +1 -0
  726. package/dist/server/mode.d.ts +18 -9
  727. package/dist/server/mode.js +220 -0
  728. package/dist/server/mode.js.map +1 -0
  729. package/dist/{navigation-worker.js → server/navigation-worker.js} +1 -1
  730. package/dist/server/navigation-worker.js.map +1 -0
  731. package/dist/server/navigation.js +39 -0
  732. package/dist/server/navigation.js.map +1 -0
  733. package/dist/server/ops.d.ts +4 -0
  734. package/dist/server/ops.js +137 -0
  735. package/dist/server/ops.js.map +1 -0
  736. package/dist/server/packs.d.ts +3 -3
  737. package/dist/server/packs.js +32 -0
  738. package/dist/server/packs.js.map +1 -0
  739. package/dist/server/ratings.d.ts +5 -0
  740. package/dist/server/ratings.js +104 -0
  741. package/dist/server/ratings.js.map +1 -0
  742. package/dist/server/relay.d.ts +12 -2
  743. package/dist/server/relay.js +144 -0
  744. package/dist/server/relay.js.map +1 -0
  745. package/dist/server/rooms.d.ts +9 -2
  746. package/dist/server/rooms.js +442 -0
  747. package/dist/server/rooms.js.map +1 -0
  748. package/dist/server/seat.js +116 -0
  749. package/dist/server/seat.js.map +1 -0
  750. package/dist/server/seatSettings.d.ts +3 -3
  751. package/dist/server/seatSettings.js +63 -0
  752. package/dist/server/seatSettings.js.map +1 -0
  753. package/dist/server/secret.js +13 -0
  754. package/dist/server/secret.js.map +1 -0
  755. package/dist/server/start.d.ts +13 -6
  756. package/dist/server/start.js +76 -0
  757. package/dist/server/start.js.map +1 -0
  758. package/dist/server/websocket.d.ts +9 -1
  759. package/dist/server/websocket.js +306 -0
  760. package/dist/server/websocket.js.map +1 -0
  761. package/dist/server.js +15 -2861
  762. package/dist/session/can.js +26 -0
  763. package/dist/session/can.js.map +1 -0
  764. package/dist/session/commandReplay.d.ts +8 -2
  765. package/dist/session/commandReplay.js +293 -0
  766. package/dist/session/commandReplay.js.map +1 -0
  767. package/dist/session/debug.js +151 -0
  768. package/dist/session/debug.js.map +1 -0
  769. package/dist/session/delay.js +62 -0
  770. package/dist/session/delay.js.map +1 -0
  771. package/dist/session/delta.d.ts +14 -1
  772. package/dist/session/delta.js +407 -0
  773. package/dist/session/delta.js.map +1 -0
  774. package/dist/session/entityState.js +415 -0
  775. package/dist/session/entityState.js.map +1 -0
  776. package/dist/session/local.d.ts +47 -5
  777. package/dist/session/local.js +670 -0
  778. package/dist/session/local.js.map +1 -0
  779. package/dist/session/memory.d.ts +20 -2
  780. package/dist/session/memory.js +131 -0
  781. package/dist/session/memory.js.map +1 -0
  782. package/dist/session/protocol.d.ts +325 -31
  783. package/dist/session/protocol.js +55 -0
  784. package/dist/session/protocol.js.map +1 -0
  785. package/dist/session/remote.d.ts +74 -12
  786. package/dist/session/remote.js +1394 -0
  787. package/dist/session/remote.js.map +1 -0
  788. package/dist/session/replay.d.ts +11 -2
  789. package/dist/session/replay.js +160 -0
  790. package/dist/session/replay.js.map +1 -0
  791. package/dist/session/seed.js +12 -0
  792. package/dist/session/seed.js.map +1 -0
  793. package/dist/session/share.d.ts +5 -1
  794. package/dist/session/share.js +94 -0
  795. package/dist/session/share.js.map +1 -0
  796. package/dist/session/socket.d.ts +1 -1
  797. package/dist/session/socket.js +29 -0
  798. package/dist/session/socket.js.map +1 -0
  799. package/dist/session/wire.d.ts +5 -0
  800. package/dist/session/wire.js +84 -0
  801. package/dist/session/wire.js.map +1 -0
  802. package/dist/session/worker.d.ts +77 -12
  803. package/dist/session/worker.js +499 -0
  804. package/dist/session/worker.js.map +1 -0
  805. package/dist/shared.d.ts +31 -5
  806. package/dist/shared.js +166 -0
  807. package/dist/shared.js.map +1 -0
  808. package/dist/sides.d.ts +9 -3
  809. package/dist/sides.js +149 -0
  810. package/dist/sides.js.map +1 -0
  811. package/dist/sight.js +85 -0
  812. package/dist/sight.js.map +1 -0
  813. package/dist/simulate-worker.js +1 -1
  814. package/dist/simulate.d.ts +12 -8
  815. package/dist/{simulate-oXBiw1Ff.js → simulate.js} +10 -11
  816. package/dist/simulate.js.map +1 -0
  817. package/dist/smart.js +77 -0
  818. package/dist/smart.js.map +1 -0
  819. package/dist/spatial.d.ts +32 -16
  820. package/dist/spatial.js +234 -0
  821. package/dist/spatial.js.map +1 -0
  822. package/dist/spawning.d.ts +1 -0
  823. package/dist/spawning.js +224 -0
  824. package/dist/spawning.js.map +1 -0
  825. package/dist/stances.d.ts +6 -3
  826. package/dist/stances.js +169 -0
  827. package/dist/stances.js.map +1 -0
  828. package/dist/start.d.ts +10 -10
  829. package/dist/start.js +75 -0
  830. package/dist/start.js.map +1 -0
  831. package/dist/stats.d.ts +42 -16
  832. package/dist/stats.js +290 -0
  833. package/dist/stats.js.map +1 -0
  834. package/dist/summoned.d.ts +52 -0
  835. package/dist/summoned.js +38 -0
  836. package/dist/summoned.js.map +1 -0
  837. package/dist/summons.d.ts +10 -13
  838. package/dist/summons.js +271 -0
  839. package/dist/summons.js.map +1 -0
  840. package/dist/systems/abilities.js +224 -0
  841. package/dist/systems/abilities.js.map +1 -0
  842. package/dist/systems/combat.d.ts +35 -1
  843. package/dist/systems/combat.js +677 -0
  844. package/dist/systems/combat.js.map +1 -0
  845. package/dist/systems/combatTold.d.ts +3 -1
  846. package/dist/systems/combatTold.js +85 -0
  847. package/dist/systems/combatTold.js.map +1 -0
  848. package/dist/systems/construction.js +80 -0
  849. package/dist/systems/construction.js.map +1 -0
  850. package/dist/systems/economy.d.ts +0 -6
  851. package/dist/systems/economy.js +128 -0
  852. package/dist/systems/economy.js.map +1 -0
  853. package/dist/systems/fog.d.ts +1 -1
  854. package/dist/systems/fog.js +120 -0
  855. package/dist/systems/fog.js.map +1 -0
  856. package/dist/systems/life.js +32 -0
  857. package/dist/systems/life.js.map +1 -0
  858. package/dist/systems/movement.d.ts +24 -12
  859. package/dist/systems/movement.js +1247 -0
  860. package/dist/systems/movement.js.map +1 -0
  861. package/dist/systems/orders.js +64 -0
  862. package/dist/systems/orders.js.map +1 -0
  863. package/dist/systems/production.js +322 -0
  864. package/dist/systems/production.js.map +1 -0
  865. package/dist/systems/productionQueue.js +120 -0
  866. package/dist/systems/productionQueue.js.map +1 -0
  867. package/dist/systems/victory.d.ts +1 -1
  868. package/dist/systems/victory.js +56 -0
  869. package/dist/systems/victory.js.map +1 -0
  870. package/dist/talk.d.ts +6 -6
  871. package/dist/talk.js +153 -0
  872. package/dist/talk.js.map +1 -0
  873. package/dist/targeting.d.ts +142 -0
  874. package/dist/targeting.js +49 -0
  875. package/dist/targeting.js.map +1 -0
  876. package/dist/tech.d.ts +20 -3
  877. package/dist/tech.js +239 -0
  878. package/dist/tech.js.map +1 -0
  879. package/dist/techTree.d.ts +7 -0
  880. package/dist/techTree.js +90 -0
  881. package/dist/techTree.js.map +1 -0
  882. package/dist/terrain.d.ts +59 -7
  883. package/dist/terrain.js +389 -0
  884. package/dist/terrain.js.map +1 -0
  885. package/dist/terrainSave.d.ts +6 -0
  886. package/dist/terrainSave.js +74 -0
  887. package/dist/terrainSave.js.map +1 -0
  888. package/dist/testing.d.ts +8 -7
  889. package/dist/testing.js +13 -739
  890. package/dist/testing.js.map +1 -1
  891. package/dist/tiles.d.ts +1 -1
  892. package/dist/tiles.js +43 -0
  893. package/dist/tiles.js.map +1 -0
  894. package/dist/timers.d.ts +29 -4
  895. package/dist/timers.js +242 -0
  896. package/dist/timers.js.map +1 -0
  897. package/dist/tomes.d.ts +4 -4
  898. package/dist/tomes.js +94 -0
  899. package/dist/tomes.js.map +1 -0
  900. package/dist/trade.js +103 -0
  901. package/dist/trade.js.map +1 -0
  902. package/dist/transport.d.ts +6 -1
  903. package/dist/transport.js +281 -0
  904. package/dist/transport.js.map +1 -0
  905. package/dist/tunables.d.ts +10 -3
  906. package/dist/tunables.js +56 -0
  907. package/dist/tunables.js.map +1 -0
  908. package/dist/unitResources.d.ts +67 -0
  909. package/dist/unitResources.js +266 -0
  910. package/dist/unitResources.js.map +1 -0
  911. package/dist/upkeep.d.ts +6 -1
  912. package/dist/upkeep.js +26 -0
  913. package/dist/upkeep.js.map +1 -0
  914. package/dist/veterancy.d.ts +8 -3
  915. package/dist/veterancy.js +131 -0
  916. package/dist/veterancy.js.map +1 -0
  917. package/dist/vision.d.ts +36 -0
  918. package/dist/vision.js +133 -0
  919. package/dist/vision.js.map +1 -0
  920. package/dist/walls.d.ts +1 -1
  921. package/dist/walls.js +278 -0
  922. package/dist/walls.js.map +1 -0
  923. package/dist/world.d.ts +606 -88
  924. package/dist/world.js +1263 -0
  925. package/dist/world.js.map +1 -0
  926. package/package.json +2 -2
  927. package/dist/ai.js.map +0 -1
  928. package/dist/attributes.d.ts +0 -66
  929. package/dist/brain-BvVdUhX8.js +0 -7659
  930. package/dist/brain-BvVdUhX8.js.map +0 -1
  931. package/dist/builds-C6LfgvEU.js +0 -460
  932. package/dist/builds-C6LfgvEU.js.map +0 -1
  933. package/dist/coreComponents-syuh2fPG.js +0 -5149
  934. package/dist/coreComponents-syuh2fPG.js.map +0 -1
  935. package/dist/debugCommands-CzjrSm66.js +0 -14739
  936. package/dist/debugCommands-CzjrSm66.js.map +0 -1
  937. package/dist/determinism-BCymQwiE.js +0 -518
  938. package/dist/determinism-BCymQwiE.js.map +0 -1
  939. package/dist/game-DiJEN-Ks.js +0 -5800
  940. package/dist/game-DiJEN-Ks.js.map +0 -1
  941. package/dist/index.js.map +0 -1
  942. package/dist/inspect-D9dWHmZ0.js.map +0 -1
  943. package/dist/local-Dkovq42k.js +0 -1379
  944. package/dist/local-Dkovq42k.js.map +0 -1
  945. package/dist/missionRules-C-bGxm0Q.js.map +0 -1
  946. package/dist/navigation-worker.js.map +0 -1
  947. package/dist/packs-g5thvmGn.js +0 -3199
  948. package/dist/packs-g5thvmGn.js.map +0 -1
  949. package/dist/profiles-B3NS9jwk.js.map +0 -1
  950. package/dist/server.js.map +0 -1
  951. package/dist/simulate-oXBiw1Ff.js.map +0 -1
@@ -0,0 +1,224 @@
1
+ import { footprintOf, isScenery } from "./defs.js";
2
+ import { constructionStarted, entitySpawned } from "./engineEvents.js";
3
+ import { constructionSite } from "./systems/construction.js";
4
+ import { Entity, deposit, fighting, moving } from "./entity.js";
5
+ import { agentParamsOf } from "./navigation/agentParams.js";
6
+ import { halt, setGhost } from "./systems/movement.js";
7
+ import { dashing } from "./dashing.js";
8
+ import { clearOrders } from "./orders/queue.js";
9
+ import { resourceAt } from "./orders/build.js";
10
+ //#region src/spawning.ts
11
+ /**
12
+ * How entities come into the world and are moved about in it, as the world's own part (`World.spawn`, `place`,
13
+ * `setOwner`, `setHidden`, `setLifetime`): what a type is given as it is made, its place on the ground, the grid and the
14
+ * ways, whose it is, whether it is inside something, how long it lasts. The world's methods are this.world part's
15
+ */
16
+ var Spawning = class {
17
+ world;
18
+ constructor(world) {
19
+ this.world = world;
20
+ }
21
+ spawn(typeId, owner, position, options = {}) {
22
+ const def = this.world.registry.unit(typeId);
23
+ this.world.player(owner);
24
+ let pos = position;
25
+ let cell;
26
+ if (def.kind !== "unit") {
27
+ const fp = footprintOf(def);
28
+ cell = this.world.grid.cellFor(position.x, position.z, fp.w, fp.d);
29
+ pos = {
30
+ x: cell.x + fp.w / 2,
31
+ z: cell.z + fp.d / 2
32
+ };
33
+ } else pos = this.world.layerOf(def).closestPoint(position, 8) ?? position;
34
+ const entity = new Entity(this.world.newEntityId(), def, owner, pos);
35
+ entity.facing = entity.prevFacing = options.facing ?? 0;
36
+ const like = options.looksLike;
37
+ entity.scale = options.scale ?? like?.scale ?? 1;
38
+ entity.look = options.look ?? like?.look;
39
+ if (like) entity.likeness = like.likeness ? { ...like.likeness } : {
40
+ type: like.def.id,
41
+ owner: like.owner
42
+ };
43
+ entity.cell = cell;
44
+ entity.expireIn(options.lifetime ?? def.lifetime ?? null);
45
+ entity.lifetime = entity.expires ?? 0;
46
+ if (def.invisible) entity.unseenIn = def.invisible.after ?? 0;
47
+ if (def.uses) entity.health = entity.maxHealth = def.uses;
48
+ if (def.kind === "unit") {
49
+ const speed = def.stats.moveSpeed;
50
+ if (speed) {
51
+ entity.set(moving, {
52
+ speed,
53
+ status: "idle",
54
+ goal: {
55
+ x: pos.x,
56
+ z: pos.z
57
+ },
58
+ goalEntity: 0,
59
+ range: 0,
60
+ groupId: 0,
61
+ navGoal: {
62
+ x: pos.x,
63
+ z: pos.z
64
+ },
65
+ navVersion: 0,
66
+ corner: {
67
+ x: pos.x,
68
+ z: pos.z
69
+ },
70
+ bestDistance: 0,
71
+ stalledTime: 0,
72
+ anchored: false,
73
+ ghost: false,
74
+ finalFacing: null
75
+ });
76
+ this.world.nav.addAgent(entity.id, pos, agentParamsOf(entity, speed));
77
+ }
78
+ } else {
79
+ const fp = footprintOf(def);
80
+ this.world.grid.occupy(cell.x, cell.z, fp.w, fp.d, entity.id);
81
+ const under = resourceAt(this.world, def, pos);
82
+ if (under) {
83
+ under.get(deposit).under = entity.id;
84
+ entity.on = under.id;
85
+ }
86
+ if (!this.world.nav.addObstacle(entity.id, entity.rect) && !this.world.obstaclesRefused++) this.world.log.warn("navigation", `There is no room for another obstacle: ${def.id} does not block the way, nor what is put down after it while there is none`, { entity: entity.id });
87
+ if (def.resource) entity.set(deposit, {
88
+ amount: def.resource.amount,
89
+ occupants: 0
90
+ });
91
+ if (options.underConstruction) {
92
+ const site = typeof options.underConstruction === "object" ? options.underConstruction : {};
93
+ entity.set(constructionSite, {
94
+ progress: 0,
95
+ buildTime: site.buildTime ?? def.buildTime ?? 1,
96
+ builders: 0,
97
+ ...site.paid && { paid: site.paid }
98
+ });
99
+ entity.health = Math.max(1, Math.round(entity.maxHealth * this.world.settings.production.constructionHealth));
100
+ }
101
+ }
102
+ entity.mana = Math.min(def.initialMana ?? entity.maxMana, entity.maxMana);
103
+ for (const id of def.abilities ?? []) entity.addAbility({
104
+ id,
105
+ level: 1,
106
+ cooldown: 0,
107
+ autocast: this.world.registry.ability(id).autocast ?? false
108
+ });
109
+ if (def.attacks?.length) entity.set(fighting, {
110
+ cooldown: 0,
111
+ swing: 0,
112
+ swingTarget: 0,
113
+ autoTarget: 0,
114
+ lastAttacker: 0,
115
+ guard: null,
116
+ passive: false
117
+ });
118
+ for (const part of this.world.registry.spawning) part.onSpawn(entity, this.world);
119
+ if (this.world.hooks.has("made")) this.world.hooks.run("made", entity);
120
+ for (const [id, value] of Object.entries(options.data ?? {})) {
121
+ const component = this.world.registry.component(id);
122
+ if (!component) throw new Error(`Cannot spawn ${typeId} with "${id}": the game has no component of that id`);
123
+ entity.set(component, value);
124
+ }
125
+ this.world.entities.set(entity.id, entity);
126
+ this.world.index.add(entity);
127
+ if (entity.isStructure) this.world.spatial.insertStatic(entity);
128
+ entity.setScenery(isScenery(def) && this.world.player(owner).neutral && !entity.has(constructionSite) && entity.expires === null);
129
+ if (!entity.scenery) this.world.units.set(entity.id, entity);
130
+ else for (const [team, inSight] of this.world.sceneryInSight) if (this.world.isVisibleTo(entity, team)) inSight.add(entity);
131
+ for (const [id, level] of this.world.player(owner).upgrades) this.world.registry.upgrade(id).apply?.(this.world, entity, level);
132
+ if (options.name) this.world.setName(entity, options.name);
133
+ this.world.hooks.run("spawn", entity);
134
+ this.world.events.emit(entitySpawned, entity);
135
+ if (entity.has(constructionSite)) this.world.events.emit(constructionStarted, entity);
136
+ return entity;
137
+ }
138
+ /**
139
+ * What its parts call off as an entity leaves its owner, dying or given away (`Component.onLeave`)
140
+ *
141
+ * @internal
142
+ */
143
+ leave(entity) {
144
+ for (const part of this.world.registry.leaving) if (entity.has(part)) part.onLeave(entity, this.world);
145
+ }
146
+ /**
147
+ * Turns scenery into an actor, for good: something gave it a reason to be looked at every tick, like a buff
148
+ * that has to run out. Whatever does that to an entity calls this.world; the debug checks catch what forgets to.
149
+ * It joins `World.units` at the end, out of id order (see `World.units`), which a save keeps as it is
150
+ */
151
+ wake(entity) {
152
+ if (!entity.scenery) return;
153
+ entity.setScenery(false);
154
+ this.world.units.set(entity.id, entity);
155
+ }
156
+ /** Puts a unit somewhere else, where it stands: the way through is not its concern. Structures stay where they were built */
157
+ place(entity, point) {
158
+ if (entity.isStructure) throw new Error(`${entity.def.id}#${entity.id} is a structure: it cannot be moved`);
159
+ entity.moveTo(point.x, point.z);
160
+ if (entity.get(moving) && !entity.hidden && !entity.get(dashing)?.height) this.world.nav.teleport(entity.id, point);
161
+ }
162
+ /**
163
+ * Gives an entity to another player, from now on in everything: whose it is, whom it fights, what it counts for.
164
+ * What it was doing is called off, and what it was making is given back to the one it belonged to
165
+ */
166
+ setOwner(entity, owner) {
167
+ if (entity.owner === owner) return;
168
+ this.world.player(owner);
169
+ clearOrders(this.world, entity);
170
+ this.leave(entity);
171
+ if (entity.get(fighting)) Object.assign(entity.get(fighting), {
172
+ autoTarget: 0,
173
+ lastAttacker: 0,
174
+ guard: null
175
+ });
176
+ this.world.index.remove(entity);
177
+ entity.changeOwner(owner);
178
+ this.world.index.add(entity);
179
+ this.world.spatial.ownerChanged();
180
+ if (entity.scenery && !this.world.player(owner).neutral) this.wake(entity);
181
+ }
182
+ /**
183
+ * Takes a unit out of the world for a while, or puts it back: a worker inside a gold mine, a unit carried in
184
+ * something. While hidden it is not found, not seen and in nobody's way, and its orders wait. It comes back at
185
+ * `at`, or where it went in, on the nearest ground it can stand on. Structures cannot hide
186
+ */
187
+ setHidden(entity, hidden, at) {
188
+ if (entity.hidden === hidden) return;
189
+ if (entity.isStructure) throw new Error(`${entity.def.id}#${entity.id} is a structure: it cannot hide`);
190
+ const m = entity.get(moving);
191
+ if (hidden) {
192
+ if (m) {
193
+ halt(this.world, entity);
194
+ this.world.nav.removeAgent(entity.id);
195
+ }
196
+ this.wake(entity);
197
+ entity.setInside(true);
198
+ return;
199
+ }
200
+ entity.setInside(false);
201
+ const point = this.world.navFor(entity).closestPoint(at ?? entity.pos, 8) ?? at ?? entity.pos;
202
+ entity.moveTo(point.x, point.z);
203
+ entity.prevPos.x = point.x;
204
+ entity.prevPos.z = point.z;
205
+ if (!m) return;
206
+ this.world.nav.addAgent(entity.id, point, agentParamsOf(entity, m.speed));
207
+ const { ghost } = m;
208
+ m.ghost = false;
209
+ delete m.phased;
210
+ m.anchored = false;
211
+ m.status = "idle";
212
+ setGhost(this.world, entity, ghost);
213
+ }
214
+ /** Gives an entity a time after which it is gone by itself, like a ward, or takes it away with `null` */
215
+ setLifetime(entity, seconds) {
216
+ if (seconds !== null) this.wake(entity);
217
+ entity.expireIn(seconds);
218
+ entity.lifetime = seconds ?? 0;
219
+ }
220
+ };
221
+ //#endregion
222
+ export { Spawning };
223
+
224
+ //# sourceMappingURL=spawning.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spawning.js","names":[],"sources":["../src/spawning.ts"],"sourcesContent":["import { constructionStarted, entitySpawned } from '#engine/engineEvents'\nimport { dashing } from './dashing'\nimport { footprintOf, isScenery } from './defs'\nimport { deposit, Entity, fighting, moving, type PlayerId } from './entity'\nimport type { Vec2 } from './math'\nimport { agentParamsOf } from './navigation/agentParams'\nimport { resourceAt } from './orders/build'\nimport { clearOrders } from './orders/queue'\nimport { constructionSite } from './systems/construction'\nimport { halt, setGhost } from './systems/movement'\nimport type { SpawnOptions, World } from './world'\n/**\n * How entities come into the world and are moved about in it, as the world's own part (`World.spawn`, `place`,\n * `setOwner`, `setHidden`, `setLifetime`): what a type is given as it is made, its place on the ground, the grid and the\n * ways, whose it is, whether it is inside something, how long it lasts. The world's methods are this.world part's\n */\nexport class Spawning {\n\tconstructor(private readonly world: World) {}\n\n\tspawn(typeId: string, owner: PlayerId, position: Vec2, options: SpawnOptions = {}): Entity {\n\t\tconst def = this.world.registry.unit(typeId)\n\t\tthis.world.player(owner)\n\t\tlet pos = position\n\t\tlet cell: { x: number; z: number } | undefined\n\t\tif (def.kind !== 'unit') {\n\t\t\tconst fp = footprintOf(def)\n\t\t\tcell = this.world.grid.cellFor(position.x, position.z, fp.w, fp.d)\n\t\t\tpos = { x: cell.x + fp.w / 2, z: cell.z + fp.d / 2 }\n\t\t} else {\n\t\t\tpos = this.world.layerOf(def).closestPoint(position, 8) ?? position\n\t\t}\n\n\t\tconst entity = new Entity(this.world.newEntityId(), def, owner, pos)\n\t\tentity.facing = entity.prevFacing = options.facing ?? 0\n\t\tconst like = options.looksLike\n\t\tentity.scale = options.scale ?? like?.scale ?? 1\n\t\tentity.look = options.look ?? like?.look\n\t\tif (like) entity.likeness = like.likeness ? { ...like.likeness } : { type: like.def.id, owner: like.owner }\n\t\tentity.cell = cell\n\t\tentity.expireIn(options.lifetime ?? def.lifetime ?? null)\n\t\tentity.lifetime = entity.expires ?? 0\n\t\tif (def.invisible) entity.unseenIn = def.invisible.after ?? 0\n\t\tif (def.uses) entity.health = entity.maxHealth = def.uses\n\n\t\tif (def.kind === 'unit') {\n\t\t\tconst speed = def.stats.moveSpeed\n\t\t\tif (speed) {\n\t\t\t\tentity.set(moving, {\n\t\t\t\t\tspeed,\n\t\t\t\t\tstatus: 'idle',\n\t\t\t\t\tgoal: { x: pos.x, z: pos.z },\n\t\t\t\t\tgoalEntity: 0,\n\t\t\t\t\trange: 0,\n\t\t\t\t\tgroupId: 0,\n\t\t\t\t\tnavGoal: { x: pos.x, z: pos.z },\n\t\t\t\t\tnavVersion: 0,\n\t\t\t\t\tcorner: { x: pos.x, z: pos.z },\n\t\t\t\t\tbestDistance: 0,\n\t\t\t\t\tstalledTime: 0,\n\t\t\t\t\tanchored: false,\n\t\t\t\t\tghost: false,\n\t\t\t\t\tfinalFacing: null\n\t\t\t\t})\n\t\t\t\tthis.world.nav.addAgent(entity.id, pos, agentParamsOf(entity, speed))\n\t\t\t}\n\t\t} else {\n\t\t\tconst fp = footprintOf(def)\n\t\t\tthis.world.grid.occupy(cell!.x, cell!.z, fp.w, fp.d, entity.id)\n\t\t\t// on a resource (a cursed mine on a gold mine): the two know of each other\n\t\t\tconst under = resourceAt(this.world, def, pos)\n\t\t\tif (under) {\n\t\t\t\tunder.get(deposit)!.under = entity.id\n\t\t\t\tentity.on = under.id\n\t\t\t}\n\t\t\t// placing is refused before the room runs out (`placementProblem`); what is put down by a script past it stands,\n\t\t\t// and does not block: said, never thrown in the middle of a tick\n\t\t\t// (said once: a map past the room would say it for each of thousands of trees, and stall the page that shows it)\n\t\t\tif (!this.world.nav.addObstacle(entity.id, entity.rect) && !this.world.obstaclesRefused++)\n\t\t\t\tthis.world.log.warn(\n\t\t\t\t\t'navigation',\n\t\t\t\t\t`There is no room for another obstacle: ${def.id} does not block the way, nor what is put down after it while there is none`,\n\t\t\t\t\t{\n\t\t\t\t\t\tentity: entity.id\n\t\t\t\t\t}\n\t\t\t\t)\n\t\t\tif (def.resource) entity.set(deposit, { amount: def.resource.amount, occupants: 0 })\n\t\t\tif (options.underConstruction) {\n\t\t\t\tconst site = typeof options.underConstruction === 'object' ? options.underConstruction : {}\n\t\t\t\tentity.set(constructionSite, {\n\t\t\t\t\tprogress: 0,\n\t\t\t\t\tbuildTime: site.buildTime ?? def.buildTime ?? 1,\n\t\t\t\t\tbuilders: 0,\n\t\t\t\t\t...(site.paid && { paid: site.paid })\n\t\t\t\t})\n\t\t\t\tentity.health = Math.max(1, Math.round(entity.maxHealth * this.world.settings.production.constructionHealth))\n\t\t\t}\n\t\t}\n\t\tentity.mana = Math.min(def.initialMana ?? entity.maxMana, entity.maxMana)\n\t\tfor (const id of def.abilities ?? []) {\n\t\t\tentity.addAbility({ id, level: 1, cooldown: 0, autocast: this.world.registry.ability(id).autocast ?? false })\n\t\t}\n\t\tif (def.attacks?.length)\n\t\t\tentity.set(fighting, { cooldown: 0, swing: 0, swingTarget: 0, autoTarget: 0, lastAttacker: 0, guard: null, passive: false })\n\t\t// what each part of the game gives it as it is made, by its type: a queue, slots, a hold (`Component.onSpawn`)\n\t\tfor (const part of this.world.registry.spawning) part.onSpawn!(entity, this.world)\n\n\t\t// what a pack gives it of its own: a hero's level, a shop's wares (`heroesPack`)\n\t\tif (this.world.hooks.has('made')) this.world.hooks.run('made', entity)\n\t\t// what the caller says it starts with: over what its parts and packs gave\n\t\tfor (const [id, value] of Object.entries(options.data ?? {})) {\n\t\t\tconst component = this.world.registry.component(id)\n\t\t\tif (!component) throw new Error(`Cannot spawn ${typeId} with \"${id}\": the game has no component of that id`)\n\t\t\tentity.set(component, value)\n\t\t}\n\n\t\tthis.world.entities.set(entity.id, entity)\n\t\tthis.world.index.add(entity)\n\t\tif (entity.isStructure) this.world.spatial.insertStatic(entity)\n\t\tentity.setScenery(isScenery(def) && this.world.player(owner).neutral && !entity.has(constructionSite) && entity.expires === null)\n\t\tif (!entity.scenery) this.world.units.set(entity.id, entity)\n\t\t// scenery that appears where a team is looking is in sight right away, not at the next fog update\n\t\telse {\n\t\t\tfor (const [team, inSight] of this.world.sceneryInSight) if (this.world.isVisibleTo(entity, team)) inSight.add(entity)\n\t\t}\n\t\t// what the owner's research does besides stats (`UpgradeDef.apply`)\n\t\tfor (const [id, level] of this.world.player(owner).upgrades) this.world.registry.upgrade(id).apply?.(this.world, entity, level)\n\t\t// before the hooks, which may want to know who it is\n\t\tif (options.name) this.world.setName(entity, options.name)\n\t\tthis.world.hooks.run('spawn', entity)\n\t\tthis.world.events.emit(entitySpawned, entity)\n\t\tif (entity.has(constructionSite)) this.world.events.emit(constructionStarted, entity)\n\t\treturn entity\n\t}\n\n\t/**\n\t * What its parts call off as an entity leaves its owner, dying or given away (`Component.onLeave`)\n\t *\n\t * @internal\n\t */\n\tleave(entity: Entity): void {\n\t\tfor (const part of this.world.registry.leaving) if (entity.has(part)) part.onLeave!(entity, this.world)\n\t}\n\n\t/**\n\t * Turns scenery into an actor, for good: something gave it a reason to be looked at every tick, like a buff\n\t * that has to run out. Whatever does that to an entity calls this.world; the debug checks catch what forgets to.\n\t * It joins `World.units` at the end, out of id order (see `World.units`), which a save keeps as it is\n\t */\n\twake(entity: Entity): void {\n\t\tif (!entity.scenery) return\n\t\tentity.setScenery(false)\n\t\tthis.world.units.set(entity.id, entity)\n\t}\n\n\t/** Puts a unit somewhere else, where it stands: the way through is not its concern. Structures stay where they were built */\n\tplace(entity: Entity, point: Vec2): void {\n\t\tif (entity.isStructure) throw new Error(`${entity.def.id}#${entity.id} is a structure: it cannot be moved`)\n\t\tentity.moveTo(point.x, point.z)\n\t\tif (entity.get(moving) && !entity.hidden && !entity.get(dashing)?.height) this.world.nav.teleport(entity.id, point)\n\t}\n\n\t/**\n\t * Gives an entity to another player, from now on in everything: whose it is, whom it fights, what it counts for.\n\t * What it was doing is called off, and what it was making is given back to the one it belonged to\n\t */\n\tsetOwner(entity: Entity, owner: PlayerId): void {\n\t\tif (entity.owner === owner) return\n\t\tthis.world.player(owner)\n\t\tclearOrders(this.world, entity)\n\t\tthis.leave(entity)\n\t\tif (entity.get(fighting)) Object.assign(entity.get(fighting)!, { autoTarget: 0, lastAttacker: 0, guard: null })\n\t\tthis.world.index.remove(entity)\n\t\tentity.changeOwner(owner)\n\t\tthis.world.index.add(entity)\n\t\t// filed this.world tick under its old owner's: the grid's cells by owner wait for the next filing\n\t\tthis.world.spatial.ownerChanged()\n\t\t// a tree that now belongs to someone counts for them: it is not scenery any more\n\t\tif (entity.scenery && !this.world.player(owner).neutral) this.wake(entity)\n\t}\n\n\t/**\n\t * Takes a unit out of the world for a while, or puts it back: a worker inside a gold mine, a unit carried in\n\t * something. While hidden it is not found, not seen and in nobody's way, and its orders wait. It comes back at\n\t * `at`, or where it went in, on the nearest ground it can stand on. Structures cannot hide\n\t */\n\tsetHidden(entity: Entity, hidden: boolean, at?: Vec2): void {\n\t\tif (entity.hidden === hidden) return\n\t\tif (entity.isStructure) throw new Error(`${entity.def.id}#${entity.id} is a structure: it cannot hide`)\n\t\tconst m = entity.get(moving)\n\t\tif (hidden) {\n\t\t\tif (m) {\n\t\t\t\thalt(this.world, entity)\n\t\t\t\tthis.world.nav.removeAgent(entity.id)\n\t\t\t}\n\t\t\tthis.wake(entity)\n\t\t\tentity.setInside(true)\n\t\t\treturn\n\t\t}\n\t\tentity.setInside(false)\n\t\tconst nav = this.world.navFor(entity)\n\t\tconst point = nav.closestPoint(at ?? entity.pos, 8) ?? at ?? entity.pos\n\t\tentity.moveTo(point.x, point.z)\n\t\tentity.prevPos.x = point.x\n\t\tentity.prevPos.z = point.z\n\t\tif (!m) return\n\t\tthis.world.nav.addAgent(entity.id, point, agentParamsOf(entity, m.speed))\n\t\t// the agent is new, so it lost its flags\n\t\tconst { ghost } = m\n\t\tm.ghost = false\n\t\t// phasing is seen to again on the next tick (`BuffDef.phasing`)\n\t\tdelete m.phased\n\t\tm.anchored = false\n\t\tm.status = 'idle'\n\t\tsetGhost(this.world, entity, ghost)\n\t}\n\n\t/** Gives an entity a time after which it is gone by itself, like a ward, or takes it away with `null` */\n\tsetLifetime(entity: Entity, seconds: number | null): void {\n\t\tif (seconds !== null) this.wake(entity)\n\t\tentity.expireIn(seconds)\n\t\tentity.lifetime = seconds ?? 0\n\t}\n}\n"],"mappings":"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"}
package/dist/stances.d.ts CHANGED
@@ -6,8 +6,11 @@ import { type Entity } from './entity';
6
6
  * @beta
7
7
  */
8
8
  export interface StanceDef {
9
+ /** The stance's id, which the stance command and `UnitTypeDef.stance` name it by */
9
10
  id: string;
11
+ /** The stance's name shown on the HUD */
10
12
  name: string;
13
+ /** What the stance does, for its tooltip */
11
14
  description?: string;
12
15
  /** The key on the command card, for the HUD's buttons (`stanceButtons` of the client) */
13
16
  hotkey?: string;
@@ -22,7 +25,7 @@ export interface StanceDef {
22
25
  }
23
26
  /**
24
27
  * The four stances every RTS has: aggressive (the engine's own way, when no stance is set), defensive, hold fire and no
25
- * attack. A game gives `withStances` its own list in their place, or adds to these
28
+ * attack. A game gives `stancesPack` its own list in their place, or adds to these
26
29
  *
27
30
  * @beta
28
31
  */
@@ -57,7 +60,7 @@ export declare const stanceCommand: import("#engine/commands").DefinedCommand<"s
57
60
  stance: import("./fields").Check<string>;
58
61
  }>;
59
62
  /**
60
- * What a game turns stances on with (`withStances`)
63
+ * What a game turns stances on with (`stancesPack`)
61
64
  *
62
65
  * @beta
63
66
  */
@@ -73,4 +76,4 @@ export interface StancesOptions {
73
76
  *
74
77
  * @beta
75
78
  */
76
- export declare function withStances(options?: StancesOptions): GamePack;
79
+ export declare function stancesPack(options?: StancesOptions): GamePack;
@@ -0,0 +1,169 @@
1
+ import { defineComponent } from "./components.js";
2
+ import { edgeDistance, fighting } from "./entity.js";
3
+ import { defineHook } from "./hooks.js";
4
+ import { rangeAgainst } from "./attacks.js";
5
+ import { STRUCTURE_REACH } from "./engagement.js";
6
+ import { SWING_SLACK, disengage } from "./systems/combat.js";
7
+ import { ids, string } from "./fields.js";
8
+ import { defineCommand } from "./commands.js";
9
+ //#region src/stances.ts
10
+ /**
11
+ * The four stances every RTS has: aggressive (the engine's own way, when no stance is set), defensive, hold fire and no
12
+ * attack. A game gives `stancesPack` its own list in their place, or adds to these
13
+ *
14
+ * @beta
15
+ */
16
+ var STANCES = [
17
+ {
18
+ id: "aggressive",
19
+ name: "Aggressive",
20
+ description: "Attacks what comes into sight, and chases it",
21
+ hotkey: "G",
22
+ acquire: "any",
23
+ pursue: true,
24
+ fireBack: true,
25
+ returnTo: "post"
26
+ },
27
+ {
28
+ id: "defensive",
29
+ name: "Defensive",
30
+ description: "Fires at what comes within reach, and stays where it stands",
31
+ hotkey: "V",
32
+ acquire: "near",
33
+ pursue: false,
34
+ fireBack: true,
35
+ returnTo: "post"
36
+ },
37
+ {
38
+ id: "holdFire",
39
+ name: "Hold fire",
40
+ description: "Fires back at whoever hits it, and no more",
41
+ hotkey: "X",
42
+ acquire: "none",
43
+ pursue: false,
44
+ fireBack: true,
45
+ returnTo: "post"
46
+ },
47
+ {
48
+ id: "noAttack",
49
+ name: "No attack",
50
+ description: "Ignores everyone until told otherwise",
51
+ hotkey: "Z",
52
+ acquire: "none",
53
+ pursue: false,
54
+ fireBack: false,
55
+ returnTo: "none"
56
+ }
57
+ ];
58
+ /**
59
+ * The stance of a unit that was given none: the engine's own way
60
+ *
61
+ * @beta
62
+ */
63
+ var DEFAULT_STANCE = "aggressive";
64
+ /**
65
+ * The stance a unit is in, by its id; absent for one in the default stance. Told to its owner, so that the HUD shows it
66
+ *
67
+ * @beta
68
+ */
69
+ var stance = defineComponent({
70
+ id: "core.stance",
71
+ replicate: "owner"
72
+ });
73
+ /**
74
+ * The stance of a unit, as a definition: the one its component names, else the default (the first of `stances` with
75
+ * the default's id, else the first of them)
76
+ *
77
+ * @beta
78
+ */
79
+ function stanceOf(entity, stances = STANCES) {
80
+ const id = entity.get(stance) ?? "aggressive";
81
+ return stances.find((def) => def.id === id) ?? stances.find((def) => def.id === "aggressive") ?? stances[0];
82
+ }
83
+ /**
84
+ * Puts units of the player's in a stance (`{ entities, stance }`). Units of another's, and ids of nothing, are left
85
+ * out. A stance the game has not got is kept as a word and behaves as the default: the hooks know the game's list
86
+ *
87
+ * @beta
88
+ */
89
+ var stanceCommand = defineCommand("stance", {
90
+ entities: ids,
91
+ stance: string
92
+ }, (world, player, command) => {
93
+ const id = command.stance;
94
+ for (const entity of owned(world, player, command.entities)) {
95
+ const was = entity.get(stance);
96
+ if (id === "aggressive") entity.remove(stance);
97
+ else entity.set(stance, id);
98
+ if (was !== id && entity.get(fighting)) {
99
+ entity.get(fighting).autoTarget = 0;
100
+ entity.get(fighting).lastAttacker = 0;
101
+ disengage(world, entity);
102
+ }
103
+ }
104
+ });
105
+ /** The units of the player's among the ids, alive */
106
+ function owned(world, player, entities) {
107
+ const out = [];
108
+ for (const id of entities) {
109
+ const entity = world.get(id);
110
+ if (entity?.alive && entity.owner === player) out.push(entity);
111
+ }
112
+ return out;
113
+ }
114
+ /**
115
+ * A game whose units have stances: the component, the command, and the engine's acquisition read through hooks. In
116
+ * the default stance nothing changes. Defensive units fire at what their attack reaches and let go of what steps out
117
+ * of it, returning to where they stood (the engine's own way home); hold fire fires back at the last to hit it; no
118
+ * attack leaves everyone alone. A unit given an attack order fights whatever its stance
119
+ *
120
+ * @beta
121
+ */
122
+ function stancesPack(options = {}) {
123
+ const stances = options.stances ?? STANCES;
124
+ if (!stances.length) throw new Error("stancesPack: a game needs a stance at least");
125
+ /** Whether a unit of its own accord may go for a target, as its stance says */
126
+ const canAttackHook = defineHook({
127
+ hook: "canAttack",
128
+ id: "core.stances.canAttack",
129
+ run(world, event) {
130
+ if (event.cancelled || event.ordered) return;
131
+ const { attacker, target } = event;
132
+ const def = stanceOf(attacker, stances);
133
+ if (def.acquire === "any" && def.pursue) return;
134
+ const combat = attacker.get(fighting);
135
+ const engaged = !!combat && (combat.autoTarget === target.id || combat.lastAttacker === target.id);
136
+ if (def.acquire === "none") {
137
+ event.cancelled = !(def.fireBack && engaged);
138
+ return;
139
+ }
140
+ if (def.acquire === "near" || !def.pursue && engaged) {
141
+ const swinging = !!combat && combat.swing > 0 && combat.swingTarget === target.id;
142
+ const reach = rangeAgainst(world, attacker, target) + (target.isStructure ? STRUCTURE_REACH : 0) + (swinging ? SWING_SLACK : 0);
143
+ if (edgeDistance(attacker, target) > reach) event.cancelled = true;
144
+ }
145
+ }
146
+ });
147
+ /** A unit that returns nowhere after a fight: it forgets where it stood as the fight ends */
148
+ const idleHook = defineHook({
149
+ hook: "idle",
150
+ id: "core.stances.idle",
151
+ run(_world, event) {
152
+ const { entity } = event;
153
+ const combat = entity.get(fighting);
154
+ if (!combat?.guard || combat.autoTarget) return;
155
+ if (stanceOf(entity, stances).returnTo === "none") combat.guard = null;
156
+ }
157
+ });
158
+ return {
159
+ id: "stances",
160
+ options,
161
+ components: [stance],
162
+ commands: [stanceCommand],
163
+ hooks: [canAttackHook, idleHook]
164
+ };
165
+ }
166
+ //#endregion
167
+ export { DEFAULT_STANCE, STANCES, stance, stanceCommand, stanceOf, stancesPack };
168
+
169
+ //# sourceMappingURL=stances.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stances.js","names":[],"sources":["../src/stances.ts"],"sourcesContent":["import { defineCommand } from './commands'\nimport type { GamePack } from './packs/pack'\nimport { defineComponent } from './components'\nimport { edgeDistance, type Entity, type PlayerId, fighting } from './entity'\nimport { ids, string } from './fields'\nimport { defineHook } from './hooks'\nimport { disengage, STRUCTURE_REACH, SWING_SLACK } from './systems/combat'\nimport { rangeAgainst } from './attacks'\nimport type { World } from './world'\n\n/*\n * Stances (master plan FI1): how a unit with nothing to do takes to the enemies around it. Aggressive attacks what\n * comes into sight and chases it; defensive fires at what comes within its reach and stays where it stands; hold fire\n * fires back and no more; no attack ignores everyone. A pack a game turns on (`stancesPack`): a component on the unit\n * (`stance`), a command the player sends (`stanceCommand`), and the engine's own acquisition read through the\n * `canAttack` and `idle` hooks, so that nothing of the engine names a stance. An attack order is the player's word:\n * it goes through whatever the stance\n */\n\n/**\n * A stance: how a unit without orders takes to the enemies around it\n *\n * @beta\n */\nexport interface StanceDef {\n\t/** The stance's id, which the stance command and `UnitTypeDef.stance` name it by */\n\tid: string\n\t/** The stance's name shown on the HUD */\n\tname: string\n\t/** What the stance does, for its tooltip */\n\tdescription?: string\n\t/** The key on the command card, for the HUD's buttons (`stanceButtons` of the client) */\n\thotkey?: string\n\t/** What it attacks of its own accord: anything in its acquisition range, only what its attack reaches, or nothing */\n\tacquire: 'any' | 'near' | 'none'\n\t/** Whether it chases what it fights past the reach of its attack */\n\tpursue: boolean\n\t/** Whether it fights back whoever hits it, for a stance that acquires nothing */\n\tfireBack: boolean\n\t/** Where it goes once a fight is over: back where it stood, or nowhere */\n\treturnTo: 'post' | 'none'\n}\n\n/**\n * The four stances every RTS has: aggressive (the engine's own way, when no stance is set), defensive, hold fire and no\n * attack. A game gives `stancesPack` its own list in their place, or adds to these\n *\n * @beta\n */\nexport const STANCES: readonly StanceDef[] = [\n\t{\n\t\tid: 'aggressive',\n\t\tname: 'Aggressive',\n\t\tdescription: 'Attacks what comes into sight, and chases it',\n\t\thotkey: 'G',\n\t\tacquire: 'any',\n\t\tpursue: true,\n\t\tfireBack: true,\n\t\treturnTo: 'post'\n\t},\n\t{\n\t\tid: 'defensive',\n\t\tname: 'Defensive',\n\t\tdescription: 'Fires at what comes within reach, and stays where it stands',\n\t\thotkey: 'V',\n\t\tacquire: 'near',\n\t\tpursue: false,\n\t\tfireBack: true,\n\t\treturnTo: 'post'\n\t},\n\t{\n\t\tid: 'holdFire',\n\t\tname: 'Hold fire',\n\t\tdescription: 'Fires back at whoever hits it, and no more',\n\t\thotkey: 'X',\n\t\tacquire: 'none',\n\t\tpursue: false,\n\t\tfireBack: true,\n\t\treturnTo: 'post'\n\t},\n\t{\n\t\tid: 'noAttack',\n\t\tname: 'No attack',\n\t\tdescription: 'Ignores everyone until told otherwise',\n\t\thotkey: 'Z',\n\t\tacquire: 'none',\n\t\tpursue: false,\n\t\tfireBack: false,\n\t\treturnTo: 'none'\n\t}\n]\n\n/**\n * The stance of a unit that was given none: the engine's own way\n *\n * @beta\n */\nexport const DEFAULT_STANCE = 'aggressive'\n\n/**\n * The stance a unit is in, by its id; absent for one in the default stance. Told to its owner, so that the HUD shows it\n *\n * @beta\n */\nexport const stance = defineComponent<string>({ id: 'core.stance', replicate: 'owner' })\n\n/**\n * The stance of a unit, as a definition: the one its component names, else the default (the first of `stances` with\n * the default's id, else the first of them)\n *\n * @beta\n */\nexport function stanceOf(entity: Entity, stances: readonly StanceDef[] = STANCES): StanceDef {\n\tconst id = entity.get(stance) ?? DEFAULT_STANCE\n\treturn stances.find((def) => def.id === id) ?? stances.find((def) => def.id === DEFAULT_STANCE) ?? stances[0]\n}\n\n/**\n * Puts units of the player's in a stance (`{ entities, stance }`). Units of another's, and ids of nothing, are left\n * out. A stance the game has not got is kept as a word and behaves as the default: the hooks know the game's list\n *\n * @beta\n */\nexport const stanceCommand = defineCommand('stance', { entities: ids, stance: string }, (world, player, command) => {\n\tconst id = command.stance\n\tfor (const entity of owned(world, player, command.entities)) {\n\t\tconst was = entity.get(stance)\n\t\tif (id === DEFAULT_STANCE) entity.remove(stance)\n\t\telse entity.set(stance, id)\n\t\t// a unit told to stand down lets go of whatever it was chasing: the hooks say whether it may go for it again\n\t\tif (was !== id && entity.get(fighting)) {\n\t\t\tentity.get(fighting)!.autoTarget = 0\n\t\t\tentity.get(fighting)!.lastAttacker = 0\n\t\t\tdisengage(world, entity)\n\t\t}\n\t}\n})\n\n/** The units of the player's among the ids, alive */\nfunction owned(world: World, player: PlayerId, entities: readonly number[]): Entity[] {\n\tconst out: Entity[] = []\n\tfor (const id of entities) {\n\t\tconst entity = world.get(id)\n\t\tif (entity?.alive && entity.owner === player) out.push(entity)\n\t}\n\treturn out\n}\n\n/**\n * What a game turns stances on with (`stancesPack`)\n *\n * @beta\n */\nexport interface StancesOptions {\n\t/** The stances of this game, in the order the HUD shows them: the usual four (`STANCES`) when left out */\n\tstances?: readonly StanceDef[]\n}\n\n/**\n * A game whose units have stances: the component, the command, and the engine's acquisition read through hooks. In\n * the default stance nothing changes. Defensive units fire at what their attack reaches and let go of what steps out\n * of it, returning to where they stood (the engine's own way home); hold fire fires back at the last to hit it; no\n * attack leaves everyone alone. A unit given an attack order fights whatever its stance\n *\n * @beta\n */\nexport function stancesPack(options: StancesOptions = {}): GamePack {\n\tconst stances = options.stances ?? STANCES\n\tif (!stances.length) throw new Error('stancesPack: a game needs a stance at least')\n\n\t/** Whether a unit of its own accord may go for a target, as its stance says */\n\tconst canAttackHook = defineHook({\n\t\thook: 'canAttack',\n\t\tid: 'core.stances.canAttack',\n\t\trun(world, event) {\n\t\t\tif (event.cancelled || event.ordered) return\n\t\t\tconst { attacker, target } = event\n\t\t\tconst def = stanceOf(attacker, stances)\n\t\t\tif (def.acquire === 'any' && def.pursue) return\n\t\t\tconst combat = attacker.get(fighting)\n\t\t\tconst engaged = !!combat && (combat.autoTarget === target.id || combat.lastAttacker === target.id)\n\t\t\tif (def.acquire === 'none') {\n\t\t\t\tevent.cancelled = !(def.fireBack && engaged)\n\t\t\t\treturn\n\t\t\t}\n\t\t\t// only what its attack reaches from where it stands: where the engine would chase, it lets go (the same reach\n\t\t\t// `engage` goes by: a structure's edge a little farther, a swing already begun a little more)\n\t\t\tif (def.acquire === 'near' || (!def.pursue && engaged)) {\n\t\t\t\tconst swinging = !!combat && combat.swing > 0 && combat.swingTarget === target.id\n\t\t\t\tconst reach = rangeAgainst(world, attacker, target) + (target.isStructure ? STRUCTURE_REACH : 0) + (swinging ? SWING_SLACK : 0)\n\t\t\t\tif (edgeDistance(attacker, target) > reach) event.cancelled = true\n\t\t\t}\n\t\t}\n\t})\n\n\t/** A unit that returns nowhere after a fight: it forgets where it stood as the fight ends */\n\tconst idleHook = defineHook({\n\t\thook: 'idle',\n\t\tid: 'core.stances.idle',\n\t\trun(_world, event) {\n\t\t\tconst { entity } = event\n\t\t\tconst combat = entity.get(fighting)\n\t\t\tif (!combat?.guard || combat.autoTarget) return\n\t\t\tif (stanceOf(entity, stances).returnTo === 'none') combat.guard = null\n\t\t}\n\t})\n\n\treturn {\n\t\tid: 'stances',\n\t\toptions,\n\t\tcomponents: [stance],\n\t\tcommands: [stanceCommand],\n\t\thooks: [canAttackHook, idleHook]\n\t}\n}\n"],"mappings":"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"}
package/dist/start.d.ts CHANGED
@@ -6,7 +6,7 @@ import type { World } from './world';
6
6
  *
7
7
  * @beta
8
8
  */
9
- export interface StartCode {
9
+ export interface StartingBaseCode {
10
10
  /** Puts down a base at the start location. Only for players the map places nothing for */
11
11
  spawn(world: World, player: PlayerId, at: Vec2): void;
12
12
  }
@@ -16,7 +16,7 @@ export interface StartCode {
16
16
  *
17
17
  * @beta
18
18
  */
19
- export interface StartData {
19
+ export interface StartingBaseData {
20
20
  /** The unit type put down at the start location: a town hall */
21
21
  hall: string;
22
22
  /** The workers put down beside it, facing the closest gold mine */
@@ -41,31 +41,31 @@ export interface StartData {
41
41
  }
42
42
  /**
43
43
  * What each player gets at the beginning of a game on a map, for players the map places nothing for: as data
44
- * (`StartData`: a hall, workers and what else by unit type, editable in the Data panel) or as code (`StartCode`). What
44
+ * (`StartingBaseData`: a hall, workers and what else by unit type, editable in the Data panel) or as code (`StartingBaseCode`). What
45
45
  * they start with of each resource is in its `ResourceDef`
46
46
  *
47
47
  * @beta
48
48
  */
49
- export type StartDef = StartCode | StartData;
49
+ export type StartingBase = StartingBaseCode | StartingBaseData;
50
50
  /** Whether a start is the data form */
51
- export declare const isStartData: (start: StartDef) => start is StartData;
51
+ export declare const isStartingBaseData: (start: StartingBase) => start is StartingBaseData;
52
52
  /**
53
- * Puts down what a start as data says (`StartData`): the hall at the point, what the race builds on the closest gold
53
+ * Puts down what a start as data says (`StartingBaseData`): the hall at the point, what the race builds on the closest gold
54
54
  * mine (`onMine`) on it, and the workers and the other units in a row on the side of the hall that faces the mine,
55
55
  * facing it. With no mine in reach, the row faces north. A classic melee start; a race's `start` as data does this
56
56
  *
57
57
  * @beta
58
58
  */
59
- export declare function startingBase(world: World, player: PlayerId, at: Vec2, start: StartData): void;
59
+ export declare function placeStartingBase(world: World, player: PlayerId, at: Vec2, start: StartingBaseData): void;
60
60
  /**
61
61
  * Puts down a player's start at a point, whichever form it is in: the code's `spawn`, or the base the data describes
62
62
  * (`startingBase`). Nothing for no start
63
63
  *
64
64
  * @beta
65
65
  */
66
- export declare function spawnStart(world: World, start: StartDef | undefined, player: PlayerId, at: Vec2): void;
67
- /** The unit type ids a start as data names, each with where it is said (`start.hall`, `start.units[1].type`); none for code */
68
- export declare function startIds(start: StartDef | undefined): {
66
+ export declare function spawnStartingBase(world: World, start: StartingBase | undefined, player: PlayerId, at: Vec2): void;
67
+ /** The unit type ids a start as data names, each with where it is said (`start.hall`, `startingBase.units[1].type`); none for code */
68
+ export declare function startIds(start: StartingBase | undefined): {
69
69
  where: string;
70
70
  id: string;
71
71
  }[];
package/dist/start.js ADDED
@@ -0,0 +1,75 @@
1
+ import { exactMath } from "./exactMath.js";
2
+ import { dist } from "./math.js";
3
+ //#region src/start.ts
4
+ /** Whether a start is the data form */
5
+ var isStartingBaseData = (start) => !("spawn" in start);
6
+ /** How far the workers stand from their hall, and the angle between two of them, when the data does not say */
7
+ var DISTANCE = 5;
8
+ var SPREAD = .35;
9
+ /**
10
+ * Puts down what a start as data says (`StartingBaseData`): the hall at the point, what the race builds on the closest gold
11
+ * mine (`onMine`) on it, and the workers and the other units in a row on the side of the hall that faces the mine,
12
+ * facing it. With no mine in reach, the row faces north. A classic melee start; a race's `start` as data does this
13
+ *
14
+ * @beta
15
+ */
16
+ function placeStartingBase(world, player, at, start) {
17
+ const hall = world.spawn(start.hall, player, at);
18
+ let nearest;
19
+ for (const entity of world.entities.values()) {
20
+ if (entity.def.resource?.id !== "gold") continue;
21
+ if (!nearest || dist(entity.pos, hall.pos) < dist(nearest.pos, hall.pos)) nearest = entity;
22
+ }
23
+ const mine = nearest && (dist(nearest.pos, hall.pos) <= 20 || start.onMine) ? nearest : void 0;
24
+ if (mine && start.onMine) world.spawn(start.onMine, player, mine.pos);
25
+ const angle = mine ? exactMath.atan2(mine.pos.x - hall.pos.x, mine.pos.z - hall.pos.z) : 0;
26
+ const types = [];
27
+ for (const { type, count } of [start.workers, ...start.units ?? []]) for (let i = 0; i < count; i++) types.push(type);
28
+ const distance = start.distance ?? DISTANCE;
29
+ const spread = start.spread ?? SPREAD;
30
+ types.forEach((type, i) => {
31
+ const side = (i - (types.length - 1) / 2) * spread;
32
+ world.spawn(type, player, {
33
+ x: hall.pos.x + exactMath.sin(angle + side) * distance,
34
+ z: hall.pos.z + exactMath.cos(angle + side) * distance
35
+ }, { facing: angle });
36
+ });
37
+ }
38
+ /**
39
+ * Puts down a player's start at a point, whichever form it is in: the code's `spawn`, or the base the data describes
40
+ * (`startingBase`). Nothing for no start
41
+ *
42
+ * @beta
43
+ */
44
+ function spawnStartingBase(world, start, player, at) {
45
+ if (!start) return;
46
+ if (isStartingBaseData(start)) placeStartingBase(world, player, at, start);
47
+ else start.spawn(world, player, at);
48
+ }
49
+ /** The unit type ids a start as data names, each with where it is said (`start.hall`, `startingBase.units[1].type`); none for code */
50
+ function startIds(start) {
51
+ if (!start || !isStartingBaseData(start)) return [];
52
+ const out = [
53
+ {
54
+ where: "startingBase.hall",
55
+ id: start.hall
56
+ },
57
+ {
58
+ where: "startingBase.workers.type",
59
+ id: start.workers.type
60
+ },
61
+ ...(start.units ?? []).map((unit, index) => ({
62
+ where: `startingBase.units[${index}].type`,
63
+ id: unit.type
64
+ }))
65
+ ];
66
+ if (start.onMine !== void 0) out.push({
67
+ where: "startingBase.onMine",
68
+ id: start.onMine
69
+ });
70
+ return out;
71
+ }
72
+ //#endregion
73
+ export { isStartingBaseData, placeStartingBase, spawnStartingBase, startIds };
74
+
75
+ //# sourceMappingURL=start.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start.js","names":[],"sources":["../src/start.ts"],"sourcesContent":["import type { Entity, PlayerId } from './entity'\nimport { exactMath } from './exactMath'\nimport { dist, type Vec2 } from './math'\nimport type { World } from './world'\n\n/*\n * What a player starts a map with (campaign plan RC1): a hall and workers put down at their start location, for players\n * the map places nothing for. As data (`StartingBaseData`: the hall, the workers, what else, all by unit type id, which is\n * what a race made in the editor's Data panel has, and what `checkRaces` can check), or as code (`StartingBaseCode`: a\n * function that puts down whatever it likes). `startingBase` is what the data form does, for code to call as well\n */\n\n/**\n * A start in code: puts down a base at the start location, whatever it likes\n *\n * @beta\n */\nexport interface StartingBaseCode {\n\t/** Puts down a base at the start location. Only for players the map places nothing for */\n\tspawn(world: World, player: PlayerId, at: Vec2): void\n}\n\n/**\n * A start as data: a hall at the start location and workers on the side of the closest gold mine, as in a classic melee\n * game (`startingBase` puts it down). Every id is a unit type of the game's (`checkRaces` says where one is not)\n *\n * @beta\n */\nexport interface StartingBaseData {\n\t/** The unit type put down at the start location: a town hall */\n\thall: string\n\t/** The workers put down beside it, facing the closest gold mine */\n\tworkers: { type: string; count: number }\n\t/** What else is put down with the workers, in the same row after them: a race's first fighter */\n\tunits?: { type: string; count: number }[]\n\t/**\n\t * What the race builds on the closest gold mine to gather it, put down there already standing (the undead's cursed\n\t * mine). With it, the closest mine is found at any distance; without, the workers face a mine within 20 cells\n\t */\n\tonMine?: string\n\t/** How far from the hall the workers stand: 5 cells when left out */\n\tdistance?: number\n\t/** The angle between two workers in the row, in radians: 0.35 when left out */\n\tspread?: number\n}\n\n/**\n * What each player gets at the beginning of a game on a map, for players the map places nothing for: as data\n * (`StartingBaseData`: a hall, workers and what else by unit type, editable in the Data panel) or as code (`StartingBaseCode`). What\n * they start with of each resource is in its `ResourceDef`\n *\n * @beta\n */\nexport type StartingBase = StartingBaseCode | StartingBaseData\n\n/** Whether a start is the data form */\nexport const isStartingBaseData = (start: StartingBase): start is StartingBaseData => !('spawn' in start)\n\n/** How far the workers stand from their hall, and the angle between two of them, when the data does not say */\nconst DISTANCE = 5\nconst SPREAD = 0.35\n\n/**\n * Puts down what a start as data says (`StartingBaseData`): the hall at the point, what the race builds on the closest gold\n * mine (`onMine`) on it, and the workers and the other units in a row on the side of the hall that faces the mine,\n * facing it. With no mine in reach, the row faces north. A classic melee start; a race's `start` as data does this\n *\n * @beta\n */\nexport function placeStartingBase(world: World, player: PlayerId, at: Vec2, start: StartingBaseData): void {\n\tconst hall = world.spawn(start.hall, player, at)\n\tlet nearest: Entity | undefined\n\tfor (const entity of world.entities.values()) {\n\t\tif (entity.def.resource?.id !== 'gold') continue\n\t\tif (!nearest || dist(entity.pos, hall.pos) < dist(nearest.pos, hall.pos)) nearest = entity\n\t}\n\t// the workers face a mine within 20 cells; a race that gathers at a building of its own puts that on the closest one at any distance\n\tconst mine = nearest && (dist(nearest.pos, hall.pos) <= 20 || start.onMine) ? nearest : undefined\n\tif (mine && start.onMine) world.spawn(start.onMine, player, mine.pos)\n\tconst angle = mine ? exactMath.atan2(mine.pos.x - hall.pos.x, mine.pos.z - hall.pos.z) : 0\n\tconst types: string[] = []\n\tfor (const { type, count } of [start.workers, ...(start.units ?? [])]) for (let i = 0; i < count; i++) types.push(type)\n\tconst distance = start.distance ?? DISTANCE\n\tconst spread = start.spread ?? SPREAD\n\ttypes.forEach((type, i) => {\n\t\tconst side = (i - (types.length - 1) / 2) * spread\n\t\tworld.spawn(\n\t\t\ttype,\n\t\t\tplayer,\n\t\t\t{ x: hall.pos.x + exactMath.sin(angle + side) * distance, z: hall.pos.z + exactMath.cos(angle + side) * distance },\n\t\t\t{ facing: angle }\n\t\t)\n\t})\n}\n\n/**\n * Puts down a player's start at a point, whichever form it is in: the code's `spawn`, or the base the data describes\n * (`startingBase`). Nothing for no start\n *\n * @beta\n */\nexport function spawnStartingBase(world: World, start: StartingBase | undefined, player: PlayerId, at: Vec2): void {\n\tif (!start) return\n\tif (isStartingBaseData(start)) placeStartingBase(world, player, at, start)\n\telse start.spawn(world, player, at)\n}\n\n/** The unit type ids a start as data names, each with where it is said (`start.hall`, `startingBase.units[1].type`); none for code */\nexport function startIds(start: StartingBase | undefined): { where: string; id: string }[] {\n\tif (!start || !isStartingBaseData(start)) return []\n\tconst out = [\n\t\t{ where: 'startingBase.hall', id: start.hall },\n\t\t{ where: 'startingBase.workers.type', id: start.workers.type },\n\t\t...(start.units ?? []).map((unit, index) => ({ where: `startingBase.units[${index}].type`, id: unit.type }))\n\t]\n\tif (start.onMine !== undefined) out.push({ where: 'startingBase.onMine', id: start.onMine })\n\treturn out\n}\n"],"mappings":";;;;AAwDA,IAAa,sBAAsB,UAAmD,EAAE,WAAW;;AAGnG,IAAM,WAAW;AACjB,IAAM,SAAS;;;;;;;;AASf,SAAgB,kBAAkB,OAAc,QAAkB,IAAU,OAA+B;CAC1G,MAAM,OAAO,MAAM,MAAM,MAAM,MAAM,QAAQ,EAAE;CAC/C,IAAI;CACJ,KAAK,MAAM,UAAU,MAAM,SAAS,OAAO,GAAG;EAC7C,IAAI,OAAO,IAAI,UAAU,OAAO,QAAQ;EACxC,IAAI,CAAC,WAAW,KAAK,OAAO,KAAK,KAAK,GAAG,IAAI,KAAK,QAAQ,KAAK,KAAK,GAAG,GAAG,UAAU;CACrF;CAEA,MAAM,OAAO,YAAY,KAAK,QAAQ,KAAK,KAAK,GAAG,KAAK,MAAM,MAAM,UAAU,UAAU,KAAA;CACxF,IAAI,QAAQ,MAAM,QAAQ,MAAM,MAAM,MAAM,QAAQ,QAAQ,KAAK,GAAG;CACpE,MAAM,QAAQ,OAAO,UAAU,MAAM,KAAK,IAAI,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,IAAI,KAAK,IAAI,CAAC,IAAI;CACzF,MAAM,QAAkB,CAAC;CACzB,KAAK,MAAM,EAAE,MAAM,WAAW,CAAC,MAAM,SAAS,GAAI,MAAM,SAAS,CAAC,CAAE,GAAG,KAAK,IAAI,IAAI,GAAG,IAAI,OAAO,KAAK,MAAM,KAAK,IAAI;CACtH,MAAM,WAAW,MAAM,YAAY;CACnC,MAAM,SAAS,MAAM,UAAU;CAC/B,MAAM,SAAS,MAAM,MAAM;EAC1B,MAAM,QAAQ,KAAK,MAAM,SAAS,KAAK,KAAK;EAC5C,MAAM,MACL,MACA,QACA;GAAE,GAAG,KAAK,IAAI,IAAI,UAAU,IAAI,QAAQ,IAAI,IAAI;GAAU,GAAG,KAAK,IAAI,IAAI,UAAU,IAAI,QAAQ,IAAI,IAAI;EAAS,GACjH,EAAE,QAAQ,MAAM,CACjB;CACD,CAAC;AACF;;;;;;;AAQA,SAAgB,kBAAkB,OAAc,OAAiC,QAAkB,IAAgB;CAClH,IAAI,CAAC,OAAO;CACZ,IAAI,mBAAmB,KAAK,GAAG,kBAAkB,OAAO,QAAQ,IAAI,KAAK;MACpE,MAAM,MAAM,OAAO,QAAQ,EAAE;AACnC;;AAGA,SAAgB,SAAS,OAAkE;CAC1F,IAAI,CAAC,SAAS,CAAC,mBAAmB,KAAK,GAAG,OAAO,CAAC;CAClD,MAAM,MAAM;EACX;GAAE,OAAO;GAAqB,IAAI,MAAM;EAAK;EAC7C;GAAE,OAAO;GAA6B,IAAI,MAAM,QAAQ;EAAK;EAC7D,IAAI,MAAM,SAAS,CAAC,EAAA,CAAG,KAAK,MAAM,WAAW;GAAE,OAAO,sBAAsB,MAAM;GAAS,IAAI,KAAK;EAAK,EAAE;CAC5G;CACA,IAAI,MAAM,WAAW,KAAA,GAAW,IAAI,KAAK;EAAE,OAAO;EAAuB,IAAI,MAAM;CAAO,CAAC;CAC3F,OAAO;AACR"}