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.
- package/.github/workflows/ci.yml +1 -0
- package/README.md +119 -313
- package/README.zh.md +118 -314
- package/ROADMAP.md +5 -5
- package/dist/data/impl_test/function/counter/get.mcfunction +5 -0
- package/dist/data/impl_test/function/counter/inc.mcfunction +7 -0
- package/dist/data/impl_test/function/counter/new.mcfunction +4 -0
- package/dist/data/impl_test/function/load.mcfunction +1 -0
- package/dist/data/impl_test/function/test_impl.mcfunction +10 -0
- package/dist/data/minecraft/tags/function/load.json +5 -0
- package/dist/data/playground/function/load.mcfunction +1 -0
- package/dist/data/playground/function/start.mcfunction +4 -0
- package/dist/data/playground/function/start__say_macro_t1.mcfunction +1 -0
- package/dist/data/playground/function/stop.mcfunction +5 -0
- package/dist/data/playground/function/stop__say_macro_t0.mcfunction +1 -0
- package/dist/data/stdlib_queue8_test/function/__queue_append_apply.mcfunction +4 -0
- package/dist/data/stdlib_queue8_test/function/__queue_peek_apply.mcfunction +4 -0
- package/dist/data/stdlib_queue8_test/function/__queue_size_raw_apply.mcfunction +4 -0
- package/dist/data/stdlib_queue8_test/function/load.mcfunction +1 -0
- package/dist/data/stdlib_queue8_test/function/queue_clear.mcfunction +6 -0
- package/dist/data/stdlib_queue8_test/function/queue_empty__merge_1.mcfunction +5 -0
- package/dist/data/stdlib_queue8_test/function/queue_empty__then_0.mcfunction +5 -0
- package/dist/data/stdlib_queue8_test/function/queue_peek__merge_1.mcfunction +13 -0
- package/dist/data/stdlib_queue8_test/function/queue_peek__then_0.mcfunction +5 -0
- package/dist/data/stdlib_queue8_test/function/queue_pop__merge_1.mcfunction +15 -0
- package/dist/data/stdlib_queue8_test/function/queue_pop__then_0.mcfunction +5 -0
- package/dist/data/stdlib_queue8_test/function/queue_push__const_11.mcfunction +6 -0
- package/dist/data/stdlib_queue8_test/function/queue_push__const_22.mcfunction +6 -0
- package/dist/data/stdlib_queue8_test/function/queue_size.mcfunction +13 -0
- package/dist/data/stdlib_queue8_test/function/test_queue_push_and_size.mcfunction +13 -0
- package/dist/data/test/function/load.mcfunction +1 -0
- package/dist/data/test/function/say_at.mcfunction +6 -0
- package/dist/data/test/function/test.mcfunction +4 -0
- package/dist/pack.mcmeta +6 -0
- package/dist/package.json +1 -1
- package/dist/src/__tests__/formatter-extra.test.d.ts +7 -0
- package/dist/src/__tests__/formatter-extra.test.js +123 -0
- package/dist/src/__tests__/global-vars.test.d.ts +13 -0
- package/dist/src/__tests__/global-vars.test.js +156 -0
- package/dist/src/__tests__/lint/new-rules.test.d.ts +9 -0
- package/dist/src/__tests__/lint/new-rules.test.js +402 -0
- package/dist/src/__tests__/lsp-rename.test.d.ts +8 -0
- package/dist/src/__tests__/lsp-rename.test.js +157 -0
- package/dist/src/__tests__/mc-integration/say-fstring.test.d.ts +11 -0
- package/dist/src/__tests__/mc-integration/say-fstring.test.js +220 -0
- package/dist/src/__tests__/mc-integration/stdlib-coverage-2.test.js +1 -1
- package/dist/src/__tests__/mc-integration/stdlib-coverage-3.test.js +1 -1
- package/dist/src/__tests__/mc-integration/stdlib-coverage-4.test.js +1 -1
- package/dist/src/__tests__/mc-integration/stdlib-coverage-5.test.js +1 -1
- package/dist/src/__tests__/mc-integration/stdlib-coverage-6.test.js +1 -1
- package/dist/src/__tests__/mc-integration/stdlib-coverage-7.test.js +1 -1
- package/dist/src/__tests__/mc-integration/stdlib-coverage-8.test.js +1 -1
- package/dist/src/__tests__/mc-syntax.test.js +4 -1
- package/dist/src/__tests__/monomorphize-coverage.test.d.ts +9 -0
- package/dist/src/__tests__/monomorphize-coverage.test.js +204 -0
- package/dist/src/__tests__/optimizer-cse.test.d.ts +7 -0
- package/dist/src/__tests__/optimizer-cse.test.js +226 -0
- package/dist/src/__tests__/parser.test.js +4 -13
- package/dist/src/__tests__/repl-server-extra.test.js +6 -7
- package/dist/src/__tests__/repl-server.test.js +5 -7
- package/dist/src/__tests__/stdlib/queue.test.js +6 -6
- package/dist/src/cli.js +0 -0
- package/dist/src/lexer/index.js +2 -1
- package/dist/src/lint/index.d.ts +12 -5
- package/dist/src/lint/index.js +730 -5
- package/dist/src/lsp/main.js +0 -0
- package/dist/src/mc-test/client.d.ts +21 -0
- package/dist/src/mc-test/client.js +34 -0
- package/dist/src/mir/lower.js +108 -6
- package/dist/src/optimizer/interprocedural.js +37 -2
- package/dist/src/parser/decl-parser.d.ts +19 -0
- package/dist/src/parser/decl-parser.js +323 -0
- package/dist/src/parser/expr-parser.d.ts +46 -0
- package/dist/src/parser/expr-parser.js +759 -0
- package/dist/src/parser/index.d.ts +8 -129
- package/dist/src/parser/index.js +13 -2262
- package/dist/src/parser/stmt-parser.d.ts +28 -0
- package/dist/src/parser/stmt-parser.js +577 -0
- package/dist/src/parser/type-parser.d.ts +20 -0
- package/dist/src/parser/type-parser.js +257 -0
- package/dist/src/parser/utils.d.ts +34 -0
- package/dist/src/parser/utils.js +141 -0
- package/docs/dev/README-mc-integration-tests.md +141 -0
- package/docs/lint-rules.md +162 -0
- package/docs/stdlib/bigint.md +2 -0
- package/editors/vscode/README.md +63 -41
- package/editors/vscode/out/extension.js +1881 -1776
- package/editors/vscode/out/lsp-server.js +4257 -3651
- package/editors/vscode/package-lock.json +3 -3
- package/editors/vscode/package.json +1 -1
- package/examples/loops-demo.mcrs +87 -0
- package/package.json +1 -1
- package/redscript-docs/docs/en/stdlib/advanced.md +629 -0
- package/redscript-docs/docs/en/stdlib/bigint.md +316 -0
- package/redscript-docs/docs/en/stdlib/bits.md +292 -0
- package/redscript-docs/docs/en/stdlib/bossbar.md +177 -0
- package/redscript-docs/docs/en/stdlib/calculus.md +289 -0
- package/redscript-docs/docs/en/stdlib/color.md +353 -0
- package/redscript-docs/docs/en/stdlib/combat.md +88 -0
- package/redscript-docs/docs/en/stdlib/cooldown.md +82 -0
- package/redscript-docs/docs/en/stdlib/dialog.md +155 -0
- package/redscript-docs/docs/en/stdlib/easing.md +558 -0
- package/redscript-docs/docs/en/stdlib/ecs.md +475 -0
- package/redscript-docs/docs/en/stdlib/effects.md +324 -0
- package/redscript-docs/docs/en/stdlib/events.md +3 -0
- package/redscript-docs/docs/en/stdlib/expr.md +45 -0
- package/redscript-docs/docs/en/stdlib/fft.md +141 -0
- package/redscript-docs/docs/en/stdlib/geometry.md +430 -0
- package/redscript-docs/docs/en/stdlib/graph.md +259 -0
- package/redscript-docs/docs/en/stdlib/heap.md +185 -0
- package/redscript-docs/docs/en/stdlib/interactions.md +179 -0
- package/redscript-docs/docs/en/stdlib/inventory.md +97 -0
- package/redscript-docs/docs/en/stdlib/linalg.md +557 -0
- package/redscript-docs/docs/en/stdlib/list.md +559 -0
- package/redscript-docs/docs/en/stdlib/map.md +140 -0
- package/redscript-docs/docs/en/stdlib/math.md +193 -0
- package/redscript-docs/docs/en/stdlib/math_hp.md +149 -0
- package/redscript-docs/docs/en/stdlib/matrix.md +403 -0
- package/redscript-docs/docs/en/stdlib/mobs.md +965 -0
- package/redscript-docs/docs/en/stdlib/noise.md +244 -0
- package/redscript-docs/docs/en/stdlib/ode.md +253 -0
- package/redscript-docs/docs/en/stdlib/parabola.md +342 -0
- package/redscript-docs/docs/en/stdlib/particles.md +311 -0
- package/redscript-docs/docs/en/stdlib/pathfind.md +255 -0
- package/redscript-docs/docs/en/stdlib/physics.md +493 -0
- package/redscript-docs/docs/en/stdlib/player.md +78 -0
- package/redscript-docs/docs/en/stdlib/quaternion.md +673 -0
- package/redscript-docs/docs/en/stdlib/queue.md +134 -0
- package/redscript-docs/docs/en/stdlib/random.md +223 -0
- package/redscript-docs/docs/en/stdlib/result.md +143 -0
- package/redscript-docs/docs/en/stdlib/scheduler.md +183 -0
- package/redscript-docs/docs/en/stdlib/set_int.md +190 -0
- package/redscript-docs/docs/en/stdlib/sets.md +101 -0
- package/redscript-docs/docs/en/stdlib/signal.md +400 -0
- package/redscript-docs/docs/en/stdlib/sort.md +104 -0
- package/redscript-docs/docs/en/stdlib/spawn.md +147 -0
- package/redscript-docs/docs/en/stdlib/state.md +142 -0
- package/redscript-docs/docs/en/stdlib/strings.md +154 -0
- package/redscript-docs/docs/en/stdlib/tags.md +3451 -0
- package/redscript-docs/docs/en/stdlib/teams.md +153 -0
- package/redscript-docs/docs/en/stdlib/timer.md +246 -0
- package/redscript-docs/docs/en/stdlib/vec.md +158 -0
- package/redscript-docs/docs/en/stdlib/world.md +298 -0
- package/redscript-docs/docs/zh/stdlib/advanced.md +615 -0
- package/redscript-docs/docs/zh/stdlib/bigint.md +316 -0
- package/redscript-docs/docs/zh/stdlib/bits.md +292 -0
- package/redscript-docs/docs/zh/stdlib/bossbar.md +170 -0
- package/redscript-docs/docs/zh/stdlib/calculus.md +287 -0
- package/redscript-docs/docs/zh/stdlib/color.md +353 -0
- package/redscript-docs/docs/zh/stdlib/combat.md +88 -0
- package/redscript-docs/docs/zh/stdlib/cooldown.md +84 -0
- package/redscript-docs/docs/zh/stdlib/dialog.md +152 -0
- package/redscript-docs/docs/zh/stdlib/easing.md +558 -0
- package/redscript-docs/docs/zh/stdlib/ecs.md +472 -0
- package/redscript-docs/docs/zh/stdlib/effects.md +324 -0
- package/redscript-docs/docs/zh/stdlib/events.md +3 -0
- package/redscript-docs/docs/zh/stdlib/expr.md +37 -0
- package/redscript-docs/docs/zh/stdlib/fft.md +128 -0
- package/redscript-docs/docs/zh/stdlib/geometry.md +430 -0
- package/redscript-docs/docs/zh/stdlib/graph.md +259 -0
- package/redscript-docs/docs/zh/stdlib/heap.md +185 -0
- package/redscript-docs/docs/zh/stdlib/interactions.md +160 -0
- package/redscript-docs/docs/zh/stdlib/inventory.md +94 -0
- package/redscript-docs/docs/zh/stdlib/linalg.md +543 -0
- package/redscript-docs/docs/zh/stdlib/list.md +561 -0
- package/redscript-docs/docs/zh/stdlib/map.md +132 -0
- package/redscript-docs/docs/zh/stdlib/math.md +193 -0
- package/redscript-docs/docs/zh/stdlib/math_hp.md +143 -0
- package/redscript-docs/docs/zh/stdlib/matrix.md +396 -0
- package/redscript-docs/docs/zh/stdlib/mobs.md +965 -0
- package/redscript-docs/docs/zh/stdlib/noise.md +244 -0
- package/redscript-docs/docs/zh/stdlib/ode.md +243 -0
- package/redscript-docs/docs/zh/stdlib/parabola.md +337 -0
- package/redscript-docs/docs/zh/stdlib/particles.md +307 -0
- package/redscript-docs/docs/zh/stdlib/pathfind.md +255 -0
- package/redscript-docs/docs/zh/stdlib/physics.md +493 -0
- package/redscript-docs/docs/zh/stdlib/player.md +78 -0
- package/redscript-docs/docs/zh/stdlib/quaternion.md +669 -0
- package/redscript-docs/docs/zh/stdlib/queue.md +124 -0
- package/redscript-docs/docs/zh/stdlib/random.md +222 -0
- package/redscript-docs/docs/zh/stdlib/result.md +147 -0
- package/redscript-docs/docs/zh/stdlib/scheduler.md +173 -0
- package/redscript-docs/docs/zh/stdlib/set_int.md +180 -0
- package/redscript-docs/docs/zh/stdlib/sets.md +107 -0
- package/redscript-docs/docs/zh/stdlib/signal.md +373 -0
- package/redscript-docs/docs/zh/stdlib/sort.md +104 -0
- package/redscript-docs/docs/zh/stdlib/spawn.md +142 -0
- package/redscript-docs/docs/zh/stdlib/state.md +134 -0
- package/redscript-docs/docs/zh/stdlib/strings.md +107 -0
- package/redscript-docs/docs/zh/stdlib/tags.md +3451 -0
- package/redscript-docs/docs/zh/stdlib/teams.md +150 -0
- package/redscript-docs/docs/zh/stdlib/timer.md +254 -0
- package/redscript-docs/docs/zh/stdlib/vec.md +158 -0
- package/redscript-docs/docs/zh/stdlib/world.md +289 -0
- package/src/__tests__/formatter-extra.test.ts +139 -0
- package/src/__tests__/global-vars.test.ts +171 -0
- package/src/__tests__/lint/new-rules.test.ts +437 -0
- package/src/__tests__/lsp-rename.test.ts +171 -0
- package/src/__tests__/mc-integration/say-fstring.test.ts +211 -0
- package/src/__tests__/mc-integration/stdlib-coverage-2.test.ts +1 -1
- package/src/__tests__/mc-integration/stdlib-coverage-3.test.ts +1 -1
- package/src/__tests__/mc-integration/stdlib-coverage-4.test.ts +1 -1
- package/src/__tests__/mc-integration/stdlib-coverage-5.test.ts +1 -1
- package/src/__tests__/mc-integration/stdlib-coverage-6.test.ts +1 -1
- package/src/__tests__/mc-integration/stdlib-coverage-7.test.ts +1 -1
- package/src/__tests__/mc-integration/stdlib-coverage-8.test.ts +1 -1
- package/src/__tests__/mc-syntax.test.ts +3 -0
- package/src/__tests__/monomorphize-coverage.test.ts +220 -0
- package/src/__tests__/optimizer-cse.test.ts +250 -0
- package/src/__tests__/parser.test.ts +4 -13
- package/src/__tests__/repl-server-extra.test.ts +6 -6
- package/src/__tests__/repl-server.test.ts +5 -6
- package/src/__tests__/stdlib/queue.test.ts +6 -6
- package/src/lexer/index.ts +2 -1
- package/src/lint/index.ts +713 -5
- package/src/mc-test/client.ts +40 -0
- package/src/mir/lower.ts +111 -2
- package/src/optimizer/interprocedural.ts +40 -2
- package/src/parser/decl-parser.ts +349 -0
- package/src/parser/expr-parser.ts +838 -0
- package/src/parser/index.ts +17 -2558
- package/src/parser/stmt-parser.ts +585 -0
- package/src/parser/type-parser.ts +276 -0
- package/src/parser/utils.ts +173 -0
- 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
|
+
---
|