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/color.mcrs
CHANGED
|
@@ -9,30 +9,58 @@ module library;
|
|
|
9
9
|
|
|
10
10
|
// ─── Pack / Unpack ────────────────────────────────────────────────────────────
|
|
11
11
|
|
|
12
|
-
|
|
12
|
+
/// Pack RGB components into a single integer (0xRRGGBB format).
|
|
13
|
+
/// @since 1.0.0
|
|
14
|
+
/// @param r Red channel, range [0, 255]
|
|
15
|
+
/// @param g Green channel, range [0, 255]
|
|
16
|
+
/// @param b Blue channel, range [0, 255]
|
|
17
|
+
/// @returns r*65536 + g*256 + b
|
|
18
|
+
/// @example
|
|
19
|
+
/// let red: int = rgb_pack(255, 0, 0) // result: 16711680 (0xFF0000)
|
|
13
20
|
fn rgb_pack(r: int, g: int, b: int): int {
|
|
14
21
|
return r * 65536 + g * 256 + b;
|
|
15
22
|
}
|
|
16
23
|
|
|
17
|
-
|
|
24
|
+
/// Extract the red component from a packed RGB integer.
|
|
25
|
+
/// @since 1.0.0
|
|
26
|
+
/// @param packed Packed color integer (0xRRGGBB)
|
|
27
|
+
/// @returns Red channel value in [0, 255]
|
|
28
|
+
/// @example
|
|
29
|
+
/// let r: int = rgb_r(16711680) // result: 255
|
|
18
30
|
fn rgb_r(packed: int): int {
|
|
19
31
|
return packed / 65536 % 256;
|
|
20
32
|
}
|
|
21
33
|
|
|
22
|
-
|
|
34
|
+
/// Extract the green component from a packed RGB integer.
|
|
35
|
+
/// @since 1.0.0
|
|
36
|
+
/// @param packed Packed color integer (0xRRGGBB)
|
|
37
|
+
/// @returns Green channel value in [0, 255]
|
|
38
|
+
/// @example
|
|
39
|
+
/// let g: int = rgb_g(65280) // result: 255 (0x00FF00)
|
|
23
40
|
fn rgb_g(packed: int): int {
|
|
24
41
|
return packed / 256 % 256;
|
|
25
42
|
}
|
|
26
43
|
|
|
27
|
-
|
|
44
|
+
/// Extract the blue component from a packed RGB integer.
|
|
45
|
+
/// @since 1.0.0
|
|
46
|
+
/// @param packed Packed color integer (0xRRGGBB)
|
|
47
|
+
/// @returns Blue channel value in [0, 255]
|
|
48
|
+
/// @example
|
|
49
|
+
/// let b: int = rgb_b(255) // result: 255 (0x0000FF)
|
|
28
50
|
fn rgb_b(packed: int): int {
|
|
29
51
|
return packed % 256;
|
|
30
52
|
}
|
|
31
53
|
|
|
32
54
|
// ─── Blending ─────────────────────────────────────────────────────────────────
|
|
33
55
|
|
|
34
|
-
|
|
35
|
-
|
|
56
|
+
/// Linear interpolation between two packed RGB colors.
|
|
57
|
+
/// @since 1.0.0
|
|
58
|
+
/// @param a Start color (packed 0xRRGGBB)
|
|
59
|
+
/// @param b End color (packed 0xRRGGBB)
|
|
60
|
+
/// @param t Blend factor in [0, 1000] (0 = a, 1000 = b)
|
|
61
|
+
/// @returns Packed RGB interpolated between a and b
|
|
62
|
+
/// @example
|
|
63
|
+
/// let mid: int = rgb_lerp(0xFF0000, 0x0000FF, 500) // halfway between red and blue
|
|
36
64
|
fn rgb_lerp(a: int, b: int, t: int): int {
|
|
37
65
|
let ra: int = a / 65536 % 256;
|
|
38
66
|
let ga: int = a / 256 % 256;
|
|
@@ -53,7 +81,14 @@ fn rgb_lerp(a: int, b: int, t: int): int {
|
|
|
53
81
|
// H ∈ [0, 3600000] (360° × 10000)
|
|
54
82
|
// S, L ∈ [0, 10000] (1.0 × 10000)
|
|
55
83
|
|
|
56
|
-
|
|
84
|
+
/// Compute the HSL lightness from RGB components (×10000 scale).
|
|
85
|
+
/// @since 1.0.0
|
|
86
|
+
/// @param r Red ×10000, range [0, 2550000]
|
|
87
|
+
/// @param g Green ×10000, range [0, 2550000]
|
|
88
|
+
/// @param b Blue ×10000, range [0, 2550000]
|
|
89
|
+
/// @returns Lightness in [0, 10000] (0 = black, 10000 = white)
|
|
90
|
+
/// @example
|
|
91
|
+
/// let l: int = rgb_to_l(2550000, 2550000, 2550000) // result: 10000 (white)
|
|
57
92
|
fn rgb_to_l(r: int, g: int, b: int): int {
|
|
58
93
|
let mx: int = r;
|
|
59
94
|
if (g > mx) { mx = g; }
|
|
@@ -64,7 +99,14 @@ fn rgb_to_l(r: int, g: int, b: int): int {
|
|
|
64
99
|
return (mx + mn) / 510;
|
|
65
100
|
}
|
|
66
101
|
|
|
67
|
-
|
|
102
|
+
/// Compute the HSL saturation from RGB components (×10000 scale).
|
|
103
|
+
/// @since 1.0.0
|
|
104
|
+
/// @param r Red ×10000, range [0, 2550000]
|
|
105
|
+
/// @param g Green ×10000, range [0, 2550000]
|
|
106
|
+
/// @param b Blue ×10000, range [0, 2550000]
|
|
107
|
+
/// @returns Saturation in [0, 10000] (0 = grey, 10000 = fully saturated)
|
|
108
|
+
/// @example
|
|
109
|
+
/// let s: int = rgb_to_s(2550000, 0, 0) // result: 10000 (pure red is fully saturated)
|
|
68
110
|
fn rgb_to_s(r: int, g: int, b: int): int {
|
|
69
111
|
let mx: int = r;
|
|
70
112
|
if (g > mx) { mx = g; }
|
|
@@ -81,7 +123,14 @@ fn rgb_to_s(r: int, g: int, b: int): int {
|
|
|
81
123
|
return d * 10000 / (255 * denom);
|
|
82
124
|
}
|
|
83
125
|
|
|
84
|
-
|
|
126
|
+
/// Compute the HSL hue from RGB components (×10000 scale).
|
|
127
|
+
/// @since 1.0.0
|
|
128
|
+
/// @param r Red ×10000, range [0, 2550000]
|
|
129
|
+
/// @param g Green ×10000, range [0, 2550000]
|
|
130
|
+
/// @param b Blue ×10000, range [0, 2550000]
|
|
131
|
+
/// @returns Hue in [0, 3600000] (degrees × 10000; 0=red, 1200000=green, 2400000=blue)
|
|
132
|
+
/// @example
|
|
133
|
+
/// let h: int = rgb_to_h(0, 2550000, 0) // result: 1200000 (120°, pure green)
|
|
85
134
|
fn rgb_to_h(r: int, g: int, b: int): int {
|
|
86
135
|
let mx: int = r;
|
|
87
136
|
if (g > mx) { mx = g; }
|
|
@@ -120,7 +169,14 @@ fn _hsl10k_chroma(s: int, l: int): int {
|
|
|
120
169
|
return (10000 - abs2l1) * s / 10000;
|
|
121
170
|
}
|
|
122
171
|
|
|
123
|
-
|
|
172
|
+
/// Convert HSL to the red channel of RGB (×10000 scale).
|
|
173
|
+
/// @since 1.0.0
|
|
174
|
+
/// @param h Hue ×10000, range [0, 3600000]
|
|
175
|
+
/// @param s Saturation ×10000, range [0, 10000]
|
|
176
|
+
/// @param l Lightness ×10000, range [0, 10000]
|
|
177
|
+
/// @returns Red channel ×10000, range [0, 2550000]; divide by 10000 for 0-255
|
|
178
|
+
/// @example
|
|
179
|
+
/// let r: int = hsl_to_r(0, 10000, 5000) // pure red → 2550000
|
|
124
180
|
fn hsl_to_r(h: int, s: int, l: int): int {
|
|
125
181
|
let c: int = _hsl10k_chroma(s, l);
|
|
126
182
|
let x: int = _hsl10k_chroma_x(h, c);
|
|
@@ -134,7 +190,14 @@ fn hsl_to_r(h: int, s: int, l: int): int {
|
|
|
134
190
|
return (r1 + m) * 255;
|
|
135
191
|
}
|
|
136
192
|
|
|
137
|
-
|
|
193
|
+
/// Convert HSL to the green channel of RGB (×10000 scale).
|
|
194
|
+
/// @since 1.0.0
|
|
195
|
+
/// @param h Hue ×10000, range [0, 3600000]
|
|
196
|
+
/// @param s Saturation ×10000, range [0, 10000]
|
|
197
|
+
/// @param l Lightness ×10000, range [0, 10000]
|
|
198
|
+
/// @returns Green channel ×10000, range [0, 2550000]
|
|
199
|
+
/// @example
|
|
200
|
+
/// let g: int = hsl_to_g(1200000, 10000, 5000) // pure green → 2550000
|
|
138
201
|
fn hsl_to_g(h: int, s: int, l: int): int {
|
|
139
202
|
let c: int = _hsl10k_chroma(s, l);
|
|
140
203
|
let x: int = _hsl10k_chroma_x(h, c);
|
|
@@ -148,7 +211,14 @@ fn hsl_to_g(h: int, s: int, l: int): int {
|
|
|
148
211
|
return (g1 + m) * 255;
|
|
149
212
|
}
|
|
150
213
|
|
|
151
|
-
|
|
214
|
+
/// Convert HSL to the blue channel of RGB (×10000 scale).
|
|
215
|
+
/// @since 1.0.0
|
|
216
|
+
/// @param h Hue ×10000, range [0, 3600000]
|
|
217
|
+
/// @param s Saturation ×10000, range [0, 10000]
|
|
218
|
+
/// @param l Lightness ×10000, range [0, 10000]
|
|
219
|
+
/// @returns Blue channel ×10000, range [0, 2550000]
|
|
220
|
+
/// @example
|
|
221
|
+
/// let b: int = hsl_to_b(2400000, 10000, 5000) // pure blue → 2550000
|
|
152
222
|
fn hsl_to_b(h: int, s: int, l: int): int {
|
|
153
223
|
let c: int = _hsl10k_chroma(s, l);
|
|
154
224
|
let x: int = _hsl10k_chroma_x(h, c);
|
|
@@ -162,7 +232,14 @@ fn hsl_to_b(h: int, s: int, l: int): int {
|
|
|
162
232
|
return (b1 + m) * 255;
|
|
163
233
|
}
|
|
164
234
|
|
|
165
|
-
|
|
235
|
+
/// Convert HSL (×10000 scale) to a packed RGB integer (0xRRGGBB).
|
|
236
|
+
/// @since 1.0.0
|
|
237
|
+
/// @param h Hue ×10000, range [0, 3600000]
|
|
238
|
+
/// @param s Saturation ×10000, range [0, 10000]
|
|
239
|
+
/// @param l Lightness ×10000, range [0, 10000]
|
|
240
|
+
/// @returns Packed RGB integer (0xRRGGBB), each channel 0-255
|
|
241
|
+
/// @example
|
|
242
|
+
/// let col: int = hsl_to_packed(0, 10000, 5000) // pure red → 0xFF0000
|
|
166
243
|
fn hsl_to_packed(h: int, s: int, l: int): int {
|
|
167
244
|
let r: int = hsl_to_r(h, s, l) / 10000;
|
|
168
245
|
let g: int = hsl_to_g(h, s, l) / 10000;
|
|
@@ -172,9 +249,14 @@ fn hsl_to_packed(h: int, s: int, l: int): int {
|
|
|
172
249
|
|
|
173
250
|
// ─── rgb_to_hex ───────────────────────────────────────────────────────────────
|
|
174
251
|
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
252
|
+
/// Pack RGB into a 0xRRGGBB integer (alias for rgb_pack with explicit naming).
|
|
253
|
+
/// @since 1.0.0
|
|
254
|
+
/// @param r Red channel, range [0, 255]
|
|
255
|
+
/// @param g Green channel, range [0, 255]
|
|
256
|
+
/// @param b Blue channel, range [0, 255]
|
|
257
|
+
/// @returns r*65536 + g*256 + b (same as rgb_pack)
|
|
258
|
+
/// @example
|
|
259
|
+
/// let hex: int = rgb_to_hex(0, 128, 255) // result: 32895 (0x0080FF)
|
|
178
260
|
fn rgb_to_hex(r: int, g: int, b: int): int {
|
|
179
261
|
return r * 65536 + g * 256 + b;
|
|
180
262
|
}
|
package/src/stdlib/combat.mcrs
CHANGED
|
@@ -1,14 +1,25 @@
|
|
|
1
1
|
// module library
|
|
2
2
|
// Combat helpers for simple RPG-style datapacks.
|
|
3
3
|
|
|
4
|
-
|
|
4
|
+
/// Calculate total weapon damage from a base value plus a bonus.
|
|
5
|
+
/// @since 1.0.0
|
|
6
|
+
/// @param base Base weapon damage value
|
|
7
|
+
/// @param bonus Additional damage modifier (e.g. from enchantments or buffs)
|
|
8
|
+
/// @returns base + bonus
|
|
9
|
+
/// @example
|
|
10
|
+
/// let dmg: int = weapon_damage(10, 5) // result: 15
|
|
5
11
|
fn weapon_damage(base: int, bonus: int): int {
|
|
6
12
|
return base + bonus
|
|
7
13
|
}
|
|
8
14
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
15
|
+
/// Apply damage to a health value, clamping the result to a minimum of 0.
|
|
16
|
+
/// @since 1.0.0
|
|
17
|
+
/// @param health Current health value (e.g. from scoreboard)
|
|
18
|
+
/// @param amount Damage amount to subtract
|
|
19
|
+
/// @returns health - amount, clamped to 0; use scoreboard_set after calling
|
|
20
|
+
/// @example
|
|
21
|
+
/// let new_hp: int = take_damage(current_hp, 8)
|
|
22
|
+
/// scoreboard_set(@p, #health, new_hp)
|
|
12
23
|
fn take_damage(health: int, amount: int): int {
|
|
13
24
|
let next: int = health - amount
|
|
14
25
|
if (next < 0) {
|
|
@@ -17,7 +28,14 @@ fn take_damage(health: int, amount: int): int {
|
|
|
17
28
|
return next
|
|
18
29
|
}
|
|
19
30
|
|
|
20
|
-
|
|
31
|
+
/// Check whether an entity is dead (health at or below zero).
|
|
32
|
+
/// @since 1.0.0
|
|
33
|
+
/// @param health Current health value to test
|
|
34
|
+
/// @returns 1 if health <= 0 (dead), 0 otherwise (alive)
|
|
35
|
+
/// @example
|
|
36
|
+
/// if (is_dead(current_hp) == 1) {
|
|
37
|
+
/// // trigger death logic
|
|
38
|
+
/// }
|
|
21
39
|
fn is_dead(health: int): int {
|
|
22
40
|
if (health <= 0) {
|
|
23
41
|
return 1
|
package/src/stdlib/cooldown.mcrs
CHANGED
|
@@ -4,11 +4,24 @@
|
|
|
4
4
|
// that can route string literals through user-defined calls. Today this file
|
|
5
5
|
// manages one cooldown slot on the `rs` objective.
|
|
6
6
|
|
|
7
|
+
/// Start (or restart) a cooldown for the given slot.
|
|
8
|
+
/// The cooldown expires after `ticks` game ticks.
|
|
9
|
+
/// @since 1.2.0
|
|
10
|
+
/// @param name Cooldown slot identifier (reserved for future multi-slot support)
|
|
11
|
+
/// @param ticks Duration in game ticks (20 ticks = 1 second)
|
|
12
|
+
/// @example
|
|
13
|
+
/// cooldown_start("sword", 40); // 2-second cooldown
|
|
7
14
|
fn cooldown_start(name: string, ticks: int) {
|
|
8
15
|
scoreboard_set("cooldown_ticks", #rs, ticks);
|
|
9
16
|
scoreboard_set("cooldown_active", #rs, 1);
|
|
10
17
|
}
|
|
11
18
|
|
|
19
|
+
/// Check whether the cooldown has expired (i.e. is ready to fire again).
|
|
20
|
+
/// @since 1.2.0
|
|
21
|
+
/// @param name Cooldown slot identifier (reserved for future multi-slot support)
|
|
22
|
+
/// @returns 1 if the cooldown is ready (inactive or ticks remaining ≤ 0), 0 otherwise
|
|
23
|
+
/// @example
|
|
24
|
+
/// if (cooldown_ready("sword") == 1) { attack(); cooldown_start("sword", 40); }
|
|
12
25
|
fn cooldown_ready(name: string) -> int {
|
|
13
26
|
let active: int = scoreboard_get("cooldown_active", #rs);
|
|
14
27
|
let ticks_left: int = scoreboard_get("cooldown_ticks", #rs);
|
|
@@ -24,6 +37,12 @@ fn cooldown_ready(name: string) -> int {
|
|
|
24
37
|
return 0;
|
|
25
38
|
}
|
|
26
39
|
|
|
40
|
+
/// Advance the cooldown by one tick. Call this every tick from a `@tick` function.
|
|
41
|
+
/// Automatically marks the cooldown inactive when the remaining ticks reach zero.
|
|
42
|
+
/// @since 1.2.0
|
|
43
|
+
/// @param name Cooldown slot identifier (reserved for future multi-slot support)
|
|
44
|
+
/// @example
|
|
45
|
+
/// @tick fn game_tick() { cooldown_tick("sword"); }
|
|
27
46
|
fn cooldown_tick(name: string) {
|
|
28
47
|
let active: int = scoreboard_get("cooldown_active", #rs);
|
|
29
48
|
let ticks_left: int = scoreboard_get("cooldown_ticks", #rs);
|
package/src/stdlib/dialog.mcrs
CHANGED
|
@@ -6,18 +6,38 @@
|
|
|
6
6
|
|
|
7
7
|
module library
|
|
8
8
|
|
|
9
|
-
///
|
|
9
|
+
/// Sends a plain white chat message to a player or selector.
|
|
10
|
+
///
|
|
11
|
+
/// @since 1.0.0
|
|
12
|
+
/// @param p Recipient selector
|
|
13
|
+
/// @param msg Plain text message content
|
|
14
|
+
/// @example
|
|
15
|
+
/// dialog_say(@p, "Quest updated")
|
|
10
16
|
fn dialog_say(p: selector, msg: string) {
|
|
11
17
|
raw("tellraw {p} {\"text\":\"{msg}\"}");
|
|
12
18
|
}
|
|
13
19
|
|
|
14
|
-
///
|
|
20
|
+
/// Broadcasts a plain white chat message to all players.
|
|
21
|
+
///
|
|
22
|
+
/// @since 1.0.0
|
|
23
|
+
/// @param msg Plain text message content
|
|
24
|
+
/// @example
|
|
25
|
+
/// dialog_broadcast("Server restart in 60 seconds")
|
|
15
26
|
fn dialog_broadcast(msg: string) {
|
|
16
27
|
raw("tellraw @a {\"text\":\"{msg}\"}");
|
|
17
28
|
}
|
|
18
29
|
|
|
19
|
-
///
|
|
20
|
-
///
|
|
30
|
+
/// Sends a colored chat message to a player or selector.
|
|
31
|
+
///
|
|
32
|
+
/// Color mapping: `0=white`, `1=red`, `2=green`, `3=gold`, `4=aqua`.
|
|
33
|
+
/// Any other value falls back to white.
|
|
34
|
+
///
|
|
35
|
+
/// @since 1.0.0
|
|
36
|
+
/// @param p Recipient selector
|
|
37
|
+
/// @param msg Plain text message content
|
|
38
|
+
/// @param color Color selector integer (0=white, 1=red, 2=green, 3=gold, 4=aqua)
|
|
39
|
+
/// @example
|
|
40
|
+
/// dialog_say_color(@s, "You died!", 1)
|
|
21
41
|
fn dialog_say_color(p: selector, msg: string, color: int) {
|
|
22
42
|
if (color == 1) {
|
|
23
43
|
raw("tellraw {p} {\"text\":\"{msg}\",\"color\":\"red\"}");
|
|
@@ -38,18 +58,36 @@ fn dialog_say_color(p: selector, msg: string, color: int) {
|
|
|
38
58
|
}
|
|
39
59
|
}
|
|
40
60
|
|
|
41
|
-
///
|
|
61
|
+
/// Displays a title and subtitle on a player's screen.
|
|
62
|
+
///
|
|
63
|
+
/// @since 1.0.0
|
|
64
|
+
/// @param p Recipient selector
|
|
65
|
+
/// @param title Large title text
|
|
66
|
+
/// @param subtitle Subtitle text shown below the title
|
|
67
|
+
/// @example
|
|
68
|
+
/// dialog_title(@s, "Stage 2", "Defeat the boss")
|
|
42
69
|
fn dialog_title(p: selector, title: string, subtitle: string) {
|
|
43
70
|
raw("title {p} title {\"text\":\"{title}\"}");
|
|
44
71
|
raw("title {p} subtitle {\"text\":\"{subtitle}\"}");
|
|
45
72
|
}
|
|
46
73
|
|
|
47
|
-
///
|
|
74
|
+
/// Clears any currently displayed title for the target selector.
|
|
75
|
+
///
|
|
76
|
+
/// @since 1.0.0
|
|
77
|
+
/// @param p Recipient selector
|
|
78
|
+
/// @example
|
|
79
|
+
/// dialog_title_clear(@s)
|
|
48
80
|
fn dialog_title_clear(p: selector) {
|
|
49
81
|
raw("title {p} clear");
|
|
50
82
|
}
|
|
51
83
|
|
|
52
|
-
///
|
|
84
|
+
/// Displays a short message in the player's actionbar.
|
|
85
|
+
///
|
|
86
|
+
/// @since 1.0.0
|
|
87
|
+
/// @param p Recipient selector
|
|
88
|
+
/// @param msg Plain text message content
|
|
89
|
+
/// @example
|
|
90
|
+
/// dialog_actionbar(@s, "Mana: 80/100")
|
|
53
91
|
fn dialog_actionbar(p: selector, msg: string) {
|
|
54
92
|
raw("title {p} actionbar {\"text\":\"{msg}\"}");
|
|
55
93
|
}
|
package/src/stdlib/easing.mcrs
CHANGED
|
@@ -11,22 +11,43 @@ module library;
|
|
|
11
11
|
|
|
12
12
|
// ─── Linear ──────────────────────────────────────────────────────────────────
|
|
13
13
|
|
|
14
|
+
/// Linear easing — no acceleration or deceleration.
|
|
15
|
+
/// @since 1.0.0
|
|
16
|
+
/// @param t Progress ×10000, range [0, 10000]
|
|
17
|
+
/// @returns t (identity function)
|
|
18
|
+
/// @example
|
|
19
|
+
/// let v: int = ease_linear(5000) // result: 5000 (50%)
|
|
14
20
|
fn ease_linear(t: int): int { return t; }
|
|
15
21
|
|
|
16
22
|
// ─── Quadratic ───────────────────────────────────────────────────────────────
|
|
17
23
|
|
|
18
|
-
|
|
24
|
+
/// Quadratic ease-in — slow start, fast end.
|
|
25
|
+
/// @since 1.0.0
|
|
26
|
+
/// @param t Progress ×10000, range [0, 10000]
|
|
27
|
+
/// @returns t² / 10000
|
|
28
|
+
/// @example
|
|
29
|
+
/// let v: int = ease_in_quad(5000) // result: 2500 (25%)
|
|
19
30
|
fn ease_in_quad(t: int): int {
|
|
20
31
|
return t * t / 10000;
|
|
21
32
|
}
|
|
22
33
|
|
|
23
|
-
|
|
34
|
+
/// Quadratic ease-out — fast start, slow end.
|
|
35
|
+
/// @since 1.0.0
|
|
36
|
+
/// @param t Progress ×10000, range [0, 10000]
|
|
37
|
+
/// @returns 1 - (1-t)²
|
|
38
|
+
/// @example
|
|
39
|
+
/// let v: int = ease_out_quad(5000) // result: 7500 (75%)
|
|
24
40
|
fn ease_out_quad(t: int): int {
|
|
25
41
|
let inv: int = 10000 - t;
|
|
26
42
|
return 10000 - inv * inv / 10000;
|
|
27
43
|
}
|
|
28
44
|
|
|
29
|
-
|
|
45
|
+
/// Quadratic ease-in-out — slow start and end, fast middle.
|
|
46
|
+
/// @since 1.0.0
|
|
47
|
+
/// @param t Progress ×10000, range [0, 10000]
|
|
48
|
+
/// @returns 2t² for t < 0.5, else 1 - 2*(1-t)²
|
|
49
|
+
/// @example
|
|
50
|
+
/// let v: int = ease_in_out_quad(2500) // result: 1250 (12.5%)
|
|
30
51
|
fn ease_in_out_quad(t: int): int {
|
|
31
52
|
if (t < 5000) {
|
|
32
53
|
return 2 * t * t / 10000;
|
|
@@ -37,15 +58,33 @@ fn ease_in_out_quad(t: int): int {
|
|
|
37
58
|
|
|
38
59
|
// ─── Cubic ───────────────────────────────────────────────────────────────────
|
|
39
60
|
|
|
61
|
+
/// Cubic ease-in — slow start, accelerates to fast end (stronger than quadratic).
|
|
62
|
+
/// @since 1.0.0
|
|
63
|
+
/// @param t Progress ×10000, range [0, 10000]
|
|
64
|
+
/// @returns t³
|
|
65
|
+
/// @example
|
|
66
|
+
/// let v: int = ease_in_cubic(5000) // result: 1250 (12.5%)
|
|
40
67
|
fn ease_in_cubic(t: int): int {
|
|
41
68
|
return t * t / 10000 * t / 10000;
|
|
42
69
|
}
|
|
43
70
|
|
|
71
|
+
/// Cubic ease-out — fast start, decelerates to slow end.
|
|
72
|
+
/// @since 1.0.0
|
|
73
|
+
/// @param t Progress ×10000, range [0, 10000]
|
|
74
|
+
/// @returns 1 - (1-t)³
|
|
75
|
+
/// @example
|
|
76
|
+
/// let v: int = ease_out_cubic(5000) // result: 8750 (87.5%)
|
|
44
77
|
fn ease_out_cubic(t: int): int {
|
|
45
78
|
let inv: int = 10000 - t;
|
|
46
79
|
return 10000 - inv * inv / 10000 * inv / 10000;
|
|
47
80
|
}
|
|
48
81
|
|
|
82
|
+
/// Cubic ease-in-out — slow start and end, fast middle (stronger than quadratic).
|
|
83
|
+
/// @since 1.0.0
|
|
84
|
+
/// @param t Progress ×10000, range [0, 10000]
|
|
85
|
+
/// @returns 4t³ for t < 0.5, else 1 - 4*(1-t)³
|
|
86
|
+
/// @example
|
|
87
|
+
/// let v: int = ease_in_out_cubic(5000) // result: 5000 (50%)
|
|
49
88
|
fn ease_in_out_cubic(t: int): int {
|
|
50
89
|
if (t < 5000) {
|
|
51
90
|
return 4 * t * t / 10000 * t / 10000;
|
|
@@ -56,11 +95,23 @@ fn ease_in_out_cubic(t: int): int {
|
|
|
56
95
|
|
|
57
96
|
// ─── Quartic ──────────────────────────────────────────────────────────────────
|
|
58
97
|
|
|
98
|
+
/// Quartic ease-in — very slow start, very fast end (t⁴).
|
|
99
|
+
/// @since 1.0.0
|
|
100
|
+
/// @param t Progress ×10000, range [0, 10000]
|
|
101
|
+
/// @returns t⁴
|
|
102
|
+
/// @example
|
|
103
|
+
/// let v: int = ease_in_quart(5000) // result: 625 (6.25%)
|
|
59
104
|
fn ease_in_quart(t: int): int {
|
|
60
105
|
let t2: int = t * t / 10000;
|
|
61
106
|
return t2 * t2 / 10000;
|
|
62
107
|
}
|
|
63
108
|
|
|
109
|
+
/// Quartic ease-out — very fast start, very slow end (1 - (1-t)⁴).
|
|
110
|
+
/// @since 1.0.0
|
|
111
|
+
/// @param t Progress ×10000, range [0, 10000]
|
|
112
|
+
/// @returns 1 - (1-t)⁴
|
|
113
|
+
/// @example
|
|
114
|
+
/// let v: int = ease_out_quart(5000) // result: 9375 (93.75%)
|
|
64
115
|
fn ease_out_quart(t: int): int {
|
|
65
116
|
let inv: int = 10000 - t;
|
|
66
117
|
let inv2: int = inv * inv / 10000;
|
|
@@ -70,7 +121,12 @@ fn ease_out_quart(t: int): int {
|
|
|
70
121
|
// ─── Sine approximation ───────────────────────────────────────────────────────
|
|
71
122
|
// Approximated using polynomial — no actual trig needed for easing
|
|
72
123
|
|
|
73
|
-
|
|
124
|
+
/// Sinusoidal ease-in — starts slow, accelerates (approximated with polynomial).
|
|
125
|
+
/// @since 1.0.0
|
|
126
|
+
/// @param t Progress ×10000, range [0, 10000]
|
|
127
|
+
/// @returns Approximate 1 - cos(t*π/2)
|
|
128
|
+
/// @example
|
|
129
|
+
/// let v: int = ease_in_sine(5000) // ≈ 2929 (sin curve at 50%)
|
|
74
130
|
fn ease_in_sine(t: int): int {
|
|
75
131
|
// ≈ 1 - cos(t*π/2) using polynomial: 1 - (1 - t²/2 + t⁴/24)
|
|
76
132
|
let t2: int = t * t / 10000;
|
|
@@ -79,10 +135,22 @@ fn ease_in_sine(t: int): int {
|
|
|
79
135
|
return 10000 - cos_approx;
|
|
80
136
|
}
|
|
81
137
|
|
|
138
|
+
/// Sinusoidal ease-out — fast start, decelerates gently (approximated).
|
|
139
|
+
/// @since 1.0.0
|
|
140
|
+
/// @param t Progress ×10000, range [0, 10000]
|
|
141
|
+
/// @returns Approximate sin(t*π/2)
|
|
142
|
+
/// @example
|
|
143
|
+
/// let v: int = ease_out_sine(5000) // ≈ 7071
|
|
82
144
|
fn ease_out_sine(t: int): int {
|
|
83
145
|
return 10000 - ease_in_sine(10000 - t);
|
|
84
146
|
}
|
|
85
147
|
|
|
148
|
+
/// Sinusoidal ease-in-out — smooth start and end via sine wave.
|
|
149
|
+
/// @since 1.0.0
|
|
150
|
+
/// @param t Progress ×10000, range [0, 10000]
|
|
151
|
+
/// @returns Approximate -(cos(π*t) - 1) / 2
|
|
152
|
+
/// @example
|
|
153
|
+
/// let v: int = ease_in_out_sine(5000) // result: 5000 (symmetrical)
|
|
86
154
|
fn ease_in_out_sine(t: int): int {
|
|
87
155
|
if (t < 5000) {
|
|
88
156
|
return ease_in_sine(t * 2) / 2;
|
|
@@ -92,7 +160,12 @@ fn ease_in_out_sine(t: int): int {
|
|
|
92
160
|
|
|
93
161
|
// ─── Exponential ─────────────────────────────────────────────────────────────
|
|
94
162
|
|
|
95
|
-
|
|
163
|
+
/// Exponential ease-in — nearly zero at start, explosive at end.
|
|
164
|
+
/// @since 1.0.0
|
|
165
|
+
/// @param t Progress ×10000, range [0, 10000]
|
|
166
|
+
/// @returns Approximate 2^(10t-10) (uses cubic proxy)
|
|
167
|
+
/// @example
|
|
168
|
+
/// let v: int = ease_in_expo(8000) // very small until close to the end
|
|
96
169
|
fn ease_in_expo(t: int): int {
|
|
97
170
|
if (t <= 0) { return 0; }
|
|
98
171
|
// Approximate 2^(10t-10) ≈ exp_fx((10*t-100000)*693/10000)
|
|
@@ -101,6 +174,12 @@ fn ease_in_expo(t: int): int {
|
|
|
101
174
|
return t3;
|
|
102
175
|
}
|
|
103
176
|
|
|
177
|
+
/// Exponential ease-out — explosive start, slows to near-zero at end.
|
|
178
|
+
/// @since 1.0.0
|
|
179
|
+
/// @param t Progress ×10000, range [0, 10000]
|
|
180
|
+
/// @returns 1 - ease_in_expo(1 - t)
|
|
181
|
+
/// @example
|
|
182
|
+
/// let v: int = ease_out_expo(2000) // large value even early
|
|
104
183
|
fn ease_out_expo(t: int): int {
|
|
105
184
|
if (t >= 10000) { return 10000; }
|
|
106
185
|
return 10000 - ease_in_expo(10000 - t);
|
|
@@ -108,8 +187,12 @@ fn ease_out_expo(t: int): int {
|
|
|
108
187
|
|
|
109
188
|
// ─── Back (overshoot) ─────────────────────────────────────────────────────────
|
|
110
189
|
|
|
111
|
-
|
|
112
|
-
|
|
190
|
+
/// Back ease-in — slight pullback before accelerating forward (overshoot anticipation).
|
|
191
|
+
/// @since 1.0.0
|
|
192
|
+
/// @param t Progress ×10000, range [0, 10000]
|
|
193
|
+
/// @returns t³*(c3) - t²*(c1) where c1 ≈ 1.70158 (may briefly go below 0)
|
|
194
|
+
/// @example
|
|
195
|
+
/// let v: int = ease_in_back(2000) // negative briefly, then rises
|
|
113
196
|
fn ease_in_back(t: int): int {
|
|
114
197
|
let c1: int = 17015; // 1.70158
|
|
115
198
|
let c3: int = c1 + 10000; // c1 + 1
|
|
@@ -119,10 +202,22 @@ fn ease_in_back(t: int): int {
|
|
|
119
202
|
return t3 * c3 / 10000 - t2 * c1 / 10000;
|
|
120
203
|
}
|
|
121
204
|
|
|
205
|
+
/// Back ease-out — overshoots target then settles back.
|
|
206
|
+
/// @since 1.0.0
|
|
207
|
+
/// @param t Progress ×10000, range [0, 10000]
|
|
208
|
+
/// @returns Mirrored ease_in_back (may briefly exceed 10000)
|
|
209
|
+
/// @example
|
|
210
|
+
/// let v: int = ease_out_back(8000) // overshoots near the end
|
|
122
211
|
fn ease_out_back(t: int): int {
|
|
123
212
|
return 10000 - ease_in_back(10000 - t);
|
|
124
213
|
}
|
|
125
214
|
|
|
215
|
+
/// Back ease-in-out — pullback on entry, overshoot on exit.
|
|
216
|
+
/// @since 1.0.0
|
|
217
|
+
/// @param t Progress ×10000, range [0, 10000]
|
|
218
|
+
/// @returns Combined back ease, symmetric around t=5000
|
|
219
|
+
/// @example
|
|
220
|
+
/// let v: int = ease_in_out_back(5000) // result: 5000 (midpoint)
|
|
126
221
|
fn ease_in_out_back(t: int): int {
|
|
127
222
|
if (t < 5000) {
|
|
128
223
|
return ease_in_back(t * 2) / 2;
|
|
@@ -132,7 +227,12 @@ fn ease_in_out_back(t: int): int {
|
|
|
132
227
|
|
|
133
228
|
// ─── Bounce ───────────────────────────────────────────────────────────────────
|
|
134
229
|
|
|
135
|
-
|
|
230
|
+
/// Bounce ease-out — simulates a ball dropping and bouncing at the end.
|
|
231
|
+
/// @since 1.0.0
|
|
232
|
+
/// @param t Progress ×10000, range [0, 10000]
|
|
233
|
+
/// @returns Piecewise bounce curve, always in [0, 10000]
|
|
234
|
+
/// @example
|
|
235
|
+
/// let v: int = ease_out_bounce(8000) // bouncing near the end
|
|
136
236
|
fn ease_out_bounce(t: int): int {
|
|
137
237
|
let n1: int = 75625; // 7.5625 × 10000
|
|
138
238
|
let d1: int = 27500; // 2.75 × 10000
|
|
@@ -152,10 +252,22 @@ fn ease_out_bounce(t: int): int {
|
|
|
152
252
|
return n1 * t2 / 10000 * t2 / 10000 + 9844;
|
|
153
253
|
}
|
|
154
254
|
|
|
255
|
+
/// Bounce ease-in — bounces at the start before settling into forward motion.
|
|
256
|
+
/// @since 1.0.0
|
|
257
|
+
/// @param t Progress ×10000, range [0, 10000]
|
|
258
|
+
/// @returns Mirrored ease_out_bounce
|
|
259
|
+
/// @example
|
|
260
|
+
/// let v: int = ease_in_bounce(2000) // bouncing at the start
|
|
155
261
|
fn ease_in_bounce(t: int): int {
|
|
156
262
|
return 10000 - ease_out_bounce(10000 - t);
|
|
157
263
|
}
|
|
158
264
|
|
|
265
|
+
/// Bounce ease-in-out — bounce on both entry and exit.
|
|
266
|
+
/// @since 1.0.0
|
|
267
|
+
/// @param t Progress ×10000, range [0, 10000]
|
|
268
|
+
/// @returns Symmetric bounce easing
|
|
269
|
+
/// @example
|
|
270
|
+
/// let v: int = ease_in_out_bounce(5000) // result: 5000 (midpoint)
|
|
159
271
|
fn ease_in_out_bounce(t: int): int {
|
|
160
272
|
if (t < 5000) {
|
|
161
273
|
return ease_in_bounce(t * 2) / 2;
|
|
@@ -165,14 +277,22 @@ fn ease_in_out_bounce(t: int): int {
|
|
|
165
277
|
|
|
166
278
|
// ─── Smoothstep family ────────────────────────────────────────────────────────
|
|
167
279
|
|
|
168
|
-
|
|
169
|
-
|
|
280
|
+
/// Smoothstep easing — cubic Hermite curve (3t² - 2t³), smooth start and end.
|
|
281
|
+
/// @since 1.0.0
|
|
282
|
+
/// @param t Progress ×10000, range [0, 10000]
|
|
283
|
+
/// @returns 3t² - 2t³ (Ken Perlin's smooth interpolation)
|
|
284
|
+
/// @example
|
|
285
|
+
/// let v: int = ease_smooth(5000) // result: 5000 (symmetric)
|
|
170
286
|
fn ease_smooth(t: int): int {
|
|
171
287
|
return 3 * t * t / 10000 - 2 * t * t / 10000 * t / 10000;
|
|
172
288
|
}
|
|
173
289
|
|
|
174
|
-
|
|
175
|
-
|
|
290
|
+
/// Smootherstep easing — quintic curve (6t⁵ - 15t⁴ + 10t³), zero first and second derivatives at endpoints.
|
|
291
|
+
/// @since 1.0.0
|
|
292
|
+
/// @param t Progress ×10000, range [0, 10000]
|
|
293
|
+
/// @returns 6t⁵ - 15t⁴ + 10t³ (Ken Perlin's improved noise smoothstep)
|
|
294
|
+
/// @example
|
|
295
|
+
/// let v: int = ease_smoother(5000) // result: 5000 (symmetric)
|
|
176
296
|
fn ease_smoother(t: int): int {
|
|
177
297
|
let t2: int = t * t / 10000;
|
|
178
298
|
let t3: int = t2 * t / 10000;
|