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
@@ -19,8 +19,15 @@ module library
19
19
 
20
20
  // ─── Insertion sort (ascending) ───────────────────────────────────────────────
21
21
 
22
- // insertion_sort(arr, len): sort arr[0..len-1] ascending in-place
23
- // Time: O(n²); excellent for small n (≤64) and nearly-sorted data
22
+ /// Sort an integer array ascending in-place using insertion sort.
23
+ /// @since 1.0.0
24
+ /// @param arr Integer array to sort (mutated in-place)
25
+ /// @param len Number of elements to sort (arr[0..len-1])
26
+ /// @returns void — arr is sorted ascending after this call
27
+ /// @example
28
+ /// let data: int[] = [30, 10, 50, 20]
29
+ /// insertion_sort(data, 4)
30
+ /// // data is now [10, 20, 30, 50]
24
31
  fn insertion_sort(arr: int[], len: int) {
25
32
  let i: int = 1
26
33
  while (i < len) {
@@ -46,7 +53,15 @@ fn insertion_sort(arr: int[], len: int) {
46
53
 
47
54
  // ─── Insertion sort (descending) ──────────────────────────────────────────────
48
55
 
49
- // insertion_sort_desc(arr, len): sort arr[0..len-1] descending in-place
56
+ /// Sort an integer array descending in-place using insertion sort.
57
+ /// @since 1.0.0
58
+ /// @param arr Integer array to sort (mutated in-place)
59
+ /// @param len Number of elements to sort (arr[0..len-1])
60
+ /// @returns void — arr is sorted descending after this call
61
+ /// @example
62
+ /// let scores: int[] = [30, 10, 50, 20]
63
+ /// insertion_sort_desc(scores, 4)
64
+ /// // scores is now [50, 30, 20, 10]
50
65
  fn insertion_sort_desc(arr: int[], len: int) {
51
66
  let i: int = 1
52
67
  while (i < len) {
@@ -72,9 +87,16 @@ fn insertion_sort_desc(arr: int[], len: int) {
72
87
 
73
88
  // ─── Merge two sorted arrays ──────────────────────────────────────────────────
74
89
 
75
- // sort_merge(a, la, b, lb): merge sorted a[0..la-1] and b[0..lb-1]
76
- // Returns a new sorted int[] of length la+lb
77
- // Useful as the merge step of merge sort when caller handles recursion manually
90
+ /// Merge two sorted integer arrays into a new sorted array.
91
+ /// @since 1.0.0
92
+ /// @param a First sorted array
93
+ /// @param la Number of elements in a (a[0..la-1])
94
+ /// @param b Second sorted array
95
+ /// @param lb Number of elements in b (b[0..lb-1])
96
+ /// @returns New sorted int[] of length la+lb containing all elements of a and b
97
+ /// @example
98
+ /// let merged: int[] = sort_merge([1, 3, 5], 3, [2, 4, 6], 3)
99
+ /// // result: [1, 2, 3, 4, 5, 6]
78
100
  fn sort_merge(a: int[], la: int, b: int[], lb: int): int[] {
79
101
  let result: int[] = []
80
102
  let i: int = 0
@@ -111,22 +133,15 @@ fn sort_merge(a: int[], la: int, b: int[], lb: int): int[] {
111
133
 
112
134
  // ─── Coroutine merge sort (bottom-up, iterative) ──────────────────────────────
113
135
 
114
- // merge_sort_coro(arr, n): sort arr[0..n-1] ascending in-place using bottom-up
115
- // merge sort, spread across server ticks via @coroutine.
116
- //
117
- // Each coroutine tick completes one full merge pass (doubling the sorted width).
118
- // After log₂(n) ticks, arr is fully sorted.
119
- //
120
- // @coroutine(onDone=merge_sort_noop) replace onDone with your handler if you
121
- // need a callback once sorting is complete.
122
- //
123
- // Complexity: O(n log n) time, O(n) scratch space (temp[] for each merge pass).
124
- //
125
- // Usage:
126
- // let data: int[] = [30, 10, 50, 20, 40]
127
- // merge_sort_coro(data, 5)
128
- // // several ticks later, data is [10, 20, 30, 40, 50]
129
-
136
+ /// Sort an array ascending using bottom-up merge sort, spread across server ticks.
137
+ /// @since 1.0.0
138
+ /// @param arr Integer array to sort (mutated in-place)
139
+ /// @param n Number of elements in arr
140
+ /// @returns void — arr is sorted after ceil(log₂(n)) ticks; onDone fires when complete
141
+ /// @example
142
+ /// let data: int[] = [30, 10, 50, 20, 40]
143
+ /// merge_sort_coro(data, 5)
144
+ /// // several ticks later, data is [10, 20, 30, 40, 50]
130
145
  // @coroutine(batch=1) spreads the outer width-doubling loop: 1 pass per tick.
131
146
  // Each tick completes all merges for the current width, then doubles width.
132
147
  // After ceil(log₂(n)) ticks, onDone fires and arr is fully sorted.
@@ -148,6 +163,7 @@ fn merge_sort_coro(arr: int[], n: int) {
148
163
  // via a temporary scratch array
149
164
  if (mid < right) {
150
165
  let tmp: int[] = []
166
+ let tlen: int = 0
151
167
  let ia: int = left
152
168
  let ib: int = mid
153
169
  let merging: int = 1
@@ -156,18 +172,22 @@ fn merge_sort_coro(arr: int[], n: int) {
156
172
  if (ib < right) {
157
173
  if (arr[ia] <= arr[ib]) {
158
174
  tmp.push(arr[ia])
175
+ tlen = tlen + 1
159
176
  ia = ia + 1
160
177
  } else {
161
178
  tmp.push(arr[ib])
179
+ tlen = tlen + 1
162
180
  ib = ib + 1
163
181
  }
164
182
  } else {
165
183
  tmp.push(arr[ia])
184
+ tlen = tlen + 1
166
185
  ia = ia + 1
167
186
  }
168
187
  } else {
169
188
  if (ib < right) {
170
189
  tmp.push(arr[ib])
190
+ tlen = tlen + 1
171
191
  ib = ib + 1
172
192
  } else {
173
193
  merging = 0
@@ -176,7 +196,6 @@ fn merge_sort_coro(arr: int[], n: int) {
176
196
  }
177
197
  // Write merged tmp back into arr[left..right)
178
198
  let ti: int = 0
179
- let tlen: int = tmp.len()
180
199
  while (ti < tlen) {
181
200
  arr[left + ti] = tmp[ti]
182
201
  ti = ti + 1
@@ -190,5 +209,6 @@ fn merge_sort_coro(arr: int[], n: int) {
190
209
  }
191
210
  }
192
211
 
193
- // merge_sort_noop: default onDone callback replace with your own handler
212
+ /// Default no-op callback for merge_sort_coro. Replace with your own handler to react when sorting completes.
213
+ /// @since 1.0.0
194
214
  fn merge_sort_noop() {}
@@ -1,40 +1,63 @@
1
1
  // Spawn point and teleport helpers
2
2
  // Usage: import "stdlib/spawn.mcrs"
3
3
 
4
- /// Teleport player to coordinates
4
+ /// Teleports the target selector to fixed world coordinates.
5
+ /// @param target Target selector to move
6
+ /// @param x Destination X coordinate
7
+ /// @param y Destination Y coordinate
8
+ /// @param z Destination Z coordinate
9
+ /// @example
10
+ /// teleport_to(@p, 0, 64, 0)
5
11
  fn teleport_to(target: selector, x: int, y: int, z: int) {
6
12
  tp(target, x, y, z);
7
13
  }
8
14
 
9
- /// Teleport player to another entity
15
+ /// Teleports the target selector to another entity.
16
+ /// @param target Selector to teleport
17
+ /// @param dest Selector whose current position is used as the destination
10
18
  fn teleport_to_entity(target: selector, dest: selector) {
11
19
  tp(target, dest);
12
20
  }
13
21
 
14
- /// Spread players randomly in area
22
+ /// Placeholder helper for spreading all players randomly in an area.
23
+ /// The raw `spreadplayers` command is noted here but not emitted yet.
24
+ /// Current behavior only broadcasts a status message.
25
+ /// @param x Center X coordinate
26
+ /// @param z Center Z coordinate
27
+ /// @param radius Maximum spread radius in blocks
15
28
  fn spread_players(x: int, z: int, radius: int) {
16
29
  // Use raw command for spreadplayers
17
30
  // spreadplayers(x, z, 0, radius, false, @a);
18
31
  say("Spreading players...");
19
32
  }
20
33
 
21
- /// Teleport all players to one location
34
+ /// Teleports all players to one location.
35
+ /// @param x Destination X coordinate
36
+ /// @param y Destination Y coordinate
37
+ /// @param z Destination Z coordinate
22
38
  fn gather_all(x: int, y: int, z: int) {
23
39
  tp(@a, x, y, z);
24
40
  }
25
41
 
26
- /// Teleport player up (for launching)
42
+ /// Teleports the target upward relative to its current position.
43
+ /// Useful for launch pads or scripted knock-up effects.
44
+ /// @param target Selector to move
45
+ /// @param height Relative Y offset in blocks
27
46
  fn launch_up(target: selector, height: int) {
28
47
  tp(target, ~0, ~height, ~0);
29
48
  }
30
49
 
31
- /// Teleport to lobby (customize coordinates)
50
+ /// Teleports the target to the hard-coded lobby position.
51
+ /// This helper also shows a welcome title and should be customized per map.
52
+ /// @param target Selector to move to the lobby
32
53
  fn goto_lobby(target: selector) {
33
54
  tp(target, 0, 64, 0);
34
55
  title(target, "Welcome to Lobby!");
35
56
  }
36
57
 
37
- /// Teleport to arena (customize coordinates)
58
+ /// Teleports the target to the hard-coded arena position.
59
+ /// This helper also shows a fight title and should be customized per map.
60
+ /// @param target Selector to move to the arena
38
61
  fn goto_arena(target: selector) {
39
62
  tp(target, 100, 64, 100);
40
63
  title(target, "Fight!");
@@ -23,19 +23,39 @@
23
23
  module library
24
24
 
25
25
  /// Read the current state of an entity.
26
- /// Returns -1 if the entity has not been initialised (score is 0 = unset in MC,
27
- /// but we reserve -1 as the sentinel for "never set via init_state").
26
+ ///
27
+ /// Returns `-1` if the entity has not been initialised (score is 0 = unset in
28
+ /// Minecraft, but we reserve `-1` as the sentinel for "never set via
29
+ /// `init_state`").
30
+ ///
31
+ /// @since 1.0.0
32
+ /// @param entity Selector for the target entity
33
+ /// @returns Current state value stored in `rs.state`, or `-1` if unset
34
+ /// @example
35
+ /// let s: int = get_state(@s)
28
36
  fn get_state(entity: selector) -> int {
29
37
  return scoreboard_get(entity, "rs.state");
30
38
  }
31
39
 
32
40
  /// Write a state value to an entity.
41
+ ///
42
+ /// @since 1.0.0
43
+ /// @param entity Selector for the target entity
44
+ /// @param state Integer state constant to write
45
+ /// @example
46
+ /// set_state(@s, 1)
33
47
  fn set_state(entity: selector, state: int) {
34
48
  scoreboard_set(entity, "rs.state", state);
35
49
  }
36
50
 
37
51
  /// Check whether an entity is currently in the given state.
38
- /// Returns 1 if yes, 0 if no.
52
+ ///
53
+ /// @since 1.0.0
54
+ /// @param entity Selector for the target entity
55
+ /// @param state Integer state constant to compare against
56
+ /// @returns `1` if the entity is in `state`, `0` otherwise
57
+ /// @example
58
+ /// if (is_state(@s, STATE_COMBAT) == 1) { /* per-tick combat logic */ }
39
59
  fn is_state(entity: selector, state: int) -> int {
40
60
  let cur: int = get_state(entity);
41
61
  if (cur == state) {
@@ -45,7 +65,14 @@ fn is_state(entity: selector, state: int) -> int {
45
65
  }
46
66
 
47
67
  /// Initialise an entity's state only if it has not been set yet (score == -1).
48
- /// Call once on spawn / load to avoid overwriting an in-progress state.
68
+ ///
69
+ /// Call once on spawn or load to avoid overwriting an in-progress state.
70
+ ///
71
+ /// @since 1.0.0
72
+ /// @param entity Selector for the target entity
73
+ /// @param initial State constant to write when the entity is uninitialised
74
+ /// @example
75
+ /// init_state(@s, STATE_IDLE)
49
76
  fn init_state(entity: selector, initial: int) {
50
77
  let cur: int = get_state(entity);
51
78
  if (cur == -1) {
@@ -54,8 +81,16 @@ fn init_state(entity: selector, initial: int) {
54
81
  }
55
82
 
56
83
  /// Attempt a guarded transition from `from` to `to`.
84
+ ///
57
85
  /// Only performs the transition when the entity is currently in `from`.
58
- /// Returns 1 on success, 0 if the entity was not in `from`.
86
+ ///
87
+ /// @since 1.0.0
88
+ /// @param entity Selector for the target entity
89
+ /// @param from Required current state
90
+ /// @param to State to transition into
91
+ /// @returns `1` on success, `0` if the entity was not in `from`
92
+ /// @example
93
+ /// let ok: int = transition(@s, STATE_IDLE, STATE_COMBAT)
59
94
  fn transition(entity: selector, from: int, to: int) -> int {
60
95
  if (is_state(entity, from) == 1) {
61
96
  set_state(entity, to);
@@ -1,7 +1,135 @@
1
- // String helpers for RedScript datapacks.
2
- // Runtime string manipulation is still limited; `str_len` is compiler-assisted
3
- // and lowers to `data get storage rs:strings ...` for literal-backed strings.
1
+ // strings.mcrs — String manipulation helpers for RedScript datapacks.
2
+ //
3
+ // ## MC 1.21.4 String Model
4
+ //
5
+ // Runtime string operations work via NBT storage (rs:strings).
6
+ // Strings must be pre-written into rs:strings storage before calling
7
+ // these functions. The storage layout convention is:
8
+ //
9
+ // rs:strings { A: "...", B: "...", Result: "..." }
10
+ //
11
+ // The string parameters accepted by these functions represent the
12
+ // NBT field name (key) within rs:strings, e.g. passing "A" means
13
+ // the string is stored at `rs:strings.A`.
14
+ //
15
+ // ## Feasibility Summary (MC 1.21.4)
16
+ //
17
+ // str_len — PARTIAL: returns 1 for plain string NBT tags.
18
+ // For true length, strings must be stored as char-lists.
19
+ // str_concat — PARTIAL: produces an NBT list [A, B] usable in tellraw.
20
+ // Single concatenated string requires a macro helper.
21
+ // str_contains — NOT FEASIBLE natively (no substring search command).
22
+ // Always returns 0; workaround described in docs.
23
+ // str_slice — FEASIBLE via `data modify ... set string` (MC 1.20.2+).
4
24
 
25
+ module library;
26
+
27
+ // ─── str_len ──────────────────────────────────────────────────────────────────
28
+
29
+ /// Returns the length of the string stored at rs:strings.{s}.
30
+ ///
31
+ /// LIMITATION (MC 1.21.4): `execute store result score ... run data get storage`
32
+ /// returns 1 for any plain string NBT tag, not the character count. To get a
33
+ /// true character count, the string must be stored as an NBT list of single-char
34
+ /// strings (e.g. ["h","e","l","l","o"]), in which case data_get returns the list
35
+ /// length correctly.
36
+ ///
37
+ /// For literal strings whose length is known at compile time, prefer using
38
+ /// the constant directly — the compiler will fold it.
39
+ ///
40
+ /// @since 1.0.0
41
+ /// @param s NBT field name in rs:strings (e.g. "A")
42
+ /// @returns 1 for plain string tags; list element count for char-list strings.
43
+ /// @example
44
+ /// str_len("A") // result: 1 (plain string) or char count (char-list)
5
45
  fn str_len(s: string) -> int {
46
+ return data_get("storage", "rs:strings", s);
47
+ }
48
+
49
+ // ─── str_concat ───────────────────────────────────────────────────────────────
50
+
51
+ /// Concatenates two strings from rs:strings and writes the result to
52
+ /// rs:strings.Result as an NBT list [a_value, b_value].
53
+ ///
54
+ /// The result list is suitable for use in tellraw JSON text components:
55
+ /// tellraw @a {"nbt":"Result","storage":"rs:strings","interpret":false}
56
+ ///
57
+ /// LIMITATION (MC 1.21.4): MC has no native string concatenation command.
58
+ /// Single-string concatenation (e.g. "ab" from "a"+"b") requires a
59
+ /// recursive macro helper function; this is out of scope for a pure stdlib.
60
+ /// The NBT list representation works for display (tellraw) but cannot be
61
+ /// passed back to further string operations without conversion.
62
+ ///
63
+ /// ALTERNATIVE for display: use a tellraw JSON array directly:
64
+ /// tellraw @a [{"storage":"rs:strings","nbt":"A"},{"storage":"rs:strings","nbt":"B"}]
65
+ ///
66
+ /// @since 1.0.0
67
+ /// @param a NBT field name of the first string in rs:strings (e.g. "A")
68
+ /// @param b NBT field name of the second string in rs:strings (e.g. "B")
69
+ /// @returns rs:strings.Result is set to an NBT list [valueA, valueB]
70
+ /// @example
71
+ /// str_concat("A", "B") // rs:strings.Result = ["hello", "world"]
72
+ fn str_concat(a: string, b: string) {
73
+ // Initialise Result as an empty list
74
+ raw("data modify storage rs:strings Result set value []");
75
+ // Append both strings as list elements (order-preserving concat)
76
+ raw("data modify storage rs:strings Result append from storage rs:strings {a}");
77
+ raw("data modify storage rs:strings Result append from storage rs:strings {b}");
78
+ }
79
+
80
+ // ─── str_contains ─────────────────────────────────────────────────────────────
81
+
82
+ /// Checks whether the string at rs:strings.{s} contains the substring at
83
+ /// rs:strings.{sub}. Returns 1 if found, 0 if not found.
84
+ ///
85
+ /// NOT FEASIBLE (MC 1.21.4): Minecraft datapacks do not provide a native
86
+ /// substring search command. There is no `execute if data` form that tests
87
+ /// whether one string is contained within another.
88
+ ///
89
+ /// THIS FUNCTION ALWAYS RETURNS 0.
90
+ ///
91
+ /// WORKAROUNDS for datapack authors:
92
+ /// 1. If sub is a compile-time constant and the check position is known,
93
+ /// use str_slice to extract a window and compare via scoreboard.
94
+ /// 2. Pre-process strings server-side and store a presence flag in NBT.
95
+ /// 3. Use a macro function (MC 1.20.2+) that iterates over character
96
+ /// positions with `$(var)` substitution and returns early on match.
97
+ ///
98
+ /// @since 1.0.0
99
+ /// @param s NBT field name of the haystack string in rs:strings
100
+ /// @param sub NBT field name of the needle string in rs:strings
101
+ /// @returns 0 (always — not implemented due to MC limitation)
102
+ fn str_contains(s: string, sub: string) -> int {
103
+ // NOT FEASIBLE in MC 1.21.4: no native substring search.
104
+ // Returns 0 as a safe default. See workaround section in docs above.
6
105
  return 0;
7
106
  }
107
+
108
+ // ─── str_slice ────────────────────────────────────────────────────────────────
109
+
110
+ /// Extracts a substring from rs:strings.{s} and writes it to rs:strings.Result.
111
+ /// Uses the MC 1.20.2+ `data modify ... set string ... start end` feature.
112
+ ///
113
+ /// Indices follow Java/Python slicing semantics:
114
+ /// - start is inclusive, 0-based.
115
+ /// - end is exclusive (end = start + length).
116
+ /// - Negative end counts from the end of the string (e.g. -1 = all but last char).
117
+ /// - Omitting end (use a very large positive int like 999999) copies to end of string.
118
+ ///
119
+ /// Examples:
120
+ /// str_slice("A", 0, 5) → first 5 characters of rs:strings.A
121
+ /// str_slice("A", 2, -1) → all but first 2 and last 1 characters
122
+ ///
123
+ /// @since 2.2.0
124
+ /// @param s NBT field name of the source string in rs:strings (e.g. "A")
125
+ /// @param start Start index (inclusive, 0-based)
126
+ /// @param end End index (exclusive); negative counts from string end
127
+ /// @returns rs:strings.Result contains the extracted substring
128
+ /// @example
129
+ /// str_slice("A", 0, 5) // first 5 chars of rs:strings.A
130
+ /// str_slice("A", 2, -1) // drop first 2 and last 1 chars
131
+ fn str_slice(s: string, start: int, end: int) {
132
+ // MC 1.20.2+ set-string command: copies a substring of the source string.
133
+ // {s}, {start}, {end} are interpolated by the RedScript compiler.
134
+ raw("data modify storage rs:strings Result set string storage rs:strings {s} {start} {end}");
135
+ }
@@ -1,5 +1,5 @@
1
- // Minecraft Java Edition tag constants generated from the Minecraft Fandom Tag page.
2
- // Covers Java Edition block, entity type, item, fluid, and damage type tags listed on the page.
1
+ /// Minecraft Java Edition tag constants generated from the Minecraft Fandom tag page.
2
+ /// Covers block, entity type, item, fluid, and damage type tags.
3
3
 
4
4
  // ===== BLOCK TAGS =====
5
5
 
@@ -1,57 +1,68 @@
1
1
  // Team management helpers
2
2
  // Usage: import "stdlib/teams.mcrs"
3
3
 
4
- /// Create a team with color
4
+ /// Creates a team and applies a display color.
5
+ /// @param name Team name used by the scoreboard team system
6
+ /// @param color Minecraft team color string such as `red` or `blue`
7
+ /// @example
8
+ /// create_team("spectator", "gray")
5
9
  fn create_team(name: string, color: string) {
6
10
  team_add(name);
7
11
  team_option(name, "color", color);
8
12
  }
9
13
 
10
- /// Create red team
14
+ /// Creates the standard red team with friendly fire disabled.
15
+ /// @example
16
+ /// create_red_team()
11
17
  fn create_red_team() {
12
18
  team_add("red");
13
19
  team_option("red", "color", "red");
14
20
  team_option("red", "friendlyFire", "false");
15
21
  }
16
22
 
17
- /// Create blue team
23
+ /// Creates the standard blue team with friendly fire disabled.
18
24
  fn create_blue_team() {
19
25
  team_add("blue");
20
26
  team_option("blue", "color", "blue");
21
27
  team_option("blue", "friendlyFire", "false");
22
28
  }
23
29
 
24
- /// Create green team
30
+ /// Creates the standard green team with friendly fire disabled.
25
31
  fn create_green_team() {
26
32
  team_add("green");
27
33
  team_option("green", "color", "green");
28
34
  team_option("green", "friendlyFire", "false");
29
35
  }
30
36
 
31
- /// Create yellow team
37
+ /// Creates the standard yellow team with friendly fire disabled.
32
38
  fn create_yellow_team() {
33
39
  team_add("yellow");
34
40
  team_option("yellow", "color", "yellow");
35
41
  team_option("yellow", "friendlyFire", "false");
36
42
  }
37
43
 
38
- /// Add player to team
44
+ /// Adds an entity or player selector to a team.
45
+ /// @param target Target selector to join the team
46
+ /// @param team_name Existing team name
39
47
  fn add_to_team(target: selector, team_name: string) {
40
48
  team_join(target, team_name);
41
49
  }
42
50
 
43
- /// Remove player from all teams
51
+ /// Removes an entity or player selector from all teams.
52
+ /// @param target Target selector to remove from teams
44
53
  fn remove_from_teams(target: selector) {
45
54
  team_leave(target);
46
55
  }
47
56
 
48
- /// Setup standard 2-team game
57
+ /// Creates the default two-team setup used by many arena games.
58
+ /// This creates `red` and `blue`.
49
59
  fn setup_two_teams() {
50
60
  create_red_team();
51
61
  create_blue_team();
52
62
  }
53
63
 
54
- /// Setup 4-team game
64
+ /// Creates the default four-team setup.
65
+ /// This creates `red`, `blue`, `green`, and `yellow`.
55
66
  fn setup_four_teams() {
56
67
  create_red_team();
57
68
  create_blue_team();
@@ -59,7 +70,8 @@ fn setup_four_teams() {
59
70
  create_yellow_team();
60
71
  }
61
72
 
62
- /// Cleanup all teams
73
+ /// Removes the default team set created by this module.
74
+ /// Safe to call during cleanup even if some teams were unused.
63
75
  fn cleanup_teams() {
64
76
  team_remove("red");
65
77
  team_remove("blue");
@@ -78,32 +78,62 @@ impl Timer {
78
78
 
79
79
  // ─── Tick-based stopwatch ─────────────────────────────────────────────────────
80
80
 
81
- // tick_to_seconds(ticks): convert MC ticks to seconds (20 ticks = 1 second)
81
+ /// Convert Minecraft ticks to whole seconds (20 ticks = 1 second).
82
+ /// @since 1.0.0
83
+ /// @param ticks Elapsed ticks
84
+ /// @returns ticks / 20
85
+ /// @example
86
+ /// let s = tick_to_seconds(100) // result: 5
82
87
  fn tick_to_seconds(ticks: int): int {
83
88
  return ticks / 20;
84
89
  }
85
90
 
86
- // tick_to_ms(ticks): convert ticks to milliseconds
91
+ /// Convert Minecraft ticks to milliseconds (1 tick = 50 ms).
92
+ /// @since 1.0.0
93
+ /// @param ticks Elapsed ticks
94
+ /// @returns ticks * 50
95
+ /// @example
96
+ /// let ms = tick_to_ms(20) // result: 1000
87
97
  fn tick_to_ms(ticks: int): int {
88
98
  return ticks * 50;
89
99
  }
90
100
 
91
- // seconds_to_ticks(s): convert seconds to ticks
101
+ /// Convert seconds to Minecraft ticks (1 second = 20 ticks).
102
+ /// @since 1.0.0
103
+ /// @param s Seconds
104
+ /// @returns s * 20
105
+ /// @example
106
+ /// let t = seconds_to_ticks(5) // result: 100
92
107
  fn seconds_to_ticks(s: int): int {
93
108
  return s * 20;
94
109
  }
95
110
 
96
- // format_time_s(ticks): ticks → seconds component (mod 60)
111
+ /// Extract seconds component from a tick count (0-59).
112
+ /// @since 1.0.0
113
+ /// @param ticks Elapsed ticks
114
+ /// @returns (ticks / 20) % 60
115
+ /// @example
116
+ /// let s = format_time_s(1500) // result: 15 (75 seconds mod 60)
97
117
  fn format_time_s(ticks: int): int {
98
118
  return (ticks / 20) % 60;
99
119
  }
100
120
 
101
- // format_time_m(ticks): ticks minutes component
121
+ /// Extract minutes component from a tick count (0-59).
122
+ /// @since 1.0.0
123
+ /// @param ticks Elapsed ticks
124
+ /// @returns (ticks / 1200) % 60
125
+ /// @example
126
+ /// let m = format_time_m(72000) // result: 0 (1 hour)
102
127
  fn format_time_m(ticks: int): int {
103
128
  return (ticks / 1200) % 60;
104
129
  }
105
130
 
106
- // format_time_h(ticks): ticks hours component
131
+ /// Extract hours component from a tick count.
132
+ /// @since 1.0.0
133
+ /// @param ticks Elapsed ticks
134
+ /// @returns ticks / 72000
135
+ /// @example
136
+ /// let h = format_time_h(144000) // result: 2
107
137
  fn format_time_h(ticks: int): int {
108
138
  return ticks / 72000;
109
139
  }