redscript-mc 2.0.0 → 2.1.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 (643) hide show
  1. package/.claudeignore +21 -0
  2. package/README.md +48 -16
  3. package/README.zh.md +2 -2
  4. package/dist/cli.js +0 -0
  5. package/dist/src/__tests__/budget.test.js +261 -0
  6. package/dist/src/__tests__/diagnostics.test.js +2 -3
  7. package/dist/src/__tests__/e2e/coroutine.test.d.ts +7 -0
  8. package/dist/src/__tests__/e2e/coroutine.test.js +132 -0
  9. package/dist/{src2 → src}/__tests__/e2e/macros.test.js +1 -1
  10. package/dist/{src2 → src}/__tests__/e2e/migrate.test.js +1 -1
  11. package/dist/src/__tests__/e2e/stdlib-e2e.test.d.ts +10 -0
  12. package/dist/src/__tests__/e2e/stdlib-e2e.test.js +324 -0
  13. package/dist/src/__tests__/enum.test.d.ts +10 -0
  14. package/dist/src/__tests__/enum.test.js +389 -0
  15. package/dist/src/__tests__/generics.test.d.ts +14 -0
  16. package/dist/src/__tests__/generics.test.js +367 -0
  17. package/dist/{src2 → src}/__tests__/hir/desugar.test.js +2 -2
  18. package/dist/src/__tests__/incremental.test.d.ts +5 -0
  19. package/dist/src/__tests__/incremental.test.js +308 -0
  20. package/dist/src/__tests__/lsp.test.d.ts +7 -0
  21. package/dist/src/__tests__/lsp.test.js +321 -0
  22. package/dist/src/__tests__/mc-syntax.test.js +1 -6
  23. package/dist/src/__tests__/mc-version.test.d.ts +10 -0
  24. package/dist/src/__tests__/mc-version.test.js +154 -0
  25. package/dist/{src2 → src}/__tests__/mir/arithmetic.test.js +2 -2
  26. package/dist/{src2 → src}/__tests__/mir/control-flow.test.js +2 -2
  27. package/dist/src/__tests__/modules.test.d.ts +7 -0
  28. package/dist/src/__tests__/modules.test.js +333 -0
  29. package/dist/src/__tests__/optimizer/coroutine.test.d.ts +12 -0
  30. package/dist/src/__tests__/optimizer/coroutine.test.js +251 -0
  31. package/dist/src/__tests__/optimizer/interprocedural.test.js +145 -0
  32. package/dist/src/__tests__/optimizer/lir/const_imm.test.js +138 -0
  33. package/dist/src/__tests__/optimizer/lir/dead_slot.test.js +141 -0
  34. package/dist/src/__tests__/optimizer/lir/peephole.test.js +126 -0
  35. package/dist/src/__tests__/optimizer/lir/pipeline.test.js +84 -0
  36. package/dist/src/__tests__/optimizer/nbt-batch.test.js +110 -0
  37. package/dist/src/__tests__/optimizer/selector-cache.test.js +103 -0
  38. package/dist/src/__tests__/optimizer/unroll.test.js +206 -0
  39. package/dist/src/__tests__/option.test.d.ts +14 -0
  40. package/dist/src/__tests__/option.test.js +275 -0
  41. package/dist/src/__tests__/schedule.test.d.ts +7 -0
  42. package/dist/src/__tests__/schedule.test.js +98 -0
  43. package/dist/src/__tests__/sourcemap.test.d.ts +7 -0
  44. package/dist/src/__tests__/sourcemap.test.js +227 -0
  45. package/dist/src/__tests__/stdlib-include.test.js +86 -0
  46. package/dist/src/__tests__/tuple.test.d.ts +11 -0
  47. package/dist/src/__tests__/tuple.test.js +202 -0
  48. package/dist/src/__tests__/typechecker-strict.test.d.ts +10 -0
  49. package/dist/src/__tests__/typechecker-strict.test.js +197 -0
  50. package/dist/src/ast/types.d.ts +56 -2
  51. package/dist/src/cache/deps.d.ts +41 -0
  52. package/dist/src/cache/deps.js +158 -0
  53. package/dist/src/cache/incremental.d.ts +35 -0
  54. package/dist/src/cache/incremental.js +165 -0
  55. package/dist/src/cache/index.d.ts +37 -0
  56. package/dist/src/cache/index.js +152 -0
  57. package/dist/src/cli.js +83 -45
  58. package/dist/src/compile.d.ts +3 -2
  59. package/dist/src/compile.js +34 -11
  60. package/dist/src/diagnostics/index.d.ts +1 -1
  61. package/dist/src/diagnostics/index.js +8 -11
  62. package/dist/src/emit/compile.d.ts +31 -0
  63. package/dist/src/emit/compile.js +143 -0
  64. package/dist/{src2 → src}/emit/index.d.ts +9 -0
  65. package/dist/{src2 → src}/emit/index.js +59 -8
  66. package/dist/src/emit/modules.d.ts +29 -0
  67. package/dist/src/emit/modules.js +492 -0
  68. package/dist/src/emit/sourcemap.d.ts +53 -0
  69. package/dist/src/emit/sourcemap.js +73 -0
  70. package/dist/{src2 → src}/hir/lower.d.ts +1 -1
  71. package/dist/{src2 → src}/hir/lower.js +22 -1
  72. package/dist/src/hir/monomorphize.d.ts +22 -0
  73. package/dist/src/hir/monomorphize.js +379 -0
  74. package/dist/{src2 → src}/hir/types.d.ts +35 -2
  75. package/dist/src/index.d.ts +19 -2
  76. package/dist/src/index.js +36 -14
  77. package/dist/src/lexer/index.d.ts +1 -1
  78. package/dist/src/lexer/index.js +1 -0
  79. package/dist/src/lir/budget.d.ts +37 -0
  80. package/dist/src/lir/budget.js +280 -0
  81. package/dist/{src2 → src}/lir/lower.js +19 -0
  82. package/dist/{src2 → src}/lir/types.d.ts +7 -4
  83. package/dist/src/lsp/main.d.ts +8 -0
  84. package/dist/src/lsp/main.js +11 -0
  85. package/dist/src/lsp/server.d.ts +11 -0
  86. package/dist/src/lsp/server.js +403 -0
  87. package/dist/{src2 → src}/mir/lower.d.ts +1 -1
  88. package/dist/{src2 → src}/mir/lower.js +244 -10
  89. package/dist/{src2 → src}/mir/types.d.ts +10 -2
  90. package/dist/src/optimizer/coroutine.d.ts +34 -0
  91. package/dist/src/optimizer/coroutine.js +789 -0
  92. package/dist/src/optimizer/dce.d.ts +8 -34
  93. package/dist/src/optimizer/dce.js +146 -629
  94. package/dist/src/optimizer/interprocedural.d.ts +14 -0
  95. package/dist/src/optimizer/interprocedural.js +186 -0
  96. package/dist/src/optimizer/lir/const_imm.d.ts +12 -0
  97. package/dist/src/optimizer/lir/const_imm.js +139 -0
  98. package/dist/src/optimizer/lir/dead_slot.d.ts +14 -0
  99. package/dist/src/optimizer/lir/dead_slot.js +130 -0
  100. package/dist/src/optimizer/lir/peephole.d.ts +21 -0
  101. package/dist/src/optimizer/lir/peephole.js +52 -0
  102. package/dist/src/optimizer/lir/pipeline.d.ts +10 -0
  103. package/dist/src/optimizer/lir/pipeline.js +34 -0
  104. package/dist/src/optimizer/nbt-batch.d.ts +11 -0
  105. package/dist/src/optimizer/nbt-batch.js +51 -0
  106. package/dist/{src2 → src}/optimizer/pipeline.d.ts +4 -0
  107. package/dist/{src2 → src}/optimizer/pipeline.js +17 -1
  108. package/dist/src/optimizer/selector-cache.d.ts +22 -0
  109. package/dist/src/optimizer/selector-cache.js +100 -0
  110. package/dist/src/optimizer/unroll.d.ts +32 -0
  111. package/dist/src/optimizer/unroll.js +348 -0
  112. package/dist/src/parser/index.d.ts +8 -0
  113. package/dist/src/parser/index.js +204 -14
  114. package/dist/src/repl.d.ts +1 -1
  115. package/dist/src/typechecker/index.d.ts +4 -0
  116. package/dist/src/typechecker/index.js +198 -13
  117. package/dist/src/types/mc-version.d.ts +24 -0
  118. package/dist/src/types/mc-version.js +49 -0
  119. package/docs/ROADMAP.md +395 -0
  120. package/docs/compiler-pipeline-redesign.md +27 -10
  121. package/editors/vscode/out/extension.js +25176 -8000
  122. package/editors/vscode/package-lock.json +90 -6
  123. package/editors/vscode/package.json +3 -2
  124. package/editors/vscode/src/extension.ts +97 -67
  125. package/editors/vscode/syntaxes/redscript.tmLanguage.json +34 -0
  126. package/examples/coroutine-demo.mcrs +50 -0
  127. package/examples/enum-demo.mcrs +95 -0
  128. package/examples/scheduler-demo.mcrs +59 -0
  129. package/examples/showcase.mcrs +3 -3
  130. package/jest.config.js +1 -1
  131. package/package.json +9 -3
  132. package/src/__tests__/budget.test.ts +297 -0
  133. package/src/__tests__/diagnostics.test.ts +2 -3
  134. package/src/__tests__/e2e/coroutine.test.ts +142 -0
  135. package/{src2 → src}/__tests__/e2e/macros.test.ts +1 -1
  136. package/{src2 → src}/__tests__/e2e/migrate.test.ts +1 -1
  137. package/src/__tests__/e2e/stdlib-e2e.test.ts +348 -0
  138. package/src/__tests__/enum.test.ts +425 -0
  139. package/src/__tests__/generics.test.ts +390 -0
  140. package/{src2 → src}/__tests__/hir/desugar.test.ts +2 -2
  141. package/src/__tests__/incremental.test.ts +337 -0
  142. package/src/__tests__/lsp.test.ts +359 -0
  143. package/src/__tests__/mc-syntax.test.ts +1 -7
  144. package/src/__tests__/mc-version.test.ts +178 -0
  145. package/{src2 → src}/__tests__/mir/arithmetic.test.ts +2 -2
  146. package/{src2 → src}/__tests__/mir/control-flow.test.ts +2 -2
  147. package/src/__tests__/modules.test.ts +365 -0
  148. package/src/__tests__/optimizer/coroutine.test.ts +312 -0
  149. package/src/__tests__/optimizer/interprocedural.test.ts +174 -0
  150. package/src/__tests__/optimizer/lir/const_imm.test.ts +151 -0
  151. package/src/__tests__/optimizer/lir/dead_slot.test.ts +156 -0
  152. package/src/__tests__/optimizer/lir/peephole.test.ts +136 -0
  153. package/src/__tests__/optimizer/lir/pipeline.test.ts +113 -0
  154. package/src/__tests__/optimizer/nbt-batch.test.ts +119 -0
  155. package/src/__tests__/optimizer/selector-cache.test.ts +112 -0
  156. package/src/__tests__/optimizer/unroll.test.ts +231 -0
  157. package/src/__tests__/option.test.ts +299 -0
  158. package/src/__tests__/schedule.test.ts +105 -0
  159. package/src/__tests__/sourcemap.test.ts +254 -0
  160. package/src/__tests__/stdlib-include.test.ts +61 -0
  161. package/src/__tests__/tuple.test.ts +220 -0
  162. package/src/__tests__/typechecker-strict.test.ts +216 -0
  163. package/src/ast/types.ts +33 -2
  164. package/src/cache/deps.ts +132 -0
  165. package/src/cache/incremental.ts +173 -0
  166. package/src/cache/index.ts +135 -0
  167. package/src/cli.ts +96 -45
  168. package/src/compile.ts +46 -17
  169. package/src/diagnostics/index.ts +8 -11
  170. package/src/emit/compile.ts +179 -0
  171. package/{src2 → src}/emit/index.ts +72 -8
  172. package/src/emit/modules.ts +581 -0
  173. package/src/emit/sourcemap.ts +101 -0
  174. package/{src2 → src}/hir/lower.ts +29 -2
  175. package/src/hir/monomorphize.ts +416 -0
  176. package/{src2 → src}/hir/types.ts +15 -3
  177. package/src/index.ts +29 -10
  178. package/src/lexer/index.ts +2 -1
  179. package/src/lir/budget.ts +321 -0
  180. package/{src2 → src}/lir/lower.ts +32 -1
  181. package/{src2 → src}/lir/types.ts +7 -3
  182. package/src/lsp/main.ts +9 -0
  183. package/src/lsp/server.ts +469 -0
  184. package/{src2 → src}/mir/lower.ts +251 -8
  185. package/{src2 → src}/mir/types.ts +12 -1
  186. package/src/optimizer/coroutine.ts +996 -0
  187. package/{src2 → src}/optimizer/dce.ts +2 -1
  188. package/src/optimizer/interprocedural.ts +177 -0
  189. package/src/optimizer/lir/const_imm.ts +143 -0
  190. package/src/optimizer/lir/dead_slot.ts +123 -0
  191. package/src/optimizer/lir/peephole.ts +57 -0
  192. package/src/optimizer/lir/pipeline.ts +37 -0
  193. package/src/optimizer/nbt-batch.ts +50 -0
  194. package/{src2 → src}/optimizer/pipeline.ts +16 -1
  195. package/src/optimizer/selector-cache.ts +103 -0
  196. package/src/optimizer/unroll.ts +386 -0
  197. package/src/parser/index.ts +212 -15
  198. package/src/repl.ts +1 -1
  199. package/src/stdlib/math.mcrs +4 -4
  200. package/src/templates/quest.mcrs +4 -4
  201. package/src/typechecker/index.ts +215 -15
  202. package/src/types/mc-version.ts +46 -0
  203. package/tsconfig.json +1 -1
  204. package/.claude/commands/build-test.md +0 -10
  205. package/.claude/commands/deploy-demo.md +0 -12
  206. package/.claude/commands/stage-status.md +0 -13
  207. package/.claude/settings.json +0 -12
  208. package/CLAUDE.md +0 -231
  209. package/dist/__tests__/cli.test.js +0 -278
  210. package/dist/__tests__/codegen.test.js +0 -152
  211. package/dist/__tests__/compile-all.test.d.ts +0 -10
  212. package/dist/__tests__/compile-all.test.js +0 -108
  213. package/dist/__tests__/dce.test.js +0 -138
  214. package/dist/__tests__/diagnostics.test.d.ts +0 -4
  215. package/dist/__tests__/diagnostics.test.js +0 -149
  216. package/dist/__tests__/e2e.test.d.ts +0 -6
  217. package/dist/__tests__/e2e.test.js +0 -1847
  218. package/dist/__tests__/entity-types.test.js +0 -203
  219. package/dist/__tests__/formatter.test.js +0 -40
  220. package/dist/__tests__/lexer.test.js +0 -343
  221. package/dist/__tests__/lowering.test.js +0 -1015
  222. package/dist/__tests__/macro.test.d.ts +0 -8
  223. package/dist/__tests__/macro.test.js +0 -305
  224. package/dist/__tests__/mc-integration.test.d.ts +0 -12
  225. package/dist/__tests__/mc-integration.test.js +0 -819
  226. package/dist/__tests__/mc-syntax.test.js +0 -124
  227. package/dist/__tests__/nbt.test.js +0 -82
  228. package/dist/__tests__/optimizer-advanced.test.js +0 -124
  229. package/dist/__tests__/optimizer.test.js +0 -149
  230. package/dist/__tests__/parser.test.d.ts +0 -1
  231. package/dist/__tests__/parser.test.js +0 -807
  232. package/dist/__tests__/repl.test.d.ts +0 -1
  233. package/dist/__tests__/repl.test.js +0 -27
  234. package/dist/__tests__/runtime.test.d.ts +0 -1
  235. package/dist/__tests__/runtime.test.js +0 -289
  236. package/dist/__tests__/stdlib-advanced.test.d.ts +0 -4
  237. package/dist/__tests__/stdlib-advanced.test.js +0 -378
  238. package/dist/__tests__/stdlib-bigint.test.d.ts +0 -7
  239. package/dist/__tests__/stdlib-bigint.test.js +0 -428
  240. package/dist/__tests__/stdlib-math.test.d.ts +0 -7
  241. package/dist/__tests__/stdlib-math.test.js +0 -352
  242. package/dist/__tests__/stdlib-vec.test.d.ts +0 -4
  243. package/dist/__tests__/stdlib-vec.test.js +0 -264
  244. package/dist/__tests__/structure-optimizer.test.d.ts +0 -1
  245. package/dist/__tests__/structure-optimizer.test.js +0 -33
  246. package/dist/__tests__/typechecker.test.d.ts +0 -1
  247. package/dist/__tests__/typechecker.test.js +0 -552
  248. package/dist/__tests__/var-allocator.test.d.ts +0 -1
  249. package/dist/__tests__/var-allocator.test.js +0 -69
  250. package/dist/ast/types.d.ts +0 -514
  251. package/dist/ast/types.js +0 -9
  252. package/dist/builtins/metadata.d.ts +0 -36
  253. package/dist/builtins/metadata.js +0 -1014
  254. package/dist/cli.d.ts +0 -11
  255. package/dist/codegen/cmdblock/index.d.ts +0 -26
  256. package/dist/codegen/cmdblock/index.js +0 -45
  257. package/dist/codegen/mcfunction/index.d.ts +0 -40
  258. package/dist/codegen/mcfunction/index.js +0 -606
  259. package/dist/codegen/structure/index.d.ts +0 -24
  260. package/dist/codegen/structure/index.js +0 -279
  261. package/dist/codegen/var-allocator.d.ts +0 -45
  262. package/dist/codegen/var-allocator.js +0 -104
  263. package/dist/compile.d.ts +0 -68
  264. package/dist/data/arena/function/__load.mcfunction +0 -6
  265. package/dist/data/arena/function/__tick.mcfunction +0 -2
  266. package/dist/data/arena/function/announce_leaders/else_1.mcfunction +0 -3
  267. package/dist/data/arena/function/announce_leaders/foreach_0/merge_2.mcfunction +0 -1
  268. package/dist/data/arena/function/announce_leaders/foreach_0/then_0.mcfunction +0 -3
  269. package/dist/data/arena/function/announce_leaders/foreach_0.mcfunction +0 -7
  270. package/dist/data/arena/function/announce_leaders/foreach_1/merge_2.mcfunction +0 -1
  271. package/dist/data/arena/function/announce_leaders/foreach_1/then_0.mcfunction +0 -4
  272. package/dist/data/arena/function/announce_leaders/foreach_1.mcfunction +0 -6
  273. package/dist/data/arena/function/announce_leaders/merge_2.mcfunction +0 -1
  274. package/dist/data/arena/function/announce_leaders/then_0.mcfunction +0 -4
  275. package/dist/data/arena/function/announce_leaders.mcfunction +0 -6
  276. package/dist/data/arena/function/arena_tick/merge_2.mcfunction +0 -1
  277. package/dist/data/arena/function/arena_tick/then_0.mcfunction +0 -4
  278. package/dist/data/arena/function/arena_tick.mcfunction +0 -11
  279. package/dist/data/counter/function/__load.mcfunction +0 -5
  280. package/dist/data/counter/function/__tick.mcfunction +0 -2
  281. package/dist/data/counter/function/counter_tick/merge_2.mcfunction +0 -1
  282. package/dist/data/counter/function/counter_tick/then_0.mcfunction +0 -3
  283. package/dist/data/counter/function/counter_tick.mcfunction +0 -11
  284. package/dist/data/gcd2/function/__load.mcfunction +0 -3
  285. package/dist/data/gcd2/function/abs/merge_2.mcfunction +0 -3
  286. package/dist/data/gcd2/function/abs/then_0.mcfunction +0 -5
  287. package/dist/data/gcd2/function/abs.mcfunction +0 -7
  288. package/dist/data/gcd2/function/gcd/loop_body_1.mcfunction +0 -7
  289. package/dist/data/gcd2/function/gcd/loop_check_0.mcfunction +0 -5
  290. package/dist/data/gcd2/function/gcd/loop_exit_2.mcfunction +0 -3
  291. package/dist/data/gcd2/function/gcd.mcfunction +0 -14
  292. package/dist/data/gcd3/function/__load.mcfunction +0 -3
  293. package/dist/data/gcd3/function/abs/merge_2.mcfunction +0 -3
  294. package/dist/data/gcd3/function/abs/then_0.mcfunction +0 -5
  295. package/dist/data/gcd3/function/abs.mcfunction +0 -7
  296. package/dist/data/gcd3/function/gcd/loop_body_1.mcfunction +0 -7
  297. package/dist/data/gcd3/function/gcd/loop_check_0.mcfunction +0 -5
  298. package/dist/data/gcd3/function/gcd/loop_exit_2.mcfunction +0 -3
  299. package/dist/data/gcd3/function/gcd.mcfunction +0 -14
  300. package/dist/data/gcd3/function/test.mcfunction +0 -7
  301. package/dist/data/gcd3nm/function/__load.mcfunction +0 -3
  302. package/dist/data/gcd3nm/function/abs/merge_2.mcfunction +0 -3
  303. package/dist/data/gcd3nm/function/abs/then_0.mcfunction +0 -5
  304. package/dist/data/gcd3nm/function/abs.mcfunction +0 -7
  305. package/dist/data/gcd3nm/function/gcd/loop_body_1.mcfunction +0 -7
  306. package/dist/data/gcd3nm/function/gcd/loop_check_0.mcfunction +0 -5
  307. package/dist/data/gcd3nm/function/gcd/loop_exit_2.mcfunction +0 -3
  308. package/dist/data/gcd3nm/function/gcd.mcfunction +0 -14
  309. package/dist/data/gcd3nm/function/test.mcfunction +0 -7
  310. package/dist/data/gcd_test/function/__load.mcfunction +0 -3
  311. package/dist/data/gcd_test/function/abs/merge_2.mcfunction +0 -3
  312. package/dist/data/gcd_test/function/abs/then_0.mcfunction +0 -5
  313. package/dist/data/gcd_test/function/abs.mcfunction +0 -7
  314. package/dist/data/gcd_test/function/gcd/loop_body_1.mcfunction +0 -7
  315. package/dist/data/gcd_test/function/gcd/loop_check_0.mcfunction +0 -5
  316. package/dist/data/gcd_test/function/gcd/loop_exit_2.mcfunction +0 -3
  317. package/dist/data/gcd_test/function/gcd.mcfunction +0 -14
  318. package/dist/data/isqrttest/function/__load.mcfunction +0 -6
  319. package/dist/data/isqrttest/function/isqrt/loop_body_4.mcfunction +0 -12
  320. package/dist/data/isqrttest/function/isqrt/loop_check_3.mcfunction +0 -5
  321. package/dist/data/isqrttest/function/isqrt/loop_exit_5.mcfunction +0 -3
  322. package/dist/data/isqrttest/function/isqrt/merge_2.mcfunction +0 -4
  323. package/dist/data/isqrttest/function/isqrt/merge_8.mcfunction +0 -6
  324. package/dist/data/isqrttest/function/isqrt/then_0.mcfunction +0 -3
  325. package/dist/data/isqrttest/function/isqrt/then_6.mcfunction +0 -3
  326. package/dist/data/isqrttest/function/isqrt.mcfunction +0 -7
  327. package/dist/data/isqrttest/function/test.mcfunction +0 -6
  328. package/dist/data/mathtest/function/__load.mcfunction +0 -3
  329. package/dist/data/mathtest/function/abs/merge_2.mcfunction +0 -3
  330. package/dist/data/mathtest/function/abs/then_0.mcfunction +0 -5
  331. package/dist/data/mathtest/function/abs.mcfunction +0 -6
  332. package/dist/data/mathtest/function/test.mcfunction +0 -5
  333. package/dist/data/minecraft/tags/function/load.json +0 -5
  334. package/dist/data/minecraft/tags/function/tick.json +0 -5
  335. package/dist/data/mypack/function/__load.mcfunction +0 -13
  336. package/dist/data/mypack/function/_atan_init.mcfunction +0 -2
  337. package/dist/data/mypack/function/abs/merge_2.mcfunction +0 -3
  338. package/dist/data/mypack/function/abs/then_0.mcfunction +0 -5
  339. package/dist/data/mypack/function/abs.mcfunction +0 -6
  340. package/dist/data/mypack/function/atan2_fixed/__sgi_1.mcfunction +0 -2
  341. package/dist/data/mypack/function/atan2_fixed/else_34.mcfunction +0 -3
  342. package/dist/data/mypack/function/atan2_fixed/loop_body_31.mcfunction +0 -19
  343. package/dist/data/mypack/function/atan2_fixed/loop_check_30.mcfunction +0 -5
  344. package/dist/data/mypack/function/atan2_fixed/loop_exit_32.mcfunction +0 -6
  345. package/dist/data/mypack/function/atan2_fixed/merge_11.mcfunction +0 -6
  346. package/dist/data/mypack/function/atan2_fixed/merge_14.mcfunction +0 -3
  347. package/dist/data/mypack/function/atan2_fixed/merge_17.mcfunction +0 -6
  348. package/dist/data/mypack/function/atan2_fixed/merge_2.mcfunction +0 -5
  349. package/dist/data/mypack/function/atan2_fixed/merge_20.mcfunction +0 -5
  350. package/dist/data/mypack/function/atan2_fixed/merge_23.mcfunction +0 -5
  351. package/dist/data/mypack/function/atan2_fixed/merge_26.mcfunction +0 -6
  352. package/dist/data/mypack/function/atan2_fixed/merge_29.mcfunction +0 -4
  353. package/dist/data/mypack/function/atan2_fixed/merge_38.mcfunction +0 -5
  354. package/dist/data/mypack/function/atan2_fixed/merge_41.mcfunction +0 -5
  355. package/dist/data/mypack/function/atan2_fixed/merge_44.mcfunction +0 -5
  356. package/dist/data/mypack/function/atan2_fixed/merge_47.mcfunction +0 -5
  357. package/dist/data/mypack/function/atan2_fixed/merge_5.mcfunction +0 -5
  358. package/dist/data/mypack/function/atan2_fixed/merge_8.mcfunction +0 -3
  359. package/dist/data/mypack/function/atan2_fixed/then_0.mcfunction +0 -5
  360. package/dist/data/mypack/function/atan2_fixed/then_12.mcfunction +0 -3
  361. package/dist/data/mypack/function/atan2_fixed/then_15.mcfunction +0 -5
  362. package/dist/data/mypack/function/atan2_fixed/then_18.mcfunction +0 -5
  363. package/dist/data/mypack/function/atan2_fixed/then_21.mcfunction +0 -3
  364. package/dist/data/mypack/function/atan2_fixed/then_24.mcfunction +0 -3
  365. package/dist/data/mypack/function/atan2_fixed/then_27.mcfunction +0 -6
  366. package/dist/data/mypack/function/atan2_fixed/then_3.mcfunction +0 -3
  367. package/dist/data/mypack/function/atan2_fixed/then_33.mcfunction +0 -5
  368. package/dist/data/mypack/function/atan2_fixed/then_36.mcfunction +0 -5
  369. package/dist/data/mypack/function/atan2_fixed/then_39.mcfunction +0 -5
  370. package/dist/data/mypack/function/atan2_fixed/then_42.mcfunction +0 -3
  371. package/dist/data/mypack/function/atan2_fixed/then_45.mcfunction +0 -5
  372. package/dist/data/mypack/function/atan2_fixed/then_6.mcfunction +0 -3
  373. package/dist/data/mypack/function/atan2_fixed/then_9.mcfunction +0 -5
  374. package/dist/data/mypack/function/atan2_fixed.mcfunction +0 -7
  375. package/dist/data/mypack/function/my_game.mcfunction +0 -10
  376. package/dist/data/quiz/function/__load.mcfunction +0 -16
  377. package/dist/data/quiz/function/__tick.mcfunction +0 -6
  378. package/dist/data/quiz/function/__trigger_quiz_a_dispatch.mcfunction +0 -4
  379. package/dist/data/quiz/function/__trigger_quiz_b_dispatch.mcfunction +0 -4
  380. package/dist/data/quiz/function/__trigger_quiz_c_dispatch.mcfunction +0 -4
  381. package/dist/data/quiz/function/__trigger_quiz_start_dispatch.mcfunction +0 -4
  382. package/dist/data/quiz/function/answer_a.mcfunction +0 -4
  383. package/dist/data/quiz/function/answer_b.mcfunction +0 -4
  384. package/dist/data/quiz/function/answer_c.mcfunction +0 -4
  385. package/dist/data/quiz/function/ask_question/else_1.mcfunction +0 -5
  386. package/dist/data/quiz/function/ask_question/else_4.mcfunction +0 -5
  387. package/dist/data/quiz/function/ask_question/else_7.mcfunction +0 -4
  388. package/dist/data/quiz/function/ask_question/merge_2.mcfunction +0 -1
  389. package/dist/data/quiz/function/ask_question/merge_5.mcfunction +0 -2
  390. package/dist/data/quiz/function/ask_question/merge_8.mcfunction +0 -2
  391. package/dist/data/quiz/function/ask_question/then_0.mcfunction +0 -4
  392. package/dist/data/quiz/function/ask_question/then_3.mcfunction +0 -4
  393. package/dist/data/quiz/function/ask_question/then_6.mcfunction +0 -4
  394. package/dist/data/quiz/function/ask_question.mcfunction +0 -7
  395. package/dist/data/quiz/function/finish_quiz.mcfunction +0 -6
  396. package/dist/data/quiz/function/handle_answer/else_1.mcfunction +0 -5
  397. package/dist/data/quiz/function/handle_answer/else_10.mcfunction +0 -3
  398. package/dist/data/quiz/function/handle_answer/else_16.mcfunction +0 -3
  399. package/dist/data/quiz/function/handle_answer/else_4.mcfunction +0 -3
  400. package/dist/data/quiz/function/handle_answer/else_7.mcfunction +0 -5
  401. package/dist/data/quiz/function/handle_answer/merge_11.mcfunction +0 -2
  402. package/dist/data/quiz/function/handle_answer/merge_14.mcfunction +0 -2
  403. package/dist/data/quiz/function/handle_answer/merge_17.mcfunction +0 -2
  404. package/dist/data/quiz/function/handle_answer/merge_2.mcfunction +0 -8
  405. package/dist/data/quiz/function/handle_answer/merge_5.mcfunction +0 -2
  406. package/dist/data/quiz/function/handle_answer/merge_8.mcfunction +0 -2
  407. package/dist/data/quiz/function/handle_answer/then_0.mcfunction +0 -5
  408. package/dist/data/quiz/function/handle_answer/then_12.mcfunction +0 -5
  409. package/dist/data/quiz/function/handle_answer/then_15.mcfunction +0 -6
  410. package/dist/data/quiz/function/handle_answer/then_3.mcfunction +0 -6
  411. package/dist/data/quiz/function/handle_answer/then_6.mcfunction +0 -5
  412. package/dist/data/quiz/function/handle_answer/then_9.mcfunction +0 -6
  413. package/dist/data/quiz/function/handle_answer.mcfunction +0 -11
  414. package/dist/data/quiz/function/start_quiz.mcfunction +0 -5
  415. package/dist/data/reqtest/function/__load.mcfunction +0 -4
  416. package/dist/data/reqtest/function/_table_init.mcfunction +0 -2
  417. package/dist/data/reqtest/function/no_trig.mcfunction +0 -3
  418. package/dist/data/reqtest/function/use_table.mcfunction +0 -4
  419. package/dist/data/reqtest2/function/__load.mcfunction +0 -3
  420. package/dist/data/reqtest2/function/no_trig.mcfunction +0 -3
  421. package/dist/data/runtime/function/__load.mcfunction +0 -5
  422. package/dist/data/runtime/function/__tick.mcfunction +0 -2
  423. package/dist/data/runtime/function/counter_tick/then_0.mcfunction +0 -3
  424. package/dist/data/runtime/function/counter_tick.mcfunction +0 -13
  425. package/dist/data/shop/function/__load.mcfunction +0 -7
  426. package/dist/data/shop/function/__tick.mcfunction +0 -3
  427. package/dist/data/shop/function/__trigger_shop_buy_dispatch.mcfunction +0 -4
  428. package/dist/data/shop/function/complete_purchase/else_1.mcfunction +0 -5
  429. package/dist/data/shop/function/complete_purchase/else_4.mcfunction +0 -5
  430. package/dist/data/shop/function/complete_purchase/else_7.mcfunction +0 -3
  431. package/dist/data/shop/function/complete_purchase/merge_2.mcfunction +0 -2
  432. package/dist/data/shop/function/complete_purchase/merge_5.mcfunction +0 -2
  433. package/dist/data/shop/function/complete_purchase/merge_8.mcfunction +0 -2
  434. package/dist/data/shop/function/complete_purchase/then_0.mcfunction +0 -4
  435. package/dist/data/shop/function/complete_purchase/then_3.mcfunction +0 -4
  436. package/dist/data/shop/function/complete_purchase/then_6.mcfunction +0 -4
  437. package/dist/data/shop/function/complete_purchase.mcfunction +0 -7
  438. package/dist/data/shop/function/handle_shop_trigger.mcfunction +0 -3
  439. package/dist/data/swap_test/function/__load.mcfunction +0 -3
  440. package/dist/data/swap_test/function/gcd_old/loop_body_1.mcfunction +0 -7
  441. package/dist/data/swap_test/function/gcd_old/loop_check_0.mcfunction +0 -5
  442. package/dist/data/swap_test/function/gcd_old/loop_exit_2.mcfunction +0 -3
  443. package/dist/data/swap_test/function/gcd_old.mcfunction +0 -8
  444. package/dist/data/turret/function/__load.mcfunction +0 -5
  445. package/dist/data/turret/function/__tick.mcfunction +0 -4
  446. package/dist/data/turret/function/__trigger_deploy_turret_dispatch.mcfunction +0 -4
  447. package/dist/data/turret/function/deploy_turret.mcfunction +0 -8
  448. package/dist/data/turret/function/turret_tick/at_1.mcfunction +0 -2
  449. package/dist/data/turret/function/turret_tick/foreach_0.mcfunction +0 -2
  450. package/dist/data/turret/function/turret_tick/foreach_2.mcfunction +0 -2
  451. package/dist/data/turret/function/turret_tick/tick_body.mcfunction +0 -3
  452. package/dist/data/turret/function/turret_tick/tick_skip.mcfunction +0 -1
  453. package/dist/data/turret/function/turret_tick.mcfunction +0 -5
  454. package/dist/diagnostics/index.d.ts +0 -44
  455. package/dist/diagnostics/index.js +0 -140
  456. package/dist/events/types.d.ts +0 -35
  457. package/dist/events/types.js +0 -59
  458. package/dist/formatter/index.d.ts +0 -1
  459. package/dist/formatter/index.js +0 -26
  460. package/dist/gcd2.map.json +0 -15
  461. package/dist/gcd3.map.json +0 -17
  462. package/dist/gcd_test.map.json +0 -15
  463. package/dist/index.d.ts +0 -62
  464. package/dist/ir/builder.d.ts +0 -33
  465. package/dist/ir/builder.js +0 -99
  466. package/dist/ir/types.d.ts +0 -132
  467. package/dist/ir/types.js +0 -15
  468. package/dist/isqrttest.map.json +0 -15
  469. package/dist/lexer/index.d.ts +0 -37
  470. package/dist/lexer/index.js +0 -569
  471. package/dist/lowering/index.d.ts +0 -188
  472. package/dist/lowering/index.js +0 -3405
  473. package/dist/mathtest.map.json +0 -6
  474. package/dist/mc-test/client.d.ts +0 -128
  475. package/dist/mc-test/client.js +0 -174
  476. package/dist/mc-test/runner.d.ts +0 -28
  477. package/dist/mc-test/runner.js +0 -150
  478. package/dist/mc-test/setup.d.ts +0 -11
  479. package/dist/mc-test/setup.js +0 -98
  480. package/dist/mc-validator/index.d.ts +0 -17
  481. package/dist/mc-validator/index.js +0 -322
  482. package/dist/mypack.map.json +0 -27
  483. package/dist/nbt/index.d.ts +0 -86
  484. package/dist/nbt/index.js +0 -250
  485. package/dist/optimizer/commands.d.ts +0 -38
  486. package/dist/optimizer/commands.js +0 -451
  487. package/dist/optimizer/dce.d.ts +0 -34
  488. package/dist/optimizer/dce.js +0 -639
  489. package/dist/optimizer/passes.d.ts +0 -34
  490. package/dist/optimizer/passes.js +0 -243
  491. package/dist/optimizer/structure.d.ts +0 -9
  492. package/dist/optimizer/structure.js +0 -356
  493. package/dist/pack.mcmeta +0 -6
  494. package/dist/parser/index.d.ts +0 -93
  495. package/dist/parser/index.js +0 -1687
  496. package/dist/repl.d.ts +0 -16
  497. package/dist/repl.js +0 -165
  498. package/dist/reqtest.map.json +0 -4
  499. package/dist/reqtest2.map.json +0 -4
  500. package/dist/runtime/index.d.ts +0 -107
  501. package/dist/runtime/index.js +0 -1409
  502. package/dist/runtime.map.json +0 -7
  503. package/dist/src/__tests__/codegen.test.d.ts +0 -1
  504. package/dist/src/__tests__/codegen.test.js +0 -152
  505. package/dist/src/__tests__/e2e.test.d.ts +0 -6
  506. package/dist/src/__tests__/e2e.test.js +0 -1789
  507. package/dist/src/__tests__/entity-types.test.d.ts +0 -1
  508. package/dist/src/__tests__/entity-types.test.js +0 -203
  509. package/dist/src/__tests__/lowering.test.d.ts +0 -1
  510. package/dist/src/__tests__/lowering.test.js +0 -1015
  511. package/dist/src/__tests__/macro.test.d.ts +0 -8
  512. package/dist/src/__tests__/macro.test.js +0 -306
  513. package/dist/src/__tests__/nbt.test.d.ts +0 -1
  514. package/dist/src/__tests__/nbt.test.js +0 -82
  515. package/dist/src/__tests__/optimizer-advanced.test.d.ts +0 -1
  516. package/dist/src/__tests__/optimizer-advanced.test.js +0 -124
  517. package/dist/src/__tests__/optimizer.test.d.ts +0 -1
  518. package/dist/src/__tests__/optimizer.test.js +0 -149
  519. package/dist/src/__tests__/runtime.test.d.ts +0 -1
  520. package/dist/src/__tests__/runtime.test.js +0 -289
  521. package/dist/src/__tests__/stdlib-advanced.test.d.ts +0 -4
  522. package/dist/src/__tests__/stdlib-advanced.test.js +0 -374
  523. package/dist/src/__tests__/stdlib-bigint.test.d.ts +0 -7
  524. package/dist/src/__tests__/stdlib-bigint.test.js +0 -426
  525. package/dist/src/__tests__/stdlib-math.test.d.ts +0 -7
  526. package/dist/src/__tests__/stdlib-math.test.js +0 -351
  527. package/dist/src/__tests__/stdlib-vec.test.d.ts +0 -4
  528. package/dist/src/__tests__/stdlib-vec.test.js +0 -263
  529. package/dist/src/__tests__/structure-optimizer.test.d.ts +0 -1
  530. package/dist/src/__tests__/structure-optimizer.test.js +0 -33
  531. package/dist/src/__tests__/var-allocator.test.d.ts +0 -1
  532. package/dist/src/__tests__/var-allocator.test.js +0 -69
  533. package/dist/src/codegen/cmdblock/index.d.ts +0 -26
  534. package/dist/src/codegen/cmdblock/index.js +0 -45
  535. package/dist/src/codegen/mcfunction/index.d.ts +0 -40
  536. package/dist/src/codegen/mcfunction/index.js +0 -606
  537. package/dist/src/codegen/structure/index.d.ts +0 -24
  538. package/dist/src/codegen/structure/index.js +0 -279
  539. package/dist/src/codegen/var-allocator.d.ts +0 -45
  540. package/dist/src/codegen/var-allocator.js +0 -104
  541. package/dist/src/ir/builder.d.ts +0 -33
  542. package/dist/src/ir/builder.js +0 -99
  543. package/dist/src/ir/types.d.ts +0 -132
  544. package/dist/src/ir/types.js +0 -15
  545. package/dist/src/lowering/index.d.ts +0 -188
  546. package/dist/src/lowering/index.js +0 -3405
  547. package/dist/src/optimizer/commands.d.ts +0 -38
  548. package/dist/src/optimizer/commands.js +0 -451
  549. package/dist/src/optimizer/passes.d.ts +0 -34
  550. package/dist/src/optimizer/passes.js +0 -243
  551. package/dist/src/optimizer/structure.d.ts +0 -9
  552. package/dist/src/optimizer/structure.js +0 -356
  553. package/dist/src2/__tests__/optimizer/dce.test.d.ts +0 -1
  554. package/dist/src2/emit/compile.d.ts +0 -19
  555. package/dist/src2/emit/compile.js +0 -80
  556. package/dist/src2/optimizer/dce.d.ts +0 -8
  557. package/dist/src2/optimizer/dce.js +0 -155
  558. package/dist/swap_test.map.json +0 -14
  559. package/dist/tsconfig.tsbuildinfo +0 -1
  560. package/dist/typechecker/index.d.ts +0 -61
  561. package/dist/typechecker/index.js +0 -1034
  562. package/dist/types/entity-hierarchy.d.ts +0 -29
  563. package/dist/types/entity-hierarchy.js +0 -107
  564. package/examples/spiral.mcrs +0 -43
  565. package/src/examples/arena.mcrs +0 -44
  566. package/src/examples/counter.mcrs +0 -12
  567. package/src/examples/new_features_demo.mcrs +0 -193
  568. package/src/examples/rpg.mcrs +0 -13
  569. package/src/examples/stdlib_demo.mcrs +0 -181
  570. package/src2/emit/compile.ts +0 -99
  571. /package/dist/{__tests__/cli.test.d.ts → src/__tests__/budget.test.d.ts} +0 -0
  572. /package/dist/{src2 → src}/__tests__/e2e/basic.test.d.ts +0 -0
  573. /package/dist/{src2 → src}/__tests__/e2e/basic.test.js +0 -0
  574. /package/dist/{src2 → src}/__tests__/e2e/macros.test.d.ts +0 -0
  575. /package/dist/{src2 → src}/__tests__/e2e/migrate.test.d.ts +0 -0
  576. /package/dist/{src2 → src}/__tests__/hir/desugar.test.d.ts +0 -0
  577. /package/dist/{src2 → src}/__tests__/lir/lower.test.d.ts +0 -0
  578. /package/dist/{src2 → src}/__tests__/lir/lower.test.js +0 -0
  579. /package/dist/{src2 → src}/__tests__/lir/types.test.d.ts +0 -0
  580. /package/dist/{src2 → src}/__tests__/lir/types.test.js +0 -0
  581. /package/dist/{src2 → src}/__tests__/lir/verify.test.d.ts +0 -0
  582. /package/dist/{src2 → src}/__tests__/lir/verify.test.js +0 -0
  583. /package/dist/{src2 → src}/__tests__/mir/arithmetic.test.d.ts +0 -0
  584. /package/dist/{src2 → src}/__tests__/mir/control-flow.test.d.ts +0 -0
  585. /package/dist/{src2 → src}/__tests__/mir/verify.test.d.ts +0 -0
  586. /package/dist/{src2 → src}/__tests__/mir/verify.test.js +0 -0
  587. /package/dist/{src2 → src}/__tests__/optimizer/block_merge.test.d.ts +0 -0
  588. /package/dist/{src2 → src}/__tests__/optimizer/block_merge.test.js +0 -0
  589. /package/dist/{src2 → src}/__tests__/optimizer/branch_simplify.test.d.ts +0 -0
  590. /package/dist/{src2 → src}/__tests__/optimizer/branch_simplify.test.js +0 -0
  591. /package/dist/{src2 → src}/__tests__/optimizer/constant_fold.test.d.ts +0 -0
  592. /package/dist/{src2 → src}/__tests__/optimizer/constant_fold.test.js +0 -0
  593. /package/dist/{src2 → src}/__tests__/optimizer/copy_prop.test.d.ts +0 -0
  594. /package/dist/{src2 → src}/__tests__/optimizer/copy_prop.test.js +0 -0
  595. /package/dist/{__tests__ → src/__tests__/optimizer}/dce.test.d.ts +0 -0
  596. /package/dist/{src2 → src}/__tests__/optimizer/dce.test.js +0 -0
  597. /package/dist/{__tests__/codegen.test.d.ts → src/__tests__/optimizer/interprocedural.test.d.ts} +0 -0
  598. /package/dist/{__tests__/entity-types.test.d.ts → src/__tests__/optimizer/lir/const_imm.test.d.ts} +0 -0
  599. /package/dist/{__tests__/formatter.test.d.ts → src/__tests__/optimizer/lir/dead_slot.test.d.ts} +0 -0
  600. /package/dist/{__tests__/lexer.test.d.ts → src/__tests__/optimizer/lir/peephole.test.d.ts} +0 -0
  601. /package/dist/{src2/__tests__/optimizer → src/__tests__/optimizer/lir}/pipeline.test.d.ts +0 -0
  602. /package/dist/{__tests__/lowering.test.d.ts → src/__tests__/optimizer/nbt-batch.test.d.ts} +0 -0
  603. /package/dist/{__tests__/mc-syntax.test.d.ts → src/__tests__/optimizer/pipeline.test.d.ts} +0 -0
  604. /package/dist/{src2 → src}/__tests__/optimizer/pipeline.test.js +0 -0
  605. /package/dist/{__tests__/nbt.test.d.ts → src/__tests__/optimizer/selector-cache.test.d.ts} +0 -0
  606. /package/dist/{__tests__/optimizer-advanced.test.d.ts → src/__tests__/optimizer/unroll.test.d.ts} +0 -0
  607. /package/dist/{__tests__/optimizer.test.d.ts → src/__tests__/stdlib-include.test.d.ts} +0 -0
  608. /package/dist/{src2 → src}/hir/types.js +0 -0
  609. /package/dist/{src2 → src}/lir/lower.d.ts +0 -0
  610. /package/dist/{src2 → src}/lir/types.js +0 -0
  611. /package/dist/{src2 → src}/lir/verify.d.ts +0 -0
  612. /package/dist/{src2 → src}/lir/verify.js +0 -0
  613. /package/dist/{src2 → src}/mir/macro.d.ts +0 -0
  614. /package/dist/{src2 → src}/mir/macro.js +0 -0
  615. /package/dist/{src2 → src}/mir/types.js +0 -0
  616. /package/dist/{src2 → src}/mir/verify.d.ts +0 -0
  617. /package/dist/{src2 → src}/mir/verify.js +0 -0
  618. /package/dist/{src2 → src}/optimizer/block_merge.d.ts +0 -0
  619. /package/dist/{src2 → src}/optimizer/block_merge.js +0 -0
  620. /package/dist/{src2 → src}/optimizer/branch_simplify.d.ts +0 -0
  621. /package/dist/{src2 → src}/optimizer/branch_simplify.js +0 -0
  622. /package/dist/{src2 → src}/optimizer/constant_fold.d.ts +0 -0
  623. /package/dist/{src2 → src}/optimizer/constant_fold.js +0 -0
  624. /package/dist/{src2 → src}/optimizer/copy_prop.d.ts +0 -0
  625. /package/dist/{src2 → src}/optimizer/copy_prop.js +0 -0
  626. /package/{src2 → src}/__tests__/e2e/basic.test.ts +0 -0
  627. /package/{src2 → src}/__tests__/lir/lower.test.ts +0 -0
  628. /package/{src2 → src}/__tests__/lir/types.test.ts +0 -0
  629. /package/{src2 → src}/__tests__/lir/verify.test.ts +0 -0
  630. /package/{src2 → src}/__tests__/mir/verify.test.ts +0 -0
  631. /package/{src2 → src}/__tests__/optimizer/block_merge.test.ts +0 -0
  632. /package/{src2 → src}/__tests__/optimizer/branch_simplify.test.ts +0 -0
  633. /package/{src2 → src}/__tests__/optimizer/constant_fold.test.ts +0 -0
  634. /package/{src2 → src}/__tests__/optimizer/copy_prop.test.ts +0 -0
  635. /package/{src2 → src}/__tests__/optimizer/dce.test.ts +0 -0
  636. /package/{src2 → src}/__tests__/optimizer/pipeline.test.ts +0 -0
  637. /package/{src2 → src}/lir/verify.ts +0 -0
  638. /package/{src2 → src}/mir/macro.ts +0 -0
  639. /package/{src2 → src}/mir/verify.ts +0 -0
  640. /package/{src2 → src}/optimizer/block_merge.ts +0 -0
  641. /package/{src2 → src}/optimizer/branch_simplify.ts +0 -0
  642. /package/{src2 → src}/optimizer/constant_fold.ts +0 -0
  643. /package/{src2 → src}/optimizer/copy_prop.ts +0 -0
@@ -1,15 +1,16 @@
1
1
  {
2
2
  "name": "redscript-vscode",
3
- "version": "1.2.2",
3
+ "version": "1.2.9",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "redscript-vscode",
9
- "version": "1.2.2",
9
+ "version": "1.2.9",
10
10
  "license": "MIT",
11
11
  "dependencies": {
12
- "redscript": "file:../../"
12
+ "redscript": "file:../../",
13
+ "vscode-languageclient": "^9.0.1"
13
14
  },
14
15
  "devDependencies": {
15
16
  "@types/node": "^20.0.0",
@@ -23,11 +24,16 @@
23
24
  },
24
25
  "../..": {
25
26
  "name": "redscript-mc",
26
- "version": "1.2.30",
27
+ "version": "2.1.1",
27
28
  "license": "MIT",
29
+ "dependencies": {
30
+ "vscode-languageserver": "^9.0.1",
31
+ "vscode-languageserver-textdocument": "^1.0.12"
32
+ },
28
33
  "bin": {
29
- "redscript": "dist/cli.js",
30
- "rsc": "dist/cli.js"
34
+ "redscript": "dist/src/cli.js",
35
+ "redscript-lsp": "dist/src/lsp/main.js",
36
+ "rsc": "dist/src/cli.js"
31
37
  },
32
38
  "devDependencies": {
33
39
  "@types/jest": "^29.5.0",
@@ -497,6 +503,21 @@
497
503
  "dev": true,
498
504
  "license": "MIT"
499
505
  },
506
+ "node_modules/balanced-match": {
507
+ "version": "1.0.2",
508
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
509
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
510
+ "license": "MIT"
511
+ },
512
+ "node_modules/brace-expansion": {
513
+ "version": "2.0.2",
514
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
515
+ "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
516
+ "license": "MIT",
517
+ "dependencies": {
518
+ "balanced-match": "^1.0.0"
519
+ }
520
+ },
500
521
  "node_modules/esbuild": {
501
522
  "version": "0.27.3",
502
523
  "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.3.tgz",
@@ -539,10 +560,34 @@
539
560
  "@esbuild/win32-x64": "0.27.3"
540
561
  }
541
562
  },
563
+ "node_modules/minimatch": {
564
+ "version": "5.1.9",
565
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz",
566
+ "integrity": "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==",
567
+ "license": "ISC",
568
+ "dependencies": {
569
+ "brace-expansion": "^2.0.1"
570
+ },
571
+ "engines": {
572
+ "node": ">=10"
573
+ }
574
+ },
542
575
  "node_modules/redscript": {
543
576
  "resolved": "../..",
544
577
  "link": true
545
578
  },
579
+ "node_modules/semver": {
580
+ "version": "7.7.4",
581
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
582
+ "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
583
+ "license": "ISC",
584
+ "bin": {
585
+ "semver": "bin/semver.js"
586
+ },
587
+ "engines": {
588
+ "node": ">=10"
589
+ }
590
+ },
546
591
  "node_modules/typescript": {
547
592
  "version": "5.9.3",
548
593
  "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz",
@@ -563,6 +608,45 @@
563
608
  "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==",
564
609
  "dev": true,
565
610
  "license": "MIT"
611
+ },
612
+ "node_modules/vscode-jsonrpc": {
613
+ "version": "8.2.0",
614
+ "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.2.0.tgz",
615
+ "integrity": "sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==",
616
+ "license": "MIT",
617
+ "engines": {
618
+ "node": ">=14.0.0"
619
+ }
620
+ },
621
+ "node_modules/vscode-languageclient": {
622
+ "version": "9.0.1",
623
+ "resolved": "https://registry.npmjs.org/vscode-languageclient/-/vscode-languageclient-9.0.1.tgz",
624
+ "integrity": "sha512-JZiimVdvimEuHh5olxhxkht09m3JzUGwggb5eRUkzzJhZ2KjCN0nh55VfiED9oez9DyF8/fz1g1iBV3h+0Z2EA==",
625
+ "license": "MIT",
626
+ "dependencies": {
627
+ "minimatch": "^5.1.0",
628
+ "semver": "^7.3.7",
629
+ "vscode-languageserver-protocol": "3.17.5"
630
+ },
631
+ "engines": {
632
+ "vscode": "^1.82.0"
633
+ }
634
+ },
635
+ "node_modules/vscode-languageserver-protocol": {
636
+ "version": "3.17.5",
637
+ "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.5.tgz",
638
+ "integrity": "sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==",
639
+ "license": "MIT",
640
+ "dependencies": {
641
+ "vscode-jsonrpc": "8.2.0",
642
+ "vscode-languageserver-types": "3.17.5"
643
+ }
644
+ },
645
+ "node_modules/vscode-languageserver-types": {
646
+ "version": "3.17.5",
647
+ "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz",
648
+ "integrity": "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==",
649
+ "license": "MIT"
566
650
  }
567
651
  }
568
652
  }
@@ -2,7 +2,7 @@
2
2
  "name": "redscript-vscode",
3
3
  "displayName": "RedScript for Minecraft",
4
4
  "description": "Syntax highlighting, error diagnostics, and language support for RedScript — a compiler targeting Minecraft Java Edition",
5
- "version": "1.2.2",
5
+ "version": "1.2.9",
6
6
  "publisher": "bkmashiro",
7
7
  "icon": "icon.png",
8
8
  "license": "MIT",
@@ -139,6 +139,7 @@
139
139
  "typescript": "^5.3.0"
140
140
  },
141
141
  "dependencies": {
142
- "redscript": "file:../../"
142
+ "redscript": "file:../../",
143
+ "vscode-languageclient": "^9.0.1"
143
144
  }
144
145
  }
@@ -1,8 +1,16 @@
1
1
  import * as vscode from 'vscode'
2
+ import * as path from 'path'
3
+ import {
4
+ LanguageClient,
5
+ LanguageClientOptions,
6
+ ServerOptions,
7
+ TransportKind,
8
+ } from 'vscode-languageclient/node'
2
9
  import { registerHoverProvider } from './hover'
3
10
  import { registerCodeActions } from './codeactions'
4
11
  import { registerCompletionProvider } from './completion'
5
12
  import { registerSymbolProviders } from './symbols'
13
+
6
14
  // The compiler is bundled directly into this extension by esbuild.
7
15
  // eslint-disable-next-line @typescript-eslint/no-var-requires
8
16
  const { compile: _compile } = require('redscript') as {
@@ -18,11 +26,97 @@ function getCompile() {
18
26
 
19
27
  const DEBOUNCE_MS = 600
20
28
 
29
+ let lspClient: LanguageClient | undefined
30
+
31
+ /**
32
+ * Try to resolve the redscript-lsp binary.
33
+ * Returns the path if found (as installed alongside the redscript npm package),
34
+ * or null if not available.
35
+ */
36
+ function resolveLspServerPath(): string | null {
37
+ // When the extension bundles redscript, the LSP server is at
38
+ // node_modules/redscript/dist/src/lsp/main.js relative to the extension dir.
39
+ try {
40
+ // __dirname is the extension's out/ directory when bundled by esbuild.
41
+ const candidate = path.join(__dirname, '..', 'node_modules', 'redscript', 'dist', 'src', 'lsp', 'main.js')
42
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
43
+ require('fs').accessSync(candidate)
44
+ return candidate
45
+ } catch {
46
+ // Not found via local node_modules; try the global bin
47
+ return null
48
+ }
49
+ }
50
+
21
51
  export function activate(context: vscode.ExtensionContext): void {
52
+ // -------------------------------------------------------------------------
53
+ // LSP client (primary path)
54
+ // -------------------------------------------------------------------------
55
+ const serverModule = resolveLspServerPath()
56
+ if (serverModule) {
57
+ const serverOptions: ServerOptions = {
58
+ run: { module: serverModule, transport: TransportKind.stdio },
59
+ debug: { module: serverModule, transport: TransportKind.stdio },
60
+ }
61
+
62
+ const clientOptions: LanguageClientOptions = {
63
+ documentSelector: [{ scheme: 'file', language: 'redscript' }],
64
+ synchronize: {
65
+ fileEvents: vscode.workspace.createFileSystemWatcher('**/*.mcrs'),
66
+ },
67
+ outputChannelName: 'RedScript LSP',
68
+ }
69
+
70
+ lspClient = new LanguageClient(
71
+ 'redscript-lsp',
72
+ 'RedScript Language Server',
73
+ serverOptions,
74
+ clientOptions,
75
+ )
76
+
77
+ lspClient.start()
78
+ context.subscriptions.push({ dispose: () => lspClient?.stop() })
79
+ } else {
80
+ // -----------------------------------------------------------------------
81
+ // Fallback: bundled compiler diagnostics (no redscript-lsp available)
82
+ // -----------------------------------------------------------------------
83
+ activateFallbackDiagnostics(context)
84
+ }
85
+
86
+ // -------------------------------------------------------------------------
87
+ // Providers that always run regardless of LSP availability
88
+ // -------------------------------------------------------------------------
89
+ registerHoverProvider(context)
90
+ registerCompletionProvider(context)
91
+ registerCodeActions(context)
92
+ registerSymbolProviders(context)
93
+
94
+ // Status bar
95
+ const statusBar = vscode.window.createStatusBarItem(vscode.StatusBarAlignment.Left, 10)
96
+ statusBar.text = serverModule ? '$(pass) RedScript LSP' : '$(pass) RedScript'
97
+ statusBar.tooltip = serverModule ? 'RedScript Language Server active' : 'RedScript compiler'
98
+ statusBar.show()
99
+ context.subscriptions.push(statusBar)
100
+
101
+ context.subscriptions.push(
102
+ vscode.window.onDidChangeActiveTextEditor(editor => {
103
+ if (editor?.document.languageId === 'redscript') {
104
+ statusBar.show()
105
+ } else {
106
+ statusBar.hide()
107
+ }
108
+ })
109
+ )
110
+ }
111
+
112
+ // ---------------------------------------------------------------------------
113
+ // Fallback: bundled-compiler diagnostics (used when redscript-lsp is absent)
114
+ // ---------------------------------------------------------------------------
115
+
116
+ function activateFallbackDiagnostics(context: vscode.ExtensionContext): void {
22
117
  const diagnostics = vscode.languages.createDiagnosticCollection('redscript')
23
118
  context.subscriptions.push(diagnostics)
24
119
 
25
- // Debounce timer per document URI
26
120
  const timers = new Map<string, NodeJS.Timeout>()
27
121
 
28
122
  function scheduleValidation(doc: vscode.TextDocument) {
@@ -36,17 +130,12 @@ export function activate(context: vscode.ExtensionContext): void {
36
130
  }, DEBOUNCE_MS))
37
131
  }
38
132
 
39
- // Validate on open
40
133
  context.subscriptions.push(
41
134
  vscode.workspace.onDidOpenTextDocument(doc => scheduleValidation(doc))
42
135
  )
43
-
44
- // Validate on change
45
136
  context.subscriptions.push(
46
137
  vscode.workspace.onDidChangeTextDocument(e => scheduleValidation(e.document))
47
138
  )
48
-
49
- // Clear diagnostics on close
50
139
  context.subscriptions.push(
51
140
  vscode.workspace.onDidCloseTextDocument(doc => {
52
141
  diagnostics.delete(doc.uri)
@@ -56,40 +145,9 @@ export function activate(context: vscode.ExtensionContext): void {
56
145
  })
57
146
  )
58
147
 
59
- // Validate all already-open .rs files
60
148
  vscode.workspace.textDocuments
61
149
  .filter(d => d.languageId === 'redscript')
62
150
  .forEach(d => scheduleValidation(d))
63
-
64
- // Register hover documentation
65
- registerHoverProvider(context)
66
-
67
- // Register completions
68
- registerCompletionProvider(context)
69
-
70
- // Register code actions (quick fixes)
71
- registerCodeActions(context)
72
-
73
- // Register Go-to-Definition and Find-References
74
- registerSymbolProviders(context)
75
-
76
- // Status bar item to show compilation state
77
- const statusBar = vscode.window.createStatusBarItem(vscode.StatusBarAlignment.Left, 10)
78
- statusBar.text = '$(pass) RedScript'
79
- statusBar.tooltip = 'RedScript compiler'
80
- statusBar.show()
81
- context.subscriptions.push(statusBar)
82
-
83
- // Track the active editor's compile state
84
- context.subscriptions.push(
85
- vscode.window.onDidChangeActiveTextEditor(editor => {
86
- if (editor?.document.languageId === 'redscript') {
87
- statusBar.show()
88
- } else {
89
- statusBar.hide()
90
- }
91
- })
92
- )
93
151
  }
94
152
 
95
153
  function validateDocument(
@@ -98,7 +156,6 @@ function validateDocument(
98
156
  ): void {
99
157
  const compile = getCompile()
100
158
  if (!compile) {
101
- // Compiler not available — show a one-time info message
102
159
  collection.set(doc.uri, [{
103
160
  message: 'RedScript compiler not found. Run `npm install -g redscript` to enable diagnostics.',
104
161
  range: new vscode.Range(0, 0, 0, 0),
@@ -114,9 +171,7 @@ function validateDocument(
114
171
  try {
115
172
  const result = compile(source, { filePath: doc.uri.fsPath })
116
173
 
117
- // Convert warnings to VS Code diagnostics
118
174
  for (const w of result.warnings ?? []) {
119
- // Use real line/col from AST span when available, fall back to text search
120
175
  const range = (w.line && w.col)
121
176
  ? new vscode.Range(w.line - 1, w.col - 1, w.line - 1, w.col - 1 + 20)
122
177
  : findWarningRange(w.message, w.code, source, doc)
@@ -131,7 +186,6 @@ function validateDocument(
131
186
  } catch (err: unknown) {
132
187
  const msg = err instanceof Error ? err.message : String(err)
133
188
 
134
- // Try to get location from DiagnosticError.location first
135
189
  let range: vscode.Range
136
190
  const loc = (err as { location?: { line?: number; col?: number } }).location
137
191
  if (loc?.line && loc?.col) {
@@ -139,7 +193,6 @@ function validateDocument(
139
193
  const c = Math.max(0, loc.col - 1)
140
194
  range = new vscode.Range(l, c, l, c + 20)
141
195
  } else {
142
- // Fallback: parse the error message for line/column info
143
196
  range = extractRange(msg, doc)
144
197
  }
145
198
 
@@ -154,40 +207,27 @@ function validateDocument(
154
207
  collection.set(doc.uri, docDiagnostics)
155
208
  }
156
209
 
157
- /**
158
- * For warnings without position info, search the source for the relevant token
159
- * mentioned in the warning message.
160
- */
161
210
  function findWarningRange(
162
211
  message: string,
163
212
  code: string | undefined,
164
213
  source: string,
165
214
  doc: vscode.TextDocument
166
215
  ): vscode.Range {
167
- // W_UNNAMESPACED_TYPE: message contains the unqualified type name in quotes
168
- // e.g. 'Unnamespaced entity type "zombie"'
169
216
  if (code === 'W_UNNAMESPACED_TYPE') {
170
217
  const m = message.match(/"([^"]+)"/)
171
218
  if (m) return searchToken(source, doc, `type=${m[1]}`) ?? searchToken(source, doc, m[1]) ?? topLine(doc)
172
219
  }
173
-
174
- // W_QUOTED_SELECTOR: message contains the quoted selector
175
- // e.g. 'Quoted selector "@a" is deprecated'
176
220
  if (code === 'W_QUOTED_SELECTOR') {
177
221
  const m = message.match(/"(@[^"]+)"/)
178
222
  if (m) return searchToken(source, doc, `"${m[1]}"`) ?? topLine(doc)
179
223
  }
180
-
181
- // W_DEPRECATED: usually about tp_to
182
224
  if (code === 'W_DEPRECATED') {
183
225
  const m = message.match(/^(\w+) is deprecated/)
184
226
  if (m) return searchToken(source, doc, m[1]) ?? topLine(doc)
185
227
  }
186
-
187
228
  return topLine(doc)
188
229
  }
189
230
 
190
- /** Search source for a literal string, return range of first match. */
191
231
  function searchToken(
192
232
  source: string,
193
233
  doc: vscode.TextDocument,
@@ -203,37 +243,27 @@ function topLine(doc: vscode.TextDocument): vscode.Range {
203
243
  return new vscode.Range(0, 0, 0, doc.lineAt(0).text.length)
204
244
  }
205
245
 
206
- /**
207
- * Try to extract line/column from common error formats:
208
- * "Error at line 5, column 12: ..."
209
- * "5:12: ..."
210
- * "[line 5] ..."
211
- */
212
246
  function extractRange(msg: string, doc: vscode.TextDocument): vscode.Range {
213
- // "line N, column M"
214
247
  let m = msg.match(/line[: ]+(\d+)[,\s]+col(?:umn)?[: ]+(\d+)/i)
215
248
  if (m) {
216
249
  const l = Math.max(0, parseInt(m[1]) - 1)
217
250
  const c = Math.max(0, parseInt(m[2]) - 1)
218
251
  return new vscode.Range(l, c, l, c + 80)
219
252
  }
220
- // "N:M"
221
253
  m = msg.match(/^(\d+):(\d+)/)
222
254
  if (m) {
223
255
  const l = Math.max(0, parseInt(m[1]) - 1)
224
256
  const c = Math.max(0, parseInt(m[2]) - 1)
225
257
  return new vscode.Range(l, c, l, c + 80)
226
258
  }
227
- // "[line N]"
228
259
  m = msg.match(/\[line (\d+)\]/i)
229
260
  if (m) {
230
261
  const l = Math.max(0, parseInt(m[1]) - 1)
231
262
  return new vscode.Range(l, 0, l, 200)
232
263
  }
233
- // Fallback: highlight first line
234
264
  return new vscode.Range(0, 0, 0, doc.lineAt(0).text.length)
235
265
  }
236
266
 
237
- export function deactivate(): void {
238
- // nothing
267
+ export function deactivate(): Promise<void> | undefined {
268
+ return lspClient?.stop()
239
269
  }
@@ -8,6 +8,7 @@
8
8
  "patterns": [
9
9
  { "include": "#comments" },
10
10
  { "include": "#decorators" },
11
+ { "include": "#fstring" },
11
12
  { "include": "#string-interpolation" },
12
13
  { "include": "#strings" },
13
14
  { "include": "#keywords" },
@@ -91,6 +92,39 @@
91
92
  ]
92
93
  },
93
94
 
95
+ "fstring": {
96
+ "comment": "f-string: f\"Hello {name}\" — f prefix gets special color, {expr} highlighted",
97
+ "begin": "(f)(\")",
98
+ "beginCaptures": {
99
+ "1": { "name": "storage.type.string.redscript" },
100
+ "2": { "name": "punctuation.definition.string.begin.redscript" }
101
+ },
102
+ "end": "\"",
103
+ "endCaptures": {
104
+ "0": { "name": "punctuation.definition.string.end.redscript" }
105
+ },
106
+ "name": "string.interpolated.redscript",
107
+ "patterns": [
108
+ {
109
+ "begin": "\\{",
110
+ "end": "\\}",
111
+ "beginCaptures": { "0": { "name": "punctuation.definition.interpolation.begin.redscript" } },
112
+ "endCaptures": { "0": { "name": "punctuation.definition.interpolation.end.redscript" } },
113
+ "contentName": "meta.interpolation.redscript",
114
+ "patterns": [
115
+ { "include": "#selectors" },
116
+ { "include": "#numbers" },
117
+ { "include": "#fn-call" },
118
+ {
119
+ "name": "variable.other.redscript",
120
+ "match": "[a-zA-Z_][a-zA-Z0-9_]*"
121
+ }
122
+ ]
123
+ },
124
+ { "name": "constant.character.escape.redscript", "match": "\\\\." }
125
+ ]
126
+ },
127
+
94
128
  "string-interpolation": {
95
129
  "comment": "Interpolated string with ${expr} — highlight the expression inside",
96
130
  "begin": "\"(?=[^\"]*\\$\\{)",
@@ -0,0 +1,50 @@
1
+ // coroutine-demo.mcrs — Spread particle generation across multiple ticks
2
+ //
3
+ // @coroutine(batch=50) processes 50 iterations per tick, so 1000 total
4
+ // iterations take ~20 ticks instead of lagging one tick.
5
+ //
6
+ // Usage:
7
+ // /function demo:start_particle_wave begin the wave
8
+ // /function demo:stop_particle_wave cancel the wave
9
+
10
+ import "../src/stdlib/math.mcrs"
11
+
12
+ let wave_running: bool = false;
13
+
14
+ @load
15
+ fn init() {
16
+ wave_running = false;
17
+ }
18
+
19
+ // Spread 1000 iterations across ~20 ticks (50 per tick)
20
+ @coroutine(batch=50, onDone=wave_done)
21
+ fn generate_wave(): void {
22
+ let i: int = 0;
23
+ while (i < 1000) {
24
+ let angle: int = (i * 360) / 1000;
25
+ let px: int = sin_fixed(angle);
26
+ let py: int = cos_fixed(angle);
27
+ raw("particle minecraft:end_rod ^${px} ^100 ^${py} 0 0 0 0 1 force @a");
28
+ i = i + 1;
29
+ }
30
+ }
31
+
32
+ fn wave_done(): void {
33
+ wave_running = false;
34
+ title(@a, "Wave complete!");
35
+ }
36
+
37
+ fn start_particle_wave(): void {
38
+ if (wave_running) {
39
+ tell(@a, "Wave already running.");
40
+ return;
41
+ }
42
+ wave_running = true;
43
+ title(@a, "Starting particle wave...");
44
+ generate_wave();
45
+ }
46
+
47
+ fn stop_particle_wave(): void {
48
+ wave_running = false;
49
+ title(@a, "Wave stopped.");
50
+ }
@@ -0,0 +1,95 @@
1
+ // enum-demo.mcrs — NPC AI state machine using enums and match
2
+ //
3
+ // An NPC cycles through Idle → Moving → Attacking states.
4
+ // Each state has its own behaviour, driven by @tick.
5
+ //
6
+ // Usage:
7
+ // /function demo:npc_start activate the NPC AI
8
+ // /function demo:npc_stop deactivate the NPC AI
9
+
10
+ enum Phase {
11
+ Idle, // 0 — waiting for a player nearby
12
+ Moving, // 1 — closing the distance
13
+ Attacking, // 2 — striking the nearest player
14
+ }
15
+
16
+ struct NpcState {
17
+ phase: int, // current Phase value
18
+ ticks: int, // ticks in the current phase
19
+ active: bool
20
+ }
21
+
22
+ let npc: NpcState = {
23
+ phase: 0,
24
+ ticks: 0,
25
+ active: false
26
+ };
27
+
28
+ @load
29
+ fn npc_load() {
30
+ npc.phase = Phase.Idle;
31
+ npc.ticks = 0;
32
+ npc.active = false;
33
+ }
34
+
35
+ fn npc_start() {
36
+ npc.active = true;
37
+ npc.phase = Phase.Idle;
38
+ npc.ticks = 0;
39
+ actionbar(@a, "[NPC] AI activated");
40
+ }
41
+
42
+ fn npc_stop() {
43
+ npc.active = false;
44
+ actionbar(@a, "[NPC] AI deactivated");
45
+ }
46
+
47
+ // ── Phase handlers ────────────────────────────────────────────────────────
48
+
49
+ fn phase_idle() {
50
+ actionbar(@a, "[NPC] Idle — scanning for targets...");
51
+ // After 40 ticks (2 seconds) transition to Moving
52
+ if (npc.ticks >= 40) {
53
+ npc.phase = Phase.Moving;
54
+ npc.ticks = 0;
55
+ title(@a, "NPC begins moving");
56
+ }
57
+ }
58
+
59
+ fn phase_moving() {
60
+ actionbar(@a, "[NPC] Moving — closing distance");
61
+ // Simulate movement toward nearest player
62
+ raw("execute as @e[type=minecraft:zombie,tag=npc_ai] at @s run tp @s @p[limit=1] 0 0 0");
63
+ if (npc.ticks >= 60) {
64
+ npc.phase = Phase.Attacking;
65
+ npc.ticks = 0;
66
+ title(@a, "NPC attacks!");
67
+ }
68
+ }
69
+
70
+ fn phase_attacking() {
71
+ actionbar(@a, "[NPC] Attacking!");
72
+ raw("execute as @e[type=minecraft:zombie,tag=npc_ai] at @s run effect give @p[limit=1,distance=..3] minecraft:slowness 1 1 true");
73
+ if (npc.ticks >= 30) {
74
+ npc.phase = Phase.Idle;
75
+ npc.ticks = 0;
76
+ title(@a, "NPC backs off");
77
+ }
78
+ }
79
+
80
+ // ── Main tick ─────────────────────────────────────────────────────────────
81
+
82
+ @tick
83
+ fn npc_tick() {
84
+ if (!npc.active) {
85
+ return;
86
+ }
87
+
88
+ npc.ticks = npc.ticks + 1;
89
+
90
+ match (npc.phase) {
91
+ Phase.Idle => { phase_idle(); }
92
+ Phase.Moving => { phase_moving(); }
93
+ Phase.Attacking => { phase_attacking(); }
94
+ }
95
+ }