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/list.mcrs
CHANGED
|
@@ -21,9 +21,26 @@ module library;
|
|
|
21
21
|
|
|
22
22
|
// ─── Static min/max/avg ──────────────────────────────────────────────────────
|
|
23
23
|
|
|
24
|
+
/// Return the smaller of two integers.
|
|
25
|
+
/// @since 1.0.0
|
|
26
|
+
/// @param a First value
|
|
27
|
+
/// @param b Second value
|
|
28
|
+
/// @returns a if a ≤ b, otherwise b
|
|
24
29
|
fn sort2_min(a: int, b: int): int { if (a <= b) { return a; } return b; }
|
|
30
|
+
|
|
31
|
+
/// Return the larger of two integers.
|
|
32
|
+
/// @since 1.0.0
|
|
33
|
+
/// @param a First value
|
|
34
|
+
/// @param b Second value
|
|
35
|
+
/// @returns a if a ≥ b, otherwise b
|
|
25
36
|
fn sort2_max(a: int, b: int): int { if (a >= b) { return a; } return b; }
|
|
26
37
|
|
|
38
|
+
/// Minimum of three integers.
|
|
39
|
+
/// @since 1.0.0
|
|
40
|
+
/// @param a First value
|
|
41
|
+
/// @param b Second value
|
|
42
|
+
/// @param c Third value
|
|
43
|
+
/// @returns The smallest of a, b, c
|
|
27
44
|
fn list_min3(a: int, b: int, c: int): int {
|
|
28
45
|
let m: int = a;
|
|
29
46
|
if (b < m) { m = b; }
|
|
@@ -31,6 +48,12 @@ fn list_min3(a: int, b: int, c: int): int {
|
|
|
31
48
|
return m;
|
|
32
49
|
}
|
|
33
50
|
|
|
51
|
+
/// Maximum of three integers.
|
|
52
|
+
/// @since 1.0.0
|
|
53
|
+
/// @param a First value
|
|
54
|
+
/// @param b Second value
|
|
55
|
+
/// @param c Third value
|
|
56
|
+
/// @returns The largest of a, b, c
|
|
34
57
|
fn list_max3(a: int, b: int, c: int): int {
|
|
35
58
|
let m: int = a;
|
|
36
59
|
if (b > m) { m = b; }
|
|
@@ -38,6 +61,14 @@ fn list_max3(a: int, b: int, c: int): int {
|
|
|
38
61
|
return m;
|
|
39
62
|
}
|
|
40
63
|
|
|
64
|
+
/// Minimum of five integers.
|
|
65
|
+
/// @since 1.0.0
|
|
66
|
+
/// @param a Value 1
|
|
67
|
+
/// @param b Value 2
|
|
68
|
+
/// @param c Value 3
|
|
69
|
+
/// @param d Value 4
|
|
70
|
+
/// @param e Value 5
|
|
71
|
+
/// @returns The smallest of the five inputs
|
|
41
72
|
fn list_min5(a: int, b: int, c: int, d: int, e: int): int {
|
|
42
73
|
let m: int = a;
|
|
43
74
|
if (b < m) { m = b; }
|
|
@@ -47,6 +78,14 @@ fn list_min5(a: int, b: int, c: int, d: int, e: int): int {
|
|
|
47
78
|
return m;
|
|
48
79
|
}
|
|
49
80
|
|
|
81
|
+
/// Maximum of five integers.
|
|
82
|
+
/// @since 1.0.0
|
|
83
|
+
/// @param a Value 1
|
|
84
|
+
/// @param b Value 2
|
|
85
|
+
/// @param c Value 3
|
|
86
|
+
/// @param d Value 4
|
|
87
|
+
/// @param e Value 5
|
|
88
|
+
/// @returns The largest of the five inputs
|
|
50
89
|
fn list_max5(a: int, b: int, c: int, d: int, e: int): int {
|
|
51
90
|
let m: int = a;
|
|
52
91
|
if (b > m) { m = b; }
|
|
@@ -56,15 +95,60 @@ fn list_max5(a: int, b: int, c: int, d: int, e: int): int {
|
|
|
56
95
|
return m;
|
|
57
96
|
}
|
|
58
97
|
|
|
98
|
+
/// Sum of five integers.
|
|
99
|
+
/// @since 1.0.0
|
|
100
|
+
/// @param a Value 1
|
|
101
|
+
/// @param b Value 2
|
|
102
|
+
/// @param c Value 3
|
|
103
|
+
/// @param d Value 4
|
|
104
|
+
/// @param e Value 5
|
|
105
|
+
/// @returns a + b + c + d + e
|
|
59
106
|
fn list_sum5(a: int, b: int, c: int, d: int, e: int): int { return a + b + c + d + e; }
|
|
107
|
+
|
|
108
|
+
/// Sum of four integers.
|
|
109
|
+
/// @since 1.0.0
|
|
110
|
+
/// @param a Value 1
|
|
111
|
+
/// @param b Value 2
|
|
112
|
+
/// @param c Value 3
|
|
113
|
+
/// @param d Value 4
|
|
114
|
+
/// @returns a + b + c + d
|
|
60
115
|
fn list_sum4(a: int, b: int, c: int, d: int): int { return a + b + c + d; }
|
|
116
|
+
|
|
117
|
+
/// Sum of three integers.
|
|
118
|
+
/// @since 1.0.0
|
|
119
|
+
/// @param a Value 1
|
|
120
|
+
/// @param b Value 2
|
|
121
|
+
/// @param c Value 3
|
|
122
|
+
/// @returns a + b + c
|
|
61
123
|
fn list_sum3(a: int, b: int, c: int): int { return a + b + c; }
|
|
124
|
+
|
|
125
|
+
/// Integer average of three values (truncates toward zero).
|
|
126
|
+
/// @since 1.0.0
|
|
127
|
+
/// @param a Value 1
|
|
128
|
+
/// @param b Value 2
|
|
129
|
+
/// @param c Value 3
|
|
130
|
+
/// @returns (a + b + c) / 3
|
|
62
131
|
fn avg3(a: int, b: int, c: int): int { return (a + b + c) / 3; }
|
|
132
|
+
|
|
133
|
+
/// Integer average of five values (truncates toward zero).
|
|
134
|
+
/// @since 1.0.0
|
|
135
|
+
/// @param a Value 1
|
|
136
|
+
/// @param b Value 2
|
|
137
|
+
/// @param c Value 3
|
|
138
|
+
/// @param d Value 4
|
|
139
|
+
/// @param e Value 5
|
|
140
|
+
/// @returns (a + b + c + d + e) / 5
|
|
63
141
|
fn avg5(a: int, b: int, c: int, d: int, e: int): int { return (a + b + c + d + e) / 5; }
|
|
64
142
|
|
|
65
143
|
// ─── Static sort (sorting network) ───────────────────────────────────────────
|
|
66
144
|
|
|
67
|
-
|
|
145
|
+
/// Sort three values and return the one at position `pos` (0 = min, 1 = mid, 2 = max).
|
|
146
|
+
/// @since 1.0.0
|
|
147
|
+
/// @param a Value 1
|
|
148
|
+
/// @param b Value 2
|
|
149
|
+
/// @param c Value 3
|
|
150
|
+
/// @param pos Desired position in sorted order (0, 1, or 2)
|
|
151
|
+
/// @returns The value at the requested sorted position
|
|
68
152
|
fn sort3(a: int, b: int, c: int, pos: int): int {
|
|
69
153
|
let x: int = a; let y: int = b; let z: int = c;
|
|
70
154
|
if (x > y) { let t: int = x; x = y; y = t; }
|
|
@@ -77,6 +161,12 @@ fn sort3(a: int, b: int, c: int, pos: int): int {
|
|
|
77
161
|
|
|
78
162
|
// ─── Weighted random choice ───────────────────────────────────────────────────
|
|
79
163
|
|
|
164
|
+
/// Weighted random choice between two options (0 or 1) using an LCG seed.
|
|
165
|
+
/// @since 1.0.0
|
|
166
|
+
/// @param seed LCG seed (any integer)
|
|
167
|
+
/// @param w0 Weight for option 0 (must be > 0)
|
|
168
|
+
/// @param w1 Weight for option 1 (must be > 0)
|
|
169
|
+
/// @returns 0 with probability w0/(w0+w1), 1 otherwise
|
|
80
170
|
fn weighted2(seed: int, w0: int, w1: int): int {
|
|
81
171
|
let total: int = w0 + w1;
|
|
82
172
|
let r: int = seed * 1664525 + 1013904223;
|
|
@@ -85,6 +175,13 @@ fn weighted2(seed: int, w0: int, w1: int): int {
|
|
|
85
175
|
return 1;
|
|
86
176
|
}
|
|
87
177
|
|
|
178
|
+
/// Weighted random choice among three options (0, 1, or 2) using an LCG seed.
|
|
179
|
+
/// @since 1.0.0
|
|
180
|
+
/// @param seed LCG seed (any integer)
|
|
181
|
+
/// @param w0 Weight for option 0
|
|
182
|
+
/// @param w1 Weight for option 1
|
|
183
|
+
/// @param w2 Weight for option 2
|
|
184
|
+
/// @returns 0, 1, or 2 proportional to the respective weights
|
|
88
185
|
fn weighted3(seed: int, w0: int, w1: int, w2: int): int {
|
|
89
186
|
let total: int = w0 + w1 + w2;
|
|
90
187
|
let r: int = seed * 1664525 + 1013904223;
|
|
@@ -97,8 +194,14 @@ fn weighted3(seed: int, w0: int, w1: int, w2: int): int {
|
|
|
97
194
|
|
|
98
195
|
// ─── Sorting networks (fixed-size, optimal compare-swap count) ────────────────
|
|
99
196
|
|
|
100
|
-
|
|
101
|
-
|
|
197
|
+
/// Sort four values using an optimal 5-comparison sorting network, returning the value at `pos`.
|
|
198
|
+
/// @since 1.0.0
|
|
199
|
+
/// @param a Value 1
|
|
200
|
+
/// @param b Value 2
|
|
201
|
+
/// @param c Value 3
|
|
202
|
+
/// @param d Value 4
|
|
203
|
+
/// @param pos Desired position in sorted order (0 = min, 3 = max)
|
|
204
|
+
/// @returns The value at the requested sorted position
|
|
102
205
|
fn sort4(a: int, b: int, c: int, d: int, pos: int): int {
|
|
103
206
|
let w: int = a; let x: int = b; let y: int = c; let z: int = d;
|
|
104
207
|
// Sorting network for 4 elements
|
|
@@ -113,8 +216,15 @@ fn sort4(a: int, b: int, c: int, d: int, pos: int): int {
|
|
|
113
216
|
return z;
|
|
114
217
|
}
|
|
115
218
|
|
|
116
|
-
|
|
117
|
-
|
|
219
|
+
/// Sort five values using a 9-comparison Batcher odd-even merge sort network, returning the value at `pos`.
|
|
220
|
+
/// @since 1.0.0
|
|
221
|
+
/// @param a Value 1
|
|
222
|
+
/// @param b Value 2
|
|
223
|
+
/// @param c Value 3
|
|
224
|
+
/// @param d Value 4
|
|
225
|
+
/// @param e Value 5
|
|
226
|
+
/// @param pos Desired position in sorted order (0 = min, 4 = max)
|
|
227
|
+
/// @returns The value at the requested sorted position
|
|
118
228
|
fn sort5(a: int, b: int, c: int, d: int, e: int, pos: int): int {
|
|
119
229
|
let v0: int = a; let v1: int = b; let v2: int = c; let v3: int = d; let v4: int = e;
|
|
120
230
|
// 9-comparison sorting network (Batcher odd-even merge sort)
|
|
@@ -136,8 +246,11 @@ fn sort5(a: int, b: int, c: int, d: int, e: int, pos: int): int {
|
|
|
136
246
|
|
|
137
247
|
// ─── Dynamic sort (arbitrary-length, uses array reference passing) ─────────────
|
|
138
248
|
|
|
139
|
-
|
|
140
|
-
|
|
249
|
+
/// In-place ascending bubble sort for an array of any length.
|
|
250
|
+
/// Requires RedScript ≥ 2.4.0 (array parameter passed by reference).
|
|
251
|
+
/// @since 1.0.0
|
|
252
|
+
/// @param arr Array to sort (modified in-place)
|
|
253
|
+
/// @param len Number of elements to sort
|
|
141
254
|
fn list_sort_asc(arr: int[], len: int) {
|
|
142
255
|
let i: int = 0;
|
|
143
256
|
while (i < len - 1) {
|
|
@@ -154,7 +267,11 @@ fn list_sort_asc(arr: int[], len: int) {
|
|
|
154
267
|
}
|
|
155
268
|
}
|
|
156
269
|
|
|
157
|
-
|
|
270
|
+
/// In-place descending bubble sort for an array of any length.
|
|
271
|
+
/// Requires RedScript ≥ 2.4.0 (array parameter passed by reference).
|
|
272
|
+
/// @since 1.0.0
|
|
273
|
+
/// @param arr Array to sort (modified in-place)
|
|
274
|
+
/// @param len Number of elements to sort
|
|
158
275
|
fn list_sort_desc(arr: int[], len: int) {
|
|
159
276
|
let i: int = 0;
|
|
160
277
|
while (i < len - 1) {
|
|
@@ -173,7 +290,11 @@ fn list_sort_desc(arr: int[], len: int) {
|
|
|
173
290
|
|
|
174
291
|
// ─── Dynamic array aggregates ─────────────────────────────────────────────────
|
|
175
292
|
|
|
176
|
-
|
|
293
|
+
/// Sum all elements of an array.
|
|
294
|
+
/// @since 1.0.0
|
|
295
|
+
/// @param arr Input array
|
|
296
|
+
/// @param len Number of elements
|
|
297
|
+
/// @returns Sum of arr[0..len)
|
|
177
298
|
fn list_sum(arr: int[], len: int): int {
|
|
178
299
|
let s: int = 0;
|
|
179
300
|
let i: int = 0;
|
|
@@ -184,15 +305,22 @@ fn list_sum(arr: int[], len: int): int {
|
|
|
184
305
|
return s;
|
|
185
306
|
}
|
|
186
307
|
|
|
187
|
-
|
|
188
|
-
|
|
308
|
+
/// Arithmetic mean of an array as fixed-point × 10000.
|
|
309
|
+
/// @since 1.0.0
|
|
310
|
+
/// @param arr Input array
|
|
311
|
+
/// @param len Number of elements (must be > 0)
|
|
312
|
+
/// @returns (sum × 10000) / len; returns 0 for empty array
|
|
189
313
|
fn list_avg(arr: int[], len: int): int {
|
|
190
314
|
if (len <= 0) { return 0; }
|
|
191
315
|
let s: int = list_sum(arr, len);
|
|
192
316
|
return s * 10000 / len;
|
|
193
317
|
}
|
|
194
318
|
|
|
195
|
-
|
|
319
|
+
/// Minimum element in an array.
|
|
320
|
+
/// @since 1.0.0
|
|
321
|
+
/// @param arr Input array (must have at least one element)
|
|
322
|
+
/// @param len Number of elements
|
|
323
|
+
/// @returns Smallest value in arr[0..len)
|
|
196
324
|
fn list_min(arr: int[], len: int): int {
|
|
197
325
|
let m: int = arr[0];
|
|
198
326
|
let i: int = 1;
|
|
@@ -203,7 +331,11 @@ fn list_min(arr: int[], len: int): int {
|
|
|
203
331
|
return m;
|
|
204
332
|
}
|
|
205
333
|
|
|
206
|
-
|
|
334
|
+
/// Maximum element in an array.
|
|
335
|
+
/// @since 1.0.0
|
|
336
|
+
/// @param arr Input array (must have at least one element)
|
|
337
|
+
/// @param len Number of elements
|
|
338
|
+
/// @returns Largest value in arr[0..len)
|
|
207
339
|
fn list_max(arr: int[], len: int): int {
|
|
208
340
|
let m: int = arr[0];
|
|
209
341
|
let i: int = 1;
|
|
@@ -214,7 +346,12 @@ fn list_max(arr: int[], len: int): int {
|
|
|
214
346
|
return m;
|
|
215
347
|
}
|
|
216
348
|
|
|
217
|
-
|
|
349
|
+
/// Test whether a value exists in an array.
|
|
350
|
+
/// @since 1.0.0
|
|
351
|
+
/// @param arr Input array
|
|
352
|
+
/// @param len Number of elements
|
|
353
|
+
/// @param val Value to search for
|
|
354
|
+
/// @returns 1 if val is found, 0 otherwise
|
|
218
355
|
fn list_contains(arr: int[], len: int, val: int): int {
|
|
219
356
|
let i: int = 0;
|
|
220
357
|
while (i < len) {
|
|
@@ -224,7 +361,12 @@ fn list_contains(arr: int[], len: int, val: int): int {
|
|
|
224
361
|
return 0;
|
|
225
362
|
}
|
|
226
363
|
|
|
227
|
-
|
|
364
|
+
/// Find the first index of a value in an array.
|
|
365
|
+
/// @since 1.0.0
|
|
366
|
+
/// @param arr Input array
|
|
367
|
+
/// @param len Number of elements
|
|
368
|
+
/// @param val Value to search for
|
|
369
|
+
/// @returns First index of val, or -1 if not found
|
|
228
370
|
fn list_index_of(arr: int[], len: int, val: int): int {
|
|
229
371
|
let i: int = 0;
|
|
230
372
|
while (i < len) {
|
|
@@ -234,8 +376,12 @@ fn list_index_of(arr: int[], len: int, val: int): int {
|
|
|
234
376
|
return -1;
|
|
235
377
|
}
|
|
236
378
|
|
|
237
|
-
|
|
238
|
-
|
|
379
|
+
/// Fisher-Yates in-place shuffle using a linear congruential generator.
|
|
380
|
+
/// @since 1.0.0
|
|
381
|
+
/// @param arr Array to shuffle (modified in-place)
|
|
382
|
+
/// @param len Number of elements
|
|
383
|
+
/// @param seed Initial LCG seed (any integer)
|
|
384
|
+
/// @returns The shuffled array (same reference as arr)
|
|
239
385
|
fn list_shuffle(arr: int[], len: int, seed: int): int[] {
|
|
240
386
|
let i: int = len - 1;
|
|
241
387
|
let s: int = seed;
|
|
@@ -252,7 +398,11 @@ fn list_shuffle(arr: int[], len: int, seed: int): int[] {
|
|
|
252
398
|
return arr;
|
|
253
399
|
}
|
|
254
400
|
|
|
255
|
-
|
|
401
|
+
/// Count the number of unique values in an array (O(n²); suitable for small arrays).
|
|
402
|
+
/// @since 1.0.0
|
|
403
|
+
/// @param arr Input array
|
|
404
|
+
/// @param len Number of elements
|
|
405
|
+
/// @returns Count of distinct values in arr[0..len)
|
|
256
406
|
fn list_dedup_count(arr: int[], len: int): int {
|
|
257
407
|
let count: int = 0;
|
|
258
408
|
let i: int = 0;
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
// map.mcrs — NBT compound-backed map helpers for RedScript datapacks.
|
|
2
|
+
//
|
|
3
|
+
// Maps are stored in `storage rs:maps` using a compound per map:
|
|
4
|
+
//
|
|
5
|
+
// rs:maps { Stats: { kills: 12, deaths: 3 } }
|
|
6
|
+
//
|
|
7
|
+
// `map_name` selects the top-level compound field. `key` selects the child
|
|
8
|
+
// field within that compound. Both values are interpolated directly into the
|
|
9
|
+
// NBT path, so callers should use path-safe identifiers (for example
|
|
10
|
+
// `Stats`, `kills`, `player_01`) rather than arbitrary user text.
|
|
11
|
+
|
|
12
|
+
module library;
|
|
13
|
+
|
|
14
|
+
fn __map_set_apply() {
|
|
15
|
+
raw("$execute store result storage rs:maps $(map_name).$(key) int 1 run data get storage rs:macro_args value");
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
fn __map_get_apply() {
|
|
19
|
+
raw("$execute store result score $ret __OBJ__ run data get storage rs:maps $(map_name).$(key)");
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
fn __map_has_apply() {
|
|
23
|
+
raw("$execute store success score $ret __OBJ__ if data storage rs:maps $(map_name).$(key)");
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
fn __map_delete_apply() {
|
|
27
|
+
raw("$data remove storage rs:maps $(map_name).$(key)");
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
fn __map_clear_apply() {
|
|
31
|
+
raw("$data remove storage rs:maps $(map_name)");
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/// Stores an integer value in `storage rs:maps.{map_name}.{key}`.
|
|
35
|
+
///
|
|
36
|
+
/// This creates the parent compound on demand if it does not already exist.
|
|
37
|
+
/// Both `map_name` and `key` are inserted directly into the NBT path, so they
|
|
38
|
+
/// must be valid path segments.
|
|
39
|
+
///
|
|
40
|
+
/// @since 3.0.0
|
|
41
|
+
/// @param map_name Top-level map name under `storage rs:maps`
|
|
42
|
+
/// @param key Key name inside the selected map compound
|
|
43
|
+
/// @param value Integer value to write
|
|
44
|
+
/// @example
|
|
45
|
+
/// map_set("Stats", "kills", 7)
|
|
46
|
+
fn map_set(map_name: string, key: string, value: int) {
|
|
47
|
+
raw("data modify storage rs:macro_args map_name set from storage rs:strings __sp0");
|
|
48
|
+
raw("data modify storage rs:macro_args key set from storage rs:strings __sp1");
|
|
49
|
+
raw("execute store result storage rs:macro_args value int 1 run scoreboard players get $p0 __OBJ__");
|
|
50
|
+
raw("function __NS__:__map_set_apply with storage rs:macro_args");
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/// Reads an integer value from `storage rs:maps.{map_name}.{key}`.
|
|
54
|
+
///
|
|
55
|
+
/// If the path does not exist, this function returns `0`.
|
|
56
|
+
///
|
|
57
|
+
/// @since 3.0.0
|
|
58
|
+
/// @param map_name Top-level map name under `storage rs:maps`
|
|
59
|
+
/// @param key Key name inside the selected map compound
|
|
60
|
+
/// @returns Stored integer value, or `0` if the key is missing
|
|
61
|
+
/// @example
|
|
62
|
+
/// let kills: int = map_get("Stats", "kills")
|
|
63
|
+
fn map_get(map_name: string, key: string): int {
|
|
64
|
+
raw("scoreboard players set $ret __OBJ__ 0");
|
|
65
|
+
raw("data modify storage rs:macro_args map_name set from storage rs:strings __sp0");
|
|
66
|
+
raw("data modify storage rs:macro_args key set from storage rs:strings __sp1");
|
|
67
|
+
raw("function __NS__:__map_get_apply with storage rs:macro_args");
|
|
68
|
+
raw("return 1");
|
|
69
|
+
return 0;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/// Checks whether `storage rs:maps.{map_name}.{key}` exists.
|
|
73
|
+
///
|
|
74
|
+
/// @since 3.0.0
|
|
75
|
+
/// @param map_name Top-level map name under `storage rs:maps`
|
|
76
|
+
/// @param key Key name inside the selected map compound
|
|
77
|
+
/// @returns `1` if the key exists, otherwise `0`
|
|
78
|
+
/// @example
|
|
79
|
+
/// if (map_has("Stats", "kills") == 1) { }
|
|
80
|
+
fn map_has(map_name: string, key: string): int {
|
|
81
|
+
raw("data modify storage rs:macro_args map_name set from storage rs:strings __sp0");
|
|
82
|
+
raw("data modify storage rs:macro_args key set from storage rs:strings __sp1");
|
|
83
|
+
raw("function __NS__:__map_has_apply with storage rs:macro_args");
|
|
84
|
+
raw("return 1");
|
|
85
|
+
return 0;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/// Removes a key from the selected map compound.
|
|
89
|
+
///
|
|
90
|
+
/// Removing a missing key is a no-op in Minecraft.
|
|
91
|
+
///
|
|
92
|
+
/// @since 3.0.0
|
|
93
|
+
/// @param map_name Top-level map name under `storage rs:maps`
|
|
94
|
+
/// @param key Key name inside the selected map compound
|
|
95
|
+
/// @example
|
|
96
|
+
/// map_delete("Stats", "kills")
|
|
97
|
+
fn map_delete(map_name: string, key: string) {
|
|
98
|
+
raw("data modify storage rs:macro_args map_name set from storage rs:strings __sp0");
|
|
99
|
+
raw("data modify storage rs:macro_args key set from storage rs:strings __sp1");
|
|
100
|
+
raw("function __NS__:__map_delete_apply with storage rs:macro_args");
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/// Removes the entire map compound from `storage rs:maps`.
|
|
104
|
+
///
|
|
105
|
+
/// @since 3.0.0
|
|
106
|
+
/// @param map_name Top-level map name under `storage rs:maps`
|
|
107
|
+
/// @example
|
|
108
|
+
/// map_clear("Stats")
|
|
109
|
+
fn map_clear(map_name: string) {
|
|
110
|
+
raw("data modify storage rs:macro_args map_name set from storage rs:strings __sp0");
|
|
111
|
+
raw("function __NS__:__map_clear_apply with storage rs:macro_args");
|
|
112
|
+
}
|
package/src/stdlib/math.mcrs
CHANGED
|
@@ -17,6 +17,13 @@ module library;
|
|
|
17
17
|
|
|
18
18
|
// ─── Phase 1: Basic integer helpers ──────────────────────────────────────────
|
|
19
19
|
|
|
20
|
+
/// Return the absolute value of x.
|
|
21
|
+
/// @since 1.0.0
|
|
22
|
+
/// @param x The input value (any numeric type T)
|
|
23
|
+
/// @returns x if x >= 0, else -x
|
|
24
|
+
/// @example
|
|
25
|
+
/// let a = abs(-5) // result: 5
|
|
26
|
+
/// let b = abs(3) // result: 3
|
|
20
27
|
fn abs<T>(x: T) -> T {
|
|
21
28
|
if (x < 0) {
|
|
22
29
|
return 0 - x;
|
|
@@ -24,6 +31,12 @@ fn abs<T>(x: T) -> T {
|
|
|
24
31
|
return x;
|
|
25
32
|
}
|
|
26
33
|
|
|
34
|
+
/// Return the sign of x: 1, 0, or -1.
|
|
35
|
+
/// @since 1.0.0
|
|
36
|
+
/// @param x Input integer
|
|
37
|
+
/// @returns 1 if x > 0, -1 if x < 0, 0 if x == 0
|
|
38
|
+
/// @example
|
|
39
|
+
/// let s = sign(-42) // result: -1
|
|
27
40
|
fn sign(x: int) -> int {
|
|
28
41
|
if (x > 0) {
|
|
29
42
|
return 1;
|
|
@@ -34,6 +47,13 @@ fn sign(x: int) -> int {
|
|
|
34
47
|
return 0;
|
|
35
48
|
}
|
|
36
49
|
|
|
50
|
+
/// Return the smaller of two values.
|
|
51
|
+
/// @since 1.0.0
|
|
52
|
+
/// @param a First value
|
|
53
|
+
/// @param b Second value
|
|
54
|
+
/// @returns a if a < b, else b
|
|
55
|
+
/// @example
|
|
56
|
+
/// let m = min(3, 7) // result: 3
|
|
37
57
|
fn min<T>(a: T, b: T) -> T {
|
|
38
58
|
if (a < b) {
|
|
39
59
|
return a;
|
|
@@ -41,6 +61,13 @@ fn min<T>(a: T, b: T) -> T {
|
|
|
41
61
|
return b;
|
|
42
62
|
}
|
|
43
63
|
|
|
64
|
+
/// Return the larger of two values.
|
|
65
|
+
/// @since 1.0.0
|
|
66
|
+
/// @param a First value
|
|
67
|
+
/// @param b Second value
|
|
68
|
+
/// @returns a if a > b, else b
|
|
69
|
+
/// @example
|
|
70
|
+
/// let m = max(3, 7) // result: 7
|
|
44
71
|
fn max<T>(a: T, b: T) -> T {
|
|
45
72
|
if (a > b) {
|
|
46
73
|
return a;
|
|
@@ -48,6 +75,15 @@ fn max<T>(a: T, b: T) -> T {
|
|
|
48
75
|
return b;
|
|
49
76
|
}
|
|
50
77
|
|
|
78
|
+
/// Clamp x to the range [lo, hi].
|
|
79
|
+
/// @since 1.0.0
|
|
80
|
+
/// @param x Input value
|
|
81
|
+
/// @param lo Lower bound (inclusive)
|
|
82
|
+
/// @param hi Upper bound (inclusive)
|
|
83
|
+
/// @returns lo if x < lo; hi if x > hi; otherwise x
|
|
84
|
+
/// @example
|
|
85
|
+
/// let c = clamp(150, 0, 100) // result: 100
|
|
86
|
+
/// let d = clamp(50, 0, 100) // result: 50
|
|
51
87
|
fn clamp<T>(x: T, lo: T, hi: T) -> T {
|
|
52
88
|
if (x < lo) {
|
|
53
89
|
return lo;
|
|
@@ -58,9 +94,15 @@ fn clamp<T>(x: T, lo: T, hi: T) -> T {
|
|
|
58
94
|
return x;
|
|
59
95
|
}
|
|
60
96
|
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
97
|
+
/// Linear interpolation between a and b using fixed-point t in [0, 1000].
|
|
98
|
+
/// @since 1.0.0
|
|
99
|
+
/// @param a Start value
|
|
100
|
+
/// @param b End value
|
|
101
|
+
/// @param t Interpolation factor ×1000 (0 = a, 1000 = b)
|
|
102
|
+
/// @returns a + (b - a) * t / 1000
|
|
103
|
+
/// @example
|
|
104
|
+
/// let v = lerp(0, 1000, 500) // result: 500
|
|
105
|
+
/// let w = lerp(100, 200, 750) // result: 175
|
|
64
106
|
fn lerp(a: int, b: int, t: int) -> int {
|
|
65
107
|
return a + (b - a) * t / 1000;
|
|
66
108
|
}
|
|
@@ -100,9 +142,13 @@ fn isqrt(n: int) -> int {
|
|
|
100
142
|
return x;
|
|
101
143
|
}
|
|
102
144
|
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
145
|
+
/// Fixed-point square root (scale = 1000).
|
|
146
|
+
/// @since 1.0.0
|
|
147
|
+
/// @param x Input value ×1000 (i.e. 2.0 → 2000)
|
|
148
|
+
/// @returns sqrt(x/1000) × 1000
|
|
149
|
+
/// @example
|
|
150
|
+
/// let s = sqrt_fixed(2000) // result: ~1414 (√2 × 1000)
|
|
151
|
+
/// let t = sqrt_fixed(1000) // result: 1000 (√1 × 1000)
|
|
106
152
|
fn sqrt_fixed(x: int) -> int {
|
|
107
153
|
return isqrt(x * 1000);
|
|
108
154
|
}
|
|
@@ -162,14 +208,14 @@ fn _math_init() {
|
|
|
162
208
|
);
|
|
163
209
|
}
|
|
164
210
|
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
211
|
+
/// Sine of an angle in integer degrees, returned as ×1000 fixed-point.
|
|
212
|
+
/// Uses a 91-entry lookup table stored in NBT (math:tables.sin).
|
|
213
|
+
/// @since 2.0.0
|
|
214
|
+
/// @param deg Angle in degrees (any integer; normalised mod 360)
|
|
215
|
+
/// @returns sin(deg°) × 1000 (range: -1000 to 1000)
|
|
216
|
+
/// @example
|
|
217
|
+
/// let s = sin_fixed(30) // result: 500
|
|
218
|
+
/// let t = sin_fixed(270) // result: -1000
|
|
173
219
|
@require_on_load(_math_init)
|
|
174
220
|
fn sin_fixed(deg: int) -> int {
|
|
175
221
|
// Normalise to [0, 359]
|
|
@@ -192,10 +238,14 @@ fn sin_fixed(deg: int) -> int {
|
|
|
192
238
|
return 0 - storage_get_int("math:tables", "sin", idx);
|
|
193
239
|
}
|
|
194
240
|
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
241
|
+
/// Cosine of an angle in integer degrees, returned as ×1000 fixed-point.
|
|
242
|
+
/// Implemented as sin_fixed(deg + 90).
|
|
243
|
+
/// @since 2.0.0
|
|
244
|
+
/// @param deg Angle in degrees (any integer; normalised mod 360)
|
|
245
|
+
/// @returns cos(deg°) × 1000 (range: -1000 to 1000)
|
|
246
|
+
/// @example
|
|
247
|
+
/// let c = cos_fixed(0) // result: 1000
|
|
248
|
+
/// let d = cos_fixed(180) // result: -1000
|
|
199
249
|
@require_on_load(_math_init)
|
|
200
250
|
fn cos_fixed(deg: int) -> int {
|
|
201
251
|
return sin_fixed(deg + 90);
|