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/physics.mcrs
CHANGED
|
@@ -11,69 +11,134 @@ module library;
|
|
|
11
11
|
|
|
12
12
|
// ─── Constants ───────────────────────────────────────────────────────────────
|
|
13
13
|
|
|
14
|
+
/// Minecraft gravity constant in fixed-point units (0.08 blocks/tick² × 100 = 8).
|
|
15
|
+
/// @since 1.0.0
|
|
16
|
+
/// @returns 8 (gravity acceleration per tick in ×100 units)
|
|
14
17
|
fn gravity_fx(): int { return 8; } // 0.08 blocks/tick² × 100
|
|
18
|
+
|
|
19
|
+
/// Air drag factor in ×10000 scale (0.98 per tick).
|
|
20
|
+
/// @since 1.0.0
|
|
21
|
+
/// @returns 9800 (multiply velocity by this / 10000 each tick)
|
|
15
22
|
fn air_drag_fx(): int { return 9800; } // 0.98 drag factor × 10000 (per tick)
|
|
23
|
+
|
|
24
|
+
/// Water drag factor in ×10000 scale (0.80 per tick, stronger than air).
|
|
25
|
+
/// @since 1.0.0
|
|
26
|
+
/// @returns 8000 (multiply velocity by this / 10000 each tick while in water)
|
|
16
27
|
fn water_drag_fx(): int { return 8000; } // 0.80 drag (in water)
|
|
17
28
|
|
|
18
29
|
// ─── Projectile motion ────────────────────────────────────────────────────────
|
|
19
30
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
31
|
+
/// Compute Y position of a projectile after t ticks (no drag, constant gravity).
|
|
32
|
+
/// @since 1.0.0
|
|
33
|
+
/// @param p0 Initial Y position ×100 (blocks × 100)
|
|
34
|
+
/// @param v0 Initial Y velocity ×100 (blocks/tick × 100)
|
|
35
|
+
/// @param t Time in ticks
|
|
36
|
+
/// @returns Y position at tick t: p0 + v0*t - gravity*t²/2
|
|
37
|
+
/// @example
|
|
38
|
+
/// let y: int = projectile_y(0, 200, 5) // height after 5 ticks, launched at 2 blocks/tick
|
|
23
39
|
fn projectile_y(p0: int, v0: int, t: int): int {
|
|
24
40
|
return p0 + v0 * t - gravity_fx() * t * t / 2;
|
|
25
41
|
}
|
|
26
42
|
|
|
43
|
+
/// Compute horizontal X position of a projectile after t ticks (constant velocity, no drag).
|
|
44
|
+
/// @since 1.0.0
|
|
45
|
+
/// @param p0 Initial X position ×100
|
|
46
|
+
/// @param v0 Horizontal X velocity ×100
|
|
47
|
+
/// @param t Time in ticks
|
|
48
|
+
/// @returns X position at tick t: p0 + v0*t
|
|
49
|
+
/// @example
|
|
50
|
+
/// let x: int = projectile_x(0, 100, 10) // 10 blocks/tick for 10 ticks = 1000 units
|
|
27
51
|
fn projectile_x(p0: int, v0: int, t: int): int {
|
|
28
52
|
return p0 + v0 * t;
|
|
29
53
|
}
|
|
30
54
|
|
|
31
|
-
|
|
55
|
+
/// Compute Y velocity of a projectile after t ticks (accounting for gravity).
|
|
56
|
+
/// @since 1.0.0
|
|
57
|
+
/// @param v0 Initial Y velocity ×100
|
|
58
|
+
/// @param t Time in ticks
|
|
59
|
+
/// @returns v0 - gravity*t
|
|
60
|
+
/// @example
|
|
61
|
+
/// let vy: int = projectile_vy(200, 5) // velocity after 5 ticks
|
|
32
62
|
fn projectile_vy(v0: int, t: int): int {
|
|
33
63
|
return v0 - gravity_fx() * t;
|
|
34
64
|
}
|
|
35
65
|
|
|
36
|
-
|
|
37
|
-
|
|
66
|
+
/// Estimate the tick at which a projectile launched upward returns to Y=0.
|
|
67
|
+
/// @since 1.0.0
|
|
68
|
+
/// @param v0y Initial upward Y velocity ×100 (must be positive)
|
|
69
|
+
/// @returns 2*v0y / gravity; returns 0 if v0y <= 0
|
|
70
|
+
/// @example
|
|
71
|
+
/// let land_t: int = projectile_land_t(160) // ticks until landing
|
|
38
72
|
fn projectile_land_t(v0y: int): int {
|
|
39
73
|
if (v0y <= 0) { return 0; }
|
|
40
74
|
return 2 * v0y / gravity_fx();
|
|
41
75
|
}
|
|
42
76
|
|
|
43
|
-
|
|
44
|
-
|
|
77
|
+
/// Compute the maximum height reached by a projectile launched upward.
|
|
78
|
+
/// @since 1.0.0
|
|
79
|
+
/// @param v0y Initial upward Y velocity ×100
|
|
80
|
+
/// @returns v0y² / (2*gravity) in ×100 units
|
|
81
|
+
/// @example
|
|
82
|
+
/// let max_h: int = projectile_max_height(160) // peak height in units×100
|
|
45
83
|
fn projectile_max_height(v0y: int): int {
|
|
46
84
|
return v0y * v0y / (2 * gravity_fx());
|
|
47
85
|
}
|
|
48
86
|
|
|
49
87
|
// ─── Velocity with drag ───────────────────────────────────────────────────────
|
|
50
88
|
|
|
51
|
-
|
|
52
|
-
|
|
89
|
+
/// Apply a drag factor to a velocity (one tick of drag).
|
|
90
|
+
/// @since 1.0.0
|
|
91
|
+
/// @param v_fx Velocity ×100
|
|
92
|
+
/// @param drag_fx Drag factor ×10000 (9800 for air, 8000 for water)
|
|
93
|
+
/// @returns v_fx * drag_fx / 10000
|
|
94
|
+
/// @example
|
|
95
|
+
/// let v: int = apply_drag(500, air_drag_fx()) // 500 * 0.98 = 490
|
|
53
96
|
fn apply_drag(v_fx: int, drag_fx: int): int {
|
|
54
97
|
return v_fx * drag_fx / 10000;
|
|
55
98
|
}
|
|
56
99
|
|
|
57
|
-
|
|
100
|
+
/// Apply one tick of gravity to a Y velocity component.
|
|
101
|
+
/// @since 1.0.0
|
|
102
|
+
/// @param vy_fx Current Y velocity ×100
|
|
103
|
+
/// @returns vy_fx - gravity_fx()
|
|
104
|
+
/// @example
|
|
105
|
+
/// vy = apply_gravity(vy) // call each tick in your physics loop
|
|
58
106
|
fn apply_gravity(vy_fx: int): int {
|
|
59
107
|
return vy_fx - gravity_fx();
|
|
60
108
|
}
|
|
61
109
|
|
|
62
|
-
|
|
110
|
+
/// Update a position component by one tick of velocity.
|
|
111
|
+
/// @since 1.0.0
|
|
112
|
+
/// @param p_fx Current position ×100
|
|
113
|
+
/// @param v_fx Velocity ×100
|
|
114
|
+
/// @returns p_fx + v_fx
|
|
115
|
+
/// @example
|
|
116
|
+
/// px = update_pos(px, vx) // advance X each tick
|
|
63
117
|
fn update_pos(p_fx: int, v_fx: int): int {
|
|
64
118
|
return p_fx + v_fx;
|
|
65
119
|
}
|
|
66
120
|
|
|
67
121
|
// ─── Collision / bounce ───────────────────────────────────────────────────────
|
|
68
122
|
|
|
69
|
-
|
|
70
|
-
|
|
123
|
+
/// Reflect a velocity component with energy loss (bounce).
|
|
124
|
+
/// @since 1.0.0
|
|
125
|
+
/// @param v_fx Velocity ×100 to reflect
|
|
126
|
+
/// @param restitution_fx Energy retention ×10000 (10000=elastic, 5000=half, 0=inelastic)
|
|
127
|
+
/// @returns Negated and scaled velocity: -v_fx * restitution / 10000
|
|
128
|
+
/// @example
|
|
129
|
+
/// vy = bounce_v(vy, 7000) // 70% energy retained on bounce
|
|
71
130
|
fn bounce_v(v_fx: int, restitution_fx: int): int {
|
|
72
131
|
let neg: int = 0 - v_fx;
|
|
73
132
|
return neg * restitution_fx / 10000;
|
|
74
133
|
}
|
|
75
134
|
|
|
76
|
-
|
|
135
|
+
/// Clamp a velocity component to a maximum absolute speed.
|
|
136
|
+
/// @since 1.0.0
|
|
137
|
+
/// @param v_fx Velocity ×100 to clamp
|
|
138
|
+
/// @param max_fx Maximum absolute velocity ×100 (terminal velocity)
|
|
139
|
+
/// @returns v_fx clamped to [-max_fx, max_fx]
|
|
140
|
+
/// @example
|
|
141
|
+
/// vx = clamp_velocity(vx, 500) // cap horizontal speed at 5 blocks/tick
|
|
77
142
|
fn clamp_velocity(v_fx: int, max_fx: int): int {
|
|
78
143
|
if (v_fx > max_fx) { return max_fx; }
|
|
79
144
|
if (v_fx < 0 - max_fx) { return 0 - max_fx; }
|
|
@@ -82,14 +147,28 @@ fn clamp_velocity(v_fx: int, max_fx: int): int {
|
|
|
82
147
|
|
|
83
148
|
// ─── Spring physics ───────────────────────────────────────────────────────────
|
|
84
149
|
|
|
85
|
-
|
|
86
|
-
|
|
150
|
+
/// Compute spring force toward a target position (Hooke's law: F = -k*(x - target)).
|
|
151
|
+
/// @since 1.0.0
|
|
152
|
+
/// @param pos_fx Current position ×100
|
|
153
|
+
/// @param target_fx Rest/target position ×100
|
|
154
|
+
/// @param k_fx Spring constant ×10000 (higher = stiffer spring)
|
|
155
|
+
/// @returns (target - pos) * k / 10000
|
|
156
|
+
/// @example
|
|
157
|
+
/// let f: int = spring_force(pos, 500, 2000) // spring toward position 500 with k=0.2
|
|
87
158
|
fn spring_force(pos_fx: int, target_fx: int, k_fx: int): int {
|
|
88
159
|
return (target_fx - pos_fx) * k_fx / 10000;
|
|
89
160
|
}
|
|
90
161
|
|
|
91
|
-
|
|
92
|
-
|
|
162
|
+
/// Update velocity with spring force and damping (one tick).
|
|
163
|
+
/// @since 1.0.0
|
|
164
|
+
/// @param v_fx Current velocity ×100
|
|
165
|
+
/// @param pos_fx Current position ×100
|
|
166
|
+
/// @param target_fx Spring rest position ×100
|
|
167
|
+
/// @param k_fx Spring constant ×10000
|
|
168
|
+
/// @param damping_fx Damping factor ×10000 (10000=no damping, 8000=some damping)
|
|
169
|
+
/// @returns New velocity after applying spring force and damping
|
|
170
|
+
/// @example
|
|
171
|
+
/// vx = spring_update_v(vx, px, target_px, 1000, 9000)
|
|
93
172
|
fn spring_update_v(v_fx: int, pos_fx: int, target_fx: int, k_fx: int, damping_fx: int): int {
|
|
94
173
|
let force: int = spring_force(pos_fx, target_fx, k_fx);
|
|
95
174
|
let damped: int = v_fx * damping_fx / 10000;
|
|
@@ -98,20 +177,39 @@ fn spring_update_v(v_fx: int, pos_fx: int, target_fx: int, k_fx: int, damping_fx
|
|
|
98
177
|
|
|
99
178
|
// ─── Circular motion ─────────────────────────────────────────────────────────
|
|
100
179
|
|
|
101
|
-
|
|
102
|
-
|
|
180
|
+
/// Compute X position on a circle given center, radius, and angle.
|
|
181
|
+
/// @since 1.0.0
|
|
182
|
+
/// @param cx Circle center X ×100
|
|
183
|
+
/// @param r Radius ×100
|
|
184
|
+
/// @param angle_deg Angle in whole degrees (NOT ×10000)
|
|
185
|
+
/// @returns cx + r * cos(angle_deg) / 1000
|
|
186
|
+
/// @example
|
|
187
|
+
/// let x: int = circular_x(500, 200, 45) // point at 45° on radius-2 circle
|
|
103
188
|
fn circular_x(cx: int, r: int, angle_deg: int): int {
|
|
104
189
|
return cx + r * cos_fixed(angle_deg) / 1000;
|
|
105
190
|
}
|
|
106
191
|
|
|
192
|
+
/// Compute Z position on a circle given center, radius, and angle.
|
|
193
|
+
/// @since 1.0.0
|
|
194
|
+
/// @param cz Circle center Z ×100
|
|
195
|
+
/// @param r Radius ×100
|
|
196
|
+
/// @param angle_deg Angle in whole degrees (NOT ×10000)
|
|
197
|
+
/// @returns cz + r * sin(angle_deg) / 1000
|
|
198
|
+
/// @example
|
|
199
|
+
/// let z: int = circular_z(500, 200, 45)
|
|
107
200
|
fn circular_z(cz: int, r: int, angle_deg: int): int {
|
|
108
201
|
return cz + r * sin_fixed(angle_deg) / 1000;
|
|
109
202
|
}
|
|
110
203
|
|
|
111
204
|
// ─── Friction ────────────────────────────────────────────────────────────────
|
|
112
205
|
|
|
113
|
-
|
|
114
|
-
|
|
206
|
+
/// Apply friction to reduce a velocity component toward zero.
|
|
207
|
+
/// @since 1.0.0
|
|
208
|
+
/// @param v_fx Current velocity ×100
|
|
209
|
+
/// @param friction_fx Friction deceleration per tick ×100 (absolute amount subtracted)
|
|
210
|
+
/// @returns Velocity reduced toward 0 by friction; stops at 0 rather than reversing
|
|
211
|
+
/// @example
|
|
212
|
+
/// vx = friction_decel(vx, 10) // slow down by 0.1 blocks/tick per tick
|
|
115
213
|
fn friction_decel(v_fx: int, friction_fx: int): int {
|
|
116
214
|
if (v_fx > friction_fx) { return v_fx - friction_fx; }
|
|
117
215
|
if (v_fx < 0 - friction_fx) { return v_fx + friction_fx; }
|
|
@@ -120,14 +218,24 @@ fn friction_decel(v_fx: int, friction_fx: int): int {
|
|
|
120
218
|
|
|
121
219
|
// ─── Impact detection ────────────────────────────────────────────────────────
|
|
122
220
|
|
|
123
|
-
|
|
221
|
+
/// Check whether a position has reached or fallen below the ground level.
|
|
222
|
+
/// @since 1.0.0
|
|
223
|
+
/// @param y_fx Current Y position ×100
|
|
224
|
+
/// @param ground_y_fx Ground Y level ×100
|
|
225
|
+
/// @returns 1 if y_fx <= ground_y_fx (grounded), 0 otherwise
|
|
226
|
+
/// @example
|
|
227
|
+
/// if (is_grounded(py, 0) == 1) { py = 0; vy = bounce_v(vy, 7000); }
|
|
124
228
|
fn is_grounded(y_fx: int, ground_y_fx: int): int {
|
|
125
229
|
if (y_fx <= ground_y_fx) { return 1; }
|
|
126
230
|
return 0;
|
|
127
231
|
}
|
|
128
232
|
|
|
129
|
-
|
|
130
|
-
|
|
233
|
+
/// Estimate the impact velocity after falling from a given height.
|
|
234
|
+
/// @since 1.0.0
|
|
235
|
+
/// @param h_fx Fall height ×100 (blocks × 100, must be positive)
|
|
236
|
+
/// @returns Approximate impact speed ×100 via integer square root of 2*g*h
|
|
237
|
+
/// @example
|
|
238
|
+
/// let impact_v: int = impact_velocity(400) // falling from 4 blocks
|
|
131
239
|
fn impact_velocity(h_fx: int): int {
|
|
132
240
|
if (h_fx <= 0) { return 0; }
|
|
133
241
|
return isqrt(2 * gravity_fx() * h_fx / 100) * 10;
|
package/src/stdlib/player.mcrs
CHANGED
|
@@ -1,12 +1,24 @@
|
|
|
1
1
|
// Player helpers built on scoreboard/tag patterns.
|
|
2
2
|
// These helpers target the nearest player via @p.
|
|
3
3
|
|
|
4
|
+
/// Heal the nearest player by adding `amount` to their #health scoreboard.
|
|
5
|
+
/// @since 1.0.0
|
|
6
|
+
/// @param amount Number of health points to restore (positive integer)
|
|
7
|
+
/// @returns void — modifies the #health scoreboard objective of @p
|
|
8
|
+
/// @example
|
|
9
|
+
/// heal(10) // restore 10 HP to nearest player
|
|
4
10
|
fn heal(amount: int) {
|
|
5
11
|
let health: int = scoreboard_get(@p, #health);
|
|
6
12
|
let next: int = health + amount;
|
|
7
13
|
scoreboard_set(@p, #health, next);
|
|
8
14
|
}
|
|
9
15
|
|
|
16
|
+
/// Deal damage to the nearest player, clamping health to a minimum of 0.
|
|
17
|
+
/// @since 1.0.0
|
|
18
|
+
/// @param amount Number of damage points to apply (positive integer)
|
|
19
|
+
/// @returns void — modifies the #health scoreboard objective of @p; will not go below 0
|
|
20
|
+
/// @example
|
|
21
|
+
/// damage(5) // deal 5 damage to nearest player
|
|
10
22
|
fn damage(amount: int) {
|
|
11
23
|
let health: int = scoreboard_get(@p, #health);
|
|
12
24
|
let next: int = health - amount;
|
|
@@ -18,6 +30,12 @@ fn damage(amount: int) {
|
|
|
18
30
|
}
|
|
19
31
|
}
|
|
20
32
|
|
|
33
|
+
/// Check whether the nearest player has the `op` tag (operator status).
|
|
34
|
+
/// @since 1.0.0
|
|
35
|
+
/// @returns 1 if @p has the `op` entity tag, 0 otherwise
|
|
36
|
+
/// @example
|
|
37
|
+
/// let admin: int = is_op()
|
|
38
|
+
/// // if (admin == 1) { ... }
|
|
21
39
|
fn is_op() -> int {
|
|
22
40
|
let result: int = 0;
|
|
23
41
|
|
|
@@ -14,69 +14,211 @@ module library;
|
|
|
14
14
|
|
|
15
15
|
// ─── Constructors ─────────────────────────────────────────────────────────────
|
|
16
16
|
|
|
17
|
-
|
|
17
|
+
/// W component of the identity quaternion `(0, 0, 0, 1)`.
|
|
18
|
+
///
|
|
19
|
+
/// @since 2.0.0
|
|
20
|
+
/// @returns `10000`
|
|
18
21
|
fn quat_identity_w(): int { return 10000; }
|
|
22
|
+
|
|
23
|
+
/// X component of the identity quaternion.
|
|
24
|
+
///
|
|
25
|
+
/// @since 2.0.0
|
|
26
|
+
/// @returns `0`
|
|
19
27
|
fn quat_identity_x(): int { return 0; }
|
|
28
|
+
|
|
29
|
+
/// Y component of the identity quaternion.
|
|
30
|
+
///
|
|
31
|
+
/// @since 2.0.0
|
|
32
|
+
/// @returns `0`
|
|
20
33
|
fn quat_identity_y(): int { return 0; }
|
|
34
|
+
|
|
35
|
+
/// Z component of the identity quaternion.
|
|
36
|
+
///
|
|
37
|
+
/// @since 2.0.0
|
|
38
|
+
/// @returns `0`
|
|
21
39
|
fn quat_identity_z(): int { return 0; }
|
|
22
40
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
41
|
+
/// X component of a quaternion representing rotation by `angle_deg` around the X axis.
|
|
42
|
+
///
|
|
43
|
+
/// @since 2.0.0
|
|
44
|
+
/// @param angle_deg Rotation angle in degrees (integer)
|
|
45
|
+
/// @returns `sin(angle/2)` ×10000
|
|
26
46
|
fn quat_axis_x_x(angle_deg: int): int { return sin_fixed(angle_deg / 2) * 10; }
|
|
47
|
+
|
|
48
|
+
/// Y component of a quaternion representing rotation by `angle_deg` around the X axis.
|
|
49
|
+
///
|
|
50
|
+
/// @since 2.0.0
|
|
51
|
+
/// @param angle_deg Rotation angle in degrees
|
|
52
|
+
/// @returns `0`
|
|
27
53
|
fn quat_axis_x_y(angle_deg: int): int { return 0; }
|
|
54
|
+
|
|
55
|
+
/// Z component of a quaternion representing rotation by `angle_deg` around the X axis.
|
|
56
|
+
///
|
|
57
|
+
/// @since 2.0.0
|
|
58
|
+
/// @param angle_deg Rotation angle in degrees
|
|
59
|
+
/// @returns `0`
|
|
28
60
|
fn quat_axis_x_z(angle_deg: int): int { return 0; }
|
|
61
|
+
|
|
62
|
+
/// W component of a quaternion representing rotation by `angle_deg` around the X axis.
|
|
63
|
+
///
|
|
64
|
+
/// @since 2.0.0
|
|
65
|
+
/// @param angle_deg Rotation angle in degrees
|
|
66
|
+
/// @returns `cos(angle/2)` ×10000
|
|
29
67
|
fn quat_axis_x_w(angle_deg: int): int { return cos_fixed(angle_deg / 2) * 10; }
|
|
30
68
|
|
|
31
|
-
|
|
69
|
+
/// X component of a quaternion representing rotation by `angle_deg` around the Y axis.
|
|
70
|
+
///
|
|
71
|
+
/// @since 2.0.0
|
|
72
|
+
/// @param angle_deg Rotation angle in degrees
|
|
73
|
+
/// @returns `0`
|
|
32
74
|
fn quat_axis_y_x(angle_deg: int): int { return 0; }
|
|
75
|
+
|
|
76
|
+
/// Y component of a quaternion representing rotation by `angle_deg` around the Y axis.
|
|
77
|
+
///
|
|
78
|
+
/// @since 2.0.0
|
|
79
|
+
/// @param angle_deg Rotation angle in degrees
|
|
80
|
+
/// @returns `sin(angle/2)` ×10000
|
|
33
81
|
fn quat_axis_y_y(angle_deg: int): int { return sin_fixed(angle_deg / 2) * 10; }
|
|
82
|
+
|
|
83
|
+
/// Z component of a quaternion representing rotation by `angle_deg` around the Y axis.
|
|
84
|
+
///
|
|
85
|
+
/// @since 2.0.0
|
|
86
|
+
/// @param angle_deg Rotation angle in degrees
|
|
87
|
+
/// @returns `0`
|
|
34
88
|
fn quat_axis_y_z(angle_deg: int): int { return 0; }
|
|
89
|
+
|
|
90
|
+
/// W component of a quaternion representing rotation by `angle_deg` around the Y axis.
|
|
91
|
+
///
|
|
92
|
+
/// @since 2.0.0
|
|
93
|
+
/// @param angle_deg Rotation angle in degrees
|
|
94
|
+
/// @returns `cos(angle/2)` ×10000
|
|
35
95
|
fn quat_axis_y_w(angle_deg: int): int { return cos_fixed(angle_deg / 2) * 10; }
|
|
36
96
|
|
|
37
|
-
|
|
97
|
+
/// X component of a quaternion representing rotation by `angle_deg` around the Z axis.
|
|
98
|
+
///
|
|
99
|
+
/// @since 2.0.0
|
|
100
|
+
/// @param angle_deg Rotation angle in degrees
|
|
101
|
+
/// @returns `0`
|
|
38
102
|
fn quat_axis_z_x(angle_deg: int): int { return 0; }
|
|
103
|
+
|
|
104
|
+
/// Y component of a quaternion representing rotation by `angle_deg` around the Z axis.
|
|
105
|
+
///
|
|
106
|
+
/// @since 2.0.0
|
|
107
|
+
/// @param angle_deg Rotation angle in degrees
|
|
108
|
+
/// @returns `0`
|
|
39
109
|
fn quat_axis_z_y(angle_deg: int): int { return 0; }
|
|
110
|
+
|
|
111
|
+
/// Z component of a quaternion representing rotation by `angle_deg` around the Z axis.
|
|
112
|
+
///
|
|
113
|
+
/// @since 2.0.0
|
|
114
|
+
/// @param angle_deg Rotation angle in degrees
|
|
115
|
+
/// @returns `sin(angle/2)` ×10000
|
|
40
116
|
fn quat_axis_z_z(angle_deg: int): int { return sin_fixed(angle_deg / 2) * 10; }
|
|
117
|
+
|
|
118
|
+
/// W component of a quaternion representing rotation by `angle_deg` around the Z axis.
|
|
119
|
+
///
|
|
120
|
+
/// @since 2.0.0
|
|
121
|
+
/// @param angle_deg Rotation angle in degrees
|
|
122
|
+
/// @returns `cos(angle/2)` ×10000
|
|
41
123
|
fn quat_axis_z_w(angle_deg: int): int { return cos_fixed(angle_deg / 2) * 10; }
|
|
42
124
|
|
|
43
125
|
// ─── Quaternion multiplication ────────────────────────────────────────────────
|
|
44
126
|
// q = (ax,ay,az,aw) * (bx,by,bz,bw)
|
|
45
127
|
// All components ×10000, result ×10000
|
|
46
128
|
|
|
129
|
+
/// X component of quaternion product `a × b`.
|
|
130
|
+
///
|
|
131
|
+
/// @since 2.0.0
|
|
132
|
+
/// @param ax @param ay @param az @param aw Quaternion a components ×10000
|
|
133
|
+
/// @param bx @param by @param bz @param bw Quaternion b components ×10000
|
|
134
|
+
/// @returns X component of `a × b` ×10000
|
|
135
|
+
/// @example
|
|
136
|
+
/// let rx: int = quat_mul_x(ax, ay, az, aw, bx, by, bz, bw)
|
|
47
137
|
fn quat_mul_x(ax: int, ay: int, az: int, aw: int, bx: int, by: int, bz: int, bw: int): int {
|
|
48
138
|
// x = aw*bx + ax*bw + ay*bz - az*by
|
|
49
139
|
return mulfix(aw, bx) + mulfix(ax, bw) + mulfix(ay, bz) - mulfix(az, by);
|
|
50
140
|
}
|
|
51
141
|
|
|
142
|
+
/// Y component of quaternion product `a × b`.
|
|
143
|
+
///
|
|
144
|
+
/// @since 2.0.0
|
|
145
|
+
/// @param ax @param ay @param az @param aw Quaternion a components ×10000
|
|
146
|
+
/// @param bx @param by @param bz @param bw Quaternion b components ×10000
|
|
147
|
+
/// @returns Y component of `a × b` ×10000
|
|
52
148
|
fn quat_mul_y(ax: int, ay: int, az: int, aw: int, bx: int, by: int, bz: int, bw: int): int {
|
|
53
149
|
// y = aw*by - ax*bz + ay*bw + az*bx
|
|
54
150
|
return mulfix(aw, by) - mulfix(ax, bz) + mulfix(ay, bw) + mulfix(az, bx);
|
|
55
151
|
}
|
|
56
152
|
|
|
153
|
+
/// Z component of quaternion product `a × b`.
|
|
154
|
+
///
|
|
155
|
+
/// @since 2.0.0
|
|
156
|
+
/// @param ax @param ay @param az @param aw Quaternion a components ×10000
|
|
157
|
+
/// @param bx @param by @param bz @param bw Quaternion b components ×10000
|
|
158
|
+
/// @returns Z component of `a × b` ×10000
|
|
57
159
|
fn quat_mul_z(ax: int, ay: int, az: int, aw: int, bx: int, by: int, bz: int, bw: int): int {
|
|
58
160
|
// z = aw*bz + ax*by - ay*bx + az*bw
|
|
59
161
|
return mulfix(aw, bz) + mulfix(ax, by) - mulfix(ay, bx) + mulfix(az, bw);
|
|
60
162
|
}
|
|
61
163
|
|
|
164
|
+
/// W component of quaternion product `a × b`.
|
|
165
|
+
///
|
|
166
|
+
/// @since 2.0.0
|
|
167
|
+
/// @param ax @param ay @param az @param aw Quaternion a components ×10000
|
|
168
|
+
/// @param bx @param by @param bz @param bw Quaternion b components ×10000
|
|
169
|
+
/// @returns W component of `a × b` ×10000
|
|
62
170
|
fn quat_mul_w(ax: int, ay: int, az: int, aw: int, bx: int, by: int, bz: int, bw: int): int {
|
|
63
171
|
// w = aw*bw - ax*bx - ay*by - az*bz
|
|
64
172
|
return mulfix(aw, bw) - mulfix(ax, bx) - mulfix(ay, by) - mulfix(az, bz);
|
|
65
173
|
}
|
|
66
174
|
|
|
67
175
|
// ─── Quaternion conjugate (= inverse for unit quaternion) ────────────────────
|
|
176
|
+
|
|
177
|
+
/// X component of the conjugate of quaternion `(qx, qy, qz, qw)`.
|
|
178
|
+
///
|
|
179
|
+
/// @since 2.0.0
|
|
180
|
+
/// @param qx @param qy @param qz @param qw Input quaternion ×10000
|
|
181
|
+
/// @returns `-qx`
|
|
68
182
|
fn quat_conj_x(qx: int, qy: int, qz: int, qw: int): int { return 0 - qx; }
|
|
183
|
+
|
|
184
|
+
/// Y component of the conjugate of quaternion `(qx, qy, qz, qw)`.
|
|
185
|
+
///
|
|
186
|
+
/// @since 2.0.0
|
|
187
|
+
/// @param qx @param qy @param qz @param qw Input quaternion ×10000
|
|
188
|
+
/// @returns `-qy`
|
|
69
189
|
fn quat_conj_y(qx: int, qy: int, qz: int, qw: int): int { return 0 - qy; }
|
|
190
|
+
|
|
191
|
+
/// Z component of the conjugate of quaternion `(qx, qy, qz, qw)`.
|
|
192
|
+
///
|
|
193
|
+
/// @since 2.0.0
|
|
194
|
+
/// @param qx @param qy @param qz @param qw Input quaternion ×10000
|
|
195
|
+
/// @returns `-qz`
|
|
70
196
|
fn quat_conj_z(qx: int, qy: int, qz: int, qw: int): int { return 0 - qz; }
|
|
197
|
+
|
|
198
|
+
/// W component of the conjugate of quaternion `(qx, qy, qz, qw)`.
|
|
199
|
+
///
|
|
200
|
+
/// @since 2.0.0
|
|
201
|
+
/// @param qx @param qy @param qz @param qw Input quaternion ×10000
|
|
202
|
+
/// @returns `qw` (unchanged)
|
|
71
203
|
fn quat_conj_w(qx: int, qy: int, qz: int, qw: int): int { return qw; }
|
|
72
204
|
|
|
73
|
-
|
|
74
|
-
|
|
205
|
+
/// Magnitude squared of a quaternion in ×10000 scale.
|
|
206
|
+
///
|
|
207
|
+
/// For a unit quaternion this should equal `10000`.
|
|
208
|
+
///
|
|
209
|
+
/// @since 2.0.0
|
|
210
|
+
/// @param qx @param qy @param qz @param qw Quaternion components ×10000
|
|
211
|
+
/// @returns `qx²/10000 + qy²/10000 + qz²/10000 + qw²/10000` (×10000)
|
|
75
212
|
fn quat_mag_sq(qx: int, qy: int, qz: int, qw: int): int {
|
|
76
213
|
return mulfix(qx, qx) + mulfix(qy, qy) + mulfix(qz, qz) + mulfix(qw, qw);
|
|
77
214
|
}
|
|
78
215
|
|
|
79
|
-
|
|
216
|
+
/// Dot product of two quaternions in ×10000 scale.
|
|
217
|
+
///
|
|
218
|
+
/// @since 2.0.0
|
|
219
|
+
/// @param ax @param ay @param az @param aw Quaternion a ×10000
|
|
220
|
+
/// @param bx @param by @param bz @param bw Quaternion b ×10000
|
|
221
|
+
/// @returns `ax*bx/10000 + ay*by/10000 + az*bz/10000 + aw*bw/10000`
|
|
80
222
|
fn quat_dot(ax: int, ay: int, az: int, aw: int, bx: int, by: int, bz: int, bw: int): int {
|
|
81
223
|
return mulfix(ax, bx) + mulfix(ay, by) + mulfix(az, bz) + mulfix(aw, bw);
|
|
82
224
|
}
|
|
@@ -99,6 +241,17 @@ fn _quat_slerp_mag(rx: int, ry: int, rz: int, rw: int): int {
|
|
|
99
241
|
return isqrt(ss); // returns ≈ 1000 for unit quaternion
|
|
100
242
|
}
|
|
101
243
|
|
|
244
|
+
/// X component of the SLERP interpolation between quaternions `a` and `b` at `t/1000`.
|
|
245
|
+
///
|
|
246
|
+
/// Uses LERP + normalise (good approximation for small angles).
|
|
247
|
+
///
|
|
248
|
+
/// @since 2.0.0
|
|
249
|
+
/// @param ax @param ay @param az @param aw Start quaternion ×10000
|
|
250
|
+
/// @param bx @param by @param bz @param bw End quaternion ×10000
|
|
251
|
+
/// @param t Interpolation factor ×1000 (0 = a, 1000 = b)
|
|
252
|
+
/// @returns X component of interpolated quaternion ×10000
|
|
253
|
+
/// @example
|
|
254
|
+
/// let rx: int = quat_slerp_x(ax, ay, az, aw, bx, by, bz, bw, 500)
|
|
102
255
|
fn quat_slerp_x(ax: int, ay: int, az: int, aw: int, bx: int, by: int, bz: int, bw: int, t: int): int {
|
|
103
256
|
let inv_t: int = 1000 - t;
|
|
104
257
|
let rx: int = ax * inv_t / 1000 + bx * t / 1000;
|
|
@@ -110,6 +263,13 @@ fn quat_slerp_x(ax: int, ay: int, az: int, aw: int, bx: int, by: int, bz: int, b
|
|
|
110
263
|
return rx * 1000 / mag;
|
|
111
264
|
}
|
|
112
265
|
|
|
266
|
+
/// Y component of the SLERP interpolation between quaternions `a` and `b` at `t/1000`.
|
|
267
|
+
///
|
|
268
|
+
/// @since 2.0.0
|
|
269
|
+
/// @param ax @param ay @param az @param aw Start quaternion ×10000
|
|
270
|
+
/// @param bx @param by @param bz @param bw End quaternion ×10000
|
|
271
|
+
/// @param t Interpolation factor ×1000
|
|
272
|
+
/// @returns Y component of interpolated quaternion ×10000
|
|
113
273
|
fn quat_slerp_y(ax: int, ay: int, az: int, aw: int, bx: int, by: int, bz: int, bw: int, t: int): int {
|
|
114
274
|
let inv_t: int = 1000 - t;
|
|
115
275
|
let rx: int = ax * inv_t / 1000 + bx * t / 1000;
|
|
@@ -121,6 +281,13 @@ fn quat_slerp_y(ax: int, ay: int, az: int, aw: int, bx: int, by: int, bz: int, b
|
|
|
121
281
|
return ry * 1000 / mag;
|
|
122
282
|
}
|
|
123
283
|
|
|
284
|
+
/// Z component of the SLERP interpolation between quaternions `a` and `b` at `t/1000`.
|
|
285
|
+
///
|
|
286
|
+
/// @since 2.0.0
|
|
287
|
+
/// @param ax @param ay @param az @param aw Start quaternion ×10000
|
|
288
|
+
/// @param bx @param by @param bz @param bw End quaternion ×10000
|
|
289
|
+
/// @param t Interpolation factor ×1000
|
|
290
|
+
/// @returns Z component of interpolated quaternion ×10000
|
|
124
291
|
fn quat_slerp_z(ax: int, ay: int, az: int, aw: int, bx: int, by: int, bz: int, bw: int, t: int): int {
|
|
125
292
|
let inv_t: int = 1000 - t;
|
|
126
293
|
let rx: int = ax * inv_t / 1000 + bx * t / 1000;
|
|
@@ -132,6 +299,13 @@ fn quat_slerp_z(ax: int, ay: int, az: int, aw: int, bx: int, by: int, bz: int, b
|
|
|
132
299
|
return rz * 1000 / mag;
|
|
133
300
|
}
|
|
134
301
|
|
|
302
|
+
/// W component of the SLERP interpolation between quaternions `a` and `b` at `t/1000`.
|
|
303
|
+
///
|
|
304
|
+
/// @since 2.0.0
|
|
305
|
+
/// @param ax @param ay @param az @param aw Start quaternion ×10000
|
|
306
|
+
/// @param bx @param by @param bz @param bw End quaternion ×10000
|
|
307
|
+
/// @param t Interpolation factor ×1000
|
|
308
|
+
/// @returns W component of interpolated quaternion ×10000
|
|
135
309
|
fn quat_slerp_w(ax: int, ay: int, az: int, aw: int, bx: int, by: int, bz: int, bw: int, t: int): int {
|
|
136
310
|
let inv_t: int = 1000 - t;
|
|
137
311
|
let rx: int = ax * inv_t / 1000 + bx * t / 1000;
|
|
@@ -147,6 +321,15 @@ fn quat_slerp_w(ax: int, ay: int, az: int, aw: int, bx: int, by: int, bz: int, b
|
|
|
147
321
|
// yaw: Y-axis rotation (°), pitch: X-axis rotation (°), roll: Z-axis rotation (°)
|
|
148
322
|
// YXZ order: first yaw, then pitch, then roll
|
|
149
323
|
|
|
324
|
+
/// X component of the quaternion from Euler angles (YXZ order, MC convention).
|
|
325
|
+
///
|
|
326
|
+
/// @since 2.0.0
|
|
327
|
+
/// @param yaw Y-axis rotation in degrees
|
|
328
|
+
/// @param pitch X-axis rotation in degrees
|
|
329
|
+
/// @param roll Z-axis rotation in degrees
|
|
330
|
+
/// @returns X component ×10000
|
|
331
|
+
/// @example
|
|
332
|
+
/// let qx: int = quat_euler_x(90, 0, 0)
|
|
150
333
|
fn quat_euler_x(yaw: int, pitch: int, roll: int): int {
|
|
151
334
|
let cy: int = cos_fixed(yaw / 2) * 10;
|
|
152
335
|
let sy: int = sin_fixed(yaw / 2) * 10;
|
|
@@ -158,6 +341,13 @@ fn quat_euler_x(yaw: int, pitch: int, roll: int): int {
|
|
|
158
341
|
return mulfix(mulfix(cy, sp), cr) + mulfix(mulfix(sy, cp), sr);
|
|
159
342
|
}
|
|
160
343
|
|
|
344
|
+
/// Y component of the quaternion from Euler angles (YXZ order, MC convention).
|
|
345
|
+
///
|
|
346
|
+
/// @since 2.0.0
|
|
347
|
+
/// @param yaw Y-axis rotation in degrees
|
|
348
|
+
/// @param pitch X-axis rotation in degrees
|
|
349
|
+
/// @param roll Z-axis rotation in degrees
|
|
350
|
+
/// @returns Y component ×10000
|
|
161
351
|
fn quat_euler_y(yaw: int, pitch: int, roll: int): int {
|
|
162
352
|
let cy: int = cos_fixed(yaw / 2) * 10;
|
|
163
353
|
let sy: int = sin_fixed(yaw / 2) * 10;
|
|
@@ -169,6 +359,13 @@ fn quat_euler_y(yaw: int, pitch: int, roll: int): int {
|
|
|
169
359
|
return mulfix(mulfix(sy, cp), cr) - mulfix(mulfix(cy, sp), sr);
|
|
170
360
|
}
|
|
171
361
|
|
|
362
|
+
/// Z component of the quaternion from Euler angles (YXZ order, MC convention).
|
|
363
|
+
///
|
|
364
|
+
/// @since 2.0.0
|
|
365
|
+
/// @param yaw Y-axis rotation in degrees
|
|
366
|
+
/// @param pitch X-axis rotation in degrees
|
|
367
|
+
/// @param roll Z-axis rotation in degrees
|
|
368
|
+
/// @returns Z component ×10000
|
|
172
369
|
fn quat_euler_z(yaw: int, pitch: int, roll: int): int {
|
|
173
370
|
let cy: int = cos_fixed(yaw / 2) * 10;
|
|
174
371
|
let sy: int = sin_fixed(yaw / 2) * 10;
|
|
@@ -180,6 +377,13 @@ fn quat_euler_z(yaw: int, pitch: int, roll: int): int {
|
|
|
180
377
|
return mulfix(mulfix(cy, cp), sr) - mulfix(mulfix(sy, sp), cr);
|
|
181
378
|
}
|
|
182
379
|
|
|
380
|
+
/// W component of the quaternion from Euler angles (YXZ order, MC convention).
|
|
381
|
+
///
|
|
382
|
+
/// @since 2.0.0
|
|
383
|
+
/// @param yaw Y-axis rotation in degrees
|
|
384
|
+
/// @param pitch X-axis rotation in degrees
|
|
385
|
+
/// @param roll Z-axis rotation in degrees
|
|
386
|
+
/// @returns W component ×10000
|
|
183
387
|
fn quat_euler_w(yaw: int, pitch: int, roll: int): int {
|
|
184
388
|
let cy: int = cos_fixed(yaw / 2) * 10;
|
|
185
389
|
let sy: int = sin_fixed(yaw / 2) * 10;
|