diff --git a/Cargo.lock b/Cargo.lock index 2a6ac23..1fc7529 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -565,6 +565,26 @@ dependencies = [ "syn 2.0.119", ] +[[package]] +name = "bevy-settings" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04372da0c37bab175e0bfbc4ad8f214ffcbea01850225573b6e49132db11e18b" +dependencies = [ + "bevy_app", + "bevy_ecs", + "bevy_ecs_macros", + "bevy_log", + "bevy_platform", + "bevy_reflect", + "bevy_tasks", + "bevy_time", + "serde", + "thiserror 2.0.19", + "toml", + "web-sys", +] + [[package]] name = "bevy_a11y" version = "0.19.0" @@ -1319,6 +1339,7 @@ version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d52a85632a749f956f92b7b391c31ce1f229e57b06de879d1b60a3bb91e4e240" dependencies = [ + "bevy-settings", "bevy_a11y", "bevy_android", "bevy_animation", @@ -6392,6 +6413,15 @@ dependencies = [ "zmij", ] +[[package]] +name = "serde_spanned" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6662b5879511e06e8999a8a235d848113e942c9124f211511b16466ee2995f26" +dependencies = [ + "serde_core", +] + [[package]] name = "sha3" version = "0.10.9" @@ -6972,6 +7002,21 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" +[[package]] +name = "toml" +version = "1.1.4+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3aace63f4bbcdfc2c965b059de67119c89c4017a70d633be6c104910f67056f5" +dependencies = [ + "indexmap", + "serde_core", + "serde_spanned", + "toml_datetime", + "toml_parser", + "toml_writer", + "winnow", +] + [[package]] name = "toml_datetime" version = "1.1.1+spec-1.1.0" @@ -7002,6 +7047,12 @@ dependencies = [ "winnow", ] +[[package]] +name = "toml_writer" +version = "1.1.2+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d56353a2a665ad0f41a421187180aab746c8c325620617ad883a99a1cbe66d2" + [[package]] name = "tracing" version = "0.1.44" diff --git a/Cargo.toml b/Cargo.toml index 6acd1aa..36dec09 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -15,7 +15,7 @@ authors = [""] [workspace] [dependencies] -bevy = { version = "0.19", features = ["asset_processor", "dynamic_linking", "free_camera", "file_watcher"] } +bevy = { version = "0.19", features = ["asset_processor", "dynamic_linking", "free_camera", "file_watcher", "bevy_settings"] } # Loads the scenes you author in the editor (assets/*.bsn) and builds # physics colliders from them. An ordinary dependency; remove it if you # stop using authored scenes. diff --git a/src/debug_tools.rs b/src/debug_tools.rs index 4faf6eb..1c06633 100644 --- a/src/debug_tools.rs +++ b/src/debug_tools.rs @@ -1,15 +1,15 @@ //! Local developer overlays and their controller-driven palette. -use std::collections::HashMap; +use std::{collections::HashMap, time::Duration}; -use bevy::prelude::*; +use bevy::{prelude::*, settings::{SaveSettingsDeferred, SettingsGroup, ReflectSettingsGroup}}; use bevy_egui::{EguiContexts, EguiPrimaryContextPass, egui}; use crate::player::Player; pub const PLAYER_DEBUG_ROW_COUNT: usize = 6; -#[derive(Clone, Copy, Debug, PartialEq, Eq)] +#[derive(Clone, Copy, Debug, PartialEq, Eq, Reflect)] pub enum FighterDebugRowKind { None, CurrentState, @@ -19,7 +19,7 @@ pub enum FighterDebugRowKind { Facing, } -#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)] +#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Reflect)] pub enum PresentationMotionMode { #[default] Interpolation, @@ -169,13 +169,18 @@ enum DebugMenuPage { PlayerList, PlayerRows(usize), } - -#[derive(Resource)] +#[derive(Resource, SettingsGroup, Reflect)] +#[reflect(Resource, SettingsGroup, Default)] pub struct DebugSettings { + #[reflect(ignore)] pub menu_open: bool, + #[reflect(ignore)] controller: Option, + #[reflect(ignore)] pages: Vec, + #[reflect(ignore)] selections: Vec, + #[reflect(ignore)] pub player_rows: HashMap, pub network: bool, pub ecb: bool, @@ -328,6 +333,7 @@ fn handle_palette_input( gamepads: Query<(Entity, &Gamepad)>, players: Query<&Player>, mut settings: ResMut, + mut commands: Commands, ) { if keyboard.just_pressed(KeyCode::KeyT) { settings.toggle_flag(DebugFlag::DrawThroughGeometry); @@ -386,6 +392,8 @@ fn handle_palette_input( let selected = settings.selected(); let rows = settings.rows_mut(handle); rows[selected] = rows[selected].cycle(direction); + + commands.queue(SaveSettingsDeferred(Duration::from_secs_f32(0.1))); } } if let DebugMenuPage::Static(entries) = page @@ -401,7 +409,10 @@ fn handle_palette_input( if gamepad.just_pressed(GamepadButton::South) { match page { DebugMenuPage::Static(entries) if page_len != 0 => match entries[settings.selected()] { - DebugMenuEntry::Toggle { flag, .. } => settings.toggle_flag(flag), + DebugMenuEntry::Toggle { flag, .. } => { + settings.toggle_flag(flag); + commands.queue(SaveSettingsDeferred(Duration::from_secs_f32(0.1))); + }, DebugMenuEntry::Submenu { entries, .. } => { settings.push_page(DebugMenuPage::Static(entries)); } diff --git a/src/lib.rs b/src/lib.rs index 42baf68..4c28975 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -22,9 +22,7 @@ //! appears in `Add Component`. No registration code is needed. use bevy::{ - asset::processor::{AssetProcessor, ProcessorState}, - prelude::*, - tasks::block_on, + asset::processor::{AssetProcessor, ProcessorState}, prelude::*, settings::SettingsPlugin, tasks::block_on, }; use bevy_asset_loader::prelude::*; use bevy_wind_waker_shader::prelude::*; @@ -80,6 +78,7 @@ impl Plugin for GamePlugin { // game-level content and configuration. app.init_state::() .add_plugins(( + SettingsPlugin::new("moe.eirteam.shinespark.debug_settings"), WindWakerShaderPlugin::default(), // Brings up GGRS (and with it `GgrsSchedule`), so it goes first. netcode::FighterNetcodePlugin::default(),