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