@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 @@
1
+ {"version":3,"file":"build.js","names":[],"sources":["../../../src/ai/plans/build.ts"],"sourcesContent":["import { baseStats, type Cost, type UnitTypeDef } from '#engine/defs'\nimport { queueOf, upgradeOf } from '#engine/systems/productionQueue'\nimport { builtSoFar } from '#engine/systems/construction'\nimport { snapshotOf } from '#engine/components'\nimport { distSq, type Vec2 } from '#engine/math'\nimport { gathering } from '#engine/orders/harvest'\nimport type { EntityState } from '#engine/session/protocol'\nimport { type Brain } from '#engine/ai/brain'\nimport { type AiModule, type AiModuleDef, defineModule } from '#engine/ai/module'\nimport { type AiCondition, type AiConditionData, evaluate } from '#engine/ai/rules'\nimport { DEFAULT_PLACEMENT, type PlacementName, placementNamed, type PlacementStrategy, type PlacementTable, type SiteRequest } from './placement'\nimport { makerOf, techPath, type TechPath, type TechStep, techTrouble } from './tech'\nimport { an, where } from '../geometry'\n\n/*\n * The build plan (AI plan, B3): what a computer player builds, and how it gets there. The old melee player had a fixed\n * ladder (hall, farm, barracks, altar, …) and no way to say \"I want gryphons\" and have the computer work out that\n * gryphons need an aviary, which needs a keep and a lumber mill. The plan takes **wants** instead: \"two of this type,\n * near there, when that holds, this important\" (`Want`), from the build order, from the production plan (a unit it\n * wants that nothing of its trains yet), from the economy (another hall, a tower), from goals and from rules. Each\n * think it works out, for every want it has not met, the **steps** to it through the tech tree (`techPath`: what to\n * build, what to turn into what, what to train), takes the wants most important first, and for each acts on the first\n * step it can: finds a spot (`placement.ts`), a builder, pays out of the **purse** (`purse.ts`, the one ledger) and\n * sends the order. What it cannot pay for, it **saves** for: the most important want it cannot afford holds the money\n * in the purse, so that nothing cheaper spends it (as a person saves for a hall and lets the footmen wait). A want\n * with a place where no spot is known (a hall by a mine nobody has looked at) sends a worker to look first: the\n * settler. What is on its way (a builder sent, a site half built, a morph queued) counts as had, so the same want is\n * not acted on twice; a building lost makes a standing want short again, and it is built anew (`rebuild`).\n *\n * The plan is the brain's (`ai.plans.build`): every module adds wants to the same one, and the report shows each want\n * with what it waits for and what it holds. The `build()` module runs it in its place among a brain's modules; the\n * melee player runs it in its own\n */\n\n/**\n * Something a computer player wants built or trained, as plain data (a map's file, a rule's action, a seat's\n * options): a type, how many, under what condition, where, how important. `WantData` is what a save keeps; `Want`\n * is the same with the function forms\n *\n * @beta\n */\nexport interface WantData {\n\t/** Its name: what the memory, the report and `drop` know it by. Made up when left out */\n\tid?: string\n\t/** The unit type wanted: a building, or a unit (whose buildings the plan puts up; the production plan trains it) */\n\ttype: string\n\t/** How many of it to have, those on their way counted: 1 when left out */\n\tcount?: number\n\t/** Only while this holds (`AiConditionData`, as a rule's): a tower after the first attack, a second hall past five minutes */\n\twhen?: AiConditionData\n\t/** Where: a point, or the name of an entity the map or rules named. Home when left out */\n\tnear?: Vec2 | string\n\t/** How far from there at the most: 22 when left out */\n\twithin?: number\n\t/** How its spot is chosen (`PlacementName`): what the type declares, the brain's table, or the role's default when left out */\n\tplacement?: PlacementName\n\t/** Wants are taken most important first, and the most important one that cannot be paid for saves up: 0 when left out */\n\tpriority?: number\n\t/** Money to have left over after paying for it: a luxury that waits for gold to spare. 0 when left out */\n\tspare?: number\n\t/**\n\t * Whether the want stands: kept once met, and short again when what it made is lost, so that it is built anew.\n\t * Wants of a brain's or a seat's options stand; one added as the game goes is dropped once met, unless it says so\n\t */\n\tkeep?: boolean\n\t/** For a standing want: whether a building lost is built again (the plan's `rebuild` when left out) */\n\trebuild?: boolean\n\t/** Seconds without a spot for it before a want that does not stand is given up: the plan's `siteTimeout` when left out */\n\tsiteTimeout?: number\n\t/** Who wants it, for the report: `order`, `production`, `economy`, a goal's or a rule's id */\n\tby?: string\n}\n\n/**\n * A want with the function forms: how many as a function of the brain, a condition as code, a place found each think,\n * a placement strategy of the game's own (`ai.plans.want`, `BuildPlanOptions.wants`)\n *\n * @beta\n */\nexport interface Want extends Omit<WantData, 'count' | 'when' | 'near' | 'placement'> {\n\t/** How many of the type the want asks for, or a function of the brain that gives it; 1 when left out */\n\tcount?: number | ((ai: Brain) => number)\n\t/** A condition the want holds only while true; when it is false the want is not pursued */\n\twhen?: AiCondition\n\t/** Where to build: a point, the name of an entity or region the map gave, or a function of the brain that finds one each think */\n\tnear?: Vec2 | string | ((ai: Brain) => Vec2 | undefined)\n\t/** How the spot is chosen: a strategy by name or a function; the build plan's table or the type's own when left out */\n\tplacement?: PlacementName | PlacementStrategy\n}\n\n/**\n * How the build plan goes about it (`BrainDef.plans.build`, the `build()` module; the data of it in `AiOptions`)\n *\n * @beta\n */\nexport interface BuildPlanOptions {\n\t/** Standing wants: what the brain always has, built anew when lost */\n\twants?: Want[]\n\t/** How each type's spot is chosen, by type id or by role: a name or a function. What a type declares (`UnitTypeDef.ai.placement`) goes over it */\n\tplacement?: PlacementTable\n\t/** Whether a building lost is built again, for standing wants that do not say: yes when left out */\n\trebuild?: boolean\n\t/** Whether a worker is sent to mend a damaged building when no enemy reaches it: yes when left out */\n\trepair?: boolean\n\t/** Seconds without a spot before a want that does not stand is given up: 60 when left out */\n\tsiteTimeout?: number\n\t/** How far from home a building goes at the most, where a want does not say: 22 when left out */\n\twithin?: number\n}\n\n/** What the plan remembers of a want between thinks */\ninterface WantMemory {\n\t/** The tick it was added at */\n\tsince: number\n\t/** Its place among the wants: among equals in priority, the first added goes first. Kept, so a loaded game ranks alike */\n\torder: number\n\t/** How many of its type the plan started for it */\n\tmade: number\n\t/** A standing want met once and not to be built anew */\n\tsatisfied?: true\n\t/** The tick since which no spot was found for it */\n\tnoSite?: number\n\t/** The worker sent to look at the ground where it goes */\n\tsettler?: number\n}\n\n/**\n * What the build plan remembers between thinks, for a save: each want's memory, and the wants added as the game went\n * that are plain data (a rule's), to have them again\n *\n * @beta\n */\nexport interface BuildPlanMemory {\n\t/** The version of the memory's format: 1 so far */\n\tv: 1\n\t/** Each want by id with its memory, and its data where the want is plain data (a rule's) */\n\twants: { id: string; memory: WantMemory; data?: WantData }[]\n\t/** The order the next want added gets: kept, so that a loaded game ranks the wants it adds as the game saved did */\n\tadded?: number\n\t/** The want saving up as of the last think (`savingFor`): what a loaded game reads until it thinks again */\n\tsaving?: string\n}\n\n/**\n * One want as the report shows it: what it is, how far along, what it waits for (`status`), the steps to it, what it\n * holds in the purse\n *\n * @beta\n */\nexport interface WantReport {\n\t/** The want's id, which the plan knows it by */\n\tid: string\n\t/** The id of the unit type the want is for */\n\ttype: string\n\t/** How many of the type it asks for */\n\tcount: number\n\t/** How many of the type the player has now */\n\thave: number\n\t/** How many a worker is on its way to build or the queue is making */\n\tonItsWay: number\n\t/** How important the want is; a higher one is served first and holds its money in the purse first */\n\tpriority: number\n\t/** Who wants it: `order`, `production`, `economy`, a goal's or a rule's id */\n\tby?: string\n\t/** Whether it is a standing want, built anew when lost */\n\tkeep?: true\n\t/** What it waits for or how far it is, in words */\n\tstatus: string\n\t/** The steps to the type that are still to take, in words */\n\tsteps: string[]\n\t/** What the want holds in the purse */\n\tholds?: Cost\n}\n\n/**\n * The build plan as the report shows it: its wants, and which one saves up\n *\n * @beta\n */\nexport interface BuildPlanReport {\n\t/** Every want of the plan */\n\twants: WantReport[]\n\t/** The id of the want that saves up money now, if one does */\n\tsaving?: string\n}\n\n/** A want as the plan keeps it: its definition, its memory, and what the last think made of it */\ninterface Live {\n\tid: string\n\tdef: Want\n\tmemory: WantMemory\n\tcount: number\n\thave: number\n\tonItsWay: number\n\tstatus: string\n\tsteps: string[]\n\tholds?: Cost\n}\n\n/** How far from a mine, towards home, a settler is sent to see where the hall by it would go */\nconst SETTLE_FROM = 10\nconst WITHIN = 22\nconst SITE_TIMEOUT = 60\n/** Under this part of its health a building is mended */\nconst MEND_UNDER = 0.9\n\n/** A step in words, for the report: `build lumbermill`, `townhall → keep`, `train peasant` */\nconst stepWords = (step: Pick<TechStep, 'type' | 'how' | 'from'>) =>\n\tstep.how === 'morph' ? `${step.from} → ${step.type}` : `${step.how} ${step.type}`\n\n/** Whether a want is plain data all through: what a save can keep */\nconst isData = (def: Want): def is Want & WantData =>\n\ttypeof def.count !== 'function' && typeof def.when !== 'function' && typeof def.near !== 'function' && typeof def.placement !== 'function'\n\n/**\n * The brain's build plan (`ai.plans.build`): its wants, the steps to each, the spots, the builders, the purse. Add a\n * want with `want`, read where each stands with `report`, and let `think` act on them once a think\n *\n * @beta\n */\nexport class BuildPlan {\n\tprivate options: BuildPlanOptions = {}\n\tprivate readonly wants = new Map<string, Live>()\n\t/** Memory of wants a save remembers that no module has asked for yet: given to them as they come */\n\tprivate pending: Record<string, WantMemory> = {}\n\tprivate added = 0\n\tprivate thoughtAt = -1\n\tprivate paths = new Map<string, TechPath>()\n\t/** What is on its way, by type, worked out once a think: asked for every want and every step */\n\tprivate onWay = new Map<string, number>()\n\t/** The builders sent this think: not sent twice */\n\tprivate sent = new Set<number>()\n\t/** The want saving up this think, if one is */\n\tprivate saving: string | undefined\n\tprivate warned = new Set<string>()\n\n\tconstructor(\n\t\t/** The brain it plans for */\n\t\treadonly ai: Brain,\n\t\toptions: BuildPlanOptions = {}\n\t) {\n\t\tthis.configure(options)\n\t}\n\n\t/** Takes options in, over what it had: the standing wants added, the table of placements merged, the flags replaced */\n\tconfigure(options: BuildPlanOptions): void {\n\t\tthis.options = {\n\t\t\t...this.options,\n\t\t\t...options,\n\t\t\tplacement: { ...this.options.placement, ...options.placement }\n\t\t}\n\t\tfor (const def of options.wants ?? []) this.want({ ...def, keep: true })\n\t}\n\n\t/** The plan's options as they stand */\n\tget settings(): Readonly<BuildPlanOptions> {\n\t\treturn this.options\n\t}\n\n\t/**\n\t * Adds a want, or replaces one of the same id (its memory kept): what the plan works towards from now. Gives back\n\t * its id. A want with no `keep` is dropped once met\n\t */\n\twant(def: Want): string {\n\t\tif (!def.type) throw new Error('A want needs a type')\n\t\tconst id = def.id ?? `${def.type}#${++this.added}`\n\t\tconst live = this.wants.get(id)\n\t\tif (live) {\n\t\t\tlive.def = { ...def, id }\n\t\t\treturn id\n\t\t}\n\t\tconst memory = this.pending[id] ?? { since: this.ai.tick, order: this.added, made: 0 }\n\t\tdelete this.pending[id]\n\t\t// past every order given: a want remembered by a save comes back with its own, and moves nothing on\n\t\tthis.added = Math.max(this.added, memory.order + 1)\n\t\tthis.wants.set(id, { id, def: { ...def, id }, memory, count: 0, have: 0, onItsWay: 0, status: 'new', steps: [] })\n\t\treturn id\n\t}\n\n\t/** Takes a want out, and what a save remembered of it: whether there was one */\n\tdrop(id: string): boolean {\n\t\tconst remembered = id in this.pending\n\t\tdelete this.pending[id]\n\t\treturn this.wants.delete(id) || remembered\n\t}\n\n\t/** A want by id */\n\tget(id: string): Want | undefined {\n\t\treturn this.wants.get(id)?.def\n\t}\n\n\t/** The wants, in the order added */\n\tlist(): Want[] {\n\t\treturn this.ordered().map((live) => live.def)\n\t}\n\n\t/** Where a want stands, in words, as of the last think: `building a barracks at (40, 60)`, `saving for a town hall` */\n\tstatus(id: string): string | undefined {\n\t\treturn this.wants.get(id)?.status\n\t}\n\n\t/** The want saving up, as of the last think: the most important one it could not pay for */\n\tget savingFor(): string | undefined {\n\t\treturn this.saving\n\t}\n\n\t/** How many of a type the player has, those under construction and those that count as it included */\n\thave(type: string): number {\n\t\treturn this.ai.view.mine.ofType(type).length\n\t}\n\n\t/** How many of a type are on their way beyond those that stand: builders sent to build one, buildings turning into one, units queued */\n\tonItsWay(type: string): number {\n\t\tconst known = this.onWay.get(type)\n\t\tif (known !== undefined) return known\n\t\tlet count = 0\n\t\tfor (const entity of this.ai.view.mine) {\n\t\t\tconst own = entity.own\n\t\t\tif (!own) continue\n\t\t\tif (own.order === 'build' && own.build === type) count++\n\t\t\telse if (upgradeOf(entity)?.to === type) count++\n\t\t\tfor (const item of queueOf(entity)) if ((item.kind === 'morph' || item.kind === 'unit') && item.id === type) count++\n\t\t}\n\t\tthis.onWay.set(type, count)\n\t\treturn count\n\t}\n\n\t/** Whether a type is had or on its way: standing (finished or not), or a builder or a morph on the way to it */\n\tprivate had(type: string): boolean {\n\t\treturn this.ai.view.me.tech.includes(type) || this.have(type) > 0 || this.onItsWay(type) > 0\n\t}\n\n\t/** The steps to being able to make a type (`techPath`), worked out once a think */\n\tpath(type: string): TechPath {\n\t\tlet found = this.paths.get(type)\n\t\tif (!found) this.paths.set(type, (found = techPath(this.ai.view, type, (step) => this.onItsWay(step) > 0)))\n\t\treturn found\n\t}\n\n\t/** The first step towards a type not had yet, the type's own last: none when nothing is to be done, or the path is blocked */\n\tnext(type: string): TechStep | undefined {\n\t\tconst path = this.path(type)\n\t\tif (techTrouble(path)) return undefined\n\t\tfor (const step of path.steps) if (!this.had(step.type)) return step\n\t\tconst maker = makerOf(this.ai.view, type)\n\t\treturn maker && { type, ...maker, for: type }\n\t}\n\n\t/**\n\t * The think, once a think: every want measured against what stands and is on its way (met ones dropped, or kept\n\t * standing), those whose condition holds taken most important first, each advanced by the first step it can take:\n\t * built, turned into, or saved for. Then the mending, where the plan is to\n\t */\n\tthink(): void {\n\t\tconst { ai } = this\n\t\tif (this.thoughtAt === ai.tick) return\n\t\tthis.thoughtAt = ai.tick\n\t\tthis.paths.clear()\n\t\tthis.onWay.clear()\n\t\tthis.sent.clear()\n\t\tthis.saving = undefined\n\t\t// the game's build order, where there is one: its next item is a want before all others, and the only one\n\t\t// advanced while the order is followed\n\t\tconst following = ai.plans.follow() !== undefined\n\t\tconst active: Live[] = []\n\t\tfor (const [id, live] of this.wants) {\n\t\t\tconst { def } = live\n\t\t\tlive.steps = []\n\t\t\tlive.holds = undefined\n\t\t\tlive.count = typeof def.count === 'function' ? def.count(ai) : (def.count ?? 1)\n\t\t\tlive.have = this.have(def.type)\n\t\t\tlive.onItsWay = this.onItsWay(def.type)\n\t\t\tif (live.have + live.onItsWay >= live.count) {\n\t\t\t\tlive.status = 'met'\n\t\t\t\tif (!def.keep) {\n\t\t\t\t\tthis.wants.delete(id)\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tif (!(def.rebuild ?? this.options.rebuild ?? true)) live.memory.satisfied = true\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif (live.memory.satisfied) {\n\t\t\t\tlive.status = 'met once, not built anew'\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif (def.when && !evaluate(def.when, ai)) {\n\t\t\t\tlive.status = 'waits for its condition'\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif (following && id !== 'order') {\n\t\t\t\tlive.status = 'waits for the build order'\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tactive.push(live)\n\t\t}\n\t\tactive.sort((a, b) => (b.def.priority ?? 0) - (a.def.priority ?? 0) || a.memory.order - b.memory.order)\n\t\tfor (const live of active) this.advance(live)\n\t\tif (this.options.repair ?? true) this.mend()\n\t}\n\n\t/** One want, one think: the steps to it, and the first one it can take */\n\tprivate advance(live: Live): void {\n\t\tconst { ai } = this\n\t\tconst { def } = live\n\t\tconst path = this.path(def.type)\n\t\tconst trouble = techTrouble(path)\n\t\tif (trouble) {\n\t\t\tlive.status = `blocked: ${trouble}`\n\t\t\tif (!this.warned.has(def.type)) {\n\t\t\t\tthis.warned.add(def.type)\n\t\t\t\tai.log.warn('ai', `the build plan cannot get to ${def.type}: ${trouble}`, { want: live.id })\n\t\t\t}\n\t\t\treturn\n\t\t}\n\t\tconst own = makerOf(ai.view, def.type)\n\t\tconst steps: TechStep[] = [...path.steps, ...(own ? [{ type: def.type, ...own, for: def.type }] : [])]\n\t\tlive.steps = steps.map(stepWords)\n\t\tlet status: string | undefined\n\t\tfor (const step of steps) {\n\t\t\tconst last = step.type === def.type\n\t\t\t// a prerequisite had, or on its way, is waited for by what comes after it\n\t\t\tif (!last && this.had(step.type)) {\n\t\t\t\tif (!ai.view.me.tech.includes(step.type)) status ??= `waits for ${an(step.type)} to finish`\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tconst outcome = this.act(step, live, last)\n\t\t\tstatus ??= outcome\n\t\t\t// the step was taken, or could not be: what depends on it waits either way; what does not may still go\n\t\t}\n\t\tlive.status = status ?? 'nothing to do'\n\t}\n\n\t/** Takes a step for a want, where it can: what came of it, in words, for the status */\n\tprivate act(step: TechStep, live: Live, last: boolean): string {\n\t\tconst { ai } = this\n\t\tconst { view, registry } = ai\n\t\tconst { def } = live\n\t\tconst type = registry.unit(step.type)\n\t\tswitch (step.how) {\n\t\t\tcase 'train':\n\t\t\t\treturn last ? `to be trained` : `needs ${an(step.type)}`\n\t\t\tcase 'morph': {\n\t\t\t\tconst from = view.mine\n\t\t\t\t\t.where((entity) => entity.type === step.from && builtSoFar(entity) === undefined && !upgradeOf(entity)?.to && !queueOf(entity).length)\n\t\t\t\t\t.first()\n\t\t\t\tif (!from) return `waits for ${an(step.from)} with nothing to do, to turn into ${an(step.type)}`\n\t\t\t\tif (!view.has(type.requires)) return `waits for what ${an(step.type)} requires`\n\t\t\t\tif (!this.pay(live, type.cost)) return this.short(live, step.type)\n\t\t\t\tai.send({ type: 'upgradeBuilding', building: from.id, into: step.type })\n\t\t\t\tif (last) live.memory.made++\n\t\t\t\tai.decide(`turns its ${step.from} into ${an(step.type)}${def.by ? `, for ${def.by}` : ''}`, { kind: 'build' })\n\t\t\t\treturn `turning ${an(step.from)} into ${an(step.type)}`\n\t\t\t}\n\t\t\tcase 'build': {\n\t\t\t\tif (!view.has(type.requires)) return `waits for what ${an(step.type)} requires`\n\t\t\t\t// a place nobody has looked at: a worker goes to see it now, money or no money, so that the ground is known\n\t\t\t\t// by the time the money is there (the want still saves meanwhile)\n\t\t\t\tconst place = last ? this.placeOf(live) : undefined\n\t\t\t\tif (place && ai.def.knowledge !== false && !ai.knowledge.map.explored(this.settlePoint(place))) {\n\t\t\t\t\tthis.sendSettler(live, place)\n\t\t\t\t\tthis.canPay(live, type.cost)\n\t\t\t\t\treturn `no ground known at ${where(place)}, a worker sent to look`\n\t\t\t\t}\n\t\t\t\t// the money before the spot: looking for one asks the ground many times, and a step that cannot be paid for need not\n\t\t\t\tif (!this.canPay(live, type.cost)) return this.short(live, step.type)\n\t\t\t\tconst site = this.siteFor(type, last ? live : undefined)\n\t\t\t\tif (!site) {\n\t\t\t\t\tif (last && this.noSite(live)) return `gave up: no spot for ${an(step.type)}`\n\t\t\t\t\treturn `no spot for ${an(step.type)}${last && live.memory.settler ? ', a worker sent to look' : ''}`\n\t\t\t\t}\n\t\t\t\tlive.memory.noSite = undefined\n\t\t\t\tconst builder = this.builderFor(type, site)\n\t\t\t\tif (!builder) return `no builder for ${an(step.type)}`\n\t\t\t\tthis.ai.purse.spend(type.cost, def.priority ?? 0)\n\t\t\t\tthis.sent.add(builder.id)\n\t\t\t\tai.send({ type: 'order', entities: [builder.id], order: { type: 'build', unitType: step.type, point: site } })\n\t\t\t\tif (last) live.memory.made++\n\t\t\t\tai.decide(`builds ${an(step.type)} at ${where(site)}${def.by ? `, for ${def.by}` : ''}${last ? '' : `, on the way to ${def.type}`}`, {\n\t\t\t\t\tkind: 'build'\n\t\t\t\t})\n\t\t\t\treturn `building ${an(step.type)} at ${where(site)}`\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Pays for a step out of the purse, with the want's `spare` left over, as important as the want is (what less\n\t * important wants and modules hold is its to spend); where it cannot, the most important want that could not pay\n\t * holds the money (one at a time), and what is less important waits\n\t */\n\tprivate pay(live: Live, cost: Cost | undefined): boolean {\n\t\tif (!this.canPay(live, cost)) return false\n\t\tthis.ai.purse.spend(cost, live.def.priority ?? 0)\n\t\treturn true\n\t}\n\n\t/** Whether a want can pay for a step now (nothing spent); where it cannot, it may hold the money (`pay`) */\n\tprivate canPay(live: Live, cost: Cost | undefined): boolean {\n\t\tconst { purse } = this.ai\n\t\tconst priority = live.def.priority ?? 0\n\t\tif (purse.affords(cost, live.def.spare ?? 0, priority)) return true\n\t\t// a luxury (one with money to spare asked) never saves: it buys when there is spare, and that is all\n\t\tif (this.saving === undefined && cost && !live.def.spare) {\n\t\t\tthis.saving = live.id\n\t\t\tpurse.reserve(live.id, cost, priority)\n\t\t\tlive.holds = { ...cost }\n\t\t}\n\t\treturn false\n\t}\n\n\t/** A step not paid for, in words: the want holds the money (saving), waits for money to spare (a luxury), or waits for the money */\n\tprivate short(live: Live, type: string): string {\n\t\tif (live.holds) return `saving for ${an(type)}`\n\t\tif (live.def.spare) return `waits for ${live.def.spare} ${this.ai.purse.money} to spare for ${an(type)}`\n\t\treturn `waits for the money for ${an(type)}`\n\t}\n\n\t/** No spot found this think: for a want that does not stand, given up after `siteTimeout` seconds, and said */\n\tprivate noSite(live: Live): boolean {\n\t\tconst { ai } = this\n\t\tlive.memory.noSite ??= ai.tick\n\t\tconst to = this.placeOf(live)\n\t\tif (to) this.sendSettler(live, to)\n\t\tif (live.def.keep) return false\n\t\tconst limit = (live.def.siteTimeout ?? this.options.siteTimeout ?? SITE_TIMEOUT) * ai.session.tickRate\n\t\tif (ai.tick - live.memory.noSite < limit) return false\n\t\tthis.wants.delete(live.id)\n\t\tai.decide(`gives up on ${an(live.def.type)}: no spot for it in ${Math.round(limit / ai.session.tickRate)} s`, { kind: 'build' })\n\t\treturn true\n\t}\n\n\t/** Where a want says it goes, as a point: a point, a named entity it knows of, or what its function gives. Nothing for home */\n\tprivate placeOf(live: Live): Vec2 | undefined {\n\t\tconst { near } = live.def\n\t\tif (near === undefined) return undefined\n\t\tif (typeof near === 'function') return near(this.ai)\n\t\tif (typeof near === 'string') {\n\t\t\tconst named = this.ai.view.named(near)\n\t\t\treturn named ? { x: named.x, z: named.z } : undefined\n\t\t}\n\t\treturn near\n\t}\n\n\t/** A spot for a type: where the want says, no further than it says, by its strategy; near home for a step on the way */\n\tprivate siteFor(type: UnitTypeDef, live: Live | undefined): Vec2 | undefined {\n\t\tconst { view } = this.ai\n\t\tconst near = (live && this.placeOf(live)) ?? view.home() ?? view.mine.where((_, def) => !!def.builds?.includes(type.id)).first()\n\t\tif (!near) return undefined\n\t\treturn this.site(type, { near: { x: near.x, z: near.z }, within: live?.def.within ?? this.options.within ?? WITHIN }, live?.def.placement)\n\t}\n\n\t/**\n\t * A spot for a type near a place, by a strategy: the one given, else what the type declares (`UnitTypeDef.ai.placement`),\n\t * the plan's table by type then by role, the role's default, the rings around the place. What is built on a\n\t * deposit goes on one whatever the name\n\t */\n\tsite(\n\t\ttype: UnitTypeDef,\n\t\trequest: Omit<SiteRequest, 'ordinal'> & { ordinal?: number },\n\t\tplacement?: PlacementName | PlacementStrategy\n\t): Vec2 | undefined {\n\t\tconst strategy = this.strategyFor(type, placement)\n\t\treturn strategy(this.ai, type, { ...request, ordinal: request.ordinal ?? this.have(type.id) + this.onItsWay(type.id) })\n\t}\n\n\tprivate strategyFor(type: UnitTypeDef, placement?: PlacementName | PlacementStrategy): PlacementStrategy {\n\t\tif (typeof placement === 'function') return placement\n\t\tif (type.builtOn !== undefined) return placementNamed('byResource')\n\t\tconst table = this.options.placement ?? {}\n\t\tconst roles = this.ai.view.roles.of(type.id)\n\t\tconst chosen: PlacementName | PlacementStrategy | undefined =\n\t\t\tplacement ??\n\t\t\ttype.ai?.placement ??\n\t\t\ttable[type.id] ??\n\t\t\troles.map((role) => table[role]).find((each) => each !== undefined) ??\n\t\t\troles.map((role) => DEFAULT_PLACEMENT[role]).find((each) => each !== undefined)\n\t\tif (typeof chosen === 'function') return chosen\n\t\treturn placementNamed(chosen ?? 'nearHome')\n\t}\n\n\t/** The workers sent to look at the ground somewhere, by any want: not builders while they go */\n\tprivate settlers(): Set<number> {\n\t\tconst ids = new Set<number>()\n\t\tfor (const live of this.wants.values()) {\n\t\t\tconst settler = this.ai.view.byId(live.memory.settler)\n\t\t\tif (settler?.own?.order === 'move') ids.add(settler.id)\n\t\t}\n\t\treturn ids\n\t}\n\n\t/**\n\t * Who builds a type at a spot: of the player's units that build it, those not hidden, not building, not sent this\n\t * think, not off to look at ground and not in a squad or held by a rule; idle first, then whoever carries the least,\n\t * then the nearest\n\t */\n\tbuilderFor(type: UnitTypeDef, site: Vec2): EntityState | undefined {\n\t\tconst settlers = this.settlers()\n\t\tconst builders = this.ai.view.mine\n\t\t\t.where(\n\t\t\t\t(entity, def) =>\n\t\t\t\t\t!!def.builds?.includes(type.id) &&\n\t\t\t\t\t!!entity.own &&\n\t\t\t\t\t!entity.own.hidden &&\n\t\t\t\t\tentity.own.order !== 'build' &&\n\t\t\t\t\tentity.own.order !== 'repair' &&\n\t\t\t\t\t!this.sent.has(entity.id) &&\n\t\t\t\t\t!settlers.has(entity.id) &&\n\t\t\t\t\t// a unit a squad or a rule has is theirs to move (B1's one order of who may move a unit), not the plan's\n\t\t\t\t\t!this.ai.goals.ruled(entity.id) &&\n\t\t\t\t\t!this.ai.squads.squadOf(entity)\n\t\t\t)\n\t\t\t.items.slice()\n\t\tbuilders.sort(\n\t\t\t(a, b) =>\n\t\t\t\tNumber(!!a.own?.order) - Number(!!b.own?.order) ||\n\t\t\t\t(snapshotOf(a, gathering)?.carrying ?? 0) - (snapshotOf(b, gathering)?.carrying ?? 0) ||\n\t\t\t\tdistSq(a, site) - distSq(b, site) ||\n\t\t\t\ta.id - b.id\n\t\t)\n\t\treturn builders[0]\n\t}\n\n\t/** Where a settler stands to see a place: on its near side, towards home, so that it sees where the building would stand and not the mine alone */\n\tprivate settlePoint(to: Vec2): Vec2 {\n\t\tconst home = this.ai.view.home()\n\t\tconst away = home ? Math.sqrt(distSq(home, to)) : 0\n\t\treturn home && away > SETTLE_FROM\n\t\t\t? { x: to.x + ((home.x - to.x) / away) * SETTLE_FROM, z: to.z + ((home.z - to.z) / away) * SETTLE_FROM }\n\t\t\t: { x: to.x, z: to.z }\n\t}\n\n\t/**\n\t * A worker sent to where a want goes, to see the ground: one at a time for the want, sent again if it was taken off\n\t * it. To the near side of the place, towards home (`settlePoint`)\n\t */\n\tprivate sendSettler(live: Live, to: Vec2): void {\n\t\tconst { ai } = this\n\t\tconst { view } = ai\n\t\tconst settling = view.byId(live.memory.settler)\n\t\tif (settling?.owner === ai.playerId && settling.own?.order === 'move') return\n\t\tconst type = ai.registry.unit(live.def.type)\n\t\tconst workers = view.mine.where(\n\t\t\t(entity, def) => !!def.builds?.includes(type.id) && !!entity.own && !entity.own.hidden && !snapshotOf(entity, gathering)?.carrying\n\t\t)\n\t\tconst settler = workers.nearest(to)\n\t\tif (!settler) return\n\t\tlive.memory.settler = settler.id\n\t\tai.send({ type: 'order', entities: [settler.id], order: { type: 'move', point: this.settlePoint(to) } })\n\t\tai.decide(`sends a worker to see the ground at ${where(to)}, for ${an(live.def.type)}`, { kind: 'build' })\n\t}\n\n\t/**\n\t * Builds a type now, outside any want: a spot near a place (home when left out), a builder, the purse. What a\n\t * module does for a one-off (the melee player's building on a mine). Whether it was sent\n\t */\n\tbuild(\n\t\ttype: UnitTypeDef | string,\n\t\toptions: { near?: Vec2; within?: number; placement?: PlacementName | PlacementStrategy; spare?: number; by?: string } = {}\n\t): boolean {\n\t\tconst { ai } = this\n\t\tconst { view, purse } = ai\n\t\tconst def = typeof type === 'string' ? ai.registry.unit(type) : type\n\t\tif (!view.has(def.requires) || !purse.affords(def.cost, options.spare ?? 0)) return false\n\t\tconst near = options.near ?? view.home() ?? view.mine.where((_, each) => !!each.builds?.includes(def.id)).first()\n\t\tif (!near) return false\n\t\tconst site = this.site(def, { near: { x: near.x, z: near.z }, within: options.within ?? this.options.within ?? WITHIN }, options.placement)\n\t\tif (!site) return false\n\t\tconst builder = this.builderFor(def, site)\n\t\tif (!builder || !purse.spend(def.cost)) return false\n\t\tthis.sent.add(builder.id)\n\t\tai.send({ type: 'order', entities: [builder.id], order: { type: 'build', unitType: def.id, point: site } })\n\t\tai.decide(`builds ${an(def.id)} at ${where(site)}${options.by ? `, for ${options.by}` : ''}`, { kind: 'build' })\n\t\treturn true\n\t}\n\n\t/**\n\t * Mends: a worker sent to a damaged building of the player's that no enemy strength reaches, one a think, when\n\t * the purse has what the mending will cost (`RuleSettings.economy.repairCost` of what is missing). Not one being mended already\n\t */\n\tprivate mend(): void {\n\t\tconst { ai } = this\n\t\tconst { view, purse, registry } = ai\n\t\tconst share = registry.settings.economy.repairCost\n\t\tfor (const building of view.mine.buildings().finished()) {\n\t\t\tconst def = view.def(building)\n\t\t\tconst maxHp = building.maxHealth ?? baseStats(def, registry).health\n\t\t\tif (!(building.health < maxHp * MEND_UNDER) || !def.cost) continue\n\t\t\tif (ai.threat.at(building).enemy > 0) continue\n\t\t\tconst menders = view.mine.where((entity, each) => !!each.builds?.length && entity.own?.order === 'repair' && distSq(entity, building) < 36)\n\t\t\tif (menders.length) continue\n\t\t\tconst missing = 1 - building.health / maxHp\n\t\t\tconst price: Cost = {}\n\t\t\tfor (const kind in def.cost) price[kind] = Math.ceil(def.cost[kind] * share * missing)\n\t\t\tif (!purse.affords(price)) continue\n\t\t\tconst worker = this.builderFor(def, building)\n\t\t\tif (!worker || !worker.own || worker.own.order === 'build') continue\n\t\t\tpurse.spend(price)\n\t\t\tthis.sent.add(worker.id)\n\t\t\tai.send({ type: 'order', entities: [worker.id], order: { type: 'repair', target: building.id } })\n\t\t\tai.decide(`mends its ${def.id} at ${where(building)}: ${Math.round(missing * 100)}% gone, nobody near it`, { kind: 'build' })\n\t\t\treturn\n\t\t}\n\t}\n\n\t/** The wants in the order they were added: what the report and a save list them in, the same in a loaded game */\n\tprivate ordered(): Live[] {\n\t\treturn [...this.wants.values()].sort((a, b) => a.memory.order - b.memory.order)\n\t}\n\n\t/** Every want as the last think left it, in the order added, the one saving up named */\n\treport(): BuildPlanReport {\n\t\tconst wants = this.ordered().map((live): WantReport => ({\n\t\t\tid: live.id,\n\t\t\ttype: live.def.type,\n\t\t\tcount: live.count,\n\t\t\thave: live.have,\n\t\t\tonItsWay: live.onItsWay,\n\t\t\tpriority: live.def.priority ?? 0,\n\t\t\t...(live.def.by !== undefined && { by: live.def.by }),\n\t\t\t...(live.def.keep && { keep: true as const }),\n\t\t\tstatus: live.status,\n\t\t\tsteps: [...live.steps],\n\t\t\t...(live.holds && { holds: { ...live.holds } })\n\t\t}))\n\t\treturn { wants, ...(this.saving !== undefined && { saving: this.saving }) }\n\t}\n\n\t/**\n\t * What it remembers, for a save: each standing want's memory (its code gives the want again), and the wants added\n\t * as the game went that are plain data, whole. A want that does not stand and has code in it is not kept: the\n\t * game loaded from the save would not know when the game saved from would have dropped it\n\t */\n\tsave(): BuildPlanMemory {\n\t\tconst wants: BuildPlanMemory['wants'] = []\n\t\tfor (const live of this.ordered()) {\n\t\t\tif (live.def.keep) wants.push({ id: live.id, memory: { ...live.memory } })\n\t\t\telse if (isData(live.def)) wants.push({ id: live.id, memory: { ...live.memory }, data: structuredClone(live.def) as WantData })\n\t\t}\n\t\tfor (const id in this.pending) wants.push({ id, memory: { ...this.pending[id] } })\n\t\twants.sort((a, b) => a.memory.order - b.memory.order)\n\t\treturn { v: 1, wants, added: this.added, ...(this.saving !== undefined && { saving: this.saving }) }\n\t}\n\n\t/** Takes back what `save` gave: whether it was read. The data wants are had again; memory waits for the wants code adds */\n\trestore(memory: unknown): boolean {\n\t\tconst given = memory as BuildPlanMemory | undefined\n\t\tif (!given || typeof given !== 'object' || given.v !== 1 || !Array.isArray(given.wants)) return false\n\t\tthis.pending = {}\n\t\tif (typeof given.added === 'number') this.added = Math.max(this.added, given.added)\n\t\tthis.saving = typeof given.saving === 'string' ? given.saving : undefined\n\t\tfor (const entry of given.wants) {\n\t\t\tif (!entry || typeof entry.id !== 'string') continue\n\t\t\tconst live = this.wants.get(entry.id)\n\t\t\tif (live) live.memory = { ...entry.memory }\n\t\t\telse this.pending[entry.id] = { ...entry.memory }\n\t\t\tif (entry.data && !live) this.want({ ...entry.data, id: entry.id })\n\t\t}\n\t\treturn true\n\t}\n}\n\n/**\n * The build module: runs the brain's build plan (`ai.plans.build.think()`) in its place among a brain's modules, after\n * what adds wants (rules, goals) and before what gives idle workers something else to do. With options for the plan\n *\n * @beta\n */\nexport const build = (options: BuildPlanOptions = {}): AiModuleDef =>\n\tdefineModule({ id: 'build', make: (ai: Brain): AiModule => {\n\t\tai.plans.build.configure(options)\n\t\treturn {\n\t\t\tid: 'build',\n\t\t\tphase: 'plan',\n\t\t\tthink: () => ai.plans.build.think()\n\t\t}\n\t} })\n"],"mappings":"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"}
@@ -8,8 +8,11 @@ import type { Brain } from '#engine/ai/brain';
8
8
  * @beta
9
9
  */
10
10
  export interface SiteRequest {
11
+ /** The place the building is wanted near */
11
12
  near: Vec2;
13
+ /** The furthest from `near`, in cells, the spot may be */
12
14
  within: number;
15
+ /** Which of its kind this one is, so that two of the type do not try the same corner first */
13
16
  ordinal: number;
14
17
  }
15
18
  /**
@@ -39,7 +42,7 @@ export type PlacementTable = Record<string, PlacementName | PlacementStrategy>;
39
42
  /**
40
43
  * The rings around a place, walked out from `from` to `within` (then in from `from` to the nearest ring where `inward`),
41
44
  * each at so many angles; the first point that stands clear and that `accept` likes. Deterministic, but not the same
42
- * corner for every building: the angles start where `ordinal` says
45
+ * corner for every building: the angles start where `ordinal` says. Nothing a worker cannot walk to
43
46
  *
44
47
  * @beta
45
48
  */
@@ -0,0 +1,295 @@
1
+ import { cos, sin } from "../../exactMath.js";
2
+ import { distSq } from "../../math.js";
3
+ import { footprintOf } from "../../defs.js";
4
+ import { footprintCell } from "../../grid.js";
5
+ import "../reach.js";
6
+ //#region src/ai/plans/placement.ts
7
+ /** The angle, as a cosine, within which a spot is "towards" the enemy (45°) or "away" from them (over 107°) */
8
+ var TOWARDS = .7;
9
+ var AWAY = -.3;
10
+ /** Whether a point lies within a distance of the segment from `a` to `b`: the way between a hall and its mine */
11
+ function nearSegment(point, a, b, distance) {
12
+ const dx = b.x - a.x;
13
+ const dz = b.z - a.z;
14
+ const length = dx * dx + dz * dz;
15
+ const t = length > 0 ? Math.min(Math.max(((point.x - a.x) * dx + (point.z - a.z) * dz) / length, 0), 1) : 0;
16
+ return distSq(point, {
17
+ x: a.x + dx * t,
18
+ z: a.z + dz * t
19
+ }) < distance * distance;
20
+ }
21
+ /** The footprint's longer side: how much room a type takes */
22
+ var sizeOf = (type) => Math.max(type.footprint?.w ?? 2, type.footprint?.d ?? 2);
23
+ /** Whether a type can stand at a point with a little room around it: for the units that will walk past */
24
+ function clear(ai, type, point) {
25
+ const { view } = ai;
26
+ const gap = 1;
27
+ return view.canPlace(type.id, point) && view.canPlace(type.id, {
28
+ x: point.x + gap,
29
+ z: point.z
30
+ }) && view.canPlace(type.id, {
31
+ x: point.x - gap,
32
+ z: point.z
33
+ }) && view.canPlace(type.id, {
34
+ x: point.x,
35
+ z: point.z + gap
36
+ }) && view.canPlace(type.id, {
37
+ x: point.x,
38
+ z: point.z - gap
39
+ });
40
+ }
41
+ /** How far past its footprint's edge a worker's way may end and it still gets to work: a little over a builder's reach and radius */
42
+ var WORK_REACH = 1.5;
43
+ /**
44
+ * Whether a worker walks to a point: the way from the worker of the player's nearest to it ends at the footprint. Free
45
+ * ground can be over a cliff or inside a wood: the rings know how far, not how to get there. Asked only of a spot that
46
+ * stands clear, so about once a spot; a player with no worker out to ask has nobody to send anyway, and is not told no
47
+ */
48
+ function walkable(ai, type, point) {
49
+ const { view } = ai;
50
+ const builder = view.mine.where((entity, def) => !!def.builds?.includes(type.id) && !entity.own?.hidden && !def.flying).nearest(point);
51
+ if (!builder) return true;
52
+ const way = view.findPath({
53
+ x: builder.x,
54
+ z: builder.z
55
+ }, point);
56
+ if (!way) return true;
57
+ const reach = sizeOf(type) / 2 + WORK_REACH;
58
+ return distSq(way[way.length - 1], point) <= reach * reach;
59
+ }
60
+ /**
61
+ * The rings around a place, walked out from `from` to `within` (then in from `from` to the nearest ring where `inward`),
62
+ * each at so many angles; the first point that stands clear and that `accept` likes. Deterministic, but not the same
63
+ * corner for every building: the angles start where `ordinal` says. Nothing a worker cannot walk to
64
+ *
65
+ * @beta
66
+ */
67
+ function rings(ai, type, centre, options) {
68
+ const least = 4 + sizeOf(type);
69
+ const from = Math.max(least, options.from ?? least);
70
+ const radii = [];
71
+ for (let radius = from; radius <= options.within; radius += 1.5) radii.push(radius);
72
+ if (options.inward) for (let radius = from - 1.5; radius >= least; radius -= 1.5) radii.push(radius);
73
+ for (const radius of radii) {
74
+ const steps = Math.round(radius * 1.5);
75
+ for (let i = 0; i < steps; i++) {
76
+ const angle = (i + (options.ordinal ?? 0) * 3) / steps * Math.PI * 2;
77
+ const point = {
78
+ x: Math.round(centre.x + sin(angle) * radius),
79
+ z: Math.round(centre.z + cos(angle) * radius)
80
+ };
81
+ if (options.accept && !options.accept(point)) continue;
82
+ if (clear(ai, type, point) && walkable(ai, type, point)) return point;
83
+ }
84
+ }
85
+ }
86
+ /**
87
+ * The way from a place to its mine, to keep clear: the nearest deposit of the money within a hall's reach of it, or
88
+ * the place itself where none is known there (home is the mine itself, for a hall by one not seen yet)
89
+ */
90
+ function mineOf(ai, near) {
91
+ const { view } = ai;
92
+ const known = view.resources.ofResource(ai.purse.money).nearest(near);
93
+ return known && distSq(known, near) < 256 ? known : near;
94
+ }
95
+ /**
96
+ * Which way the enemy is from a place, as a unit vector: towards the nearest of their bases it knows of, else the
97
+ * nearest base the seat was told of (`AiOptions.enemyBases`), else towards the strongest enemy reaching its own
98
+ * (`threat.hot`). Nothing where it has no idea
99
+ *
100
+ * @beta
101
+ */
102
+ function enemyDirection(ai, from) {
103
+ let target;
104
+ let best = Infinity;
105
+ const consider = (point) => {
106
+ if (!point) return;
107
+ const d = distSq(point, from);
108
+ if (d < best && d > 1) {
109
+ best = d;
110
+ target = point;
111
+ }
112
+ };
113
+ if (ai.def.knowledge !== false) {
114
+ for (const base of ai.knowledge.enemy.bases()) if (!base.gone) consider(base.at);
115
+ }
116
+ if (!target) for (const base of ai.options.enemyBases ?? []) consider(base);
117
+ if (!target) {
118
+ const hot = ai.threat.hot()[0];
119
+ if (hot && hot.enemy > 0) consider(hot.at);
120
+ }
121
+ if (!target) return void 0;
122
+ const length = Math.sqrt(best);
123
+ return {
124
+ x: (target.x - from.x) / length,
125
+ z: (target.z - from.z) / length
126
+ };
127
+ }
128
+ /** How far the base around a place reaches: its furthest building from there, at least a few rings out */
129
+ function edgeOf(ai, near) {
130
+ let furthest = 0;
131
+ for (const building of ai.view.mine.buildings()) furthest = Math.max(furthest, distSq(building, near));
132
+ return Math.max(8, Math.sqrt(furthest));
133
+ }
134
+ var dot = (a, b) => a.x * b.x + a.z * b.z;
135
+ /** The side of a place a point is on, against a direction: the cosine of the angle between them */
136
+ function side(point, near, direction) {
137
+ const dx = point.x - near.x;
138
+ const dz = point.z - near.z;
139
+ const length = Math.sqrt(dx * dx + dz * dz);
140
+ return length > 0 ? dot({
141
+ x: dx / length,
142
+ z: dz / length
143
+ }, direction) : 0;
144
+ }
145
+ /** Rings around the place, the way to the mine kept clear: what the melee player always did */
146
+ var nearHome = (ai, type, site) => {
147
+ const mine = mineOf(ai, site.near);
148
+ const keep = sizeOf(type) / 2 + 3;
149
+ return rings(ai, type, site.near, {
150
+ within: site.within,
151
+ ordinal: site.ordinal,
152
+ accept: (point) => !nearSegment(point, site.near, mine, keep)
153
+ });
154
+ };
155
+ /** On the nearest deposit of what it is built on (a cursed mine on a gold mine), within reach of the place */
156
+ var byResource = (ai, type, site) => {
157
+ if (type.builtOn === void 0) return nearHome(ai, type, site);
158
+ const sources = [...ai.view.resources.ofResource(type.builtOn)].sort((a, b) => distSq(a, site.near) - distSq(b, site.near));
159
+ const reach = Math.max(site.within, 16);
160
+ const source = sources.find((each) => distSq(each, site.near) < reach * reach && ai.view.canPlace(type.id, each));
161
+ return source && {
162
+ x: source.x,
163
+ z: source.z
164
+ };
165
+ };
166
+ /** At the edge of the base, on the side the enemy comes from: a tower. Rings around home where the enemy is not known */
167
+ var atEdge = (ai, type, site) => {
168
+ const towards = enemyDirection(ai, site.near);
169
+ if (!towards) return nearHome(ai, type, site);
170
+ const mine = mineOf(ai, site.near);
171
+ const keep = sizeOf(type) / 2 + 3;
172
+ const edge = edgeOf(ai, site.near);
173
+ return rings(ai, type, site.near, {
174
+ from: edge,
175
+ within: Math.max(site.within, edge + 3),
176
+ ordinal: site.ordinal,
177
+ inward: true,
178
+ accept: (point) => side(point, site.near, towards) >= TOWARDS && !nearSegment(point, site.near, mine, keep)
179
+ }) ?? nearHome(ai, type, site);
180
+ };
181
+ /** Away from the enemy, behind the hall: supply, where a raid reaches it last. Rings around home where the enemy is not known */
182
+ var behind = (ai, type, site) => {
183
+ const towards = enemyDirection(ai, site.near);
184
+ if (!towards) return nearHome(ai, type, site);
185
+ const mine = mineOf(ai, site.near);
186
+ const keep = sizeOf(type) / 2 + 3;
187
+ return rings(ai, type, site.near, {
188
+ within: site.within,
189
+ ordinal: site.ordinal,
190
+ accept: (point) => side(point, site.near, towards) <= AWAY && !nearSegment(point, site.near, mine, keep)
191
+ }) ?? nearHome(ai, type, site);
192
+ };
193
+ /** Beside another of a type (its own when none is named): barracks by barracks. Rings around home where there is none yet */
194
+ var cluster = (type) => (ai, def, site) => {
195
+ const with_ = ai.view.mine.ofType(type ?? def.id).finished().nearest(site.near);
196
+ if (!with_ || distSq(with_, site.near) > site.within * site.within * 4) return nearHome(ai, def, site);
197
+ const mine = mineOf(ai, site.near);
198
+ const keep = sizeOf(def) / 2 + 3;
199
+ return rings(ai, def, with_, {
200
+ from: sizeOf(def) + 2,
201
+ within: 10 + sizeOf(def),
202
+ ordinal: site.ordinal,
203
+ accept: (point) => !nearSegment(point, site.near, mine, keep)
204
+ }) ?? nearHome(ai, def, site);
205
+ };
206
+ /** How many of a layer's painted cells nearest the place are tried when the rings find nothing on it */
207
+ var PAINTED_TRIED = 256;
208
+ /** Whether the whole footprint of a type at a point is on a layer: its middle and its four corners, a little inset */
209
+ function onLayerAt(ai, layer, type, point) {
210
+ const { w, d } = footprintOf(type);
211
+ const cell = footprintCell(point.x, point.z, w, d);
212
+ const inset = .5;
213
+ const x0 = cell.x + inset;
214
+ const x1 = cell.x + w - inset;
215
+ const z0 = cell.z + inset;
216
+ const z1 = cell.z + d - inset;
217
+ const { view } = ai;
218
+ return view.cellAt(layer, cell.x + w / 2, cell.z + d / 2) > 0 && view.cellAt(layer, x0, z0) > 0 && view.cellAt(layer, x1, z0) > 0 && view.cellAt(layer, x0, z1) > 0 && view.cellAt(layer, x1, z1) > 0;
219
+ }
220
+ /**
221
+ * On a layer of cells, the whole footprint (`onLayer:<layer>`): the rings around the place, the way to the mine kept
222
+ * clear, then the layer's painted cells nearest the place where the rings find none (a scan of the layer, only then).
223
+ * Nothing where the layer is painted nowhere near
224
+ */
225
+ var onLayer = (layer) => (ai, type, site) => {
226
+ const mine = mineOf(ai, site.near);
227
+ const keep = sizeOf(type) / 2 + 3;
228
+ const found = rings(ai, type, site.near, {
229
+ within: site.within,
230
+ ordinal: site.ordinal,
231
+ accept: (point) => onLayerAt(ai, layer, type, point) && !nearSegment(point, site.near, mine, keep)
232
+ });
233
+ if (found) return found;
234
+ const cells = ai.view.cells(layer);
235
+ if (!cells) return void 0;
236
+ const width = ai.session.terrain.width;
237
+ const painted = [];
238
+ for (let i = 0; i < cells.length; i++) {
239
+ if (cells[i] === 0) continue;
240
+ const point = {
241
+ x: i % width,
242
+ z: Math.floor(i / width)
243
+ };
244
+ painted.push({
245
+ point,
246
+ d: distSq(point, site.near)
247
+ });
248
+ }
249
+ painted.sort((a, b) => a.d - b.d || a.point.z - b.point.z || a.point.x - b.point.x);
250
+ for (const { point } of painted.slice(0, PAINTED_TRIED)) if (onLayerAt(ai, layer, type, point) && !nearSegment(point, site.near, mine, keep) && clear(ai, type, point) && walkable(ai, type, point)) return point;
251
+ };
252
+ /**
253
+ * The kit's placement strategies, by name (`PlacementName`), for a game that wants to call or wrap one
254
+ *
255
+ * @beta
256
+ */
257
+ var placements = {
258
+ nearHome,
259
+ byResource,
260
+ atEdge,
261
+ behind,
262
+ cluster,
263
+ onLayer
264
+ };
265
+ /**
266
+ * A strategy by name: `cluster:<type>` clusters with another type, `onLayer:<layer>` keeps to a layer of cells; a name
267
+ * the kit does not know is `nearHome`
268
+ *
269
+ * @internal
270
+ */
271
+ function placementNamed(name) {
272
+ if (name.startsWith("cluster:")) return cluster(name.slice(8));
273
+ if (name.startsWith("onLayer:")) return onLayer(name.slice(8));
274
+ switch (name) {
275
+ case "byResource": return byResource;
276
+ case "atEdge": return atEdge;
277
+ case "behind": return behind;
278
+ case "cluster": return cluster();
279
+ default: return nearHome;
280
+ }
281
+ }
282
+ /**
283
+ * The strategy a role goes by where nothing else says: a tower at the edge, supply behind, what is built on a deposit by it
284
+ *
285
+ * @internal
286
+ */
287
+ var DEFAULT_PLACEMENT = {
288
+ tower: "atEdge",
289
+ supply: "behind",
290
+ topper: "byResource"
291
+ };
292
+ //#endregion
293
+ export { DEFAULT_PLACEMENT, enemyDirection, placementNamed, placements, rings };
294
+
295
+ //# sourceMappingURL=placement.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"placement.js","names":[],"sources":["../../../src/ai/plans/placement.ts"],"sourcesContent":["import { footprintOf, type UnitTypeDef } from '#engine/defs'\nimport { cos, sin } from '#engine/exactMath'\nimport { distSq, type Vec2 } from '#engine/math'\nimport { footprintCell } from '#engine/grid'\nimport type { Brain } from '#engine/ai/brain'\nimport { HALL_REACH } from '../reach'\n\n/*\n * Where a building goes (AI plan, B3). The old melee player put everything in rings around home; a tower in the rings\n * is as likely to face the woods as the enemy. A placement strategy is a function that finds a spot for a type near a\n * place: the kit's are named (`nearHome`, `byResource`, `atEdge`, `behind`, `cluster`, `onLayer`), so that a seat's options, a\n * type's declaration (`UnitTypeDef.ai.placement`) and a want can name one as data, and a game writes its own as a\n * function. All of them ask the session whether the spot is free (`view.canPlace`), which says no on ground the\n * player has not explored: a hall by a mine nobody has looked at needs a worker sent to look first (the settler, in\n * the build plan). Every strategy walks the same rings, deterministically, so two thinks of one picture pick alike\n */\n\n/**\n * Where a type is wanted: near a place, no further than `within`, and which of its kind this is (`ordinal`, so that\n * two farms do not try the same corner first)\n *\n * @beta\n */\nexport interface SiteRequest {\n\t/** The place the building is wanted near */\n\tnear: Vec2\n\t/** The furthest from `near`, in cells, the spot may be */\n\twithin: number\n\t/** Which of its kind this one is, so that two of the type do not try the same corner first */\n\tordinal: number\n}\n\n/**\n * A way of finding a spot for a building: the kit's by name, or a function of the game's own. Nothing (`undefined`)\n * when there is no spot it likes\n *\n * @beta\n */\nexport type PlacementStrategy = (ai: Brain, type: UnitTypeDef, site: SiteRequest) => Vec2 | undefined\n\n/**\n * The kit's placement strategies, by name: `nearHome` (rings around the place, keeping the way to the mine clear),\n * `byResource` (on the nearest deposit it is built on: a mine), `atEdge` (at the edge of the base towards the enemy,\n * for a tower), `behind` (away from the enemy, for supply), `cluster` (beside another of its type, barracks by\n * barracks; `cluster:<type>` beside another type), `onLayer:<layer>` (where the whole footprint is on a layer of cells\n * the game paints: `onLayer:blight` for a race that builds on blight)\n *\n * @beta\n */\nexport type PlacementName = 'nearHome' | 'byResource' | 'atEdge' | 'behind' | 'cluster' | `cluster:${string}` | `onLayer:${string}`\n\n/**\n * Which strategy a type goes by (`AiOptions.placement`, `BuildPlanOptions.placement`): by type id or by role, a name\n * or a function\n *\n * @beta\n */\nexport type PlacementTable = Record<string, PlacementName | PlacementStrategy>\n\n/** The angle, as a cosine, within which a spot is \"towards\" the enemy (45°) or \"away\" from them (over 107°) */\nconst TOWARDS = 0.7\nconst AWAY = -0.3\n\n/** Whether a point lies within a distance of the segment from `a` to `b`: the way between a hall and its mine */\nfunction nearSegment(point: Vec2, a: Vec2, b: Vec2, distance: number): boolean {\n\tconst dx = b.x - a.x\n\tconst dz = b.z - a.z\n\tconst length = dx * dx + dz * dz\n\tconst t = length > 0 ? Math.min(Math.max(((point.x - a.x) * dx + (point.z - a.z) * dz) / length, 0), 1) : 0\n\treturn distSq(point, { x: a.x + dx * t, z: a.z + dz * t }) < distance * distance\n}\n\n/** The footprint's longer side: how much room a type takes */\nconst sizeOf = (type: UnitTypeDef) => Math.max(type.footprint?.w ?? 2, type.footprint?.d ?? 2)\n\n/** Whether a type can stand at a point with a little room around it: for the units that will walk past */\nfunction clear(ai: Brain, type: UnitTypeDef, point: Vec2): boolean {\n\tconst { view } = ai\n\tconst gap = 1\n\treturn (\n\t\tview.canPlace(type.id, point) &&\n\t\tview.canPlace(type.id, { x: point.x + gap, z: point.z }) &&\n\t\tview.canPlace(type.id, { x: point.x - gap, z: point.z }) &&\n\t\tview.canPlace(type.id, { x: point.x, z: point.z + gap }) &&\n\t\tview.canPlace(type.id, { x: point.x, z: point.z - gap })\n\t)\n}\n\n/** How far past its footprint's edge a worker's way may end and it still gets to work: a little over a builder's reach and radius */\nconst WORK_REACH = 1.5\n\n/**\n * Whether a worker walks to a point: the way from the worker of the player's nearest to it ends at the footprint. Free\n * ground can be over a cliff or inside a wood: the rings know how far, not how to get there. Asked only of a spot that\n * stands clear, so about once a spot; a player with no worker out to ask has nobody to send anyway, and is not told no\n */\nfunction walkable(ai: Brain, type: UnitTypeDef, point: Vec2): boolean {\n\tconst { view } = ai\n\tconst builder = view.mine.where((entity, def) => !!def.builds?.includes(type.id) && !entity.own?.hidden && !def.flying).nearest(point)\n\tif (!builder) return true\n\tconst way = view.findPath({ x: builder.x, z: builder.z }, point)\n\t// no way at all is the search having nothing to go on, a builder's own order finds out: over a cliff the way ends short\n\tif (!way) return true\n\tconst reach = sizeOf(type) / 2 + WORK_REACH\n\treturn distSq(way[way.length - 1], point) <= reach * reach\n}\n\n/**\n * The rings around a place, walked out from `from` to `within` (then in from `from` to the nearest ring where `inward`),\n * each at so many angles; the first point that stands clear and that `accept` likes. Deterministic, but not the same\n * corner for every building: the angles start where `ordinal` says. Nothing a worker cannot walk to\n *\n * @beta\n */\nexport function rings(\n\tai: Brain,\n\ttype: UnitTypeDef,\n\tcentre: Vec2,\n\toptions: { from?: number; within: number; ordinal?: number; inward?: boolean; accept?: (point: Vec2) => boolean }\n): Vec2 | undefined {\n\tconst size = sizeOf(type)\n\tconst least = 4 + size\n\tconst from = Math.max(least, options.from ?? least)\n\tconst radii: number[] = []\n\tfor (let radius = from; radius <= options.within; radius += 1.5) radii.push(radius)\n\tif (options.inward) for (let radius = from - 1.5; radius >= least; radius -= 1.5) radii.push(radius)\n\tfor (const radius of radii) {\n\t\tconst steps = Math.round(radius * 1.5)\n\t\tfor (let i = 0; i < steps; i++) {\n\t\t\tconst angle = ((i + (options.ordinal ?? 0) * 3) / steps) * Math.PI * 2\n\t\t\tconst point = { x: Math.round(centre.x + sin(angle) * radius), z: Math.round(centre.z + cos(angle) * radius) }\n\t\t\tif (options.accept && !options.accept(point)) continue\n\t\t\tif (clear(ai, type, point) && walkable(ai, type, point)) return point\n\t\t}\n\t}\n\treturn undefined\n}\n\n/**\n * The way from a place to its mine, to keep clear: the nearest deposit of the money within a hall's reach of it, or\n * the place itself where none is known there (home is the mine itself, for a hall by one not seen yet)\n */\nfunction mineOf(ai: Brain, near: Vec2): Vec2 {\n\tconst { view } = ai\n\tconst known = view.resources.ofResource(ai.purse.money).nearest(near)\n\treturn known && distSq(known, near) < HALL_REACH * HALL_REACH ? known : near\n}\n\n/**\n * Which way the enemy is from a place, as a unit vector: towards the nearest of their bases it knows of, else the\n * nearest base the seat was told of (`AiOptions.enemyBases`), else towards the strongest enemy reaching its own\n * (`threat.hot`). Nothing where it has no idea\n *\n * @beta\n */\nexport function enemyDirection(ai: Brain, from: Vec2): Vec2 | undefined {\n\tlet target: Vec2 | undefined\n\tlet best = Infinity\n\tconst consider = (point: Vec2 | undefined) => {\n\t\tif (!point) return\n\t\tconst d = distSq(point, from)\n\t\tif (d < best && d > 1) {\n\t\t\tbest = d\n\t\t\ttarget = point\n\t\t}\n\t}\n\tif (ai.def.knowledge !== false) for (const base of ai.knowledge.enemy.bases()) if (!base.gone) consider(base.at)\n\tif (!target) for (const base of ai.options.enemyBases ?? []) consider(base)\n\tif (!target) {\n\t\tconst hot = ai.threat.hot()[0]\n\t\tif (hot && hot.enemy > 0) consider(hot.at)\n\t}\n\tif (!target) return undefined\n\tconst length = Math.sqrt(best)\n\treturn { x: (target.x - from.x) / length, z: (target.z - from.z) / length }\n}\n\n/** How far the base around a place reaches: its furthest building from there, at least a few rings out */\nfunction edgeOf(ai: Brain, near: Vec2): number {\n\tlet furthest = 0\n\tfor (const building of ai.view.mine.buildings()) furthest = Math.max(furthest, distSq(building, near))\n\treturn Math.max(8, Math.sqrt(furthest))\n}\n\nconst dot = (a: Vec2, b: Vec2) => a.x * b.x + a.z * b.z\n\n/** The side of a place a point is on, against a direction: the cosine of the angle between them */\nfunction side(point: Vec2, near: Vec2, direction: Vec2): number {\n\tconst dx = point.x - near.x\n\tconst dz = point.z - near.z\n\tconst length = Math.sqrt(dx * dx + dz * dz)\n\treturn length > 0 ? dot({ x: dx / length, z: dz / length }, direction) : 0\n}\n\n/** Rings around the place, the way to the mine kept clear: what the melee player always did */\nconst nearHome: PlacementStrategy = (ai, type, site) => {\n\tconst mine = mineOf(ai, site.near)\n\tconst keep = sizeOf(type) / 2 + 3\n\treturn rings(ai, type, site.near, { within: site.within, ordinal: site.ordinal, accept: (point) => !nearSegment(point, site.near, mine, keep) })\n}\n\n/** On the nearest deposit of what it is built on (a cursed mine on a gold mine), within reach of the place */\nconst byResource: PlacementStrategy = (ai, type, site) => {\n\tif (type.builtOn === undefined) return nearHome(ai, type, site)\n\tconst sources = [...ai.view.resources.ofResource(type.builtOn)].sort((a, b) => distSq(a, site.near) - distSq(b, site.near))\n\tconst reach = Math.max(site.within, HALL_REACH)\n\tconst source = sources.find((each) => distSq(each, site.near) < reach * reach && ai.view.canPlace(type.id, each))\n\treturn source && { x: source.x, z: source.z }\n}\n\n/** At the edge of the base, on the side the enemy comes from: a tower. Rings around home where the enemy is not known */\nconst atEdge: PlacementStrategy = (ai, type, site) => {\n\tconst towards = enemyDirection(ai, site.near)\n\tif (!towards) return nearHome(ai, type, site)\n\tconst mine = mineOf(ai, site.near)\n\tconst keep = sizeOf(type) / 2 + 3\n\tconst edge = edgeOf(ai, site.near)\n\treturn (\n\t\trings(ai, type, site.near, {\n\t\t\tfrom: edge,\n\t\t\twithin: Math.max(site.within, edge + 3),\n\t\t\tordinal: site.ordinal,\n\t\t\tinward: true,\n\t\t\taccept: (point) => side(point, site.near, towards) >= TOWARDS && !nearSegment(point, site.near, mine, keep)\n\t\t}) ?? nearHome(ai, type, site)\n\t)\n}\n\n/** Away from the enemy, behind the hall: supply, where a raid reaches it last. Rings around home where the enemy is not known */\nconst behind: PlacementStrategy = (ai, type, site) => {\n\tconst towards = enemyDirection(ai, site.near)\n\tif (!towards) return nearHome(ai, type, site)\n\tconst mine = mineOf(ai, site.near)\n\tconst keep = sizeOf(type) / 2 + 3\n\treturn (\n\t\trings(ai, type, site.near, {\n\t\t\twithin: site.within,\n\t\t\tordinal: site.ordinal,\n\t\t\taccept: (point) => side(point, site.near, towards) <= AWAY && !nearSegment(point, site.near, mine, keep)\n\t\t}) ?? nearHome(ai, type, site)\n\t)\n}\n\n/** Beside another of a type (its own when none is named): barracks by barracks. Rings around home where there is none yet */\nconst cluster =\n\t(type?: string): PlacementStrategy =>\n\t(ai, def, site) => {\n\t\tconst with_ = ai.view.mine\n\t\t\t.ofType(type ?? def.id)\n\t\t\t.finished()\n\t\t\t.nearest(site.near)\n\t\tif (!with_ || distSq(with_, site.near) > site.within * site.within * 4) return nearHome(ai, def, site)\n\t\tconst mine = mineOf(ai, site.near)\n\t\tconst keep = sizeOf(def) / 2 + 3\n\t\treturn (\n\t\t\trings(ai, def, with_, {\n\t\t\t\tfrom: sizeOf(def) + 2,\n\t\t\t\twithin: 10 + sizeOf(def),\n\t\t\t\tordinal: site.ordinal,\n\t\t\t\taccept: (point) => !nearSegment(point, site.near, mine, keep)\n\t\t\t}) ?? nearHome(ai, def, site)\n\t\t)\n\t}\n\n/** How many of a layer's painted cells nearest the place are tried when the rings find nothing on it */\nconst PAINTED_TRIED = 256\n\n/** Whether the whole footprint of a type at a point is on a layer: its middle and its four corners, a little inset */\nfunction onLayerAt(ai: Brain, layer: string, type: UnitTypeDef, point: Vec2): boolean {\n\tconst { w, d } = footprintOf(type)\n\tconst cell = footprintCell(point.x, point.z, w, d)\n\tconst inset = 0.5\n\tconst x0 = cell.x + inset\n\tconst x1 = cell.x + w - inset\n\tconst z0 = cell.z + inset\n\tconst z1 = cell.z + d - inset\n\tconst { view } = ai\n\treturn (\n\t\tview.cellAt(layer, cell.x + w / 2, cell.z + d / 2) > 0 &&\n\t\tview.cellAt(layer, x0, z0) > 0 &&\n\t\tview.cellAt(layer, x1, z0) > 0 &&\n\t\tview.cellAt(layer, x0, z1) > 0 &&\n\t\tview.cellAt(layer, x1, z1) > 0\n\t)\n}\n\n/**\n * On a layer of cells, the whole footprint (`onLayer:<layer>`): the rings around the place, the way to the mine kept\n * clear, then the layer's painted cells nearest the place where the rings find none (a scan of the layer, only then).\n * Nothing where the layer is painted nowhere near\n */\nconst onLayer =\n\t(layer: string): PlacementStrategy =>\n\t(ai, type, site) => {\n\t\tconst mine = mineOf(ai, site.near)\n\t\tconst keep = sizeOf(type) / 2 + 3\n\t\tconst found = rings(ai, type, site.near, {\n\t\t\twithin: site.within,\n\t\t\tordinal: site.ordinal,\n\t\t\taccept: (point) => onLayerAt(ai, layer, type, point) && !nearSegment(point, site.near, mine, keep)\n\t\t})\n\t\tif (found) return found\n\t\tconst cells = ai.view.cells(layer)\n\t\tif (!cells) return undefined\n\t\tconst width = ai.session.terrain.width\n\t\tconst painted: { point: Vec2; d: number }[] = []\n\t\tfor (let i = 0; i < cells.length; i++) {\n\t\t\tif (cells[i] === 0) continue\n\t\t\tconst point = { x: i % width, z: Math.floor(i / width) }\n\t\t\tpainted.push({ point, d: distSq(point, site.near) })\n\t\t}\n\t\tpainted.sort((a, b) => a.d - b.d || a.point.z - b.point.z || a.point.x - b.point.x)\n\t\tfor (const { point } of painted.slice(0, PAINTED_TRIED)) {\n\t\t\tif (onLayerAt(ai, layer, type, point) && !nearSegment(point, site.near, mine, keep) && clear(ai, type, point) && walkable(ai, type, point)) return point\n\t\t}\n\t\treturn undefined\n\t}\n\n/**\n * The kit's placement strategies, by name (`PlacementName`), for a game that wants to call or wrap one\n *\n * @beta\n */\nexport const placements = { nearHome, byResource, atEdge, behind, cluster, onLayer } as const\n\n/**\n * A strategy by name: `cluster:<type>` clusters with another type, `onLayer:<layer>` keeps to a layer of cells; a name\n * the kit does not know is `nearHome`\n *\n * @internal\n */\nexport function placementNamed(name: PlacementName | string): PlacementStrategy {\n\tif (name.startsWith('cluster:')) return cluster(name.slice('cluster:'.length))\n\tif (name.startsWith('onLayer:')) return onLayer(name.slice('onLayer:'.length))\n\tswitch (name) {\n\t\tcase 'byResource':\n\t\t\treturn byResource\n\t\tcase 'atEdge':\n\t\t\treturn atEdge\n\t\tcase 'behind':\n\t\t\treturn behind\n\t\tcase 'cluster':\n\t\t\treturn cluster()\n\t\tdefault:\n\t\t\treturn nearHome\n\t}\n}\n\n/**\n * The strategy a role goes by where nothing else says: a tower at the edge, supply behind, what is built on a deposit by it\n *\n * @internal\n */\nexport const DEFAULT_PLACEMENT: Readonly<Record<string, PlacementName>> = { tower: 'atEdge', supply: 'behind', topper: 'byResource' }\n"],"mappings":"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"}
@@ -18,7 +18,9 @@ export type BuildOrderItem = string | {
18
18
  * @beta
19
19
  */
20
20
  export interface PlansOptions {
21
+ /** Options of the build plan */
21
22
  build?: BuildPlanOptions;
23
+ /** Options of the production plan */
22
24
  production?: ProductionPlanOptions;
23
25
  /**
24
26
  * What to have first, in order (`BuildOrderItem`): each item waits for the one before, and nothing else the
@@ -33,8 +35,11 @@ export interface PlansOptions {
33
35
  * @beta
34
36
  */
35
37
  export interface PlansMemory {
38
+ /** The version of the memory's format: 1 so far */
36
39
  v: 1;
40
+ /** The build plan's memory */
37
41
  build?: BuildPlanMemory;
42
+ /** The production plan's memory */
38
43
  production?: ProductionPlanMemory;
39
44
  }
40
45
  /**
@@ -43,8 +48,11 @@ export interface PlansMemory {
43
48
  * @beta
44
49
  */
45
50
  export interface PlansReport {
51
+ /** The purse: what is free, promised and held */
46
52
  purse: PurseReport;
53
+ /** The build plan's wants and which one saves up */
47
54
  build: BuildPlanReport;
55
+ /** The production plan's composition and what it trained */
48
56
  production: ProductionPlanReport;
49
57
  /** The build order's next item, while it is being followed */
50
58
  order?: {
@@ -94,6 +102,7 @@ export declare class Plans implements AiArea {
94
102
  /** What the plans remember, for a save */
95
103
  /** Whether it has anything to remember now: one that does not is left out of a save */
96
104
  remembers(): boolean;
105
+ /** Gives a copy of the plans' memory, for a save of the brain */
97
106
  save(): PlansMemory;
98
107
  /** Takes back what `save` gave: whether it was read */
99
108
  restore(memory: unknown): boolean;
@@ -0,0 +1,110 @@
1
+ import { BuildPlan } from "./build.js";
2
+ import { ProductionPlan } from "./production.js";
3
+ //#region src/ai/plans/plans.ts
4
+ /**
5
+ * A brain's plans (`ai.plans`): `build` for what is to be built, `production` for what is to be trained and
6
+ * researched, the game's build `order` over both. `want` is the one door: a want of a building goes to the build
7
+ * plan; one of a unit goes to the build plan for its buildings, and the production plan trains it
8
+ *
9
+ * @beta
10
+ */
11
+ var Plans = class {
12
+ ai;
13
+ /** Its id among the brain's areas: what its memory and its report are kept under */
14
+ id = "plans";
15
+ /** What the log says where a save's memory of it is of a shape it does not read */
16
+ afresh = "the save remembers what the computer player planned in a shape this brain does not read: it plans afresh";
17
+ /** What to build, and the steps to it */
18
+ build;
19
+ /** What to train and research */
20
+ production;
21
+ order;
22
+ followedAt = -1;
23
+ next;
24
+ constructor(ai, options = {}) {
25
+ this.ai = ai;
26
+ this.build = new BuildPlan(ai, options.build);
27
+ this.production = new ProductionPlan(ai, options.production);
28
+ this.order = options.order ?? [];
29
+ }
30
+ /** Adds a want: what the brain works towards from now (`BuildPlan.want`). Gives back its id */
31
+ want(def) {
32
+ return this.build.want(def);
33
+ }
34
+ /**
35
+ * Works on the game's build order, once a think: the first item not had (what stands, is on its way or is queued
36
+ * counted; counts of a type adding up along the order) is a want before all others (`order`, priority 1000), and
37
+ * `following` is true. Called by the build plan as it thinks; a module may call it sooner
38
+ */
39
+ follow() {
40
+ const { ai, build } = this;
41
+ if (this.followedAt === ai.tick) return this.next;
42
+ this.followedAt = ai.tick;
43
+ let next;
44
+ const wanted = /* @__PURE__ */ new Map();
45
+ for (let i = 0; i < this.order.length && !next; i++) {
46
+ const item = this.order[i];
47
+ const { type, count = 1 } = typeof item === "string" ? { type: item } : item;
48
+ const need = (wanted.get(type) ?? 0) + count;
49
+ wanted.set(type, need);
50
+ if (build.have(type) + build.onItsWay(type) < need) next = {
51
+ type,
52
+ count: need,
53
+ item: i
54
+ };
55
+ }
56
+ this.next = next;
57
+ if (next) build.want({
58
+ id: "order",
59
+ type: next.type,
60
+ count: next.count,
61
+ priority: 1e3,
62
+ by: "the build order"
63
+ });
64
+ else build.drop("order");
65
+ return next;
66
+ }
67
+ /** Whether the game's build order is still being followed: what the computer would make of itself waits */
68
+ get following() {
69
+ return this.follow() !== void 0;
70
+ }
71
+ /** Takes a want out, by id */
72
+ drop(id) {
73
+ return this.build.drop(id);
74
+ }
75
+ /** The purse and each plan's part, for the report */
76
+ report() {
77
+ return {
78
+ purse: this.ai.purse.inspect(),
79
+ build: this.build.report(),
80
+ production: this.production.report(),
81
+ ...this.next && { order: { ...this.next } }
82
+ };
83
+ }
84
+ /** What the plans remember, for a save */
85
+ /** Whether it has anything to remember now: one that does not is left out of a save */
86
+ remembers() {
87
+ return true;
88
+ }
89
+ /** Gives a copy of the plans' memory, for a save of the brain */
90
+ save() {
91
+ const production = this.production.save();
92
+ return {
93
+ v: 1,
94
+ build: this.build.save(),
95
+ ...production && { production }
96
+ };
97
+ }
98
+ /** Takes back what `save` gave: whether it was read */
99
+ restore(memory) {
100
+ const given = memory;
101
+ if (!given || typeof given !== "object" || given.v !== 1) return false;
102
+ if (given.build !== void 0) this.build.restore(given.build);
103
+ this.production.restore(given.production);
104
+ return true;
105
+ }
106
+ };
107
+ //#endregion
108
+ export { Plans };
109
+
110
+ //# sourceMappingURL=plans.js.map