redscript-mc 2.6.2 → 3.0.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 (636) hide show
  1. package/.github/workflows/ci.yml +11 -0
  2. package/CHANGELOG.md +18 -9
  3. package/README-benchmarks.md +48 -0
  4. package/README-vscode-test.md +251 -0
  5. package/RELEASE_NOTES.md +74 -0
  6. package/ROADMAP.md +131 -167
  7. package/benchmarks/_shared.ts +468 -0
  8. package/benchmarks/baseline.json +2816 -0
  9. package/benchmarks/baseline.md +13 -0
  10. package/benchmarks/compiler-perf.report.json +207 -0
  11. package/benchmarks/compiler-perf.ts +76 -0
  12. package/benchmarks/results.md +13 -0
  13. package/benchmarks/stdlib-complexity.report.json +2606 -0
  14. package/benchmarks/stdlib-complexity.ts +54 -0
  15. package/benchmarks/stdlib-size.md +57 -0
  16. package/benchmarks/stdlib-size.ts +91 -0
  17. package/coverage-report.md +177 -0
  18. package/dist/src/__tests__/budget.test.js +4 -0
  19. package/dist/src/__tests__/cache/cache-behavior.test.d.ts +10 -0
  20. package/dist/src/__tests__/cache/cache-behavior.test.js +425 -0
  21. package/dist/src/__tests__/cache-extra.test.d.ts +5 -0
  22. package/dist/src/__tests__/cache-extra.test.js +211 -0
  23. package/dist/src/__tests__/cli-init.test.d.ts +1 -0
  24. package/dist/src/__tests__/cli-init.test.js +97 -0
  25. package/dist/src/__tests__/cli-publish.test.d.ts +9 -0
  26. package/dist/src/__tests__/cli-publish.test.js +189 -0
  27. package/dist/src/__tests__/cli.test.js +76 -0
  28. package/dist/src/__tests__/compile-preprocess.test.d.ts +11 -0
  29. package/dist/src/__tests__/compile-preprocess.test.js +328 -0
  30. package/dist/src/__tests__/compiler/break-stmt.test.d.ts +1 -0
  31. package/dist/src/__tests__/compiler/break-stmt.test.js +58 -0
  32. package/dist/src/__tests__/compiler/const-decl.test.d.ts +1 -0
  33. package/dist/src/__tests__/compiler/const-decl.test.js +123 -0
  34. package/dist/src/__tests__/compiler/continue-stmt.test.d.ts +1 -0
  35. package/dist/src/__tests__/compiler/continue-stmt.test.js +67 -0
  36. package/dist/src/__tests__/compiler/coroutine-extended.test.d.ts +17 -0
  37. package/dist/src/__tests__/compiler/coroutine-extended.test.js +565 -0
  38. package/dist/src/__tests__/compiler/deprecated.test.d.ts +4 -0
  39. package/dist/src/__tests__/compiler/deprecated.test.js +285 -0
  40. package/dist/src/__tests__/compiler/do-while.test.d.ts +1 -0
  41. package/dist/src/__tests__/compiler/do-while.test.js +120 -0
  42. package/dist/src/__tests__/compiler/enum-payload.test.d.ts +9 -0
  43. package/dist/src/__tests__/compiler/enum-payload.test.js +272 -0
  44. package/dist/src/__tests__/compiler/interface.test.d.ts +10 -0
  45. package/dist/src/__tests__/compiler/interface.test.js +258 -0
  46. package/dist/src/__tests__/compiler/labeled-loops.test.d.ts +1 -0
  47. package/dist/src/__tests__/compiler/labeled-loops.test.js +263 -0
  48. package/dist/src/__tests__/compiler/match-string.test.d.ts +1 -0
  49. package/dist/src/__tests__/compiler/match-string.test.js +43 -0
  50. package/dist/src/__tests__/compiler/memoize.test.d.ts +1 -0
  51. package/dist/src/__tests__/compiler/memoize.test.js +113 -0
  52. package/dist/src/__tests__/compiler/method-chain.test.d.ts +5 -0
  53. package/dist/src/__tests__/compiler/method-chain.test.js +115 -0
  54. package/dist/src/__tests__/compiler/module-import.test.d.ts +12 -0
  55. package/dist/src/__tests__/compiler/module-import.test.js +261 -0
  56. package/dist/src/__tests__/compiler/option-extensions.test.d.ts +6 -0
  57. package/dist/src/__tests__/compiler/option-extensions.test.js +191 -0
  58. package/dist/src/__tests__/compiler/profile-decorator.test.d.ts +1 -0
  59. package/dist/src/__tests__/compiler/profile-decorator.test.js +69 -0
  60. package/dist/src/__tests__/compiler/string-advanced.test.d.ts +7 -0
  61. package/dist/src/__tests__/compiler/string-advanced.test.js +281 -0
  62. package/dist/src/__tests__/compiler/struct-extends.test.d.ts +1 -0
  63. package/dist/src/__tests__/compiler/struct-extends.test.js +95 -0
  64. package/dist/src/__tests__/compiler/throttle-retry.test.d.ts +1 -0
  65. package/dist/src/__tests__/compiler/throttle-retry.test.js +166 -0
  66. package/dist/src/__tests__/compiler/tuple-type.test.d.ts +10 -0
  67. package/dist/src/__tests__/compiler/tuple-type.test.js +229 -0
  68. package/dist/src/__tests__/compiler/watch-decorator.test.d.ts +1 -0
  69. package/dist/src/__tests__/compiler/watch-decorator.test.js +65 -0
  70. package/dist/src/__tests__/config/project-config.test.d.ts +1 -0
  71. package/dist/src/__tests__/config/project-config.test.js +199 -0
  72. package/dist/src/__tests__/config-decorator.test.d.ts +8 -0
  73. package/dist/src/__tests__/config-decorator.test.js +142 -0
  74. package/dist/src/__tests__/diagnostics-extra.test.d.ts +6 -0
  75. package/dist/src/__tests__/diagnostics-extra.test.js +132 -0
  76. package/dist/src/__tests__/emit/compile-branches.test.d.ts +1 -0
  77. package/dist/src/__tests__/emit/compile-branches.test.js +123 -0
  78. package/dist/src/__tests__/emit/compile-coverage.test.d.ts +25 -0
  79. package/dist/src/__tests__/emit/compile-coverage.test.js +617 -0
  80. package/dist/src/__tests__/emit/compile-extra-branches.test.d.ts +12 -0
  81. package/dist/src/__tests__/emit/compile-extra-branches.test.js +225 -0
  82. package/dist/src/__tests__/emit/compile-mocked-branches.test.d.ts +0 -0
  83. package/dist/src/__tests__/emit/compile-mocked-branches.test.js +238 -0
  84. package/dist/src/__tests__/emit/execute-chain.test.d.ts +10 -0
  85. package/dist/src/__tests__/emit/execute-chain.test.js +94 -0
  86. package/dist/src/__tests__/emit/index.test.js +2 -1
  87. package/dist/src/__tests__/emit/modules-branches.test.d.ts +1 -0
  88. package/dist/src/__tests__/emit/modules-branches.test.js +88 -0
  89. package/dist/src/__tests__/emit/modules-coverage.test.d.ts +15 -0
  90. package/dist/src/__tests__/emit/modules-coverage.test.js +221 -0
  91. package/dist/src/__tests__/emit/modules-errors.test.d.ts +12 -0
  92. package/dist/src/__tests__/emit/modules-errors.test.js +169 -0
  93. package/dist/src/__tests__/emit/modules-rewrite.test.d.ts +17 -0
  94. package/dist/src/__tests__/emit/modules-rewrite.test.js +204 -0
  95. package/dist/src/__tests__/emit/source-map.test.d.ts +1 -0
  96. package/dist/src/__tests__/emit/source-map.test.js +167 -0
  97. package/dist/src/__tests__/enum.test.js +9 -4
  98. package/dist/src/__tests__/error-recovery.test.d.ts +7 -0
  99. package/dist/src/__tests__/error-recovery.test.js +217 -0
  100. package/dist/src/__tests__/events-types-extra.test.d.ts +10 -0
  101. package/dist/src/__tests__/events-types-extra.test.js +91 -0
  102. package/dist/src/__tests__/events-types.test.d.ts +4 -0
  103. package/dist/src/__tests__/events-types.test.js +56 -0
  104. package/dist/src/__tests__/formatter.test.js +13 -5
  105. package/dist/src/__tests__/hir/lower-extra.test.d.ts +9 -0
  106. package/dist/src/__tests__/hir/lower-extra.test.js +140 -0
  107. package/dist/src/__tests__/hir/monomorphize-extra.test.d.ts +15 -0
  108. package/dist/src/__tests__/hir/monomorphize-extra.test.js +200 -0
  109. package/dist/src/__tests__/hir/monomorphize-extra2.test.d.ts +16 -0
  110. package/dist/src/__tests__/hir/monomorphize-extra2.test.js +316 -0
  111. package/dist/src/__tests__/incremental.test.js +10 -2
  112. package/dist/src/__tests__/index-extra.test.d.ts +10 -0
  113. package/dist/src/__tests__/index-extra.test.js +71 -0
  114. package/dist/src/__tests__/lexer.test.js +2 -2
  115. package/dist/src/__tests__/lint/rules.test.d.ts +5 -0
  116. package/dist/src/__tests__/lint/rules.test.js +208 -0
  117. package/dist/src/__tests__/lir/lower.test.js +29 -0
  118. package/dist/src/__tests__/lir/verify.test.js +30 -0
  119. package/dist/src/__tests__/lsp/completion.test.d.ts +7 -0
  120. package/dist/src/__tests__/lsp/completion.test.js +583 -0
  121. package/dist/src/__tests__/lsp/definition.test.d.ts +7 -0
  122. package/dist/src/__tests__/lsp/definition.test.js +454 -0
  123. package/dist/src/__tests__/lsp/diagnostics.test.d.ts +10 -0
  124. package/dist/src/__tests__/lsp/diagnostics.test.js +98 -0
  125. package/dist/src/__tests__/lsp/hover-docs.test.d.ts +10 -0
  126. package/dist/src/__tests__/lsp/hover-docs.test.js +210 -0
  127. package/dist/src/__tests__/lsp.test.js +4 -1
  128. package/dist/src/__tests__/mc-integration/item-entity-events.test.js +4 -0
  129. package/dist/src/__tests__/mc-integration/stdlib-coverage-2.test.js +4 -0
  130. package/dist/src/__tests__/mc-integration/stdlib-coverage-3.test.d.ts +13 -0
  131. package/dist/src/__tests__/mc-integration/stdlib-coverage-3.test.js +1227 -0
  132. package/dist/src/__tests__/mc-integration/stdlib-coverage-4.test.d.ts +13 -0
  133. package/dist/src/__tests__/mc-integration/stdlib-coverage-4.test.js +1509 -0
  134. package/dist/src/__tests__/mc-integration/stdlib-coverage-5.test.d.ts +14 -0
  135. package/dist/src/__tests__/mc-integration/stdlib-coverage-5.test.js +1374 -0
  136. package/dist/src/__tests__/mc-integration/stdlib-coverage-6.test.d.ts +10 -0
  137. package/dist/src/__tests__/mc-integration/stdlib-coverage-6.test.js +759 -0
  138. package/dist/src/__tests__/mc-integration/stdlib-coverage-7.test.d.ts +13 -0
  139. package/dist/src/__tests__/mc-integration/stdlib-coverage-7.test.js +855 -0
  140. package/dist/src/__tests__/mc-integration/stdlib-coverage.test.js +4 -0
  141. package/dist/src/__tests__/mc-integration/syntax-coverage.test.js +4 -0
  142. package/dist/src/__tests__/mc-validator-coverage.test.d.ts +13 -0
  143. package/dist/src/__tests__/mc-validator-coverage.test.js +296 -0
  144. package/dist/src/__tests__/mc-validator-extra.test.d.ts +13 -0
  145. package/dist/src/__tests__/mc-validator-extra.test.js +245 -0
  146. package/dist/src/__tests__/mir/lower-extra.test.d.ts +20 -0
  147. package/dist/src/__tests__/mir/lower-extra.test.js +361 -0
  148. package/dist/src/__tests__/mir/lower-extra2.test.d.ts +17 -0
  149. package/dist/src/__tests__/mir/lower-extra2.test.js +317 -0
  150. package/dist/src/__tests__/mir/lower-extra3.test.d.ts +19 -0
  151. package/dist/src/__tests__/mir/lower-extra3.test.js +249 -0
  152. package/dist/src/__tests__/mir/lower-extra4.test.d.ts +23 -0
  153. package/dist/src/__tests__/mir/lower-extra4.test.js +606 -0
  154. package/dist/src/__tests__/mir/lower-extra5.test.d.ts +25 -0
  155. package/dist/src/__tests__/mir/lower-extra5.test.js +543 -0
  156. package/dist/src/__tests__/mir/lower-extra6.test.d.ts +16 -0
  157. package/dist/src/__tests__/mir/lower-extra6.test.js +471 -0
  158. package/dist/src/__tests__/mir/lower-extra7.test.d.ts +35 -0
  159. package/dist/src/__tests__/mir/lower-extra7.test.js +921 -0
  160. package/dist/src/__tests__/mir/lower-extra8.test.d.ts +19 -0
  161. package/dist/src/__tests__/mir/lower-extra8.test.js +626 -0
  162. package/dist/src/__tests__/mir/lower-extra9.test.d.ts +14 -0
  163. package/dist/src/__tests__/mir/lower-extra9.test.js +717 -0
  164. package/dist/src/__tests__/optimizer/auto-inline.test.d.ts +1 -0
  165. package/dist/src/__tests__/optimizer/auto-inline.test.js +176 -0
  166. package/dist/src/__tests__/optimizer/cse.test.d.ts +4 -0
  167. package/dist/src/__tests__/optimizer/cse.test.js +178 -0
  168. package/dist/src/__tests__/optimizer/inline_fn.test.d.ts +1 -0
  169. package/dist/src/__tests__/optimizer/inline_fn.test.js +221 -0
  170. package/dist/src/__tests__/optimizer/licm.test.d.ts +1 -0
  171. package/dist/src/__tests__/optimizer/licm.test.js +244 -0
  172. package/dist/src/__tests__/optimizer/optimizer-extended.test.d.ts +12 -0
  173. package/dist/src/__tests__/optimizer/optimizer-extended.test.js +993 -0
  174. package/dist/src/__tests__/optimizer/strength-reduction.test.d.ts +1 -0
  175. package/dist/src/__tests__/optimizer/strength-reduction.test.js +86 -0
  176. package/dist/src/__tests__/optimizer/tco.test.d.ts +14 -0
  177. package/dist/src/__tests__/optimizer/tco.test.js +203 -0
  178. package/dist/src/__tests__/parser-coverage.test.d.ts +25 -0
  179. package/dist/src/__tests__/parser-coverage.test.js +491 -0
  180. package/dist/src/__tests__/parser-extra.test.d.ts +6 -0
  181. package/dist/src/__tests__/parser-extra.test.js +451 -0
  182. package/dist/src/__tests__/parser.test.js +12 -0
  183. package/dist/src/__tests__/repl-extra.test.d.ts +13 -0
  184. package/dist/src/__tests__/repl-extra.test.js +174 -0
  185. package/dist/src/__tests__/repl-server-extra.test.d.ts +10 -0
  186. package/dist/src/__tests__/repl-server-extra.test.js +161 -0
  187. package/dist/src/__tests__/repl-server.test.d.ts +6 -0
  188. package/dist/src/__tests__/repl-server.test.js +146 -0
  189. package/dist/src/__tests__/runtime-extra.test.d.ts +15 -0
  190. package/dist/src/__tests__/runtime-extra.test.js +732 -0
  191. package/dist/src/__tests__/singleton-decorator.test.d.ts +11 -0
  192. package/dist/src/__tests__/singleton-decorator.test.js +260 -0
  193. package/dist/src/__tests__/sourcemap.test.js +1 -1
  194. package/dist/src/__tests__/stdlib/advanced.test.d.ts +5 -0
  195. package/dist/src/__tests__/stdlib/advanced.test.js +301 -0
  196. package/dist/src/__tests__/stdlib/bigint.test.d.ts +4 -0
  197. package/dist/src/__tests__/stdlib/bigint.test.js +83 -0
  198. package/dist/src/__tests__/stdlib/bits.test.d.ts +4 -0
  199. package/dist/src/__tests__/stdlib/bits.test.js +96 -0
  200. package/dist/src/__tests__/stdlib/bossbar.test.d.ts +4 -0
  201. package/dist/src/__tests__/stdlib/bossbar.test.js +72 -0
  202. package/dist/src/__tests__/stdlib/color.test.d.ts +4 -0
  203. package/dist/src/__tests__/stdlib/color.test.js +84 -0
  204. package/dist/src/__tests__/stdlib/combat.test.d.ts +4 -0
  205. package/dist/src/__tests__/stdlib/combat.test.js +64 -0
  206. package/dist/src/__tests__/stdlib/cooldown.test.d.ts +4 -0
  207. package/dist/src/__tests__/stdlib/cooldown.test.js +64 -0
  208. package/dist/src/__tests__/stdlib/dialog.test.js +15 -7
  209. package/dist/src/__tests__/stdlib/ecs.test.d.ts +4 -0
  210. package/dist/src/__tests__/stdlib/ecs.test.js +81 -0
  211. package/dist/src/__tests__/stdlib/effects.test.d.ts +4 -0
  212. package/dist/src/__tests__/stdlib/effects.test.js +72 -0
  213. package/dist/src/__tests__/stdlib/events.test.d.ts +4 -0
  214. package/dist/src/__tests__/stdlib/events.test.js +55 -0
  215. package/dist/src/__tests__/stdlib/expr.test.d.ts +4 -0
  216. package/dist/src/__tests__/stdlib/expr.test.js +77 -0
  217. package/dist/src/__tests__/stdlib/fft.test.d.ts +4 -0
  218. package/dist/src/__tests__/stdlib/fft.test.js +82 -0
  219. package/dist/src/__tests__/stdlib/graph.test.d.ts +4 -0
  220. package/dist/src/__tests__/stdlib/graph.test.js +102 -0
  221. package/dist/src/__tests__/stdlib/interactions.test.d.ts +4 -0
  222. package/dist/src/__tests__/stdlib/interactions.test.js +60 -0
  223. package/dist/src/__tests__/stdlib/inventory.test.d.ts +4 -0
  224. package/dist/src/__tests__/stdlib/inventory.test.js +68 -0
  225. package/dist/src/__tests__/stdlib/linalg.test.d.ts +5 -0
  226. package/dist/src/__tests__/stdlib/linalg.test.js +78 -0
  227. package/dist/src/__tests__/stdlib/map.test.d.ts +1 -0
  228. package/dist/src/__tests__/stdlib/map.test.js +84 -0
  229. package/dist/src/__tests__/stdlib/math.test.js +19 -6
  230. package/dist/src/__tests__/stdlib/math_hp.test.d.ts +4 -0
  231. package/dist/src/__tests__/stdlib/math_hp.test.js +80 -0
  232. package/dist/src/__tests__/stdlib/mobs.test.d.ts +4 -0
  233. package/dist/src/__tests__/stdlib/mobs.test.js +61 -0
  234. package/dist/src/__tests__/stdlib/noise.test.d.ts +4 -0
  235. package/dist/src/__tests__/stdlib/noise.test.js +73 -0
  236. package/dist/src/__tests__/stdlib/ode.test.d.ts +4 -0
  237. package/dist/src/__tests__/stdlib/ode.test.js +68 -0
  238. package/dist/src/__tests__/stdlib/parabola.test.d.ts +4 -0
  239. package/dist/src/__tests__/stdlib/parabola.test.js +77 -0
  240. package/dist/src/__tests__/stdlib/particles.test.d.ts +4 -0
  241. package/dist/src/__tests__/stdlib/particles.test.js +68 -0
  242. package/dist/src/__tests__/stdlib/physics.test.d.ts +4 -0
  243. package/dist/src/__tests__/stdlib/physics.test.js +76 -0
  244. package/dist/src/__tests__/stdlib/player.test.d.ts +4 -0
  245. package/dist/src/__tests__/stdlib/player.test.js +64 -0
  246. package/dist/src/__tests__/stdlib/quaternion.test.d.ts +4 -0
  247. package/dist/src/__tests__/stdlib/quaternion.test.js +73 -0
  248. package/dist/src/__tests__/stdlib/queue.test.d.ts +1 -0
  249. package/dist/src/__tests__/stdlib/queue.test.js +97 -0
  250. package/dist/src/__tests__/stdlib/random.test.d.ts +4 -0
  251. package/dist/src/__tests__/stdlib/random.test.js +76 -0
  252. package/dist/src/__tests__/stdlib/result.test.d.ts +12 -0
  253. package/dist/src/__tests__/stdlib/result.test.js +329 -0
  254. package/dist/src/__tests__/stdlib/scheduler.test.js +19 -8
  255. package/dist/src/__tests__/stdlib/set_int.test.d.ts +1 -0
  256. package/dist/src/__tests__/stdlib/set_int.test.js +88 -0
  257. package/dist/src/__tests__/stdlib/sets.test.d.ts +6 -0
  258. package/dist/src/__tests__/stdlib/sets.test.js +60 -0
  259. package/dist/src/__tests__/stdlib/signal.test.d.ts +4 -0
  260. package/dist/src/__tests__/stdlib/signal.test.js +84 -0
  261. package/dist/src/__tests__/stdlib/spawn.test.d.ts +4 -0
  262. package/dist/src/__tests__/stdlib/spawn.test.js +68 -0
  263. package/dist/src/__tests__/stdlib/string.test.d.ts +12 -0
  264. package/dist/src/__tests__/stdlib/string.test.js +231 -0
  265. package/dist/src/__tests__/stdlib/strings.test.d.ts +4 -0
  266. package/dist/src/__tests__/stdlib/strings.test.js +83 -0
  267. package/dist/src/__tests__/stdlib/tags.test.d.ts +4 -0
  268. package/dist/src/__tests__/stdlib/tags.test.js +57 -0
  269. package/dist/src/__tests__/stdlib/teams.test.d.ts +4 -0
  270. package/dist/src/__tests__/stdlib/teams.test.js +72 -0
  271. package/dist/src/__tests__/stdlib/timer.test.d.ts +4 -0
  272. package/dist/src/__tests__/stdlib/timer.test.js +79 -0
  273. package/dist/src/__tests__/stdlib/vec.test.d.ts +5 -0
  274. package/dist/src/__tests__/stdlib/vec.test.js +94 -0
  275. package/dist/src/__tests__/stdlib/world.test.d.ts +4 -0
  276. package/dist/src/__tests__/stdlib/world.test.js +72 -0
  277. package/dist/src/__tests__/struct-display.test.d.ts +1 -0
  278. package/dist/src/__tests__/struct-display.test.js +64 -0
  279. package/dist/src/__tests__/test-framework/runner.test.d.ts +10 -0
  280. package/dist/src/__tests__/test-framework/runner.test.js +193 -0
  281. package/dist/src/__tests__/tuner/adapters.test.d.ts +14 -0
  282. package/dist/src/__tests__/tuner/adapters.test.js +194 -0
  283. package/dist/src/__tests__/tuner/simulator-extra.test.d.ts +4 -0
  284. package/dist/src/__tests__/tuner/simulator-extra.test.js +193 -0
  285. package/dist/src/__tests__/typechecker-coverage.test.d.ts +30 -0
  286. package/dist/src/__tests__/typechecker-coverage.test.js +627 -0
  287. package/dist/src/__tests__/typechecker.test.js +3 -3
  288. package/dist/src/__tests__/watch-decorator.test.d.ts +1 -0
  289. package/dist/src/__tests__/watch-decorator.test.js +54 -0
  290. package/dist/src/ast/types.d.ts +102 -3
  291. package/dist/src/cache/incremental.d.ts +13 -14
  292. package/dist/src/cache/incremental.js +106 -89
  293. package/dist/src/cache/index.d.ts +8 -2
  294. package/dist/src/cache/index.js +18 -6
  295. package/dist/src/cli.d.ts +1 -0
  296. package/dist/src/cli.js +466 -17
  297. package/dist/src/config/project-config.d.ts +29 -0
  298. package/dist/src/config/project-config.js +180 -0
  299. package/dist/src/diagnostics/index.d.ts +9 -0
  300. package/dist/src/diagnostics/index.js +18 -1
  301. package/dist/src/emit/compile.d.ts +10 -0
  302. package/dist/src/emit/compile.js +395 -50
  303. package/dist/src/emit/index.d.ts +40 -0
  304. package/dist/src/emit/index.js +307 -14
  305. package/dist/src/emit/modules.js +21 -3
  306. package/dist/src/emit/sourcemap.d.ts +23 -27
  307. package/dist/src/emit/sourcemap.js +52 -30
  308. package/dist/src/formatter/index.js +33 -8
  309. package/dist/src/hir/deprecated.d.ts +13 -0
  310. package/dist/src/hir/deprecated.js +218 -0
  311. package/dist/src/hir/lower.js +114 -8
  312. package/dist/src/hir/monomorphize.js +22 -2
  313. package/dist/src/hir/types.d.ts +65 -1
  314. package/dist/src/index.d.ts +6 -0
  315. package/dist/src/index.js +18 -3
  316. package/dist/src/lexer/index.d.ts +2 -1
  317. package/dist/src/lexer/index.js +39 -3
  318. package/dist/src/lint/index.d.ts +45 -0
  319. package/dist/src/lint/index.js +930 -0
  320. package/dist/src/lir/lower.js +29 -2
  321. package/dist/src/lir/types.d.ts +2 -0
  322. package/dist/src/lsp/server.js +92 -5
  323. package/dist/src/mir/lower.js +775 -34
  324. package/dist/src/mir/macro.js +36 -2
  325. package/dist/src/mir/types.d.ts +12 -0
  326. package/dist/src/mir/verify.js +9 -0
  327. package/dist/src/optimizer/auto-inline.d.ts +2 -0
  328. package/dist/src/optimizer/auto-inline.js +67 -0
  329. package/dist/src/optimizer/cse.d.ts +20 -0
  330. package/dist/src/optimizer/cse.js +234 -0
  331. package/dist/src/optimizer/inline.d.ts +26 -0
  332. package/dist/src/optimizer/inline.js +286 -0
  333. package/dist/src/optimizer/interprocedural.js +4 -0
  334. package/dist/src/optimizer/licm.d.ts +32 -0
  335. package/dist/src/optimizer/licm.js +371 -0
  336. package/dist/src/optimizer/pipeline.js +12 -2
  337. package/dist/src/optimizer/strength_reduction.d.ts +15 -0
  338. package/dist/src/optimizer/strength_reduction.js +90 -0
  339. package/dist/src/optimizer/tco.d.ts +53 -0
  340. package/dist/src/optimizer/tco.js +238 -0
  341. package/dist/src/parser/index.d.ts +32 -0
  342. package/dist/src/parser/index.js +421 -59
  343. package/dist/src/repl-server.d.ts +13 -0
  344. package/dist/src/repl-server.js +127 -0
  345. package/dist/src/structs/expand.d.ts +15 -0
  346. package/dist/src/structs/expand.js +46 -0
  347. package/dist/src/testing/runner.d.ts +40 -0
  348. package/dist/src/testing/runner.js +237 -0
  349. package/dist/src/typechecker/index.d.ts +3 -0
  350. package/dist/src/typechecker/index.js +254 -9
  351. package/dist/tsconfig.tsbuildinfo +1 -1
  352. package/doc-drafts/redscript-docs/docs/en/stdlib/graph.md +104 -0
  353. package/doc-drafts/redscript-docs/docs/en/stdlib/parabola.md +113 -0
  354. package/doc-drafts/redscript-docs/docs/en/stdlib/pathfind.md +104 -0
  355. package/doc-drafts/redscript-docs/docs/en/stdlib/physics.md +134 -0
  356. package/doc-drafts/redscript-docs/docs/en/stdlib/quaternion.md +135 -0
  357. package/doc-drafts/redscript-docs/docs/zh/stdlib/graph.md +104 -0
  358. package/doc-drafts/redscript-docs/docs/zh/stdlib/parabola.md +113 -0
  359. package/doc-drafts/redscript-docs/docs/zh/stdlib/pathfind.md +104 -0
  360. package/doc-drafts/redscript-docs/docs/zh/stdlib/physics.md +134 -0
  361. package/doc-drafts/redscript-docs/docs/zh/stdlib/quaternion.md +135 -0
  362. package/docs/stdlib/result.md +156 -0
  363. package/docs/stdlib/result.zh.md +156 -0
  364. package/editors/vscode/fixtures/test.mcrs +7 -0
  365. package/editors/vscode/out/extension.js +2095 -225
  366. package/editors/vscode/out/lsp-server.js +519 -51
  367. package/editors/vscode/package-lock.json +9 -4
  368. package/editors/vscode/package.json +1 -1
  369. package/examples/display-demo.mcrs +64 -0
  370. package/examples/game/racing.mcrs +301 -0
  371. package/examples/game/tower_defense.mcrs +311 -0
  372. package/examples/math/physics_sim.mcrs +322 -0
  373. package/examples/rpg/boss_fight.mcrs +313 -0
  374. package/examples/rpg/health_system.mcrs +237 -0
  375. package/examples/rpg/inventory.mcrs +265 -0
  376. package/examples/util/debug_hud.mcrs +279 -0
  377. package/jest.config.js +10 -0
  378. package/package.json +12 -3
  379. package/playground/index.html +823 -0
  380. package/scripts/gen-docs.ts +533 -0
  381. package/scripts/update-redscript-docs-stdlib.sh +770 -0
  382. package/src/__tests__/budget.test.ts +5 -0
  383. package/src/__tests__/cache/cache-behavior.test.ts +480 -0
  384. package/src/__tests__/cache-extra.test.ts +199 -0
  385. package/src/__tests__/cli-docs.test.ts +77 -0
  386. package/src/__tests__/cli-init.test.ts +91 -0
  387. package/src/__tests__/cli-publish.test.ts +190 -0
  388. package/src/__tests__/cli.test.ts +117 -1
  389. package/src/__tests__/compile-preprocess.test.ts +366 -0
  390. package/src/__tests__/compiler/break-stmt.test.ts +66 -0
  391. package/src/__tests__/compiler/const-decl.test.ts +141 -0
  392. package/src/__tests__/compiler/continue-stmt.test.ts +81 -0
  393. package/src/__tests__/compiler/coroutine-extended.test.ts +723 -0
  394. package/src/__tests__/compiler/deprecated.test.ts +305 -0
  395. package/src/__tests__/compiler/do-while.test.ts +130 -0
  396. package/src/__tests__/compiler/enum-payload.test.ts +299 -0
  397. package/src/__tests__/compiler/interface.test.ts +287 -0
  398. package/src/__tests__/compiler/labeled-loops.test.ts +279 -0
  399. package/src/__tests__/compiler/match-string.test.ts +45 -0
  400. package/src/__tests__/compiler/memoize.test.ts +126 -0
  401. package/src/__tests__/compiler/method-chain.test.ts +121 -0
  402. package/src/__tests__/compiler/module-import.test.ts +240 -0
  403. package/src/__tests__/compiler/option-extensions.test.ts +207 -0
  404. package/src/__tests__/compiler/profile-decorator.test.ts +79 -0
  405. package/src/__tests__/compiler/string-advanced.test.ts +310 -0
  406. package/src/__tests__/compiler/struct-extends.test.ts +109 -0
  407. package/src/__tests__/compiler/throttle-retry.test.ts +191 -0
  408. package/src/__tests__/compiler/tuple-type.test.ts +263 -0
  409. package/src/__tests__/compiler/watch-decorator.test.ts +72 -0
  410. package/src/__tests__/config/project-config.test.ts +181 -0
  411. package/src/__tests__/config-decorator.test.ts +157 -0
  412. package/src/__tests__/diagnostics-extra.test.ts +155 -0
  413. package/src/__tests__/emit/compile-branches.test.ts +135 -0
  414. package/src/__tests__/emit/compile-coverage.test.ts +696 -0
  415. package/src/__tests__/emit/compile-extra-branches.test.ts +228 -0
  416. package/src/__tests__/emit/compile-mocked-branches.test.ts +249 -0
  417. package/src/__tests__/emit/compile.test.ts +6 -1
  418. package/src/__tests__/emit/execute-chain.test.ts +114 -0
  419. package/src/__tests__/emit/index.test.ts +2 -1
  420. package/src/__tests__/emit/modules-branches.test.ts +90 -0
  421. package/src/__tests__/emit/modules-coverage.test.ts +241 -0
  422. package/src/__tests__/emit/modules-errors.test.ts +192 -0
  423. package/src/__tests__/emit/modules-rewrite.test.ts +232 -0
  424. package/src/__tests__/emit/source-map.test.ts +152 -0
  425. package/src/__tests__/enum.test.ts +9 -4
  426. package/src/__tests__/error-recovery.test.ts +226 -0
  427. package/src/__tests__/events-types-extra.test.ts +110 -0
  428. package/src/__tests__/events-types.test.ts +66 -0
  429. package/src/__tests__/formatter.test.ts +15 -5
  430. package/src/__tests__/generics.test.ts +16 -9
  431. package/src/__tests__/hir/lower-extra.test.ts +151 -0
  432. package/src/__tests__/hir/monomorphize-coverage.test.ts +432 -0
  433. package/src/__tests__/hir/monomorphize-extra.test.ts +220 -0
  434. package/src/__tests__/hir/monomorphize-extra2.test.ts +350 -0
  435. package/src/__tests__/impl.test.ts +12 -8
  436. package/src/__tests__/incremental.test.ts +10 -2
  437. package/src/__tests__/index-extra.test.ts +79 -0
  438. package/src/__tests__/lexer.test.ts +2 -2
  439. package/src/__tests__/lint/hir-coverage.test.ts +1716 -0
  440. package/src/__tests__/lint/rules-coverage.test.ts +598 -0
  441. package/src/__tests__/lint/rules.test.ts +230 -0
  442. package/src/__tests__/lir/lower.test.ts +33 -0
  443. package/src/__tests__/lir/verify.test.ts +33 -0
  444. package/src/__tests__/lsp/completion.test.ts +687 -0
  445. package/src/__tests__/lsp/definition.test.ts +499 -0
  446. package/src/__tests__/lsp/diagnostics.test.ts +108 -0
  447. package/src/__tests__/lsp/hover-docs.test.ts +222 -0
  448. package/src/__tests__/lsp.test.ts +4 -1
  449. package/src/__tests__/mc-integration/item-entity-events.test.ts +5 -0
  450. package/src/__tests__/mc-integration/stdlib-coverage-2.test.ts +5 -0
  451. package/src/__tests__/mc-integration/stdlib-coverage-3.test.ts +1105 -0
  452. package/src/__tests__/mc-integration/stdlib-coverage-4.test.ts +1366 -0
  453. package/src/__tests__/mc-integration/stdlib-coverage-5.test.ts +1245 -0
  454. package/src/__tests__/mc-integration/stdlib-coverage-6.test.ts +755 -0
  455. package/src/__tests__/mc-integration/stdlib-coverage-7.test.ts +771 -0
  456. package/src/__tests__/mc-integration/stdlib-coverage.test.ts +5 -0
  457. package/src/__tests__/mc-integration/syntax-coverage.test.ts +5 -0
  458. package/src/__tests__/mc-validator-coverage.test.ts +325 -0
  459. package/src/__tests__/mc-validator-extra.test.ts +252 -0
  460. package/src/__tests__/mir/lower-extra.test.ts +402 -0
  461. package/src/__tests__/mir/lower-extra2.test.ts +348 -0
  462. package/src/__tests__/mir/lower-extra3.test.ts +277 -0
  463. package/src/__tests__/mir/lower-extra4.test.ts +636 -0
  464. package/src/__tests__/mir/lower-extra5.test.ts +612 -0
  465. package/src/__tests__/mir/lower-extra6.test.ts +520 -0
  466. package/src/__tests__/mir/lower-extra7.test.ts +1045 -0
  467. package/src/__tests__/mir/lower-extra8.test.ts +704 -0
  468. package/src/__tests__/mir/lower-extra9.test.ts +821 -0
  469. package/src/__tests__/optimizer/auto-inline.test.ts +206 -0
  470. package/src/__tests__/optimizer/cse.test.ts +195 -0
  471. package/src/__tests__/optimizer/inline_fn.test.ts +263 -0
  472. package/src/__tests__/optimizer/licm.test.ts +358 -0
  473. package/src/__tests__/optimizer/nbt-coalesce.test.ts +147 -0
  474. package/src/__tests__/optimizer/optimizer-extended.test.ts +1081 -0
  475. package/src/__tests__/optimizer/scoreboard-batch.test.ts +141 -0
  476. package/src/__tests__/optimizer/strength-reduction.test.ts +111 -0
  477. package/src/__tests__/optimizer/tco-coverage.test.ts +309 -0
  478. package/src/__tests__/optimizer/tco.test.ts +238 -0
  479. package/src/__tests__/option.test.ts +14 -7
  480. package/src/__tests__/parser-coverage.test.ts +576 -0
  481. package/src/__tests__/parser-extra.test.ts +531 -0
  482. package/src/__tests__/parser.test.ts +14 -0
  483. package/src/__tests__/repl-extra.test.ts +195 -0
  484. package/src/__tests__/repl-server-extra.test.ts +150 -0
  485. package/src/__tests__/repl-server.test.ts +122 -0
  486. package/src/__tests__/runtime-extra.test.ts +862 -0
  487. package/src/__tests__/singleton-decorator.test.ts +285 -0
  488. package/src/__tests__/sourcemap.test.ts +1 -1
  489. package/src/__tests__/stdlib/advanced.test.ts +312 -0
  490. package/src/__tests__/stdlib/bigint.test.ts +57 -0
  491. package/src/__tests__/stdlib/bits.test.ts +75 -0
  492. package/src/__tests__/stdlib/bossbar.test.ts +45 -0
  493. package/src/__tests__/stdlib/color.test.ts +60 -0
  494. package/src/__tests__/stdlib/combat.test.ts +35 -0
  495. package/src/__tests__/stdlib/cooldown.test.ts +35 -0
  496. package/src/__tests__/stdlib/dialog.test.ts +14 -6
  497. package/src/__tests__/stdlib/ecs.test.ts +54 -0
  498. package/src/__tests__/stdlib/effects.test.ts +45 -0
  499. package/src/__tests__/stdlib/events.test.ts +23 -0
  500. package/src/__tests__/stdlib/expr.test.ts +48 -0
  501. package/src/__tests__/stdlib/fft.test.ts +54 -0
  502. package/src/__tests__/stdlib/graph.test.ts +77 -0
  503. package/src/__tests__/stdlib/interactions.test.ts +30 -0
  504. package/src/__tests__/stdlib/inventory.test.ts +40 -0
  505. package/src/__tests__/stdlib/linalg.test.ts +52 -0
  506. package/src/__tests__/stdlib/map.test.ts +55 -0
  507. package/src/__tests__/stdlib/math.test.ts +19 -5
  508. package/src/__tests__/stdlib/math_hp.test.ts +55 -0
  509. package/src/__tests__/stdlib/mobs.test.ts +40 -0
  510. package/src/__tests__/stdlib/noise.test.ts +46 -0
  511. package/src/__tests__/stdlib/ode.test.ts +40 -0
  512. package/src/__tests__/stdlib/parabola.test.ts +51 -0
  513. package/src/__tests__/stdlib/particles.test.ts +40 -0
  514. package/src/__tests__/stdlib/physics.test.ts +50 -0
  515. package/src/__tests__/stdlib/player.test.ts +35 -0
  516. package/src/__tests__/stdlib/quaternion.test.ts +46 -0
  517. package/src/__tests__/stdlib/queue.test.ts +73 -0
  518. package/src/__tests__/stdlib/random.test.ts +50 -0
  519. package/src/__tests__/stdlib/result.test.ts +326 -0
  520. package/src/__tests__/stdlib/scheduler.test.ts +18 -7
  521. package/src/__tests__/stdlib/set_int.test.ts +62 -0
  522. package/src/__tests__/stdlib/sets.test.ts +28 -0
  523. package/src/__tests__/stdlib/signal.test.ts +60 -0
  524. package/src/__tests__/stdlib/spawn.test.ts +40 -0
  525. package/src/__tests__/stdlib/string.test.ts +224 -0
  526. package/src/__tests__/stdlib/strings.test.ts +55 -0
  527. package/src/__tests__/stdlib/tags.test.ts +32 -0
  528. package/src/__tests__/stdlib/teams.test.ts +45 -0
  529. package/src/__tests__/stdlib/timer.test.ts +53 -0
  530. package/src/__tests__/stdlib/vec.test.ts +72 -0
  531. package/src/__tests__/stdlib/world.test.ts +45 -0
  532. package/src/__tests__/struct-display.test.ts +69 -0
  533. package/src/__tests__/test-framework/runner.test.ts +208 -0
  534. package/src/__tests__/tuner/adapters.test.ts +232 -0
  535. package/src/__tests__/tuner/simulator-extra.test.ts +222 -0
  536. package/src/__tests__/tuple.test.ts +11 -4
  537. package/src/__tests__/typechecker-coverage.test.ts +671 -0
  538. package/src/__tests__/typechecker.test.ts +4 -3
  539. package/src/__tests__/watch-decorator.test.ts +59 -0
  540. package/src/ast/types.ts +65 -3
  541. package/src/cache/incremental.ts +128 -99
  542. package/src/cache/index.ts +35 -8
  543. package/src/cli.ts +538 -29
  544. package/src/config/project-config.ts +176 -0
  545. package/src/diagnostics/index.ts +22 -0
  546. package/src/docs.ts +98 -0
  547. package/src/emit/compile.ts +408 -51
  548. package/src/emit/index.ts +366 -18
  549. package/src/emit/modules.ts +19 -3
  550. package/src/emit/sourcemap.ts +64 -43
  551. package/src/formatter/index.ts +35 -8
  552. package/src/hir/deprecated.ts +212 -0
  553. package/src/hir/lower.ts +128 -8
  554. package/src/hir/monomorphize.ts +24 -2
  555. package/src/hir/types.ts +26 -1
  556. package/src/index.ts +23 -3
  557. package/src/lexer/index.ts +45 -6
  558. package/src/lint/index.ts +922 -0
  559. package/src/lir/lower.ts +30 -2
  560. package/src/lir/types.ts +4 -0
  561. package/src/lsp/server.ts +100 -1
  562. package/src/mir/lower.ts +785 -40
  563. package/src/mir/macro.ts +30 -2
  564. package/src/mir/types.ts +13 -0
  565. package/src/mir/verify.ts +10 -2
  566. package/src/optimizer/auto-inline.ts +86 -0
  567. package/src/optimizer/copy_prop.ts +2 -2
  568. package/src/optimizer/coroutine.ts +3 -3
  569. package/src/optimizer/cse.ts +205 -0
  570. package/src/optimizer/dce.ts +2 -2
  571. package/src/optimizer/inline.ts +335 -0
  572. package/src/optimizer/interprocedural.ts +5 -1
  573. package/src/optimizer/licm.ts +454 -0
  574. package/src/optimizer/nbt-coalesce.ts +109 -0
  575. package/src/optimizer/pipeline.ts +16 -2
  576. package/src/optimizer/scoreboard-batch.ts +52 -0
  577. package/src/optimizer/strength_reduction.ts +95 -0
  578. package/src/optimizer/tco.ts +267 -0
  579. package/src/optimizer/unroll.ts +2 -2
  580. package/src/parser/index.ts +426 -53
  581. package/src/repl-server.ts +102 -0
  582. package/src/stdlib/advanced.mcrs +271 -101
  583. package/src/stdlib/bigint.mcrs +97 -11
  584. package/src/stdlib/bits.mcrs +75 -12
  585. package/src/stdlib/bossbar.mcrs +37 -8
  586. package/src/stdlib/calculus.mcrs +82 -26
  587. package/src/stdlib/color.mcrs +98 -16
  588. package/src/stdlib/combat.mcrs +23 -5
  589. package/src/stdlib/cooldown.mcrs +19 -0
  590. package/src/stdlib/dialog.mcrs +45 -7
  591. package/src/stdlib/easing.mcrs +132 -12
  592. package/src/stdlib/ecs.mcrs +142 -25
  593. package/src/stdlib/effects.mcrs +88 -12
  594. package/src/stdlib/events.mcrs +21 -2
  595. package/src/stdlib/expr.mcrs +18 -3
  596. package/src/stdlib/fft.mcrs +66 -56
  597. package/src/stdlib/geometry.mcrs +137 -39
  598. package/src/stdlib/graph.mcrs +73 -0
  599. package/src/stdlib/heap.mcrs +49 -8
  600. package/src/stdlib/i18n/zh.yaml +2891 -0
  601. package/src/stdlib/interactions.mcrs +43 -20
  602. package/src/stdlib/inventory.mcrs +14 -3
  603. package/src/stdlib/linalg.mcrs +185 -30
  604. package/src/stdlib/list.mcrs +168 -18
  605. package/src/stdlib/map.mcrs +112 -0
  606. package/src/stdlib/math.mcrs +68 -18
  607. package/src/stdlib/math_hp.mcrs +124 -33
  608. package/src/stdlib/matrix.mcrs +133 -20
  609. package/src/stdlib/mobs.mcrs +87 -0
  610. package/src/stdlib/noise.mcrs +65 -21
  611. package/src/stdlib/ode.mcrs +96 -0
  612. package/src/stdlib/parabola.mcrs +104 -29
  613. package/src/stdlib/particles.mcrs +78 -21
  614. package/src/stdlib/pathfind.mcrs +89 -35
  615. package/src/stdlib/physics.mcrs +134 -26
  616. package/src/stdlib/player.mcrs +18 -0
  617. package/src/stdlib/quaternion.mcrs +213 -9
  618. package/src/stdlib/queue.mcrs +123 -0
  619. package/src/stdlib/random.mcrs +63 -18
  620. package/src/stdlib/result.mcrs +111 -0
  621. package/src/stdlib/scheduler.mcrs +59 -10
  622. package/src/stdlib/set_int.mcrs +240 -0
  623. package/src/stdlib/sets.mcrs +49 -19
  624. package/src/stdlib/signal.mcrs +151 -79
  625. package/src/stdlib/sort.mcrs +44 -24
  626. package/src/stdlib/spawn.mcrs +30 -7
  627. package/src/stdlib/state.mcrs +40 -5
  628. package/src/stdlib/strings.mcrs +131 -3
  629. package/src/stdlib/tags.mcrs +2 -2
  630. package/src/stdlib/teams.mcrs +22 -10
  631. package/src/stdlib/timer.mcrs +36 -6
  632. package/src/stdlib/vec.mcrs +44 -9
  633. package/src/stdlib/world.mcrs +57 -25
  634. package/src/structs/expand.ts +64 -0
  635. package/src/testing/runner.ts +271 -0
  636. package/src/typechecker/index.ts +273 -9
@@ -20,10 +20,16 @@ module library;
20
20
 
21
21
  // ─── Constants ────────────────────────────────────────────────────────────────
22
22
 
23
- // GRAVITY: MC gravity per tick ×10000 (≈ 0.08 * 10000 = 800)
23
+ /// Minecraft gravity per tick in ×10000 fixed-point (≈ 0.08 × 10000 = 800).
24
+ ///
25
+ /// @since 2.0.0
26
+ /// @returns `800`
24
27
  fn parabola_gravity(): int { return 800; }
25
28
 
26
- // GRAVITY_HALF: gravity/2 for displacement formula ×10000
29
+ /// Half of Minecraft gravity per tick (used for displacement formula).
30
+ ///
31
+ /// @since 2.0.0
32
+ /// @returns `400`
27
33
  fn parabola_gravity_half(): int { return 400; }
28
34
 
29
35
  // ─── Ballistic trajectory (no drag) ──────────────────────────────────────────
@@ -35,16 +41,27 @@ fn parabola_gravity_half(): int { return 400; }
35
41
  //
36
42
  // All velocities returned ×10000 (blocks/tick × 10000)
37
43
 
38
- // parabola_vx(dx, ticks): initial X velocity ×10000
39
- // dx: horizontal displacement in blocks
40
- // ticks: flight time in ticks
44
+ /// Compute the initial X velocity needed to reach `dx` blocks in `ticks` ticks.
45
+ ///
46
+ /// @since 2.0.0
47
+ /// @param dx Horizontal X displacement in blocks
48
+ /// @param ticks Flight time in ticks
49
+ /// @returns Initial X velocity ×10000 (`dx * 10000 / ticks`), or `0` if `ticks ≤ 0`
50
+ /// @example
51
+ /// let vx: int = parabola_vx(10, 20)
41
52
  fn parabola_vx(dx: int, ticks: int): int {
42
53
  if (ticks <= 0) { return 0; }
43
54
  return dx * 10000 / ticks;
44
55
  }
45
56
 
46
- // parabola_vy(dy, ticks): initial Y velocity ×10000
47
- // dy: vertical displacement in blocks (positive = up)
57
+ /// Compute the initial Y velocity needed to reach height `dy` in `ticks` ticks.
58
+ ///
59
+ /// @since 2.0.0
60
+ /// @param dy Vertical displacement in blocks (positive = up)
61
+ /// @param ticks Flight time in ticks
62
+ /// @returns Initial Y velocity ×10000, or `0` if `ticks ≤ 0`
63
+ /// @example
64
+ /// let vy: int = parabola_vy(5, 20)
48
65
  fn parabola_vy(dy: int, ticks: int): int {
49
66
  if (ticks <= 0) { return 0; }
50
67
  // vy * t = dy * 10000 + gravity_half * t^2
@@ -53,14 +70,24 @@ fn parabola_vy(dy: int, ticks: int): int {
53
70
  return (dy * 10000 + g_term) / ticks;
54
71
  }
55
72
 
56
- // parabola_vz(dz, ticks): initial Z velocity ×10000
73
+ /// Compute the initial Z velocity needed to reach `dz` blocks in `ticks` ticks.
74
+ ///
75
+ /// @since 2.0.0
76
+ /// @param dz Horizontal Z displacement in blocks
77
+ /// @param ticks Flight time in ticks
78
+ /// @returns Initial Z velocity ×10000, or `0` if `ticks ≤ 0`
57
79
  fn parabola_vz(dz: int, ticks: int): int {
58
80
  if (ticks <= 0) { return 0; }
59
81
  return dz * 10000 / ticks;
60
82
  }
61
83
 
62
- // parabola_speed_xz(dx, dz, ticks): horizontal speed ×10000 (for launch angle)
63
- // Returns sqrt(vx^2 + vz^2) ×10000
84
+ /// Compute the horizontal speed `sqrt(vx² + vz²)` needed to reach `(dx, dz)` in `ticks` ticks.
85
+ ///
86
+ /// @since 2.0.0
87
+ /// @param dx X displacement in blocks
88
+ /// @param dz Z displacement in blocks
89
+ /// @param ticks Flight time in ticks
90
+ /// @returns Horizontal launch speed ×10000, or `0` if `ticks ≤ 0`
64
91
  fn parabola_speed_xz(dx: int, dz: int, ticks: int): int {
65
92
  if (ticks <= 0) { return 0; }
66
93
  let vx: int = parabola_vx(dx, ticks);
@@ -77,37 +104,60 @@ fn parabola_speed_xz(dx: int, dz: int, ticks: int): int {
77
104
  // y(t) = vy0 * t / 10000 - gravity_half * t^2 / 10000
78
105
  // z(t) = vz0 * t / 10000
79
106
 
80
- // parabola_x(vx0, t): X position at tick t in blocks
107
+ /// X position at tick `t` given initial X velocity `vx0` ×10000.
108
+ ///
109
+ /// @since 2.0.0
110
+ /// @param vx0 Initial X velocity ×10000
111
+ /// @param t Elapsed ticks
112
+ /// @returns X displacement in blocks (`vx0 * t / 10000`)
81
113
  fn parabola_x(vx0: int, t: int): int {
82
114
  return vx0 * t / 10000;
83
115
  }
84
116
 
85
- // parabola_y(vy0, t): Y position at tick t in blocks
117
+ /// Y position at tick `t` given initial Y velocity `vy0` ×10000.
118
+ ///
119
+ /// @since 2.0.0
120
+ /// @param vy0 Initial Y velocity ×10000
121
+ /// @param t Elapsed ticks
122
+ /// @returns Y displacement in blocks (positive = up)
86
123
  fn parabola_y(vy0: int, t: int): int {
87
124
  let g_term: int = parabola_gravity_half() * t * t / 10000;
88
125
  return vy0 * t / 10000 - g_term;
89
126
  }
90
127
 
91
- // parabola_z(vz0, t): Z position at tick t in blocks
128
+ /// Z position at tick `t` given initial Z velocity `vz0` ×10000.
129
+ ///
130
+ /// @since 2.0.0
131
+ /// @param vz0 Initial Z velocity ×10000
132
+ /// @param t Elapsed ticks
133
+ /// @returns Z displacement in blocks
92
134
  fn parabola_z(vz0: int, t: int): int {
93
135
  return vz0 * t / 10000;
94
136
  }
95
137
 
96
138
  // ─── Flight time estimation ───────────────────────────────────────────────────
97
- //
98
- // Given initial upward velocity vy0 (×10000), find the tick when the projectile
99
- // returns to launch height (y=0):
100
- // t = 2 * vy0 / gravity = 2 * vy0 / 800
101
- // Returns ticks (integer). Returns 0 if vy0 <= 0.
102
139
 
103
- // parabola_flight_time(vy0): ticks until returning to launch height
140
+ /// Estimate the tick when the projectile returns to launch height (`y = 0`).
141
+ ///
142
+ /// Formula: `t = 2 × vy0 / gravity`. Returns `0` for non-positive initial velocity.
143
+ ///
144
+ /// @since 2.0.0
145
+ /// @param vy0 Initial Y velocity ×10000
146
+ /// @returns Flight time in ticks, or `0` if `vy0 ≤ 0`
147
+ /// @example
148
+ /// let t: int = parabola_flight_time(8000)
104
149
  fn parabola_flight_time(vy0: int): int {
105
150
  if (vy0 <= 0) { return 0; }
106
151
  return 2 * vy0 / parabola_gravity();
107
152
  }
108
153
 
109
- // parabola_max_height(vy0): maximum height above launch point in blocks
110
- // apex at t = vy0 / gravity
154
+ /// Maximum height (in blocks) above the launch point.
155
+ ///
156
+ /// @since 2.0.0
157
+ /// @param vy0 Initial Y velocity ×10000
158
+ /// @returns Apex height in blocks, or `0` if `vy0 ≤ 0`
159
+ /// @example
160
+ /// let h: int = parabola_max_height(8000)
111
161
  fn parabola_max_height(vy0: int): int {
112
162
  if (vy0 <= 0) { return 0; }
113
163
  let t_apex: int = vy0 / parabola_gravity();
@@ -123,27 +173,46 @@ fn parabola_max_height(vy0: int): int {
123
173
  //
124
174
  // drag: ×10000 (e.g. 9900 = 0.99 for arrows, 9800 = 0.98 for fireballs)
125
175
 
126
- // parabola_step_vx(vx, drag): apply drag to X velocity
176
+ /// Apply drag to the X velocity for one tick.
177
+ ///
178
+ /// @since 2.0.0
179
+ /// @param vx Current X velocity ×10000
180
+ /// @param drag Drag factor ×10000 (e.g. `9900` = 0.99 for arrows)
181
+ /// @returns New X velocity ×10000
127
182
  fn parabola_step_vx(vx: int, drag: int): int {
128
183
  return mulfix(vx, drag);
129
184
  }
130
185
 
131
- // parabola_step_vy(vy, drag): apply gravity then drag to Y velocity
186
+ /// Apply gravity and then drag to the Y velocity for one tick.
187
+ ///
188
+ /// @since 2.0.0
189
+ /// @param vy Current Y velocity ×10000
190
+ /// @param drag Drag factor ×10000
191
+ /// @returns New Y velocity ×10000 after `(vy - gravity) * drag`
132
192
  fn parabola_step_vy(vy: int, drag: int): int {
133
193
  return mulfix(vy - parabola_gravity(), drag);
134
194
  }
135
195
 
136
- // parabola_step_vz(vz, drag): apply drag to Z velocity
196
+ /// Apply drag to the Z velocity for one tick.
197
+ ///
198
+ /// @since 2.0.0
199
+ /// @param vz Current Z velocity ×10000
200
+ /// @param drag Drag factor ×10000
201
+ /// @returns New Z velocity ×10000
137
202
  fn parabola_step_vz(vz: int, drag: int): int {
138
203
  return mulfix(vz, drag);
139
204
  }
140
205
 
141
206
  // ─── Targeting helpers ────────────────────────────────────────────────────────
142
207
 
143
- // parabola_ticks_for_range(range): estimate ticks to reach a horizontal range
144
- // range: distance in blocks
145
- // Uses average speed heuristic: t ≈ range * 10000 / 8000 (arrow ≈ 0.8 b/t horizontal)
146
- // For precise aiming use parabola_vx/vy/vz with desired ticks.
208
+ /// Estimate the number of ticks to reach a horizontal range using average arrow speed.
209
+ ///
210
+ /// Heuristic: `t ≈ range × 10000 / 8000` (assumes ≈ 0.8 blocks/tick horizontal).
211
+ /// For precise aiming, use `parabola_vx/vy/vz` with a chosen tick count.
212
+ ///
213
+ /// @since 2.0.0
214
+ /// @param range Horizontal distance in blocks
215
+ /// @returns Estimated ticks (minimum 1)
147
216
  fn parabola_ticks_for_range(range: int): int {
148
217
  if (range <= 0) { return 1; }
149
218
  let t: int = range * 10000 / 8000;
@@ -151,7 +220,13 @@ fn parabola_ticks_for_range(range: int): int {
151
220
  return t;
152
221
  }
153
222
 
154
- // parabola_in_range(dx, dz, max_range): returns 1 if target within horizontal range
223
+ /// Check whether a target is within horizontal range.
224
+ ///
225
+ /// @since 2.0.0
226
+ /// @param dx X displacement to target in blocks
227
+ /// @param dz Z displacement to target in blocks
228
+ /// @param max_range Maximum range in blocks
229
+ /// @returns `1` if `dist(dx, dz) ≤ max_range`, otherwise `0`
155
230
  fn parabola_in_range(dx: int, dz: int, max_range: int): int {
156
231
  let dist_sq: int = dx * dx + dz * dz;
157
232
  let range_sq: int = max_range * max_range;
@@ -1,52 +1,82 @@
1
1
  // Particle effect helpers
2
2
  // Usage: import "stdlib/particles.mcrs"
3
3
 
4
- /// Spawn heart particles at position
4
+ /// Spawns heart particles at a block position.
5
+ /// @param x X coordinate
6
+ /// @param y Y coordinate
7
+ /// @param z Z coordinate
5
8
  fn hearts_at(x: int, y: int, z: int) {
6
9
  particle("heart", x, y, z);
7
10
  }
8
11
 
9
- /// Spawn flame particles at position
12
+ /// Spawns flame particles at a block position.
13
+ /// @param x X coordinate
14
+ /// @param y Y coordinate
15
+ /// @param z Z coordinate
10
16
  fn flames(x: int, y: int, z: int) {
11
17
  particle("flame", x, y, z);
12
18
  }
13
19
 
14
- /// Spawn smoke effect
20
+ /// Spawns large smoke particles at a block position.
21
+ /// @param x X coordinate
22
+ /// @param y Y coordinate
23
+ /// @param z Z coordinate
15
24
  fn smoke(x: int, y: int, z: int) {
16
25
  particle("large_smoke", x, y, z);
17
26
  }
18
27
 
19
- /// Spawn explosion effect
28
+ /// Spawns an explosion particle at a block position.
29
+ /// @param x X coordinate
30
+ /// @param y Y coordinate
31
+ /// @param z Z coordinate
20
32
  fn explosion_effect(x: int, y: int, z: int) {
21
33
  particle("explosion", x, y, z);
22
34
  }
23
35
 
24
- /// Spawn magic sparkles at position
36
+ /// Spawns enchantment sparkles at a block position.
37
+ /// @param x X coordinate
38
+ /// @param y Y coordinate
39
+ /// @param z Z coordinate
25
40
  fn sparkles_at(x: int, y: int, z: int) {
26
41
  particle("enchant", x, y, z);
27
42
  }
28
43
 
29
- /// Spawn angry villager particles
44
+ /// Spawns angry villager particles at a block position.
45
+ /// @param x X coordinate
46
+ /// @param y Y coordinate
47
+ /// @param z Z coordinate
30
48
  fn angry_at(x: int, y: int, z: int) {
31
49
  particle("angry_villager", x, y, z);
32
50
  }
33
51
 
34
- /// Spawn happy villager particles
52
+ /// Spawns happy villager particles at a block position.
53
+ /// @param x X coordinate
54
+ /// @param y Y coordinate
55
+ /// @param z Z coordinate
35
56
  fn happy_at(x: int, y: int, z: int) {
36
57
  particle("happy_villager", x, y, z);
37
58
  }
38
59
 
39
- /// Spawn portal effect
60
+ /// Spawns portal particles at a block position.
61
+ /// @param x X coordinate
62
+ /// @param y Y coordinate
63
+ /// @param z Z coordinate
40
64
  fn portal_effect(x: int, y: int, z: int) {
41
65
  particle("portal", x, y, z);
42
66
  }
43
67
 
44
- /// Spawn totem particles at position
68
+ /// Spawns totem particles at a block position.
69
+ /// @param x X coordinate
70
+ /// @param y Y coordinate
71
+ /// @param z Z coordinate
45
72
  fn totem_at(x: int, y: int, z: int) {
46
73
  particle("totem_of_undying", x, y, z);
47
74
  }
48
75
 
49
- /// Spawn end rod sparkles
76
+ /// Spawns end rod particles at a block position.
77
+ /// @param x X coordinate
78
+ /// @param y Y coordinate
79
+ /// @param z Z coordinate
50
80
  fn end_sparkles_at(x: int, y: int, z: int) {
51
81
  particle("end_rod", x, y, z);
52
82
  }
@@ -65,8 +95,12 @@ fn end_sparkles_at(x: int, y: int, z: int) {
65
95
  // t = t + step;
66
96
  // }
67
97
 
68
- // particle_at_fx(x_fx, y_fx, z_fx, particle): spawn particle at fixed-point position
69
- // Coordinates: ×100 (1 block = 100 units)
98
+ /// Spawns a particle at a fixed-point position expressed as blocks ×100.
99
+ /// This helper emits a raw command so sub-block coordinates are preserved.
100
+ /// @param x_fx X coordinate in blocks ×100
101
+ /// @param y_fx Y coordinate in blocks ×100
102
+ /// @param z_fx Z coordinate in blocks ×100
103
+ /// @param particle Particle ID such as `minecraft:flame`
70
104
  fn particle_at_fx(x_fx: int, y_fx: int, z_fx: int, particle: string) {
71
105
  let bx: int = x_fx / 100;
72
106
  let by: int = y_fx / 100;
@@ -74,9 +108,15 @@ fn particle_at_fx(x_fx: int, y_fx: int, z_fx: int, particle: string) {
74
108
  raw("particle {particle} {bx}.{x_fx%100} {by}.{y_fx%100} {bz}.{z_fx%100} 0 0 0 0 1 force");
75
109
  }
76
110
 
77
- // draw_line_2d(x0, y0, x1, y1, steps, z, particle):
78
- // Draw a straight line from (x0,y0) to (x1,y1) with given number of steps
79
- // All coords ×100
111
+ /// Draws a straight 2D particle line using linear interpolation.
112
+ /// Coordinates are fixed-point blocks ×100; `z` is also passed in ×100.
113
+ /// @param x0 Start X in blocks ×100
114
+ /// @param y0 Start Y in blocks ×100
115
+ /// @param x1 End X in blocks ×100
116
+ /// @param y1 End Y in blocks ×100
117
+ /// @param steps Number of interpolation steps
118
+ /// @param z Z plane in blocks ×100
119
+ /// @param particle Particle ID such as `minecraft:dust`
80
120
  fn draw_line_2d(x0: int, y0: int, x1: int, y1: int, steps: int, z: int, particle: string) {
81
121
  let i: int = 0;
82
122
  while (i <= steps) {
@@ -87,9 +127,14 @@ fn draw_line_2d(x0: int, y0: int, x1: int, y1: int, steps: int, z: int, particle
87
127
  }
88
128
  }
89
129
 
90
- // draw_circle(cx, cy, cz, r, steps, particle):
91
- // Draw a circle in the XZ plane
92
- // cx,cy,cz: center in blocks, r: radius ×100, steps: number of particles
130
+ /// Draws a circle in the XZ plane using `cos_fixed` and `sin_fixed`.
131
+ /// Center coordinates are whole blocks; radius is blocks ×100.
132
+ /// @param cx Center X in blocks
133
+ /// @param cy Center Y in blocks
134
+ /// @param cz Center Z in blocks
135
+ /// @param r Radius in blocks ×100
136
+ /// @param steps Number of particle samples around the circle
137
+ /// @param particle Particle ID such as `minecraft:end_rod`
93
138
  fn draw_circle(cx: int, cy: int, cz: int, r: int, steps: int, particle: string) {
94
139
  let i: int = 0;
95
140
  while (i < steps) {
@@ -101,8 +146,16 @@ fn draw_circle(cx: int, cy: int, cz: int, r: int, steps: int, particle: string)
101
146
  }
102
147
  }
103
148
 
104
- // draw_helix(cx, cy_start, cz, r, height, rotations, steps, particle):
105
- // Draw a helix spiral
149
+ /// Draws a helix spiral with configurable radius, height, and turns.
150
+ /// Center coordinates are whole blocks; radius is blocks ×100.
151
+ /// @param cx Center X in blocks
152
+ /// @param cy_start Starting Y coordinate in blocks
153
+ /// @param cz Center Z in blocks
154
+ /// @param r Radius in blocks ×100
155
+ /// @param height Total helix height in blocks
156
+ /// @param rotations Number of full turns
157
+ /// @param steps Number of particle samples
158
+ /// @param particle Particle ID such as `minecraft:portal`
106
159
  fn draw_helix(cx: int, cy_start: int, cz: int, r: int, height: int, rotations: int, steps: int, particle: string) {
107
160
  let i: int = 0;
108
161
  while (i < steps) {
@@ -115,7 +168,11 @@ fn draw_helix(cx: int, cy_start: int, cz: int, r: int, height: int, rotations: i
115
168
  }
116
169
  }
117
170
 
118
- // particle_dot(x, y, z, particle): helper — single particle at integer block coords
171
+ /// Spawns exactly one particle at integer block coordinates.
172
+ /// @param x X coordinate in whole blocks
173
+ /// @param y Y coordinate in whole blocks
174
+ /// @param z Z coordinate in whole blocks
175
+ /// @param particle Particle ID such as `minecraft:flame`
119
176
  fn particle_dot(x: int, y: int, z: int, particle: string) {
120
177
  raw("particle {particle} {x} {y} {z} 0 0 0 0 1 force");
121
178
  }
@@ -33,18 +33,38 @@ module library
33
33
 
34
34
  // ─── Coordinate utilities ─────────────────────────────────────────────────────
35
35
 
36
- // pf_pack(x, z): encode (x, z) as a single int (x*16+z)
36
+ /// Encode a (x, z) grid coordinate pair as a single packed integer.
37
+ /// @since 1.0.0
38
+ /// @param x Grid X coordinate [0, 15]
39
+ /// @param z Grid Z coordinate [0, 15]
40
+ /// @returns x * 16 + z (unique index in [0, 255])
41
+ /// @example
42
+ /// let p: int = pf_pack(3, 7) // result: 55
37
43
  fn pf_pack(x: int, z: int): int { return x * 16 + z }
38
44
 
39
- // pf_unpack_x(packed): recover the x component
45
+ /// Extract the X coordinate from a packed grid index.
46
+ /// @since 1.0.0
47
+ /// @param packed Packed coordinate from pf_pack
48
+ /// @returns X component: packed / 16
49
+ /// @example
50
+ /// let x: int = pf_unpack_x(55) // result: 3
40
51
  fn pf_unpack_x(packed: int): int { return packed / 16 }
41
52
 
42
- // pf_unpack_z(packed): recover the z component
53
+ /// Extract the Z coordinate from a packed grid index.
54
+ /// @since 1.0.0
55
+ /// @param packed Packed coordinate from pf_pack
56
+ /// @returns Z component: packed % 16
57
+ /// @example
58
+ /// let z: int = pf_unpack_z(55) // result: 7
43
59
  fn pf_unpack_z(packed: int): int { return packed % 16 }
44
60
 
45
61
  // ─── Obstacle map ─────────────────────────────────────────────────────────────
46
62
 
47
- // pf_new_map(): allocate a 256-element map, all cells passable (value 0)
63
+ /// Allocate a new 16×16 grid obstacle map with all cells passable.
64
+ /// @since 1.0.0
65
+ /// @returns int[] of 256 zeros; index = pf_pack(x, z), 0=passable, 1=blocked
66
+ /// @example
67
+ /// let map: int[] = pf_new_map()
48
68
  fn pf_new_map(): int[] {
49
69
  let map: int[] = []
50
70
  let i: int = 0
@@ -55,19 +75,40 @@ fn pf_new_map(): int[] {
55
75
  return map
56
76
  }
57
77
 
58
- // pf_set_blocked(map, x, z): mark cell (x, z) as impassable
78
+ /// Mark a grid cell as impassable (blocked).
79
+ /// @since 1.0.0
80
+ /// @param map Obstacle map from pf_new_map
81
+ /// @param x Cell X coordinate [0, 15]
82
+ /// @param z Cell Z coordinate [0, 15]
83
+ /// @returns void — sets map[pf_pack(x,z)] = 1
84
+ /// @example
85
+ /// pf_set_blocked(map, 5, 3) // block cell (5, 3)
59
86
  fn pf_set_blocked(map: int[], x: int, z: int) {
60
87
  let idx: int = pf_pack(x, z)
61
88
  map[idx] = 1
62
89
  }
63
90
 
64
- // pf_set_open(map, x, z): mark cell (x, z) as passable
91
+ /// Mark a grid cell as passable (open).
92
+ /// @since 1.0.0
93
+ /// @param map Obstacle map from pf_new_map
94
+ /// @param x Cell X coordinate [0, 15]
95
+ /// @param z Cell Z coordinate [0, 15]
96
+ /// @returns void — sets map[pf_pack(x,z)] = 0
97
+ /// @example
98
+ /// pf_set_open(map, 5, 3) // re-open previously blocked cell (5, 3)
65
99
  fn pf_set_open(map: int[], x: int, z: int) {
66
100
  let idx: int = pf_pack(x, z)
67
101
  map[idx] = 0
68
102
  }
69
103
 
70
- // pf_is_blocked(map, x, z): 1 if out-of-bounds or impassable, 0 otherwise
104
+ /// Check whether a grid cell is blocked or out of bounds.
105
+ /// @since 1.0.0
106
+ /// @param map Obstacle map from pf_new_map
107
+ /// @param x Cell X coordinate
108
+ /// @param z Cell Z coordinate
109
+ /// @returns 1 if out of bounds (x or z outside [0,15]) or cell is blocked, 0 if passable
110
+ /// @example
111
+ /// let blocked: int = pf_is_blocked(map, 5, 3)
71
112
  fn pf_is_blocked(map: int[], x: int, z: int): int {
72
113
  if (x < 0) { return 1 }
73
114
  if (z < 0) { return 1 }
@@ -78,8 +119,15 @@ fn pf_is_blocked(map: int[], x: int, z: int): int {
78
119
 
79
120
  // ─── Manhattan heuristic ──────────────────────────────────────────────────────
80
121
 
81
- // pf_heuristic(x1, z1, x2, z2): Manhattan distance ×10000 (fixed-point)
82
- // Informational — not used by BFS, but useful if you extend to A*.
122
+ /// Compute Manhattan distance between two grid cells, scaled ×10000.
123
+ /// @since 1.0.0
124
+ /// @param x1 First cell X
125
+ /// @param z1 First cell Z
126
+ /// @param x2 Second cell X
127
+ /// @param z2 Second cell Z
128
+ /// @returns (|x1-x2| + |z1-z2|) * 10000 — useful as A* heuristic
129
+ /// @example
130
+ /// let h: int = pf_heuristic(0, 0, 3, 4) // result: 70000 (7 Manhattan steps × 10000)
83
131
  fn pf_heuristic(x1: int, z1: int, x2: int, z2: int): int {
84
132
  let dx: int = x1 - x2
85
133
  let dz: int = z1 - z2
@@ -90,14 +138,19 @@ fn pf_heuristic(x1: int, z1: int, x2: int, z2: int): int {
90
138
 
91
139
  // ─── BFS pathfinding (synchronous) ───────────────────────────────────────────
92
140
 
93
- // pathfind_bfs(map, sx, sz, gx, gz): find shortest path via BFS
94
- //
95
- // Returns int[] of packed coords start→goal (inclusive), or [] if unreachable.
96
- //
97
- // Internal arrays (size 256):
98
- // visited[] 1 = cell was enqueued; 0 = not yet seen
99
- // parent[] — packed coord of predecessor (-1 = no parent / unvisited)
100
- // queue[] BFS frontier; consumed via qhead index (no front-dequeue needed)
141
+ /// Find the shortest path between two cells on a 16×16 grid using BFS.
142
+ /// @since 1.0.0
143
+ /// @param map Obstacle map from pf_new_map (with pf_set_blocked applied)
144
+ /// @param sx Start cell X [0, 15]
145
+ /// @param sz Start cell Z [0, 15]
146
+ /// @param gx Goal cell X [0, 15]
147
+ /// @param gz Goal cell Z [0, 15]
148
+ /// @returns int[] of packed coords (pf_pack) from start to goal inclusive, or [] if no path
149
+ /// @example
150
+ /// let map: int[] = pf_new_map()
151
+ /// pf_set_blocked(map, 3, 5)
152
+ /// let path: int[] = pathfind_bfs(map, 0, 0, 7, 7)
153
+ /// let x0: int = pf_unpack_x(path[0])
101
154
  fn pathfind_bfs(map: int[], sx: int, sz: int, gx: int, gz: int): int[] {
102
155
  // Allocate visited and parent arrays (256 cells each)
103
156
  let visited: int[] = []
@@ -181,10 +234,12 @@ fn pathfind_bfs(map: int[], sx: int, sz: int, gx: int, gz: int): int[] {
181
234
 
182
235
  // Reconstruct path: walk parent[] links from goal back to start
183
236
  let rev: int[] = []
237
+ let rlen: int = 0
184
238
  let node: int = goal
185
239
  let walking: int = 1
186
240
  while (walking == 1) {
187
241
  rev.push(node)
242
+ rlen = rlen + 1
188
243
  if (node == start) {
189
244
  walking = 0
190
245
  } else {
@@ -194,7 +249,6 @@ fn pathfind_bfs(map: int[], sx: int, sz: int, gx: int, gz: int): int[] {
194
249
 
195
250
  // Reverse rev[] into path[]
196
251
  let path: int[] = []
197
- let rlen: int = rev.len
198
252
  let ri: int = rlen - 1
199
253
  while (ri >= 0) {
200
254
  path.push(rev[ri])
@@ -206,21 +260,19 @@ fn pathfind_bfs(map: int[], sx: int, sz: int, gx: int, gz: int): int[] {
206
260
 
207
261
  // ─── Coroutine BFS (tick-spread for server-friendly operation) ────────────────
208
262
 
209
- // pathfind_bfs_coro: identical BFS logic, spread across ticks via @coroutine.
210
- //
211
- // @coroutine(batch=16) processes 16 BFS iterations per server tick, preventing
212
- // lag spikes on busy grids. Results are pushed into caller-supplied out[] when done.
213
- //
214
- // Limitations:
215
- // - @coroutine functions cannot return values; use the out[] ref pattern instead.
216
- // - Replace pf_noop with your own handler if you need a done callback.
217
- // - The out[] array must outlive the coroutine; store it in a scoreboard-backed var.
218
- //
219
- // Usage:
220
- // let out: int[] = []
221
- // pathfind_bfs_coro(map, 0, 0, 7, 7, out)
222
- // // … several ticks later, out[] contains the packed-coord path
223
-
263
+ /// BFS pathfinder spread across server ticks to avoid lag spikes (coroutine variant).
264
+ /// @since 1.0.0
265
+ /// @param map Obstacle map from pf_new_map
266
+ /// @param sx Start cell X [0, 15]
267
+ /// @param sz Start cell Z [0, 15]
268
+ /// @param gx Goal cell X [0, 15]
269
+ /// @param gz Goal cell Z [0, 15]
270
+ /// @param out Caller-supplied int[] that receives packed path coords when done
271
+ /// @returns void results are pushed into out[] asynchronously; replace pf_noop for callback
272
+ /// @example
273
+ /// let out: int[] = []
274
+ /// pathfind_bfs_coro(map, 0, 0, 7, 7, out)
275
+ /// // several ticks later, out[] contains the path
224
276
  @coroutine(batch=16, onDone=pf_noop)
225
277
  fn pathfind_bfs_coro(map: int[], sx: int, sz: int, gx: int, gz: int, out: int[]) {
226
278
  let visited: int[] = []
@@ -298,17 +350,18 @@ fn pathfind_bfs_coro(map: int[], sx: int, sz: int, gx: int, gz: int, out: int[])
298
350
 
299
351
  if (found == 1) {
300
352
  let rev: int[] = []
353
+ let rlen: int = 0
301
354
  let node: int = goal
302
355
  let walking: int = 1
303
356
  while (walking == 1) {
304
357
  rev.push(node)
358
+ rlen = rlen + 1
305
359
  if (node == start) {
306
360
  walking = 0
307
361
  } else {
308
362
  node = parent[node]
309
363
  }
310
364
  }
311
- let rlen: int = rev.len
312
365
  let ri: int = rlen - 1
313
366
  while (ri >= 0) {
314
367
  out.push(rev[ri])
@@ -317,5 +370,6 @@ fn pathfind_bfs_coro(map: int[], sx: int, sz: int, gx: int, gz: int, out: int[])
317
370
  }
318
371
  }
319
372
 
320
- // pf_noop: default onDone callback replace with your own handler
373
+ /// Default no-op onDone callback for pathfind_bfs_coro. Replace with your own handler.
374
+ /// @since 1.0.0
321
375
  fn pf_noop() {}