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.
Files changed (83) hide show
  1. package/CHANGELOG.md +59 -0
  2. package/README.md +53 -10
  3. package/README.zh.md +53 -10
  4. package/dist/__tests__/cli.test.js +138 -0
  5. package/dist/__tests__/codegen.test.js +25 -0
  6. package/dist/__tests__/dce.test.d.ts +1 -0
  7. package/dist/__tests__/dce.test.js +137 -0
  8. package/dist/__tests__/e2e.test.js +190 -12
  9. package/dist/__tests__/lexer.test.js +31 -4
  10. package/dist/__tests__/lowering.test.js +172 -9
  11. package/dist/__tests__/mc-integration.test.js +145 -51
  12. package/dist/__tests__/mc-syntax.test.js +12 -0
  13. package/dist/__tests__/optimizer-advanced.test.js +3 -3
  14. package/dist/__tests__/parser.test.js +90 -0
  15. package/dist/__tests__/runtime.test.js +21 -8
  16. package/dist/__tests__/typechecker.test.js +188 -0
  17. package/dist/ast/types.d.ts +42 -3
  18. package/dist/cli.js +15 -10
  19. package/dist/codegen/mcfunction/index.js +30 -1
  20. package/dist/codegen/structure/index.d.ts +4 -1
  21. package/dist/codegen/structure/index.js +29 -2
  22. package/dist/compile.d.ts +11 -0
  23. package/dist/compile.js +40 -6
  24. package/dist/events/types.d.ts +35 -0
  25. package/dist/events/types.js +59 -0
  26. package/dist/index.d.ts +1 -0
  27. package/dist/index.js +7 -3
  28. package/dist/ir/types.d.ts +4 -0
  29. package/dist/lexer/index.d.ts +2 -1
  30. package/dist/lexer/index.js +91 -1
  31. package/dist/lowering/index.d.ts +32 -1
  32. package/dist/lowering/index.js +476 -16
  33. package/dist/optimizer/dce.d.ts +23 -0
  34. package/dist/optimizer/dce.js +591 -0
  35. package/dist/parser/index.d.ts +4 -0
  36. package/dist/parser/index.js +160 -26
  37. package/dist/typechecker/index.d.ts +19 -0
  38. package/dist/typechecker/index.js +392 -17
  39. package/docs/ARCHITECTURE.zh.md +1088 -0
  40. package/docs/ENTITY_TYPE_SYSTEM.md +242 -0
  41. package/editors/vscode/.vscodeignore +3 -0
  42. package/editors/vscode/CHANGELOG.md +9 -0
  43. package/editors/vscode/icon.png +0 -0
  44. package/editors/vscode/out/extension.js +1144 -72
  45. package/editors/vscode/package-lock.json +2 -2
  46. package/editors/vscode/package.json +1 -1
  47. package/editors/vscode/syntaxes/redscript.tmLanguage.json +6 -2
  48. package/examples/spiral.mcrs +79 -0
  49. package/logo.png +0 -0
  50. package/package.json +1 -1
  51. package/src/__tests__/cli.test.ts +166 -0
  52. package/src/__tests__/codegen.test.ts +27 -0
  53. package/src/__tests__/dce.test.ts +129 -0
  54. package/src/__tests__/e2e.test.ts +201 -12
  55. package/src/__tests__/fixtures/event-test.mcrs +13 -0
  56. package/src/__tests__/fixtures/impl-test.mcrs +46 -0
  57. package/src/__tests__/fixtures/interval-test.mcrs +11 -0
  58. package/src/__tests__/fixtures/is-check-test.mcrs +20 -0
  59. package/src/__tests__/fixtures/timeout-test.mcrs +7 -0
  60. package/src/__tests__/lexer.test.ts +35 -4
  61. package/src/__tests__/lowering.test.ts +187 -9
  62. package/src/__tests__/mc-integration.test.ts +166 -51
  63. package/src/__tests__/mc-syntax.test.ts +14 -0
  64. package/src/__tests__/optimizer-advanced.test.ts +3 -3
  65. package/src/__tests__/parser.test.ts +102 -5
  66. package/src/__tests__/runtime.test.ts +24 -8
  67. package/src/__tests__/typechecker.test.ts +204 -0
  68. package/src/ast/types.ts +39 -2
  69. package/src/cli.ts +24 -10
  70. package/src/codegen/mcfunction/index.ts +31 -1
  71. package/src/codegen/structure/index.ts +40 -2
  72. package/src/compile.ts +59 -7
  73. package/src/events/types.ts +69 -0
  74. package/src/index.ts +9 -4
  75. package/src/ir/types.ts +4 -0
  76. package/src/lexer/index.ts +105 -2
  77. package/src/lowering/index.ts +566 -18
  78. package/src/optimizer/dce.ts +618 -0
  79. package/src/parser/index.ts +187 -29
  80. package/src/stdlib/README.md +34 -4
  81. package/src/stdlib/tags.mcrs +951 -0
  82. package/src/stdlib/timer.mcrs +54 -33
  83. package/src/typechecker/index.ts +469 -18
@@ -1,51 +1,72 @@
1
- // Countdown timer helpers.
1
+ // Timer utilities with an OOP-style API.
2
2
  //
3
- // The current compiler does not propagate string literals through user-defined
4
- // function calls yet, so the `name` parameter is a forward-compatible placeholder.
5
- // This module manages one timer slot backed by fake players on the `rs` objective.
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
- ticks: int,
9
- active: int
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
- fn timer_tick(name: string) -> int {
18
- let active: int = scoreboard_get("timer_active", #rs);
19
- let ticks: int = scoreboard_get("timer_ticks", #rs);
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
- if (active == 0) {
22
- return 0;
23
+ /// Start or resume the timer.
24
+ fn start(self) {
25
+ scoreboard_set("timer_active", #rs, 1);
23
26
  }
24
27
 
25
- if (ticks > 0) {
26
- let next: int = ticks - 1;
27
- scoreboard_set("timer_ticks", #rs, next);
28
+ /// Pause the timer.
29
+ fn pause(self) {
30
+ scoreboard_set("timer_active", #rs, 0);
31
+ }
28
32
 
29
- if (next == 0) {
30
- scoreboard_set("timer_active", #rs, 0);
31
- }
33
+ /// Reset elapsed ticks back to zero.
34
+ fn reset(self) {
35
+ scoreboard_set("timer_ticks", #rs, 0);
36
+ }
32
37
 
33
- return next;
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
- scoreboard_set("timer_active", #rs, 0);
37
- return 0;
38
- }
44
+ /// Get elapsed ticks.
45
+ fn elapsed(self) -> int {
46
+ return scoreboard_get("timer_ticks", #rs);
47
+ }
39
48
 
40
- fn timer_done(name: string) -> int {
41
- let active: int = scoreboard_get("timer_active", #rs);
42
- let ticks: int = scoreboard_get("timer_ticks", #rs);
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
- if (active == 0) {
45
- if (ticks <= 0) {
46
- return 1;
54
+ if (left > 0) {
55
+ return left;
47
56
  }
57
+
58
+ return 0;
48
59
  }
49
60
 
50
- return 0;
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
  }