redscript-mc 1.2.25 → 1.2.27

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 (265) hide show
  1. package/README.md +67 -9
  2. package/README.zh.md +61 -4
  3. package/dist/__tests__/cli.test.js +1 -1
  4. package/dist/__tests__/codegen.test.js +12 -6
  5. package/dist/__tests__/e2e.test.js +6 -6
  6. package/dist/__tests__/lowering.test.js +8 -8
  7. package/dist/__tests__/optimizer.test.js +31 -0
  8. package/dist/__tests__/stdlib-advanced.test.d.ts +4 -0
  9. package/dist/__tests__/stdlib-advanced.test.js +378 -0
  10. package/dist/__tests__/stdlib-bigint.test.d.ts +7 -0
  11. package/dist/__tests__/stdlib-bigint.test.js +428 -0
  12. package/dist/__tests__/stdlib-math.test.d.ts +7 -0
  13. package/dist/__tests__/stdlib-math.test.js +352 -0
  14. package/dist/__tests__/stdlib-vec.test.d.ts +4 -0
  15. package/dist/__tests__/stdlib-vec.test.js +264 -0
  16. package/dist/ast/types.d.ts +17 -1
  17. package/dist/codegen/mcfunction/index.js +154 -18
  18. package/dist/codegen/var-allocator.d.ts +17 -0
  19. package/dist/codegen/var-allocator.js +26 -0
  20. package/dist/compile.d.ts +14 -0
  21. package/dist/compile.js +62 -5
  22. package/dist/data/arena/function/__load.mcfunction +6 -0
  23. package/dist/data/arena/function/__tick.mcfunction +2 -0
  24. package/dist/data/arena/function/announce_leaders/else_1.mcfunction +3 -0
  25. package/dist/data/arena/function/announce_leaders/foreach_0/merge_2.mcfunction +1 -0
  26. package/dist/data/arena/function/announce_leaders/foreach_0/then_0.mcfunction +3 -0
  27. package/dist/data/arena/function/announce_leaders/foreach_0.mcfunction +7 -0
  28. package/dist/data/arena/function/announce_leaders/foreach_1/merge_2.mcfunction +1 -0
  29. package/dist/data/arena/function/announce_leaders/foreach_1/then_0.mcfunction +4 -0
  30. package/dist/data/arena/function/announce_leaders/foreach_1.mcfunction +6 -0
  31. package/dist/data/arena/function/announce_leaders/merge_2.mcfunction +1 -0
  32. package/dist/data/arena/function/announce_leaders/then_0.mcfunction +4 -0
  33. package/dist/data/arena/function/announce_leaders.mcfunction +6 -0
  34. package/dist/data/arena/function/arena_tick/merge_2.mcfunction +1 -0
  35. package/dist/data/arena/function/arena_tick/then_0.mcfunction +4 -0
  36. package/dist/data/arena/function/arena_tick.mcfunction +11 -0
  37. package/dist/data/counter/function/__load.mcfunction +5 -0
  38. package/dist/data/counter/function/__tick.mcfunction +2 -0
  39. package/dist/data/counter/function/counter_tick/merge_2.mcfunction +1 -0
  40. package/dist/data/counter/function/counter_tick/then_0.mcfunction +3 -0
  41. package/dist/data/counter/function/counter_tick.mcfunction +11 -0
  42. package/dist/data/gcd2/function/__load.mcfunction +3 -0
  43. package/dist/data/gcd2/function/abs/merge_2.mcfunction +3 -0
  44. package/dist/data/gcd2/function/abs/then_0.mcfunction +5 -0
  45. package/dist/data/gcd2/function/abs.mcfunction +7 -0
  46. package/dist/data/gcd2/function/gcd/loop_body_1.mcfunction +7 -0
  47. package/dist/data/gcd2/function/gcd/loop_check_0.mcfunction +5 -0
  48. package/dist/data/gcd2/function/gcd/loop_exit_2.mcfunction +3 -0
  49. package/dist/data/gcd2/function/gcd.mcfunction +14 -0
  50. package/dist/data/gcd3/function/__load.mcfunction +3 -0
  51. package/dist/data/gcd3/function/abs/merge_2.mcfunction +3 -0
  52. package/dist/data/gcd3/function/abs/then_0.mcfunction +5 -0
  53. package/dist/data/gcd3/function/abs.mcfunction +7 -0
  54. package/dist/data/gcd3/function/gcd/loop_body_1.mcfunction +7 -0
  55. package/dist/data/gcd3/function/gcd/loop_check_0.mcfunction +5 -0
  56. package/dist/data/gcd3/function/gcd/loop_exit_2.mcfunction +3 -0
  57. package/dist/data/gcd3/function/gcd.mcfunction +14 -0
  58. package/dist/data/gcd3/function/test.mcfunction +7 -0
  59. package/dist/data/gcd3nm/function/__load.mcfunction +3 -0
  60. package/dist/data/gcd3nm/function/abs/merge_2.mcfunction +3 -0
  61. package/dist/data/gcd3nm/function/abs/then_0.mcfunction +5 -0
  62. package/dist/data/gcd3nm/function/abs.mcfunction +7 -0
  63. package/dist/data/gcd3nm/function/gcd/loop_body_1.mcfunction +7 -0
  64. package/dist/data/gcd3nm/function/gcd/loop_check_0.mcfunction +5 -0
  65. package/dist/data/gcd3nm/function/gcd/loop_exit_2.mcfunction +3 -0
  66. package/dist/data/gcd3nm/function/gcd.mcfunction +14 -0
  67. package/dist/data/gcd3nm/function/test.mcfunction +7 -0
  68. package/dist/data/gcd_test/function/__load.mcfunction +3 -0
  69. package/dist/data/gcd_test/function/abs/merge_2.mcfunction +3 -0
  70. package/dist/data/gcd_test/function/abs/then_0.mcfunction +5 -0
  71. package/dist/data/gcd_test/function/abs.mcfunction +7 -0
  72. package/dist/data/gcd_test/function/gcd/loop_body_1.mcfunction +7 -0
  73. package/dist/data/gcd_test/function/gcd/loop_check_0.mcfunction +5 -0
  74. package/dist/data/gcd_test/function/gcd/loop_exit_2.mcfunction +3 -0
  75. package/dist/data/gcd_test/function/gcd.mcfunction +14 -0
  76. package/dist/data/isqrttest/function/__load.mcfunction +6 -0
  77. package/dist/data/isqrttest/function/isqrt/loop_body_4.mcfunction +12 -0
  78. package/dist/data/isqrttest/function/isqrt/loop_check_3.mcfunction +5 -0
  79. package/dist/data/isqrttest/function/isqrt/loop_exit_5.mcfunction +3 -0
  80. package/dist/data/isqrttest/function/isqrt/merge_2.mcfunction +4 -0
  81. package/dist/data/isqrttest/function/isqrt/merge_8.mcfunction +6 -0
  82. package/dist/data/isqrttest/function/isqrt/then_0.mcfunction +3 -0
  83. package/dist/data/isqrttest/function/isqrt/then_6.mcfunction +3 -0
  84. package/dist/data/isqrttest/function/isqrt.mcfunction +7 -0
  85. package/dist/data/isqrttest/function/test.mcfunction +6 -0
  86. package/dist/data/mathtest/function/__load.mcfunction +3 -0
  87. package/dist/data/mathtest/function/abs/merge_2.mcfunction +3 -0
  88. package/dist/data/mathtest/function/abs/then_0.mcfunction +5 -0
  89. package/dist/data/mathtest/function/abs.mcfunction +6 -0
  90. package/dist/data/mathtest/function/test.mcfunction +5 -0
  91. package/dist/data/minecraft/tags/function/load.json +5 -0
  92. package/dist/data/minecraft/tags/function/tick.json +5 -0
  93. package/dist/data/mypack/function/__load.mcfunction +13 -0
  94. package/dist/data/mypack/function/_atan_init.mcfunction +2 -0
  95. package/dist/data/mypack/function/abs/merge_2.mcfunction +3 -0
  96. package/dist/data/mypack/function/abs/then_0.mcfunction +5 -0
  97. package/dist/data/mypack/function/abs.mcfunction +6 -0
  98. package/dist/data/mypack/function/atan2_fixed/__sgi_1.mcfunction +2 -0
  99. package/dist/data/mypack/function/atan2_fixed/else_34.mcfunction +3 -0
  100. package/dist/data/mypack/function/atan2_fixed/loop_body_31.mcfunction +19 -0
  101. package/dist/data/mypack/function/atan2_fixed/loop_check_30.mcfunction +5 -0
  102. package/dist/data/mypack/function/atan2_fixed/loop_exit_32.mcfunction +6 -0
  103. package/dist/data/mypack/function/atan2_fixed/merge_11.mcfunction +6 -0
  104. package/dist/data/mypack/function/atan2_fixed/merge_14.mcfunction +3 -0
  105. package/dist/data/mypack/function/atan2_fixed/merge_17.mcfunction +6 -0
  106. package/dist/data/mypack/function/atan2_fixed/merge_2.mcfunction +5 -0
  107. package/dist/data/mypack/function/atan2_fixed/merge_20.mcfunction +5 -0
  108. package/dist/data/mypack/function/atan2_fixed/merge_23.mcfunction +5 -0
  109. package/dist/data/mypack/function/atan2_fixed/merge_26.mcfunction +6 -0
  110. package/dist/data/mypack/function/atan2_fixed/merge_29.mcfunction +4 -0
  111. package/dist/data/mypack/function/atan2_fixed/merge_38.mcfunction +5 -0
  112. package/dist/data/mypack/function/atan2_fixed/merge_41.mcfunction +5 -0
  113. package/dist/data/mypack/function/atan2_fixed/merge_44.mcfunction +5 -0
  114. package/dist/data/mypack/function/atan2_fixed/merge_47.mcfunction +5 -0
  115. package/dist/data/mypack/function/atan2_fixed/merge_5.mcfunction +5 -0
  116. package/dist/data/mypack/function/atan2_fixed/merge_8.mcfunction +3 -0
  117. package/dist/data/mypack/function/atan2_fixed/then_0.mcfunction +5 -0
  118. package/dist/data/mypack/function/atan2_fixed/then_12.mcfunction +3 -0
  119. package/dist/data/mypack/function/atan2_fixed/then_15.mcfunction +5 -0
  120. package/dist/data/mypack/function/atan2_fixed/then_18.mcfunction +5 -0
  121. package/dist/data/mypack/function/atan2_fixed/then_21.mcfunction +3 -0
  122. package/dist/data/mypack/function/atan2_fixed/then_24.mcfunction +3 -0
  123. package/dist/data/mypack/function/atan2_fixed/then_27.mcfunction +6 -0
  124. package/dist/data/mypack/function/atan2_fixed/then_3.mcfunction +3 -0
  125. package/dist/data/mypack/function/atan2_fixed/then_33.mcfunction +5 -0
  126. package/dist/data/mypack/function/atan2_fixed/then_36.mcfunction +5 -0
  127. package/dist/data/mypack/function/atan2_fixed/then_39.mcfunction +5 -0
  128. package/dist/data/mypack/function/atan2_fixed/then_42.mcfunction +3 -0
  129. package/dist/data/mypack/function/atan2_fixed/then_45.mcfunction +5 -0
  130. package/dist/data/mypack/function/atan2_fixed/then_6.mcfunction +3 -0
  131. package/dist/data/mypack/function/atan2_fixed/then_9.mcfunction +5 -0
  132. package/dist/data/mypack/function/atan2_fixed.mcfunction +7 -0
  133. package/dist/data/mypack/function/my_game.mcfunction +10 -0
  134. package/dist/data/quiz/function/__load.mcfunction +16 -0
  135. package/dist/data/quiz/function/__tick.mcfunction +6 -0
  136. package/dist/data/quiz/function/__trigger_quiz_a_dispatch.mcfunction +4 -0
  137. package/dist/data/quiz/function/__trigger_quiz_b_dispatch.mcfunction +4 -0
  138. package/dist/data/quiz/function/__trigger_quiz_c_dispatch.mcfunction +4 -0
  139. package/dist/data/quiz/function/__trigger_quiz_start_dispatch.mcfunction +4 -0
  140. package/dist/data/quiz/function/answer_a.mcfunction +4 -0
  141. package/dist/data/quiz/function/answer_b.mcfunction +4 -0
  142. package/dist/data/quiz/function/answer_c.mcfunction +4 -0
  143. package/dist/data/quiz/function/ask_question/else_1.mcfunction +5 -0
  144. package/dist/data/quiz/function/ask_question/else_4.mcfunction +5 -0
  145. package/dist/data/quiz/function/ask_question/else_7.mcfunction +4 -0
  146. package/dist/data/quiz/function/ask_question/merge_2.mcfunction +1 -0
  147. package/dist/data/quiz/function/ask_question/merge_5.mcfunction +2 -0
  148. package/dist/data/quiz/function/ask_question/merge_8.mcfunction +2 -0
  149. package/dist/data/quiz/function/ask_question/then_0.mcfunction +4 -0
  150. package/dist/data/quiz/function/ask_question/then_3.mcfunction +4 -0
  151. package/dist/data/quiz/function/ask_question/then_6.mcfunction +4 -0
  152. package/dist/data/quiz/function/ask_question.mcfunction +7 -0
  153. package/dist/data/quiz/function/finish_quiz.mcfunction +6 -0
  154. package/dist/data/quiz/function/handle_answer/else_1.mcfunction +5 -0
  155. package/dist/data/quiz/function/handle_answer/else_10.mcfunction +3 -0
  156. package/dist/data/quiz/function/handle_answer/else_16.mcfunction +3 -0
  157. package/dist/data/quiz/function/handle_answer/else_4.mcfunction +3 -0
  158. package/dist/data/quiz/function/handle_answer/else_7.mcfunction +5 -0
  159. package/dist/data/quiz/function/handle_answer/merge_11.mcfunction +2 -0
  160. package/dist/data/quiz/function/handle_answer/merge_14.mcfunction +2 -0
  161. package/dist/data/quiz/function/handle_answer/merge_17.mcfunction +2 -0
  162. package/dist/data/quiz/function/handle_answer/merge_2.mcfunction +8 -0
  163. package/dist/data/quiz/function/handle_answer/merge_5.mcfunction +2 -0
  164. package/dist/data/quiz/function/handle_answer/merge_8.mcfunction +2 -0
  165. package/dist/data/quiz/function/handle_answer/then_0.mcfunction +5 -0
  166. package/dist/data/quiz/function/handle_answer/then_12.mcfunction +5 -0
  167. package/dist/data/quiz/function/handle_answer/then_15.mcfunction +6 -0
  168. package/dist/data/quiz/function/handle_answer/then_3.mcfunction +6 -0
  169. package/dist/data/quiz/function/handle_answer/then_6.mcfunction +5 -0
  170. package/dist/data/quiz/function/handle_answer/then_9.mcfunction +6 -0
  171. package/dist/data/quiz/function/handle_answer.mcfunction +11 -0
  172. package/dist/data/quiz/function/start_quiz.mcfunction +5 -0
  173. package/dist/data/reqtest/function/__load.mcfunction +4 -0
  174. package/dist/data/reqtest/function/_table_init.mcfunction +2 -0
  175. package/dist/data/reqtest/function/no_trig.mcfunction +3 -0
  176. package/dist/data/reqtest/function/use_table.mcfunction +4 -0
  177. package/dist/data/reqtest2/function/__load.mcfunction +3 -0
  178. package/dist/data/reqtest2/function/no_trig.mcfunction +3 -0
  179. package/dist/data/runtime/function/__load.mcfunction +5 -0
  180. package/dist/data/runtime/function/__tick.mcfunction +2 -0
  181. package/dist/data/runtime/function/counter_tick/then_0.mcfunction +3 -0
  182. package/dist/data/runtime/function/counter_tick.mcfunction +13 -0
  183. package/dist/data/shop/function/__load.mcfunction +7 -0
  184. package/dist/data/shop/function/__tick.mcfunction +3 -0
  185. package/dist/data/shop/function/__trigger_shop_buy_dispatch.mcfunction +4 -0
  186. package/dist/data/shop/function/complete_purchase/else_1.mcfunction +5 -0
  187. package/dist/data/shop/function/complete_purchase/else_4.mcfunction +5 -0
  188. package/dist/data/shop/function/complete_purchase/else_7.mcfunction +3 -0
  189. package/dist/data/shop/function/complete_purchase/merge_2.mcfunction +2 -0
  190. package/dist/data/shop/function/complete_purchase/merge_5.mcfunction +2 -0
  191. package/dist/data/shop/function/complete_purchase/merge_8.mcfunction +2 -0
  192. package/dist/data/shop/function/complete_purchase/then_0.mcfunction +4 -0
  193. package/dist/data/shop/function/complete_purchase/then_3.mcfunction +4 -0
  194. package/dist/data/shop/function/complete_purchase/then_6.mcfunction +4 -0
  195. package/dist/data/shop/function/complete_purchase.mcfunction +7 -0
  196. package/dist/data/shop/function/handle_shop_trigger.mcfunction +3 -0
  197. package/dist/data/swap_test/function/__load.mcfunction +3 -0
  198. package/dist/data/swap_test/function/gcd_old/loop_body_1.mcfunction +7 -0
  199. package/dist/data/swap_test/function/gcd_old/loop_check_0.mcfunction +5 -0
  200. package/dist/data/swap_test/function/gcd_old/loop_exit_2.mcfunction +3 -0
  201. package/dist/data/swap_test/function/gcd_old.mcfunction +8 -0
  202. package/dist/data/turret/function/__load.mcfunction +5 -0
  203. package/dist/data/turret/function/__tick.mcfunction +4 -0
  204. package/dist/data/turret/function/__trigger_deploy_turret_dispatch.mcfunction +4 -0
  205. package/dist/data/turret/function/deploy_turret.mcfunction +8 -0
  206. package/dist/data/turret/function/turret_tick/at_1.mcfunction +2 -0
  207. package/dist/data/turret/function/turret_tick/foreach_0.mcfunction +2 -0
  208. package/dist/data/turret/function/turret_tick/foreach_2.mcfunction +2 -0
  209. package/dist/data/turret/function/turret_tick/tick_body.mcfunction +3 -0
  210. package/dist/data/turret/function/turret_tick/tick_skip.mcfunction +1 -0
  211. package/dist/data/turret/function/turret_tick.mcfunction +5 -0
  212. package/dist/gcd2.map.json +15 -0
  213. package/dist/gcd3.map.json +17 -0
  214. package/dist/gcd_test.map.json +15 -0
  215. package/dist/index.js +20 -1
  216. package/dist/ir/types.d.ts +4 -0
  217. package/dist/isqrttest.map.json +15 -0
  218. package/dist/lexer/index.d.ts +1 -1
  219. package/dist/lexer/index.js +1 -0
  220. package/dist/lowering/index.d.ts +5 -0
  221. package/dist/lowering/index.js +154 -14
  222. package/dist/mathtest.map.json +6 -0
  223. package/dist/mypack.map.json +27 -0
  224. package/dist/optimizer/dce.js +21 -5
  225. package/dist/optimizer/passes.js +18 -6
  226. package/dist/optimizer/structure.js +7 -0
  227. package/dist/pack.mcmeta +6 -0
  228. package/dist/parser/index.d.ts +5 -0
  229. package/dist/parser/index.js +43 -2
  230. package/dist/reqtest.map.json +4 -0
  231. package/dist/reqtest2.map.json +4 -0
  232. package/dist/runtime/index.d.ts +6 -0
  233. package/dist/runtime/index.js +130 -9
  234. package/dist/runtime.map.json +7 -0
  235. package/dist/swap_test.map.json +14 -0
  236. package/editors/vscode/package-lock.json +3 -3
  237. package/editors/vscode/package.json +1 -1
  238. package/examples/showcase.mcrs +505 -0
  239. package/package.json +1 -1
  240. package/src/__tests__/cli.test.ts +1 -1
  241. package/src/__tests__/codegen.test.ts +12 -6
  242. package/src/__tests__/e2e.test.ts +6 -6
  243. package/src/__tests__/lowering.test.ts +8 -8
  244. package/src/__tests__/optimizer.test.ts +33 -0
  245. package/src/__tests__/stdlib-advanced.test.ts +379 -0
  246. package/src/__tests__/stdlib-bigint.test.ts +427 -0
  247. package/src/__tests__/stdlib-math.test.ts +374 -0
  248. package/src/__tests__/stdlib-vec.test.ts +259 -0
  249. package/src/ast/types.ts +11 -1
  250. package/src/codegen/mcfunction/index.ts +143 -19
  251. package/src/codegen/var-allocator.ts +29 -0
  252. package/src/compile.ts +72 -5
  253. package/src/index.ts +21 -1
  254. package/src/ir/types.ts +2 -0
  255. package/src/lexer/index.ts +2 -1
  256. package/src/lowering/index.ts +171 -14
  257. package/src/optimizer/dce.ts +22 -5
  258. package/src/optimizer/passes.ts +18 -5
  259. package/src/optimizer/structure.ts +6 -1
  260. package/src/parser/index.ts +47 -2
  261. package/src/runtime/index.ts +130 -10
  262. package/src/stdlib/advanced.mcrs +330 -0
  263. package/src/stdlib/bigint.mcrs +205 -0
  264. package/src/stdlib/math.mcrs +274 -21
  265. package/src/stdlib/vec.mcrs +246 -0
@@ -0,0 +1,16 @@
1
+ # RedScript runtime init
2
+ scoreboard objectives add rs dummy
3
+ scoreboard objectives add quiz_start trigger
4
+ scoreboard players enable @a quiz_start
5
+ scoreboard objectives add quiz_a trigger
6
+ scoreboard players enable @a quiz_a
7
+ scoreboard objectives add quiz_b trigger
8
+ scoreboard players enable @a quiz_b
9
+ scoreboard objectives add quiz_c trigger
10
+ scoreboard players enable @a quiz_c
11
+ scoreboard players set $const_1 rs 1
12
+ scoreboard players set $const_2 rs 2
13
+ scoreboard players set $const_3 rs 3
14
+ scoreboard players set $const_1 rs 1
15
+ scoreboard players set $const_2 rs 2
16
+ scoreboard players set $const_3 rs 3
@@ -0,0 +1,6 @@
1
+ # RedScript tick dispatcher
2
+ # Trigger checks
3
+ execute as @a[scores={quiz_start=1..}] run function quiz:__trigger_quiz_start_dispatch
4
+ execute as @a[scores={quiz_a=1..}] run function quiz:__trigger_quiz_a_dispatch
5
+ execute as @a[scores={quiz_b=1..}] run function quiz:__trigger_quiz_b_dispatch
6
+ execute as @a[scores={quiz_c=1..}] run function quiz:__trigger_quiz_c_dispatch
@@ -0,0 +1,4 @@
1
+ # Trigger dispatch for quiz_a
2
+ function quiz:answer_a
3
+ scoreboard players set @s quiz_a 0
4
+ scoreboard players enable @s quiz_a
@@ -0,0 +1,4 @@
1
+ # Trigger dispatch for quiz_b
2
+ function quiz:answer_b
3
+ scoreboard players set @s quiz_b 0
4
+ scoreboard players enable @s quiz_b
@@ -0,0 +1,4 @@
1
+ # Trigger dispatch for quiz_c
2
+ function quiz:answer_c
3
+ scoreboard players set @s quiz_c 0
4
+ scoreboard players enable @s quiz_c
@@ -0,0 +1,4 @@
1
+ # Trigger dispatch for quiz_start
2
+ function quiz:start_quiz
3
+ scoreboard players set @s quiz_start 0
4
+ scoreboard players enable @s quiz_start
@@ -0,0 +1,4 @@
1
+ # block: entry
2
+ scoreboard players set $p0 rs 1
3
+ function quiz:handle_answer
4
+ scoreboard players operation $t0 rs = $ret rs
@@ -0,0 +1,4 @@
1
+ # block: entry
2
+ scoreboard players set $p0 rs 2
3
+ function quiz:handle_answer
4
+ scoreboard players operation $t0 rs = $ret rs
@@ -0,0 +1,4 @@
1
+ # block: entry
2
+ scoreboard players set $p0 rs 3
3
+ function quiz:handle_answer
4
+ scoreboard players operation $t0 rs = $ret rs
@@ -0,0 +1,5 @@
1
+ # block: else_1
2
+ scoreboard players set $t2 rs 0
3
+ execute if score $question rs = $const_2 rs run scoreboard players set $t2 rs 1
4
+ execute if score $t2 rs matches 1.. run function quiz:ask_question/then_3
5
+ execute if score $t2 rs matches ..0 run function quiz:ask_question/else_4
@@ -0,0 +1,5 @@
1
+ # block: else_4
2
+ scoreboard players set $t3 rs 0
3
+ execute if score $question rs = $const_3 rs run scoreboard players set $t3 rs 1
4
+ execute if score $t3 rs matches 1.. run function quiz:ask_question/then_6
5
+ execute if score $t3 rs matches ..0 run function quiz:ask_question/else_7
@@ -0,0 +1,4 @@
1
+ # block: else_7
2
+ function quiz:finish_quiz
3
+ scoreboard players operation $t4 rs = $ret rs
4
+ function quiz:ask_question/merge_8
@@ -0,0 +1 @@
1
+ # block: merge_2
@@ -0,0 +1,2 @@
1
+ # block: merge_5
2
+ function quiz:ask_question/merge_2
@@ -0,0 +1,2 @@
1
+ # block: merge_8
2
+ function quiz:ask_question/merge_5
@@ -0,0 +1,4 @@
1
+ # block: then_0
2
+ tellraw @s {"text":"Question 1: Which block drops diamonds?"}
3
+ tellraw @s {"text":"A) Diamond ore B) Stone C) Oak log"}
4
+ function quiz:ask_question/merge_2
@@ -0,0 +1,4 @@
1
+ # block: then_3
2
+ tellraw @s {"text":"Question 2: Which food restores more hunger?"}
3
+ tellraw @s {"text":"A) Bread B) Steak C) Beetroot"}
4
+ function quiz:ask_question/merge_5
@@ -0,0 +1,4 @@
1
+ # block: then_6
2
+ tellraw @s {"text":"Question 3: Which mob explodes?"}
3
+ tellraw @s {"text":"A) Cow B) Creeper C) Villager"}
4
+ function quiz:ask_question/merge_8
@@ -0,0 +1,7 @@
1
+ # block: entry
2
+ execute store result score $t0 rs run scoreboard players get @s quiz_question
3
+ scoreboard players operation $question rs = $t0 rs
4
+ scoreboard players set $t1 rs 0
5
+ execute if score $t0 rs = $const_1 rs run scoreboard players set $t1 rs 1
6
+ execute if score $t1 rs matches 1.. run function quiz:ask_question/then_0
7
+ execute if score $t1 rs matches ..0 run function quiz:ask_question/else_1
@@ -0,0 +1,6 @@
1
+ # block: entry
2
+ execute store result score $t0 rs run scoreboard players get @s quiz_score
3
+ title @s title {"text":"Quiz Complete"}
4
+ tellraw @s {"text":"Your final quiz score is recorded in quiz_score."}
5
+ scoreboard players set @s quiz_question 0
6
+ execute store result score @s quiz_score run scoreboard players get $t1 rs
@@ -0,0 +1,5 @@
1
+ # block: else_1
2
+ scoreboard players set $t5 rs 0
3
+ execute if score $question rs = $const_2 rs run scoreboard players set $t5 rs 1
4
+ execute if score $t5 rs matches 1.. run function quiz:handle_answer/then_6
5
+ execute if score $t5 rs matches ..0 run function quiz:handle_answer/else_7
@@ -0,0 +1,3 @@
1
+ # block: else_10
2
+ tellraw @s {"text":"Wrong. The answer was B."}
3
+ function quiz:handle_answer/merge_11
@@ -0,0 +1,3 @@
1
+ # block: else_16
2
+ tellraw @s {"text":"Wrong. The answer was B."}
3
+ function quiz:handle_answer/merge_17
@@ -0,0 +1,3 @@
1
+ # block: else_4
2
+ tellraw @s {"text":"Wrong. The answer was A."}
3
+ function quiz:handle_answer/merge_5
@@ -0,0 +1,5 @@
1
+ # block: else_7
2
+ scoreboard players set $t8 rs 0
3
+ execute if score $question rs = $const_3 rs run scoreboard players set $t8 rs 1
4
+ execute if score $t8 rs matches 1.. run function quiz:handle_answer/then_12
5
+ execute if score $t8 rs matches ..0 run function quiz:handle_answer/merge_14
@@ -0,0 +1,2 @@
1
+ # block: merge_11
2
+ function quiz:handle_answer/merge_8
@@ -0,0 +1,2 @@
1
+ # block: merge_14
2
+ function quiz:handle_answer/merge_8
@@ -0,0 +1,2 @@
1
+ # block: merge_17
2
+ function quiz:handle_answer/merge_14
@@ -0,0 +1,8 @@
1
+ # block: merge_2
2
+ execute store result score @s quiz_score run scoreboard players get $t11 rs
3
+ scoreboard players operation $t12 rs = $question rs
4
+ scoreboard players operation $t12 rs += $const_1 rs
5
+ scoreboard players operation $question rs = $t12 rs
6
+ execute store result score @s quiz_question run scoreboard players get $t13 rs
7
+ function quiz:ask_question
8
+ scoreboard players operation $t14 rs = $ret rs
@@ -0,0 +1,2 @@
1
+ # block: merge_5
2
+ function quiz:handle_answer/merge_2
@@ -0,0 +1,2 @@
1
+ # block: merge_8
2
+ function quiz:handle_answer/merge_2
@@ -0,0 +1,5 @@
1
+ # block: then_0
2
+ scoreboard players set $t3 rs 0
3
+ execute if score $choice rs = $const_1 rs run scoreboard players set $t3 rs 1
4
+ execute if score $t3 rs matches 1.. run function quiz:handle_answer/then_3
5
+ execute if score $t3 rs matches ..0 run function quiz:handle_answer/else_4
@@ -0,0 +1,5 @@
1
+ # block: then_12
2
+ scoreboard players set $t9 rs 0
3
+ execute if score $choice rs = $const_2 rs run scoreboard players set $t9 rs 1
4
+ execute if score $t9 rs matches 1.. run function quiz:handle_answer/then_15
5
+ execute if score $t9 rs matches ..0 run function quiz:handle_answer/else_16
@@ -0,0 +1,6 @@
1
+ # block: then_15
2
+ scoreboard players operation $t10 rs = $score rs
3
+ scoreboard players operation $t10 rs += $const_1 rs
4
+ scoreboard players operation $score rs = $t10 rs
5
+ tellraw @s {"text":"Correct."}
6
+ function quiz:handle_answer/merge_17
@@ -0,0 +1,6 @@
1
+ # block: then_3
2
+ scoreboard players operation $t4 rs = $score rs
3
+ scoreboard players operation $t4 rs += $const_1 rs
4
+ scoreboard players operation $score rs = $t4 rs
5
+ tellraw @s {"text":"Correct."}
6
+ function quiz:handle_answer/merge_5
@@ -0,0 +1,5 @@
1
+ # block: then_6
2
+ scoreboard players set $t6 rs 0
3
+ execute if score $choice rs = $const_2 rs run scoreboard players set $t6 rs 1
4
+ execute if score $t6 rs matches 1.. run function quiz:handle_answer/then_9
5
+ execute if score $t6 rs matches ..0 run function quiz:handle_answer/else_10
@@ -0,0 +1,6 @@
1
+ # block: then_9
2
+ scoreboard players operation $t7 rs = $score rs
3
+ scoreboard players operation $t7 rs += $const_1 rs
4
+ scoreboard players operation $score rs = $t7 rs
5
+ tellraw @s {"text":"Correct."}
6
+ function quiz:handle_answer/merge_11
@@ -0,0 +1,11 @@
1
+ # block: entry
2
+ scoreboard players operation $choice rs = $p0 rs
3
+ scoreboard players operation $choice rs = $p0 rs
4
+ execute store result score $t0 rs run scoreboard players get @s quiz_question
5
+ scoreboard players operation $question rs = $t0 rs
6
+ execute store result score $t1 rs run scoreboard players get @s quiz_score
7
+ scoreboard players operation $score rs = $t1 rs
8
+ scoreboard players set $t2 rs 0
9
+ execute if score $t0 rs = $const_1 rs run scoreboard players set $t2 rs 1
10
+ execute if score $t2 rs matches 1.. run function quiz:handle_answer/then_0
11
+ execute if score $t2 rs matches ..0 run function quiz:handle_answer/else_1
@@ -0,0 +1,5 @@
1
+ # block: entry
2
+ scoreboard players set @s quiz_score 0
3
+ scoreboard players set @s quiz_question 1
4
+ function quiz:ask_question
5
+ scoreboard players operation $t0 rs = $ret rs
@@ -0,0 +1,4 @@
1
+ # RedScript runtime init
2
+ scoreboard objectives add rs dummy
3
+ scoreboard players set $a rs 42
4
+ function reqtest:_table_init
@@ -0,0 +1,2 @@
1
+ # block: entry
2
+ scoreboard players set init rs 1
@@ -0,0 +1,3 @@
1
+ # block: entry
2
+ scoreboard players set $b rs 42
3
+ return 42
@@ -0,0 +1,4 @@
1
+ # block: entry
2
+ execute store result score $c rs run scoreboard players get value rs
3
+ scoreboard players operation $b rs = $c rs
4
+ return run scoreboard players get $c rs
@@ -0,0 +1,3 @@
1
+ # RedScript runtime init
2
+ scoreboard objectives add rs dummy
3
+ scoreboard players set $a rs 42
@@ -0,0 +1,3 @@
1
+ # block: entry
2
+ scoreboard players set $b rs 42
3
+ return 42
@@ -0,0 +1,5 @@
1
+ # RedScript runtime init
2
+ scoreboard objectives add rs dummy
3
+ scoreboard players set $a rs 0
4
+ scoreboard players set $b rs 1
5
+ scoreboard players set $c rs 100
@@ -0,0 +1,2 @@
1
+ # RedScript tick dispatcher
2
+ function runtime:counter_tick
@@ -0,0 +1,3 @@
1
+ # block: then_0
2
+ say Counter reached another 100 ticks
3
+ function runtime:counter_tick/merge_2
@@ -0,0 +1,13 @@
1
+ # block: entry
2
+ execute store result score $_0 rs run scoreboard players get counter ticks
3
+ scoreboard players operation $d rs = $e rs
4
+ scoreboard players operation $f rs = $e rs
5
+ scoreboard players operation $f rs += $b rs
6
+ scoreboard players operation $d rs = $f rs
7
+ execute store result score counter ticks run scoreboard players get $d rs
8
+ scoreboard players operation $g rs = $f rs
9
+ scoreboard players operation $g rs %= $c rs
10
+ scoreboard players set $h rs 0
11
+ execute if score $g rs = $a rs run scoreboard players set $h rs 1
12
+ execute if score $h rs matches 1.. run function runtime:counter_tick/then_0
13
+ execute if score $h rs matches ..0 run function runtime:counter_tick/merge_2
@@ -0,0 +1,7 @@
1
+ # RedScript runtime init
2
+ scoreboard objectives add rs dummy
3
+ scoreboard objectives add shop_buy trigger
4
+ scoreboard players enable @a shop_buy
5
+ scoreboard players set $const_1 rs 1
6
+ scoreboard players set $const_2 rs 2
7
+ scoreboard players set $const_3 rs 3
@@ -0,0 +1,3 @@
1
+ # RedScript tick dispatcher
2
+ # Trigger checks
3
+ execute as @a[scores={shop_buy=1..}] run function shop:__trigger_shop_buy_dispatch
@@ -0,0 +1,4 @@
1
+ # Trigger dispatch for shop_buy
2
+ function shop:handle_shop_trigger
3
+ scoreboard players set @s shop_buy 0
4
+ scoreboard players enable @s shop_buy
@@ -0,0 +1,5 @@
1
+ # block: else_1
2
+ scoreboard players set $t2 rs 0
3
+ execute if score $choice rs = $const_2 rs run scoreboard players set $t2 rs 1
4
+ execute if score $t2 rs matches 1.. run function shop:complete_purchase/then_3
5
+ execute if score $t2 rs matches ..0 run function shop:complete_purchase/else_4
@@ -0,0 +1,5 @@
1
+ # block: else_4
2
+ scoreboard players set $t3 rs 0
3
+ execute if score $choice rs = $const_3 rs run scoreboard players set $t3 rs 1
4
+ execute if score $t3 rs matches 1.. run function shop:complete_purchase/then_6
5
+ execute if score $t3 rs matches ..0 run function shop:complete_purchase/else_7
@@ -0,0 +1,3 @@
1
+ # block: else_7
2
+ tellraw @s {"text":"Invalid shop_choice. Use 1, 2, or 3."}
3
+ function shop:complete_purchase/merge_8
@@ -0,0 +1,2 @@
1
+ # block: merge_2
2
+ scoreboard players set @s shop_choice 0
@@ -0,0 +1,2 @@
1
+ # block: merge_5
2
+ function shop:complete_purchase/merge_2
@@ -0,0 +1,2 @@
1
+ # block: merge_8
2
+ function shop:complete_purchase/merge_5
@@ -0,0 +1,4 @@
1
+ # block: then_0
2
+ give @s minecraft:bread 1
3
+ tellraw @s {"text":"You bought bread."}
4
+ function shop:complete_purchase/merge_2
@@ -0,0 +1,4 @@
1
+ # block: then_3
2
+ give @s minecraft:steak 1
3
+ tellraw @s {"text":"You bought steak."}
4
+ function shop:complete_purchase/merge_5
@@ -0,0 +1,4 @@
1
+ # block: then_6
2
+ give @s minecraft:diamond 1
3
+ tellraw @s {"text":"You bought a diamond."}
4
+ function shop:complete_purchase/merge_8
@@ -0,0 +1,7 @@
1
+ # block: entry
2
+ execute store result score $t0 rs run scoreboard players get @s shop_choice
3
+ scoreboard players operation $choice rs = $t0 rs
4
+ scoreboard players set $t1 rs 0
5
+ execute if score $t0 rs = $const_1 rs run scoreboard players set $t1 rs 1
6
+ execute if score $t1 rs matches 1.. run function shop:complete_purchase/then_0
7
+ execute if score $t1 rs matches ..0 run function shop:complete_purchase/else_1
@@ -0,0 +1,3 @@
1
+ # block: entry
2
+ function shop:complete_purchase
3
+ scoreboard players operation $t0 rs = $ret rs
@@ -0,0 +1,3 @@
1
+ # RedScript runtime init
2
+ scoreboard objectives add rs dummy
3
+ scoreboard players set $a rs 0
@@ -0,0 +1,7 @@
1
+ # block: loop_body_1
2
+ scoreboard players operation $k rs = $i rs
3
+ scoreboard players operation $l rs = $h rs
4
+ scoreboard players operation $l rs %= $i rs
5
+ scoreboard players operation $i rs = $l rs
6
+ scoreboard players operation $h rs = $k rs
7
+ function swap_test:gcd_old/loop_check_0
@@ -0,0 +1,5 @@
1
+ # block: loop_check_0
2
+ scoreboard players set $j rs 0
3
+ execute if score $i rs > $a rs run scoreboard players set $j rs 1
4
+ execute if score $j rs matches 1.. run function swap_test:gcd_old/loop_body_1
5
+ execute if score $j rs matches ..0 run function swap_test:gcd_old/loop_exit_2
@@ -0,0 +1,3 @@
1
+ # block: loop_exit_2
2
+ scoreboard players operation $n rs = $h rs
3
+ return run scoreboard players get $h rs
@@ -0,0 +1,8 @@
1
+ # block: entry
2
+ scoreboard players operation $b rs = $c rs
3
+ scoreboard players operation $d rs = $e rs
4
+ scoreboard players operation $b rs = $f rs
5
+ scoreboard players operation $d rs = $g rs
6
+ scoreboard players operation $h rs = $f rs
7
+ scoreboard players operation $i rs = $g rs
8
+ function swap_test:gcd_old/loop_check_0
@@ -0,0 +1,5 @@
1
+ # RedScript runtime init
2
+ scoreboard objectives add rs dummy
3
+ scoreboard players set $__tick_turret_tick rs 0
4
+ scoreboard objectives add deploy_turret trigger
5
+ scoreboard players enable @a deploy_turret
@@ -0,0 +1,4 @@
1
+ # RedScript tick dispatcher
2
+ function turret:turret_tick
3
+ # Trigger checks
4
+ execute as @a[scores={deploy_turret=1..}] run function turret:__trigger_deploy_turret_dispatch
@@ -0,0 +1,4 @@
1
+ # Trigger dispatch for deploy_turret
2
+ function turret:deploy_turret
3
+ scoreboard players set @s deploy_turret 0
4
+ scoreboard players enable @s deploy_turret
@@ -0,0 +1,8 @@
1
+ # block: entry
2
+ summon minecraft:armor_stand 0 64 0 {Invisible:1b,Marker:1b,NoGravity:1b,Tags:["__rs_obj_0"]}
3
+ scoreboard players set @e[tag=__rs_obj_0,limit=1] rs 40
4
+ tag @e[tag=__rs_obj_0,limit=1] add turret
5
+ data modify storage rs:heap turretstate_state.health set value 40
6
+ execute store result score $t0 rs run data get storage rs:heap turretstate_state.health
7
+ execute store result score turret health run scoreboard players get $t1 rs
8
+ say Turret deployed.
@@ -0,0 +1,2 @@
1
+ # block: entry
2
+ execute as @e[type=zombie,distance=..8] run function turret:turret_tick/foreach_2
@@ -0,0 +1,2 @@
1
+ # block: entry
2
+ execute at @s run function turret:turret_tick/at_1
@@ -0,0 +1,2 @@
1
+ # block: entry
2
+ kill @s
@@ -0,0 +1,3 @@
1
+ # block: tick_body
2
+ scoreboard players set $__tick_turret_tick rs 0
3
+ execute as @e[type=armor_stand,tag=turret] run function turret:turret_tick/foreach_0
@@ -0,0 +1 @@
1
+ # block: tick_skip
@@ -0,0 +1,5 @@
1
+ # block: entry
2
+ scoreboard players add $__tick_turret_tick rs 1
3
+ execute store success score $__tick_turret_tick_check rs if score $__tick_turret_tick rs matches 20..
4
+ execute if score $__tick_turret_tick_check rs matches 1.. run function turret:turret_tick/tick_body
5
+ execute if score $__tick_turret_tick_check rs matches ..0 run function turret:turret_tick/tick_skip
@@ -0,0 +1,15 @@
1
+ {
2
+ "$b": "x",
3
+ "$d": "p0",
4
+ "$h": "g",
5
+ "$i": "a",
6
+ "$j": "b",
7
+ "$l": "p1",
8
+ "$m": "c",
9
+ "$p": "y",
10
+ "$s": "r",
11
+ "$a": "const:0",
12
+ "$c": "internal:p0",
13
+ "$g": "internal:ret",
14
+ "$k": "internal:p1"
15
+ }
@@ -0,0 +1,17 @@
1
+ {
2
+ "$b": "x",
3
+ "$d": "p0",
4
+ "$h": "g",
5
+ "$i": "a",
6
+ "$j": "b",
7
+ "$l": "p1",
8
+ "$m": "c",
9
+ "$p": "y",
10
+ "$s": "r",
11
+ "$t": "k",
12
+ "$v": "result",
13
+ "$a": "const:0",
14
+ "$c": "internal:p0",
15
+ "$g": "internal:ret",
16
+ "$k": "internal:p1"
17
+ }
@@ -0,0 +1,15 @@
1
+ {
2
+ "$b": "a",
3
+ "$d": "b",
4
+ "$f": "p0",
5
+ "$g": "p1",
6
+ "$h": "c",
7
+ "$k": "x",
8
+ "$m": "y",
9
+ "$o": "tmp",
10
+ "$q": "i",
11
+ "$a": "const:0",
12
+ "$c": "internal:p0",
13
+ "$e": "internal:p1",
14
+ "$i": "internal:ret"
15
+ }
package/dist/index.js CHANGED
@@ -37,8 +37,27 @@ function compile(source, options = {}) {
37
37
  const preprocessedSource = preprocessed.source;
38
38
  // Lexing
39
39
  const tokens = new lexer_1.Lexer(preprocessedSource, filePath).tokenize();
40
- // Parsing
40
+ // Parsing — user source
41
41
  const parsedAst = new parser_1.Parser(tokens, preprocessedSource, filePath).parse(namespace);
42
+ // Library imports: files that declared `module library;` are parsed independently
43
+ // (fresh Parser per file) so their functions are DCE-eligible but never bleed into user code.
44
+ const allLibrarySources = [];
45
+ for (const li of preprocessed.libraryImports ?? []) {
46
+ allLibrarySources.push({ src: li.source, fp: li.filePath });
47
+ }
48
+ for (const { src, fp } of allLibrarySources) {
49
+ const libPreprocessed = (0, compile_1.preprocessSourceWithMetadata)(src, fp ? { filePath: fp } : {});
50
+ const libTokens = new lexer_1.Lexer(libPreprocessed.source, fp).tokenize();
51
+ const libAst = new parser_1.Parser(libTokens, libPreprocessed.source, fp).parse(namespace);
52
+ for (const fn of libAst.declarations)
53
+ fn.isLibraryFn = true;
54
+ parsedAst.declarations.push(...libAst.declarations);
55
+ parsedAst.structs.push(...libAst.structs);
56
+ parsedAst.implBlocks.push(...libAst.implBlocks);
57
+ parsedAst.enums.push(...libAst.enums);
58
+ parsedAst.consts.push(...libAst.consts);
59
+ parsedAst.globals.push(...libAst.globals);
60
+ }
42
61
  const dceResult = shouldRunDce ? (0, dce_1.eliminateDeadCode)(parsedAst, preprocessed.ranges) : { program: parsedAst, warnings: [] };
43
62
  const ast = dceResult.program;
44
63
  // Type checking (warn mode - collect errors but don't block)
@@ -19,6 +19,9 @@ export type Operand = {
19
19
  } | {
20
20
  kind: 'storage';
21
21
  path: string;
22
+ } | {
23
+ kind: 'param';
24
+ index: number;
22
25
  };
23
26
  export type BinOp = '+' | '-' | '*' | '/' | '%';
24
27
  export type CmpOp = '==' | '!=' | '<' | '<=' | '>' | '>=';
@@ -104,6 +107,7 @@ export interface IRFunction {
104
107
  commands?: IRCommand[];
105
108
  isTickLoop?: boolean;
106
109
  isLoadInit?: boolean;
110
+ requiredLoads?: string[];
107
111
  isTriggerHandler?: boolean;
108
112
  triggerName?: string;
109
113
  eventTrigger?: {