@v12-engine/engine 0.1.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (951) hide show
  1. package/dist/abilities/amounts.d.ts +28 -0
  2. package/dist/abilities/amounts.js +74 -0
  3. package/dist/abilities/amounts.js.map +1 -0
  4. package/dist/abilities/buffs.d.ts +106 -6
  5. package/dist/abilities/buffs.js +443 -0
  6. package/dist/abilities/buffs.js.map +1 -0
  7. package/dist/abilities/castTold.d.ts +2 -0
  8. package/dist/abilities/castTold.js +66 -0
  9. package/dist/abilities/castTold.js.map +1 -0
  10. package/dist/abilities/chance.d.ts +38 -0
  11. package/dist/abilities/chance.js +77 -0
  12. package/dist/abilities/chance.js.map +1 -0
  13. package/dist/abilities/charges.d.ts +18 -0
  14. package/dist/abilities/charges.js +101 -0
  15. package/dist/abilities/charges.js.map +1 -0
  16. package/dist/abilities/control.d.ts +28 -0
  17. package/dist/abilities/control.js +113 -0
  18. package/dist/abilities/control.js.map +1 -0
  19. package/dist/abilities/dispel.js +51 -0
  20. package/dist/abilities/dispel.js.map +1 -0
  21. package/dist/abilities/effectFields.d.ts +1 -1
  22. package/dist/abilities/effectFields.js +676 -0
  23. package/dist/abilities/effectFields.js.map +1 -0
  24. package/dist/abilities/effectIndex.d.ts +27 -0
  25. package/dist/abilities/effectIndex.js +64 -0
  26. package/dist/abilities/effectIndex.js.map +1 -0
  27. package/dist/abilities/effects/buff.d.ts +9 -3
  28. package/dist/abilities/effects/buff.js +84 -0
  29. package/dist/abilities/effects/buff.js.map +1 -0
  30. package/dist/abilities/effects/conditions.d.ts +2 -0
  31. package/dist/abilities/effects/conditions.js +41 -0
  32. package/dist/abilities/effects/conditions.js.map +1 -0
  33. package/dist/abilities/effects/core.js +54 -0
  34. package/dist/abilities/effects/core.js.map +1 -0
  35. package/dist/abilities/effects/damage.d.ts +1 -1
  36. package/dist/abilities/effects/damage.js +43 -0
  37. package/dist/abilities/effects/damage.js.map +1 -0
  38. package/dist/abilities/effects/heal.d.ts +2 -2
  39. package/dist/abilities/effects/heal.js +51 -0
  40. package/dist/abilities/effects/heal.js.map +1 -0
  41. package/dist/abilities/effects/missile.d.ts +13 -1
  42. package/dist/abilities/effects/missile.js +104 -0
  43. package/dist/abilities/effects/missile.js.map +1 -0
  44. package/dist/abilities/effects/morph.d.ts +5 -0
  45. package/dist/abilities/effects/morph.js +43 -0
  46. package/dist/abilities/effects/morph.js.map +1 -0
  47. package/dist/abilities/effects/moves.d.ts +16 -4
  48. package/dist/abilities/effects/moves.js +212 -0
  49. package/dist/abilities/effects/moves.js.map +1 -0
  50. package/dist/abilities/effects/passives.d.ts +19 -9
  51. package/dist/abilities/effects/passives.js +131 -0
  52. package/dist/abilities/effects/passives.js.map +1 -0
  53. package/dist/abilities/effects/proxy.d.ts +5 -0
  54. package/dist/abilities/effects/proxy.js +60 -0
  55. package/dist/abilities/effects/proxy.js.map +1 -0
  56. package/dist/abilities/effects/sight.d.ts +2 -2
  57. package/dist/abilities/effects/sight.js +39 -0
  58. package/dist/abilities/effects/sight.js.map +1 -0
  59. package/dist/abilities/effects/spawn.d.ts +5 -2
  60. package/dist/abilities/effects/spawn.js +40 -0
  61. package/dist/abilities/effects/spawn.js.map +1 -0
  62. package/dist/abilities/effects/timed.d.ts +2 -2
  63. package/dist/abilities/effects/timed.js +96 -0
  64. package/dist/abilities/effects/timed.js.map +1 -0
  65. package/dist/abilities/effects/trade.d.ts +1 -1
  66. package/dist/abilities/effects/trade.js +25 -0
  67. package/dist/abilities/effects/trade.js.map +1 -0
  68. package/dist/abilities/effects.d.ts +97 -23
  69. package/dist/abilities/effects.js +860 -0
  70. package/dist/abilities/effects.js.map +1 -0
  71. package/dist/abilities/land.d.ts +38 -4
  72. package/dist/abilities/land.js +189 -0
  73. package/dist/abilities/land.js.map +1 -0
  74. package/dist/abilities/recast.d.ts +45 -0
  75. package/dist/abilities/recast.js +118 -0
  76. package/dist/abilities/recast.js.map +1 -0
  77. package/dist/abilities/scaled.js +40 -0
  78. package/dist/abilities/scaled.js.map +1 -0
  79. package/dist/abilities/screen.d.ts +6 -0
  80. package/dist/abilities/screen.js +83 -0
  81. package/dist/abilities/screen.js.map +1 -0
  82. package/dist/abilities/shapes.d.ts +66 -0
  83. package/dist/abilities/shapes.js +122 -0
  84. package/dist/abilities/shapes.js.map +1 -0
  85. package/dist/abilities/text.d.ts +14 -2
  86. package/dist/abilities/text.js +204 -0
  87. package/dist/abilities/text.js.map +1 -0
  88. package/dist/abilities/triggers.d.ts +98 -0
  89. package/dist/abilities/triggers.js +351 -0
  90. package/dist/abilities/triggers.js.map +1 -0
  91. package/dist/abilityChanges.d.ts +131 -0
  92. package/dist/abilityChanges.js +345 -0
  93. package/dist/abilityChanges.js.map +1 -0
  94. package/dist/ai/area.d.ts +4 -1
  95. package/dist/ai/brain.d.ts +4 -1
  96. package/dist/ai/brain.js +844 -0
  97. package/dist/ai/brain.js.map +1 -0
  98. package/dist/ai/budget.js +74 -0
  99. package/dist/ai/budget.js.map +1 -0
  100. package/dist/ai/checks.d.ts +9 -1
  101. package/dist/ai/checks.js +242 -0
  102. package/dist/ai/checks.js.map +1 -0
  103. package/dist/ai/computer.d.ts +11 -4
  104. package/dist/ai/computer.js +251 -0
  105. package/dist/ai/computer.js.map +1 -0
  106. package/dist/ai/defence.d.ts +4 -0
  107. package/dist/ai/defence.js +430 -0
  108. package/dist/ai/defence.js.map +1 -0
  109. package/dist/ai/define.d.ts +3 -2
  110. package/dist/ai/define.js +31 -0
  111. package/dist/ai/define.js.map +1 -0
  112. package/dist/ai/economy.d.ts +10 -7
  113. package/dist/ai/economy.js +780 -0
  114. package/dist/ai/economy.js.map +1 -0
  115. package/dist/ai/geometry.js +38 -0
  116. package/dist/ai/geometry.js.map +1 -0
  117. package/dist/ai/goals.d.ts +1 -0
  118. package/dist/ai/goals.js +560 -0
  119. package/dist/ai/goals.js.map +1 -0
  120. package/dist/ai/knowledge.d.ts +72 -7
  121. package/dist/ai/knowledge.js +804 -0
  122. package/dist/ai/knowledge.js.map +1 -0
  123. package/dist/ai/lanes.d.ts +10 -2
  124. package/dist/ai/lanes.js +715 -0
  125. package/dist/ai/lanes.js.map +1 -0
  126. package/dist/ai/melee/build.js +264 -0
  127. package/dist/ai/melee/build.js.map +1 -0
  128. package/dist/ai/melee/goals.d.ts +7 -0
  129. package/dist/ai/melee/goals.js +720 -0
  130. package/dist/ai/melee/goals.js.map +1 -0
  131. package/dist/ai/melee/heroes.js +68 -0
  132. package/dist/ai/melee/heroes.js.map +1 -0
  133. package/dist/ai/melee/index.d.ts +1 -1
  134. package/dist/ai/melee/index.js +51 -0
  135. package/dist/ai/melee/index.js.map +1 -0
  136. package/dist/ai/melee/production.js +29 -0
  137. package/dist/ai/melee/production.js.map +1 -0
  138. package/dist/ai/melee/surrender.js +64 -0
  139. package/dist/ai/melee/surrender.js.map +1 -0
  140. package/dist/ai/micro.d.ts +9 -0
  141. package/dist/ai/micro.js +1316 -0
  142. package/dist/ai/micro.js.map +1 -0
  143. package/dist/ai/mission.d.ts +9 -2
  144. package/dist/ai/mission.js +538 -0
  145. package/dist/ai/mission.js.map +1 -0
  146. package/dist/ai/missionRules.d.ts +1 -1
  147. package/dist/ai/missionRules.js +26 -0
  148. package/dist/ai/missionRules.js.map +1 -0
  149. package/dist/ai/module.d.ts +6 -2
  150. package/dist/ai/module.js +37 -0
  151. package/dist/ai/module.js.map +1 -0
  152. package/dist/ai/options.d.ts +3 -3
  153. package/dist/ai/plans/build.d.ts +20 -1
  154. package/dist/ai/plans/build.js +608 -0
  155. package/dist/ai/plans/build.js.map +1 -0
  156. package/dist/ai/plans/placement.d.ts +4 -1
  157. package/dist/ai/plans/placement.js +295 -0
  158. package/dist/ai/plans/placement.js.map +1 -0
  159. package/dist/ai/plans/plans.d.ts +9 -0
  160. package/dist/ai/plans/plans.js +110 -0
  161. package/dist/ai/plans/plans.js.map +1 -0
  162. package/dist/ai/plans/production.d.ts +14 -2
  163. package/dist/ai/plans/production.js +434 -0
  164. package/dist/ai/plans/production.js.map +1 -0
  165. package/dist/ai/plans/purse.d.ts +6 -3
  166. package/dist/ai/plans/purse.js +139 -0
  167. package/dist/ai/plans/purse.js.map +1 -0
  168. package/dist/ai/plans/tech.d.ts +6 -0
  169. package/dist/ai/plans/tech.js +122 -0
  170. package/dist/ai/plans/tech.js.map +1 -0
  171. package/dist/ai/profiles.d.ts +4 -4
  172. package/dist/{profiles-B3NS9jwk.js → ai/profiles.js} +3 -98
  173. package/dist/ai/profiles.js.map +1 -0
  174. package/dist/ai/reach.js +54 -0
  175. package/dist/ai/reach.js.map +1 -0
  176. package/dist/ai/report.d.ts +8 -0
  177. package/dist/ai/report.js +87 -0
  178. package/dist/ai/report.js.map +1 -0
  179. package/dist/ai/roles.d.ts +4 -0
  180. package/dist/ai/roles.js +207 -0
  181. package/dist/ai/roles.js.map +1 -0
  182. package/dist/ai/rules.d.ts +8 -2
  183. package/dist/ai/rules.js +416 -0
  184. package/dist/ai/rules.js.map +1 -0
  185. package/dist/ai/scouting.d.ts +6 -0
  186. package/dist/ai/scouting.js +324 -0
  187. package/dist/ai/scouting.js.map +1 -0
  188. package/dist/ai/settings.js +99 -0
  189. package/dist/ai/settings.js.map +1 -0
  190. package/dist/ai/squads.d.ts +21 -2
  191. package/dist/ai/squads.js +916 -0
  192. package/dist/ai/squads.js.map +1 -0
  193. package/dist/ai/strength.js +320 -0
  194. package/dist/ai/strength.js.map +1 -0
  195. package/dist/ai/task.d.ts +3 -1
  196. package/dist/ai/task.js +17 -0
  197. package/dist/ai/task.js.map +1 -0
  198. package/dist/ai/tasks/attack.js +24 -0
  199. package/dist/ai/tasks/attack.js.map +1 -0
  200. package/dist/ai/tasks/capture.d.ts +3 -3
  201. package/dist/ai/tasks/capture.js +37 -0
  202. package/dist/ai/tasks/capture.js.map +1 -0
  203. package/dist/ai/tasks/creep.js +29 -0
  204. package/dist/ai/tasks/creep.js.map +1 -0
  205. package/dist/ai/tasks/defend.js +61 -0
  206. package/dist/ai/tasks/defend.js.map +1 -0
  207. package/dist/ai/tasks/drop.js +81 -0
  208. package/dist/ai/tasks/drop.js.map +1 -0
  209. package/dist/ai/tasks/escort.js +59 -0
  210. package/dist/ai/tasks/escort.js.map +1 -0
  211. package/dist/ai/tasks/gather.js +48 -0
  212. package/dist/ai/tasks/gather.js.map +1 -0
  213. package/dist/ai/tasks/harass.js +39 -0
  214. package/dist/ai/tasks/harass.js.map +1 -0
  215. package/dist/ai/tasks/hold.js +32 -0
  216. package/dist/ai/tasks/hold.js.map +1 -0
  217. package/dist/ai/tasks/index.js +34 -0
  218. package/dist/ai/tasks/index.js.map +1 -0
  219. package/dist/ai/tasks/move.js +26 -0
  220. package/dist/ai/tasks/move.js.map +1 -0
  221. package/dist/ai/tasks/patrol.js +59 -0
  222. package/dist/ai/tasks/patrol.js.map +1 -0
  223. package/dist/ai/tasks/retreat.js +28 -0
  224. package/dist/ai/tasks/retreat.js.map +1 -0
  225. package/dist/ai/tasks/scout.js +73 -0
  226. package/dist/ai/tasks/scout.js.map +1 -0
  227. package/dist/ai/tasks/shared.d.ts +1 -1
  228. package/dist/ai/tasks/shared.js +137 -0
  229. package/dist/ai/tasks/shared.js.map +1 -0
  230. package/dist/ai/team.d.ts +18 -1
  231. package/dist/ai/team.js +492 -0
  232. package/dist/ai/team.js.map +1 -0
  233. package/dist/ai/threat.d.ts +6 -0
  234. package/dist/ai/threat.js +206 -0
  235. package/dist/ai/threat.js.map +1 -0
  236. package/dist/ai/view.d.ts +21 -7
  237. package/dist/ai/view.js +677 -0
  238. package/dist/ai/view.js.map +1 -0
  239. package/dist/ai/waves.d.ts +6 -0
  240. package/dist/ai/waves.js +410 -0
  241. package/dist/ai/waves.js.map +1 -0
  242. package/dist/ai.js +54 -6239
  243. package/dist/aiTesting.d.ts +6 -3
  244. package/dist/aiTesting.js +229 -0
  245. package/dist/aiTesting.js.map +1 -0
  246. package/dist/areas.d.ts +4 -1
  247. package/dist/areas.js +295 -0
  248. package/dist/areas.js.map +1 -0
  249. package/dist/attacks.d.ts +3 -3
  250. package/dist/attacks.js +127 -0
  251. package/dist/attacks.js.map +1 -0
  252. package/dist/burning.d.ts +267 -0
  253. package/dist/burning.js +795 -0
  254. package/dist/burning.js.map +1 -0
  255. package/dist/bytes.js +21 -0
  256. package/dist/bytes.js.map +1 -0
  257. package/dist/callings.d.ts +71 -0
  258. package/dist/callings.js +157 -0
  259. package/dist/callings.js.map +1 -0
  260. package/dist/cameraOrders.d.ts +78 -0
  261. package/dist/cameraOrders.js +114 -0
  262. package/dist/cameraOrders.js.map +1 -0
  263. package/dist/camps.d.ts +70 -4
  264. package/dist/camps.js +501 -0
  265. package/dist/camps.js.map +1 -0
  266. package/dist/capture.d.ts +15 -3
  267. package/dist/capture.js +304 -0
  268. package/dist/capture.js.map +1 -0
  269. package/dist/cellLayers.d.ts +78 -13
  270. package/dist/cellLayers.js +275 -0
  271. package/dist/cellLayers.js.map +1 -0
  272. package/dist/cellPatches.d.ts +24 -0
  273. package/dist/cellPatches.js +73 -0
  274. package/dist/cellPatches.js.map +1 -0
  275. package/dist/cinematics.d.ts +10 -5
  276. package/dist/cinematics.js +161 -0
  277. package/dist/cinematics.js.map +1 -0
  278. package/dist/clock.d.ts +2 -2
  279. package/dist/clock.js +78 -0
  280. package/dist/clock.js.map +1 -0
  281. package/dist/commands.d.ts +36 -4
  282. package/dist/commands.js +636 -0
  283. package/dist/commands.js.map +1 -0
  284. package/dist/components.d.ts +31 -10
  285. package/dist/components.js +74 -0
  286. package/dist/components.js.map +1 -0
  287. package/dist/computers.d.ts +4 -4
  288. package/dist/computers.js +194 -0
  289. package/dist/computers.js.map +1 -0
  290. package/dist/concealment.d.ts +25 -2
  291. package/dist/concealment.js +409 -0
  292. package/dist/concealment.js.map +1 -0
  293. package/dist/coreComponents.js +130 -0
  294. package/dist/coreComponents.js.map +1 -0
  295. package/dist/createGame.d.ts +306 -0
  296. package/dist/createGame.js +405 -0
  297. package/dist/createGame.js.map +1 -0
  298. package/dist/dashing.d.ts +18 -2
  299. package/dist/dashing.js +41 -0
  300. package/dist/dashing.js.map +1 -0
  301. package/dist/debug.d.ts +8 -0
  302. package/dist/debug.js +5 -3
  303. package/dist/debug2.js +76 -0
  304. package/dist/debug2.js.map +1 -0
  305. package/dist/debugCommands.d.ts +6 -6
  306. package/dist/debugCommands.js +537 -0
  307. package/dist/debugCommands.js.map +1 -0
  308. package/dist/debugging.d.ts +1 -0
  309. package/dist/defaultSets.d.ts +183 -0
  310. package/dist/defaultSets.js +216 -0
  311. package/dist/defaultSets.js.map +1 -0
  312. package/dist/definitions.d.ts +6 -0
  313. package/dist/definitions.js +78 -0
  314. package/dist/definitions.js.map +1 -0
  315. package/dist/defs.d.ts +1895 -165
  316. package/dist/defs.js +380 -0
  317. package/dist/defs.js.map +1 -0
  318. package/dist/denying.d.ts +4 -4
  319. package/dist/denying.js +106 -0
  320. package/dist/denying.js.map +1 -0
  321. package/dist/destructibles.d.ts +2 -2
  322. package/dist/destructibles.js +36 -0
  323. package/dist/destructibles.js.map +1 -0
  324. package/dist/determinism.d.ts +4 -4
  325. package/dist/determinism.js +247 -0
  326. package/dist/determinism.js.map +1 -0
  327. package/dist/dialog.d.ts +17 -2
  328. package/dist/dialog.js +108 -0
  329. package/dist/dialog.js.map +1 -0
  330. package/dist/effectRefs.js +28 -0
  331. package/dist/effectRefs.js.map +1 -0
  332. package/dist/effects.d.ts +27 -11
  333. package/dist/effects.js +110 -0
  334. package/dist/effects.js.map +1 -0
  335. package/dist/endings.d.ts +1 -1
  336. package/dist/endings.js +78 -0
  337. package/dist/endings.js.map +1 -0
  338. package/dist/engagement.d.ts +40 -6
  339. package/dist/engagement.js +530 -0
  340. package/dist/engagement.js.map +1 -0
  341. package/dist/engineEvents.d.ts +72 -9
  342. package/dist/engineEvents.js +520 -0
  343. package/dist/engineEvents.js.map +1 -0
  344. package/dist/entity.d.ts +275 -26
  345. package/dist/entity.js +441 -0
  346. package/dist/entity.js.map +1 -0
  347. package/dist/entityIndex.d.ts +10 -3
  348. package/dist/entityIndex.js +149 -0
  349. package/dist/entityIndex.js.map +1 -0
  350. package/dist/errors.d.ts +6 -2
  351. package/dist/errors.js +59 -0
  352. package/dist/errors.js.map +1 -0
  353. package/dist/events.d.ts +11 -5
  354. package/dist/events.js +158 -0
  355. package/dist/events.js.map +1 -0
  356. package/dist/exactMath.js +273 -0
  357. package/dist/exactMath.js.map +1 -0
  358. package/dist/features.d.ts +1 -1
  359. package/dist/features.js +127 -0
  360. package/dist/features.js.map +1 -0
  361. package/dist/fields.d.ts +25 -5
  362. package/dist/fields.js +140 -0
  363. package/dist/fields.js.map +1 -0
  364. package/dist/fixture.d.ts +3 -3
  365. package/dist/fixture.js +512 -0
  366. package/dist/fixture.js.map +1 -0
  367. package/dist/fog.d.ts +26 -3
  368. package/dist/fog.js +333 -0
  369. package/dist/fog.js.map +1 -0
  370. package/dist/foliage.d.ts +476 -0
  371. package/dist/foliage.js +1478 -0
  372. package/dist/foliage.js.map +1 -0
  373. package/dist/foliageDebug.d.ts +57 -0
  374. package/dist/foliageDebug.js +172 -0
  375. package/dist/foliageDebug.js.map +1 -0
  376. package/dist/foliageRegrowth.d.ts +20 -0
  377. package/dist/foliageRegrowth.js +332 -0
  378. package/dist/foliageRegrowth.js.map +1 -0
  379. package/dist/formState.d.ts +67 -0
  380. package/dist/formState.js +65 -0
  381. package/dist/formState.js.map +1 -0
  382. package/dist/formation.d.ts +46 -8
  383. package/dist/formation.js +297 -0
  384. package/dist/formation.js.map +1 -0
  385. package/dist/forms.d.ts +58 -0
  386. package/dist/forms.js +146 -0
  387. package/dist/forms.js.map +1 -0
  388. package/dist/friendlyFire.d.ts +2 -2
  389. package/dist/friendlyFire.js +37 -0
  390. package/dist/friendlyFire.js.map +1 -0
  391. package/dist/game.d.ts +141 -48
  392. package/dist/game.js +834 -0
  393. package/dist/game.js.map +1 -0
  394. package/dist/gameData.d.ts +96 -22
  395. package/dist/gameData.js +1690 -0
  396. package/dist/gameData.js.map +1 -0
  397. package/dist/gameFiles.d.ts +3 -3
  398. package/dist/gameFiles.js +14 -0
  399. package/dist/gameFiles.js.map +1 -0
  400. package/dist/gates.js +92 -0
  401. package/dist/gates.js.map +1 -0
  402. package/dist/generate.d.ts +28 -1
  403. package/dist/generate.js +1062 -0
  404. package/dist/generate.js.map +1 -0
  405. package/dist/generateWorker.d.ts +7 -3
  406. package/dist/generateWorker.js +86 -0
  407. package/dist/generateWorker.js.map +1 -0
  408. package/dist/grid.d.ts +9 -0
  409. package/dist/grid.js +102 -0
  410. package/dist/grid.js.map +1 -0
  411. package/dist/ground.d.ts +17 -1
  412. package/dist/ground.js +375 -0
  413. package/dist/ground.js.map +1 -0
  414. package/dist/groundObjects.d.ts +70 -0
  415. package/dist/groundObjects.js +371 -0
  416. package/dist/groundObjects.js.map +1 -0
  417. package/dist/groundSpeed.d.ts +20 -3
  418. package/dist/groundSpeed.js +117 -0
  419. package/dist/groundSpeed.js.map +1 -0
  420. package/dist/hero.d.ts +126 -10
  421. package/dist/hero.js +432 -0
  422. package/dist/hero.js.map +1 -0
  423. package/dist/holds.d.ts +94 -0
  424. package/dist/holds.js +305 -0
  425. package/dist/holds.js.map +1 -0
  426. package/dist/home.d.ts +1 -1
  427. package/dist/home.js +30 -0
  428. package/dist/home.js.map +1 -0
  429. package/dist/hooks.d.ts +339 -57
  430. package/dist/hooks.js +105 -0
  431. package/dist/hooks.js.map +1 -0
  432. package/dist/hotReload.d.ts +6 -5
  433. package/dist/hotReload.js +145 -0
  434. package/dist/hotReload.js.map +1 -0
  435. package/dist/ids.d.ts +3 -3
  436. package/dist/ids.js +30 -0
  437. package/dist/ids.js.map +1 -0
  438. package/dist/idsFile.d.ts +36 -0
  439. package/dist/idsFile.js +134 -0
  440. package/dist/idsFile.js.map +1 -0
  441. package/dist/index.d.ts +105 -68
  442. package/dist/index.js +194 -4701
  443. package/dist/inspect.d.ts +29 -2
  444. package/dist/{inspect-D9dWHmZ0.js → inspect.js} +21 -12
  445. package/dist/inspect.js.map +1 -0
  446. package/dist/inventory.d.ts +14 -1
  447. package/dist/inventory.js +84 -0
  448. package/dist/inventory.js.map +1 -0
  449. package/dist/items.d.ts +136 -8
  450. package/dist/items.js +585 -0
  451. package/dist/items.js.map +1 -0
  452. package/dist/lanes.d.ts +12 -3
  453. package/dist/lanes.js +496 -0
  454. package/dist/lanes.js.map +1 -0
  455. package/dist/life.d.ts +6 -2
  456. package/dist/life.js +287 -0
  457. package/dist/life.js.map +1 -0
  458. package/dist/log.d.ts +26 -3
  459. package/dist/log.js +192 -0
  460. package/dist/log.js.map +1 -0
  461. package/dist/manaBurn.d.ts +2 -2
  462. package/dist/manaBurn.js +75 -0
  463. package/dist/manaBurn.js.map +1 -0
  464. package/dist/map/file.d.ts +56 -3
  465. package/dist/map/file.js +264 -0
  466. package/dist/map/file.js.map +1 -0
  467. package/dist/map/images.js +61 -0
  468. package/dist/map/images.js.map +1 -0
  469. package/dist/map/look.d.ts +1 -1
  470. package/dist/map/look.js +30 -0
  471. package/dist/map/look.js.map +1 -0
  472. package/dist/map/pathProfile.js +183 -0
  473. package/dist/map/pathProfile.js.map +1 -0
  474. package/dist/map/resize.d.ts +4 -0
  475. package/dist/map/resize.js +136 -0
  476. package/dist/map/resize.js.map +1 -0
  477. package/dist/map/schema.js +257 -0
  478. package/dist/map/schema.js.map +1 -0
  479. package/dist/map/terrain.js +214 -0
  480. package/dist/map/terrain.js.map +1 -0
  481. package/dist/map/types.d.ts +92 -13
  482. package/dist/map/types.js +251 -0
  483. package/dist/map/types.js.map +1 -0
  484. package/dist/mapCheck/cells.js +94 -0
  485. package/dist/mapCheck/cells.js.map +1 -0
  486. package/dist/mapCheck/rules/foliage.d.ts +9 -0
  487. package/dist/mapCheck/rules/foliage.js +83 -0
  488. package/dist/mapCheck/rules/foliage.js.map +1 -0
  489. package/dist/mapCheck/rules/names.js +39 -0
  490. package/dist/mapCheck/rules/names.js.map +1 -0
  491. package/dist/mapCheck/rules/objects.d.ts +1 -1
  492. package/dist/mapCheck/rules/objects.js +56 -0
  493. package/dist/mapCheck/rules/objects.js.map +1 -0
  494. package/dist/mapCheck/rules/paths.js +32 -0
  495. package/dist/mapCheck/rules/paths.js.map +1 -0
  496. package/dist/mapCheck/rules/players.js +20 -0
  497. package/dist/mapCheck/rules/players.js.map +1 -0
  498. package/dist/mapCheck/rules/races.js +56 -0
  499. package/dist/mapCheck/rules/races.js.map +1 -0
  500. package/dist/mapCheck/rules/random.js +47 -0
  501. package/dist/mapCheck/rules/random.js.map +1 -0
  502. package/dist/mapCheck/rules/regions.js +30 -0
  503. package/dist/mapCheck/rules/regions.js.map +1 -0
  504. package/dist/mapCheck/rules/targets.js +31 -0
  505. package/dist/mapCheck/rules/targets.js.map +1 -0
  506. package/dist/mapCheck/rules/walking.js +45 -0
  507. package/dist/mapCheck/rules/walking.js.map +1 -0
  508. package/dist/mapCheck.d.ts +2 -2
  509. package/dist/mapCheck.js +63 -0
  510. package/dist/mapCheck.js.map +1 -0
  511. package/dist/mapFields.d.ts +25 -2
  512. package/dist/mapFields.js +134 -0
  513. package/dist/mapFields.js.map +1 -0
  514. package/dist/mapFile.js +176 -0
  515. package/dist/mapFile.js.map +1 -0
  516. package/dist/mapMeasure.d.ts +8 -0
  517. package/dist/mapMeasure.js +283 -0
  518. package/dist/mapMeasure.js.map +1 -0
  519. package/dist/mapMerge.d.ts +1 -0
  520. package/dist/mapMerge.js +172 -0
  521. package/dist/mapMerge.js.map +1 -0
  522. package/dist/mapObjectives.js +138 -0
  523. package/dist/mapObjectives.js.map +1 -0
  524. package/dist/mapObjects.js +80 -0
  525. package/dist/mapObjects.js.map +1 -0
  526. package/dist/math.d.ts +37 -7
  527. package/dist/math.js +155 -0
  528. package/dist/math.js.map +1 -0
  529. package/dist/messages.d.ts +71 -4
  530. package/dist/messages.js +29 -0
  531. package/dist/messages.js.map +1 -0
  532. package/dist/missionRules.d.ts +10 -2
  533. package/dist/{missionRules-C-bGxm0Q.js → missionRules.js} +30 -150
  534. package/dist/missionRules.js.map +1 -0
  535. package/dist/mods.d.ts +39 -20
  536. package/dist/mods.js +271 -0
  537. package/dist/mods.js.map +1 -0
  538. package/dist/moves.d.ts +87 -0
  539. package/dist/moves.js +539 -0
  540. package/dist/moves.js.map +1 -0
  541. package/dist/names.d.ts +7 -0
  542. package/dist/names.js +122 -0
  543. package/dist/names.js.map +1 -0
  544. package/dist/navigation/agentParams.js +14 -0
  545. package/dist/navigation/agentParams.js.map +1 -0
  546. package/dist/navigation/air.d.ts +7 -3
  547. package/dist/navigation/air.js +401 -0
  548. package/dist/navigation/air.js.map +1 -0
  549. package/dist/navigation/builds.d.ts +34 -2
  550. package/dist/navigation/builds.js +287 -0
  551. package/dist/navigation/builds.js.map +1 -0
  552. package/dist/navigation/groundAreas.d.ts +59 -1
  553. package/dist/navigation/groundAreas.js +407 -0
  554. package/dist/navigation/groundAreas.js.map +1 -0
  555. package/dist/navigation/navigation.d.ts +98 -9
  556. package/dist/navigation/recast.d.ts +194 -18
  557. package/dist/navigation/recast.js +1379 -0
  558. package/dist/navigation/recast.js.map +1 -0
  559. package/dist/navigation/sidePaths.d.ts +8 -3
  560. package/dist/navigation/sidePaths.js +241 -0
  561. package/dist/navigation/sidePaths.js.map +1 -0
  562. package/dist/navigation/sized.js +243 -0
  563. package/dist/navigation/sized.js.map +1 -0
  564. package/dist/nearest.js +32 -0
  565. package/dist/nearest.js.map +1 -0
  566. package/dist/noise.js +59 -0
  567. package/dist/noise.js.map +1 -0
  568. package/dist/objectives.d.ts +12 -3
  569. package/dist/objectives.js +144 -0
  570. package/dist/objectives.js.map +1 -0
  571. package/dist/orders/basic.d.ts +5 -5
  572. package/dist/orders/basic.js +417 -0
  573. package/dist/orders/basic.js.map +1 -0
  574. package/dist/orders/build.js +278 -0
  575. package/dist/orders/build.js.map +1 -0
  576. package/dist/orders/cast.d.ts +13 -3
  577. package/dist/orders/cast.js +558 -0
  578. package/dist/orders/cast.js.map +1 -0
  579. package/dist/orders/facts.js +16 -0
  580. package/dist/orders/facts.js.map +1 -0
  581. package/dist/orders/harvest.d.ts +21 -5
  582. package/dist/orders/harvest.js +540 -0
  583. package/dist/orders/harvest.js.map +1 -0
  584. package/dist/orders/idle.d.ts +3 -1
  585. package/dist/orders/idle.js +234 -0
  586. package/dist/orders/idle.js.map +1 -0
  587. package/dist/orders/items.js +92 -0
  588. package/dist/orders/items.js.map +1 -0
  589. package/dist/orders/queue.js +108 -0
  590. package/dist/orders/queue.js.map +1 -0
  591. package/dist/orders/waiting.d.ts +39 -0
  592. package/dist/orders/waiting.js +149 -0
  593. package/dist/orders/waiting.js.map +1 -0
  594. package/dist/pack.schema.js +13 -0
  595. package/dist/pack.schema.js.map +1 -0
  596. package/dist/pack.schema.json +7622 -841
  597. package/dist/packs/director/index.d.ts +13 -5
  598. package/dist/packs/director/index.js +204 -0
  599. package/dist/packs/director/index.js.map +1 -0
  600. package/dist/packs/heroes/campaign.d.ts +3 -2
  601. package/dist/packs/heroes/campaign.js +241 -0
  602. package/dist/packs/heroes/campaign.js.map +1 -0
  603. package/dist/packs/heroes/carry.d.ts +6 -0
  604. package/dist/packs/heroes/carry.js +112 -0
  605. package/dist/packs/heroes/carry.js.map +1 -0
  606. package/dist/packs/heroes/commands.js +115 -0
  607. package/dist/packs/heroes/commands.js.map +1 -0
  608. package/dist/packs/heroes/fallen.d.ts +43 -0
  609. package/dist/packs/heroes/fallen.js +61 -0
  610. package/dist/packs/heroes/fallen.js.map +1 -0
  611. package/dist/packs/heroes/hire.js +60 -0
  612. package/dist/packs/heroes/hire.js.map +1 -0
  613. package/dist/packs/heroes/index.d.ts +7 -6
  614. package/dist/packs/heroes/index.js +130 -0
  615. package/dist/packs/heroes/index.js.map +1 -0
  616. package/dist/packs/heroes/loop.d.ts +95 -0
  617. package/dist/packs/heroes/loop.js +250 -0
  618. package/dist/packs/heroes/loop.js.map +1 -0
  619. package/dist/packs/heroes/making.d.ts +6 -3
  620. package/dist/packs/heroes/making.js +55 -0
  621. package/dist/packs/heroes/making.js.map +1 -0
  622. package/dist/packs/heroes/respawn.d.ts +3 -3
  623. package/dist/packs/heroes/respawn.js +87 -0
  624. package/dist/packs/heroes/respawn.js.map +1 -0
  625. package/dist/packs/heroes/sets.d.ts +32 -0
  626. package/dist/packs/heroes/sets.js +51 -0
  627. package/dist/packs/heroes/sets.js.map +1 -0
  628. package/dist/packs/heroes/spells.d.ts +16 -0
  629. package/dist/packs/heroes/spells.js +269 -0
  630. package/dist/packs/heroes/spells.js.map +1 -0
  631. package/dist/packs/items/defaults.d.ts +43 -0
  632. package/dist/packs/items/defaults.js +1504 -0
  633. package/dist/packs/items/defaults.js.map +1 -0
  634. package/dist/packs/items/index.d.ts +27 -0
  635. package/dist/packs/items/index.js +214 -0
  636. package/dist/packs/items/index.js.map +1 -0
  637. package/dist/packs/moba/index.d.ts +3 -3
  638. package/dist/packs/moba/index.js +174 -0
  639. package/dist/packs/moba/index.js.map +1 -0
  640. package/dist/packs/pack.d.ts +15 -15
  641. package/dist/packs/pack.js +14 -0
  642. package/dist/packs/pack.js.map +1 -0
  643. package/dist/packs.d.ts +15 -7
  644. package/dist/packs.js +222 -0
  645. package/dist/packs.js.map +1 -0
  646. package/dist/paths.d.ts +2 -0
  647. package/dist/paths.js +109 -0
  648. package/dist/paths.js.map +1 -0
  649. package/dist/plain.js +57 -0
  650. package/dist/plain.js.map +1 -0
  651. package/dist/player.d.ts +33 -10
  652. package/dist/player.js +159 -0
  653. package/dist/player.js.map +1 -0
  654. package/dist/portals.d.ts +1 -1
  655. package/dist/portals.js +194 -0
  656. package/dist/portals.js.map +1 -0
  657. package/dist/prefabs.d.ts +25 -2
  658. package/dist/prefabs.js +239 -0
  659. package/dist/prefabs.js.map +1 -0
  660. package/dist/presetBuildings.js +58 -0
  661. package/dist/presetBuildings.js.map +1 -0
  662. package/dist/presetFoliage.d.ts +27 -0
  663. package/dist/presetFoliage.js +98 -0
  664. package/dist/presetFoliage.js.map +1 -0
  665. package/dist/presetGround.js +65 -0
  666. package/dist/presetGround.js.map +1 -0
  667. package/dist/proxies.d.ts +12 -0
  668. package/dist/proxies.js +79 -0
  669. package/dist/proxies.js.map +1 -0
  670. package/dist/query.d.ts +56 -0
  671. package/dist/query.js +88 -0
  672. package/dist/query.js.map +1 -0
  673. package/dist/races.d.ts +15 -14
  674. package/dist/races.js +172 -0
  675. package/dist/races.js.map +1 -0
  676. package/dist/randomGroups.js +91 -0
  677. package/dist/randomGroups.js.map +1 -0
  678. package/dist/registry.d.ts +117 -53
  679. package/dist/registry.js +323 -0
  680. package/dist/registry.js.map +1 -0
  681. package/dist/remains.d.ts +11 -9
  682. package/dist/remains.js +188 -0
  683. package/dist/remains.js.map +1 -0
  684. package/dist/replication.d.ts +12 -7
  685. package/dist/replication.js +100 -0
  686. package/dist/replication.js.map +1 -0
  687. package/dist/rng.d.ts +2 -0
  688. package/dist/rng.js +40 -0
  689. package/dist/rng.js.map +1 -0
  690. package/dist/rules.d.ts +186 -99
  691. package/dist/rules.js +179 -0
  692. package/dist/rules.js.map +1 -0
  693. package/dist/rulesCheck.d.ts +5 -4
  694. package/dist/rulesCheck.js +693 -0
  695. package/dist/rulesCheck.js.map +1 -0
  696. package/dist/runes.d.ts +2 -2
  697. package/dist/runes.js +80 -0
  698. package/dist/runes.js.map +1 -0
  699. package/dist/save.d.ts +37 -12
  700. package/dist/save.js +532 -0
  701. package/dist/save.js.map +1 -0
  702. package/dist/scenario.d.ts +2 -2
  703. package/dist/scenario.js +99 -0
  704. package/dist/scenario.js.map +1 -0
  705. package/dist/scheduler.d.ts +3 -0
  706. package/dist/scheduler.js +156 -0
  707. package/dist/scheduler.js.map +1 -0
  708. package/dist/score.d.ts +19 -19
  709. package/dist/score.js +709 -0
  710. package/dist/score.js.map +1 -0
  711. package/dist/sequences.d.ts +10 -6
  712. package/dist/sequences.js +206 -0
  713. package/dist/sequences.js.map +1 -0
  714. package/dist/server/doorman.js +154 -0
  715. package/dist/server/doorman.js.map +1 -0
  716. package/dist/server/gameServer.d.ts +16 -1
  717. package/dist/server/gameServer.js +643 -0
  718. package/dist/server/gameServer.js.map +1 -0
  719. package/dist/server/index.d.ts +1 -1
  720. package/dist/server/lobby.js +199 -0
  721. package/dist/server/lobby.js.map +1 -0
  722. package/dist/server/log.js +18 -0
  723. package/dist/server/log.js.map +1 -0
  724. package/dist/server/match.js +267 -0
  725. package/dist/server/match.js.map +1 -0
  726. package/dist/server/mode.d.ts +18 -9
  727. package/dist/server/mode.js +220 -0
  728. package/dist/server/mode.js.map +1 -0
  729. package/dist/{navigation-worker.js → server/navigation-worker.js} +1 -1
  730. package/dist/server/navigation-worker.js.map +1 -0
  731. package/dist/server/navigation.js +39 -0
  732. package/dist/server/navigation.js.map +1 -0
  733. package/dist/server/ops.d.ts +4 -0
  734. package/dist/server/ops.js +137 -0
  735. package/dist/server/ops.js.map +1 -0
  736. package/dist/server/packs.d.ts +3 -3
  737. package/dist/server/packs.js +32 -0
  738. package/dist/server/packs.js.map +1 -0
  739. package/dist/server/ratings.d.ts +5 -0
  740. package/dist/server/ratings.js +104 -0
  741. package/dist/server/ratings.js.map +1 -0
  742. package/dist/server/relay.d.ts +12 -2
  743. package/dist/server/relay.js +144 -0
  744. package/dist/server/relay.js.map +1 -0
  745. package/dist/server/rooms.d.ts +9 -2
  746. package/dist/server/rooms.js +442 -0
  747. package/dist/server/rooms.js.map +1 -0
  748. package/dist/server/seat.js +116 -0
  749. package/dist/server/seat.js.map +1 -0
  750. package/dist/server/seatSettings.d.ts +3 -3
  751. package/dist/server/seatSettings.js +63 -0
  752. package/dist/server/seatSettings.js.map +1 -0
  753. package/dist/server/secret.js +13 -0
  754. package/dist/server/secret.js.map +1 -0
  755. package/dist/server/start.d.ts +13 -6
  756. package/dist/server/start.js +76 -0
  757. package/dist/server/start.js.map +1 -0
  758. package/dist/server/websocket.d.ts +9 -1
  759. package/dist/server/websocket.js +306 -0
  760. package/dist/server/websocket.js.map +1 -0
  761. package/dist/server.js +15 -2861
  762. package/dist/session/can.js +26 -0
  763. package/dist/session/can.js.map +1 -0
  764. package/dist/session/commandReplay.d.ts +8 -2
  765. package/dist/session/commandReplay.js +293 -0
  766. package/dist/session/commandReplay.js.map +1 -0
  767. package/dist/session/debug.js +151 -0
  768. package/dist/session/debug.js.map +1 -0
  769. package/dist/session/delay.js +62 -0
  770. package/dist/session/delay.js.map +1 -0
  771. package/dist/session/delta.d.ts +14 -1
  772. package/dist/session/delta.js +407 -0
  773. package/dist/session/delta.js.map +1 -0
  774. package/dist/session/entityState.js +415 -0
  775. package/dist/session/entityState.js.map +1 -0
  776. package/dist/session/local.d.ts +47 -5
  777. package/dist/session/local.js +670 -0
  778. package/dist/session/local.js.map +1 -0
  779. package/dist/session/memory.d.ts +20 -2
  780. package/dist/session/memory.js +131 -0
  781. package/dist/session/memory.js.map +1 -0
  782. package/dist/session/protocol.d.ts +325 -31
  783. package/dist/session/protocol.js +55 -0
  784. package/dist/session/protocol.js.map +1 -0
  785. package/dist/session/remote.d.ts +74 -12
  786. package/dist/session/remote.js +1394 -0
  787. package/dist/session/remote.js.map +1 -0
  788. package/dist/session/replay.d.ts +11 -2
  789. package/dist/session/replay.js +160 -0
  790. package/dist/session/replay.js.map +1 -0
  791. package/dist/session/seed.js +12 -0
  792. package/dist/session/seed.js.map +1 -0
  793. package/dist/session/share.d.ts +5 -1
  794. package/dist/session/share.js +94 -0
  795. package/dist/session/share.js.map +1 -0
  796. package/dist/session/socket.d.ts +1 -1
  797. package/dist/session/socket.js +29 -0
  798. package/dist/session/socket.js.map +1 -0
  799. package/dist/session/wire.d.ts +5 -0
  800. package/dist/session/wire.js +84 -0
  801. package/dist/session/wire.js.map +1 -0
  802. package/dist/session/worker.d.ts +77 -12
  803. package/dist/session/worker.js +499 -0
  804. package/dist/session/worker.js.map +1 -0
  805. package/dist/shared.d.ts +31 -5
  806. package/dist/shared.js +166 -0
  807. package/dist/shared.js.map +1 -0
  808. package/dist/sides.d.ts +9 -3
  809. package/dist/sides.js +149 -0
  810. package/dist/sides.js.map +1 -0
  811. package/dist/sight.js +85 -0
  812. package/dist/sight.js.map +1 -0
  813. package/dist/simulate-worker.js +1 -1
  814. package/dist/simulate.d.ts +12 -8
  815. package/dist/{simulate-oXBiw1Ff.js → simulate.js} +10 -11
  816. package/dist/simulate.js.map +1 -0
  817. package/dist/smart.js +77 -0
  818. package/dist/smart.js.map +1 -0
  819. package/dist/spatial.d.ts +32 -16
  820. package/dist/spatial.js +234 -0
  821. package/dist/spatial.js.map +1 -0
  822. package/dist/spawning.d.ts +1 -0
  823. package/dist/spawning.js +224 -0
  824. package/dist/spawning.js.map +1 -0
  825. package/dist/stances.d.ts +6 -3
  826. package/dist/stances.js +169 -0
  827. package/dist/stances.js.map +1 -0
  828. package/dist/start.d.ts +10 -10
  829. package/dist/start.js +75 -0
  830. package/dist/start.js.map +1 -0
  831. package/dist/stats.d.ts +42 -16
  832. package/dist/stats.js +290 -0
  833. package/dist/stats.js.map +1 -0
  834. package/dist/summoned.d.ts +52 -0
  835. package/dist/summoned.js +38 -0
  836. package/dist/summoned.js.map +1 -0
  837. package/dist/summons.d.ts +10 -13
  838. package/dist/summons.js +271 -0
  839. package/dist/summons.js.map +1 -0
  840. package/dist/systems/abilities.js +224 -0
  841. package/dist/systems/abilities.js.map +1 -0
  842. package/dist/systems/combat.d.ts +35 -1
  843. package/dist/systems/combat.js +677 -0
  844. package/dist/systems/combat.js.map +1 -0
  845. package/dist/systems/combatTold.d.ts +3 -1
  846. package/dist/systems/combatTold.js +85 -0
  847. package/dist/systems/combatTold.js.map +1 -0
  848. package/dist/systems/construction.js +80 -0
  849. package/dist/systems/construction.js.map +1 -0
  850. package/dist/systems/economy.d.ts +0 -6
  851. package/dist/systems/economy.js +128 -0
  852. package/dist/systems/economy.js.map +1 -0
  853. package/dist/systems/fog.d.ts +1 -1
  854. package/dist/systems/fog.js +120 -0
  855. package/dist/systems/fog.js.map +1 -0
  856. package/dist/systems/life.js +32 -0
  857. package/dist/systems/life.js.map +1 -0
  858. package/dist/systems/movement.d.ts +24 -12
  859. package/dist/systems/movement.js +1247 -0
  860. package/dist/systems/movement.js.map +1 -0
  861. package/dist/systems/orders.js +64 -0
  862. package/dist/systems/orders.js.map +1 -0
  863. package/dist/systems/production.js +322 -0
  864. package/dist/systems/production.js.map +1 -0
  865. package/dist/systems/productionQueue.js +120 -0
  866. package/dist/systems/productionQueue.js.map +1 -0
  867. package/dist/systems/victory.d.ts +1 -1
  868. package/dist/systems/victory.js +56 -0
  869. package/dist/systems/victory.js.map +1 -0
  870. package/dist/talk.d.ts +6 -6
  871. package/dist/talk.js +153 -0
  872. package/dist/talk.js.map +1 -0
  873. package/dist/targeting.d.ts +142 -0
  874. package/dist/targeting.js +49 -0
  875. package/dist/targeting.js.map +1 -0
  876. package/dist/tech.d.ts +20 -3
  877. package/dist/tech.js +239 -0
  878. package/dist/tech.js.map +1 -0
  879. package/dist/techTree.d.ts +7 -0
  880. package/dist/techTree.js +90 -0
  881. package/dist/techTree.js.map +1 -0
  882. package/dist/terrain.d.ts +59 -7
  883. package/dist/terrain.js +389 -0
  884. package/dist/terrain.js.map +1 -0
  885. package/dist/terrainSave.d.ts +6 -0
  886. package/dist/terrainSave.js +74 -0
  887. package/dist/terrainSave.js.map +1 -0
  888. package/dist/testing.d.ts +8 -7
  889. package/dist/testing.js +13 -739
  890. package/dist/testing.js.map +1 -1
  891. package/dist/tiles.d.ts +1 -1
  892. package/dist/tiles.js +43 -0
  893. package/dist/tiles.js.map +1 -0
  894. package/dist/timers.d.ts +29 -4
  895. package/dist/timers.js +242 -0
  896. package/dist/timers.js.map +1 -0
  897. package/dist/tomes.d.ts +4 -4
  898. package/dist/tomes.js +94 -0
  899. package/dist/tomes.js.map +1 -0
  900. package/dist/trade.js +103 -0
  901. package/dist/trade.js.map +1 -0
  902. package/dist/transport.d.ts +6 -1
  903. package/dist/transport.js +281 -0
  904. package/dist/transport.js.map +1 -0
  905. package/dist/tunables.d.ts +10 -3
  906. package/dist/tunables.js +56 -0
  907. package/dist/tunables.js.map +1 -0
  908. package/dist/unitResources.d.ts +67 -0
  909. package/dist/unitResources.js +266 -0
  910. package/dist/unitResources.js.map +1 -0
  911. package/dist/upkeep.d.ts +6 -1
  912. package/dist/upkeep.js +26 -0
  913. package/dist/upkeep.js.map +1 -0
  914. package/dist/veterancy.d.ts +8 -3
  915. package/dist/veterancy.js +131 -0
  916. package/dist/veterancy.js.map +1 -0
  917. package/dist/vision.d.ts +36 -0
  918. package/dist/vision.js +133 -0
  919. package/dist/vision.js.map +1 -0
  920. package/dist/walls.d.ts +1 -1
  921. package/dist/walls.js +278 -0
  922. package/dist/walls.js.map +1 -0
  923. package/dist/world.d.ts +606 -88
  924. package/dist/world.js +1263 -0
  925. package/dist/world.js.map +1 -0
  926. package/package.json +2 -2
  927. package/dist/ai.js.map +0 -1
  928. package/dist/attributes.d.ts +0 -66
  929. package/dist/brain-BvVdUhX8.js +0 -7659
  930. package/dist/brain-BvVdUhX8.js.map +0 -1
  931. package/dist/builds-C6LfgvEU.js +0 -460
  932. package/dist/builds-C6LfgvEU.js.map +0 -1
  933. package/dist/coreComponents-syuh2fPG.js +0 -5149
  934. package/dist/coreComponents-syuh2fPG.js.map +0 -1
  935. package/dist/debugCommands-CzjrSm66.js +0 -14739
  936. package/dist/debugCommands-CzjrSm66.js.map +0 -1
  937. package/dist/determinism-BCymQwiE.js +0 -518
  938. package/dist/determinism-BCymQwiE.js.map +0 -1
  939. package/dist/game-DiJEN-Ks.js +0 -5800
  940. package/dist/game-DiJEN-Ks.js.map +0 -1
  941. package/dist/index.js.map +0 -1
  942. package/dist/inspect-D9dWHmZ0.js.map +0 -1
  943. package/dist/local-Dkovq42k.js +0 -1379
  944. package/dist/local-Dkovq42k.js.map +0 -1
  945. package/dist/missionRules-C-bGxm0Q.js.map +0 -1
  946. package/dist/navigation-worker.js.map +0 -1
  947. package/dist/packs-g5thvmGn.js +0 -3199
  948. package/dist/packs-g5thvmGn.js.map +0 -1
  949. package/dist/profiles-B3NS9jwk.js.map +0 -1
  950. package/dist/server.js.map +0 -1
  951. package/dist/simulate-oXBiw1Ff.js.map +0 -1
package/dist/terrain.d.ts CHANGED
@@ -1,7 +1,13 @@
1
1
  import { type Vec2 } from './math';
2
- /** @beta */
2
+ /**
3
+ * A triangle mesh of the ground: vertex positions and the triangles' indices
4
+ *
5
+ * @beta
6
+ */
3
7
  export interface TerrainMesh {
8
+ /** Vertex positions as x, y, z triples */
4
9
  positions: Float32Array;
10
+ /** Vertex indices, three to a triangle */
5
11
  indices: Uint32Array;
6
12
  }
7
13
  /**
@@ -10,9 +16,17 @@ export interface TerrainMesh {
10
16
  * @beta
11
17
  */
12
18
  export declare const WATER_NONE = 0;
13
- /** @beta */
19
+ /**
20
+ * Water that can be waded through, a `Terrain.water` value
21
+ *
22
+ * @beta
23
+ */
14
24
  export declare const WATER_SHALLOW = 1;
15
- /** @beta */
25
+ /**
26
+ * Water that nothing on foot crosses, a `Terrain.water` value
27
+ *
28
+ * @beta
29
+ */
16
30
  export declare const WATER_DEEP = 2;
17
31
  /**
18
32
  * Water and paint of a terrain, next to its shape. Left out for plain ground
@@ -31,6 +45,12 @@ export interface TerrainSurface {
31
45
  /** The game's own layers of cells (`CellLayerDef`), by id: a value per cell, row by row */
32
46
  cells?: Record<string, Uint8Array>;
33
47
  }
48
+ /**
49
+ * Whether one on foot may walk a cell, as the ground's walkable mesh has it (`Terrain.buildMesh(true)`): not deep
50
+ * water unless a bridge (3) crosses it, nothing that blocks walking (2), and in play. What the navigation's tiles
51
+ * cut alone are made of too (`RecastNavigation.groundChanged`)
52
+ */
53
+ export declare function walkedCell(terrain: Terrain, ix: number, iz: number): boolean;
34
54
  /**
35
55
  * Heightfield ground. World space spans [0, width] x [0, depth] with one height sample per unit.
36
56
  * Rendering, navigation and the simulation all read from this same data.
@@ -42,10 +62,15 @@ export interface TerrainSurface {
42
62
  * @beta
43
63
  */
44
64
  export declare class Terrain {
65
+ /** Cells across the map, east-west */
45
66
  readonly width: number;
67
+ /** Cells along the map, north-south */
46
68
  readonly depth: number;
69
+ /** Height per vertex, row by row, (`width` + 1) by (`depth` + 1) */
47
70
  readonly heights: Float32Array;
71
+ /** Height samples across the map: `width` + 1 */
48
72
  readonly vertsX: number;
73
+ /** Height samples along the map: `depth` + 1 */
49
74
  readonly vertsZ: number;
50
75
  /** Level per cell, row by row. The fog works out what is seen from them once: `world.fog.levelsChanged()` after writing to them in a running world */
51
76
  readonly levels: Uint8Array;
@@ -72,7 +97,13 @@ export declare class Terrain {
72
97
  width: number;
73
98
  depth: number;
74
99
  };
75
- constructor(width: number, depth: number, heights: Float32Array, levels?: Uint8Array, surface?: TerrainSurface);
100
+ constructor(
101
+ /** Cells across the map, east-west */
102
+ width: number,
103
+ /** Cells along the map, north-south */
104
+ depth: number,
105
+ /** Height per vertex, row by row, (`width` + 1) by (`depth` + 1) */
106
+ heights: Float32Array, levels?: Uint8Array, surface?: TerrainSurface);
76
107
  /** The value of a layer of cells (`cells`) at a point: 0 off the ground, or where the layer is not there */
77
108
  cellAt(layer: string, x: number, z: number): number;
78
109
  /** A layer of cells, made empty when it is not there yet */
@@ -86,9 +117,11 @@ export declare class Terrain {
86
117
  inPlay(cx: number, cz: number): boolean;
87
118
  /** `WATER_*` of the cell a point is in */
88
119
  waterAt(x: number, z: number): number;
120
+ /** The height at a vertex, its indices clamped to the map */
89
121
  vertexHeight(ix: number, iz: number): number;
90
122
  /** Level of the cell a point is in */
91
123
  levelAt(x: number, z: number): number;
124
+ /** Whether a point is inside the map */
92
125
  contains(x: number, z: number): boolean;
93
126
  /** Height at any point, interpolated over the same triangles `buildMesh` produces. */
94
127
  heightAt(x: number, z: number): number;
@@ -106,7 +139,11 @@ export declare class Terrain {
106
139
  y: number;
107
140
  z: number;
108
141
  } | null;
109
- /** @param walkable leaves out what nothing on foot may cross, for the navigation */
142
+ /**
143
+ * Builds the triangle mesh of the ground; `walkable` leaves out what nothing on foot may cross
144
+ *
145
+ * @param walkable leaves out what nothing on foot may cross, for the navigation
146
+ */
110
147
  buildMesh(walkable?: boolean): TerrainMesh;
111
148
  /** Whether any cell is deep water: what boats go on */
112
149
  get hasDeepWater(): boolean;
@@ -135,17 +172,28 @@ export interface RampSpec {
135
172
  * @beta
136
173
  */
137
174
  export interface PlateauSpec {
175
+ /** East-west centre of the plateau, in world units */
138
176
  x: number;
177
+ /** North-south centre of the plateau, in world units */
139
178
  z: number;
179
+ /** How far the plateau reaches from its centre, in world units */
140
180
  radius: number;
141
181
  /** How many levels it rises above what is around it. One when left out */
142
182
  levels?: number;
183
+ /** The ramps that lead up to it; cliffs everywhere else */
143
184
  ramps?: RampSpec[];
144
185
  }
145
- /** @beta */
186
+ /**
187
+ * What `generateTerrain` makes ground from: size, seed, hills, rocks, flats and plateaus
188
+ *
189
+ * @beta
190
+ */
146
191
  export interface TerrainGenOptions {
192
+ /** Cells across the map */
147
193
  width: number;
194
+ /** Cells along the map */
148
195
  depth: number;
196
+ /** Seed for the generator, so the same options make the same ground */
149
197
  seed: number;
150
198
  /** Height of the rolling hills */
151
199
  hillHeight?: number;
@@ -169,5 +217,9 @@ export interface TerrainGenOptions {
169
217
  /** How much higher one level stands than the one below */
170
218
  cliffHeight?: number;
171
219
  }
172
- /** @beta */
220
+ /**
221
+ * Makes ground from the options: rolling hills, rocks, flat spots and plateaus, from their seed
222
+ *
223
+ * @beta
224
+ */
173
225
  export declare function generateTerrain(options: TerrainGenOptions): Terrain;
@@ -0,0 +1,389 @@
1
+ import { atan, atan2, cos, hypot, sin } from "./exactMath.js";
2
+ import { TAU, clamp, smoothstep } from "./math.js";
3
+ import { Rng } from "./rng.js";
4
+ //#region src/terrain.ts
5
+ /**
6
+ * What covers a cell: nothing, water that can be waded through, or water nothing on foot crosses
7
+ *
8
+ * @beta
9
+ */
10
+ var WATER_NONE = 0;
11
+ /**
12
+ * Water that can be waded through, a `Terrain.water` value
13
+ *
14
+ * @beta
15
+ */
16
+ var WATER_SHALLOW = 1;
17
+ /**
18
+ * Water that nothing on foot crosses, a `Terrain.water` value
19
+ *
20
+ * @beta
21
+ */
22
+ var WATER_DEEP = 2;
23
+ /**
24
+ * Whether one on foot may walk a cell, as the ground's walkable mesh has it (`Terrain.buildMesh(true)`): not deep
25
+ * water unless a bridge (3) crosses it, nothing that blocks walking (2), and in play. What the navigation's tiles
26
+ * cut alone are made of too (`RecastNavigation.groundChanged`)
27
+ */
28
+ function walkedCell(terrain, ix, iz) {
29
+ const cell = iz * terrain.width + ix;
30
+ const blocked = terrain.blocked[cell];
31
+ return !(terrain.water[cell] === 2 && blocked !== 3 || blocked === 2 || !terrain.inPlay(ix, iz));
32
+ }
33
+ /**
34
+ * Heightfield ground. World space spans [0, width] x [0, depth] with one height sample per unit.
35
+ * Rendering, navigation and the simulation all read from this same data.
36
+ *
37
+ * Next to the height, every cell has a level: the ground floor is 0, each cliff up is one more. The height is
38
+ * what things stand on and where the eye sees a cliff, the level is what the rules go by: who sees whom
39
+ * and who shoots uphill. Ramps belong to the lower level until halfway up.
40
+ *
41
+ * @beta
42
+ */
43
+ var Terrain = class {
44
+ width;
45
+ depth;
46
+ heights;
47
+ /** Height samples across the map: `width` + 1 */
48
+ vertsX;
49
+ /** Height samples along the map: `depth` + 1 */
50
+ vertsZ;
51
+ /** Level per cell, row by row. The fog works out what is seen from them once: `world.fog.levelsChanged()` after writing to them in a running world */
52
+ levels;
53
+ /** `WATER_*` per cell, row by row */
54
+ water;
55
+ /** Height of the surface of the water per vertex */
56
+ waterHeights;
57
+ /** Paint per cell, row by row */
58
+ tiles;
59
+ /** What scenery keeps off each cell, row by row: 1 building there, 2 walking and building (see `MapDoodad.blocks`) */
60
+ blocked;
61
+ /**
62
+ * The game's own layers of cells, by id (`CellLayerDef`): where the bushes are, what burns. A value per cell, row by
63
+ * row; a layer nobody has painted is not there, and reads 0 everywhere (`cellAt`)
64
+ */
65
+ cells;
66
+ /**
67
+ * The part of the map play happens in, in cells, when it is not all of it (`GameMap.bounds`): nothing on foot goes
68
+ * outside it, nothing is built there, and the camera keeps to it. The edge beyond is scenery
69
+ */
70
+ bounds;
71
+ constructor(width, depth, heights, levels, surface = {}) {
72
+ this.width = width;
73
+ this.depth = depth;
74
+ this.heights = heights;
75
+ this.vertsX = width + 1;
76
+ this.vertsZ = depth + 1;
77
+ const cells = width * depth;
78
+ if (heights.length !== this.vertsX * this.vertsZ) throw new Error("Terrain: heights do not match the size");
79
+ if (levels && levels.length !== cells) throw new Error("Terrain: levels do not match the size");
80
+ if (surface.water && surface.water.length !== cells) throw new Error("Terrain: water does not match the size");
81
+ if (surface.tiles && surface.tiles.length !== cells) throw new Error("Terrain: tiles do not match the size");
82
+ this.levels = levels ?? new Uint8Array(cells);
83
+ this.water = surface.water ?? new Uint8Array(cells);
84
+ this.waterHeights = surface.waterHeights ?? new Float32Array(heights.length);
85
+ this.tiles = surface.tiles ?? new Uint8Array(cells);
86
+ if (surface.blocked && surface.blocked.length !== cells) throw new Error("Terrain: what is blocked does not match the size");
87
+ this.blocked = surface.blocked ?? new Uint8Array(cells);
88
+ this.cells = {};
89
+ for (const [id, layer] of Object.entries(surface.cells ?? {})) {
90
+ if (layer.length !== cells) throw new Error(`Terrain: the cells of ${id} do not match the size`);
91
+ this.cells[id] = layer;
92
+ }
93
+ }
94
+ /** The value of a layer of cells (`cells`) at a point: 0 off the ground, or where the layer is not there */
95
+ cellAt(layer, x, z) {
96
+ const cells = this.cells[layer];
97
+ if (!cells || x < 0 || z < 0 || x >= this.width || z >= this.depth) return 0;
98
+ return cells[Math.floor(z) * this.width + Math.floor(x)];
99
+ }
100
+ /** A layer of cells, made empty when it is not there yet */
101
+ cellLayer(layer) {
102
+ return this.cells[layer] ??= new Uint8Array(this.width * this.depth);
103
+ }
104
+ /**
105
+ * Becomes another terrain, of whatever size, in place: what holds on to this one (the camera, what draws the ground)
106
+ * sees the new one. For the editor, when a map is resized
107
+ */
108
+ replace(other) {
109
+ Object.assign(this, {
110
+ width: other.width,
111
+ depth: other.depth,
112
+ vertsX: other.vertsX,
113
+ vertsZ: other.vertsZ,
114
+ heights: other.heights,
115
+ levels: other.levels,
116
+ water: other.water,
117
+ waterHeights: other.waterHeights,
118
+ tiles: other.tiles,
119
+ blocked: other.blocked,
120
+ cells: other.cells,
121
+ bounds: other.bounds
122
+ });
123
+ }
124
+ /** Whether a cell is in the part of the map play happens in (`bounds`) */
125
+ inPlay(cx, cz) {
126
+ const { bounds } = this;
127
+ return !bounds || cx >= bounds.x && cz >= bounds.z && cx < bounds.x + bounds.width && cz < bounds.z + bounds.depth;
128
+ }
129
+ /** `WATER_*` of the cell a point is in */
130
+ waterAt(x, z) {
131
+ const cx = clamp(Math.floor(x), 0, this.width - 1);
132
+ const cz = clamp(Math.floor(z), 0, this.depth - 1);
133
+ return this.water[cz * this.width + cx];
134
+ }
135
+ /** The height at a vertex, its indices clamped to the map */
136
+ vertexHeight(ix, iz) {
137
+ return this.heights[clamp(iz, 0, this.depth) * this.vertsX + clamp(ix, 0, this.width)];
138
+ }
139
+ /** Level of the cell a point is in */
140
+ levelAt(x, z) {
141
+ const cx = clamp(Math.floor(x), 0, this.width - 1);
142
+ const cz = clamp(Math.floor(z), 0, this.depth - 1);
143
+ return this.levels[cz * this.width + cx];
144
+ }
145
+ /** Whether a point is inside the map */
146
+ contains(x, z) {
147
+ return x >= 0 && z >= 0 && x <= this.width && z <= this.depth;
148
+ }
149
+ /** Height at any point, interpolated over the same triangles `buildMesh` produces. */
150
+ heightAt(x, z) {
151
+ x = clamp(x, 0, this.width);
152
+ z = clamp(z, 0, this.depth);
153
+ const ix = Math.min(Math.floor(x), this.width - 1);
154
+ const iz = Math.min(Math.floor(z), this.depth - 1);
155
+ const fx = x - ix;
156
+ const fz = z - iz;
157
+ const i = iz * this.vertsX + ix;
158
+ const a = this.heights[i];
159
+ const b = this.heights[i + 1];
160
+ const c = this.heights[i + this.vertsX];
161
+ const d = this.heights[i + this.vertsX + 1];
162
+ if (fx + fz <= 1) return a + (b - a) * fx + (c - a) * fz;
163
+ return d + (c - d) * (1 - fx) + (b - d) * (1 - fz);
164
+ }
165
+ /** Surface normal (unnormalized y is always positive). */
166
+ normalAt(x, z, out) {
167
+ const e = .5;
168
+ const dx = this.heightAt(x + e, z) - this.heightAt(x - e, z);
169
+ const dz = this.heightAt(x, z + e) - this.heightAt(x, z - e);
170
+ const len = Math.sqrt(dx * dx + dz * dz + 1);
171
+ out.x = -dx / len;
172
+ out.y = 1 / len;
173
+ out.z = -dz / len;
174
+ }
175
+ /** Steepness in radians, 0 = flat. */
176
+ slopeAt(x, z) {
177
+ const e = .5;
178
+ const dx = this.heightAt(x + e, z) - this.heightAt(x - e, z);
179
+ const dz = this.heightAt(x, z + e) - this.heightAt(x, z - e);
180
+ return atan(Math.sqrt(dx * dx + dz * dz));
181
+ }
182
+ /** First intersection of a ray with the ground, or null. */
183
+ raycast(ox, oy, oz, dx, dy, dz, maxDist = 500) {
184
+ const step = .5;
185
+ let prevT = 0;
186
+ let prevAbove = oy - this.heightAt(ox, oz) > 0 || !this.contains(ox, oz);
187
+ for (let t = step; t <= maxDist; t += step) {
188
+ const x = ox + dx * t;
189
+ const z = oz + dz * t;
190
+ const above = !this.contains(x, z) || oy + dy * t > this.heightAt(x, z);
191
+ if (prevAbove && !above) {
192
+ let lo = prevT;
193
+ let hi = t;
194
+ for (let i = 0; i < 12; i++) {
195
+ const mid = (lo + hi) / 2;
196
+ const mx = ox + dx * mid;
197
+ const mz = oz + dz * mid;
198
+ if (oy + dy * mid > this.heightAt(mx, mz)) lo = mid;
199
+ else hi = mid;
200
+ }
201
+ const x2 = ox + dx * hi;
202
+ const z2 = oz + dz * hi;
203
+ return {
204
+ x: x2,
205
+ y: this.heightAt(x2, z2),
206
+ z: z2
207
+ };
208
+ }
209
+ prevAbove = above;
210
+ prevT = t;
211
+ }
212
+ return null;
213
+ }
214
+ /**
215
+ * Builds the triangle mesh of the ground; `walkable` leaves out what nothing on foot may cross
216
+ *
217
+ * @param walkable leaves out what nothing on foot may cross, for the navigation
218
+ */
219
+ buildMesh(walkable = false) {
220
+ const { vertsX, vertsZ, width, depth } = this;
221
+ const positions = new Float32Array(vertsX * vertsZ * 3);
222
+ for (let iz = 0; iz < vertsZ; iz++) for (let ix = 0; ix < vertsX; ix++) {
223
+ const i = iz * vertsX + ix;
224
+ positions[i * 3] = ix;
225
+ positions[i * 3 + 1] = this.heights[i];
226
+ positions[i * 3 + 2] = iz;
227
+ }
228
+ const indices = new Uint32Array(width * depth * 6);
229
+ let n = 0;
230
+ for (let iz = 0; iz < depth; iz++) for (let ix = 0; ix < width; ix++) {
231
+ if (walkable && !walkedCell(this, ix, iz)) continue;
232
+ const a = iz * vertsX + ix;
233
+ const b = a + 1;
234
+ const c = a + vertsX;
235
+ const d = c + 1;
236
+ indices[n++] = a;
237
+ indices[n++] = c;
238
+ indices[n++] = b;
239
+ indices[n++] = b;
240
+ indices[n++] = c;
241
+ indices[n++] = d;
242
+ }
243
+ return {
244
+ positions,
245
+ indices: n === indices.length ? indices : indices.slice(0, n)
246
+ };
247
+ }
248
+ /** Whether any cell is deep water: what boats go on */
249
+ get hasDeepWater() {
250
+ return this.water.includes(2);
251
+ }
252
+ /**
253
+ * The deep water as a mesh, at its surface: where what goes on water can go (`UnitTypeDef.naval`). Under a bridge
254
+ * too. Empty where the map has no deep water
255
+ */
256
+ buildWaterMesh() {
257
+ const { vertsX, vertsZ, width, depth } = this;
258
+ const positions = new Float32Array(vertsX * vertsZ * 3);
259
+ for (let iz = 0; iz < vertsZ; iz++) for (let ix = 0; ix < vertsX; ix++) {
260
+ const i = iz * vertsX + ix;
261
+ positions[i * 3] = ix;
262
+ positions[i * 3 + 1] = this.waterHeights[i];
263
+ positions[i * 3 + 2] = iz;
264
+ }
265
+ const indices = [];
266
+ for (let iz = 0; iz < depth; iz++) for (let ix = 0; ix < width; ix++) {
267
+ if (this.water[iz * width + ix] !== 2 || !this.inPlay(ix, iz)) continue;
268
+ const a = iz * vertsX + ix;
269
+ indices.push(a, a + vertsX, a + 1, a + 1, a + vertsX, a + vertsX + 1);
270
+ }
271
+ return {
272
+ positions,
273
+ indices: Uint32Array.from(indices)
274
+ };
275
+ }
276
+ /** The height of the water's surface at a point, over the same triangles as the ground */
277
+ waterHeightAt(x, z) {
278
+ x = clamp(x, 0, this.width);
279
+ z = clamp(z, 0, this.depth);
280
+ const ix = Math.min(Math.floor(x), this.width - 1);
281
+ const iz = Math.min(Math.floor(z), this.depth - 1);
282
+ const fx = x - ix;
283
+ const fz = z - iz;
284
+ const i = iz * this.vertsX + ix;
285
+ const a = this.waterHeights[i];
286
+ const b = this.waterHeights[i + 1];
287
+ const c = this.waterHeights[i + this.vertsX];
288
+ const d = this.waterHeights[i + this.vertsX + 1];
289
+ if (fx + fz <= 1) return a + (b - a) * fx + (c - a) * fz;
290
+ return d + (c - d) * (1 - fx) + (b - d) * (1 - fz);
291
+ }
292
+ };
293
+ /** A ramp is this many times as long as it is high. Gentle enough to walk, too steep to build on */
294
+ var RAMP_SLOPE = 2.5;
295
+ var RAMP_WIDTH = 6;
296
+ /**
297
+ * How far up the plateau a point is: 1 on top, 0 below, in between on a ramp.
298
+ * The edge wobbles a little so plateaus are not perfect circles.
299
+ */
300
+ function plateauShape(plateau, cliffHeight, rng) {
301
+ const { levels = 1 } = plateau;
302
+ const length = levels * cliffHeight * RAMP_SLOPE;
303
+ const wobble = [rng.next() * TAU, rng.next() * TAU];
304
+ const edgeAt = (angle) => plateau.radius * (1 + .05 * sin(3 * angle + wobble[0]) + .03 * sin(5 * angle + wobble[1]));
305
+ const ramps = (plateau.ramps ?? []).map((ramp) => {
306
+ const angle = atan2(ramp.towards.x - plateau.x, ramp.towards.z - plateau.z);
307
+ return {
308
+ sin: sin(angle),
309
+ cos: cos(angle),
310
+ halfWidth: (ramp.width ?? RAMP_WIDTH) / 2,
311
+ edge: edgeAt(angle)
312
+ };
313
+ });
314
+ return (x, z) => {
315
+ const dx = x - plateau.x;
316
+ const dz = z - plateau.z;
317
+ for (const ramp of ramps) {
318
+ const across = Math.abs(dx * ramp.cos - dz * ramp.sin);
319
+ const along = dx * ramp.sin + dz * ramp.cos;
320
+ const top = ramp.edge - length / 2;
321
+ if (across > ramp.halfWidth || along < top) continue;
322
+ return 1 - smoothstep(0, 1, (along - top) / length);
323
+ }
324
+ return hypot(dx, dz) < edgeAt(atan2(dx, dz)) ? 1 : 0;
325
+ };
326
+ }
327
+ /**
328
+ * Makes ground from the options: rolling hills, rocks, flat spots and plateaus, from their seed
329
+ *
330
+ * @beta
331
+ */
332
+ function generateTerrain(options) {
333
+ const { width, depth, seed, hillHeight = 2.5, hillScale = 28, rocks = [], flats = [], plateaus = [], cliffHeight = 3 } = options;
334
+ const rng = new Rng(seed);
335
+ const latticeSize = 64;
336
+ const lattice = /* @__PURE__ */ new Float32Array(4096);
337
+ for (let i = 0; i < lattice.length; i++) lattice[i] = rng.next();
338
+ const shapes = plateaus.map((plateau) => ({
339
+ levels: plateau.levels ?? 1,
340
+ shape: plateauShape(plateau, cliffHeight, rng)
341
+ }));
342
+ const latticeAt = (x, z) => lattice[(z % latticeSize + latticeSize) % latticeSize * latticeSize + (x % latticeSize + latticeSize) % latticeSize];
343
+ const noise = (x, z) => {
344
+ const ix = Math.floor(x);
345
+ const iz = Math.floor(z);
346
+ const fx = smoothstep(0, 1, x - ix);
347
+ const fz = smoothstep(0, 1, z - iz);
348
+ const top = latticeAt(ix, iz) + (latticeAt(ix + 1, iz) - latticeAt(ix, iz)) * fx;
349
+ return top + (latticeAt(ix, iz + 1) + (latticeAt(ix + 1, iz + 1) - latticeAt(ix, iz + 1)) * fx - top) * fz;
350
+ };
351
+ const vertsX = width + 1;
352
+ const heights = new Float32Array(vertsX * (depth + 1));
353
+ for (let iz = 0; iz <= depth; iz++) for (let ix = 0; ix <= width; ix++) {
354
+ let h = 0;
355
+ let amplitude = 1;
356
+ let frequency = 1 / hillScale;
357
+ let total = 0;
358
+ for (let octave = 0; octave < 3; octave++) {
359
+ h += noise(ix * frequency, iz * frequency) * amplitude;
360
+ total += amplitude;
361
+ amplitude *= .4;
362
+ frequency *= 2.3;
363
+ }
364
+ h = h / total * hillHeight;
365
+ for (const flat of flats) {
366
+ const d = hypot(ix - flat.x, iz - flat.z);
367
+ const flatHeight = hillHeight * .5;
368
+ const blend = smoothstep(0, 1, (d - flat.radius) / (flat.radius * .6));
369
+ h = flatHeight + (h - flatHeight) * blend;
370
+ }
371
+ for (const { levels, shape } of shapes) h += shape(ix, iz) * levels * cliffHeight;
372
+ for (const rock of rocks) {
373
+ const d = hypot(ix - rock.x, iz - rock.z);
374
+ if (d < rock.radius) h += rock.height * smoothstep(0, 1, 1 - d / rock.radius);
375
+ }
376
+ heights[iz * vertsX + ix] = h;
377
+ }
378
+ const levels = new Uint8Array(width * depth);
379
+ if (shapes.length) for (let cz = 0; cz < depth; cz++) for (let cx = 0; cx < width; cx++) {
380
+ let level = 0;
381
+ for (const shape of shapes) if (shape.shape(cx + .5, cz + .5) >= .5) level += shape.levels;
382
+ levels[cz * width + cx] = level;
383
+ }
384
+ return new Terrain(width, depth, heights, levels);
385
+ }
386
+ //#endregion
387
+ export { Terrain, WATER_DEEP, WATER_NONE, WATER_SHALLOW, generateTerrain, walkedCell };
388
+
389
+ //# sourceMappingURL=terrain.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terrain.js","names":[],"sources":["../src/terrain.ts"],"sourcesContent":["import { clamp, smoothstep, TAU, type Vec2 } from './math'\nimport { Rng } from './rng'\nimport { atan, atan2, cos, hypot, sin } from './exactMath'\n\n/**\n * A triangle mesh of the ground: vertex positions and the triangles' indices\n *\n * @beta\n */\nexport interface TerrainMesh {\n\t/** Vertex positions as x, y, z triples */\n\tpositions: Float32Array\n\t/** Vertex indices, three to a triangle */\n\tindices: Uint32Array\n}\n\n/**\n * What covers a cell: nothing, water that can be waded through, or water nothing on foot crosses\n *\n * @beta\n */\nexport const WATER_NONE = 0\n/**\n * Water that can be waded through, a `Terrain.water` value\n *\n * @beta\n */\nexport const WATER_SHALLOW = 1\n/**\n * Water that nothing on foot crosses, a `Terrain.water` value\n *\n * @beta\n */\nexport const WATER_DEEP = 2\n\n/**\n * Water and paint of a terrain, next to its shape. Left out for plain ground\n *\n * @beta\n */\nexport interface TerrainSurface {\n\t/** `WATER_*` per cell, row by row */\n\twater?: Uint8Array\n\t/** Height of the surface of the water per vertex, for drawing it. Only means something around wet cells */\n\twaterHeights?: Float32Array\n\t/** What the ground is painted with per cell, row by row. 0 is left to the slope, what the rest are is up to the client */\n\ttiles?: Uint8Array\n\t/** What scenery keeps off each cell (`BLOCKS_BUILD`, `BLOCKS_WALK`), row by row: see `MapDoodad.blocks` */\n\tblocked?: Uint8Array\n\t/** The game's own layers of cells (`CellLayerDef`), by id: a value per cell, row by row */\n\tcells?: Record<string, Uint8Array>\n}\n\n/**\n * Whether one on foot may walk a cell, as the ground's walkable mesh has it (`Terrain.buildMesh(true)`): not deep\n * water unless a bridge (3) crosses it, nothing that blocks walking (2), and in play. What the navigation's tiles\n * cut alone are made of too (`RecastNavigation.groundChanged`)\n */\nexport function walkedCell(terrain: Terrain, ix: number, iz: number): boolean {\n\tconst cell = iz * terrain.width + ix\n\tconst blocked = terrain.blocked[cell]\n\treturn !((terrain.water[cell] === WATER_DEEP && blocked !== 3) || blocked === 2 || !terrain.inPlay(ix, iz))\n}\n\n/**\n * Heightfield ground. World space spans [0, width] x [0, depth] with one height sample per unit.\n * Rendering, navigation and the simulation all read from this same data.\n *\n * Next to the height, every cell has a level: the ground floor is 0, each cliff up is one more. The height is\n * what things stand on and where the eye sees a cliff, the level is what the rules go by: who sees whom\n * and who shoots uphill. Ramps belong to the lower level until halfway up.\n *\n * @beta\n */\nexport class Terrain {\n\t/** Height samples across the map: `width` + 1 */\n\treadonly vertsX: number\n\t/** Height samples along the map: `depth` + 1 */\n\treadonly vertsZ: number\n\t/** Level per cell, row by row. The fog works out what is seen from them once: `world.fog.levelsChanged()` after writing to them in a running world */\n\treadonly levels: Uint8Array\n\t/** `WATER_*` per cell, row by row */\n\treadonly water: Uint8Array\n\t/** Height of the surface of the water per vertex */\n\treadonly waterHeights: Float32Array\n\t/** Paint per cell, row by row */\n\treadonly tiles: Uint8Array\n\t/** What scenery keeps off each cell, row by row: 1 building there, 2 walking and building (see `MapDoodad.blocks`) */\n\treadonly blocked: Uint8Array\n\t/**\n\t * The game's own layers of cells, by id (`CellLayerDef`): where the bushes are, what burns. A value per cell, row by\n\t * row; a layer nobody has painted is not there, and reads 0 everywhere (`cellAt`)\n\t */\n\treadonly cells: Record<string, Uint8Array>\n\t/**\n\t * The part of the map play happens in, in cells, when it is not all of it (`GameMap.bounds`): nothing on foot goes\n\t * outside it, nothing is built there, and the camera keeps to it. The edge beyond is scenery\n\t */\n\tbounds?: { x: number; z: number; width: number; depth: number }\n\n\tconstructor(\n\t\t/** Cells across the map, east-west */\n\t\treadonly width: number,\n\t\t/** Cells along the map, north-south */\n\t\treadonly depth: number,\n\t\t/** Height per vertex, row by row, (`width` + 1) by (`depth` + 1) */\n\t\treadonly heights: Float32Array,\n\t\tlevels?: Uint8Array,\n\t\tsurface: TerrainSurface = {}\n\t) {\n\t\tthis.vertsX = width + 1\n\t\tthis.vertsZ = depth + 1\n\t\tconst cells = width * depth\n\t\tif (heights.length !== this.vertsX * this.vertsZ) throw new Error('Terrain: heights do not match the size')\n\t\tif (levels && levels.length !== cells) throw new Error('Terrain: levels do not match the size')\n\t\tif (surface.water && surface.water.length !== cells) throw new Error('Terrain: water does not match the size')\n\t\tif (surface.tiles && surface.tiles.length !== cells) throw new Error('Terrain: tiles do not match the size')\n\t\tthis.levels = levels ?? new Uint8Array(cells)\n\t\tthis.water = surface.water ?? new Uint8Array(cells)\n\t\tthis.waterHeights = surface.waterHeights ?? new Float32Array(heights.length)\n\t\tthis.tiles = surface.tiles ?? new Uint8Array(cells)\n\t\tif (surface.blocked && surface.blocked.length !== cells) throw new Error('Terrain: what is blocked does not match the size')\n\t\tthis.blocked = surface.blocked ?? new Uint8Array(cells)\n\t\tthis.cells = {}\n\t\tfor (const [id, layer] of Object.entries(surface.cells ?? {})) {\n\t\t\tif (layer.length !== cells) throw new Error(`Terrain: the cells of ${id} do not match the size`)\n\t\t\tthis.cells[id] = layer\n\t\t}\n\t}\n\n\t/** The value of a layer of cells (`cells`) at a point: 0 off the ground, or where the layer is not there */\n\tcellAt(layer: string, x: number, z: number): number {\n\t\tconst cells = this.cells[layer]\n\t\tif (!cells || x < 0 || z < 0 || x >= this.width || z >= this.depth) return 0\n\t\treturn cells[Math.floor(z) * this.width + Math.floor(x)]\n\t}\n\n\t/** A layer of cells, made empty when it is not there yet */\n\tcellLayer(layer: string): Uint8Array {\n\t\treturn (this.cells[layer] ??= new Uint8Array(this.width * this.depth))\n\t}\n\n\t/**\n\t * Becomes another terrain, of whatever size, in place: what holds on to this one (the camera, what draws the ground)\n\t * sees the new one. For the editor, when a map is resized\n\t */\n\treplace(other: Terrain): void {\n\t\tObject.assign(this, {\n\t\t\twidth: other.width,\n\t\t\tdepth: other.depth,\n\t\t\tvertsX: other.vertsX,\n\t\t\tvertsZ: other.vertsZ,\n\t\t\theights: other.heights,\n\t\t\tlevels: other.levels,\n\t\t\twater: other.water,\n\t\t\twaterHeights: other.waterHeights,\n\t\t\ttiles: other.tiles,\n\t\t\tblocked: other.blocked,\n\t\t\tcells: other.cells,\n\t\t\tbounds: other.bounds\n\t\t})\n\t}\n\n\t/** Whether a cell is in the part of the map play happens in (`bounds`) */\n\tinPlay(cx: number, cz: number): boolean {\n\t\tconst { bounds } = this\n\t\treturn !bounds || (cx >= bounds.x && cz >= bounds.z && cx < bounds.x + bounds.width && cz < bounds.z + bounds.depth)\n\t}\n\n\t/** `WATER_*` of the cell a point is in */\n\twaterAt(x: number, z: number): number {\n\t\tconst cx = clamp(Math.floor(x), 0, this.width - 1)\n\t\tconst cz = clamp(Math.floor(z), 0, this.depth - 1)\n\t\treturn this.water[cz * this.width + cx]\n\t}\n\n\t/** The height at a vertex, its indices clamped to the map */\n\tvertexHeight(ix: number, iz: number): number {\n\t\treturn this.heights[clamp(iz, 0, this.depth) * this.vertsX + clamp(ix, 0, this.width)]\n\t}\n\n\t/** Level of the cell a point is in */\n\tlevelAt(x: number, z: number): number {\n\t\tconst cx = clamp(Math.floor(x), 0, this.width - 1)\n\t\tconst cz = clamp(Math.floor(z), 0, this.depth - 1)\n\t\treturn this.levels[cz * this.width + cx]\n\t}\n\n\t/** Whether a point is inside the map */\n\tcontains(x: number, z: number): boolean {\n\t\treturn x >= 0 && z >= 0 && x <= this.width && z <= this.depth\n\t}\n\n\t/** Height at any point, interpolated over the same triangles `buildMesh` produces. */\n\theightAt(x: number, z: number): number {\n\t\tx = clamp(x, 0, this.width)\n\t\tz = clamp(z, 0, this.depth)\n\t\tconst ix = Math.min(Math.floor(x), this.width - 1)\n\t\tconst iz = Math.min(Math.floor(z), this.depth - 1)\n\t\tconst fx = x - ix\n\t\tconst fz = z - iz\n\t\tconst i = iz * this.vertsX + ix\n\t\tconst a = this.heights[i]\n\t\tconst b = this.heights[i + 1]\n\t\tconst c = this.heights[i + this.vertsX]\n\t\tconst d = this.heights[i + this.vertsX + 1]\n\t\tif (fx + fz <= 1) return a + (b - a) * fx + (c - a) * fz\n\t\treturn d + (c - d) * (1 - fx) + (b - d) * (1 - fz)\n\t}\n\n\t/** Surface normal (unnormalized y is always positive). */\n\tnormalAt(x: number, z: number, out: { x: number; y: number; z: number }): void {\n\t\tconst e = 0.5\n\t\tconst dx = this.heightAt(x + e, z) - this.heightAt(x - e, z)\n\t\tconst dz = this.heightAt(x, z + e) - this.heightAt(x, z - e)\n\t\tconst len = Math.sqrt(dx * dx + dz * dz + 1)\n\t\tout.x = -dx / len\n\t\tout.y = 1 / len\n\t\tout.z = -dz / len\n\t}\n\n\t/** Steepness in radians, 0 = flat. */\n\tslopeAt(x: number, z: number): number {\n\t\tconst e = 0.5\n\t\tconst dx = this.heightAt(x + e, z) - this.heightAt(x - e, z)\n\t\tconst dz = this.heightAt(x, z + e) - this.heightAt(x, z - e)\n\t\treturn atan(Math.sqrt(dx * dx + dz * dz))\n\t}\n\n\t/** First intersection of a ray with the ground, or null. */\n\traycast(ox: number, oy: number, oz: number, dx: number, dy: number, dz: number, maxDist = 500): { x: number; y: number; z: number } | null {\n\t\tconst step = 0.5\n\t\tlet prevT = 0\n\t\tlet prevAbove = oy - this.heightAt(ox, oz) > 0 || !this.contains(ox, oz)\n\t\tfor (let t = step; t <= maxDist; t += step) {\n\t\t\tconst x = ox + dx * t\n\t\t\tconst z = oz + dz * t\n\t\t\tconst inside = this.contains(x, z)\n\t\t\tconst above = !inside || oy + dy * t > this.heightAt(x, z)\n\t\t\tif (prevAbove && !above) {\n\t\t\t\t// crossed the surface between prevT and t\n\t\t\t\tlet lo = prevT\n\t\t\t\tlet hi = t\n\t\t\t\tfor (let i = 0; i < 12; i++) {\n\t\t\t\t\tconst mid = (lo + hi) / 2\n\t\t\t\t\tconst mx = ox + dx * mid\n\t\t\t\t\tconst mz = oz + dz * mid\n\t\t\t\t\tif (oy + dy * mid > this.heightAt(mx, mz)) lo = mid\n\t\t\t\t\telse hi = mid\n\t\t\t\t}\n\t\t\t\tconst x2 = ox + dx * hi\n\t\t\t\tconst z2 = oz + dz * hi\n\t\t\t\treturn { x: x2, y: this.heightAt(x2, z2), z: z2 }\n\t\t\t}\n\t\t\tprevAbove = above\n\t\t\tprevT = t\n\t\t}\n\t\treturn null\n\t}\n\n\t/**\n\t * Builds the triangle mesh of the ground; `walkable` leaves out what nothing on foot may cross\n\t *\n\t * @param walkable leaves out what nothing on foot may cross, for the navigation\n\t */\n\tbuildMesh(walkable = false): TerrainMesh {\n\t\tconst { vertsX, vertsZ, width, depth } = this\n\t\tconst positions = new Float32Array(vertsX * vertsZ * 3)\n\t\tfor (let iz = 0; iz < vertsZ; iz++) {\n\t\t\tfor (let ix = 0; ix < vertsX; ix++) {\n\t\t\t\tconst i = iz * vertsX + ix\n\t\t\t\tpositions[i * 3] = ix\n\t\t\t\tpositions[i * 3 + 1] = this.heights[i]\n\t\t\t\tpositions[i * 3 + 2] = iz\n\t\t\t}\n\t\t}\n\t\tconst indices = new Uint32Array(width * depth * 6)\n\t\tlet n = 0\n\t\tfor (let iz = 0; iz < depth; iz++) {\n\t\t\tfor (let ix = 0; ix < width; ix++) {\n\t\t\t\tif (walkable && !walkedCell(this, ix, iz)) continue\n\t\t\t\tconst a = iz * vertsX + ix\n\t\t\t\tconst b = a + 1\n\t\t\t\tconst c = a + vertsX\n\t\t\t\tconst d = c + 1\n\t\t\t\tindices[n++] = a\n\t\t\t\tindices[n++] = c\n\t\t\t\tindices[n++] = b\n\t\t\t\tindices[n++] = b\n\t\t\t\tindices[n++] = c\n\t\t\t\tindices[n++] = d\n\t\t\t}\n\t\t}\n\t\treturn { positions, indices: n === indices.length ? indices : indices.slice(0, n) }\n\t}\n\n\t/** Whether any cell is deep water: what boats go on */\n\tget hasDeepWater(): boolean {\n\t\treturn this.water.includes(WATER_DEEP)\n\t}\n\n\t/**\n\t * The deep water as a mesh, at its surface: where what goes on water can go (`UnitTypeDef.naval`). Under a bridge\n\t * too. Empty where the map has no deep water\n\t */\n\tbuildWaterMesh(): TerrainMesh {\n\t\tconst { vertsX, vertsZ, width, depth } = this\n\t\tconst positions = new Float32Array(vertsX * vertsZ * 3)\n\t\tfor (let iz = 0; iz < vertsZ; iz++) {\n\t\t\tfor (let ix = 0; ix < vertsX; ix++) {\n\t\t\t\tconst i = iz * vertsX + ix\n\t\t\t\tpositions[i * 3] = ix\n\t\t\t\tpositions[i * 3 + 1] = this.waterHeights[i]\n\t\t\t\tpositions[i * 3 + 2] = iz\n\t\t\t}\n\t\t}\n\t\tconst indices: number[] = []\n\t\tfor (let iz = 0; iz < depth; iz++) {\n\t\t\tfor (let ix = 0; ix < width; ix++) {\n\t\t\t\tif (this.water[iz * width + ix] !== WATER_DEEP || !this.inPlay(ix, iz)) continue\n\t\t\t\tconst a = iz * vertsX + ix\n\t\t\t\tindices.push(a, a + vertsX, a + 1, a + 1, a + vertsX, a + vertsX + 1)\n\t\t\t}\n\t\t}\n\t\treturn { positions, indices: Uint32Array.from(indices) }\n\t}\n\n\t/** The height of the water's surface at a point, over the same triangles as the ground */\n\twaterHeightAt(x: number, z: number): number {\n\t\tx = clamp(x, 0, this.width)\n\t\tz = clamp(z, 0, this.depth)\n\t\tconst ix = Math.min(Math.floor(x), this.width - 1)\n\t\tconst iz = Math.min(Math.floor(z), this.depth - 1)\n\t\tconst fx = x - ix\n\t\tconst fz = z - iz\n\t\tconst i = iz * this.vertsX + ix\n\t\tconst a = this.waterHeights[i]\n\t\tconst b = this.waterHeights[i + 1]\n\t\tconst c = this.waterHeights[i + this.vertsX]\n\t\tconst d = this.waterHeights[i + this.vertsX + 1]\n\t\tif (fx + fz <= 1) return a + (b - a) * fx + (c - a) * fz\n\t\treturn d + (c - d) * (1 - fx) + (b - d) * (1 - fz)\n\t}\n}\n\n/**\n * A way up a plateau\n *\n * @beta\n */\nexport interface RampSpec {\n\t/** The ramp comes down on the side of the plateau that faces this point */\n\ttowards: Vec2\n\t/** How wide it is, in world units */\n\twidth?: number\n}\n\n/**\n * High ground: a roughly round area lifted by whole levels, with cliffs all around except where a ramp leads up\n *\n * @beta\n */\nexport interface PlateauSpec {\n\t/** East-west centre of the plateau, in world units */\n\tx: number\n\t/** North-south centre of the plateau, in world units */\n\tz: number\n\t/** How far the plateau reaches from its centre, in world units */\n\tradius: number\n\t/** How many levels it rises above what is around it. One when left out */\n\tlevels?: number\n\t/** The ramps that lead up to it; cliffs everywhere else */\n\tramps?: RampSpec[]\n}\n\n/**\n * What `generateTerrain` makes ground from: size, seed, hills, rocks, flats and plateaus\n *\n * @beta\n */\nexport interface TerrainGenOptions {\n\t/** Cells across the map */\n\twidth: number\n\t/** Cells along the map */\n\tdepth: number\n\t/** Seed for the generator, so the same options make the same ground */\n\tseed: number\n\t/** Height of the rolling hills */\n\thillHeight?: number\n\t/** Size of the hills in world units */\n\thillScale?: number\n\t/** Steep unwalkable rock formations */\n\trocks?: { x: number; z: number; radius: number; height: number }[]\n\t/** Areas levelled to a constant height, for bases */\n\tflats?: { x: number; z: number; radius: number }[]\n\t/** High ground with cliffs and ramps */\n\tplateaus?: PlateauSpec[]\n\t/** How much higher one level stands than the one below */\n\tcliffHeight?: number\n}\n\n/** A ramp is this many times as long as it is high. Gentle enough to walk, too steep to build on */\nconst RAMP_SLOPE = 2.5\nconst RAMP_WIDTH = 6\n\n/**\n * How far up the plateau a point is: 1 on top, 0 below, in between on a ramp.\n * The edge wobbles a little so plateaus are not perfect circles.\n */\nfunction plateauShape(plateau: PlateauSpec, cliffHeight: number, rng: Rng): (x: number, z: number) => number {\n\tconst { levels = 1 } = plateau\n\tconst length = levels * cliffHeight * RAMP_SLOPE\n\tconst wobble = [rng.next() * TAU, rng.next() * TAU]\n\tconst edgeAt = (angle: number) => plateau.radius * (1 + 0.05 * sin(3 * angle + wobble[0]) + 0.03 * sin(5 * angle + wobble[1]))\n\tconst ramps = (plateau.ramps ?? []).map((ramp) => {\n\t\tconst angle = atan2(ramp.towards.x - plateau.x, ramp.towards.z - plateau.z)\n\t\treturn { sin: sin(angle), cos: cos(angle), halfWidth: (ramp.width ?? RAMP_WIDTH) / 2, edge: edgeAt(angle) }\n\t})\n\treturn (x, z) => {\n\t\tconst dx = x - plateau.x\n\t\tconst dz = z - plateau.z\n\t\tfor (const ramp of ramps) {\n\t\t\tconst across = Math.abs(dx * ramp.cos - dz * ramp.sin)\n\t\t\tconst along = dx * ramp.sin + dz * ramp.cos\n\t\t\t// the ramp straddles the edge, half of it on top of the plateau and half below\n\t\t\tconst top = ramp.edge - length / 2\n\t\t\tif (across > ramp.halfWidth || along < top) continue\n\t\t\treturn 1 - smoothstep(0, 1, (along - top) / length)\n\t\t}\n\t\treturn hypot(dx, dz) < edgeAt(atan2(dx, dz)) ? 1 : 0\n\t}\n}\n\n/**\n * Makes ground from the options: rolling hills, rocks, flat spots and plateaus, from their seed\n *\n * @beta\n */\nexport function generateTerrain(options: TerrainGenOptions): Terrain {\n\tconst { width, depth, seed, hillHeight = 2.5, hillScale = 28, rocks = [], flats = [], plateaus = [], cliffHeight = 3 } = options\n\tconst rng = new Rng(seed)\n\n\tconst latticeSize = 64\n\tconst lattice = new Float32Array(latticeSize * latticeSize)\n\tfor (let i = 0; i < lattice.length; i++) lattice[i] = rng.next()\n\t// after the hills, so that adding a plateau leaves the rest of the map as it was\n\tconst shapes = plateaus.map((plateau) => ({ levels: plateau.levels ?? 1, shape: plateauShape(plateau, cliffHeight, rng) }))\n\tconst latticeAt = (x: number, z: number) =>\n\t\tlattice[(((z % latticeSize) + latticeSize) % latticeSize) * latticeSize + (((x % latticeSize) + latticeSize) % latticeSize)]\n\tconst noise = (x: number, z: number) => {\n\t\tconst ix = Math.floor(x)\n\t\tconst iz = Math.floor(z)\n\t\tconst fx = smoothstep(0, 1, x - ix)\n\t\tconst fz = smoothstep(0, 1, z - iz)\n\t\tconst top = latticeAt(ix, iz) + (latticeAt(ix + 1, iz) - latticeAt(ix, iz)) * fx\n\t\tconst bottom = latticeAt(ix, iz + 1) + (latticeAt(ix + 1, iz + 1) - latticeAt(ix, iz + 1)) * fx\n\t\treturn top + (bottom - top) * fz\n\t}\n\n\tconst vertsX = width + 1\n\tconst heights = new Float32Array(vertsX * (depth + 1))\n\tfor (let iz = 0; iz <= depth; iz++) {\n\t\tfor (let ix = 0; ix <= width; ix++) {\n\t\t\tlet h = 0\n\t\t\tlet amplitude = 1\n\t\t\tlet frequency = 1 / hillScale\n\t\t\tlet total = 0\n\t\t\tfor (let octave = 0; octave < 3; octave++) {\n\t\t\t\th += noise(ix * frequency, iz * frequency) * amplitude\n\t\t\t\ttotal += amplitude\n\t\t\t\tamplitude *= 0.4\n\t\t\t\tfrequency *= 2.3\n\t\t\t}\n\t\t\th = (h / total) * hillHeight\n\n\t\t\tfor (const flat of flats) {\n\t\t\t\tconst d = hypot(ix - flat.x, iz - flat.z)\n\t\t\t\tconst flatHeight = hillHeight * 0.5\n\t\t\t\tconst blend = smoothstep(0, 1, (d - flat.radius) / (flat.radius * 0.6))\n\t\t\t\th = flatHeight + (h - flatHeight) * blend\n\t\t\t}\n\t\t\t// the hills go on on top of the plateaus, which is why these come after the flats\n\t\t\tfor (const { levels, shape } of shapes) h += shape(ix, iz) * levels * cliffHeight\n\t\t\tfor (const rock of rocks) {\n\t\t\t\tconst d = hypot(ix - rock.x, iz - rock.z)\n\t\t\t\tif (d < rock.radius) h += rock.height * smoothstep(0, 1, 1 - d / rock.radius)\n\t\t\t}\n\t\t\theights[iz * vertsX + ix] = h\n\t\t}\n\t}\n\n\tconst levels = new Uint8Array(width * depth)\n\tif (shapes.length) {\n\t\tfor (let cz = 0; cz < depth; cz++) {\n\t\t\tfor (let cx = 0; cx < width; cx++) {\n\t\t\t\tlet level = 0\n\t\t\t\tfor (const shape of shapes) if (shape.shape(cx + 0.5, cz + 0.5) >= 0.5) level += shape.levels\n\t\t\t\tlevels[cz * width + cx] = level\n\t\t\t}\n\t\t}\n\t}\n\treturn new Terrain(width, depth, heights, levels)\n}\n"],"mappings":"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"}
@@ -4,16 +4,22 @@
4
4
  * @beta
5
5
  */
6
6
  export interface TerrainSave {
7
+ /** Cells across the map */
7
8
  width: number;
9
+ /** Cells along the map */
8
10
  depth: number;
9
11
  /**
10
12
  * Each layer as packed bytes (see `packBytes`), or, where every cell holds the same, that value: a map without water
11
13
  * or cliffs, of one ground, says so in a few characters rather than a few hundred thousand
12
14
  */
13
15
  heights: string | number;
16
+ /** The cliff level per cell, packed or as the one value every cell holds */
14
17
  levels: string | number;
18
+ /** The `WATER_*` value per cell, packed or as the one value every cell holds */
15
19
  water: string | number;
20
+ /** The height of the water's surface per vertex, packed or as the one value every vertex holds */
16
21
  waterHeights: string | number;
22
+ /** The paint per cell, packed or as the one value every cell holds */
17
23
  tiles: string | number;
18
24
  /** What scenery keeps off each cell. Left out by saves from before there was any */
19
25
  blocked?: string | number;