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.
Files changed (636) hide show
  1. package/.github/workflows/ci.yml +11 -0
  2. package/CHANGELOG.md +18 -9
  3. package/README-benchmarks.md +48 -0
  4. package/README-vscode-test.md +251 -0
  5. package/RELEASE_NOTES.md +74 -0
  6. package/ROADMAP.md +131 -167
  7. package/benchmarks/_shared.ts +468 -0
  8. package/benchmarks/baseline.json +2816 -0
  9. package/benchmarks/baseline.md +13 -0
  10. package/benchmarks/compiler-perf.report.json +207 -0
  11. package/benchmarks/compiler-perf.ts +76 -0
  12. package/benchmarks/results.md +13 -0
  13. package/benchmarks/stdlib-complexity.report.json +2606 -0
  14. package/benchmarks/stdlib-complexity.ts +54 -0
  15. package/benchmarks/stdlib-size.md +57 -0
  16. package/benchmarks/stdlib-size.ts +91 -0
  17. package/coverage-report.md +177 -0
  18. package/dist/src/__tests__/budget.test.js +4 -0
  19. package/dist/src/__tests__/cache/cache-behavior.test.d.ts +10 -0
  20. package/dist/src/__tests__/cache/cache-behavior.test.js +425 -0
  21. package/dist/src/__tests__/cache-extra.test.d.ts +5 -0
  22. package/dist/src/__tests__/cache-extra.test.js +211 -0
  23. package/dist/src/__tests__/cli-init.test.d.ts +1 -0
  24. package/dist/src/__tests__/cli-init.test.js +97 -0
  25. package/dist/src/__tests__/cli-publish.test.d.ts +9 -0
  26. package/dist/src/__tests__/cli-publish.test.js +189 -0
  27. package/dist/src/__tests__/cli.test.js +76 -0
  28. package/dist/src/__tests__/compile-preprocess.test.d.ts +11 -0
  29. package/dist/src/__tests__/compile-preprocess.test.js +328 -0
  30. package/dist/src/__tests__/compiler/break-stmt.test.d.ts +1 -0
  31. package/dist/src/__tests__/compiler/break-stmt.test.js +58 -0
  32. package/dist/src/__tests__/compiler/const-decl.test.d.ts +1 -0
  33. package/dist/src/__tests__/compiler/const-decl.test.js +123 -0
  34. package/dist/src/__tests__/compiler/continue-stmt.test.d.ts +1 -0
  35. package/dist/src/__tests__/compiler/continue-stmt.test.js +67 -0
  36. package/dist/src/__tests__/compiler/coroutine-extended.test.d.ts +17 -0
  37. package/dist/src/__tests__/compiler/coroutine-extended.test.js +565 -0
  38. package/dist/src/__tests__/compiler/deprecated.test.d.ts +4 -0
  39. package/dist/src/__tests__/compiler/deprecated.test.js +285 -0
  40. package/dist/src/__tests__/compiler/do-while.test.d.ts +1 -0
  41. package/dist/src/__tests__/compiler/do-while.test.js +120 -0
  42. package/dist/src/__tests__/compiler/enum-payload.test.d.ts +9 -0
  43. package/dist/src/__tests__/compiler/enum-payload.test.js +272 -0
  44. package/dist/src/__tests__/compiler/interface.test.d.ts +10 -0
  45. package/dist/src/__tests__/compiler/interface.test.js +258 -0
  46. package/dist/src/__tests__/compiler/labeled-loops.test.d.ts +1 -0
  47. package/dist/src/__tests__/compiler/labeled-loops.test.js +263 -0
  48. package/dist/src/__tests__/compiler/match-string.test.d.ts +1 -0
  49. package/dist/src/__tests__/compiler/match-string.test.js +43 -0
  50. package/dist/src/__tests__/compiler/memoize.test.d.ts +1 -0
  51. package/dist/src/__tests__/compiler/memoize.test.js +113 -0
  52. package/dist/src/__tests__/compiler/method-chain.test.d.ts +5 -0
  53. package/dist/src/__tests__/compiler/method-chain.test.js +115 -0
  54. package/dist/src/__tests__/compiler/module-import.test.d.ts +12 -0
  55. package/dist/src/__tests__/compiler/module-import.test.js +261 -0
  56. package/dist/src/__tests__/compiler/option-extensions.test.d.ts +6 -0
  57. package/dist/src/__tests__/compiler/option-extensions.test.js +191 -0
  58. package/dist/src/__tests__/compiler/profile-decorator.test.d.ts +1 -0
  59. package/dist/src/__tests__/compiler/profile-decorator.test.js +69 -0
  60. package/dist/src/__tests__/compiler/string-advanced.test.d.ts +7 -0
  61. package/dist/src/__tests__/compiler/string-advanced.test.js +281 -0
  62. package/dist/src/__tests__/compiler/struct-extends.test.d.ts +1 -0
  63. package/dist/src/__tests__/compiler/struct-extends.test.js +95 -0
  64. package/dist/src/__tests__/compiler/throttle-retry.test.d.ts +1 -0
  65. package/dist/src/__tests__/compiler/throttle-retry.test.js +166 -0
  66. package/dist/src/__tests__/compiler/tuple-type.test.d.ts +10 -0
  67. package/dist/src/__tests__/compiler/tuple-type.test.js +229 -0
  68. package/dist/src/__tests__/compiler/watch-decorator.test.d.ts +1 -0
  69. package/dist/src/__tests__/compiler/watch-decorator.test.js +65 -0
  70. package/dist/src/__tests__/config/project-config.test.d.ts +1 -0
  71. package/dist/src/__tests__/config/project-config.test.js +199 -0
  72. package/dist/src/__tests__/config-decorator.test.d.ts +8 -0
  73. package/dist/src/__tests__/config-decorator.test.js +142 -0
  74. package/dist/src/__tests__/diagnostics-extra.test.d.ts +6 -0
  75. package/dist/src/__tests__/diagnostics-extra.test.js +132 -0
  76. package/dist/src/__tests__/emit/compile-branches.test.d.ts +1 -0
  77. package/dist/src/__tests__/emit/compile-branches.test.js +123 -0
  78. package/dist/src/__tests__/emit/compile-coverage.test.d.ts +25 -0
  79. package/dist/src/__tests__/emit/compile-coverage.test.js +617 -0
  80. package/dist/src/__tests__/emit/compile-extra-branches.test.d.ts +12 -0
  81. package/dist/src/__tests__/emit/compile-extra-branches.test.js +225 -0
  82. package/dist/src/__tests__/emit/compile-mocked-branches.test.d.ts +0 -0
  83. package/dist/src/__tests__/emit/compile-mocked-branches.test.js +238 -0
  84. package/dist/src/__tests__/emit/execute-chain.test.d.ts +10 -0
  85. package/dist/src/__tests__/emit/execute-chain.test.js +94 -0
  86. package/dist/src/__tests__/emit/index.test.js +2 -1
  87. package/dist/src/__tests__/emit/modules-branches.test.d.ts +1 -0
  88. package/dist/src/__tests__/emit/modules-branches.test.js +88 -0
  89. package/dist/src/__tests__/emit/modules-coverage.test.d.ts +15 -0
  90. package/dist/src/__tests__/emit/modules-coverage.test.js +221 -0
  91. package/dist/src/__tests__/emit/modules-errors.test.d.ts +12 -0
  92. package/dist/src/__tests__/emit/modules-errors.test.js +169 -0
  93. package/dist/src/__tests__/emit/modules-rewrite.test.d.ts +17 -0
  94. package/dist/src/__tests__/emit/modules-rewrite.test.js +204 -0
  95. package/dist/src/__tests__/emit/source-map.test.d.ts +1 -0
  96. package/dist/src/__tests__/emit/source-map.test.js +167 -0
  97. package/dist/src/__tests__/enum.test.js +9 -4
  98. package/dist/src/__tests__/error-recovery.test.d.ts +7 -0
  99. package/dist/src/__tests__/error-recovery.test.js +217 -0
  100. package/dist/src/__tests__/events-types-extra.test.d.ts +10 -0
  101. package/dist/src/__tests__/events-types-extra.test.js +91 -0
  102. package/dist/src/__tests__/events-types.test.d.ts +4 -0
  103. package/dist/src/__tests__/events-types.test.js +56 -0
  104. package/dist/src/__tests__/formatter.test.js +13 -5
  105. package/dist/src/__tests__/hir/lower-extra.test.d.ts +9 -0
  106. package/dist/src/__tests__/hir/lower-extra.test.js +140 -0
  107. package/dist/src/__tests__/hir/monomorphize-extra.test.d.ts +15 -0
  108. package/dist/src/__tests__/hir/monomorphize-extra.test.js +200 -0
  109. package/dist/src/__tests__/hir/monomorphize-extra2.test.d.ts +16 -0
  110. package/dist/src/__tests__/hir/monomorphize-extra2.test.js +316 -0
  111. package/dist/src/__tests__/incremental.test.js +10 -2
  112. package/dist/src/__tests__/index-extra.test.d.ts +10 -0
  113. package/dist/src/__tests__/index-extra.test.js +71 -0
  114. package/dist/src/__tests__/lexer.test.js +2 -2
  115. package/dist/src/__tests__/lint/rules.test.d.ts +5 -0
  116. package/dist/src/__tests__/lint/rules.test.js +208 -0
  117. package/dist/src/__tests__/lir/lower.test.js +29 -0
  118. package/dist/src/__tests__/lir/verify.test.js +30 -0
  119. package/dist/src/__tests__/lsp/completion.test.d.ts +7 -0
  120. package/dist/src/__tests__/lsp/completion.test.js +583 -0
  121. package/dist/src/__tests__/lsp/definition.test.d.ts +7 -0
  122. package/dist/src/__tests__/lsp/definition.test.js +454 -0
  123. package/dist/src/__tests__/lsp/diagnostics.test.d.ts +10 -0
  124. package/dist/src/__tests__/lsp/diagnostics.test.js +98 -0
  125. package/dist/src/__tests__/lsp/hover-docs.test.d.ts +10 -0
  126. package/dist/src/__tests__/lsp/hover-docs.test.js +210 -0
  127. package/dist/src/__tests__/lsp.test.js +4 -1
  128. package/dist/src/__tests__/mc-integration/item-entity-events.test.js +4 -0
  129. package/dist/src/__tests__/mc-integration/stdlib-coverage-2.test.js +4 -0
  130. package/dist/src/__tests__/mc-integration/stdlib-coverage-3.test.d.ts +13 -0
  131. package/dist/src/__tests__/mc-integration/stdlib-coverage-3.test.js +1227 -0
  132. package/dist/src/__tests__/mc-integration/stdlib-coverage-4.test.d.ts +13 -0
  133. package/dist/src/__tests__/mc-integration/stdlib-coverage-4.test.js +1509 -0
  134. package/dist/src/__tests__/mc-integration/stdlib-coverage-5.test.d.ts +14 -0
  135. package/dist/src/__tests__/mc-integration/stdlib-coverage-5.test.js +1374 -0
  136. package/dist/src/__tests__/mc-integration/stdlib-coverage-6.test.d.ts +10 -0
  137. package/dist/src/__tests__/mc-integration/stdlib-coverage-6.test.js +759 -0
  138. package/dist/src/__tests__/mc-integration/stdlib-coverage-7.test.d.ts +13 -0
  139. package/dist/src/__tests__/mc-integration/stdlib-coverage-7.test.js +855 -0
  140. package/dist/src/__tests__/mc-integration/stdlib-coverage.test.js +4 -0
  141. package/dist/src/__tests__/mc-integration/syntax-coverage.test.js +4 -0
  142. package/dist/src/__tests__/mc-validator-coverage.test.d.ts +13 -0
  143. package/dist/src/__tests__/mc-validator-coverage.test.js +296 -0
  144. package/dist/src/__tests__/mc-validator-extra.test.d.ts +13 -0
  145. package/dist/src/__tests__/mc-validator-extra.test.js +245 -0
  146. package/dist/src/__tests__/mir/lower-extra.test.d.ts +20 -0
  147. package/dist/src/__tests__/mir/lower-extra.test.js +361 -0
  148. package/dist/src/__tests__/mir/lower-extra2.test.d.ts +17 -0
  149. package/dist/src/__tests__/mir/lower-extra2.test.js +317 -0
  150. package/dist/src/__tests__/mir/lower-extra3.test.d.ts +19 -0
  151. package/dist/src/__tests__/mir/lower-extra3.test.js +249 -0
  152. package/dist/src/__tests__/mir/lower-extra4.test.d.ts +23 -0
  153. package/dist/src/__tests__/mir/lower-extra4.test.js +606 -0
  154. package/dist/src/__tests__/mir/lower-extra5.test.d.ts +25 -0
  155. package/dist/src/__tests__/mir/lower-extra5.test.js +543 -0
  156. package/dist/src/__tests__/mir/lower-extra6.test.d.ts +16 -0
  157. package/dist/src/__tests__/mir/lower-extra6.test.js +471 -0
  158. package/dist/src/__tests__/mir/lower-extra7.test.d.ts +35 -0
  159. package/dist/src/__tests__/mir/lower-extra7.test.js +921 -0
  160. package/dist/src/__tests__/mir/lower-extra8.test.d.ts +19 -0
  161. package/dist/src/__tests__/mir/lower-extra8.test.js +626 -0
  162. package/dist/src/__tests__/mir/lower-extra9.test.d.ts +14 -0
  163. package/dist/src/__tests__/mir/lower-extra9.test.js +717 -0
  164. package/dist/src/__tests__/optimizer/auto-inline.test.d.ts +1 -0
  165. package/dist/src/__tests__/optimizer/auto-inline.test.js +176 -0
  166. package/dist/src/__tests__/optimizer/cse.test.d.ts +4 -0
  167. package/dist/src/__tests__/optimizer/cse.test.js +178 -0
  168. package/dist/src/__tests__/optimizer/inline_fn.test.d.ts +1 -0
  169. package/dist/src/__tests__/optimizer/inline_fn.test.js +221 -0
  170. package/dist/src/__tests__/optimizer/licm.test.d.ts +1 -0
  171. package/dist/src/__tests__/optimizer/licm.test.js +244 -0
  172. package/dist/src/__tests__/optimizer/optimizer-extended.test.d.ts +12 -0
  173. package/dist/src/__tests__/optimizer/optimizer-extended.test.js +993 -0
  174. package/dist/src/__tests__/optimizer/strength-reduction.test.d.ts +1 -0
  175. package/dist/src/__tests__/optimizer/strength-reduction.test.js +86 -0
  176. package/dist/src/__tests__/optimizer/tco.test.d.ts +14 -0
  177. package/dist/src/__tests__/optimizer/tco.test.js +203 -0
  178. package/dist/src/__tests__/parser-coverage.test.d.ts +25 -0
  179. package/dist/src/__tests__/parser-coverage.test.js +491 -0
  180. package/dist/src/__tests__/parser-extra.test.d.ts +6 -0
  181. package/dist/src/__tests__/parser-extra.test.js +451 -0
  182. package/dist/src/__tests__/parser.test.js +12 -0
  183. package/dist/src/__tests__/repl-extra.test.d.ts +13 -0
  184. package/dist/src/__tests__/repl-extra.test.js +174 -0
  185. package/dist/src/__tests__/repl-server-extra.test.d.ts +10 -0
  186. package/dist/src/__tests__/repl-server-extra.test.js +161 -0
  187. package/dist/src/__tests__/repl-server.test.d.ts +6 -0
  188. package/dist/src/__tests__/repl-server.test.js +146 -0
  189. package/dist/src/__tests__/runtime-extra.test.d.ts +15 -0
  190. package/dist/src/__tests__/runtime-extra.test.js +732 -0
  191. package/dist/src/__tests__/singleton-decorator.test.d.ts +11 -0
  192. package/dist/src/__tests__/singleton-decorator.test.js +260 -0
  193. package/dist/src/__tests__/sourcemap.test.js +1 -1
  194. package/dist/src/__tests__/stdlib/advanced.test.d.ts +5 -0
  195. package/dist/src/__tests__/stdlib/advanced.test.js +301 -0
  196. package/dist/src/__tests__/stdlib/bigint.test.d.ts +4 -0
  197. package/dist/src/__tests__/stdlib/bigint.test.js +83 -0
  198. package/dist/src/__tests__/stdlib/bits.test.d.ts +4 -0
  199. package/dist/src/__tests__/stdlib/bits.test.js +96 -0
  200. package/dist/src/__tests__/stdlib/bossbar.test.d.ts +4 -0
  201. package/dist/src/__tests__/stdlib/bossbar.test.js +72 -0
  202. package/dist/src/__tests__/stdlib/color.test.d.ts +4 -0
  203. package/dist/src/__tests__/stdlib/color.test.js +84 -0
  204. package/dist/src/__tests__/stdlib/combat.test.d.ts +4 -0
  205. package/dist/src/__tests__/stdlib/combat.test.js +64 -0
  206. package/dist/src/__tests__/stdlib/cooldown.test.d.ts +4 -0
  207. package/dist/src/__tests__/stdlib/cooldown.test.js +64 -0
  208. package/dist/src/__tests__/stdlib/dialog.test.js +15 -7
  209. package/dist/src/__tests__/stdlib/ecs.test.d.ts +4 -0
  210. package/dist/src/__tests__/stdlib/ecs.test.js +81 -0
  211. package/dist/src/__tests__/stdlib/effects.test.d.ts +4 -0
  212. package/dist/src/__tests__/stdlib/effects.test.js +72 -0
  213. package/dist/src/__tests__/stdlib/events.test.d.ts +4 -0
  214. package/dist/src/__tests__/stdlib/events.test.js +55 -0
  215. package/dist/src/__tests__/stdlib/expr.test.d.ts +4 -0
  216. package/dist/src/__tests__/stdlib/expr.test.js +77 -0
  217. package/dist/src/__tests__/stdlib/fft.test.d.ts +4 -0
  218. package/dist/src/__tests__/stdlib/fft.test.js +82 -0
  219. package/dist/src/__tests__/stdlib/graph.test.d.ts +4 -0
  220. package/dist/src/__tests__/stdlib/graph.test.js +102 -0
  221. package/dist/src/__tests__/stdlib/interactions.test.d.ts +4 -0
  222. package/dist/src/__tests__/stdlib/interactions.test.js +60 -0
  223. package/dist/src/__tests__/stdlib/inventory.test.d.ts +4 -0
  224. package/dist/src/__tests__/stdlib/inventory.test.js +68 -0
  225. package/dist/src/__tests__/stdlib/linalg.test.d.ts +5 -0
  226. package/dist/src/__tests__/stdlib/linalg.test.js +78 -0
  227. package/dist/src/__tests__/stdlib/map.test.d.ts +1 -0
  228. package/dist/src/__tests__/stdlib/map.test.js +84 -0
  229. package/dist/src/__tests__/stdlib/math.test.js +19 -6
  230. package/dist/src/__tests__/stdlib/math_hp.test.d.ts +4 -0
  231. package/dist/src/__tests__/stdlib/math_hp.test.js +80 -0
  232. package/dist/src/__tests__/stdlib/mobs.test.d.ts +4 -0
  233. package/dist/src/__tests__/stdlib/mobs.test.js +61 -0
  234. package/dist/src/__tests__/stdlib/noise.test.d.ts +4 -0
  235. package/dist/src/__tests__/stdlib/noise.test.js +73 -0
  236. package/dist/src/__tests__/stdlib/ode.test.d.ts +4 -0
  237. package/dist/src/__tests__/stdlib/ode.test.js +68 -0
  238. package/dist/src/__tests__/stdlib/parabola.test.d.ts +4 -0
  239. package/dist/src/__tests__/stdlib/parabola.test.js +77 -0
  240. package/dist/src/__tests__/stdlib/particles.test.d.ts +4 -0
  241. package/dist/src/__tests__/stdlib/particles.test.js +68 -0
  242. package/dist/src/__tests__/stdlib/physics.test.d.ts +4 -0
  243. package/dist/src/__tests__/stdlib/physics.test.js +76 -0
  244. package/dist/src/__tests__/stdlib/player.test.d.ts +4 -0
  245. package/dist/src/__tests__/stdlib/player.test.js +64 -0
  246. package/dist/src/__tests__/stdlib/quaternion.test.d.ts +4 -0
  247. package/dist/src/__tests__/stdlib/quaternion.test.js +73 -0
  248. package/dist/src/__tests__/stdlib/queue.test.d.ts +1 -0
  249. package/dist/src/__tests__/stdlib/queue.test.js +97 -0
  250. package/dist/src/__tests__/stdlib/random.test.d.ts +4 -0
  251. package/dist/src/__tests__/stdlib/random.test.js +76 -0
  252. package/dist/src/__tests__/stdlib/result.test.d.ts +12 -0
  253. package/dist/src/__tests__/stdlib/result.test.js +329 -0
  254. package/dist/src/__tests__/stdlib/scheduler.test.js +19 -8
  255. package/dist/src/__tests__/stdlib/set_int.test.d.ts +1 -0
  256. package/dist/src/__tests__/stdlib/set_int.test.js +88 -0
  257. package/dist/src/__tests__/stdlib/sets.test.d.ts +6 -0
  258. package/dist/src/__tests__/stdlib/sets.test.js +60 -0
  259. package/dist/src/__tests__/stdlib/signal.test.d.ts +4 -0
  260. package/dist/src/__tests__/stdlib/signal.test.js +84 -0
  261. package/dist/src/__tests__/stdlib/spawn.test.d.ts +4 -0
  262. package/dist/src/__tests__/stdlib/spawn.test.js +68 -0
  263. package/dist/src/__tests__/stdlib/string.test.d.ts +12 -0
  264. package/dist/src/__tests__/stdlib/string.test.js +231 -0
  265. package/dist/src/__tests__/stdlib/strings.test.d.ts +4 -0
  266. package/dist/src/__tests__/stdlib/strings.test.js +83 -0
  267. package/dist/src/__tests__/stdlib/tags.test.d.ts +4 -0
  268. package/dist/src/__tests__/stdlib/tags.test.js +57 -0
  269. package/dist/src/__tests__/stdlib/teams.test.d.ts +4 -0
  270. package/dist/src/__tests__/stdlib/teams.test.js +72 -0
  271. package/dist/src/__tests__/stdlib/timer.test.d.ts +4 -0
  272. package/dist/src/__tests__/stdlib/timer.test.js +79 -0
  273. package/dist/src/__tests__/stdlib/vec.test.d.ts +5 -0
  274. package/dist/src/__tests__/stdlib/vec.test.js +94 -0
  275. package/dist/src/__tests__/stdlib/world.test.d.ts +4 -0
  276. package/dist/src/__tests__/stdlib/world.test.js +72 -0
  277. package/dist/src/__tests__/struct-display.test.d.ts +1 -0
  278. package/dist/src/__tests__/struct-display.test.js +64 -0
  279. package/dist/src/__tests__/test-framework/runner.test.d.ts +10 -0
  280. package/dist/src/__tests__/test-framework/runner.test.js +193 -0
  281. package/dist/src/__tests__/tuner/adapters.test.d.ts +14 -0
  282. package/dist/src/__tests__/tuner/adapters.test.js +194 -0
  283. package/dist/src/__tests__/tuner/simulator-extra.test.d.ts +4 -0
  284. package/dist/src/__tests__/tuner/simulator-extra.test.js +193 -0
  285. package/dist/src/__tests__/typechecker-coverage.test.d.ts +30 -0
  286. package/dist/src/__tests__/typechecker-coverage.test.js +627 -0
  287. package/dist/src/__tests__/typechecker.test.js +3 -3
  288. package/dist/src/__tests__/watch-decorator.test.d.ts +1 -0
  289. package/dist/src/__tests__/watch-decorator.test.js +54 -0
  290. package/dist/src/ast/types.d.ts +102 -3
  291. package/dist/src/cache/incremental.d.ts +13 -14
  292. package/dist/src/cache/incremental.js +106 -89
  293. package/dist/src/cache/index.d.ts +8 -2
  294. package/dist/src/cache/index.js +18 -6
  295. package/dist/src/cli.d.ts +1 -0
  296. package/dist/src/cli.js +466 -17
  297. package/dist/src/config/project-config.d.ts +29 -0
  298. package/dist/src/config/project-config.js +180 -0
  299. package/dist/src/diagnostics/index.d.ts +9 -0
  300. package/dist/src/diagnostics/index.js +18 -1
  301. package/dist/src/emit/compile.d.ts +10 -0
  302. package/dist/src/emit/compile.js +395 -50
  303. package/dist/src/emit/index.d.ts +40 -0
  304. package/dist/src/emit/index.js +307 -14
  305. package/dist/src/emit/modules.js +21 -3
  306. package/dist/src/emit/sourcemap.d.ts +23 -27
  307. package/dist/src/emit/sourcemap.js +52 -30
  308. package/dist/src/formatter/index.js +33 -8
  309. package/dist/src/hir/deprecated.d.ts +13 -0
  310. package/dist/src/hir/deprecated.js +218 -0
  311. package/dist/src/hir/lower.js +114 -8
  312. package/dist/src/hir/monomorphize.js +22 -2
  313. package/dist/src/hir/types.d.ts +65 -1
  314. package/dist/src/index.d.ts +6 -0
  315. package/dist/src/index.js +18 -3
  316. package/dist/src/lexer/index.d.ts +2 -1
  317. package/dist/src/lexer/index.js +39 -3
  318. package/dist/src/lint/index.d.ts +45 -0
  319. package/dist/src/lint/index.js +930 -0
  320. package/dist/src/lir/lower.js +29 -2
  321. package/dist/src/lir/types.d.ts +2 -0
  322. package/dist/src/lsp/server.js +92 -5
  323. package/dist/src/mir/lower.js +775 -34
  324. package/dist/src/mir/macro.js +36 -2
  325. package/dist/src/mir/types.d.ts +12 -0
  326. package/dist/src/mir/verify.js +9 -0
  327. package/dist/src/optimizer/auto-inline.d.ts +2 -0
  328. package/dist/src/optimizer/auto-inline.js +67 -0
  329. package/dist/src/optimizer/cse.d.ts +20 -0
  330. package/dist/src/optimizer/cse.js +234 -0
  331. package/dist/src/optimizer/inline.d.ts +26 -0
  332. package/dist/src/optimizer/inline.js +286 -0
  333. package/dist/src/optimizer/interprocedural.js +4 -0
  334. package/dist/src/optimizer/licm.d.ts +32 -0
  335. package/dist/src/optimizer/licm.js +371 -0
  336. package/dist/src/optimizer/pipeline.js +12 -2
  337. package/dist/src/optimizer/strength_reduction.d.ts +15 -0
  338. package/dist/src/optimizer/strength_reduction.js +90 -0
  339. package/dist/src/optimizer/tco.d.ts +53 -0
  340. package/dist/src/optimizer/tco.js +238 -0
  341. package/dist/src/parser/index.d.ts +32 -0
  342. package/dist/src/parser/index.js +421 -59
  343. package/dist/src/repl-server.d.ts +13 -0
  344. package/dist/src/repl-server.js +127 -0
  345. package/dist/src/structs/expand.d.ts +15 -0
  346. package/dist/src/structs/expand.js +46 -0
  347. package/dist/src/testing/runner.d.ts +40 -0
  348. package/dist/src/testing/runner.js +237 -0
  349. package/dist/src/typechecker/index.d.ts +3 -0
  350. package/dist/src/typechecker/index.js +254 -9
  351. package/dist/tsconfig.tsbuildinfo +1 -1
  352. package/doc-drafts/redscript-docs/docs/en/stdlib/graph.md +104 -0
  353. package/doc-drafts/redscript-docs/docs/en/stdlib/parabola.md +113 -0
  354. package/doc-drafts/redscript-docs/docs/en/stdlib/pathfind.md +104 -0
  355. package/doc-drafts/redscript-docs/docs/en/stdlib/physics.md +134 -0
  356. package/doc-drafts/redscript-docs/docs/en/stdlib/quaternion.md +135 -0
  357. package/doc-drafts/redscript-docs/docs/zh/stdlib/graph.md +104 -0
  358. package/doc-drafts/redscript-docs/docs/zh/stdlib/parabola.md +113 -0
  359. package/doc-drafts/redscript-docs/docs/zh/stdlib/pathfind.md +104 -0
  360. package/doc-drafts/redscript-docs/docs/zh/stdlib/physics.md +134 -0
  361. package/doc-drafts/redscript-docs/docs/zh/stdlib/quaternion.md +135 -0
  362. package/docs/stdlib/result.md +156 -0
  363. package/docs/stdlib/result.zh.md +156 -0
  364. package/editors/vscode/fixtures/test.mcrs +7 -0
  365. package/editors/vscode/out/extension.js +2095 -225
  366. package/editors/vscode/out/lsp-server.js +519 -51
  367. package/editors/vscode/package-lock.json +9 -4
  368. package/editors/vscode/package.json +1 -1
  369. package/examples/display-demo.mcrs +64 -0
  370. package/examples/game/racing.mcrs +301 -0
  371. package/examples/game/tower_defense.mcrs +311 -0
  372. package/examples/math/physics_sim.mcrs +322 -0
  373. package/examples/rpg/boss_fight.mcrs +313 -0
  374. package/examples/rpg/health_system.mcrs +237 -0
  375. package/examples/rpg/inventory.mcrs +265 -0
  376. package/examples/util/debug_hud.mcrs +279 -0
  377. package/jest.config.js +10 -0
  378. package/package.json +12 -3
  379. package/playground/index.html +823 -0
  380. package/scripts/gen-docs.ts +533 -0
  381. package/scripts/update-redscript-docs-stdlib.sh +770 -0
  382. package/src/__tests__/budget.test.ts +5 -0
  383. package/src/__tests__/cache/cache-behavior.test.ts +480 -0
  384. package/src/__tests__/cache-extra.test.ts +199 -0
  385. package/src/__tests__/cli-docs.test.ts +77 -0
  386. package/src/__tests__/cli-init.test.ts +91 -0
  387. package/src/__tests__/cli-publish.test.ts +190 -0
  388. package/src/__tests__/cli.test.ts +117 -1
  389. package/src/__tests__/compile-preprocess.test.ts +366 -0
  390. package/src/__tests__/compiler/break-stmt.test.ts +66 -0
  391. package/src/__tests__/compiler/const-decl.test.ts +141 -0
  392. package/src/__tests__/compiler/continue-stmt.test.ts +81 -0
  393. package/src/__tests__/compiler/coroutine-extended.test.ts +723 -0
  394. package/src/__tests__/compiler/deprecated.test.ts +305 -0
  395. package/src/__tests__/compiler/do-while.test.ts +130 -0
  396. package/src/__tests__/compiler/enum-payload.test.ts +299 -0
  397. package/src/__tests__/compiler/interface.test.ts +287 -0
  398. package/src/__tests__/compiler/labeled-loops.test.ts +279 -0
  399. package/src/__tests__/compiler/match-string.test.ts +45 -0
  400. package/src/__tests__/compiler/memoize.test.ts +126 -0
  401. package/src/__tests__/compiler/method-chain.test.ts +121 -0
  402. package/src/__tests__/compiler/module-import.test.ts +240 -0
  403. package/src/__tests__/compiler/option-extensions.test.ts +207 -0
  404. package/src/__tests__/compiler/profile-decorator.test.ts +79 -0
  405. package/src/__tests__/compiler/string-advanced.test.ts +310 -0
  406. package/src/__tests__/compiler/struct-extends.test.ts +109 -0
  407. package/src/__tests__/compiler/throttle-retry.test.ts +191 -0
  408. package/src/__tests__/compiler/tuple-type.test.ts +263 -0
  409. package/src/__tests__/compiler/watch-decorator.test.ts +72 -0
  410. package/src/__tests__/config/project-config.test.ts +181 -0
  411. package/src/__tests__/config-decorator.test.ts +157 -0
  412. package/src/__tests__/diagnostics-extra.test.ts +155 -0
  413. package/src/__tests__/emit/compile-branches.test.ts +135 -0
  414. package/src/__tests__/emit/compile-coverage.test.ts +696 -0
  415. package/src/__tests__/emit/compile-extra-branches.test.ts +228 -0
  416. package/src/__tests__/emit/compile-mocked-branches.test.ts +249 -0
  417. package/src/__tests__/emit/compile.test.ts +6 -1
  418. package/src/__tests__/emit/execute-chain.test.ts +114 -0
  419. package/src/__tests__/emit/index.test.ts +2 -1
  420. package/src/__tests__/emit/modules-branches.test.ts +90 -0
  421. package/src/__tests__/emit/modules-coverage.test.ts +241 -0
  422. package/src/__tests__/emit/modules-errors.test.ts +192 -0
  423. package/src/__tests__/emit/modules-rewrite.test.ts +232 -0
  424. package/src/__tests__/emit/source-map.test.ts +152 -0
  425. package/src/__tests__/enum.test.ts +9 -4
  426. package/src/__tests__/error-recovery.test.ts +226 -0
  427. package/src/__tests__/events-types-extra.test.ts +110 -0
  428. package/src/__tests__/events-types.test.ts +66 -0
  429. package/src/__tests__/formatter.test.ts +15 -5
  430. package/src/__tests__/generics.test.ts +16 -9
  431. package/src/__tests__/hir/lower-extra.test.ts +151 -0
  432. package/src/__tests__/hir/monomorphize-coverage.test.ts +432 -0
  433. package/src/__tests__/hir/monomorphize-extra.test.ts +220 -0
  434. package/src/__tests__/hir/monomorphize-extra2.test.ts +350 -0
  435. package/src/__tests__/impl.test.ts +12 -8
  436. package/src/__tests__/incremental.test.ts +10 -2
  437. package/src/__tests__/index-extra.test.ts +79 -0
  438. package/src/__tests__/lexer.test.ts +2 -2
  439. package/src/__tests__/lint/hir-coverage.test.ts +1716 -0
  440. package/src/__tests__/lint/rules-coverage.test.ts +598 -0
  441. package/src/__tests__/lint/rules.test.ts +230 -0
  442. package/src/__tests__/lir/lower.test.ts +33 -0
  443. package/src/__tests__/lir/verify.test.ts +33 -0
  444. package/src/__tests__/lsp/completion.test.ts +687 -0
  445. package/src/__tests__/lsp/definition.test.ts +499 -0
  446. package/src/__tests__/lsp/diagnostics.test.ts +108 -0
  447. package/src/__tests__/lsp/hover-docs.test.ts +222 -0
  448. package/src/__tests__/lsp.test.ts +4 -1
  449. package/src/__tests__/mc-integration/item-entity-events.test.ts +5 -0
  450. package/src/__tests__/mc-integration/stdlib-coverage-2.test.ts +5 -0
  451. package/src/__tests__/mc-integration/stdlib-coverage-3.test.ts +1105 -0
  452. package/src/__tests__/mc-integration/stdlib-coverage-4.test.ts +1366 -0
  453. package/src/__tests__/mc-integration/stdlib-coverage-5.test.ts +1245 -0
  454. package/src/__tests__/mc-integration/stdlib-coverage-6.test.ts +755 -0
  455. package/src/__tests__/mc-integration/stdlib-coverage-7.test.ts +771 -0
  456. package/src/__tests__/mc-integration/stdlib-coverage.test.ts +5 -0
  457. package/src/__tests__/mc-integration/syntax-coverage.test.ts +5 -0
  458. package/src/__tests__/mc-validator-coverage.test.ts +325 -0
  459. package/src/__tests__/mc-validator-extra.test.ts +252 -0
  460. package/src/__tests__/mir/lower-extra.test.ts +402 -0
  461. package/src/__tests__/mir/lower-extra2.test.ts +348 -0
  462. package/src/__tests__/mir/lower-extra3.test.ts +277 -0
  463. package/src/__tests__/mir/lower-extra4.test.ts +636 -0
  464. package/src/__tests__/mir/lower-extra5.test.ts +612 -0
  465. package/src/__tests__/mir/lower-extra6.test.ts +520 -0
  466. package/src/__tests__/mir/lower-extra7.test.ts +1045 -0
  467. package/src/__tests__/mir/lower-extra8.test.ts +704 -0
  468. package/src/__tests__/mir/lower-extra9.test.ts +821 -0
  469. package/src/__tests__/optimizer/auto-inline.test.ts +206 -0
  470. package/src/__tests__/optimizer/cse.test.ts +195 -0
  471. package/src/__tests__/optimizer/inline_fn.test.ts +263 -0
  472. package/src/__tests__/optimizer/licm.test.ts +358 -0
  473. package/src/__tests__/optimizer/nbt-coalesce.test.ts +147 -0
  474. package/src/__tests__/optimizer/optimizer-extended.test.ts +1081 -0
  475. package/src/__tests__/optimizer/scoreboard-batch.test.ts +141 -0
  476. package/src/__tests__/optimizer/strength-reduction.test.ts +111 -0
  477. package/src/__tests__/optimizer/tco-coverage.test.ts +309 -0
  478. package/src/__tests__/optimizer/tco.test.ts +238 -0
  479. package/src/__tests__/option.test.ts +14 -7
  480. package/src/__tests__/parser-coverage.test.ts +576 -0
  481. package/src/__tests__/parser-extra.test.ts +531 -0
  482. package/src/__tests__/parser.test.ts +14 -0
  483. package/src/__tests__/repl-extra.test.ts +195 -0
  484. package/src/__tests__/repl-server-extra.test.ts +150 -0
  485. package/src/__tests__/repl-server.test.ts +122 -0
  486. package/src/__tests__/runtime-extra.test.ts +862 -0
  487. package/src/__tests__/singleton-decorator.test.ts +285 -0
  488. package/src/__tests__/sourcemap.test.ts +1 -1
  489. package/src/__tests__/stdlib/advanced.test.ts +312 -0
  490. package/src/__tests__/stdlib/bigint.test.ts +57 -0
  491. package/src/__tests__/stdlib/bits.test.ts +75 -0
  492. package/src/__tests__/stdlib/bossbar.test.ts +45 -0
  493. package/src/__tests__/stdlib/color.test.ts +60 -0
  494. package/src/__tests__/stdlib/combat.test.ts +35 -0
  495. package/src/__tests__/stdlib/cooldown.test.ts +35 -0
  496. package/src/__tests__/stdlib/dialog.test.ts +14 -6
  497. package/src/__tests__/stdlib/ecs.test.ts +54 -0
  498. package/src/__tests__/stdlib/effects.test.ts +45 -0
  499. package/src/__tests__/stdlib/events.test.ts +23 -0
  500. package/src/__tests__/stdlib/expr.test.ts +48 -0
  501. package/src/__tests__/stdlib/fft.test.ts +54 -0
  502. package/src/__tests__/stdlib/graph.test.ts +77 -0
  503. package/src/__tests__/stdlib/interactions.test.ts +30 -0
  504. package/src/__tests__/stdlib/inventory.test.ts +40 -0
  505. package/src/__tests__/stdlib/linalg.test.ts +52 -0
  506. package/src/__tests__/stdlib/map.test.ts +55 -0
  507. package/src/__tests__/stdlib/math.test.ts +19 -5
  508. package/src/__tests__/stdlib/math_hp.test.ts +55 -0
  509. package/src/__tests__/stdlib/mobs.test.ts +40 -0
  510. package/src/__tests__/stdlib/noise.test.ts +46 -0
  511. package/src/__tests__/stdlib/ode.test.ts +40 -0
  512. package/src/__tests__/stdlib/parabola.test.ts +51 -0
  513. package/src/__tests__/stdlib/particles.test.ts +40 -0
  514. package/src/__tests__/stdlib/physics.test.ts +50 -0
  515. package/src/__tests__/stdlib/player.test.ts +35 -0
  516. package/src/__tests__/stdlib/quaternion.test.ts +46 -0
  517. package/src/__tests__/stdlib/queue.test.ts +73 -0
  518. package/src/__tests__/stdlib/random.test.ts +50 -0
  519. package/src/__tests__/stdlib/result.test.ts +326 -0
  520. package/src/__tests__/stdlib/scheduler.test.ts +18 -7
  521. package/src/__tests__/stdlib/set_int.test.ts +62 -0
  522. package/src/__tests__/stdlib/sets.test.ts +28 -0
  523. package/src/__tests__/stdlib/signal.test.ts +60 -0
  524. package/src/__tests__/stdlib/spawn.test.ts +40 -0
  525. package/src/__tests__/stdlib/string.test.ts +224 -0
  526. package/src/__tests__/stdlib/strings.test.ts +55 -0
  527. package/src/__tests__/stdlib/tags.test.ts +32 -0
  528. package/src/__tests__/stdlib/teams.test.ts +45 -0
  529. package/src/__tests__/stdlib/timer.test.ts +53 -0
  530. package/src/__tests__/stdlib/vec.test.ts +72 -0
  531. package/src/__tests__/stdlib/world.test.ts +45 -0
  532. package/src/__tests__/struct-display.test.ts +69 -0
  533. package/src/__tests__/test-framework/runner.test.ts +208 -0
  534. package/src/__tests__/tuner/adapters.test.ts +232 -0
  535. package/src/__tests__/tuner/simulator-extra.test.ts +222 -0
  536. package/src/__tests__/tuple.test.ts +11 -4
  537. package/src/__tests__/typechecker-coverage.test.ts +671 -0
  538. package/src/__tests__/typechecker.test.ts +4 -3
  539. package/src/__tests__/watch-decorator.test.ts +59 -0
  540. package/src/ast/types.ts +65 -3
  541. package/src/cache/incremental.ts +128 -99
  542. package/src/cache/index.ts +35 -8
  543. package/src/cli.ts +538 -29
  544. package/src/config/project-config.ts +176 -0
  545. package/src/diagnostics/index.ts +22 -0
  546. package/src/docs.ts +98 -0
  547. package/src/emit/compile.ts +408 -51
  548. package/src/emit/index.ts +366 -18
  549. package/src/emit/modules.ts +19 -3
  550. package/src/emit/sourcemap.ts +64 -43
  551. package/src/formatter/index.ts +35 -8
  552. package/src/hir/deprecated.ts +212 -0
  553. package/src/hir/lower.ts +128 -8
  554. package/src/hir/monomorphize.ts +24 -2
  555. package/src/hir/types.ts +26 -1
  556. package/src/index.ts +23 -3
  557. package/src/lexer/index.ts +45 -6
  558. package/src/lint/index.ts +922 -0
  559. package/src/lir/lower.ts +30 -2
  560. package/src/lir/types.ts +4 -0
  561. package/src/lsp/server.ts +100 -1
  562. package/src/mir/lower.ts +785 -40
  563. package/src/mir/macro.ts +30 -2
  564. package/src/mir/types.ts +13 -0
  565. package/src/mir/verify.ts +10 -2
  566. package/src/optimizer/auto-inline.ts +86 -0
  567. package/src/optimizer/copy_prop.ts +2 -2
  568. package/src/optimizer/coroutine.ts +3 -3
  569. package/src/optimizer/cse.ts +205 -0
  570. package/src/optimizer/dce.ts +2 -2
  571. package/src/optimizer/inline.ts +335 -0
  572. package/src/optimizer/interprocedural.ts +5 -1
  573. package/src/optimizer/licm.ts +454 -0
  574. package/src/optimizer/nbt-coalesce.ts +109 -0
  575. package/src/optimizer/pipeline.ts +16 -2
  576. package/src/optimizer/scoreboard-batch.ts +52 -0
  577. package/src/optimizer/strength_reduction.ts +95 -0
  578. package/src/optimizer/tco.ts +267 -0
  579. package/src/optimizer/unroll.ts +2 -2
  580. package/src/parser/index.ts +426 -53
  581. package/src/repl-server.ts +102 -0
  582. package/src/stdlib/advanced.mcrs +271 -101
  583. package/src/stdlib/bigint.mcrs +97 -11
  584. package/src/stdlib/bits.mcrs +75 -12
  585. package/src/stdlib/bossbar.mcrs +37 -8
  586. package/src/stdlib/calculus.mcrs +82 -26
  587. package/src/stdlib/color.mcrs +98 -16
  588. package/src/stdlib/combat.mcrs +23 -5
  589. package/src/stdlib/cooldown.mcrs +19 -0
  590. package/src/stdlib/dialog.mcrs +45 -7
  591. package/src/stdlib/easing.mcrs +132 -12
  592. package/src/stdlib/ecs.mcrs +142 -25
  593. package/src/stdlib/effects.mcrs +88 -12
  594. package/src/stdlib/events.mcrs +21 -2
  595. package/src/stdlib/expr.mcrs +18 -3
  596. package/src/stdlib/fft.mcrs +66 -56
  597. package/src/stdlib/geometry.mcrs +137 -39
  598. package/src/stdlib/graph.mcrs +73 -0
  599. package/src/stdlib/heap.mcrs +49 -8
  600. package/src/stdlib/i18n/zh.yaml +2891 -0
  601. package/src/stdlib/interactions.mcrs +43 -20
  602. package/src/stdlib/inventory.mcrs +14 -3
  603. package/src/stdlib/linalg.mcrs +185 -30
  604. package/src/stdlib/list.mcrs +168 -18
  605. package/src/stdlib/map.mcrs +112 -0
  606. package/src/stdlib/math.mcrs +68 -18
  607. package/src/stdlib/math_hp.mcrs +124 -33
  608. package/src/stdlib/matrix.mcrs +133 -20
  609. package/src/stdlib/mobs.mcrs +87 -0
  610. package/src/stdlib/noise.mcrs +65 -21
  611. package/src/stdlib/ode.mcrs +96 -0
  612. package/src/stdlib/parabola.mcrs +104 -29
  613. package/src/stdlib/particles.mcrs +78 -21
  614. package/src/stdlib/pathfind.mcrs +89 -35
  615. package/src/stdlib/physics.mcrs +134 -26
  616. package/src/stdlib/player.mcrs +18 -0
  617. package/src/stdlib/quaternion.mcrs +213 -9
  618. package/src/stdlib/queue.mcrs +123 -0
  619. package/src/stdlib/random.mcrs +63 -18
  620. package/src/stdlib/result.mcrs +111 -0
  621. package/src/stdlib/scheduler.mcrs +59 -10
  622. package/src/stdlib/set_int.mcrs +240 -0
  623. package/src/stdlib/sets.mcrs +49 -19
  624. package/src/stdlib/signal.mcrs +151 -79
  625. package/src/stdlib/sort.mcrs +44 -24
  626. package/src/stdlib/spawn.mcrs +30 -7
  627. package/src/stdlib/state.mcrs +40 -5
  628. package/src/stdlib/strings.mcrs +131 -3
  629. package/src/stdlib/tags.mcrs +2 -2
  630. package/src/stdlib/teams.mcrs +22 -10
  631. package/src/stdlib/timer.mcrs +36 -6
  632. package/src/stdlib/vec.mcrs +44 -9
  633. package/src/stdlib/world.mcrs +57 -25
  634. package/src/structs/expand.ts +64 -0
  635. package/src/testing/runner.ts +271 -0
  636. package/src/typechecker/index.ts +273 -9
@@ -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
- // projectile_pos(p0, v0, t): position after t ticks with initial velocity v0
21
- // p0, v0: ×100 (blocks × 100), t: ticks
22
- // No drag, constant gravity
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
- // projectile_vy(v0, t): Y velocity after t ticks (with gravity)
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
- // projectile_land_t(v0y): approximate tick when Y returns to 0
37
- // t = 2*v0y / gravity
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
- // projectile_max_height(v0y): maximum height reached ×100
44
- // h = v0y² / (2*gravity)
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
- // apply_drag(v_fx, drag_fx): apply drag to velocity
52
- // v_fx: velocity ×100, drag_fx: drag factor ×10000
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
- // apply_gravity(vy_fx): apply one tick of gravity to Y velocity
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
- // update_pos(p_fx, v_fx): update position by one tick
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
- // bounce_v(v_fx, restitution_fx): reflect velocity with energy loss
70
- // restitution_fx ×10000: 10000=elastic, 5000=half energy, 0=inelastic
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
- // clamp_velocity(v_fx, max_fx): clamp speed to max
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
- // spring_force(pos_fx, target_fx, k_fx): Hooke's law F = -k(x - target)
86
- // k_fx: spring constant ×10000
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
- // spring_update_v(v_fx, pos_fx, target_fx, k_fx, damping_fx):
92
- // update velocity with spring force and damping
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
- // circular_x(cx, r, angle_deg): X position on circle
102
- // cx: center X ×100, r: radius ×100, angle_deg: degrees (NOT ×10000)
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
- // friction_decel(v_fx, friction_fx): reduce velocity toward zero by friction
114
- // friction_fx ×100: amount subtracted per tick (absolute)
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
- // is_grounded(y_fx, ground_y_fx): returns 1 if at or below ground
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
- // impact_velocity(h_fx): velocity after falling from height h (blocks ×100)
130
- // v = sqrt(2*g*h), approximated
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;
@@ -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
- // quat_identity: returns W component of identity quaternion (x=y=z=0, w=1)
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
- // quat_from_axis_x: rotation around X axis by angle degrees
24
- // sin_fixed/cos_fixed return ×1000; we scale to ×10000 by multiplying by 10
25
- // angle_deg: degrees (integer)
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
- // quat_from_axis_y: rotation around Y axis
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
- // quat_from_axis_z: rotation around Z axis
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
- // ─── Magnitude squared ×10000 ─────────────────────────────────────────────────
74
- // For unit quaternion: should equal 10000 (= 1.0 in ×10000 scale)
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
- // ─── Dot product ×10000 ──────────────────────────────────────────────────────
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;