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.
- package/.github/workflows/ci.yml +11 -0
- package/CHANGELOG.md +18 -9
- package/README-benchmarks.md +48 -0
- package/README-vscode-test.md +251 -0
- package/RELEASE_NOTES.md +74 -0
- package/ROADMAP.md +131 -167
- package/benchmarks/_shared.ts +468 -0
- package/benchmarks/baseline.json +2816 -0
- package/benchmarks/baseline.md +13 -0
- package/benchmarks/compiler-perf.report.json +207 -0
- package/benchmarks/compiler-perf.ts +76 -0
- package/benchmarks/results.md +13 -0
- package/benchmarks/stdlib-complexity.report.json +2606 -0
- package/benchmarks/stdlib-complexity.ts +54 -0
- package/benchmarks/stdlib-size.md +57 -0
- package/benchmarks/stdlib-size.ts +91 -0
- package/coverage-report.md +177 -0
- package/dist/src/__tests__/budget.test.js +4 -0
- package/dist/src/__tests__/cache/cache-behavior.test.d.ts +10 -0
- package/dist/src/__tests__/cache/cache-behavior.test.js +425 -0
- package/dist/src/__tests__/cache-extra.test.d.ts +5 -0
- package/dist/src/__tests__/cache-extra.test.js +211 -0
- package/dist/src/__tests__/cli-init.test.d.ts +1 -0
- package/dist/src/__tests__/cli-init.test.js +97 -0
- package/dist/src/__tests__/cli-publish.test.d.ts +9 -0
- package/dist/src/__tests__/cli-publish.test.js +189 -0
- package/dist/src/__tests__/cli.test.js +76 -0
- package/dist/src/__tests__/compile-preprocess.test.d.ts +11 -0
- package/dist/src/__tests__/compile-preprocess.test.js +328 -0
- package/dist/src/__tests__/compiler/break-stmt.test.d.ts +1 -0
- package/dist/src/__tests__/compiler/break-stmt.test.js +58 -0
- package/dist/src/__tests__/compiler/const-decl.test.d.ts +1 -0
- package/dist/src/__tests__/compiler/const-decl.test.js +123 -0
- package/dist/src/__tests__/compiler/continue-stmt.test.d.ts +1 -0
- package/dist/src/__tests__/compiler/continue-stmt.test.js +67 -0
- package/dist/src/__tests__/compiler/coroutine-extended.test.d.ts +17 -0
- package/dist/src/__tests__/compiler/coroutine-extended.test.js +565 -0
- package/dist/src/__tests__/compiler/deprecated.test.d.ts +4 -0
- package/dist/src/__tests__/compiler/deprecated.test.js +285 -0
- package/dist/src/__tests__/compiler/do-while.test.d.ts +1 -0
- package/dist/src/__tests__/compiler/do-while.test.js +120 -0
- package/dist/src/__tests__/compiler/enum-payload.test.d.ts +9 -0
- package/dist/src/__tests__/compiler/enum-payload.test.js +272 -0
- package/dist/src/__tests__/compiler/interface.test.d.ts +10 -0
- package/dist/src/__tests__/compiler/interface.test.js +258 -0
- package/dist/src/__tests__/compiler/labeled-loops.test.d.ts +1 -0
- package/dist/src/__tests__/compiler/labeled-loops.test.js +263 -0
- package/dist/src/__tests__/compiler/match-string.test.d.ts +1 -0
- package/dist/src/__tests__/compiler/match-string.test.js +43 -0
- package/dist/src/__tests__/compiler/memoize.test.d.ts +1 -0
- package/dist/src/__tests__/compiler/memoize.test.js +113 -0
- package/dist/src/__tests__/compiler/method-chain.test.d.ts +5 -0
- package/dist/src/__tests__/compiler/method-chain.test.js +115 -0
- package/dist/src/__tests__/compiler/module-import.test.d.ts +12 -0
- package/dist/src/__tests__/compiler/module-import.test.js +261 -0
- package/dist/src/__tests__/compiler/option-extensions.test.d.ts +6 -0
- package/dist/src/__tests__/compiler/option-extensions.test.js +191 -0
- package/dist/src/__tests__/compiler/profile-decorator.test.d.ts +1 -0
- package/dist/src/__tests__/compiler/profile-decorator.test.js +69 -0
- package/dist/src/__tests__/compiler/string-advanced.test.d.ts +7 -0
- package/dist/src/__tests__/compiler/string-advanced.test.js +281 -0
- package/dist/src/__tests__/compiler/struct-extends.test.d.ts +1 -0
- package/dist/src/__tests__/compiler/struct-extends.test.js +95 -0
- package/dist/src/__tests__/compiler/throttle-retry.test.d.ts +1 -0
- package/dist/src/__tests__/compiler/throttle-retry.test.js +166 -0
- package/dist/src/__tests__/compiler/tuple-type.test.d.ts +10 -0
- package/dist/src/__tests__/compiler/tuple-type.test.js +229 -0
- package/dist/src/__tests__/compiler/watch-decorator.test.d.ts +1 -0
- package/dist/src/__tests__/compiler/watch-decorator.test.js +65 -0
- package/dist/src/__tests__/config/project-config.test.d.ts +1 -0
- package/dist/src/__tests__/config/project-config.test.js +199 -0
- package/dist/src/__tests__/config-decorator.test.d.ts +8 -0
- package/dist/src/__tests__/config-decorator.test.js +142 -0
- package/dist/src/__tests__/diagnostics-extra.test.d.ts +6 -0
- package/dist/src/__tests__/diagnostics-extra.test.js +132 -0
- package/dist/src/__tests__/emit/compile-branches.test.d.ts +1 -0
- package/dist/src/__tests__/emit/compile-branches.test.js +123 -0
- package/dist/src/__tests__/emit/compile-coverage.test.d.ts +25 -0
- package/dist/src/__tests__/emit/compile-coverage.test.js +617 -0
- package/dist/src/__tests__/emit/compile-extra-branches.test.d.ts +12 -0
- package/dist/src/__tests__/emit/compile-extra-branches.test.js +225 -0
- package/dist/src/__tests__/emit/compile-mocked-branches.test.d.ts +0 -0
- package/dist/src/__tests__/emit/compile-mocked-branches.test.js +238 -0
- package/dist/src/__tests__/emit/execute-chain.test.d.ts +10 -0
- package/dist/src/__tests__/emit/execute-chain.test.js +94 -0
- package/dist/src/__tests__/emit/index.test.js +2 -1
- package/dist/src/__tests__/emit/modules-branches.test.d.ts +1 -0
- package/dist/src/__tests__/emit/modules-branches.test.js +88 -0
- package/dist/src/__tests__/emit/modules-coverage.test.d.ts +15 -0
- package/dist/src/__tests__/emit/modules-coverage.test.js +221 -0
- package/dist/src/__tests__/emit/modules-errors.test.d.ts +12 -0
- package/dist/src/__tests__/emit/modules-errors.test.js +169 -0
- package/dist/src/__tests__/emit/modules-rewrite.test.d.ts +17 -0
- package/dist/src/__tests__/emit/modules-rewrite.test.js +204 -0
- package/dist/src/__tests__/emit/source-map.test.d.ts +1 -0
- package/dist/src/__tests__/emit/source-map.test.js +167 -0
- package/dist/src/__tests__/enum.test.js +9 -4
- package/dist/src/__tests__/error-recovery.test.d.ts +7 -0
- package/dist/src/__tests__/error-recovery.test.js +217 -0
- package/dist/src/__tests__/events-types-extra.test.d.ts +10 -0
- package/dist/src/__tests__/events-types-extra.test.js +91 -0
- package/dist/src/__tests__/events-types.test.d.ts +4 -0
- package/dist/src/__tests__/events-types.test.js +56 -0
- package/dist/src/__tests__/formatter.test.js +13 -5
- package/dist/src/__tests__/hir/lower-extra.test.d.ts +9 -0
- package/dist/src/__tests__/hir/lower-extra.test.js +140 -0
- package/dist/src/__tests__/hir/monomorphize-extra.test.d.ts +15 -0
- package/dist/src/__tests__/hir/monomorphize-extra.test.js +200 -0
- package/dist/src/__tests__/hir/monomorphize-extra2.test.d.ts +16 -0
- package/dist/src/__tests__/hir/monomorphize-extra2.test.js +316 -0
- package/dist/src/__tests__/incremental.test.js +10 -2
- package/dist/src/__tests__/index-extra.test.d.ts +10 -0
- package/dist/src/__tests__/index-extra.test.js +71 -0
- package/dist/src/__tests__/lexer.test.js +2 -2
- package/dist/src/__tests__/lint/rules.test.d.ts +5 -0
- package/dist/src/__tests__/lint/rules.test.js +208 -0
- package/dist/src/__tests__/lir/lower.test.js +29 -0
- package/dist/src/__tests__/lir/verify.test.js +30 -0
- package/dist/src/__tests__/lsp/completion.test.d.ts +7 -0
- package/dist/src/__tests__/lsp/completion.test.js +583 -0
- package/dist/src/__tests__/lsp/definition.test.d.ts +7 -0
- package/dist/src/__tests__/lsp/definition.test.js +454 -0
- package/dist/src/__tests__/lsp/diagnostics.test.d.ts +10 -0
- package/dist/src/__tests__/lsp/diagnostics.test.js +98 -0
- package/dist/src/__tests__/lsp/hover-docs.test.d.ts +10 -0
- package/dist/src/__tests__/lsp/hover-docs.test.js +210 -0
- package/dist/src/__tests__/lsp.test.js +4 -1
- package/dist/src/__tests__/mc-integration/item-entity-events.test.js +4 -0
- package/dist/src/__tests__/mc-integration/stdlib-coverage-2.test.js +4 -0
- package/dist/src/__tests__/mc-integration/stdlib-coverage-3.test.d.ts +13 -0
- package/dist/src/__tests__/mc-integration/stdlib-coverage-3.test.js +1227 -0
- package/dist/src/__tests__/mc-integration/stdlib-coverage-4.test.d.ts +13 -0
- package/dist/src/__tests__/mc-integration/stdlib-coverage-4.test.js +1509 -0
- package/dist/src/__tests__/mc-integration/stdlib-coverage-5.test.d.ts +14 -0
- package/dist/src/__tests__/mc-integration/stdlib-coverage-5.test.js +1374 -0
- package/dist/src/__tests__/mc-integration/stdlib-coverage-6.test.d.ts +10 -0
- package/dist/src/__tests__/mc-integration/stdlib-coverage-6.test.js +759 -0
- package/dist/src/__tests__/mc-integration/stdlib-coverage-7.test.d.ts +13 -0
- package/dist/src/__tests__/mc-integration/stdlib-coverage-7.test.js +855 -0
- package/dist/src/__tests__/mc-integration/stdlib-coverage.test.js +4 -0
- package/dist/src/__tests__/mc-integration/syntax-coverage.test.js +4 -0
- package/dist/src/__tests__/mc-validator-coverage.test.d.ts +13 -0
- package/dist/src/__tests__/mc-validator-coverage.test.js +296 -0
- package/dist/src/__tests__/mc-validator-extra.test.d.ts +13 -0
- package/dist/src/__tests__/mc-validator-extra.test.js +245 -0
- package/dist/src/__tests__/mir/lower-extra.test.d.ts +20 -0
- package/dist/src/__tests__/mir/lower-extra.test.js +361 -0
- package/dist/src/__tests__/mir/lower-extra2.test.d.ts +17 -0
- package/dist/src/__tests__/mir/lower-extra2.test.js +317 -0
- package/dist/src/__tests__/mir/lower-extra3.test.d.ts +19 -0
- package/dist/src/__tests__/mir/lower-extra3.test.js +249 -0
- package/dist/src/__tests__/mir/lower-extra4.test.d.ts +23 -0
- package/dist/src/__tests__/mir/lower-extra4.test.js +606 -0
- package/dist/src/__tests__/mir/lower-extra5.test.d.ts +25 -0
- package/dist/src/__tests__/mir/lower-extra5.test.js +543 -0
- package/dist/src/__tests__/mir/lower-extra6.test.d.ts +16 -0
- package/dist/src/__tests__/mir/lower-extra6.test.js +471 -0
- package/dist/src/__tests__/mir/lower-extra7.test.d.ts +35 -0
- package/dist/src/__tests__/mir/lower-extra7.test.js +921 -0
- package/dist/src/__tests__/mir/lower-extra8.test.d.ts +19 -0
- package/dist/src/__tests__/mir/lower-extra8.test.js +626 -0
- package/dist/src/__tests__/mir/lower-extra9.test.d.ts +14 -0
- package/dist/src/__tests__/mir/lower-extra9.test.js +717 -0
- package/dist/src/__tests__/optimizer/auto-inline.test.d.ts +1 -0
- package/dist/src/__tests__/optimizer/auto-inline.test.js +176 -0
- package/dist/src/__tests__/optimizer/cse.test.d.ts +4 -0
- package/dist/src/__tests__/optimizer/cse.test.js +178 -0
- package/dist/src/__tests__/optimizer/inline_fn.test.d.ts +1 -0
- package/dist/src/__tests__/optimizer/inline_fn.test.js +221 -0
- package/dist/src/__tests__/optimizer/licm.test.d.ts +1 -0
- package/dist/src/__tests__/optimizer/licm.test.js +244 -0
- package/dist/src/__tests__/optimizer/optimizer-extended.test.d.ts +12 -0
- package/dist/src/__tests__/optimizer/optimizer-extended.test.js +993 -0
- package/dist/src/__tests__/optimizer/strength-reduction.test.d.ts +1 -0
- package/dist/src/__tests__/optimizer/strength-reduction.test.js +86 -0
- package/dist/src/__tests__/optimizer/tco.test.d.ts +14 -0
- package/dist/src/__tests__/optimizer/tco.test.js +203 -0
- package/dist/src/__tests__/parser-coverage.test.d.ts +25 -0
- package/dist/src/__tests__/parser-coverage.test.js +491 -0
- package/dist/src/__tests__/parser-extra.test.d.ts +6 -0
- package/dist/src/__tests__/parser-extra.test.js +451 -0
- package/dist/src/__tests__/parser.test.js +12 -0
- package/dist/src/__tests__/repl-extra.test.d.ts +13 -0
- package/dist/src/__tests__/repl-extra.test.js +174 -0
- package/dist/src/__tests__/repl-server-extra.test.d.ts +10 -0
- package/dist/src/__tests__/repl-server-extra.test.js +161 -0
- package/dist/src/__tests__/repl-server.test.d.ts +6 -0
- package/dist/src/__tests__/repl-server.test.js +146 -0
- package/dist/src/__tests__/runtime-extra.test.d.ts +15 -0
- package/dist/src/__tests__/runtime-extra.test.js +732 -0
- package/dist/src/__tests__/singleton-decorator.test.d.ts +11 -0
- package/dist/src/__tests__/singleton-decorator.test.js +260 -0
- package/dist/src/__tests__/sourcemap.test.js +1 -1
- package/dist/src/__tests__/stdlib/advanced.test.d.ts +5 -0
- package/dist/src/__tests__/stdlib/advanced.test.js +301 -0
- package/dist/src/__tests__/stdlib/bigint.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/bigint.test.js +83 -0
- package/dist/src/__tests__/stdlib/bits.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/bits.test.js +96 -0
- package/dist/src/__tests__/stdlib/bossbar.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/bossbar.test.js +72 -0
- package/dist/src/__tests__/stdlib/color.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/color.test.js +84 -0
- package/dist/src/__tests__/stdlib/combat.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/combat.test.js +64 -0
- package/dist/src/__tests__/stdlib/cooldown.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/cooldown.test.js +64 -0
- package/dist/src/__tests__/stdlib/dialog.test.js +15 -7
- package/dist/src/__tests__/stdlib/ecs.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/ecs.test.js +81 -0
- package/dist/src/__tests__/stdlib/effects.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/effects.test.js +72 -0
- package/dist/src/__tests__/stdlib/events.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/events.test.js +55 -0
- package/dist/src/__tests__/stdlib/expr.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/expr.test.js +77 -0
- package/dist/src/__tests__/stdlib/fft.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/fft.test.js +82 -0
- package/dist/src/__tests__/stdlib/graph.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/graph.test.js +102 -0
- package/dist/src/__tests__/stdlib/interactions.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/interactions.test.js +60 -0
- package/dist/src/__tests__/stdlib/inventory.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/inventory.test.js +68 -0
- package/dist/src/__tests__/stdlib/linalg.test.d.ts +5 -0
- package/dist/src/__tests__/stdlib/linalg.test.js +78 -0
- package/dist/src/__tests__/stdlib/map.test.d.ts +1 -0
- package/dist/src/__tests__/stdlib/map.test.js +84 -0
- package/dist/src/__tests__/stdlib/math.test.js +19 -6
- package/dist/src/__tests__/stdlib/math_hp.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/math_hp.test.js +80 -0
- package/dist/src/__tests__/stdlib/mobs.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/mobs.test.js +61 -0
- package/dist/src/__tests__/stdlib/noise.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/noise.test.js +73 -0
- package/dist/src/__tests__/stdlib/ode.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/ode.test.js +68 -0
- package/dist/src/__tests__/stdlib/parabola.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/parabola.test.js +77 -0
- package/dist/src/__tests__/stdlib/particles.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/particles.test.js +68 -0
- package/dist/src/__tests__/stdlib/physics.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/physics.test.js +76 -0
- package/dist/src/__tests__/stdlib/player.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/player.test.js +64 -0
- package/dist/src/__tests__/stdlib/quaternion.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/quaternion.test.js +73 -0
- package/dist/src/__tests__/stdlib/queue.test.d.ts +1 -0
- package/dist/src/__tests__/stdlib/queue.test.js +97 -0
- package/dist/src/__tests__/stdlib/random.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/random.test.js +76 -0
- package/dist/src/__tests__/stdlib/result.test.d.ts +12 -0
- package/dist/src/__tests__/stdlib/result.test.js +329 -0
- package/dist/src/__tests__/stdlib/scheduler.test.js +19 -8
- package/dist/src/__tests__/stdlib/set_int.test.d.ts +1 -0
- package/dist/src/__tests__/stdlib/set_int.test.js +88 -0
- package/dist/src/__tests__/stdlib/sets.test.d.ts +6 -0
- package/dist/src/__tests__/stdlib/sets.test.js +60 -0
- package/dist/src/__tests__/stdlib/signal.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/signal.test.js +84 -0
- package/dist/src/__tests__/stdlib/spawn.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/spawn.test.js +68 -0
- package/dist/src/__tests__/stdlib/string.test.d.ts +12 -0
- package/dist/src/__tests__/stdlib/string.test.js +231 -0
- package/dist/src/__tests__/stdlib/strings.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/strings.test.js +83 -0
- package/dist/src/__tests__/stdlib/tags.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/tags.test.js +57 -0
- package/dist/src/__tests__/stdlib/teams.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/teams.test.js +72 -0
- package/dist/src/__tests__/stdlib/timer.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/timer.test.js +79 -0
- package/dist/src/__tests__/stdlib/vec.test.d.ts +5 -0
- package/dist/src/__tests__/stdlib/vec.test.js +94 -0
- package/dist/src/__tests__/stdlib/world.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/world.test.js +72 -0
- package/dist/src/__tests__/struct-display.test.d.ts +1 -0
- package/dist/src/__tests__/struct-display.test.js +64 -0
- package/dist/src/__tests__/test-framework/runner.test.d.ts +10 -0
- package/dist/src/__tests__/test-framework/runner.test.js +193 -0
- package/dist/src/__tests__/tuner/adapters.test.d.ts +14 -0
- package/dist/src/__tests__/tuner/adapters.test.js +194 -0
- package/dist/src/__tests__/tuner/simulator-extra.test.d.ts +4 -0
- package/dist/src/__tests__/tuner/simulator-extra.test.js +193 -0
- package/dist/src/__tests__/typechecker-coverage.test.d.ts +30 -0
- package/dist/src/__tests__/typechecker-coverage.test.js +627 -0
- package/dist/src/__tests__/typechecker.test.js +3 -3
- package/dist/src/__tests__/watch-decorator.test.d.ts +1 -0
- package/dist/src/__tests__/watch-decorator.test.js +54 -0
- package/dist/src/ast/types.d.ts +102 -3
- package/dist/src/cache/incremental.d.ts +13 -14
- package/dist/src/cache/incremental.js +106 -89
- package/dist/src/cache/index.d.ts +8 -2
- package/dist/src/cache/index.js +18 -6
- package/dist/src/cli.d.ts +1 -0
- package/dist/src/cli.js +466 -17
- package/dist/src/config/project-config.d.ts +29 -0
- package/dist/src/config/project-config.js +180 -0
- package/dist/src/diagnostics/index.d.ts +9 -0
- package/dist/src/diagnostics/index.js +18 -1
- package/dist/src/emit/compile.d.ts +10 -0
- package/dist/src/emit/compile.js +395 -50
- package/dist/src/emit/index.d.ts +40 -0
- package/dist/src/emit/index.js +307 -14
- package/dist/src/emit/modules.js +21 -3
- package/dist/src/emit/sourcemap.d.ts +23 -27
- package/dist/src/emit/sourcemap.js +52 -30
- package/dist/src/formatter/index.js +33 -8
- package/dist/src/hir/deprecated.d.ts +13 -0
- package/dist/src/hir/deprecated.js +218 -0
- package/dist/src/hir/lower.js +114 -8
- package/dist/src/hir/monomorphize.js +22 -2
- package/dist/src/hir/types.d.ts +65 -1
- package/dist/src/index.d.ts +6 -0
- package/dist/src/index.js +18 -3
- package/dist/src/lexer/index.d.ts +2 -1
- package/dist/src/lexer/index.js +39 -3
- package/dist/src/lint/index.d.ts +45 -0
- package/dist/src/lint/index.js +930 -0
- package/dist/src/lir/lower.js +29 -2
- package/dist/src/lir/types.d.ts +2 -0
- package/dist/src/lsp/server.js +92 -5
- package/dist/src/mir/lower.js +775 -34
- package/dist/src/mir/macro.js +36 -2
- package/dist/src/mir/types.d.ts +12 -0
- package/dist/src/mir/verify.js +9 -0
- package/dist/src/optimizer/auto-inline.d.ts +2 -0
- package/dist/src/optimizer/auto-inline.js +67 -0
- package/dist/src/optimizer/cse.d.ts +20 -0
- package/dist/src/optimizer/cse.js +234 -0
- package/dist/src/optimizer/inline.d.ts +26 -0
- package/dist/src/optimizer/inline.js +286 -0
- package/dist/src/optimizer/interprocedural.js +4 -0
- package/dist/src/optimizer/licm.d.ts +32 -0
- package/dist/src/optimizer/licm.js +371 -0
- package/dist/src/optimizer/pipeline.js +12 -2
- package/dist/src/optimizer/strength_reduction.d.ts +15 -0
- package/dist/src/optimizer/strength_reduction.js +90 -0
- package/dist/src/optimizer/tco.d.ts +53 -0
- package/dist/src/optimizer/tco.js +238 -0
- package/dist/src/parser/index.d.ts +32 -0
- package/dist/src/parser/index.js +421 -59
- package/dist/src/repl-server.d.ts +13 -0
- package/dist/src/repl-server.js +127 -0
- package/dist/src/structs/expand.d.ts +15 -0
- package/dist/src/structs/expand.js +46 -0
- package/dist/src/testing/runner.d.ts +40 -0
- package/dist/src/testing/runner.js +237 -0
- package/dist/src/typechecker/index.d.ts +3 -0
- package/dist/src/typechecker/index.js +254 -9
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/doc-drafts/redscript-docs/docs/en/stdlib/graph.md +104 -0
- package/doc-drafts/redscript-docs/docs/en/stdlib/parabola.md +113 -0
- package/doc-drafts/redscript-docs/docs/en/stdlib/pathfind.md +104 -0
- package/doc-drafts/redscript-docs/docs/en/stdlib/physics.md +134 -0
- package/doc-drafts/redscript-docs/docs/en/stdlib/quaternion.md +135 -0
- package/doc-drafts/redscript-docs/docs/zh/stdlib/graph.md +104 -0
- package/doc-drafts/redscript-docs/docs/zh/stdlib/parabola.md +113 -0
- package/doc-drafts/redscript-docs/docs/zh/stdlib/pathfind.md +104 -0
- package/doc-drafts/redscript-docs/docs/zh/stdlib/physics.md +134 -0
- package/doc-drafts/redscript-docs/docs/zh/stdlib/quaternion.md +135 -0
- package/docs/stdlib/result.md +156 -0
- package/docs/stdlib/result.zh.md +156 -0
- package/editors/vscode/fixtures/test.mcrs +7 -0
- package/editors/vscode/out/extension.js +2095 -225
- package/editors/vscode/out/lsp-server.js +519 -51
- package/editors/vscode/package-lock.json +9 -4
- package/editors/vscode/package.json +1 -1
- package/examples/display-demo.mcrs +64 -0
- package/examples/game/racing.mcrs +301 -0
- package/examples/game/tower_defense.mcrs +311 -0
- package/examples/math/physics_sim.mcrs +322 -0
- package/examples/rpg/boss_fight.mcrs +313 -0
- package/examples/rpg/health_system.mcrs +237 -0
- package/examples/rpg/inventory.mcrs +265 -0
- package/examples/util/debug_hud.mcrs +279 -0
- package/jest.config.js +10 -0
- package/package.json +12 -3
- package/playground/index.html +823 -0
- package/scripts/gen-docs.ts +533 -0
- package/scripts/update-redscript-docs-stdlib.sh +770 -0
- package/src/__tests__/budget.test.ts +5 -0
- package/src/__tests__/cache/cache-behavior.test.ts +480 -0
- package/src/__tests__/cache-extra.test.ts +199 -0
- package/src/__tests__/cli-docs.test.ts +77 -0
- package/src/__tests__/cli-init.test.ts +91 -0
- package/src/__tests__/cli-publish.test.ts +190 -0
- package/src/__tests__/cli.test.ts +117 -1
- package/src/__tests__/compile-preprocess.test.ts +366 -0
- package/src/__tests__/compiler/break-stmt.test.ts +66 -0
- package/src/__tests__/compiler/const-decl.test.ts +141 -0
- package/src/__tests__/compiler/continue-stmt.test.ts +81 -0
- package/src/__tests__/compiler/coroutine-extended.test.ts +723 -0
- package/src/__tests__/compiler/deprecated.test.ts +305 -0
- package/src/__tests__/compiler/do-while.test.ts +130 -0
- package/src/__tests__/compiler/enum-payload.test.ts +299 -0
- package/src/__tests__/compiler/interface.test.ts +287 -0
- package/src/__tests__/compiler/labeled-loops.test.ts +279 -0
- package/src/__tests__/compiler/match-string.test.ts +45 -0
- package/src/__tests__/compiler/memoize.test.ts +126 -0
- package/src/__tests__/compiler/method-chain.test.ts +121 -0
- package/src/__tests__/compiler/module-import.test.ts +240 -0
- package/src/__tests__/compiler/option-extensions.test.ts +207 -0
- package/src/__tests__/compiler/profile-decorator.test.ts +79 -0
- package/src/__tests__/compiler/string-advanced.test.ts +310 -0
- package/src/__tests__/compiler/struct-extends.test.ts +109 -0
- package/src/__tests__/compiler/throttle-retry.test.ts +191 -0
- package/src/__tests__/compiler/tuple-type.test.ts +263 -0
- package/src/__tests__/compiler/watch-decorator.test.ts +72 -0
- package/src/__tests__/config/project-config.test.ts +181 -0
- package/src/__tests__/config-decorator.test.ts +157 -0
- package/src/__tests__/diagnostics-extra.test.ts +155 -0
- package/src/__tests__/emit/compile-branches.test.ts +135 -0
- package/src/__tests__/emit/compile-coverage.test.ts +696 -0
- package/src/__tests__/emit/compile-extra-branches.test.ts +228 -0
- package/src/__tests__/emit/compile-mocked-branches.test.ts +249 -0
- package/src/__tests__/emit/compile.test.ts +6 -1
- package/src/__tests__/emit/execute-chain.test.ts +114 -0
- package/src/__tests__/emit/index.test.ts +2 -1
- package/src/__tests__/emit/modules-branches.test.ts +90 -0
- package/src/__tests__/emit/modules-coverage.test.ts +241 -0
- package/src/__tests__/emit/modules-errors.test.ts +192 -0
- package/src/__tests__/emit/modules-rewrite.test.ts +232 -0
- package/src/__tests__/emit/source-map.test.ts +152 -0
- package/src/__tests__/enum.test.ts +9 -4
- package/src/__tests__/error-recovery.test.ts +226 -0
- package/src/__tests__/events-types-extra.test.ts +110 -0
- package/src/__tests__/events-types.test.ts +66 -0
- package/src/__tests__/formatter.test.ts +15 -5
- package/src/__tests__/generics.test.ts +16 -9
- package/src/__tests__/hir/lower-extra.test.ts +151 -0
- package/src/__tests__/hir/monomorphize-coverage.test.ts +432 -0
- package/src/__tests__/hir/monomorphize-extra.test.ts +220 -0
- package/src/__tests__/hir/monomorphize-extra2.test.ts +350 -0
- package/src/__tests__/impl.test.ts +12 -8
- package/src/__tests__/incremental.test.ts +10 -2
- package/src/__tests__/index-extra.test.ts +79 -0
- package/src/__tests__/lexer.test.ts +2 -2
- package/src/__tests__/lint/hir-coverage.test.ts +1716 -0
- package/src/__tests__/lint/rules-coverage.test.ts +598 -0
- package/src/__tests__/lint/rules.test.ts +230 -0
- package/src/__tests__/lir/lower.test.ts +33 -0
- package/src/__tests__/lir/verify.test.ts +33 -0
- package/src/__tests__/lsp/completion.test.ts +687 -0
- package/src/__tests__/lsp/definition.test.ts +499 -0
- package/src/__tests__/lsp/diagnostics.test.ts +108 -0
- package/src/__tests__/lsp/hover-docs.test.ts +222 -0
- package/src/__tests__/lsp.test.ts +4 -1
- package/src/__tests__/mc-integration/item-entity-events.test.ts +5 -0
- package/src/__tests__/mc-integration/stdlib-coverage-2.test.ts +5 -0
- package/src/__tests__/mc-integration/stdlib-coverage-3.test.ts +1105 -0
- package/src/__tests__/mc-integration/stdlib-coverage-4.test.ts +1366 -0
- package/src/__tests__/mc-integration/stdlib-coverage-5.test.ts +1245 -0
- package/src/__tests__/mc-integration/stdlib-coverage-6.test.ts +755 -0
- package/src/__tests__/mc-integration/stdlib-coverage-7.test.ts +771 -0
- package/src/__tests__/mc-integration/stdlib-coverage.test.ts +5 -0
- package/src/__tests__/mc-integration/syntax-coverage.test.ts +5 -0
- package/src/__tests__/mc-validator-coverage.test.ts +325 -0
- package/src/__tests__/mc-validator-extra.test.ts +252 -0
- package/src/__tests__/mir/lower-extra.test.ts +402 -0
- package/src/__tests__/mir/lower-extra2.test.ts +348 -0
- package/src/__tests__/mir/lower-extra3.test.ts +277 -0
- package/src/__tests__/mir/lower-extra4.test.ts +636 -0
- package/src/__tests__/mir/lower-extra5.test.ts +612 -0
- package/src/__tests__/mir/lower-extra6.test.ts +520 -0
- package/src/__tests__/mir/lower-extra7.test.ts +1045 -0
- package/src/__tests__/mir/lower-extra8.test.ts +704 -0
- package/src/__tests__/mir/lower-extra9.test.ts +821 -0
- package/src/__tests__/optimizer/auto-inline.test.ts +206 -0
- package/src/__tests__/optimizer/cse.test.ts +195 -0
- package/src/__tests__/optimizer/inline_fn.test.ts +263 -0
- package/src/__tests__/optimizer/licm.test.ts +358 -0
- package/src/__tests__/optimizer/nbt-coalesce.test.ts +147 -0
- package/src/__tests__/optimizer/optimizer-extended.test.ts +1081 -0
- package/src/__tests__/optimizer/scoreboard-batch.test.ts +141 -0
- package/src/__tests__/optimizer/strength-reduction.test.ts +111 -0
- package/src/__tests__/optimizer/tco-coverage.test.ts +309 -0
- package/src/__tests__/optimizer/tco.test.ts +238 -0
- package/src/__tests__/option.test.ts +14 -7
- package/src/__tests__/parser-coverage.test.ts +576 -0
- package/src/__tests__/parser-extra.test.ts +531 -0
- package/src/__tests__/parser.test.ts +14 -0
- package/src/__tests__/repl-extra.test.ts +195 -0
- package/src/__tests__/repl-server-extra.test.ts +150 -0
- package/src/__tests__/repl-server.test.ts +122 -0
- package/src/__tests__/runtime-extra.test.ts +862 -0
- package/src/__tests__/singleton-decorator.test.ts +285 -0
- package/src/__tests__/sourcemap.test.ts +1 -1
- package/src/__tests__/stdlib/advanced.test.ts +312 -0
- package/src/__tests__/stdlib/bigint.test.ts +57 -0
- package/src/__tests__/stdlib/bits.test.ts +75 -0
- package/src/__tests__/stdlib/bossbar.test.ts +45 -0
- package/src/__tests__/stdlib/color.test.ts +60 -0
- package/src/__tests__/stdlib/combat.test.ts +35 -0
- package/src/__tests__/stdlib/cooldown.test.ts +35 -0
- package/src/__tests__/stdlib/dialog.test.ts +14 -6
- package/src/__tests__/stdlib/ecs.test.ts +54 -0
- package/src/__tests__/stdlib/effects.test.ts +45 -0
- package/src/__tests__/stdlib/events.test.ts +23 -0
- package/src/__tests__/stdlib/expr.test.ts +48 -0
- package/src/__tests__/stdlib/fft.test.ts +54 -0
- package/src/__tests__/stdlib/graph.test.ts +77 -0
- package/src/__tests__/stdlib/interactions.test.ts +30 -0
- package/src/__tests__/stdlib/inventory.test.ts +40 -0
- package/src/__tests__/stdlib/linalg.test.ts +52 -0
- package/src/__tests__/stdlib/map.test.ts +55 -0
- package/src/__tests__/stdlib/math.test.ts +19 -5
- package/src/__tests__/stdlib/math_hp.test.ts +55 -0
- package/src/__tests__/stdlib/mobs.test.ts +40 -0
- package/src/__tests__/stdlib/noise.test.ts +46 -0
- package/src/__tests__/stdlib/ode.test.ts +40 -0
- package/src/__tests__/stdlib/parabola.test.ts +51 -0
- package/src/__tests__/stdlib/particles.test.ts +40 -0
- package/src/__tests__/stdlib/physics.test.ts +50 -0
- package/src/__tests__/stdlib/player.test.ts +35 -0
- package/src/__tests__/stdlib/quaternion.test.ts +46 -0
- package/src/__tests__/stdlib/queue.test.ts +73 -0
- package/src/__tests__/stdlib/random.test.ts +50 -0
- package/src/__tests__/stdlib/result.test.ts +326 -0
- package/src/__tests__/stdlib/scheduler.test.ts +18 -7
- package/src/__tests__/stdlib/set_int.test.ts +62 -0
- package/src/__tests__/stdlib/sets.test.ts +28 -0
- package/src/__tests__/stdlib/signal.test.ts +60 -0
- package/src/__tests__/stdlib/spawn.test.ts +40 -0
- package/src/__tests__/stdlib/string.test.ts +224 -0
- package/src/__tests__/stdlib/strings.test.ts +55 -0
- package/src/__tests__/stdlib/tags.test.ts +32 -0
- package/src/__tests__/stdlib/teams.test.ts +45 -0
- package/src/__tests__/stdlib/timer.test.ts +53 -0
- package/src/__tests__/stdlib/vec.test.ts +72 -0
- package/src/__tests__/stdlib/world.test.ts +45 -0
- package/src/__tests__/struct-display.test.ts +69 -0
- package/src/__tests__/test-framework/runner.test.ts +208 -0
- package/src/__tests__/tuner/adapters.test.ts +232 -0
- package/src/__tests__/tuner/simulator-extra.test.ts +222 -0
- package/src/__tests__/tuple.test.ts +11 -4
- package/src/__tests__/typechecker-coverage.test.ts +671 -0
- package/src/__tests__/typechecker.test.ts +4 -3
- package/src/__tests__/watch-decorator.test.ts +59 -0
- package/src/ast/types.ts +65 -3
- package/src/cache/incremental.ts +128 -99
- package/src/cache/index.ts +35 -8
- package/src/cli.ts +538 -29
- package/src/config/project-config.ts +176 -0
- package/src/diagnostics/index.ts +22 -0
- package/src/docs.ts +98 -0
- package/src/emit/compile.ts +408 -51
- package/src/emit/index.ts +366 -18
- package/src/emit/modules.ts +19 -3
- package/src/emit/sourcemap.ts +64 -43
- package/src/formatter/index.ts +35 -8
- package/src/hir/deprecated.ts +212 -0
- package/src/hir/lower.ts +128 -8
- package/src/hir/monomorphize.ts +24 -2
- package/src/hir/types.ts +26 -1
- package/src/index.ts +23 -3
- package/src/lexer/index.ts +45 -6
- package/src/lint/index.ts +922 -0
- package/src/lir/lower.ts +30 -2
- package/src/lir/types.ts +4 -0
- package/src/lsp/server.ts +100 -1
- package/src/mir/lower.ts +785 -40
- package/src/mir/macro.ts +30 -2
- package/src/mir/types.ts +13 -0
- package/src/mir/verify.ts +10 -2
- package/src/optimizer/auto-inline.ts +86 -0
- package/src/optimizer/copy_prop.ts +2 -2
- package/src/optimizer/coroutine.ts +3 -3
- package/src/optimizer/cse.ts +205 -0
- package/src/optimizer/dce.ts +2 -2
- package/src/optimizer/inline.ts +335 -0
- package/src/optimizer/interprocedural.ts +5 -1
- package/src/optimizer/licm.ts +454 -0
- package/src/optimizer/nbt-coalesce.ts +109 -0
- package/src/optimizer/pipeline.ts +16 -2
- package/src/optimizer/scoreboard-batch.ts +52 -0
- package/src/optimizer/strength_reduction.ts +95 -0
- package/src/optimizer/tco.ts +267 -0
- package/src/optimizer/unroll.ts +2 -2
- package/src/parser/index.ts +426 -53
- package/src/repl-server.ts +102 -0
- package/src/stdlib/advanced.mcrs +271 -101
- package/src/stdlib/bigint.mcrs +97 -11
- package/src/stdlib/bits.mcrs +75 -12
- package/src/stdlib/bossbar.mcrs +37 -8
- package/src/stdlib/calculus.mcrs +82 -26
- package/src/stdlib/color.mcrs +98 -16
- package/src/stdlib/combat.mcrs +23 -5
- package/src/stdlib/cooldown.mcrs +19 -0
- package/src/stdlib/dialog.mcrs +45 -7
- package/src/stdlib/easing.mcrs +132 -12
- package/src/stdlib/ecs.mcrs +142 -25
- package/src/stdlib/effects.mcrs +88 -12
- package/src/stdlib/events.mcrs +21 -2
- package/src/stdlib/expr.mcrs +18 -3
- package/src/stdlib/fft.mcrs +66 -56
- package/src/stdlib/geometry.mcrs +137 -39
- package/src/stdlib/graph.mcrs +73 -0
- package/src/stdlib/heap.mcrs +49 -8
- package/src/stdlib/i18n/zh.yaml +2891 -0
- package/src/stdlib/interactions.mcrs +43 -20
- package/src/stdlib/inventory.mcrs +14 -3
- package/src/stdlib/linalg.mcrs +185 -30
- package/src/stdlib/list.mcrs +168 -18
- package/src/stdlib/map.mcrs +112 -0
- package/src/stdlib/math.mcrs +68 -18
- package/src/stdlib/math_hp.mcrs +124 -33
- package/src/stdlib/matrix.mcrs +133 -20
- package/src/stdlib/mobs.mcrs +87 -0
- package/src/stdlib/noise.mcrs +65 -21
- package/src/stdlib/ode.mcrs +96 -0
- package/src/stdlib/parabola.mcrs +104 -29
- package/src/stdlib/particles.mcrs +78 -21
- package/src/stdlib/pathfind.mcrs +89 -35
- package/src/stdlib/physics.mcrs +134 -26
- package/src/stdlib/player.mcrs +18 -0
- package/src/stdlib/quaternion.mcrs +213 -9
- package/src/stdlib/queue.mcrs +123 -0
- package/src/stdlib/random.mcrs +63 -18
- package/src/stdlib/result.mcrs +111 -0
- package/src/stdlib/scheduler.mcrs +59 -10
- package/src/stdlib/set_int.mcrs +240 -0
- package/src/stdlib/sets.mcrs +49 -19
- package/src/stdlib/signal.mcrs +151 -79
- package/src/stdlib/sort.mcrs +44 -24
- package/src/stdlib/spawn.mcrs +30 -7
- package/src/stdlib/state.mcrs +40 -5
- package/src/stdlib/strings.mcrs +131 -3
- package/src/stdlib/tags.mcrs +2 -2
- package/src/stdlib/teams.mcrs +22 -10
- package/src/stdlib/timer.mcrs +36 -6
- package/src/stdlib/vec.mcrs +44 -9
- package/src/stdlib/world.mcrs +57 -25
- package/src/structs/expand.ts +64 -0
- package/src/testing/runner.ts +271 -0
- package/src/typechecker/index.ts +273 -9
package/src/stdlib/parabola.mcrs
CHANGED
|
@@ -20,10 +20,16 @@ module library;
|
|
|
20
20
|
|
|
21
21
|
// ─── Constants ────────────────────────────────────────────────────────────────
|
|
22
22
|
|
|
23
|
-
|
|
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
|
-
|
|
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
|
-
|
|
39
|
-
|
|
40
|
-
|
|
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
|
-
|
|
47
|
-
|
|
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
|
-
|
|
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
|
-
|
|
63
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
110
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
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
|
-
|
|
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
|
-
///
|
|
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
|
-
///
|
|
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
|
-
///
|
|
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
|
-
///
|
|
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
|
-
///
|
|
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
|
-
///
|
|
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
|
-
///
|
|
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
|
-
///
|
|
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
|
-
///
|
|
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
|
-
///
|
|
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
|
-
|
|
69
|
-
|
|
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
|
-
|
|
78
|
-
|
|
79
|
-
|
|
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
|
-
|
|
91
|
-
|
|
92
|
-
|
|
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
|
-
|
|
105
|
-
|
|
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
|
-
|
|
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
|
}
|
package/src/stdlib/pathfind.mcrs
CHANGED
|
@@ -33,18 +33,38 @@ module library
|
|
|
33
33
|
|
|
34
34
|
// ─── Coordinate utilities ─────────────────────────────────────────────────────
|
|
35
35
|
|
|
36
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
82
|
-
|
|
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
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
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
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
//
|
|
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
|
-
|
|
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() {}
|