Compare commits

..
Author SHA1 Message Date
EIREXE 9684974298 Fix headless asset preprocessing hang
CI / build-and-test (pull_request) Successful in 1m7s
CI / production-build (pull_request) Successful in 4m49s
2026-09-19 20:51:58 +02: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
EIREXE 0dc5d0392d Add production build pipeline (#46)
CI / build-and-test (push) Successful in 1m8s
CI / production-build (push) Successful in 4m39s
## Summary
- split development dynamic linking from production builds
- add headless processed-asset generation
- add a separate production CI cache and static Bevy/Rust linkage verification
- keep custom debug features enabled for production builds behind a feature gate

Reviewed-on: #46
Co-authored-by: Álex Román Núñez <eirexe@eirteam.moe>
2026-09-19 17:04:18 +00:00
4 changed files with 59 additions and 10 deletions
+28
View File
@@ -97,3 +97,31 @@ jobs:
- 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'
- name: Package Linux Steam depot
if: github.event_name == 'push' && github.ref == 'refs/heads/master'
run: |
mkdir -p build/linux
cp target/production/shinespark build/linux/shinespark
cp -R assets build/linux/assets
cp -R imported_assets build/linux/imported_assets
- if: github.event_name == 'push' && github.ref == 'refs/heads/master'
uses: CyberAndrii/steam-totp@v1
name: Generate Steam TOTP
id: steam-totp
with:
shared_secret: ${{ secrets.STEAM_SHARED_SECRET }}
- name: Deploy Linux build to Steam
if: github.event_name == 'push' && github.ref == 'refs/heads/master'
uses: game-ci/steam-deploy@v3
with:
username: ${{ secrets.STEAM_USERNAME }}
password: ${{ secrets.STEAM_PASSWORD }}
totp: ${{ steps.steam-totp.outputs.code }}
appId: 3409670
buildDescription: ${{ github.sha }}
rootPath: build
depot1Path: linux
releaseBranch: master
+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,
( (