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,615 @@
1
+ # Advanced
2
+
3
+ > 本文档由 `src/stdlib/advanced.mcrs` 自动生成,请勿手动编辑。
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
+ 迭代法计算斐波那契数 F(n)。n ≤ 46(F(46) ≈ INT_MAX)。
41
+
42
+ ```redscript
43
+ fn fib(n: int) -> int
44
+ ```
45
+
46
+ **参数**
47
+
48
+ | 参数 | 说明 |
49
+ |------|------|
50
+ | `n` | 索引(n ≥ 0) |
51
+
52
+ **返回:** F(n)
53
+
54
+ ---
55
+
56
+ ## `is_prime` <Badge type="info" text="v1.0.0" />
57
+
58
+ 通过试除法(除到 √n)判断素数。
59
+
60
+ ```redscript
61
+ fn is_prime(n: int) -> int
62
+ ```
63
+
64
+ **参数**
65
+
66
+ | 参数 | 说明 |
67
+ |------|------|
68
+ | `n` | 待测整数(n ≥ 0) |
69
+
70
+ **返回:** 1 表示素数,0 表示合数
71
+
72
+ **示例**
73
+
74
+ ```redscript
75
+ is_prime(2) // 1
76
+ is_prime(4) // 0
77
+ is_prime(97) // 1
78
+ ```
79
+
80
+ ---
81
+
82
+ ## `collatz_steps` <Badge type="info" text="v1.0.0" />
83
+
84
+ 计算从 n 出发的 Collatz 序列到达 1 所需的步数。
85
+
86
+ ```redscript
87
+ fn collatz_steps(n: int) -> int
88
+ ```
89
+
90
+ **参数**
91
+
92
+ | 参数 | 说明 |
93
+ |------|------|
94
+ | `n` | 起始值(n ≥ 1) |
95
+
96
+ **返回:** 步数
97
+
98
+ ---
99
+
100
+ ## `digit_sum` <Badge type="info" text="v1.0.0" />
101
+
102
+ 各十进制位数字之和,负数取绝对值后计算。
103
+
104
+ ```redscript
105
+ fn digit_sum(n: int) -> int
106
+ ```
107
+
108
+ **参数**
109
+
110
+ | 参数 | 说明 |
111
+ |------|------|
112
+ | `n` | 输入整数 |
113
+
114
+ **返回:** 各位数字之和
115
+
116
+ ---
117
+
118
+ ## `count_digits` <Badge type="info" text="v1.0.0" />
119
+
120
+ 统计整数的十进制位数,0 有 1 位,负数统计绝对值的位数。
121
+
122
+ ```redscript
123
+ fn count_digits(n: int) -> int
124
+ ```
125
+
126
+ **参数**
127
+
128
+ | 参数 | 说明 |
129
+ |------|------|
130
+ | `n` | 输入整数 |
131
+
132
+ **返回:** 位数
133
+
134
+ ---
135
+
136
+ ## `reverse_int` <Badge type="info" text="v1.0.0" />
137
+
138
+ 翻转整数各十进制位,符号保留。
139
+
140
+ ```redscript
141
+ fn reverse_int(n: int) -> int
142
+ ```
143
+
144
+ **参数**
145
+
146
+ | 参数 | 说明 |
147
+ |------|------|
148
+ | `n` | 输入整数 |
149
+
150
+ **返回:** 翻转后的整数
151
+
152
+ ---
153
+
154
+ ## `mod_pow` <Badge type="info" text="v1.0.0" />
155
+
156
+ 快速模幂:(base^exp) mod m,使用 O(log exp) 二进制快速幂。m 须 ≤ 46340。
157
+
158
+ ```redscript
159
+ fn mod_pow(base: int, exp: int, m: int) -> int
160
+ ```
161
+
162
+ **参数**
163
+
164
+ | 参数 | 说明 |
165
+ |------|------|
166
+ | `base` | 底数 |
167
+ | `exp` | 指数(≥ 0) |
168
+ | `m` | 模数(1 < m ≤ 46340) |
169
+
170
+ **返回:** (base^exp) mod m
171
+
172
+ ---
173
+
174
+ ## `hash_int` <Badge type="info" text="v1.0.0" />
175
+
176
+ 确定性整数哈希,输出非负 [0, ~2×10⁹),同输入始终产生同输出,适合程序化生成的种子随机值。
177
+
178
+ ```redscript
179
+ fn hash_int(n: int) -> int
180
+ ```
181
+
182
+ **参数**
183
+
184
+ | 参数 | 说明 |
185
+ |------|------|
186
+ | `n` | 输入整数 |
187
+
188
+ **返回:** 非负哈希值
189
+
190
+ ---
191
+
192
+ ## `noise1d` <Badge type="info" text="v1.0.0" />
193
+
194
+ 1D 值噪声,通过 smoothstep 插值实现 C¹ 连续性。输入 ×1000,输出 [0, 999]。
195
+
196
+ ```redscript
197
+ fn noise1d(x: int) -> int
198
+ ```
199
+
200
+ **参数**
201
+
202
+ | 参数 | 说明 |
203
+ |------|------|
204
+ | `x` | 坐标 ×1000 |
205
+
206
+ **返回:** 平滑插值噪声值 [0, 999]
207
+
208
+ ---
209
+
210
+ ## `bezier_quad` <Badge type="info" text="v1.0.0" />
211
+
212
+ 二次贝塞尔曲线(De Casteljau 算法),t ∈ [0, 1000]。
213
+
214
+ ```redscript
215
+ fn bezier_quad(p0: int, p1: int, p2: int, t: int) -> int
216
+ ```
217
+
218
+ **参数**
219
+
220
+ | 参数 | 说明 |
221
+ |------|------|
222
+ | `p0` | 起始控制点 |
223
+ | `p1` | 中间控制点 |
224
+ | `p2` | 终止控制点 |
225
+ | `t` | 参数 ×1000(0 = 起点,1000 = 终点) |
226
+
227
+ **返回:** t 处的曲线值
228
+
229
+ **示例**
230
+
231
+ ```redscript
232
+ bezier_quad(0, 500, 1000, 500) // 500 (midpoint)
233
+ bezier_quad(0, 1000, 0, 500) // 500 (arch at midpoint)
234
+ ```
235
+
236
+ ---
237
+
238
+ ## `bezier_cubic` <Badge type="info" text="v1.0.0" />
239
+
240
+ 三次贝塞尔曲线(De Casteljau 算法),t ∈ [0, 1000]。
241
+
242
+ ```redscript
243
+ fn bezier_cubic(p0: int, p1: int, p2: int, p3: int, t: int) -> int
244
+ ```
245
+
246
+ **参数**
247
+
248
+ | 参数 | 说明 |
249
+ |------|------|
250
+ | `p0` | 控制点 0(起点) |
251
+ | `p1` | 控制点 1 |
252
+ | `p2` | 控制点 2 |
253
+ | `p3` | 控制点 3(终点) |
254
+ | `t` | 参数 ×1000 |
255
+
256
+ **返回:** t 处的曲线值
257
+
258
+ ---
259
+
260
+ ## `mandelbrot_iter` <Badge type="info" text="v1.0.0" />
261
+
262
+ Mandelbrot 集迭代次数,c = cx/1000 + i·cy/1000。返回逃逸迭代次数,可用于方块着色。
263
+
264
+ ```redscript
265
+ fn mandelbrot_iter(cx: int, cy: int, max_iter: int) -> int
266
+ ```
267
+
268
+ **参数**
269
+
270
+ | 参数 | 说明 |
271
+ |------|------|
272
+ | `cx` | 实部 ×1000(范围 −2000..1000) |
273
+ | `cy` | 虚部 ×1000(范围 −1000..1000) |
274
+ | `max_iter` | 最大迭代次数 |
275
+
276
+ **返回:** 逃逸前的迭代次数,或 max_iter(在集合内)
277
+
278
+ **示例**
279
+
280
+ ```redscript
281
+ mandelbrot_iter(-1000, 0, 100) // 100 — c = -1+0i is in the set
282
+ mandelbrot_iter(1000, 0, 100) // 0 — c = 1+0i escapes immediately
283
+ ```
284
+
285
+ ---
286
+
287
+ ## `julia_iter` <Badge type="info" text="v1.0.0" />
288
+
289
+ Julia 集迭代次数,固定常数 c,可变起点 z₀。
290
+
291
+ ```redscript
292
+ fn julia_iter(z0r: int, z0i: int, cr: int, ci: int, max_iter: int) -> int
293
+ ```
294
+
295
+ **参数**
296
+
297
+ | 参数 | 说明 |
298
+ |------|------|
299
+ | `z0r` | 起点实部 ×1000 |
300
+ | `z0i` | 起点虚部 ×1000 |
301
+ | `cr` | 常数 c 实部 ×1000 |
302
+ | `ci` | 常数 c 虚部 ×1000 |
303
+ | `max_iter` | 最大迭代次数 |
304
+
305
+ **返回:** 逃逸前的迭代次数,或 max_iter
306
+
307
+ ---
308
+
309
+ ## `angle_between` <Badge type="info" text="v1.0.0" />
310
+
311
+ 两个二维整数向量之间的无符号夹角(0–180°)。
312
+
313
+ ```redscript
314
+ fn angle_between(x1: int, y1: int, x2: int, y2: int) -> int
315
+ ```
316
+
317
+ **参数**
318
+
319
+ | 参数 | 说明 |
320
+ |------|------|
321
+ | `x1` | 向量 1 的 X 分量 |
322
+ | `y1` | 向量 1 的 Y 分量 |
323
+ | `x2` | 向量 2 的 X 分量 |
324
+ | `y2` | 向量 2 的 Y 分量 |
325
+
326
+ **返回:** 夹角(整数度数,0–180)
327
+
328
+ **示例**
329
+
330
+ ```redscript
331
+ angle_between(1000, 0, 0, 1000) // 90
332
+ angle_between(1000, 0, -1000, 0) // 180
333
+ ```
334
+
335
+ ---
336
+
337
+ ## `clamp_circle_x` <Badge type="info" text="v1.0.0" />
338
+
339
+ 将点 (x, y) 约束到以原点为圆心、半径为 r 的圆内,返回 X 分量。
340
+
341
+ ```redscript
342
+ fn clamp_circle_x(x: int, y: int, r: int) -> int
343
+ ```
344
+
345
+ **参数**
346
+
347
+ | 参数 | 说明 |
348
+ |------|------|
349
+ | `x` | X 坐标 |
350
+ | `y` | Y 坐标 |
351
+ | `r` | 圆半径(与 x/y 同单位) |
352
+
353
+ **返回:** 约束后的 X 分量
354
+
355
+ ---
356
+
357
+ ## `clamp_circle_y` <Badge type="info" text="v1.0.0" />
358
+
359
+ 将点 (x, y) 约束到以原点为圆心、半径为 r 的圆内,返回 Y 分量。
360
+
361
+ ```redscript
362
+ fn clamp_circle_y(x: int, y: int, r: int) -> int
363
+ ```
364
+
365
+ **参数**
366
+
367
+ | 参数 | 说明 |
368
+ |------|------|
369
+ | `x` | X 坐标 |
370
+ | `y` | Y 坐标 |
371
+ | `r` | 圆半径 |
372
+
373
+ **返回:** 约束后的 Y 分量
374
+
375
+ ---
376
+
377
+ ## `newton_sqrt` <Badge type="info" text="v1.0.0" />
378
+
379
+ Newton 迭代法求整数平方根(isqrt 的替代方案,二次收敛)。
380
+
381
+ ```redscript
382
+ fn newton_sqrt(n: int) -> int
383
+ ```
384
+
385
+ **参数**
386
+
387
+ | 参数 | 说明 |
388
+ |------|------|
389
+ | `n` | 非负整数 |
390
+
391
+ **返回:** ⌊√n⌋
392
+
393
+ ---
394
+
395
+ ## `bezier_quartic` <Badge type="info" text="v1.0.0" />
396
+
397
+ 四次(5 控制点)贝塞尔曲线(De Casteljau 算法),t ∈ [0, 1000]。
398
+
399
+ ```redscript
400
+ fn bezier_quartic(p0: int, p1: int, p2: int, p3: int, p4: int, t: int) -> int
401
+ ```
402
+
403
+ **参数**
404
+
405
+ | 参数 | 说明 |
406
+ |------|------|
407
+ | `p0` | 控制点 0(起点) |
408
+ | `p1` | 控制点 1 |
409
+ | `p2` | 控制点 2 |
410
+ | `p3` | 控制点 3 |
411
+ | `p4` | 控制点 4(终点) |
412
+ | `t` | 参数 ×1000 |
413
+
414
+ **返回:** t 处的曲线值
415
+
416
+ ---
417
+
418
+ ## `bezier_n` <Badge type="info" text="v1.0.0" />
419
+
420
+ 任意阶贝塞尔曲线(De Casteljau 算法)。⚠ 会修改 pts 数组,如需保留原数组请用 bezier_n_safe。
421
+
422
+ ```redscript
423
+ fn bezier_n(pts: int[], n: int, t: int) -> int
424
+ ```
425
+
426
+ **参数**
427
+
428
+ | 参数 | 说明 |
429
+ |------|------|
430
+ | `pts` | n 个控制点数组(会被原地修改) |
431
+ | `n` | 控制点数量 |
432
+ | `t` | 参数 ×1000 |
433
+
434
+ **返回:** t 处的曲线值
435
+
436
+ ---
437
+
438
+ ## `bezier_n_safe` <Badge type="info" text="v1.0.0" />
439
+
440
+ 非破坏性任意阶贝塞尔曲线,将 pts 复制到 work 后再求值,pts 不被修改。
441
+
442
+ ```redscript
443
+ fn bezier_n_safe(pts: int[], work: int[], n: int, t: int) -> int
444
+ ```
445
+
446
+ **参数**
447
+
448
+ | 参数 | 说明 |
449
+ |------|------|
450
+ | `pts` | 控制点数组(不被修改) |
451
+ | `work` | 工作缓冲区(长度 ≥ n,会被覆写) |
452
+ | `n` | 控制点数量 |
453
+ | `t` | 参数 ×1000 |
454
+
455
+ **返回:** t 处的曲线值
456
+
457
+ ---
458
+
459
+ ## `digital_root` <Badge type="info" text="v1.0.0" />
460
+
461
+ 数字根:反复对各位求和直到得到单个数字。
462
+
463
+ ```redscript
464
+ fn digital_root(n: int) -> int
465
+ ```
466
+
467
+ **参数**
468
+
469
+ | 参数 | 说明 |
470
+ |------|------|
471
+ | `n` | 非负整数 |
472
+
473
+ **返回:** 数字根(1–9);0 返回 0
474
+
475
+ ---
476
+
477
+ ## `spiral_ring` <Badge type="info" text="v1.0.0" />
478
+
479
+ Ulam 螺旋环号:n 位于哪个同心正方形环上(环 0 = n=1,环 1 = n=2..9,以此类推)。
480
+
481
+ ```redscript
482
+ fn spiral_ring(n: int) -> int
483
+ ```
484
+
485
+ **参数**
486
+
487
+ | 参数 | 说明 |
488
+ |------|------|
489
+ | `n` | 正整数 |
490
+
491
+ **返回:** 环号
492
+
493
+ ---
494
+
495
+ ## `median` <Badge type="info" text="v1.1.0" />
496
+
497
+ n 个整数的中位数(×1000 定点数)。奇数 n 返回中间值 ×1000,偶数 n 返回两中间值均值 ×1000。不修改原数组。
498
+
499
+ ```redscript
500
+ fn median(arr: int[], work: int[], n: int) -> int
501
+ ```
502
+
503
+ **参数**
504
+
505
+ | 参数 | 说明 |
506
+ |------|------|
507
+ | `arr` | 输入数组(不被修改) |
508
+ | `work` | 工作缓冲区(长度 ≥ n) |
509
+ | `n` | 元素个数(≥ 1) |
510
+
511
+ **返回:** 中位数 ×1000
512
+
513
+ ---
514
+
515
+ ## `mode` <Badge type="info" text="v1.1.0" />
516
+
517
+ 出现频率最高的元素(众数),平局时取最小值。
518
+
519
+ ```redscript
520
+ fn mode(arr: int[], work: int[], n: int) -> int
521
+ ```
522
+
523
+ **参数**
524
+
525
+ | 参数 | 说明 |
526
+ |------|------|
527
+ | `arr` | 输入数组(不被修改) |
528
+ | `work` | 工作缓冲区(长度 ≥ n) |
529
+ | `n` | 元素个数(≥ 1) |
530
+
531
+ **返回:** 众数值
532
+
533
+ ---
534
+
535
+ ## `mean_fx` <Badge type="info" text="v1.1.0" />
536
+
537
+ 算术均值,返回定点数 ×1000。
538
+
539
+ ```redscript
540
+ fn mean_fx(arr: int[], n: int) -> int
541
+ ```
542
+
543
+ **参数**
544
+
545
+ | 参数 | 说明 |
546
+ |------|------|
547
+ | `arr` | 输入整数数组 |
548
+ | `n` | 元素个数(≥ 1) |
549
+
550
+ **返回:** sum(arr) ×1000 / n;空数组返回 0
551
+
552
+ ---
553
+
554
+ ## `std_dev_fx` <Badge type="info" text="v1.1.0" />
555
+
556
+ 总体标准差,返回定点数 ×1000(使用整数算术)。
557
+
558
+ ```redscript
559
+ fn std_dev_fx(arr: int[], n: int) -> int
560
+ ```
561
+
562
+ **参数**
563
+
564
+ | 参数 | 说明 |
565
+ |------|------|
566
+ | `arr` | 输入整数数组 |
567
+ | `n` | 元素个数(≥ 2) |
568
+
569
+ **返回:** √(Σ(xᵢ−mean)²/n) ×1000;n ≤ 1 返回 0
570
+
571
+ ---
572
+
573
+ ## `hermite_spline` <Badge type="info" text="v1.1.0" />
574
+
575
+ 三次 Hermite 样条插值,使用显式切线。
576
+
577
+ ```redscript
578
+ fn hermite_spline(p0: int, p1: int, m0: int, m1: int, t: int) -> int
579
+ ```
580
+
581
+ **参数**
582
+
583
+ | 参数 | 说明 |
584
+ |------|------|
585
+ | `p0` | 起始值 |
586
+ | `p1` | 终止值 |
587
+ | `m0` | p0 处的切线 |
588
+ | `m1` | p1 处的切线 |
589
+ | `t` | 参数 ×1000(0 = p0,1000 = p1) |
590
+
591
+ **返回:** 插值结果(与 p0/p1 同单位)
592
+
593
+ ---
594
+
595
+ ## `catmull_rom` <Badge type="info" text="v1.1.0" />
596
+
597
+ Catmull-Rom 样条,在 p1 到 p2 之间插值,切线由相邻点自动推导。
598
+
599
+ ```redscript
600
+ fn catmull_rom(p0: int, p1: int, p2: int, p3: int, t: int) -> int
601
+ ```
602
+
603
+ **参数**
604
+
605
+ | 参数 | 说明 |
606
+ |------|------|
607
+ | `p0` | 段起点前的点 |
608
+ | `p1` | 段起点 |
609
+ | `p2` | 段终点 |
610
+ | `p3` | 段终点后的点 |
611
+ | `t` | 参数 ×1000(0 = p1,1000 = p2) |
612
+
613
+ **返回:** p1 到 p2 之间的插值结果
614
+
615
+ ---