From 93873dfa933bc3a2d84252edf4e6b9643829b85a Mon Sep 17 00:00:00 2001 From: Devin Bidwell Date: Sun, 21 Dec 2025 15:59:40 -0700 Subject: [PATCH 1/2] Accept expressions for the slotIndex in the slot logic syscalls --- rust_compiler/libs/compiler/src/v1.rs | 10 ++---- rust_compiler/libs/parser/src/lib.rs | 40 +++++------------------ rust_compiler/libs/parser/src/sys_call.rs | 4 +-- 3 files changed, 13 insertions(+), 41 deletions(-) diff --git a/rust_compiler/libs/compiler/src/v1.rs b/rust_compiler/libs/compiler/src/v1.rs index 69cf3e9..61a26f0 100644 --- a/rust_compiler/libs/compiler/src/v1.rs +++ b/rust_compiler/libs/compiler/src/v1.rs @@ -2233,10 +2233,7 @@ impl<'a> Compiler<'a> { System::LoadSlot(dev_name, slot_index, logic_type) => { let (dev_hash, hash_cleanup) = self.compile_literal_or_variable(dev_name.node, scope)?; - let (slot_index, slot_cleanup) = self.compile_literal_or_variable( - LiteralOrVariable::Literal(slot_index.node), - scope, - )?; + let (slot_index, slot_cleanup) = self.compile_operand(*slot_index, scope)?; let (logic_type, logic_cleanup) = self.compile_literal_or_variable( LiteralOrVariable::Literal(logic_type.node), scope, @@ -2261,10 +2258,7 @@ impl<'a> Compiler<'a> { System::SetSlot(dev_name, slot_index, logic_type, var) => { let (dev_name, name_cleanup) = self.compile_literal_or_variable(dev_name.node, scope)?; - let (slot_index, index_cleanup) = self.compile_literal_or_variable( - LiteralOrVariable::Literal(slot_index.node), - scope, - )?; + let (slot_index, index_cleanup) = self.compile_operand(*slot_index, scope)?; let (logic_type, type_cleanup) = self.compile_literal_or_variable( LiteralOrVariable::Literal(logic_type.node), scope, diff --git a/rust_compiler/libs/parser/src/lib.rs b/rust_compiler/libs/parser/src/lib.rs index 4cb4618..63e8ec2 100644 --- a/rust_compiler/libs/parser/src/lib.rs +++ b/rust_compiler/libs/parser/src/lib.rs @@ -1834,20 +1834,8 @@ impl<'a> Parser<'a> { let mut args = args!(3); let next = args.next(); let dev_name = literal_or_variable!(next); - let next = args.next(); - let slot_index = get_arg!(Literal, literal_or_variable!(next)); - if !matches!( - slot_index, - Spanned { - node: Literal::Number(_), - .. - }, - ) { - return Err(Error::InvalidSyntax( - slot_index.span, - "Expected a number".to_string(), - )); - } + let slot_index = args.next().ok_or(Error::UnexpectedEOF)?; + let next = args.next(); let slot_logic = get_arg!(Literal, literal_or_variable!(next)); if !matches!( @@ -1864,27 +1852,17 @@ impl<'a> Parser<'a> { } Ok(SysCall::System(System::LoadSlot( - dev_name, slot_index, slot_logic, + dev_name, + boxed!(slot_index), + slot_logic, ))) } "setSlot" | "ss" => { let mut args = args!(4); let next = args.next(); let dev_name = literal_or_variable!(next); - let next = args.next(); - let slot_index = get_arg!(Literal, literal_or_variable!(next)); - if !matches!( - slot_index, - Spanned { - node: Literal::Number(_), - .. - } - ) { - return Err(Error::InvalidSyntax( - slot_index.span, - "Expected a number".into(), - )); - } + let slot_index = args.next().ok_or(Error::UnexpectedEOF)?; + let next = args.next(); let slot_logic = get_arg!(Literal, literal_or_variable!(next)); if !matches!( @@ -1904,9 +1882,9 @@ impl<'a> Parser<'a> { Ok(SysCall::System(System::SetSlot( dev_name, - slot_index, + boxed!(slot_index), slot_logic, - Box::new(expr), + boxed!(expr), ))) } "loadReagent" | "lr" => { diff --git a/rust_compiler/libs/parser/src/sys_call.rs b/rust_compiler/libs/parser/src/sys_call.rs index 0251e91..67e03a9 100644 --- a/rust_compiler/libs/parser/src/sys_call.rs +++ b/rust_compiler/libs/parser/src/sys_call.rs @@ -223,7 +223,7 @@ documented! { /// `let isOccupied = ls(deviceHash, 2, "Occupied");` LoadSlot( Spanned>, - Spanned>, + Box>>, Spanned> ), /// Stores a value of LogicType on a device by the index value @@ -234,7 +234,7 @@ documented! { /// `ss(deviceHash, 0, "Open", true);` SetSlot( Spanned>, - Spanned>, + Box>>, Spanned>, Box>> ), From 7295b14f6a7f215484f41eab380fea6de2bdb49b Mon Sep 17 00:00:00 2001 From: Devin Bidwell Date: Sun, 21 Dec 2025 16:32:11 -0700 Subject: [PATCH 2/2] Update changelog, update workflow files --- {.github => .gitea}/workflows/build.yml | 34 +++++++++++++++++++++++++ Changelog.md | 11 ++++++++ ModData/About/About.xml | 2 +- csharp_mod/Plugin.cs | 2 +- rust_compiler/Cargo.toml | 2 +- 5 files changed, 48 insertions(+), 3 deletions(-) rename {.github => .gitea}/workflows/build.yml (67%) diff --git a/.github/workflows/build.yml b/.gitea/workflows/build.yml similarity index 67% rename from .github/workflows/build.yml rename to .gitea/workflows/build.yml index da7e2b5..d7dfc12 100644 --- a/.github/workflows/build.yml +++ b/.gitea/workflows/build.yml @@ -4,6 +4,7 @@ name: CI/CD Pipeline on: push: branches: ["master"] + tags: ["*.*.*"] pull_request: branches: ["master"] @@ -57,6 +58,10 @@ jobs: slang-builder \ ./build.sh + - name: Zip Workshop Folder + run: | + zip -r release/workshop.zip release/workshop/ + # 3. Fix Permissions # Docker writes files as root. We need to own them to upload them. - name: Fix Permissions @@ -69,3 +74,32 @@ jobs: with: name: StationeersSlang-Release path: release/ + + release: + needs: build + runs-on: self-hosted + # ONLY run this job if we pushed a tag (e.g., v1.0.1) + if: startsWith(github.ref, 'refs/tags/') + steps: + - uses: actions/checkout@v4 + + # We download the artifact from the previous 'build' job + - name: Download Build Artifacts + uses: actions/download-artifact@v4 + with: + name: StationeersSlang-Release + path: ./release-files + + - name: Create Gitea Release + uses: https://gitea.com/actions/gitea-release-action@v1 + with: + files: | + ./release-files/workshop.zip + ./release-files/slang + ./release-files/slang.exe + name: ${{ github.ref_name }} + tag_name: ${{ github.ref_name }} + draft: false + prerelease: false + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/Changelog.md b/Changelog.md index e5edd08..87dc8b5 100644 --- a/Changelog.md +++ b/Changelog.md @@ -1,5 +1,16 @@ # Changelog +[0.4.1] + +- Update syscalls for `loadSlot` and `setSlot` to support expressions instead of + just variables for the slot index +- Moved the main repository from GitHub to a self-hosted Gitea + - Restructured workflow files to support this change + - GitHub will still remain as a mirrored repository of the new + Gitea instance. + - This is in response to the new upcoming changes to the pricing model + for self-hosted GitHub action runners. + [0.4.0] - First pass getting compiled IC10 to output along side the Slang source code diff --git a/ModData/About/About.xml b/ModData/About/About.xml index a9e948d..2a468d3 100644 --- a/ModData/About/About.xml +++ b/ModData/About/About.xml @@ -2,7 +2,7 @@ Slang JoeDiertay - 0.4.0 + 0.4.1 [h1]Slang: High-Level Programming for Stationeers[/h1] diff --git a/csharp_mod/Plugin.cs b/csharp_mod/Plugin.cs index d33b721..84d3d35 100644 --- a/csharp_mod/Plugin.cs +++ b/csharp_mod/Plugin.cs @@ -41,7 +41,7 @@ namespace Slang { public const string PluginGuid = "com.biddydev.slang"; public const string PluginName = "Slang"; - public const string PluginVersion = "0.4.0"; + public const string PluginVersion = "0.4.1"; public static Mod MOD = new Mod(PluginName, PluginVersion); diff --git a/rust_compiler/Cargo.toml b/rust_compiler/Cargo.toml index ac41a84..f6a1882 100644 --- a/rust_compiler/Cargo.toml +++ b/rust_compiler/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "slang" -version = "0.4.0" +version = "0.4.1" edition = "2021" [workspace]