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
@@ -0,0 +1,104 @@
1
+ # `pathfind` — 16×16 Grid BFS Pathfinding
2
+
3
+ Import: `import "stdlib/pathfind.mcrs"`
4
+
5
+ Breadth-first pathfinding on a fixed **16×16** XZ grid. Obstacles are stored in a 256-element `int[]`, and paths are returned as packed grid coordinates.
6
+
7
+ ## Coordinate Packing
8
+
9
+ Cells are encoded as:
10
+
11
+ ```text
12
+ packed = x * 16 + z
13
+ ```
14
+
15
+ Helpers:
16
+
17
+ - `pf_unpack_x(packed) = packed / 16`
18
+ - `pf_unpack_z(packed) = packed % 16`
19
+
20
+ ## Quick Example
21
+
22
+ ```rs
23
+ import "stdlib/pathfind.mcrs";
24
+
25
+ let map: int[] = pf_new_map();
26
+ pf_set_blocked(map, 3, 5);
27
+ pf_set_blocked(map, 3, 6);
28
+
29
+ let path: int[] = pathfind_bfs(map, 0, 0, 7, 7);
30
+ let first_x: int = pf_unpack_x(path[0]);
31
+ let first_z: int = pf_unpack_z(path[0]);
32
+ ```
33
+
34
+ ## Map Helpers
35
+
36
+ ### `pf_pack(x: int, z: int): int`
37
+
38
+ Pack a grid coordinate into one integer.
39
+
40
+ ### `pf_unpack_x(packed: int): int`
41
+
42
+ Recover the X coordinate from a packed cell id.
43
+
44
+ ### `pf_unpack_z(packed: int): int`
45
+
46
+ Recover the Z coordinate from a packed cell id.
47
+
48
+ ### `pf_new_map(): int[]`
49
+
50
+ Allocate a 256-element obstacle map with all cells open.
51
+
52
+ ### `pf_set_blocked(map: int[], x: int, z: int)`
53
+
54
+ Mark `(x, z)` as blocked by writing `1`.
55
+
56
+ ### `pf_set_open(map: int[], x: int, z: int)`
57
+
58
+ Mark `(x, z)` as open by writing `0`.
59
+
60
+ ### `pf_is_blocked(map: int[], x: int, z: int): int`
61
+
62
+ Return `1` if the cell is blocked or out of bounds, otherwise `0`.
63
+
64
+ ## Heuristic Helper
65
+
66
+ ### `pf_heuristic(x1: int, z1: int, x2: int, z2: int): int`
67
+
68
+ Return Manhattan distance in ×10000 fixed-point form.
69
+
70
+ This function is informational in the current module. `pathfind_bfs()` does not use it, but it is useful if you build A* on top of the same map representation.
71
+
72
+ ## Synchronous Pathfinding
73
+
74
+ ### `pathfind_bfs(map: int[], sx: int, sz: int, gx: int, gz: int): int[]`
75
+
76
+ Find the shortest 4-direction path from start to goal.
77
+
78
+ - Returns packed coordinates from start to goal, inclusive.
79
+ - Returns `[]` when no path exists.
80
+ - Expansion order is North, South, West, East.
81
+
82
+ Because this is BFS on a uniform-cost grid, the returned path is shortest in number of steps.
83
+
84
+ ## Coroutine Pathfinding
85
+
86
+ ### `pathfind_bfs_coro(map: int[], sx: int, sz: int, gx: int, gz: int, out: int[])`
87
+
88
+ Coroutine version of BFS:
89
+
90
+ - Decorated with `@coroutine(batch=16, onDone=pf_noop)`.
91
+ - Processes up to 16 BFS iterations per tick.
92
+ - Cannot return a value directly, so it pushes the finished path into `out`.
93
+
94
+ Use this when a synchronous search would be too expensive in one tick.
95
+
96
+ ### `pf_noop()`
97
+
98
+ Default empty `onDone` callback for the coroutine variant.
99
+
100
+ ## Notes
101
+
102
+ - The grid is hard-coded to `0..15` on both axes.
103
+ - Start and goal cells are not validated explicitly before indexing, so callers should pass valid coordinates.
104
+ - `pf_is_blocked()` treats out-of-bounds cells as blocked, which keeps BFS inside the grid.
@@ -0,0 +1,134 @@
1
+ # `physics` — Simple Fixed-Point Physics Helpers
2
+
3
+ Import: `import "stdlib/physics.mcrs"`
4
+
5
+ Simple physics simulation helpers for Minecraft datapacks. This module uses per-axis integer math and a fixed-point scale of **×100**, where `100` means `1.0 block` or `1.0 block/tick` depending on context.
6
+
7
+ ## Units
8
+
9
+ - Position: blocks ×100
10
+ - Velocity: blocks/tick ×100
11
+ - Time: ticks
12
+ - Gravity: `8` means `0.08 blocks/tick^2`
13
+ - Drag and restitution: ×10000
14
+
15
+ ## Quick Example
16
+
17
+ ```rs
18
+ import "stdlib/physics.mcrs";
19
+
20
+ let y0: int = 6400; // 64.00 blocks
21
+ let vy0: int = 120; // 1.20 blocks/tick
22
+ let t: int = 10;
23
+
24
+ let y: int = projectile_y(y0, vy0, t);
25
+ let vy: int = projectile_vy(vy0, t);
26
+
27
+ let bounced: int = bounce_v(vy, 7000); // 70% bounce
28
+ ```
29
+
30
+ ## Constants
31
+
32
+ ### `gravity_fx(): int`
33
+
34
+ Returns `8`, representing Minecraft-like gravity in ×100 units.
35
+
36
+ ### `air_drag_fx(): int`
37
+
38
+ Returns `9800`, meaning a drag factor of `0.98` per tick.
39
+
40
+ ### `water_drag_fx(): int`
41
+
42
+ Returns `8000`, meaning a drag factor of `0.80` per tick.
43
+
44
+ ## Projectile Motion
45
+
46
+ ### `projectile_y(p0: int, v0: int, t: int): int`
47
+
48
+ Vertical position after `t` ticks with constant gravity and no drag.
49
+
50
+ ### `projectile_x(p0: int, v0: int, t: int): int`
51
+
52
+ Horizontal position after `t` ticks with no drag.
53
+
54
+ ### `projectile_vy(v0: int, t: int): int`
55
+
56
+ Vertical velocity after `t` ticks of gravity.
57
+
58
+ ### `projectile_land_t(v0y: int): int`
59
+
60
+ Approximate tick when vertical position returns to launch height. Returns `0` if `v0y <= 0`.
61
+
62
+ ### `projectile_max_height(v0y: int): int`
63
+
64
+ Maximum height above the launch point in ×100 units.
65
+
66
+ ## Drag and Integration
67
+
68
+ ### `apply_drag(v_fx: int, drag_fx: int): int`
69
+
70
+ Apply one multiplicative drag step: `v * drag / 10000`.
71
+
72
+ ### `apply_gravity(vy_fx: int): int`
73
+
74
+ Apply one gravity tick to a vertical velocity.
75
+
76
+ ### `update_pos(p_fx: int, v_fx: int): int`
77
+
78
+ Advance one tick by adding velocity directly to position.
79
+
80
+ ## Collision and Clamping
81
+
82
+ ### `bounce_v(v_fx: int, restitution_fx: int): int`
83
+
84
+ Reflect velocity and apply a restitution factor.
85
+
86
+ - `10000` = perfectly elastic
87
+ - `5000` = half-speed rebound
88
+ - `0` = no rebound
89
+
90
+ ### `clamp_velocity(v_fx: int, max_fx: int): int`
91
+
92
+ Clamp velocity into `[-max_fx, max_fx]`.
93
+
94
+ ## Spring Helpers
95
+
96
+ ### `spring_force(pos_fx: int, target_fx: int, k_fx: int): int`
97
+
98
+ Hooke-style spring force toward `target_fx`, with `k_fx` scaled by ×10000.
99
+
100
+ ### `spring_update_v(v_fx: int, pos_fx: int, target_fx: int, k_fx: int, damping_fx: int): int`
101
+
102
+ Apply spring force and damping to produce the next velocity estimate.
103
+
104
+ ## Circular Motion
105
+
106
+ This section depends on trig helpers from `stdlib/math`.
107
+
108
+ ### `circular_x(cx: int, r: int, angle_deg: int): int`
109
+
110
+ X coordinate on a circle around center `cx`.
111
+
112
+ ### `circular_z(cz: int, r: int, angle_deg: int): int`
113
+
114
+ Z coordinate on a circle around center `cz`.
115
+
116
+ ## Friction and Impact
117
+
118
+ ### `friction_decel(v_fx: int, friction_fx: int): int`
119
+
120
+ Reduce velocity toward zero by a fixed per-tick amount.
121
+
122
+ ### `is_grounded(y_fx: int, ground_y_fx: int): int`
123
+
124
+ Return `1` if `y_fx <= ground_y_fx`, otherwise `0`.
125
+
126
+ ### `impact_velocity(h_fx: int): int`
127
+
128
+ Approximate impact speed from a fall height in ×100 units. Returns `0` for non-positive heights.
129
+
130
+ ## Notes
131
+
132
+ - This module is intentionally simple and axis-separated.
133
+ - No vector type is used; callers combine `x`, `y`, and `z` themselves.
134
+ - `circular_x()`, `circular_z()`, and `impact_velocity()` rely on math helpers such as `sin_fixed`, `cos_fixed`, and `isqrt`.
@@ -0,0 +1,135 @@
1
+ # `quaternion` — Fixed-Point Quaternion Math
2
+
3
+ Import: `import "stdlib/quaternion.mcrs"`
4
+
5
+ Quaternion helpers for Minecraft Display Entity rotations. Components are stored separately, each in **×10000** scale, matching the `[x, y, z, w]` convention used by display entity rotation fields.
6
+
7
+ Requires `stdlib/math` for `sin_fixed()`, `cos_fixed()`, `mulfix()`, and `isqrt()`.
8
+
9
+ ## Scale and Conventions
10
+
11
+ - `10000` means `1.0`
12
+ - Identity quaternion is `(0, 0, 0, 10000)`
13
+ - A unit quaternion has `qx^2 + qy^2 + qz^2 + qw^2 ≈ 10000^2`
14
+ - Euler conversion uses **YXZ** order: yaw, then pitch, then roll
15
+
16
+ ## Quick Example
17
+
18
+ ```rs
19
+ import "stdlib/quaternion.mcrs";
20
+
21
+ let qx: int = quat_axis_y_x(90);
22
+ let qy: int = quat_axis_y_y(90);
23
+ let qz: int = quat_axis_y_z(90);
24
+ let qw: int = quat_axis_y_w(90);
25
+
26
+ let mid_y: int = quat_slerp_y(0, 0, 0, 10000, qx, qy, qz, qw, 500);
27
+ ```
28
+
29
+ ## Identity Quaternion
30
+
31
+ ### `quat_identity_w(): int`
32
+
33
+ Return `10000`.
34
+
35
+ ### `quat_identity_x(): int`
36
+
37
+ Return `0`.
38
+
39
+ ### `quat_identity_y(): int`
40
+
41
+ Return `0`.
42
+
43
+ ### `quat_identity_z(): int`
44
+
45
+ Return `0`.
46
+
47
+ ## Axis-Angle Constructors
48
+
49
+ Each axis-angle constructor is split into per-component functions. Angles are plain integer degrees, and the implementation uses `sin(angle / 2)` and `cos(angle / 2)`.
50
+
51
+ ### X-axis rotation
52
+
53
+ - `quat_axis_x_x(angle_deg: int): int`
54
+ - `quat_axis_x_y(angle_deg: int): int`
55
+ - `quat_axis_x_z(angle_deg: int): int`
56
+ - `quat_axis_x_w(angle_deg: int): int`
57
+
58
+ ### Y-axis rotation
59
+
60
+ - `quat_axis_y_x(angle_deg: int): int`
61
+ - `quat_axis_y_y(angle_deg: int): int`
62
+ - `quat_axis_y_z(angle_deg: int): int`
63
+ - `quat_axis_y_w(angle_deg: int): int`
64
+
65
+ ### Z-axis rotation
66
+
67
+ - `quat_axis_z_x(angle_deg: int): int`
68
+ - `quat_axis_z_y(angle_deg: int): int`
69
+ - `quat_axis_z_z(angle_deg: int): int`
70
+ - `quat_axis_z_w(angle_deg: int): int`
71
+
72
+ ## Quaternion Product
73
+
74
+ These functions compute the component-wise result of `a * b`.
75
+
76
+ - `quat_mul_x(ax, ay, az, aw, bx, by, bz, bw): int`
77
+ - `quat_mul_y(ax, ay, az, aw, bx, by, bz, bw): int`
78
+ - `quat_mul_z(ax, ay, az, aw, bx, by, bz, bw): int`
79
+ - `quat_mul_w(ax, ay, az, aw, bx, by, bz, bw): int`
80
+
81
+ Use them together when composing rotations.
82
+
83
+ ## Conjugate
84
+
85
+ For unit quaternions, the conjugate is also the inverse.
86
+
87
+ - `quat_conj_x(qx, qy, qz, qw): int`
88
+ - `quat_conj_y(qx, qy, qz, qw): int`
89
+ - `quat_conj_z(qx, qy, qz, qw): int`
90
+ - `quat_conj_w(qx, qy, qz, qw): int`
91
+
92
+ ## Magnitude and Dot
93
+
94
+ ### `quat_mag_sq(qx: int, qy: int, qz: int, qw: int): int`
95
+
96
+ Return magnitude squared in ×10000 scale. A normalized quaternion should be close to `10000`.
97
+
98
+ ### `quat_dot(ax: int, ay: int, az: int, aw: int, bx: int, by: int, bz: int, bw: int): int`
99
+
100
+ Return dot product in ×10000 scale.
101
+
102
+ ## Interpolation
103
+
104
+ ### `quat_slerp_x(ax: int, ay: int, az: int, aw: int, bx: int, by: int, bz: int, bw: int, t: int): int`
105
+
106
+ ### `quat_slerp_y(ax: int, ay: int, az: int, aw: int, bx: int, by: int, bz: int, bw: int, t: int): int`
107
+
108
+ ### `quat_slerp_z(ax: int, ay: int, az: int, aw: int, bx: int, by: int, bz: int, bw: int, t: int): int`
109
+
110
+ ### `quat_slerp_w(ax: int, ay: int, az: int, aw: int, bx: int, by: int, bz: int, bw: int, t: int): int`
111
+
112
+ Approximate spherical interpolation between `a` and `b`.
113
+
114
+ - `t` is in `[0, 1000]`
115
+ - `0` returns `a`
116
+ - `1000` returns `b`
117
+
118
+ Implementation detail: this is a lerp-plus-normalize approximation rather than true trig-based SLERP, which is cheaper and suitable for Minecraft animation.
119
+
120
+ ## Euler to Quaternion
121
+
122
+ ### `quat_euler_x(yaw: int, pitch: int, roll: int): int`
123
+
124
+ ### `quat_euler_y(yaw: int, pitch: int, roll: int): int`
125
+
126
+ ### `quat_euler_z(yaw: int, pitch: int, roll: int): int`
127
+
128
+ ### `quat_euler_w(yaw: int, pitch: int, roll: int): int`
129
+
130
+ Convert yaw, pitch, and roll in degrees into a quaternion using YXZ order.
131
+
132
+ ## Notes
133
+
134
+ - These helpers return components separately instead of a single array, which matches how RedScript users often write NBT fields.
135
+ - Axis-angle constructors and Euler conversion depend on the math trig tables being available.
@@ -0,0 +1,104 @@
1
+ # `graph` — 有向与无向加权图
2
+
3
+ 导入:`import "stdlib/graph.mcrs"`
4
+
5
+ RedScript datapack 的固定容量图工具。图存储在单个扁平 `int[]` 中,支持最多 **64 个节点**与 **256 条有向边**,并提供遍历与最短路径辅助函数,无需额外的图对象类型。
6
+
7
+ ## 数据布局
8
+
9
+ `graph_new()` 会分配一个 770 元素的 `int[]`,布局如下:
10
+
11
+ | 索引 | 含义 |
12
+ |------|------|
13
+ | `g[0]` | 当前有向边数量 |
14
+ | `g[1]` | 节点数量 |
15
+ | `g[2 + i * 3]` | 第 `i` 条边的起点 |
16
+ | `g[2 + i * 3 + 1]` | 第 `i` 条边的终点 |
17
+ | `g[2 + i * 3 + 2]` | 第 `i` 条边的权重 |
18
+
19
+ 节点使用从 `0` 开始的整数编号,范围为 `[0, graph_node_count(g))`。
20
+
21
+ ## 快速示例
22
+
23
+ ```rs
24
+ import "stdlib/graph.mcrs";
25
+
26
+ let g: int[] = graph_new(5);
27
+ g = graph_add_edge(g, 0, 1, 1);
28
+ g = graph_add_edge(g, 0, 2, 4);
29
+ g = graph_add_undirected(g, 2, 3, 2);
30
+ g = graph_add_edge(g, 1, 3, 2);
31
+ g = graph_add_edge(g, 3, 4, 1);
32
+
33
+ let vis: int[] = [0, 0, 0, 0, 0];
34
+ let bfs_order: int[] = graph_bfs(g, 0, vis);
35
+
36
+ let dist: int[] = [0, 0, 0, 0, 0];
37
+ let shortest: int = graph_shortest_path(g, 0, 4, dist);
38
+ // shortest = 4,对应 0 -> 1 -> 3 -> 4
39
+ ```
40
+
41
+ ## 函数
42
+
43
+ ### `graph_new(n: int): int[]`
44
+
45
+ 创建一个包含 `n` 个节点、初始无边的新图。`n` 会被限制到 `[0, 64]`。
46
+
47
+ ### `graph_add_edge(g: int[], src: int, dst: int, weight: int): int[]`
48
+
49
+ 追加一条 `src -> dst` 的有向边。若 `src` 或 `dst` 非法,或者图中已经有 256 条有向边,则原样返回输入图。
50
+
51
+ ### `graph_add_undirected(g: int[], a: int, b: int, weight: int): int[]`
52
+
53
+ 追加 `a -> b` 与 `b -> a` 两条同权重边,相当于加入一条无向边。会消耗两个有向边槽位。
54
+
55
+ ### `graph_node_count(g: int[]): int`
56
+
57
+ 返回图配置的节点数。
58
+
59
+ ### `graph_edge_count(g: int[]): int`
60
+
61
+ 返回当前有向边数量。
62
+
63
+ ### `graph_bfs(g: int[], start: int, out_visited: int[]): int[]`
64
+
65
+ 从 `start` 开始执行广度优先搜索。
66
+
67
+ - 返回按 BFS 顺序访问的节点索引数组。
68
+ - 对每个可达节点,把 `out_visited[i]` 写成 `1`。
69
+ - 如果 `start` 非法,则返回 `[]`。
70
+
71
+ `out_visited` 至少需要有 `graph_node_count(g)` 个槽位,并且应由调用方先初始化为全 0。
72
+
73
+ ### `graph_dfs(g: int[], start: int, out_visited: int[]): int[]`
74
+
75
+ 从 `start` 开始执行深度优先搜索。
76
+
77
+ - 返回按 DFS 顺序访问的节点索引数组。
78
+ - 对每个可达节点,把 `out_visited[i]` 写成 `1`。
79
+ - 如果 `start` 非法,则返回 `[]`。
80
+
81
+ 与 `graph_bfs()` 一样,输出数组的大小由调用方保证。
82
+
83
+ ### `graph_has_path(g: int[], src: int, dst: int): int`
84
+
85
+ 若从 `src` 到 `dst` 存在有向路径则返回 `1`,否则返回 `0`。
86
+
87
+ - 端点非法时同样返回 `0`。
88
+ - 实现上会对存储的有向边做一次 BFS。
89
+
90
+ ### `graph_shortest_path(g: int[], src: int, dst: int, out_dist: int[]): int`
91
+
92
+ 从 `src` 运行 Dijkstra,并把最短距离写入 `out_dist`。
93
+
94
+ - `out_dist[i]` 会变成从 `src` 到节点 `i` 的最短距离。
95
+ - 不可达节点会写成 `-1`。
96
+ - 函数返回 `out_dist[dst]`。
97
+ - `src` 或 `dst` 非法时返回 `-1`。
98
+
99
+ ## 说明
100
+
101
+ - 边权重是普通整数。
102
+ - 不安全支持负权重,因为这里使用的是 Dijkstra。
103
+ - `graph_bfs()` 与 `graph_dfs()` 的内部工作数组按 64 个节点固定分配。
104
+ - `graph_shortest_path()` 内部使用 `999999` 作为无穷大哨兵值。
@@ -0,0 +1,113 @@
1
+ # `parabola` — 抛射瞄准与轨迹辅助
2
+
3
+ 导入:`import "stdlib/parabola.mcrs"`
4
+
5
+ 用于 Minecraft 风格抛射运动的辅助函数。这个模块主要服务于发射参数求解与简单逐 tick 模拟,速度使用 **×10000 定点**,重力常量也按 Minecraft 抛射物运动进行调整。
6
+
7
+ ## 单位约定
8
+
9
+ - 位置偏移:方块
10
+ - 速度:方块/刻 ×10000
11
+ - 时间:tick
12
+ - 重力:`800` 表示 `0.08 方块/tick^2`
13
+ - 阻力:×10000
14
+
15
+ 依赖 `stdlib/math` 提供的 `mulfix()` 与 `isqrt()`。
16
+
17
+ ## 快速示例
18
+
19
+ ```rs
20
+ import "stdlib/parabola.mcrs";
21
+
22
+ let ticks: int = 20;
23
+ let vx: int = parabola_vx(16, ticks);
24
+ let vy: int = parabola_vy(4, ticks);
25
+ let vz: int = parabola_vz(0, ticks);
26
+
27
+ let y_at_10: int = parabola_y(vy, 10);
28
+ let flight: int = parabola_flight_time(vy);
29
+ ```
30
+
31
+ ## 常量
32
+
33
+ ### `parabola_gravity(): int`
34
+
35
+ 返回 `800`,表示 ×10000 缩放下每 tick 的重力常量。
36
+
37
+ ### `parabola_gravity_half(): int`
38
+
39
+ 返回 `400`,用于位移公式中的 `g / 2` 项。
40
+
41
+ ## 初速度求解
42
+
43
+ ### `parabola_vx(dx: int, ticks: int): int`
44
+
45
+ 计算在 `ticks` tick 内移动 `dx` 方块所需的初始 X 速度。若 `ticks <= 0` 返回 `0`。
46
+
47
+ ### `parabola_vy(dy: int, ticks: int): int`
48
+
49
+ 计算在恒定重力下,于 `ticks` tick 后达到垂直偏移 `dy` 所需的初始 Y 速度。若 `ticks <= 0` 返回 `0`。
50
+
51
+ ### `parabola_vz(dz: int, ticks: int): int`
52
+
53
+ 计算在 `ticks` tick 内移动 `dz` 方块所需的初始 Z 速度。若 `ticks <= 0` 返回 `0`。
54
+
55
+ ### `parabola_speed_xz(dx: int, dz: int, ticks: int): int`
56
+
57
+ 根据求得的 `vx` 和 `vz` 计算水平速度模长,返回值为 ×10000 缩放。
58
+
59
+ ## 第 `t` Tick 的位置
60
+
61
+ ### `parabola_x(vx0: int, t: int): int`
62
+
63
+ 返回经过 `t` tick 后的 X 方向位移。
64
+
65
+ ### `parabola_y(vy0: int, t: int): int`
66
+
67
+ 返回在恒定重力下经过 `t` tick 后的 Y 方向位移。
68
+
69
+ ### `parabola_z(vz0: int, t: int): int`
70
+
71
+ 返回经过 `t` tick 后的 Z 方向位移。
72
+
73
+ ## 飞行估算
74
+
75
+ ### `parabola_flight_time(vy0: int): int`
76
+
77
+ 近似返回抛射物回到发射高度所需的 tick 数。若 `vy0 <= 0` 返回 `0`。
78
+
79
+ ### `parabola_max_height(vy0: int): int`
80
+
81
+ 近似返回相对发射点的最高高度,单位为方块。
82
+
83
+ ## 逐 Tick 阻力辅助
84
+
85
+ 这些函数用于逐 tick 模拟,而不是封闭形式的瞄准求解。
86
+
87
+ ### `parabola_step_vx(vx: int, drag: int): int`
88
+
89
+ 对 X 速度应用一次阻力。
90
+
91
+ ### `parabola_step_vy(vy: int, drag: int): int`
92
+
93
+ 先施加重力,再对 Y 速度应用阻力。
94
+
95
+ ### `parabola_step_vz(vz: int, drag: int): int`
96
+
97
+ 对 Z 速度应用一次阻力。
98
+
99
+ ## 目标辅助
100
+
101
+ ### `parabola_ticks_for_range(range: int): int`
102
+
103
+ 根据一个简单的平均速度启发式,为水平射程估算一个实用的飞行 tick 数。返回值至少为 `1`。
104
+
105
+ ### `parabola_in_range(dx: int, dz: int, max_range: int): int`
106
+
107
+ 若目标在水平最大范围 `max_range` 内则返回 `1`,否则返回 `0`。
108
+
109
+ ## 说明
110
+
111
+ - 这里的封闭形式位置函数默认不考虑阻力。
112
+ - 考虑阻力时,只提供逐 tick 的速度推进辅助。
113
+ - `parabola_y()` 与 `parabola_max_height()` 返回整数方块值,因此会有截断误差。
@@ -0,0 +1,104 @@
1
+ # `pathfind` — 16×16 网格 BFS 寻路
2
+
3
+ 导入:`import "stdlib/pathfind.mcrs"`
4
+
5
+ 在固定 **16×16** XZ 网格上执行广度优先寻路。障碍物保存在一个 256 元素的 `int[]` 中,路径结果则以压缩坐标数组的形式返回。
6
+
7
+ ## 坐标压缩
8
+
9
+ 单元格编码方式:
10
+
11
+ ```text
12
+ packed = x * 16 + z
13
+ ```
14
+
15
+ 对应辅助函数:
16
+
17
+ - `pf_unpack_x(packed) = packed / 16`
18
+ - `pf_unpack_z(packed) = packed % 16`
19
+
20
+ ## 快速示例
21
+
22
+ ```rs
23
+ import "stdlib/pathfind.mcrs";
24
+
25
+ let map: int[] = pf_new_map();
26
+ pf_set_blocked(map, 3, 5);
27
+ pf_set_blocked(map, 3, 6);
28
+
29
+ let path: int[] = pathfind_bfs(map, 0, 0, 7, 7);
30
+ let first_x: int = pf_unpack_x(path[0]);
31
+ let first_z: int = pf_unpack_z(path[0]);
32
+ ```
33
+
34
+ ## 地图辅助
35
+
36
+ ### `pf_pack(x: int, z: int): int`
37
+
38
+ 将网格坐标压缩为一个整数。
39
+
40
+ ### `pf_unpack_x(packed: int): int`
41
+
42
+ 从压缩坐标中取回 X。
43
+
44
+ ### `pf_unpack_z(packed: int): int`
45
+
46
+ 从压缩坐标中取回 Z。
47
+
48
+ ### `pf_new_map(): int[]`
49
+
50
+ 创建一个 256 元素的障碍图,初始时所有单元都可通行。
51
+
52
+ ### `pf_set_blocked(map: int[], x: int, z: int)`
53
+
54
+ 把 `(x, z)` 标记为阻塞,写入 `1`。
55
+
56
+ ### `pf_set_open(map: int[], x: int, z: int)`
57
+
58
+ 把 `(x, z)` 标记为可通行,写入 `0`。
59
+
60
+ ### `pf_is_blocked(map: int[], x: int, z: int): int`
61
+
62
+ 若单元阻塞或越界则返回 `1`,否则返回 `0`。
63
+
64
+ ## 启发式辅助
65
+
66
+ ### `pf_heuristic(x1: int, z1: int, x2: int, z2: int): int`
67
+
68
+ 返回 ×10000 缩放的曼哈顿距离。
69
+
70
+ 当前模块里这个函数主要是信息性辅助,`pathfind_bfs()` 本身并不会使用它;如果你要在同样的数据结构上扩展 A*,它会很有用。
71
+
72
+ ## 同步寻路
73
+
74
+ ### `pathfind_bfs(map: int[], sx: int, sz: int, gx: int, gz: int): int[]`
75
+
76
+ 寻找从起点到终点的最短四方向路径。
77
+
78
+ - 返回从起点到终点的压缩坐标数组,包含两端。
79
+ - 无路可走时返回 `[]`。
80
+ - 扩展邻居的顺序为 North、South、West、East。
81
+
82
+ 因为这是统一代价网格上的 BFS,所以返回路径在步数意义下是最短的。
83
+
84
+ ## 协程寻路
85
+
86
+ ### `pathfind_bfs_coro(map: int[], sx: int, sz: int, gx: int, gz: int, out: int[])`
87
+
88
+ BFS 的协程版本:
89
+
90
+ - 带有 `@coroutine(batch=16, onDone=pf_noop)` 注解。
91
+ - 每个 tick 最多处理 16 次 BFS 迭代。
92
+ - 不能直接返回值,因此会把完成后的路径 push 到 `out`。
93
+
94
+ 当你不想把一次同步搜索的开销集中在单个 tick 内时,用这个版本更合适。
95
+
96
+ ### `pf_noop()`
97
+
98
+ 协程版本默认的空 `onDone` 回调。
99
+
100
+ ## 说明
101
+
102
+ - 网格范围固定为两个轴的 `0..15`。
103
+ - 起点和终点不会在索引前做显式边界校验,因此调用方应保证坐标有效。
104
+ - `pf_is_blocked()` 会把越界位置视为阻塞,从而保证 BFS 不会走出地图。