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/sort.mcrs
CHANGED
|
@@ -19,8 +19,15 @@ module library
|
|
|
19
19
|
|
|
20
20
|
// ─── Insertion sort (ascending) ───────────────────────────────────────────────
|
|
21
21
|
|
|
22
|
-
|
|
23
|
-
|
|
22
|
+
/// Sort an integer array ascending in-place using insertion sort.
|
|
23
|
+
/// @since 1.0.0
|
|
24
|
+
/// @param arr Integer array to sort (mutated in-place)
|
|
25
|
+
/// @param len Number of elements to sort (arr[0..len-1])
|
|
26
|
+
/// @returns void — arr is sorted ascending after this call
|
|
27
|
+
/// @example
|
|
28
|
+
/// let data: int[] = [30, 10, 50, 20]
|
|
29
|
+
/// insertion_sort(data, 4)
|
|
30
|
+
/// // data is now [10, 20, 30, 50]
|
|
24
31
|
fn insertion_sort(arr: int[], len: int) {
|
|
25
32
|
let i: int = 1
|
|
26
33
|
while (i < len) {
|
|
@@ -46,7 +53,15 @@ fn insertion_sort(arr: int[], len: int) {
|
|
|
46
53
|
|
|
47
54
|
// ─── Insertion sort (descending) ──────────────────────────────────────────────
|
|
48
55
|
|
|
49
|
-
|
|
56
|
+
/// Sort an integer array descending in-place using insertion sort.
|
|
57
|
+
/// @since 1.0.0
|
|
58
|
+
/// @param arr Integer array to sort (mutated in-place)
|
|
59
|
+
/// @param len Number of elements to sort (arr[0..len-1])
|
|
60
|
+
/// @returns void — arr is sorted descending after this call
|
|
61
|
+
/// @example
|
|
62
|
+
/// let scores: int[] = [30, 10, 50, 20]
|
|
63
|
+
/// insertion_sort_desc(scores, 4)
|
|
64
|
+
/// // scores is now [50, 30, 20, 10]
|
|
50
65
|
fn insertion_sort_desc(arr: int[], len: int) {
|
|
51
66
|
let i: int = 1
|
|
52
67
|
while (i < len) {
|
|
@@ -72,9 +87,16 @@ fn insertion_sort_desc(arr: int[], len: int) {
|
|
|
72
87
|
|
|
73
88
|
// ─── Merge two sorted arrays ──────────────────────────────────────────────────
|
|
74
89
|
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
90
|
+
/// Merge two sorted integer arrays into a new sorted array.
|
|
91
|
+
/// @since 1.0.0
|
|
92
|
+
/// @param a First sorted array
|
|
93
|
+
/// @param la Number of elements in a (a[0..la-1])
|
|
94
|
+
/// @param b Second sorted array
|
|
95
|
+
/// @param lb Number of elements in b (b[0..lb-1])
|
|
96
|
+
/// @returns New sorted int[] of length la+lb containing all elements of a and b
|
|
97
|
+
/// @example
|
|
98
|
+
/// let merged: int[] = sort_merge([1, 3, 5], 3, [2, 4, 6], 3)
|
|
99
|
+
/// // result: [1, 2, 3, 4, 5, 6]
|
|
78
100
|
fn sort_merge(a: int[], la: int, b: int[], lb: int): int[] {
|
|
79
101
|
let result: int[] = []
|
|
80
102
|
let i: int = 0
|
|
@@ -111,22 +133,15 @@ fn sort_merge(a: int[], la: int, b: int[], lb: int): int[] {
|
|
|
111
133
|
|
|
112
134
|
// ─── Coroutine merge sort (bottom-up, iterative) ──────────────────────────────
|
|
113
135
|
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
//
|
|
123
|
-
// Complexity: O(n log n) time, O(n) scratch space (temp[] for each merge pass).
|
|
124
|
-
//
|
|
125
|
-
// Usage:
|
|
126
|
-
// let data: int[] = [30, 10, 50, 20, 40]
|
|
127
|
-
// merge_sort_coro(data, 5)
|
|
128
|
-
// // several ticks later, data is [10, 20, 30, 40, 50]
|
|
129
|
-
|
|
136
|
+
/// Sort an array ascending using bottom-up merge sort, spread across server ticks.
|
|
137
|
+
/// @since 1.0.0
|
|
138
|
+
/// @param arr Integer array to sort (mutated in-place)
|
|
139
|
+
/// @param n Number of elements in arr
|
|
140
|
+
/// @returns void — arr is sorted after ceil(log₂(n)) ticks; onDone fires when complete
|
|
141
|
+
/// @example
|
|
142
|
+
/// let data: int[] = [30, 10, 50, 20, 40]
|
|
143
|
+
/// merge_sort_coro(data, 5)
|
|
144
|
+
/// // several ticks later, data is [10, 20, 30, 40, 50]
|
|
130
145
|
// @coroutine(batch=1) spreads the outer width-doubling loop: 1 pass per tick.
|
|
131
146
|
// Each tick completes all merges for the current width, then doubles width.
|
|
132
147
|
// After ceil(log₂(n)) ticks, onDone fires and arr is fully sorted.
|
|
@@ -148,6 +163,7 @@ fn merge_sort_coro(arr: int[], n: int) {
|
|
|
148
163
|
// via a temporary scratch array
|
|
149
164
|
if (mid < right) {
|
|
150
165
|
let tmp: int[] = []
|
|
166
|
+
let tlen: int = 0
|
|
151
167
|
let ia: int = left
|
|
152
168
|
let ib: int = mid
|
|
153
169
|
let merging: int = 1
|
|
@@ -156,18 +172,22 @@ fn merge_sort_coro(arr: int[], n: int) {
|
|
|
156
172
|
if (ib < right) {
|
|
157
173
|
if (arr[ia] <= arr[ib]) {
|
|
158
174
|
tmp.push(arr[ia])
|
|
175
|
+
tlen = tlen + 1
|
|
159
176
|
ia = ia + 1
|
|
160
177
|
} else {
|
|
161
178
|
tmp.push(arr[ib])
|
|
179
|
+
tlen = tlen + 1
|
|
162
180
|
ib = ib + 1
|
|
163
181
|
}
|
|
164
182
|
} else {
|
|
165
183
|
tmp.push(arr[ia])
|
|
184
|
+
tlen = tlen + 1
|
|
166
185
|
ia = ia + 1
|
|
167
186
|
}
|
|
168
187
|
} else {
|
|
169
188
|
if (ib < right) {
|
|
170
189
|
tmp.push(arr[ib])
|
|
190
|
+
tlen = tlen + 1
|
|
171
191
|
ib = ib + 1
|
|
172
192
|
} else {
|
|
173
193
|
merging = 0
|
|
@@ -176,7 +196,6 @@ fn merge_sort_coro(arr: int[], n: int) {
|
|
|
176
196
|
}
|
|
177
197
|
// Write merged tmp back into arr[left..right)
|
|
178
198
|
let ti: int = 0
|
|
179
|
-
let tlen: int = tmp.len()
|
|
180
199
|
while (ti < tlen) {
|
|
181
200
|
arr[left + ti] = tmp[ti]
|
|
182
201
|
ti = ti + 1
|
|
@@ -190,5 +209,6 @@ fn merge_sort_coro(arr: int[], n: int) {
|
|
|
190
209
|
}
|
|
191
210
|
}
|
|
192
211
|
|
|
193
|
-
|
|
212
|
+
/// Default no-op callback for merge_sort_coro. Replace with your own handler to react when sorting completes.
|
|
213
|
+
/// @since 1.0.0
|
|
194
214
|
fn merge_sort_noop() {}
|
package/src/stdlib/spawn.mcrs
CHANGED
|
@@ -1,40 +1,63 @@
|
|
|
1
1
|
// Spawn point and teleport helpers
|
|
2
2
|
// Usage: import "stdlib/spawn.mcrs"
|
|
3
3
|
|
|
4
|
-
///
|
|
4
|
+
/// Teleports the target selector to fixed world coordinates.
|
|
5
|
+
/// @param target Target selector to move
|
|
6
|
+
/// @param x Destination X coordinate
|
|
7
|
+
/// @param y Destination Y coordinate
|
|
8
|
+
/// @param z Destination Z coordinate
|
|
9
|
+
/// @example
|
|
10
|
+
/// teleport_to(@p, 0, 64, 0)
|
|
5
11
|
fn teleport_to(target: selector, x: int, y: int, z: int) {
|
|
6
12
|
tp(target, x, y, z);
|
|
7
13
|
}
|
|
8
14
|
|
|
9
|
-
///
|
|
15
|
+
/// Teleports the target selector to another entity.
|
|
16
|
+
/// @param target Selector to teleport
|
|
17
|
+
/// @param dest Selector whose current position is used as the destination
|
|
10
18
|
fn teleport_to_entity(target: selector, dest: selector) {
|
|
11
19
|
tp(target, dest);
|
|
12
20
|
}
|
|
13
21
|
|
|
14
|
-
///
|
|
22
|
+
/// Placeholder helper for spreading all players randomly in an area.
|
|
23
|
+
/// The raw `spreadplayers` command is noted here but not emitted yet.
|
|
24
|
+
/// Current behavior only broadcasts a status message.
|
|
25
|
+
/// @param x Center X coordinate
|
|
26
|
+
/// @param z Center Z coordinate
|
|
27
|
+
/// @param radius Maximum spread radius in blocks
|
|
15
28
|
fn spread_players(x: int, z: int, radius: int) {
|
|
16
29
|
// Use raw command for spreadplayers
|
|
17
30
|
// spreadplayers(x, z, 0, radius, false, @a);
|
|
18
31
|
say("Spreading players...");
|
|
19
32
|
}
|
|
20
33
|
|
|
21
|
-
///
|
|
34
|
+
/// Teleports all players to one location.
|
|
35
|
+
/// @param x Destination X coordinate
|
|
36
|
+
/// @param y Destination Y coordinate
|
|
37
|
+
/// @param z Destination Z coordinate
|
|
22
38
|
fn gather_all(x: int, y: int, z: int) {
|
|
23
39
|
tp(@a, x, y, z);
|
|
24
40
|
}
|
|
25
41
|
|
|
26
|
-
///
|
|
42
|
+
/// Teleports the target upward relative to its current position.
|
|
43
|
+
/// Useful for launch pads or scripted knock-up effects.
|
|
44
|
+
/// @param target Selector to move
|
|
45
|
+
/// @param height Relative Y offset in blocks
|
|
27
46
|
fn launch_up(target: selector, height: int) {
|
|
28
47
|
tp(target, ~0, ~height, ~0);
|
|
29
48
|
}
|
|
30
49
|
|
|
31
|
-
///
|
|
50
|
+
/// Teleports the target to the hard-coded lobby position.
|
|
51
|
+
/// This helper also shows a welcome title and should be customized per map.
|
|
52
|
+
/// @param target Selector to move to the lobby
|
|
32
53
|
fn goto_lobby(target: selector) {
|
|
33
54
|
tp(target, 0, 64, 0);
|
|
34
55
|
title(target, "Welcome to Lobby!");
|
|
35
56
|
}
|
|
36
57
|
|
|
37
|
-
///
|
|
58
|
+
/// Teleports the target to the hard-coded arena position.
|
|
59
|
+
/// This helper also shows a fight title and should be customized per map.
|
|
60
|
+
/// @param target Selector to move to the arena
|
|
38
61
|
fn goto_arena(target: selector) {
|
|
39
62
|
tp(target, 100, 64, 100);
|
|
40
63
|
title(target, "Fight!");
|
package/src/stdlib/state.mcrs
CHANGED
|
@@ -23,19 +23,39 @@
|
|
|
23
23
|
module library
|
|
24
24
|
|
|
25
25
|
/// Read the current state of an entity.
|
|
26
|
-
///
|
|
27
|
-
///
|
|
26
|
+
///
|
|
27
|
+
/// Returns `-1` if the entity has not been initialised (score is 0 = unset in
|
|
28
|
+
/// Minecraft, but we reserve `-1` as the sentinel for "never set via
|
|
29
|
+
/// `init_state`").
|
|
30
|
+
///
|
|
31
|
+
/// @since 1.0.0
|
|
32
|
+
/// @param entity Selector for the target entity
|
|
33
|
+
/// @returns Current state value stored in `rs.state`, or `-1` if unset
|
|
34
|
+
/// @example
|
|
35
|
+
/// let s: int = get_state(@s)
|
|
28
36
|
fn get_state(entity: selector) -> int {
|
|
29
37
|
return scoreboard_get(entity, "rs.state");
|
|
30
38
|
}
|
|
31
39
|
|
|
32
40
|
/// Write a state value to an entity.
|
|
41
|
+
///
|
|
42
|
+
/// @since 1.0.0
|
|
43
|
+
/// @param entity Selector for the target entity
|
|
44
|
+
/// @param state Integer state constant to write
|
|
45
|
+
/// @example
|
|
46
|
+
/// set_state(@s, 1)
|
|
33
47
|
fn set_state(entity: selector, state: int) {
|
|
34
48
|
scoreboard_set(entity, "rs.state", state);
|
|
35
49
|
}
|
|
36
50
|
|
|
37
51
|
/// Check whether an entity is currently in the given state.
|
|
38
|
-
///
|
|
52
|
+
///
|
|
53
|
+
/// @since 1.0.0
|
|
54
|
+
/// @param entity Selector for the target entity
|
|
55
|
+
/// @param state Integer state constant to compare against
|
|
56
|
+
/// @returns `1` if the entity is in `state`, `0` otherwise
|
|
57
|
+
/// @example
|
|
58
|
+
/// if (is_state(@s, STATE_COMBAT) == 1) { /* per-tick combat logic */ }
|
|
39
59
|
fn is_state(entity: selector, state: int) -> int {
|
|
40
60
|
let cur: int = get_state(entity);
|
|
41
61
|
if (cur == state) {
|
|
@@ -45,7 +65,14 @@ fn is_state(entity: selector, state: int) -> int {
|
|
|
45
65
|
}
|
|
46
66
|
|
|
47
67
|
/// Initialise an entity's state only if it has not been set yet (score == -1).
|
|
48
|
-
///
|
|
68
|
+
///
|
|
69
|
+
/// Call once on spawn or load to avoid overwriting an in-progress state.
|
|
70
|
+
///
|
|
71
|
+
/// @since 1.0.0
|
|
72
|
+
/// @param entity Selector for the target entity
|
|
73
|
+
/// @param initial State constant to write when the entity is uninitialised
|
|
74
|
+
/// @example
|
|
75
|
+
/// init_state(@s, STATE_IDLE)
|
|
49
76
|
fn init_state(entity: selector, initial: int) {
|
|
50
77
|
let cur: int = get_state(entity);
|
|
51
78
|
if (cur == -1) {
|
|
@@ -54,8 +81,16 @@ fn init_state(entity: selector, initial: int) {
|
|
|
54
81
|
}
|
|
55
82
|
|
|
56
83
|
/// Attempt a guarded transition from `from` to `to`.
|
|
84
|
+
///
|
|
57
85
|
/// Only performs the transition when the entity is currently in `from`.
|
|
58
|
-
///
|
|
86
|
+
///
|
|
87
|
+
/// @since 1.0.0
|
|
88
|
+
/// @param entity Selector for the target entity
|
|
89
|
+
/// @param from Required current state
|
|
90
|
+
/// @param to State to transition into
|
|
91
|
+
/// @returns `1` on success, `0` if the entity was not in `from`
|
|
92
|
+
/// @example
|
|
93
|
+
/// let ok: int = transition(@s, STATE_IDLE, STATE_COMBAT)
|
|
59
94
|
fn transition(entity: selector, from: int, to: int) -> int {
|
|
60
95
|
if (is_state(entity, from) == 1) {
|
|
61
96
|
set_state(entity, to);
|
package/src/stdlib/strings.mcrs
CHANGED
|
@@ -1,7 +1,135 @@
|
|
|
1
|
-
// String helpers for RedScript datapacks.
|
|
2
|
-
//
|
|
3
|
-
//
|
|
1
|
+
// strings.mcrs — String manipulation helpers for RedScript datapacks.
|
|
2
|
+
//
|
|
3
|
+
// ## MC 1.21.4 String Model
|
|
4
|
+
//
|
|
5
|
+
// Runtime string operations work via NBT storage (rs:strings).
|
|
6
|
+
// Strings must be pre-written into rs:strings storage before calling
|
|
7
|
+
// these functions. The storage layout convention is:
|
|
8
|
+
//
|
|
9
|
+
// rs:strings { A: "...", B: "...", Result: "..." }
|
|
10
|
+
//
|
|
11
|
+
// The string parameters accepted by these functions represent the
|
|
12
|
+
// NBT field name (key) within rs:strings, e.g. passing "A" means
|
|
13
|
+
// the string is stored at `rs:strings.A`.
|
|
14
|
+
//
|
|
15
|
+
// ## Feasibility Summary (MC 1.21.4)
|
|
16
|
+
//
|
|
17
|
+
// str_len — PARTIAL: returns 1 for plain string NBT tags.
|
|
18
|
+
// For true length, strings must be stored as char-lists.
|
|
19
|
+
// str_concat — PARTIAL: produces an NBT list [A, B] usable in tellraw.
|
|
20
|
+
// Single concatenated string requires a macro helper.
|
|
21
|
+
// str_contains — NOT FEASIBLE natively (no substring search command).
|
|
22
|
+
// Always returns 0; workaround described in docs.
|
|
23
|
+
// str_slice — FEASIBLE via `data modify ... set string` (MC 1.20.2+).
|
|
4
24
|
|
|
25
|
+
module library;
|
|
26
|
+
|
|
27
|
+
// ─── str_len ──────────────────────────────────────────────────────────────────
|
|
28
|
+
|
|
29
|
+
/// Returns the length of the string stored at rs:strings.{s}.
|
|
30
|
+
///
|
|
31
|
+
/// LIMITATION (MC 1.21.4): `execute store result score ... run data get storage`
|
|
32
|
+
/// returns 1 for any plain string NBT tag, not the character count. To get a
|
|
33
|
+
/// true character count, the string must be stored as an NBT list of single-char
|
|
34
|
+
/// strings (e.g. ["h","e","l","l","o"]), in which case data_get returns the list
|
|
35
|
+
/// length correctly.
|
|
36
|
+
///
|
|
37
|
+
/// For literal strings whose length is known at compile time, prefer using
|
|
38
|
+
/// the constant directly — the compiler will fold it.
|
|
39
|
+
///
|
|
40
|
+
/// @since 1.0.0
|
|
41
|
+
/// @param s NBT field name in rs:strings (e.g. "A")
|
|
42
|
+
/// @returns 1 for plain string tags; list element count for char-list strings.
|
|
43
|
+
/// @example
|
|
44
|
+
/// str_len("A") // result: 1 (plain string) or char count (char-list)
|
|
5
45
|
fn str_len(s: string) -> int {
|
|
46
|
+
return data_get("storage", "rs:strings", s);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// ─── str_concat ───────────────────────────────────────────────────────────────
|
|
50
|
+
|
|
51
|
+
/// Concatenates two strings from rs:strings and writes the result to
|
|
52
|
+
/// rs:strings.Result as an NBT list [a_value, b_value].
|
|
53
|
+
///
|
|
54
|
+
/// The result list is suitable for use in tellraw JSON text components:
|
|
55
|
+
/// tellraw @a {"nbt":"Result","storage":"rs:strings","interpret":false}
|
|
56
|
+
///
|
|
57
|
+
/// LIMITATION (MC 1.21.4): MC has no native string concatenation command.
|
|
58
|
+
/// Single-string concatenation (e.g. "ab" from "a"+"b") requires a
|
|
59
|
+
/// recursive macro helper function; this is out of scope for a pure stdlib.
|
|
60
|
+
/// The NBT list representation works for display (tellraw) but cannot be
|
|
61
|
+
/// passed back to further string operations without conversion.
|
|
62
|
+
///
|
|
63
|
+
/// ALTERNATIVE for display: use a tellraw JSON array directly:
|
|
64
|
+
/// tellraw @a [{"storage":"rs:strings","nbt":"A"},{"storage":"rs:strings","nbt":"B"}]
|
|
65
|
+
///
|
|
66
|
+
/// @since 1.0.0
|
|
67
|
+
/// @param a NBT field name of the first string in rs:strings (e.g. "A")
|
|
68
|
+
/// @param b NBT field name of the second string in rs:strings (e.g. "B")
|
|
69
|
+
/// @returns rs:strings.Result is set to an NBT list [valueA, valueB]
|
|
70
|
+
/// @example
|
|
71
|
+
/// str_concat("A", "B") // rs:strings.Result = ["hello", "world"]
|
|
72
|
+
fn str_concat(a: string, b: string) {
|
|
73
|
+
// Initialise Result as an empty list
|
|
74
|
+
raw("data modify storage rs:strings Result set value []");
|
|
75
|
+
// Append both strings as list elements (order-preserving concat)
|
|
76
|
+
raw("data modify storage rs:strings Result append from storage rs:strings {a}");
|
|
77
|
+
raw("data modify storage rs:strings Result append from storage rs:strings {b}");
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// ─── str_contains ─────────────────────────────────────────────────────────────
|
|
81
|
+
|
|
82
|
+
/// Checks whether the string at rs:strings.{s} contains the substring at
|
|
83
|
+
/// rs:strings.{sub}. Returns 1 if found, 0 if not found.
|
|
84
|
+
///
|
|
85
|
+
/// NOT FEASIBLE (MC 1.21.4): Minecraft datapacks do not provide a native
|
|
86
|
+
/// substring search command. There is no `execute if data` form that tests
|
|
87
|
+
/// whether one string is contained within another.
|
|
88
|
+
///
|
|
89
|
+
/// THIS FUNCTION ALWAYS RETURNS 0.
|
|
90
|
+
///
|
|
91
|
+
/// WORKAROUNDS for datapack authors:
|
|
92
|
+
/// 1. If sub is a compile-time constant and the check position is known,
|
|
93
|
+
/// use str_slice to extract a window and compare via scoreboard.
|
|
94
|
+
/// 2. Pre-process strings server-side and store a presence flag in NBT.
|
|
95
|
+
/// 3. Use a macro function (MC 1.20.2+) that iterates over character
|
|
96
|
+
/// positions with `$(var)` substitution and returns early on match.
|
|
97
|
+
///
|
|
98
|
+
/// @since 1.0.0
|
|
99
|
+
/// @param s NBT field name of the haystack string in rs:strings
|
|
100
|
+
/// @param sub NBT field name of the needle string in rs:strings
|
|
101
|
+
/// @returns 0 (always — not implemented due to MC limitation)
|
|
102
|
+
fn str_contains(s: string, sub: string) -> int {
|
|
103
|
+
// NOT FEASIBLE in MC 1.21.4: no native substring search.
|
|
104
|
+
// Returns 0 as a safe default. See workaround section in docs above.
|
|
6
105
|
return 0;
|
|
7
106
|
}
|
|
107
|
+
|
|
108
|
+
// ─── str_slice ────────────────────────────────────────────────────────────────
|
|
109
|
+
|
|
110
|
+
/// Extracts a substring from rs:strings.{s} and writes it to rs:strings.Result.
|
|
111
|
+
/// Uses the MC 1.20.2+ `data modify ... set string ... start end` feature.
|
|
112
|
+
///
|
|
113
|
+
/// Indices follow Java/Python slicing semantics:
|
|
114
|
+
/// - start is inclusive, 0-based.
|
|
115
|
+
/// - end is exclusive (end = start + length).
|
|
116
|
+
/// - Negative end counts from the end of the string (e.g. -1 = all but last char).
|
|
117
|
+
/// - Omitting end (use a very large positive int like 999999) copies to end of string.
|
|
118
|
+
///
|
|
119
|
+
/// Examples:
|
|
120
|
+
/// str_slice("A", 0, 5) → first 5 characters of rs:strings.A
|
|
121
|
+
/// str_slice("A", 2, -1) → all but first 2 and last 1 characters
|
|
122
|
+
///
|
|
123
|
+
/// @since 2.2.0
|
|
124
|
+
/// @param s NBT field name of the source string in rs:strings (e.g. "A")
|
|
125
|
+
/// @param start Start index (inclusive, 0-based)
|
|
126
|
+
/// @param end End index (exclusive); negative counts from string end
|
|
127
|
+
/// @returns rs:strings.Result contains the extracted substring
|
|
128
|
+
/// @example
|
|
129
|
+
/// str_slice("A", 0, 5) // first 5 chars of rs:strings.A
|
|
130
|
+
/// str_slice("A", 2, -1) // drop first 2 and last 1 chars
|
|
131
|
+
fn str_slice(s: string, start: int, end: int) {
|
|
132
|
+
// MC 1.20.2+ set-string command: copies a substring of the source string.
|
|
133
|
+
// {s}, {start}, {end} are interpolated by the RedScript compiler.
|
|
134
|
+
raw("data modify storage rs:strings Result set string storage rs:strings {s} {start} {end}");
|
|
135
|
+
}
|
package/src/stdlib/tags.mcrs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
/// Minecraft Java Edition tag constants generated from the Minecraft Fandom tag page.
|
|
2
|
+
/// Covers block, entity type, item, fluid, and damage type tags.
|
|
3
3
|
|
|
4
4
|
// ===== BLOCK TAGS =====
|
|
5
5
|
|
package/src/stdlib/teams.mcrs
CHANGED
|
@@ -1,57 +1,68 @@
|
|
|
1
1
|
// Team management helpers
|
|
2
2
|
// Usage: import "stdlib/teams.mcrs"
|
|
3
3
|
|
|
4
|
-
///
|
|
4
|
+
/// Creates a team and applies a display color.
|
|
5
|
+
/// @param name Team name used by the scoreboard team system
|
|
6
|
+
/// @param color Minecraft team color string such as `red` or `blue`
|
|
7
|
+
/// @example
|
|
8
|
+
/// create_team("spectator", "gray")
|
|
5
9
|
fn create_team(name: string, color: string) {
|
|
6
10
|
team_add(name);
|
|
7
11
|
team_option(name, "color", color);
|
|
8
12
|
}
|
|
9
13
|
|
|
10
|
-
///
|
|
14
|
+
/// Creates the standard red team with friendly fire disabled.
|
|
15
|
+
/// @example
|
|
16
|
+
/// create_red_team()
|
|
11
17
|
fn create_red_team() {
|
|
12
18
|
team_add("red");
|
|
13
19
|
team_option("red", "color", "red");
|
|
14
20
|
team_option("red", "friendlyFire", "false");
|
|
15
21
|
}
|
|
16
22
|
|
|
17
|
-
///
|
|
23
|
+
/// Creates the standard blue team with friendly fire disabled.
|
|
18
24
|
fn create_blue_team() {
|
|
19
25
|
team_add("blue");
|
|
20
26
|
team_option("blue", "color", "blue");
|
|
21
27
|
team_option("blue", "friendlyFire", "false");
|
|
22
28
|
}
|
|
23
29
|
|
|
24
|
-
///
|
|
30
|
+
/// Creates the standard green team with friendly fire disabled.
|
|
25
31
|
fn create_green_team() {
|
|
26
32
|
team_add("green");
|
|
27
33
|
team_option("green", "color", "green");
|
|
28
34
|
team_option("green", "friendlyFire", "false");
|
|
29
35
|
}
|
|
30
36
|
|
|
31
|
-
///
|
|
37
|
+
/// Creates the standard yellow team with friendly fire disabled.
|
|
32
38
|
fn create_yellow_team() {
|
|
33
39
|
team_add("yellow");
|
|
34
40
|
team_option("yellow", "color", "yellow");
|
|
35
41
|
team_option("yellow", "friendlyFire", "false");
|
|
36
42
|
}
|
|
37
43
|
|
|
38
|
-
///
|
|
44
|
+
/// Adds an entity or player selector to a team.
|
|
45
|
+
/// @param target Target selector to join the team
|
|
46
|
+
/// @param team_name Existing team name
|
|
39
47
|
fn add_to_team(target: selector, team_name: string) {
|
|
40
48
|
team_join(target, team_name);
|
|
41
49
|
}
|
|
42
50
|
|
|
43
|
-
///
|
|
51
|
+
/// Removes an entity or player selector from all teams.
|
|
52
|
+
/// @param target Target selector to remove from teams
|
|
44
53
|
fn remove_from_teams(target: selector) {
|
|
45
54
|
team_leave(target);
|
|
46
55
|
}
|
|
47
56
|
|
|
48
|
-
///
|
|
57
|
+
/// Creates the default two-team setup used by many arena games.
|
|
58
|
+
/// This creates `red` and `blue`.
|
|
49
59
|
fn setup_two_teams() {
|
|
50
60
|
create_red_team();
|
|
51
61
|
create_blue_team();
|
|
52
62
|
}
|
|
53
63
|
|
|
54
|
-
///
|
|
64
|
+
/// Creates the default four-team setup.
|
|
65
|
+
/// This creates `red`, `blue`, `green`, and `yellow`.
|
|
55
66
|
fn setup_four_teams() {
|
|
56
67
|
create_red_team();
|
|
57
68
|
create_blue_team();
|
|
@@ -59,7 +70,8 @@ fn setup_four_teams() {
|
|
|
59
70
|
create_yellow_team();
|
|
60
71
|
}
|
|
61
72
|
|
|
62
|
-
///
|
|
73
|
+
/// Removes the default team set created by this module.
|
|
74
|
+
/// Safe to call during cleanup even if some teams were unused.
|
|
63
75
|
fn cleanup_teams() {
|
|
64
76
|
team_remove("red");
|
|
65
77
|
team_remove("blue");
|
package/src/stdlib/timer.mcrs
CHANGED
|
@@ -78,32 +78,62 @@ impl Timer {
|
|
|
78
78
|
|
|
79
79
|
// ─── Tick-based stopwatch ─────────────────────────────────────────────────────
|
|
80
80
|
|
|
81
|
-
|
|
81
|
+
/// Convert Minecraft ticks to whole seconds (20 ticks = 1 second).
|
|
82
|
+
/// @since 1.0.0
|
|
83
|
+
/// @param ticks Elapsed ticks
|
|
84
|
+
/// @returns ticks / 20
|
|
85
|
+
/// @example
|
|
86
|
+
/// let s = tick_to_seconds(100) // result: 5
|
|
82
87
|
fn tick_to_seconds(ticks: int): int {
|
|
83
88
|
return ticks / 20;
|
|
84
89
|
}
|
|
85
90
|
|
|
86
|
-
|
|
91
|
+
/// Convert Minecraft ticks to milliseconds (1 tick = 50 ms).
|
|
92
|
+
/// @since 1.0.0
|
|
93
|
+
/// @param ticks Elapsed ticks
|
|
94
|
+
/// @returns ticks * 50
|
|
95
|
+
/// @example
|
|
96
|
+
/// let ms = tick_to_ms(20) // result: 1000
|
|
87
97
|
fn tick_to_ms(ticks: int): int {
|
|
88
98
|
return ticks * 50;
|
|
89
99
|
}
|
|
90
100
|
|
|
91
|
-
|
|
101
|
+
/// Convert seconds to Minecraft ticks (1 second = 20 ticks).
|
|
102
|
+
/// @since 1.0.0
|
|
103
|
+
/// @param s Seconds
|
|
104
|
+
/// @returns s * 20
|
|
105
|
+
/// @example
|
|
106
|
+
/// let t = seconds_to_ticks(5) // result: 100
|
|
92
107
|
fn seconds_to_ticks(s: int): int {
|
|
93
108
|
return s * 20;
|
|
94
109
|
}
|
|
95
110
|
|
|
96
|
-
|
|
111
|
+
/// Extract seconds component from a tick count (0-59).
|
|
112
|
+
/// @since 1.0.0
|
|
113
|
+
/// @param ticks Elapsed ticks
|
|
114
|
+
/// @returns (ticks / 20) % 60
|
|
115
|
+
/// @example
|
|
116
|
+
/// let s = format_time_s(1500) // result: 15 (75 seconds mod 60)
|
|
97
117
|
fn format_time_s(ticks: int): int {
|
|
98
118
|
return (ticks / 20) % 60;
|
|
99
119
|
}
|
|
100
120
|
|
|
101
|
-
|
|
121
|
+
/// Extract minutes component from a tick count (0-59).
|
|
122
|
+
/// @since 1.0.0
|
|
123
|
+
/// @param ticks Elapsed ticks
|
|
124
|
+
/// @returns (ticks / 1200) % 60
|
|
125
|
+
/// @example
|
|
126
|
+
/// let m = format_time_m(72000) // result: 0 (1 hour)
|
|
102
127
|
fn format_time_m(ticks: int): int {
|
|
103
128
|
return (ticks / 1200) % 60;
|
|
104
129
|
}
|
|
105
130
|
|
|
106
|
-
|
|
131
|
+
/// Extract hours component from a tick count.
|
|
132
|
+
/// @since 1.0.0
|
|
133
|
+
/// @param ticks Elapsed ticks
|
|
134
|
+
/// @returns ticks / 72000
|
|
135
|
+
/// @example
|
|
136
|
+
/// let h = format_time_h(144000) // result: 2
|
|
107
137
|
fn format_time_h(ticks: int): int {
|
|
108
138
|
return ticks / 72000;
|
|
109
139
|
}
|