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
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
// queue.mcrs — NBT-backed FIFO queue for RedScript datapacks.
|
|
2
|
+
//
|
|
3
|
+
// The queue is stored in `storage rs:arrays Queue` as an int list.
|
|
4
|
+
// A scoreboard objective `rs.q_head` tracks the logical head index so that
|
|
5
|
+
// dequeue is O(1) (we never physically shift elements; the head pointer just
|
|
6
|
+
// advances). queue_clear resets both the list and the head pointer to 0.
|
|
7
|
+
//
|
|
8
|
+
// Storage layout:
|
|
9
|
+
// rs:arrays { Queue: [10, 20, 30] } ← raw backing list
|
|
10
|
+
// scoreboard rs.q_head <global> ← index of the next element to pop
|
|
11
|
+
|
|
12
|
+
module library;
|
|
13
|
+
|
|
14
|
+
// ─── Internal macro helpers ──────────────────────────────────────────────────
|
|
15
|
+
|
|
16
|
+
fn __queue_append_apply() {
|
|
17
|
+
raw("$data modify storage rs:arrays Queue append value $(val)");
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
fn __queue_peek_apply() {
|
|
21
|
+
raw("$execute store result score $ret __OBJ__ run data get storage rs:arrays Queue[$(idx)]");
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
fn __queue_size_raw_apply() {
|
|
25
|
+
raw("$execute store result score $ret __OBJ__ run data get storage rs:arrays Queue");
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// ─── Public API ──────────────────────────────────────────────────────────────
|
|
29
|
+
|
|
30
|
+
/// Enqueue a value into the queue.
|
|
31
|
+
///
|
|
32
|
+
/// The value is appended to the end of `storage rs:arrays Queue`.
|
|
33
|
+
///
|
|
34
|
+
/// @since 3.0.0
|
|
35
|
+
/// @param val Value to enqueue
|
|
36
|
+
/// @example
|
|
37
|
+
/// queue_push(42)
|
|
38
|
+
fn queue_push(val: int) {
|
|
39
|
+
raw("execute store result storage rs:macro_args val int 1 run scoreboard players get $p0 __OBJ__");
|
|
40
|
+
raw("function __NS__:__queue_append_apply with storage rs:macro_args");
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/// Dequeue and return the front value.
|
|
44
|
+
///
|
|
45
|
+
/// Advances the head pointer by one. If the queue is empty, returns `-1`.
|
|
46
|
+
///
|
|
47
|
+
/// @since 3.0.0
|
|
48
|
+
/// @returns Front value, or -1 if empty
|
|
49
|
+
/// @example
|
|
50
|
+
/// let v: int = queue_pop()
|
|
51
|
+
fn queue_pop(): int {
|
|
52
|
+
// Check empty
|
|
53
|
+
let empty: int = queue_empty();
|
|
54
|
+
if (empty == 1) { return -1; }
|
|
55
|
+
|
|
56
|
+
// Read front element
|
|
57
|
+
raw("scoreboard players set $ret __OBJ__ 0");
|
|
58
|
+
raw("execute store result storage rs:macro_args idx int 1 run scoreboard players get rs.q_head __RS__");
|
|
59
|
+
raw("function __NS__:__queue_peek_apply with storage rs:macro_args");
|
|
60
|
+
// Advance head pointer
|
|
61
|
+
raw("scoreboard players add rs.q_head __RS__ 1");
|
|
62
|
+
raw("return 1");
|
|
63
|
+
return 0;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/// Peek at the front value without removing it.
|
|
67
|
+
///
|
|
68
|
+
/// If the queue is empty, returns `-1`.
|
|
69
|
+
///
|
|
70
|
+
/// @since 3.0.0
|
|
71
|
+
/// @returns Front value, or -1 if empty
|
|
72
|
+
/// @example
|
|
73
|
+
/// let front: int = queue_peek()
|
|
74
|
+
fn queue_peek(): int {
|
|
75
|
+
let empty: int = queue_empty();
|
|
76
|
+
if (empty == 1) { return -1; }
|
|
77
|
+
|
|
78
|
+
raw("scoreboard players set $ret __OBJ__ 0");
|
|
79
|
+
raw("execute store result storage rs:macro_args idx int 1 run scoreboard players get rs.q_head __RS__");
|
|
80
|
+
raw("function __NS__:__queue_peek_apply with storage rs:macro_args");
|
|
81
|
+
raw("return 1");
|
|
82
|
+
return 0;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/// Get the number of elements in the queue.
|
|
86
|
+
///
|
|
87
|
+
/// This is the count of un-popped elements: `raw_size - head`.
|
|
88
|
+
///
|
|
89
|
+
/// @since 3.0.0
|
|
90
|
+
/// @returns Queue size
|
|
91
|
+
/// @example
|
|
92
|
+
/// let n: int = queue_size()
|
|
93
|
+
fn queue_size(): int {
|
|
94
|
+
raw("scoreboard players set $ret __OBJ__ 0");
|
|
95
|
+
raw("function __NS__:__queue_size_raw_apply with storage rs:macro_args");
|
|
96
|
+
raw("scoreboard players operation $ret __OBJ__ -= rs.q_head __RS__");
|
|
97
|
+
raw("return 1");
|
|
98
|
+
return 0;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/// Check if the queue is empty.
|
|
102
|
+
///
|
|
103
|
+
/// @since 3.0.0
|
|
104
|
+
/// @returns 1 if empty, 0 otherwise
|
|
105
|
+
/// @example
|
|
106
|
+
/// if (queue_empty() == 1) { }
|
|
107
|
+
fn queue_empty(): int {
|
|
108
|
+
let sz: int = queue_size();
|
|
109
|
+
if (sz <= 0) { return 1; }
|
|
110
|
+
return 0;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/// Clear all elements from the queue.
|
|
114
|
+
///
|
|
115
|
+
/// Resets `storage rs:arrays Queue` to an empty list and the head pointer to 0.
|
|
116
|
+
///
|
|
117
|
+
/// @since 3.0.0
|
|
118
|
+
/// @example
|
|
119
|
+
/// queue_clear()
|
|
120
|
+
fn queue_clear() {
|
|
121
|
+
raw("data modify storage rs:arrays Queue set value []");
|
|
122
|
+
raw("scoreboard players set rs.q_head __RS__ 0");
|
|
123
|
+
}
|
package/src/stdlib/random.mcrs
CHANGED
|
@@ -12,21 +12,41 @@
|
|
|
12
12
|
|
|
13
13
|
module library;
|
|
14
14
|
|
|
15
|
-
|
|
16
|
-
|
|
15
|
+
/// Advance the LCG state by one step, returning the next pseudo-random int32.
|
|
16
|
+
/// The returned value is also the new seed for the next call.
|
|
17
|
+
/// @since 1.0.0
|
|
18
|
+
/// @param seed Current LCG state (any non-zero integer to start)
|
|
19
|
+
/// @returns Next pseudo-random int32 (also serves as next seed)
|
|
20
|
+
/// @example
|
|
21
|
+
/// let seed: int = 12345
|
|
22
|
+
/// seed = next_lcg(seed)
|
|
23
|
+
/// seed = next_lcg(seed) // advance two steps
|
|
17
24
|
fn next_lcg(seed: int): int {
|
|
18
25
|
return seed * 1664525 + 1013904223;
|
|
19
26
|
}
|
|
20
27
|
|
|
21
|
-
|
|
22
|
-
|
|
28
|
+
/// Generate a pseudo-random integer in the range [lo, hi).
|
|
29
|
+
/// @since 1.0.0
|
|
30
|
+
/// @param seed LCG output value (result of next_lcg)
|
|
31
|
+
/// @param lo Inclusive lower bound
|
|
32
|
+
/// @param hi Exclusive upper bound (must be > lo)
|
|
33
|
+
/// @returns Integer in [lo, hi)
|
|
34
|
+
/// @example
|
|
35
|
+
/// seed = next_lcg(seed)
|
|
36
|
+
/// let roll: int = random_range(seed, 1, 7) // dice roll: 1-6
|
|
23
37
|
fn random_range(seed: int, lo: int, hi: int): int {
|
|
24
38
|
let r: int = seed;
|
|
25
39
|
if (r < 0) { r = 0 - r; }
|
|
26
40
|
return lo + r % (hi - lo);
|
|
27
41
|
}
|
|
28
42
|
|
|
29
|
-
|
|
43
|
+
/// Generate a pseudo-random boolean (0 or 1) with equal probability.
|
|
44
|
+
/// @since 1.0.0
|
|
45
|
+
/// @param seed LCG output value (result of next_lcg)
|
|
46
|
+
/// @returns 0 or 1 with ~50% probability each
|
|
47
|
+
/// @example
|
|
48
|
+
/// seed = next_lcg(seed)
|
|
49
|
+
/// let coin: int = random_bool(seed) // 0 or 1
|
|
30
50
|
fn random_bool(seed: int): int {
|
|
31
51
|
let r: int = seed;
|
|
32
52
|
if (r < 0) { r = 0 - r; }
|
|
@@ -44,19 +64,34 @@ fn random_bool(seed: int): int {
|
|
|
44
64
|
//
|
|
45
65
|
// Usage: maintain two state variables (hi, lo); update both each call.
|
|
46
66
|
|
|
47
|
-
|
|
48
|
-
|
|
67
|
+
/// Advance the PCG low-word state by one step.
|
|
68
|
+
/// Call together with pcg_next_hi; use pcg_output to extract the random value.
|
|
69
|
+
/// @since 1.0.0
|
|
70
|
+
/// @param state_lo Current low word of PCG state
|
|
71
|
+
/// @returns New low word
|
|
72
|
+
/// @example
|
|
73
|
+
/// let lo: int = pcg_next_lo(state_lo)
|
|
49
74
|
fn pcg_next_lo(state_lo: int): int {
|
|
50
75
|
return state_lo * 747796405 + -1403630843;
|
|
51
76
|
}
|
|
52
77
|
|
|
53
|
-
|
|
78
|
+
/// Advance the PCG high-word state by one step.
|
|
79
|
+
/// @since 1.0.0
|
|
80
|
+
/// @param state_hi Current high word of PCG state
|
|
81
|
+
/// @param state_lo Current low word of PCG state (previous, before pcg_next_lo)
|
|
82
|
+
/// @returns New high word
|
|
83
|
+
/// @example
|
|
84
|
+
/// let hi: int = pcg_next_hi(state_hi, state_lo)
|
|
54
85
|
fn pcg_next_hi(state_hi: int, state_lo: int): int {
|
|
55
86
|
return state_hi * 747796405 + state_lo;
|
|
56
87
|
}
|
|
57
88
|
|
|
58
|
-
|
|
59
|
-
|
|
89
|
+
/// Extract an output value from the PCG low word using XSH-RR permutation.
|
|
90
|
+
/// @since 1.0.0
|
|
91
|
+
/// @param state_lo Current low word of PCG state (after pcg_next_lo)
|
|
92
|
+
/// @returns Pseudo-random output value (unsigned, any int)
|
|
93
|
+
/// @example
|
|
94
|
+
/// let rng: int = pcg_output(state_lo)
|
|
60
95
|
fn pcg_output(state_lo: int): int {
|
|
61
96
|
let xsh: int = state_lo;
|
|
62
97
|
// xsh = ((state >> 18) ^ state) >> 27 (simplified: use single xor-shift)
|
|
@@ -79,10 +114,14 @@ fn _binom_loop(n: int, p: int, seed: int, acc: int): int {
|
|
|
79
114
|
return _binom_loop(n - 1, p, s2, acc + hit);
|
|
80
115
|
}
|
|
81
116
|
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
117
|
+
/// Simulate n Bernoulli trials and count the number of successes (binomial distribution).
|
|
118
|
+
/// @since 1.0.0
|
|
119
|
+
/// @param n Number of trials
|
|
120
|
+
/// @param p_x10000 Success probability ×10000 (e.g. 5000 = 50%, 3000 = 30%)
|
|
121
|
+
/// @param seed LCG seed (any non-zero integer)
|
|
122
|
+
/// @returns Number of successes in [0, n]
|
|
123
|
+
/// @example
|
|
124
|
+
/// let hits: int = binomial_sample(10, 5000, 99999) // ~5 successes on average
|
|
86
125
|
fn binomial_sample(n: int, p_x10000: int, seed: int): int {
|
|
87
126
|
return _binom_loop(n, p_x10000, seed, 0);
|
|
88
127
|
}
|
|
@@ -103,10 +142,16 @@ fn _hyper_loop(rem_pop: int, rem_succ: int, draws: int, seed: int, acc: int): in
|
|
|
103
142
|
return _hyper_loop(rem_pop - 1, rem_succ - success, draws - 1, s2, acc + success);
|
|
104
143
|
}
|
|
105
144
|
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
145
|
+
/// Draw `draws` items without replacement from a population and count successes (hypergeometric distribution).
|
|
146
|
+
/// @since 1.0.0
|
|
147
|
+
/// @param pop_size Total population size
|
|
148
|
+
/// @param success_states Number of "success" items in the population
|
|
149
|
+
/// @param draws Number of items to draw
|
|
150
|
+
/// @param seed LCG seed (any non-zero integer)
|
|
151
|
+
/// @returns Number of successes drawn, in [0, min(draws, success_states)]
|
|
152
|
+
/// @example
|
|
153
|
+
/// // 52-card deck, 4 aces, draw 5 cards
|
|
154
|
+
/// let aces: int = hypergeometric_sample(52, 4, 5, 42)
|
|
110
155
|
fn hypergeometric_sample(pop_size: int, success_states: int, draws: int, seed: int): int {
|
|
111
156
|
return _hyper_loop(pop_size, success_states, draws, seed, 0);
|
|
112
157
|
}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
// result.mcrs — Result<T> type for error handling in RedScript datapacks.
|
|
2
|
+
//
|
|
3
|
+
// Result<T> wraps either a successful value (Ok) or an error code (Err).
|
|
4
|
+
// This is useful in Minecraft datapacks for operations that may fail,
|
|
5
|
+
// such as division, inventory checks, or entity lookups.
|
|
6
|
+
//
|
|
7
|
+
// Usage:
|
|
8
|
+
// let r = divide(10, 2)
|
|
9
|
+
// match r {
|
|
10
|
+
// Result::Ok(value) => { /* use value */ }
|
|
11
|
+
// Result::Err(code) => { /* handle error code */ }
|
|
12
|
+
// }
|
|
13
|
+
//
|
|
14
|
+
// Error codes are integers; use negative values for errors by convention:
|
|
15
|
+
// -1 = generic error
|
|
16
|
+
// -2 = division by zero
|
|
17
|
+
// -3 = not found
|
|
18
|
+
// etc.
|
|
19
|
+
|
|
20
|
+
module library;
|
|
21
|
+
|
|
22
|
+
// ─── Result<T> enum ───────────────────────────────────────────────────────────
|
|
23
|
+
|
|
24
|
+
enum Result {
|
|
25
|
+
Ok(value: int),
|
|
26
|
+
Err(code: int),
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
// ─── Constructor helpers ──────────────────────────────────────────────────────
|
|
30
|
+
|
|
31
|
+
/// Construct a successful Result with the given value.
|
|
32
|
+
/// @since 1.0.0
|
|
33
|
+
/// @param value The success value (any integer)
|
|
34
|
+
/// @returns Result::Ok(value)
|
|
35
|
+
/// @example
|
|
36
|
+
/// let r = result_ok(42) // Ok result carrying 42
|
|
37
|
+
fn result_ok(value: int): Result {
|
|
38
|
+
return Result::Ok(value: value);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/// Construct a failed Result with the given error code.
|
|
42
|
+
/// @since 1.0.0
|
|
43
|
+
/// @param code Error code (use negative by convention: -1 generic, -2 div/zero)
|
|
44
|
+
/// @returns Result::Err(code)
|
|
45
|
+
/// @example
|
|
46
|
+
/// let r = result_err(-2) // division-by-zero error
|
|
47
|
+
fn result_err(code: int): Result {
|
|
48
|
+
return Result::Err(code: code);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// ─── Query helpers ────────────────────────────────────────────────────────────
|
|
52
|
+
|
|
53
|
+
/// Returns 1 if the Result is Ok, 0 otherwise.
|
|
54
|
+
/// @since 1.0.0
|
|
55
|
+
/// @param r The Result to test
|
|
56
|
+
/// @returns 1 if Ok, 0 if Err
|
|
57
|
+
/// @example
|
|
58
|
+
/// let ok = result_is_ok(result_ok(5)) // result: 1
|
|
59
|
+
fn result_is_ok(r: Result): int {
|
|
60
|
+
match r {
|
|
61
|
+
Result::Ok(value) => { return 1; }
|
|
62
|
+
Result::Err(code) => { return 0; }
|
|
63
|
+
}
|
|
64
|
+
return 0;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/// Returns 1 if the Result is Err, 0 otherwise.
|
|
68
|
+
fn result_is_err(r: Result): int {
|
|
69
|
+
match r {
|
|
70
|
+
Result::Ok(value) => { return 0; }
|
|
71
|
+
Result::Err(code) => { return 1; }
|
|
72
|
+
}
|
|
73
|
+
return 0;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// ─── Extraction helpers ───────────────────────────────────────────────────────
|
|
77
|
+
|
|
78
|
+
/// Extract the value from an Ok result.
|
|
79
|
+
/// Returns 0 if the Result is Err (check result_is_ok first).
|
|
80
|
+
/// @since 1.0.0
|
|
81
|
+
/// @param r The Result to unwrap
|
|
82
|
+
/// @returns The Ok value, or 0 if Err
|
|
83
|
+
/// @example
|
|
84
|
+
/// let v = result_value(result_ok(99)) // result: 99
|
|
85
|
+
fn result_value(r: Result): int {
|
|
86
|
+
match r {
|
|
87
|
+
Result::Ok(value) => { return value; }
|
|
88
|
+
Result::Err(code) => { return 0; }
|
|
89
|
+
}
|
|
90
|
+
return 0;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/// Extract the error code from an Err result.
|
|
94
|
+
/// Returns 0 if the Result is Ok (check result_is_err first).
|
|
95
|
+
fn result_code(r: Result): int {
|
|
96
|
+
match r {
|
|
97
|
+
Result::Ok(value) => { return 0; }
|
|
98
|
+
Result::Err(code) => { return code; }
|
|
99
|
+
}
|
|
100
|
+
return 0;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// ─── Example: safe division ───────────────────────────────────────────────────
|
|
104
|
+
|
|
105
|
+
/// Divide a by b; returns Err(-2) on division by zero.
|
|
106
|
+
fn result_divide(a: int, b: int): Result {
|
|
107
|
+
if (b == 0) {
|
|
108
|
+
return Result::Err(code: -2);
|
|
109
|
+
}
|
|
110
|
+
return Result::Ok(value: a / b);
|
|
111
|
+
}
|
|
@@ -15,7 +15,14 @@ module library
|
|
|
15
15
|
|
|
16
16
|
// ─── Per-player tasks ─────────────────────────────────────────────────────────
|
|
17
17
|
|
|
18
|
-
/// Schedule slot task_id (0
|
|
18
|
+
/// Schedule slot `task_id` (0–7) to fire after `delay` ticks for player `p`.
|
|
19
|
+
///
|
|
20
|
+
/// @since 1.0.0
|
|
21
|
+
/// @param p Recipient player or entity selector
|
|
22
|
+
/// @param task_id Slot index in range [0, 7]
|
|
23
|
+
/// @param delay Number of ticks to wait before firing
|
|
24
|
+
/// @example
|
|
25
|
+
/// task_schedule(@s, 0, 40)
|
|
19
26
|
fn task_schedule(p: selector, task_id: int, delay: int) {
|
|
20
27
|
if (task_id == 0) {
|
|
21
28
|
scoreboard_set(p, "rs.t0", delay);
|
|
@@ -48,7 +55,13 @@ fn task_schedule(p: selector, task_id: int, delay: int) {
|
|
|
48
55
|
}
|
|
49
56
|
}
|
|
50
57
|
|
|
51
|
-
/// Cancel slot task_id for player p (zeroes the counter).
|
|
58
|
+
/// Cancel slot `task_id` for player `p` (zeroes the counter).
|
|
59
|
+
///
|
|
60
|
+
/// @since 1.0.0
|
|
61
|
+
/// @param p Recipient player or entity selector
|
|
62
|
+
/// @param task_id Slot index in range [0, 7]
|
|
63
|
+
/// @example
|
|
64
|
+
/// task_cancel(@s, 0)
|
|
52
65
|
fn task_cancel(p: selector, task_id: int) {
|
|
53
66
|
if (task_id == 0) {
|
|
54
67
|
scoreboard_set(p, "rs.t0", 0);
|
|
@@ -81,8 +94,16 @@ fn task_cancel(p: selector, task_id: int) {
|
|
|
81
94
|
}
|
|
82
95
|
}
|
|
83
96
|
|
|
84
|
-
/// Returns 1 if slot task_id
|
|
85
|
-
///
|
|
97
|
+
/// Returns `1` if slot `task_id` fired on this tick (counter reached 1), `0` otherwise.
|
|
98
|
+
///
|
|
99
|
+
/// Automatically clears the slot once it fires so subsequent calls return `0`.
|
|
100
|
+
///
|
|
101
|
+
/// @since 1.0.0
|
|
102
|
+
/// @param p Player or entity selector to check
|
|
103
|
+
/// @param task_id Slot index in range [0, 7]
|
|
104
|
+
/// @returns `1` when the task is ready, `0` otherwise
|
|
105
|
+
/// @example
|
|
106
|
+
/// if (task_ready(@s, 0) == 1) { /* handle event */ }
|
|
86
107
|
fn task_ready(p: selector, task_id: int) -> int {
|
|
87
108
|
let val: int = 0;
|
|
88
109
|
if (task_id == 0) {
|
|
@@ -123,7 +144,16 @@ fn task_ready(p: selector, task_id: int) -> int {
|
|
|
123
144
|
|
|
124
145
|
// ─── Global tasks (bound to #rs fake-player) ──────────────────────────────────
|
|
125
146
|
|
|
126
|
-
/// Schedule global slot task_id (0
|
|
147
|
+
/// Schedule global slot `task_id` (0–7) to fire after `delay` ticks.
|
|
148
|
+
///
|
|
149
|
+
/// Global tasks are stored on the `#rs` fake-player and are not bound to any
|
|
150
|
+
/// specific player entity.
|
|
151
|
+
///
|
|
152
|
+
/// @since 1.0.0
|
|
153
|
+
/// @param task_id Slot index in range [0, 7]
|
|
154
|
+
/// @param delay Number of ticks to wait before firing
|
|
155
|
+
/// @example
|
|
156
|
+
/// gtask_schedule(0, 200)
|
|
127
157
|
fn gtask_schedule(task_id: int, delay: int) {
|
|
128
158
|
if (task_id == 0) {
|
|
129
159
|
scoreboard_set("#rs", "rs.g0", delay);
|
|
@@ -156,7 +186,12 @@ fn gtask_schedule(task_id: int, delay: int) {
|
|
|
156
186
|
}
|
|
157
187
|
}
|
|
158
188
|
|
|
159
|
-
/// Cancel global slot task_id.
|
|
189
|
+
/// Cancel global slot `task_id` by zeroing its counter.
|
|
190
|
+
///
|
|
191
|
+
/// @since 1.0.0
|
|
192
|
+
/// @param task_id Slot index in range [0, 7]
|
|
193
|
+
/// @example
|
|
194
|
+
/// gtask_cancel(0)
|
|
160
195
|
fn gtask_cancel(task_id: int) {
|
|
161
196
|
if (task_id == 0) {
|
|
162
197
|
scoreboard_set("#rs", "rs.g0", 0);
|
|
@@ -189,8 +224,15 @@ fn gtask_cancel(task_id: int) {
|
|
|
189
224
|
}
|
|
190
225
|
}
|
|
191
226
|
|
|
192
|
-
/// Returns 1 if global slot task_id
|
|
193
|
-
///
|
|
227
|
+
/// Returns `1` if global slot `task_id` fired this tick, `0` otherwise.
|
|
228
|
+
///
|
|
229
|
+
/// Automatically clears the slot once it fires.
|
|
230
|
+
///
|
|
231
|
+
/// @since 1.0.0
|
|
232
|
+
/// @param task_id Slot index in range [0, 7]
|
|
233
|
+
/// @returns `1` when the task is ready, `0` otherwise
|
|
234
|
+
/// @example
|
|
235
|
+
/// if (gtask_ready(0) == 1) { /* handle global event */ }
|
|
194
236
|
fn gtask_ready(task_id: int) -> int {
|
|
195
237
|
let val: int = 0;
|
|
196
238
|
if (task_id == 0) {
|
|
@@ -231,8 +273,15 @@ fn gtask_ready(task_id: int) -> int {
|
|
|
231
273
|
|
|
232
274
|
// ─── Tick driver ──────────────────────────────────────────────────────────────
|
|
233
275
|
|
|
234
|
-
/// Decrement all active per-player timers by 1.
|
|
235
|
-
///
|
|
276
|
+
/// Decrement all active per-player and global timers by 1 each tick.
|
|
277
|
+
///
|
|
278
|
+
/// Call this inside your `@tick` function (executed as `@a`). Counters are
|
|
279
|
+
/// clamped to 0 so they never go negative.
|
|
280
|
+
///
|
|
281
|
+
/// @since 1.0.0
|
|
282
|
+
/// @example
|
|
283
|
+
/// // In your @tick mcfunction:
|
|
284
|
+
/// scheduler_tick()
|
|
236
285
|
fn scheduler_tick() {
|
|
237
286
|
// Per-player slots
|
|
238
287
|
raw("execute as @a run scoreboard players remove @s rs.t0 1");
|