redscript-mc 1.1.0 → 1.2.1
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/CHANGELOG.md +59 -0
- package/README.md +53 -10
- package/README.zh.md +53 -10
- package/dist/__tests__/cli.test.js +138 -0
- package/dist/__tests__/codegen.test.js +25 -0
- package/dist/__tests__/dce.test.d.ts +1 -0
- package/dist/__tests__/dce.test.js +137 -0
- package/dist/__tests__/e2e.test.js +190 -12
- package/dist/__tests__/lexer.test.js +31 -4
- package/dist/__tests__/lowering.test.js +172 -9
- package/dist/__tests__/mc-integration.test.js +145 -51
- package/dist/__tests__/mc-syntax.test.js +12 -0
- package/dist/__tests__/optimizer-advanced.test.js +3 -3
- package/dist/__tests__/parser.test.js +90 -0
- package/dist/__tests__/runtime.test.js +21 -8
- package/dist/__tests__/typechecker.test.js +188 -0
- package/dist/ast/types.d.ts +42 -3
- package/dist/cli.js +15 -10
- package/dist/codegen/mcfunction/index.js +30 -1
- package/dist/codegen/structure/index.d.ts +4 -1
- package/dist/codegen/structure/index.js +29 -2
- package/dist/compile.d.ts +11 -0
- package/dist/compile.js +40 -6
- package/dist/events/types.d.ts +35 -0
- package/dist/events/types.js +59 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +7 -3
- package/dist/ir/types.d.ts +4 -0
- package/dist/lexer/index.d.ts +2 -1
- package/dist/lexer/index.js +91 -1
- package/dist/lowering/index.d.ts +32 -1
- package/dist/lowering/index.js +476 -16
- package/dist/optimizer/dce.d.ts +23 -0
- package/dist/optimizer/dce.js +591 -0
- package/dist/parser/index.d.ts +4 -0
- package/dist/parser/index.js +160 -26
- package/dist/typechecker/index.d.ts +19 -0
- package/dist/typechecker/index.js +392 -17
- package/docs/ARCHITECTURE.zh.md +1088 -0
- package/docs/ENTITY_TYPE_SYSTEM.md +242 -0
- package/editors/vscode/.vscodeignore +3 -0
- package/editors/vscode/CHANGELOG.md +9 -0
- package/editors/vscode/icon.png +0 -0
- package/editors/vscode/out/extension.js +1144 -72
- package/editors/vscode/package-lock.json +2 -2
- package/editors/vscode/package.json +1 -1
- package/editors/vscode/syntaxes/redscript.tmLanguage.json +6 -2
- package/examples/spiral.mcrs +79 -0
- package/logo.png +0 -0
- package/package.json +1 -1
- package/src/__tests__/cli.test.ts +166 -0
- package/src/__tests__/codegen.test.ts +27 -0
- package/src/__tests__/dce.test.ts +129 -0
- package/src/__tests__/e2e.test.ts +201 -12
- package/src/__tests__/fixtures/event-test.mcrs +13 -0
- package/src/__tests__/fixtures/impl-test.mcrs +46 -0
- package/src/__tests__/fixtures/interval-test.mcrs +11 -0
- package/src/__tests__/fixtures/is-check-test.mcrs +20 -0
- package/src/__tests__/fixtures/timeout-test.mcrs +7 -0
- package/src/__tests__/lexer.test.ts +35 -4
- package/src/__tests__/lowering.test.ts +187 -9
- package/src/__tests__/mc-integration.test.ts +166 -51
- package/src/__tests__/mc-syntax.test.ts +14 -0
- package/src/__tests__/optimizer-advanced.test.ts +3 -3
- package/src/__tests__/parser.test.ts +102 -5
- package/src/__tests__/runtime.test.ts +24 -8
- package/src/__tests__/typechecker.test.ts +204 -0
- package/src/ast/types.ts +39 -2
- package/src/cli.ts +24 -10
- package/src/codegen/mcfunction/index.ts +31 -1
- package/src/codegen/structure/index.ts +40 -2
- package/src/compile.ts +59 -7
- package/src/events/types.ts +69 -0
- package/src/index.ts +9 -4
- package/src/ir/types.ts +4 -0
- package/src/lexer/index.ts +105 -2
- package/src/lowering/index.ts +566 -18
- package/src/optimizer/dce.ts +618 -0
- package/src/parser/index.ts +187 -29
- package/src/stdlib/README.md +34 -4
- package/src/stdlib/tags.mcrs +951 -0
- package/src/stdlib/timer.mcrs +54 -33
- package/src/typechecker/index.ts +469 -18
package/src/stdlib/timer.mcrs
CHANGED
|
@@ -1,51 +1,72 @@
|
|
|
1
|
-
//
|
|
1
|
+
// Timer utilities with an OOP-style API.
|
|
2
2
|
//
|
|
3
|
-
//
|
|
4
|
-
//
|
|
5
|
-
//
|
|
3
|
+
// Timer state is stored in scoreboard-backed runtime state. Because RedScript
|
|
4
|
+
// does not yet support dynamic scoreboard player/objective names for impl
|
|
5
|
+
// methods, this API currently uses a single shared runtime slot.
|
|
6
|
+
//
|
|
7
|
+
// The `_id` field is reserved for a future runtime-backed instance identifier.
|
|
8
|
+
// Today it remains `0`, while persistence is shared across Timer values.
|
|
6
9
|
|
|
7
10
|
struct Timer {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
fn timer_start(name: string, duration: int) {
|
|
13
|
-
scoreboard_set("timer_ticks", #rs, duration);
|
|
14
|
-
scoreboard_set("timer_active", #rs, 1);
|
|
11
|
+
_id: int,
|
|
12
|
+
_duration: int
|
|
15
13
|
}
|
|
16
14
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
15
|
+
impl Timer {
|
|
16
|
+
/// Create a new timer with the given duration in ticks.
|
|
17
|
+
fn new(duration: int) -> Timer {
|
|
18
|
+
scoreboard_set("timer_ticks", #rs, 0);
|
|
19
|
+
scoreboard_set("timer_active", #rs, 0);
|
|
20
|
+
return { _id: 0, _duration: duration };
|
|
21
|
+
}
|
|
20
22
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
+
/// Start or resume the timer.
|
|
24
|
+
fn start(self) {
|
|
25
|
+
scoreboard_set("timer_active", #rs, 1);
|
|
23
26
|
}
|
|
24
27
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
scoreboard_set("
|
|
28
|
+
/// Pause the timer.
|
|
29
|
+
fn pause(self) {
|
|
30
|
+
scoreboard_set("timer_active", #rs, 0);
|
|
31
|
+
}
|
|
28
32
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
33
|
+
/// Reset elapsed ticks back to zero.
|
|
34
|
+
fn reset(self) {
|
|
35
|
+
scoreboard_set("timer_ticks", #rs, 0);
|
|
36
|
+
}
|
|
32
37
|
|
|
33
|
-
|
|
38
|
+
/// Check whether the timer has reached its duration.
|
|
39
|
+
fn done(self) -> bool {
|
|
40
|
+
let ticks: int = scoreboard_get("timer_ticks", #rs);
|
|
41
|
+
return ticks >= self._duration;
|
|
34
42
|
}
|
|
35
43
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
44
|
+
/// Get elapsed ticks.
|
|
45
|
+
fn elapsed(self) -> int {
|
|
46
|
+
return scoreboard_get("timer_ticks", #rs);
|
|
47
|
+
}
|
|
39
48
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
49
|
+
/// Get remaining ticks, clamped at zero.
|
|
50
|
+
fn remaining(self) -> int {
|
|
51
|
+
let ticks: int = scoreboard_get("timer_ticks", #rs);
|
|
52
|
+
let left: int = self._duration - ticks;
|
|
43
53
|
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
return 1;
|
|
54
|
+
if (left > 0) {
|
|
55
|
+
return left;
|
|
47
56
|
}
|
|
57
|
+
|
|
58
|
+
return 0;
|
|
48
59
|
}
|
|
49
60
|
|
|
50
|
-
|
|
61
|
+
/// Manually advance the timer by one tick when active.
|
|
62
|
+
fn tick(self) {
|
|
63
|
+
let active: int = scoreboard_get("timer_active", #rs);
|
|
64
|
+
let ticks: int = scoreboard_get("timer_ticks", #rs);
|
|
65
|
+
|
|
66
|
+
if (active == 1) {
|
|
67
|
+
if (ticks < self._duration) {
|
|
68
|
+
scoreboard_set("timer_ticks", #rs, ticks + 1);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
51
72
|
}
|