Compare commits

..
Author SHA1 Message Date
EIREXE 15052e7e16 Expose LLVM tools to Windows build
CI / production-build (pull_request) Successful in 22m8s
CI / build-and-test (pull_request) Successful in 1m17s
2026-09-19 23:14:03 +02:00
EIREXE 48896d5c1e Use Clang 19 for Windows cross-builds
CI / build-and-test (pull_request) Successful in 1m22s
CI / production-build (pull_request) Failing after 14m59s
2026-09-19 22:53:19 +02:00
EIREXE 350b37a4da Fix blake build
CI / build-and-test (pull_request) Successful in 6m54s
CI / production-build (pull_request) Failing after 14m15s
2026-09-19 22:28:04 +02:00
EIREXE 4d474227cc Install Windows tooling in production job
CI / build-and-test (pull_request) Successful in 3m10s
CI / production-build (pull_request) Failing after 8m23s
2026-09-19 22:15:16 +02:00
EIREXE b5cc5428d2 Bump gc driver 2026-09-19 22:12:35 +02:00
EIREXE 49b23110ff Build Windows binary in shared Steam depot
CI / build-and-test (pull_request) Successful in 1m46s
CI / production-build (pull_request) Failing after 4m50s
2026-09-19 22:01:52 +02:00
EIREXE 9ba8697d57 Include missing battlefield icon
CI / build-and-test (push) Successful in 1m10s
CI / production-build (push) Successful in 5m5s
2026-09-19 21:54:33 +02:00
EIREXE 7d9b6aeafc Fix headless asset preprocessing hang (#49)
CI / build-and-test (push) Successful in 1m9s
CI / production-build (push) Successful in 5m23s
## Summary
- register Bevy's image loader explicitly in the headless asset processor
- use no GPU-compressed image formats because the processor has no render device
- allow PNG processing tasks to complete so `ProcessorState` reaches `Finished`

Co-authored-by: Álex Román Núñez <eirexe@eirteam.moe>
2026-09-19 19:07:39 +00:00
EIREXE ab6aec70c5 Fix processed RON assets being ignored (#48)
CI / build-and-test (push) Successful in 1m9s
CI / production-build (push) Canceled after 10m37s
## Summary
- share custom RON asset loaders between the game and asset processor
- register image, font, and glTF loaders in the headless processor
- prevent `game_settings.ron` and `game.stylesheet.ron` from receiving ignored processed metadata

Reviewed-on: #48
Co-authored-by: Álex Román Núñez <eirexe@eirteam.moe>
2026-09-19 18:09:40 +00:00
EIREXE de5d8eb030 Deploy production Linux builds to Steam (#47)
CI / production-build (push) Successful in 5m15s
CI / build-and-test (push) Successful in 1m8s
## Summary
- package the production Linux binary and Bevy assets under `build/linux`
- generate Steam TOTP credentials in CI
- deploy app 3409670 to the Steam `master` branch using the latest commit hash as the build description
- restrict packaging and deployment to pushes on `master`, excluding pull requests and manual runs

Reviewed-on: #47
Co-authored-by: Álex Román Núñez <eirexe@eirteam.moe>
2026-09-19 17:32:04 +00:00
7 changed files with 62 additions and 88 deletions
+22 -6
View File
@@ -65,6 +65,11 @@ jobs:
echo "$HOME/.cargo/bin" >> "$GITHUB_PATH" echo "$HOME/.cargo/bin" >> "$GITHUB_PATH"
"$HOME/.cargo/bin/rustup" toolchain install nightly-2026-09-14 --profile minimal "$HOME/.cargo/bin/rustup" toolchain install nightly-2026-09-14 --profile minimal
- name: Install Windows build tooling
run: |
"$HOME/.cargo/bin/rustup" target add x86_64-pc-windows-msvc --toolchain nightly-2026-09-14
"$HOME/.cargo/bin/cargo" install cargo-xwin --locked
- name: Cache production Rust dependencies and build artifacts - name: Cache production Rust dependencies and build artifacts
uses: Swatinem/rust-cache@6323deb102c322ba6fcbdcafc7e3dddab59af2b6 # v2.9.2 uses: Swatinem/rust-cache@6323deb102c322ba6fcbdcafc7e3dddab59af2b6 # v2.9.2
with: with:
@@ -76,7 +81,7 @@ jobs:
run: | run: |
sudo apt-get update sudo apt-get update
sudo apt-get install --no-install-recommends -y \ sudo apt-get install --no-install-recommends -y \
clang \ clang-19 \
libasound2-dev \ libasound2-dev \
libudev-dev \ libudev-dev \
libusb-1.0-0-dev \ libusb-1.0-0-dev \
@@ -84,9 +89,15 @@ jobs:
libx11-dev \ libx11-dev \
libxkbcommon-dev \ libxkbcommon-dev \
libxkbcommon-x11-0 \ libxkbcommon-x11-0 \
lld-19 \
llvm-19 \
mesa-vulkan-drivers \ mesa-vulkan-drivers \
mold \ mold \
pkg-config pkg-config
sudo update-alternatives --install /usr/bin/clang clang /usr/bin/clang-19 100
sudo update-alternatives --install /usr/bin/clang++ clang++ /usr/bin/clang++-19 100
echo "/usr/lib/llvm-19/bin" >> "$GITHUB_PATH"
rm -f "$HOME/.cache/cargo-xwin/clang-cl"
- name: Preprocess assets - name: Preprocess assets
run: cargo run --locked --bin process-assets --no-default-features --features debug_features -j 4 run: cargo run --locked --bin process-assets --no-default-features --features debug_features -j 4
@@ -94,6 +105,11 @@ jobs:
- name: Build production binary - name: Build production binary
run: cargo build --locked --profile production --no-default-features --features debug_features -j 4 run: cargo build --locked --profile production --no-default-features --features debug_features -j 4
- name: Build Windows production binary
run: |
clang --version
cargo xwin build --locked --target x86_64-pc-windows-msvc --profile production --no-default-features --features debug_features -j 4 --bin shinespark
- name: Verify production binary is not Bevy/Rust dynamically linked - name: Verify production binary is not Bevy/Rust dynamically linked
run: | run: |
! readelf -d target/production/shinespark | grep -E 'libbevy_dylib|libstd-.*\.so' ! readelf -d target/production/shinespark | grep -E 'libbevy_dylib|libstd-.*\.so'
@@ -101,10 +117,10 @@ jobs:
- name: Package Linux Steam depot - name: Package Linux Steam depot
if: github.event_name == 'push' && github.ref == 'refs/heads/master' if: github.event_name == 'push' && github.ref == 'refs/heads/master'
run: | run: |
mkdir -p build/linux mkdir -p build/game
cp target/production/shinespark build/linux/shinespark cp target/production/shinespark build/game/shinespark
cp -R assets build/linux/assets cp target/x86_64-pc-windows-msvc/production/shinespark.exe build/game/shinespark.exe
cp -R imported_assets build/linux/imported_assets cp -R imported_assets build/game/imported_assets
- if: github.event_name == 'push' && github.ref == 'refs/heads/master' - if: github.event_name == 'push' && github.ref == 'refs/heads/master'
uses: CyberAndrii/steam-totp@v1 uses: CyberAndrii/steam-totp@v1
@@ -123,5 +139,5 @@ jobs:
appId: 3409670 appId: 3409670
buildDescription: ${{ github.sha }} buildDescription: ${{ github.sha }}
rootPath: build rootPath: build
depot1Path: linux depot1Path: game
releaseBranch: master releaseBranch: master
Generated
+7 -71
View File
@@ -94,12 +94,6 @@ version = "2.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa"
[[package]]
name = "adler32"
version = "1.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "aae1277d39aeec15cb388266ecc24b11c80469deae6067e17a1a7aa9e5c1f234"
[[package]] [[package]]
name = "ahash" name = "ahash"
version = "0.8.12" version = "0.8.12"
@@ -3208,16 +3202,6 @@ dependencies = [
"windows-sys 0.60.2", "windows-sys 0.60.2",
] ]
[[package]]
name = "filetime"
version = "0.2.29"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5c287a33c7f0a620c38e641e7f60827713987b3c0f26e8ddc9462cc69cf75759"
dependencies = [
"cfg-if",
"libc",
]
[[package]] [[package]]
name = "find-msvc-tools" name = "find-msvc-tools"
version = "0.1.9" version = "0.1.9"
@@ -3434,9 +3418,9 @@ dependencies = [
[[package]] [[package]]
name = "gc-adapter-neo" name = "gc-adapter-neo"
version = "1.1.0" version = "1.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "120a5b3858ae854c4674ae41a38173e8ea04b814fb3212fd3bdd1b04d414a9d7" checksum = "a8d3e10c6c4b928cb559f641765ebaa40f5f099bf51bc0227af7431859f8bd84"
dependencies = [ dependencies = [
"binread", "binread",
"modular-bitfield", "modular-bitfield",
@@ -4266,26 +4250,6 @@ version = "0.2.189"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2" checksum = "3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2"
[[package]]
name = "libflate"
version = "1.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5ff4ae71b685bbad2f2f391fe74f6b7659a34871c08b210fdc039e43bee07d18"
dependencies = [
"adler32",
"crc32fast",
"libflate_lz77",
]
[[package]]
name = "libflate_lz77"
version = "1.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a52d3a8bfc85f250440e4424db7d857e241a3aebbbe301f3eb606ab15c39acbf"
dependencies = [
"rle-decode-fast",
]
[[package]] [[package]]
name = "libloading" name = "libloading"
version = "0.8.9" version = "0.8.9"
@@ -4326,15 +4290,13 @@ dependencies = [
[[package]] [[package]]
name = "libusb1-sys" name = "libusb1-sys"
version = "0.4.4" version = "0.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "be241693102a24766d0b8526c8988771edac2842630d7e730f8e9fbc014f3703" checksum = "da050ade7ac4ff1ba5379af847a10a10a8e284181e060105bf8d86960ce9ce0f"
dependencies = [ dependencies = [
"cc", "cc",
"libc", "libc",
"libflate",
"pkg-config", "pkg-config",
"tar",
"vcpkg", "vcpkg",
] ]
@@ -5840,12 +5802,6 @@ dependencies = [
"syn 2.0.119", "syn 2.0.119",
] ]
[[package]]
name = "rle-decode-fast"
version = "1.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3582f63211428f83597b51b2ddb88e2a91a9d52d12831f9d08f5e624e8977422"
[[package]] [[package]]
name = "robust" name = "robust"
version = "1.2.0" version = "1.2.0"
@@ -5916,9 +5872,9 @@ dependencies = [
[[package]] [[package]]
name = "rusb" name = "rusb"
version = "0.6.5" version = "0.9.4"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f6f32cd45962594f9f8cd4547b5757132715600e2c8840aa9ccd3d1a9ed6fdc6" checksum = "ab9f9ff05b63a786553a4c02943b74b34a988448671001e9a27e2f0565cc05a4"
dependencies = [ dependencies = [
"libc", "libc",
"libusb1-sys", "libusb1-sys",
@@ -6126,6 +6082,7 @@ dependencies = [
"bevy_egui", "bevy_egui",
"bevy_ggrs", "bevy_ggrs",
"bincode", "bincode",
"blake3",
"clap", "clap",
"enum_cycling", "enum_cycling",
"enum_cycling_derive", "enum_cycling_derive",
@@ -6495,17 +6452,6 @@ dependencies = [
"slotmap", "slotmap",
] ]
[[package]]
name = "tar"
version = "0.4.46"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3f6221d9a6003c78398e3b239969f352578258df48c8eb051caadae0015bc840"
dependencies = [
"filetime",
"libc",
"xattr",
]
[[package]] [[package]]
name = "termcolor" name = "termcolor"
version = "1.4.1" version = "1.4.1"
@@ -7911,16 +7857,6 @@ version = "0.13.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ea6fc2961e4ef194dcbfe56bb845534d0dc8098940c7e5c012a258bfec6701bd" checksum = "ea6fc2961e4ef194dcbfe56bb845534d0dc8098940c7e5c012a258bfec6701bd"
[[package]]
name = "xattr"
version = "1.6.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "32e45ad4206f6d2479085147f02bc2ef834ac85886624a23575ae137c8aa8156"
dependencies = [
"libc",
"rustix 1.1.4",
]
[[package]] [[package]]
name = "xcursor" name = "xcursor"
version = "0.3.11" version = "0.3.11"
+2 -1
View File
@@ -16,6 +16,7 @@ bevy = { version = "0.19", features = ["asset_processor", "basis-universal", "be
# Loads the scenes you author in the editor (assets/*.bsn) and builds # Loads the scenes you author in the editor (assets/*.bsn) and builds
# physics colliders from them. An ordinary dependency; remove it if you # physics colliders from them. An ordinary dependency; remove it if you
# stop using authored scenes. # stop using authored scenes.
blake3 = { version = "1.8.5", features = [ "pure" ] }
thiserror = "2" thiserror = "2"
avian3d = "0.7" avian3d = "0.7"
arrayvec = "0.7.8" arrayvec = "0.7.8"
@@ -33,7 +34,7 @@ strum = "0.28.0"
strum_macros = "0.28.0" strum_macros = "0.28.0"
bevy_asset_loader = "0.27.0" bevy_asset_loader = "0.27.0"
ron_asset_manager = "0.9.0" ron_asset_manager = "0.9.0"
gc-adapter-neo = { version = "1.1.0", features = ["libusb"] } gc-adapter-neo = { version = "1.1.1", features = ["libusb"] }
rhai = "1.26.0" rhai = "1.26.0"
enum_cycling = "0.2.1" enum_cycling = "0.2.1"
enum_cycling_derive = "0.2.1" enum_cycling_derive = "0.2.1"
Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

+5
View File
@@ -1,8 +1,11 @@
use bevy::{ use bevy::{
app::ScheduleRunnerPlugin, app::ScheduleRunnerPlugin,
asset::{AssetMode, AssetPlugin, processor::AssetProcessor, processor::ProcessorState}, asset::{AssetMode, AssetPlugin, processor::AssetProcessor, processor::ProcessorState},
gltf::GltfPlugin,
image::{CompressedImageFormats, ImageLoader, ImagePlugin},
prelude::*, prelude::*,
tasks::block_on, tasks::block_on,
text::TextPlugin,
}; };
use shinespark::AssetProcessingPlugin; use shinespark::AssetProcessingPlugin;
use std::{process::ExitCode, time::Duration}; use std::{process::ExitCode, time::Duration};
@@ -15,6 +18,8 @@ fn main() -> ExitCode {
use_asset_processor_override: Some(true), use_asset_processor_override: Some(true),
..default() ..default()
}) })
.add_plugins((ImagePlugin::default(), TextPlugin, GltfPlugin::default()))
.register_asset_loader(ImageLoader::new(CompressedImageFormats::NONE))
.add_plugins(AssetProcessingPlugin) .add_plugins(AssetProcessingPlugin)
.add_systems(Update, finish_when_processed); .add_systems(Update, finish_when_processed);
+25 -6
View File
@@ -32,7 +32,13 @@ use clap::Parser;
use ron_asset_manager::RonAssetPlugin; use ron_asset_manager::RonAssetPlugin;
use crate::{ use crate::{
camera::MatchCameraPlugin, fighter::manifest::FighterManifest, game_settings::GameSettings, schedule::GameplaySchedulePlugin, stage::manifest::StageManifest, ui::InGameUIPlugin, camera::MatchCameraPlugin,
fighter::manifest::FighterManifest,
game_settings::GameSettings,
menus::style::FGUiStyle,
schedule::GameplaySchedulePlugin,
stage::manifest::StageManifest,
ui::InGameUIPlugin,
}; };
mod args; mod args;
@@ -80,6 +86,20 @@ pub enum AppState {
#[derive(Default)] #[derive(Default)]
pub struct GamePlugin; pub struct GamePlugin;
/// Registers every custom asset loader used by the game and asset processor.
pub struct GameAssetPlugin;
impl Plugin for GameAssetPlugin {
fn build(&self, app: &mut App) {
app.add_plugins((
RonAssetPlugin::<FighterManifest>::create("fighter.ron"),
RonAssetPlugin::<StageManifest>::create("stage.ron"),
RonAssetPlugin::<GameSettings>::create("ron"),
RonAssetPlugin::<FGUiStyle>::create("stylesheet.ron"),
));
}
}
impl Plugin for GamePlugin { impl Plugin for GamePlugin {
fn build(&self, app: &mut App) { fn build(&self, app: &mut App) {
// Each module owns its own systems, rollback registrations and // Each module owns its own systems, rollback registrations and
@@ -99,9 +119,7 @@ impl Plugin for GamePlugin {
scripting::importer::FighterScriptImportPlugin, scripting::importer::FighterScriptImportPlugin,
stage::StagePlugin, stage::StagePlugin,
MatchCameraPlugin, MatchCameraPlugin,
RonAssetPlugin::<FighterManifest>::create("fighter.ron"), GameAssetPlugin,
RonAssetPlugin::<StageManifest>::create("stage.ron"),
RonAssetPlugin::<GameSettings>::create("ron"),
InGameUIPlugin, InGameUIPlugin,
)) ))
.add_plugins(menus::MenuPlugin) .add_plugins(menus::MenuPlugin)
@@ -155,13 +173,14 @@ impl Plugin for GamePlugin {
} }
} }
/// Registers only the custom asset processors used by CI and release builds. /// Registers the custom asset loaders and processors used by CI and release
/// The processing binary adds this plugin without starting the game. /// builds. The processing binary adds this plugin without starting the game.
pub struct AssetProcessingPlugin; pub struct AssetProcessingPlugin;
impl Plugin for AssetProcessingPlugin { impl Plugin for AssetProcessingPlugin {
fn build(&self, app: &mut App) { fn build(&self, app: &mut App) {
app.add_plugins(( app.add_plugins((
GameAssetPlugin,
scripting::importer::FighterScriptImportPlugin, scripting::importer::FighterScriptImportPlugin,
fighter::baked_animation::BakedAnimationAssetProcessingPlugin, fighter::baked_animation::BakedAnimationAssetProcessingPlugin,
)); ));
+1 -4
View File
@@ -6,12 +6,10 @@ use bevy::{
prelude::*, prelude::*,
}; };
use ron_asset_manager::RonAssetPlugin;
use crate::{ use crate::{
AppState, AppState,
game_settings::CommonAssets, game_settings::CommonAssets,
menus::{character_select::CharacterSelectScreen, main_menu::MainMenu, style::FGUiStyle}, menus::{character_select::CharacterSelectScreen, main_menu::MainMenu},
}; };
pub mod button; pub mod button;
pub mod character_select; pub mod character_select;
@@ -222,7 +220,6 @@ impl Plugin for MenuPlugin {
//--------- //---------
// STAGE SELECT END // STAGE SELECT END
//--------- //---------
.add_plugins(RonAssetPlugin::<FGUiStyle>::create("stylesheet.ron"))
.add_systems( .add_systems(
Update, Update,
( (