redscript-mc 3.0.1 → 3.0.2

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 (225) hide show
  1. package/.github/workflows/ci.yml +1 -0
  2. package/README.md +119 -313
  3. package/README.zh.md +118 -314
  4. package/ROADMAP.md +5 -5
  5. package/dist/data/impl_test/function/counter/get.mcfunction +5 -0
  6. package/dist/data/impl_test/function/counter/inc.mcfunction +7 -0
  7. package/dist/data/impl_test/function/counter/new.mcfunction +4 -0
  8. package/dist/data/impl_test/function/load.mcfunction +1 -0
  9. package/dist/data/impl_test/function/test_impl.mcfunction +10 -0
  10. package/dist/data/minecraft/tags/function/load.json +5 -0
  11. package/dist/data/playground/function/load.mcfunction +1 -0
  12. package/dist/data/playground/function/start.mcfunction +4 -0
  13. package/dist/data/playground/function/start__say_macro_t1.mcfunction +1 -0
  14. package/dist/data/playground/function/stop.mcfunction +5 -0
  15. package/dist/data/playground/function/stop__say_macro_t0.mcfunction +1 -0
  16. package/dist/data/stdlib_queue8_test/function/__queue_append_apply.mcfunction +4 -0
  17. package/dist/data/stdlib_queue8_test/function/__queue_peek_apply.mcfunction +4 -0
  18. package/dist/data/stdlib_queue8_test/function/__queue_size_raw_apply.mcfunction +4 -0
  19. package/dist/data/stdlib_queue8_test/function/load.mcfunction +1 -0
  20. package/dist/data/stdlib_queue8_test/function/queue_clear.mcfunction +6 -0
  21. package/dist/data/stdlib_queue8_test/function/queue_empty__merge_1.mcfunction +5 -0
  22. package/dist/data/stdlib_queue8_test/function/queue_empty__then_0.mcfunction +5 -0
  23. package/dist/data/stdlib_queue8_test/function/queue_peek__merge_1.mcfunction +13 -0
  24. package/dist/data/stdlib_queue8_test/function/queue_peek__then_0.mcfunction +5 -0
  25. package/dist/data/stdlib_queue8_test/function/queue_pop__merge_1.mcfunction +15 -0
  26. package/dist/data/stdlib_queue8_test/function/queue_pop__then_0.mcfunction +5 -0
  27. package/dist/data/stdlib_queue8_test/function/queue_push__const_11.mcfunction +6 -0
  28. package/dist/data/stdlib_queue8_test/function/queue_push__const_22.mcfunction +6 -0
  29. package/dist/data/stdlib_queue8_test/function/queue_size.mcfunction +13 -0
  30. package/dist/data/stdlib_queue8_test/function/test_queue_push_and_size.mcfunction +13 -0
  31. package/dist/data/test/function/load.mcfunction +1 -0
  32. package/dist/data/test/function/say_at.mcfunction +6 -0
  33. package/dist/data/test/function/test.mcfunction +4 -0
  34. package/dist/pack.mcmeta +6 -0
  35. package/dist/package.json +1 -1
  36. package/dist/src/__tests__/formatter-extra.test.d.ts +7 -0
  37. package/dist/src/__tests__/formatter-extra.test.js +123 -0
  38. package/dist/src/__tests__/global-vars.test.d.ts +13 -0
  39. package/dist/src/__tests__/global-vars.test.js +156 -0
  40. package/dist/src/__tests__/lint/new-rules.test.d.ts +9 -0
  41. package/dist/src/__tests__/lint/new-rules.test.js +402 -0
  42. package/dist/src/__tests__/lsp-rename.test.d.ts +8 -0
  43. package/dist/src/__tests__/lsp-rename.test.js +157 -0
  44. package/dist/src/__tests__/mc-integration/say-fstring.test.d.ts +11 -0
  45. package/dist/src/__tests__/mc-integration/say-fstring.test.js +220 -0
  46. package/dist/src/__tests__/mc-integration/stdlib-coverage-2.test.js +1 -1
  47. package/dist/src/__tests__/mc-integration/stdlib-coverage-3.test.js +1 -1
  48. package/dist/src/__tests__/mc-integration/stdlib-coverage-4.test.js +1 -1
  49. package/dist/src/__tests__/mc-integration/stdlib-coverage-5.test.js +1 -1
  50. package/dist/src/__tests__/mc-integration/stdlib-coverage-6.test.js +1 -1
  51. package/dist/src/__tests__/mc-integration/stdlib-coverage-7.test.js +1 -1
  52. package/dist/src/__tests__/mc-integration/stdlib-coverage-8.test.js +1 -1
  53. package/dist/src/__tests__/mc-syntax.test.js +4 -1
  54. package/dist/src/__tests__/monomorphize-coverage.test.d.ts +9 -0
  55. package/dist/src/__tests__/monomorphize-coverage.test.js +204 -0
  56. package/dist/src/__tests__/optimizer-cse.test.d.ts +7 -0
  57. package/dist/src/__tests__/optimizer-cse.test.js +226 -0
  58. package/dist/src/__tests__/parser.test.js +4 -13
  59. package/dist/src/__tests__/repl-server-extra.test.js +6 -7
  60. package/dist/src/__tests__/repl-server.test.js +5 -7
  61. package/dist/src/__tests__/stdlib/queue.test.js +6 -6
  62. package/dist/src/cli.js +0 -0
  63. package/dist/src/lexer/index.js +2 -1
  64. package/dist/src/lint/index.d.ts +12 -5
  65. package/dist/src/lint/index.js +730 -5
  66. package/dist/src/lsp/main.js +0 -0
  67. package/dist/src/mc-test/client.d.ts +21 -0
  68. package/dist/src/mc-test/client.js +34 -0
  69. package/dist/src/mir/lower.js +108 -6
  70. package/dist/src/optimizer/interprocedural.js +37 -2
  71. package/dist/src/parser/decl-parser.d.ts +19 -0
  72. package/dist/src/parser/decl-parser.js +323 -0
  73. package/dist/src/parser/expr-parser.d.ts +46 -0
  74. package/dist/src/parser/expr-parser.js +759 -0
  75. package/dist/src/parser/index.d.ts +8 -129
  76. package/dist/src/parser/index.js +13 -2262
  77. package/dist/src/parser/stmt-parser.d.ts +28 -0
  78. package/dist/src/parser/stmt-parser.js +577 -0
  79. package/dist/src/parser/type-parser.d.ts +20 -0
  80. package/dist/src/parser/type-parser.js +257 -0
  81. package/dist/src/parser/utils.d.ts +34 -0
  82. package/dist/src/parser/utils.js +141 -0
  83. package/docs/dev/README-mc-integration-tests.md +141 -0
  84. package/docs/lint-rules.md +162 -0
  85. package/docs/stdlib/bigint.md +2 -0
  86. package/editors/vscode/README.md +63 -41
  87. package/editors/vscode/out/extension.js +1881 -1776
  88. package/editors/vscode/out/lsp-server.js +4257 -3651
  89. package/editors/vscode/package-lock.json +3 -3
  90. package/editors/vscode/package.json +1 -1
  91. package/examples/loops-demo.mcrs +87 -0
  92. package/package.json +1 -1
  93. package/redscript-docs/docs/en/stdlib/advanced.md +629 -0
  94. package/redscript-docs/docs/en/stdlib/bigint.md +316 -0
  95. package/redscript-docs/docs/en/stdlib/bits.md +292 -0
  96. package/redscript-docs/docs/en/stdlib/bossbar.md +177 -0
  97. package/redscript-docs/docs/en/stdlib/calculus.md +289 -0
  98. package/redscript-docs/docs/en/stdlib/color.md +353 -0
  99. package/redscript-docs/docs/en/stdlib/combat.md +88 -0
  100. package/redscript-docs/docs/en/stdlib/cooldown.md +82 -0
  101. package/redscript-docs/docs/en/stdlib/dialog.md +155 -0
  102. package/redscript-docs/docs/en/stdlib/easing.md +558 -0
  103. package/redscript-docs/docs/en/stdlib/ecs.md +475 -0
  104. package/redscript-docs/docs/en/stdlib/effects.md +324 -0
  105. package/redscript-docs/docs/en/stdlib/events.md +3 -0
  106. package/redscript-docs/docs/en/stdlib/expr.md +45 -0
  107. package/redscript-docs/docs/en/stdlib/fft.md +141 -0
  108. package/redscript-docs/docs/en/stdlib/geometry.md +430 -0
  109. package/redscript-docs/docs/en/stdlib/graph.md +259 -0
  110. package/redscript-docs/docs/en/stdlib/heap.md +185 -0
  111. package/redscript-docs/docs/en/stdlib/interactions.md +179 -0
  112. package/redscript-docs/docs/en/stdlib/inventory.md +97 -0
  113. package/redscript-docs/docs/en/stdlib/linalg.md +557 -0
  114. package/redscript-docs/docs/en/stdlib/list.md +559 -0
  115. package/redscript-docs/docs/en/stdlib/map.md +140 -0
  116. package/redscript-docs/docs/en/stdlib/math.md +193 -0
  117. package/redscript-docs/docs/en/stdlib/math_hp.md +149 -0
  118. package/redscript-docs/docs/en/stdlib/matrix.md +403 -0
  119. package/redscript-docs/docs/en/stdlib/mobs.md +965 -0
  120. package/redscript-docs/docs/en/stdlib/noise.md +244 -0
  121. package/redscript-docs/docs/en/stdlib/ode.md +253 -0
  122. package/redscript-docs/docs/en/stdlib/parabola.md +342 -0
  123. package/redscript-docs/docs/en/stdlib/particles.md +311 -0
  124. package/redscript-docs/docs/en/stdlib/pathfind.md +255 -0
  125. package/redscript-docs/docs/en/stdlib/physics.md +493 -0
  126. package/redscript-docs/docs/en/stdlib/player.md +78 -0
  127. package/redscript-docs/docs/en/stdlib/quaternion.md +673 -0
  128. package/redscript-docs/docs/en/stdlib/queue.md +134 -0
  129. package/redscript-docs/docs/en/stdlib/random.md +223 -0
  130. package/redscript-docs/docs/en/stdlib/result.md +143 -0
  131. package/redscript-docs/docs/en/stdlib/scheduler.md +183 -0
  132. package/redscript-docs/docs/en/stdlib/set_int.md +190 -0
  133. package/redscript-docs/docs/en/stdlib/sets.md +101 -0
  134. package/redscript-docs/docs/en/stdlib/signal.md +400 -0
  135. package/redscript-docs/docs/en/stdlib/sort.md +104 -0
  136. package/redscript-docs/docs/en/stdlib/spawn.md +147 -0
  137. package/redscript-docs/docs/en/stdlib/state.md +142 -0
  138. package/redscript-docs/docs/en/stdlib/strings.md +154 -0
  139. package/redscript-docs/docs/en/stdlib/tags.md +3451 -0
  140. package/redscript-docs/docs/en/stdlib/teams.md +153 -0
  141. package/redscript-docs/docs/en/stdlib/timer.md +246 -0
  142. package/redscript-docs/docs/en/stdlib/vec.md +158 -0
  143. package/redscript-docs/docs/en/stdlib/world.md +298 -0
  144. package/redscript-docs/docs/zh/stdlib/advanced.md +615 -0
  145. package/redscript-docs/docs/zh/stdlib/bigint.md +316 -0
  146. package/redscript-docs/docs/zh/stdlib/bits.md +292 -0
  147. package/redscript-docs/docs/zh/stdlib/bossbar.md +170 -0
  148. package/redscript-docs/docs/zh/stdlib/calculus.md +287 -0
  149. package/redscript-docs/docs/zh/stdlib/color.md +353 -0
  150. package/redscript-docs/docs/zh/stdlib/combat.md +88 -0
  151. package/redscript-docs/docs/zh/stdlib/cooldown.md +84 -0
  152. package/redscript-docs/docs/zh/stdlib/dialog.md +152 -0
  153. package/redscript-docs/docs/zh/stdlib/easing.md +558 -0
  154. package/redscript-docs/docs/zh/stdlib/ecs.md +472 -0
  155. package/redscript-docs/docs/zh/stdlib/effects.md +324 -0
  156. package/redscript-docs/docs/zh/stdlib/events.md +3 -0
  157. package/redscript-docs/docs/zh/stdlib/expr.md +37 -0
  158. package/redscript-docs/docs/zh/stdlib/fft.md +128 -0
  159. package/redscript-docs/docs/zh/stdlib/geometry.md +430 -0
  160. package/redscript-docs/docs/zh/stdlib/graph.md +259 -0
  161. package/redscript-docs/docs/zh/stdlib/heap.md +185 -0
  162. package/redscript-docs/docs/zh/stdlib/interactions.md +160 -0
  163. package/redscript-docs/docs/zh/stdlib/inventory.md +94 -0
  164. package/redscript-docs/docs/zh/stdlib/linalg.md +543 -0
  165. package/redscript-docs/docs/zh/stdlib/list.md +561 -0
  166. package/redscript-docs/docs/zh/stdlib/map.md +132 -0
  167. package/redscript-docs/docs/zh/stdlib/math.md +193 -0
  168. package/redscript-docs/docs/zh/stdlib/math_hp.md +143 -0
  169. package/redscript-docs/docs/zh/stdlib/matrix.md +396 -0
  170. package/redscript-docs/docs/zh/stdlib/mobs.md +965 -0
  171. package/redscript-docs/docs/zh/stdlib/noise.md +244 -0
  172. package/redscript-docs/docs/zh/stdlib/ode.md +243 -0
  173. package/redscript-docs/docs/zh/stdlib/parabola.md +337 -0
  174. package/redscript-docs/docs/zh/stdlib/particles.md +307 -0
  175. package/redscript-docs/docs/zh/stdlib/pathfind.md +255 -0
  176. package/redscript-docs/docs/zh/stdlib/physics.md +493 -0
  177. package/redscript-docs/docs/zh/stdlib/player.md +78 -0
  178. package/redscript-docs/docs/zh/stdlib/quaternion.md +669 -0
  179. package/redscript-docs/docs/zh/stdlib/queue.md +124 -0
  180. package/redscript-docs/docs/zh/stdlib/random.md +222 -0
  181. package/redscript-docs/docs/zh/stdlib/result.md +147 -0
  182. package/redscript-docs/docs/zh/stdlib/scheduler.md +173 -0
  183. package/redscript-docs/docs/zh/stdlib/set_int.md +180 -0
  184. package/redscript-docs/docs/zh/stdlib/sets.md +107 -0
  185. package/redscript-docs/docs/zh/stdlib/signal.md +373 -0
  186. package/redscript-docs/docs/zh/stdlib/sort.md +104 -0
  187. package/redscript-docs/docs/zh/stdlib/spawn.md +142 -0
  188. package/redscript-docs/docs/zh/stdlib/state.md +134 -0
  189. package/redscript-docs/docs/zh/stdlib/strings.md +107 -0
  190. package/redscript-docs/docs/zh/stdlib/tags.md +3451 -0
  191. package/redscript-docs/docs/zh/stdlib/teams.md +150 -0
  192. package/redscript-docs/docs/zh/stdlib/timer.md +254 -0
  193. package/redscript-docs/docs/zh/stdlib/vec.md +158 -0
  194. package/redscript-docs/docs/zh/stdlib/world.md +289 -0
  195. package/src/__tests__/formatter-extra.test.ts +139 -0
  196. package/src/__tests__/global-vars.test.ts +171 -0
  197. package/src/__tests__/lint/new-rules.test.ts +437 -0
  198. package/src/__tests__/lsp-rename.test.ts +171 -0
  199. package/src/__tests__/mc-integration/say-fstring.test.ts +211 -0
  200. package/src/__tests__/mc-integration/stdlib-coverage-2.test.ts +1 -1
  201. package/src/__tests__/mc-integration/stdlib-coverage-3.test.ts +1 -1
  202. package/src/__tests__/mc-integration/stdlib-coverage-4.test.ts +1 -1
  203. package/src/__tests__/mc-integration/stdlib-coverage-5.test.ts +1 -1
  204. package/src/__tests__/mc-integration/stdlib-coverage-6.test.ts +1 -1
  205. package/src/__tests__/mc-integration/stdlib-coverage-7.test.ts +1 -1
  206. package/src/__tests__/mc-integration/stdlib-coverage-8.test.ts +1 -1
  207. package/src/__tests__/mc-syntax.test.ts +3 -0
  208. package/src/__tests__/monomorphize-coverage.test.ts +220 -0
  209. package/src/__tests__/optimizer-cse.test.ts +250 -0
  210. package/src/__tests__/parser.test.ts +4 -13
  211. package/src/__tests__/repl-server-extra.test.ts +6 -6
  212. package/src/__tests__/repl-server.test.ts +5 -6
  213. package/src/__tests__/stdlib/queue.test.ts +6 -6
  214. package/src/lexer/index.ts +2 -1
  215. package/src/lint/index.ts +713 -5
  216. package/src/mc-test/client.ts +40 -0
  217. package/src/mir/lower.ts +111 -2
  218. package/src/optimizer/interprocedural.ts +40 -2
  219. package/src/parser/decl-parser.ts +349 -0
  220. package/src/parser/expr-parser.ts +838 -0
  221. package/src/parser/index.ts +17 -2558
  222. package/src/parser/stmt-parser.ts +585 -0
  223. package/src/parser/type-parser.ts +276 -0
  224. package/src/parser/utils.ts +173 -0
  225. package/src/stdlib/queue.mcrs +19 -6
@@ -0,0 +1,629 @@
1
+ # Advanced
2
+
3
+ > Auto-generated from `src/stdlib/advanced.mcrs` — do not edit manually.
4
+
5
+ ## API
6
+
7
+ - [fib](#fib)
8
+ - [is_prime](#is-prime)
9
+ - [collatz_steps](#collatz-steps)
10
+ - [digit_sum](#digit-sum)
11
+ - [count_digits](#count-digits)
12
+ - [reverse_int](#reverse-int)
13
+ - [mod_pow](#mod-pow)
14
+ - [hash_int](#hash-int)
15
+ - [noise1d](#noise1d)
16
+ - [bezier_quad](#bezier-quad)
17
+ - [bezier_cubic](#bezier-cubic)
18
+ - [mandelbrot_iter](#mandelbrot-iter)
19
+ - [julia_iter](#julia-iter)
20
+ - [angle_between](#angle-between)
21
+ - [clamp_circle_x](#clamp-circle-x)
22
+ - [clamp_circle_y](#clamp-circle-y)
23
+ - [newton_sqrt](#newton-sqrt)
24
+ - [bezier_quartic](#bezier-quartic)
25
+ - [bezier_n](#bezier-n)
26
+ - [bezier_n_safe](#bezier-n-safe)
27
+ - [digital_root](#digital-root)
28
+ - [spiral_ring](#spiral-ring)
29
+ - [median](#median)
30
+ - [mode](#mode)
31
+ - [mean_fx](#mean-fx)
32
+ - [std_dev_fx](#std-dev-fx)
33
+ - [hermite_spline](#hermite-spline)
34
+ - [catmull_rom](#catmull-rom)
35
+
36
+ ---
37
+
38
+ ## `fib` <Badge type="info" text="v1.0.0" />
39
+
40
+ Fibonacci number F(n) using simple iteration.
41
+ Overflow: F(46) = 1 836 311 903 ≈ INT_MAX; keep n ≤ 46.
42
+
43
+ ```redscript
44
+ fn fib(n: int) -> int
45
+ ```
46
+
47
+ **Parameters**
48
+
49
+ | Parameter | Description |
50
+ |-----------|-------------|
51
+ | `n` | Index (n ≥ 0) |
52
+
53
+ **Returns:** F(n) — fib(0) == 0, fib(1) == 1, fib(10) == 55
54
+
55
+ ---
56
+
57
+ ## `is_prime` <Badge type="info" text="v1.0.0" />
58
+
59
+ Primality test by trial division up to √n.
60
+
61
+ ```redscript
62
+ fn is_prime(n: int) -> int
63
+ ```
64
+
65
+ **Parameters**
66
+
67
+ | Parameter | Description |
68
+ |-----------|-------------|
69
+ | `n` | Integer to test (n ≥ 0) |
70
+
71
+ **Returns:** 1 if n is prime, 0 otherwise
72
+
73
+ **Example**
74
+
75
+ ```redscript
76
+ is_prime(2) // 1
77
+ is_prime(4) // 0
78
+ is_prime(97) // 1
79
+ ```
80
+
81
+ ---
82
+
83
+ ## `collatz_steps` <Badge type="info" text="v1.0.0" />
84
+
85
+ Number of steps in the Collatz sequence starting at n until reaching 1.
86
+
87
+ ```redscript
88
+ fn collatz_steps(n: int) -> int
89
+ ```
90
+
91
+ **Parameters**
92
+
93
+ | Parameter | Description |
94
+ |-----------|-------------|
95
+ | `n` | Starting value (n ≥ 1) |
96
+
97
+ **Returns:** Step count — collatz_steps(1) == 0, collatz_steps(6) == 8
98
+
99
+ ---
100
+
101
+ ## `digit_sum` <Badge type="info" text="v1.0.0" />
102
+
103
+ Sum of decimal digits. Negative input uses the absolute value.
104
+
105
+ ```redscript
106
+ fn digit_sum(n: int) -> int
107
+ ```
108
+
109
+ **Parameters**
110
+
111
+ | Parameter | Description |
112
+ |-----------|-------------|
113
+ | `n` | Integer input |
114
+
115
+ **Returns:** Sum of digits — digit_sum(123) == 6, digit_sum(0) == 0
116
+
117
+ ---
118
+
119
+ ## `count_digits` <Badge type="info" text="v1.0.0" />
120
+
121
+ Count decimal digits of n. 0 has 1 digit; negative values count absolute digits.
122
+
123
+ ```redscript
124
+ fn count_digits(n: int) -> int
125
+ ```
126
+
127
+ **Parameters**
128
+
129
+ | Parameter | Description |
130
+ |-----------|-------------|
131
+ | `n` | Integer input |
132
+
133
+ **Returns:** Digit count — count_digits(0) == 1, count_digits(100) == 3
134
+
135
+ ---
136
+
137
+ ## `reverse_int` <Badge type="info" text="v1.0.0" />
138
+
139
+ Reverse the decimal digits of an integer. Sign is preserved.
140
+
141
+ ```redscript
142
+ fn reverse_int(n: int) -> int
143
+ ```
144
+
145
+ **Parameters**
146
+
147
+ | Parameter | Description |
148
+ |-----------|-------------|
149
+ | `n` | Integer input |
150
+
151
+ **Returns:** Digit-reversed integer — reverse_int(12345) == 54321, reverse_int(-42) == -24
152
+
153
+ ---
154
+
155
+ ## `mod_pow` <Badge type="info" text="v1.0.0" />
156
+
157
+ Modular exponentiation: (base ^ exp) mod m using O(log exp) binary squaring.
158
+ ⚠ m must be ≤ 46 340 to avoid `b*b` int32 overflow.
159
+
160
+ ```redscript
161
+ fn mod_pow(base: int, exp: int, m: int) -> int
162
+ ```
163
+
164
+ **Parameters**
165
+
166
+ | Parameter | Description |
167
+ |-----------|-------------|
168
+ | `base` | Base value |
169
+ | `exp` | Exponent (≥ 0) |
170
+ | `m` | Modulus (1 < m ≤ 46340) |
171
+
172
+ **Returns:** (base^exp) mod m — mod_pow(2, 10, 1000) == 24
173
+
174
+ ---
175
+
176
+ ## `hash_int` <Badge type="info" text="v1.0.0" />
177
+
178
+ Deterministic integer hash. Output is non-negative [0, ~2×10⁹).
179
+ Same input always produces the same output — useful as a seeded pseudo-random value.
180
+
181
+ ```redscript
182
+ fn hash_int(n: int) -> int
183
+ ```
184
+
185
+ **Parameters**
186
+
187
+ | Parameter | Description |
188
+ |-----------|-------------|
189
+ | `n` | Input integer (any value) |
190
+
191
+ **Returns:** Non-negative hash value
192
+
193
+ ---
194
+
195
+ ## `noise1d` <Badge type="info" text="v1.0.0" />
196
+
197
+ 1-D value noise with C¹ continuity via smoothstep interpolation.
198
+ Input x is fixed-point (scale = 1000). Output in [0, 999].
199
+
200
+ ```redscript
201
+ fn noise1d(x: int) -> int
202
+ ```
203
+
204
+ **Parameters**
205
+
206
+ | Parameter | Description |
207
+ |-----------|-------------|
208
+ | `x` | Coordinate × 1000 (e.g. 500 = 0.5, 1000 = 1.0) |
209
+
210
+ **Returns:** Smoothly interpolated noise value in [0, 999]
211
+
212
+ ---
213
+
214
+ ## `bezier_quad` <Badge type="info" text="v1.0.0" />
215
+
216
+ Quadratic Bezier curve evaluated at t using De Casteljau's algorithm.
217
+
218
+ ```redscript
219
+ fn bezier_quad(p0: int, p1: int, p2: int, t: int) -> int
220
+ ```
221
+
222
+ **Parameters**
223
+
224
+ | Parameter | Description |
225
+ |-----------|-------------|
226
+ | `p0` | Start control point |
227
+ | `p1` | Middle control point |
228
+ | `p2` | End control point |
229
+ | `t` | Parameter × 1000 (0 = start, 1000 = end) |
230
+
231
+ **Returns:** Curve value at t
232
+
233
+ **Example**
234
+
235
+ ```redscript
236
+ bezier_quad(0, 500, 1000, 500) // 500 (midpoint)
237
+ bezier_quad(0, 1000, 0, 500) // 500 (arch at midpoint)
238
+ ```
239
+
240
+ ---
241
+
242
+ ## `bezier_cubic` <Badge type="info" text="v1.0.0" />
243
+
244
+ Cubic Bezier curve evaluated at t using De Casteljau's algorithm.
245
+
246
+ ```redscript
247
+ fn bezier_cubic(p0: int, p1: int, p2: int, p3: int, t: int) -> int
248
+ ```
249
+
250
+ **Parameters**
251
+
252
+ | Parameter | Description |
253
+ |-----------|-------------|
254
+ | `p0` | Control point 0 (start) |
255
+ | `p1` | Control point 1 |
256
+ | `p2` | Control point 2 |
257
+ | `p3` | Control point 3 (end) |
258
+ | `t` | Parameter × 1000 (0 = start, 1000 = end) |
259
+
260
+ **Returns:** Curve value at t
261
+
262
+ ---
263
+
264
+ ## `mandelbrot_iter` <Badge type="info" text="v1.0.0" />
265
+
266
+ Mandelbrot set iteration count for complex number c = cx/1000 + i·cy/1000.
267
+ Returns the escape iteration count, or max_iter if the point is in the set.
268
+ Use the return value to colour blocks!
269
+
270
+ ```redscript
271
+ fn mandelbrot_iter(cx: int, cy: int, max_iter: int) -> int
272
+ ```
273
+
274
+ **Parameters**
275
+
276
+ | Parameter | Description |
277
+ |-----------|-------------|
278
+ | `cx` | Real part × 1000 (range −2000..1000) |
279
+ | `cy` | Imaginary part × 1000 (range −1000..1000) |
280
+ | `max_iter` | Maximum iteration count |
281
+
282
+ **Returns:** Iterations before |z| > 2, or max_iter if in the set
283
+
284
+ **Example**
285
+
286
+ ```redscript
287
+ mandelbrot_iter(-1000, 0, 100) // 100 — c = -1+0i is in the set
288
+ mandelbrot_iter(1000, 0, 100) // 0 — c = 1+0i escapes immediately
289
+ ```
290
+
291
+ ---
292
+
293
+ ## `julia_iter` <Badge type="info" text="v1.0.0" />
294
+
295
+ Julia set iteration count with fixed constant c and variable starting point z₀.
296
+ Same escape condition as `mandelbrot_iter`.
297
+
298
+ ```redscript
299
+ fn julia_iter(z0r: int, z0i: int, cr: int, ci: int, max_iter: int) -> int
300
+ ```
301
+
302
+ **Parameters**
303
+
304
+ | Parameter | Description |
305
+ |-----------|-------------|
306
+ | `z0r` | Real part of starting point × 1000 |
307
+ | `z0i` | Imaginary part of starting point × 1000 |
308
+ | `cr` | Real part of constant c × 1000 |
309
+ | `ci` | Imaginary part of constant c × 1000 |
310
+ | `max_iter` | Maximum iteration count |
311
+
312
+ **Returns:** Iterations before |z| > 2, or max_iter if in the set
313
+
314
+ ---
315
+
316
+ ## `angle_between` <Badge type="info" text="v1.0.0" />
317
+
318
+ Unsigned angle (0–180°) between two 2-D integer vectors.
319
+
320
+ ```redscript
321
+ fn angle_between(x1: int, y1: int, x2: int, y2: int) -> int
322
+ ```
323
+
324
+ **Parameters**
325
+
326
+ | Parameter | Description |
327
+ |-----------|-------------|
328
+ | `x1` | X component of vector 1 |
329
+ | `y1` | Y component of vector 1 |
330
+ | `x2` | X component of vector 2 |
331
+ | `y2` | Y component of vector 2 |
332
+
333
+ **Returns:** Angle in whole degrees [0, 180]; 0 for zero-length inputs
334
+
335
+ **Example**
336
+
337
+ ```redscript
338
+ angle_between(1000, 0, 0, 1000) // 90
339
+ angle_between(1000, 0, -1000, 0) // 180
340
+ ```
341
+
342
+ ---
343
+
344
+ ## `clamp_circle_x` <Badge type="info" text="v1.0.0" />
345
+
346
+ X component of the point (x, y) clamped to a circle of radius r centred at the origin.
347
+ Keep |x|, |y| < ~2000 to avoid overflow in `normalize2d_x`.
348
+
349
+ ```redscript
350
+ fn clamp_circle_x(x: int, y: int, r: int) -> int
351
+ ```
352
+
353
+ **Parameters**
354
+
355
+ | Parameter | Description |
356
+ |-----------|-------------|
357
+ | `x` | X coordinate (raw block coords, not fixed-point) |
358
+ | `y` | Y coordinate |
359
+ | `r` | Circle radius in the same units as x/y |
360
+
361
+ **Returns:** Clamped X — clamp_circle_x(600, 0, 500) == 500
362
+
363
+ ---
364
+
365
+ ## `clamp_circle_y` <Badge type="info" text="v1.0.0" />
366
+
367
+ Y component of the point (x, y) clamped to a circle of radius r centred at the origin.
368
+
369
+ ```redscript
370
+ fn clamp_circle_y(x: int, y: int, r: int) -> int
371
+ ```
372
+
373
+ **Parameters**
374
+
375
+ | Parameter | Description |
376
+ |-----------|-------------|
377
+ | `x` | X coordinate |
378
+ | `y` | Y coordinate |
379
+ | `r` | Circle radius |
380
+
381
+ **Returns:** Clamped Y — clamp_circle_y(0, 600, 500) == 500
382
+
383
+ ---
384
+
385
+ ## `newton_sqrt` <Badge type="info" text="v1.0.0" />
386
+
387
+ Integer square root via Newton's method (alternative to `isqrt`).
388
+ Converges quadratically; useful for validating while-loop + division logic.
389
+
390
+ ```redscript
391
+ fn newton_sqrt(n: int) -> int
392
+ ```
393
+
394
+ **Parameters**
395
+
396
+ | Parameter | Description |
397
+ |-----------|-------------|
398
+ | `n` | Non-negative integer |
399
+
400
+ **Returns:** ⌊√n⌋ — newton_sqrt(25) == 5, newton_sqrt(100) == 10
401
+
402
+ ---
403
+
404
+ ## `bezier_quartic` <Badge type="info" text="v1.0.0" />
405
+
406
+ Quartic (5-point) Bezier curve evaluated at t using De Casteljau's algorithm.
407
+
408
+ ```redscript
409
+ fn bezier_quartic(p0: int, p1: int, p2: int, p3: int, p4: int, t: int) -> int
410
+ ```
411
+
412
+ **Parameters**
413
+
414
+ | Parameter | Description |
415
+ |-----------|-------------|
416
+ | `p0` | Control point 0 (start) |
417
+ | `p1` | Control point 1 |
418
+ | `p2` | Control point 2 |
419
+ | `p3` | Control point 3 |
420
+ | `p4` | Control point 4 (end) |
421
+ | `t` | Parameter × 1000 (0 = start, 1000 = end) |
422
+
423
+ **Returns:** Curve value at t
424
+
425
+ ---
426
+
427
+ ## `bezier_n` <Badge type="info" text="v1.0.0" />
428
+
429
+ Arbitrary-degree Bezier curve via De Casteljau's algorithm.
430
+ ⚠ Modifies `pts` in-place. Use `bezier_n_safe` to preserve the original array.
431
+
432
+ ```redscript
433
+ fn bezier_n(pts: int[], n: int, t: int) -> int
434
+ ```
435
+
436
+ **Parameters**
437
+
438
+ | Parameter | Description |
439
+ |-----------|-------------|
440
+ | `pts` | Array of n control points (modified in-place during evaluation) |
441
+ | `n` | Number of control points |
442
+ | `t` | Parameter × 1000 (0 = start, 1000 = end) |
443
+
444
+ **Returns:** Curve value at t
445
+
446
+ ---
447
+
448
+ ## `bezier_n_safe` <Badge type="info" text="v1.0.0" />
449
+
450
+ Non-destructive arbitrary-degree Bezier curve. Copies `pts` into `work` then evaluates.
451
+
452
+ ```redscript
453
+ fn bezier_n_safe(pts: int[], work: int[], n: int, t: int) -> int
454
+ ```
455
+
456
+ **Parameters**
457
+
458
+ | Parameter | Description |
459
+ |-----------|-------------|
460
+ | `pts` | Array of n control points (not modified) |
461
+ | `work` | Working buffer of length ≥ n (will be overwritten) |
462
+ | `n` | Number of control points |
463
+ | `t` | Parameter × 1000 (0 = start, 1000 = end) |
464
+
465
+ **Returns:** Curve value at t
466
+
467
+ ---
468
+
469
+ ## `digital_root` <Badge type="info" text="v1.0.0" />
470
+
471
+ Digital root: repeatedly sum digits until a single digit remains.
472
+
473
+ ```redscript
474
+ fn digital_root(n: int) -> int
475
+ ```
476
+
477
+ **Parameters**
478
+
479
+ | Parameter | Description |
480
+ |-----------|-------------|
481
+ | `n` | Non-negative integer |
482
+
483
+ **Returns:** Single-digit root — digital_root(493) == 7, digital_root(0) == 0
484
+
485
+ ---
486
+
487
+ ## `spiral_ring` <Badge type="info" text="v1.0.0" />
488
+
489
+ Ulam spiral ring number: which concentric square ring contains n?
490
+ Ring 0: n=1; Ring 1: n=2..9 (3×3); Ring 2: n=10..25 (5×5); etc.
491
+
492
+ ```redscript
493
+ fn spiral_ring(n: int) -> int
494
+ ```
495
+
496
+ **Parameters**
497
+
498
+ | Parameter | Description |
499
+ |-----------|-------------|
500
+ | `n` | Positive integer |
501
+
502
+ **Returns:** Ring index — spiral_ring(1) == 0, spiral_ring(9) == 1, spiral_ring(25) == 2
503
+
504
+ ---
505
+
506
+ ## `median` <Badge type="info" text="v1.1.0" />
507
+
508
+ Median of n integers. Sorts a copy of the array; the original is not modified.
509
+ For odd n returns the middle value × 1000. For even n returns the average × 1000.
510
+
511
+ ```redscript
512
+ fn median(arr: int[], work: int[], n: int) -> int
513
+ ```
514
+
515
+ **Parameters**
516
+
517
+ | Parameter | Description |
518
+ |-----------|-------------|
519
+ | `arr` | Input array (not modified) |
520
+ | `work` | Working buffer of length ≥ n (will be overwritten) |
521
+ | `n` | Number of elements (must be ≥ 1) |
522
+
523
+ **Returns:** Median × 1000
524
+
525
+ ---
526
+
527
+ ## `mode` <Badge type="info" text="v1.1.0" />
528
+
529
+ Most frequent element (mode) in arr[0..n). Tie-breaks toward the smallest value.
530
+
531
+ ```redscript
532
+ fn mode(arr: int[], work: int[], n: int) -> int
533
+ ```
534
+
535
+ **Parameters**
536
+
537
+ | Parameter | Description |
538
+ |-----------|-------------|
539
+ | `arr` | Input array (not modified) |
540
+ | `work` | Working buffer of length ≥ n (will be overwritten) |
541
+ | `n` | Number of elements (must be ≥ 1) |
542
+
543
+ **Returns:** The modal value
544
+
545
+ ---
546
+
547
+ ## `mean_fx` <Badge type="info" text="v1.1.0" />
548
+
549
+ Arithmetic mean as fixed-point × 1000.
550
+
551
+ ```redscript
552
+ fn mean_fx(arr: int[], n: int) -> int
553
+ ```
554
+
555
+ **Parameters**
556
+
557
+ | Parameter | Description |
558
+ |-----------|-------------|
559
+ | `arr` | Input array of integers |
560
+ | `n` | Number of elements (must be ≥ 1) |
561
+
562
+ **Returns:** sum(arr) × 1000 / n; 0 for empty array
563
+
564
+ ---
565
+
566
+ ## `std_dev_fx` <Badge type="info" text="v1.1.0" />
567
+
568
+ Population standard deviation as fixed-point × 1000.
569
+ Uses integer arithmetic; values must fit in int32 before squaring deviations.
570
+
571
+ ```redscript
572
+ fn std_dev_fx(arr: int[], n: int) -> int
573
+ ```
574
+
575
+ **Parameters**
576
+
577
+ | Parameter | Description |
578
+ |-----------|-------------|
579
+ | `arr` | Input array of integers |
580
+ | `n` | Number of elements (must be ≥ 2) |
581
+
582
+ **Returns:** √(Σ(xᵢ−mean)² / n) × 1000; 0 for n ≤ 1
583
+
584
+ ---
585
+
586
+ ## `hermite_spline` <Badge type="info" text="v1.1.0" />
587
+
588
+ Cubic Hermite spline interpolation between two endpoints with explicit tangents.
589
+
590
+ ```redscript
591
+ fn hermite_spline(p0: int, p1: int, m0: int, m1: int, t: int) -> int
592
+ ```
593
+
594
+ **Parameters**
595
+
596
+ | Parameter | Description |
597
+ |-----------|-------------|
598
+ | `p0` | Start value |
599
+ | `p1` | End value |
600
+ | `m0` | Tangent at p0 |
601
+ | `m1` | Tangent at p1 |
602
+ | `t` | Parameter × 1000 (0 = p0, 1000 = p1) |
603
+
604
+ **Returns:** Interpolated value (same scale as p0/p1)
605
+
606
+ ---
607
+
608
+ ## `catmull_rom` <Badge type="info" text="v1.1.0" />
609
+
610
+ Catmull-Rom spline: interpolates between p1 and p2 with tangents derived from neighbours.
611
+ Tangents: m1 = (p2 − p0) / 2, m2 = (p3 − p1) / 2.
612
+
613
+ ```redscript
614
+ fn catmull_rom(p0: int, p1: int, p2: int, p3: int, t: int) -> int
615
+ ```
616
+
617
+ **Parameters**
618
+
619
+ | Parameter | Description |
620
+ |-----------|-------------|
621
+ | `p0` | Point before the segment start |
622
+ | `p1` | Segment start |
623
+ | `p2` | Segment end |
624
+ | `p3` | Point after the segment end |
625
+ | `t` | Parameter × 1000 (0 = p1, 1000 = p2) |
626
+
627
+ **Returns:** Interpolated value between p1 and p2
628
+
629
+ ---