diff --git a/Cargo.lock b/Cargo.lock index c6fe2d2..68463f6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -829,8 +829,7 @@ dependencies = [ [[package]] name = "bevy_jornet" version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "302e51f4a2d5bbb7232462be8f114365e7106106b360c25a1ad5eb9d06d243fd" +source = "git+https://github.com/rparrett/jornet.git?branch=reflect-player-14#0f3eaa5ef5095a5dcaa06b5ee20cdea1c49ed844" dependencies = [ "bevy", "hex", @@ -871,7 +870,7 @@ dependencies = [ "proc-macro2", "quote", "syn 2.0.72", - "toml_edit 0.22.16", + "toml_edit 0.22.17", ] [[package]] @@ -1083,6 +1082,30 @@ dependencies = [ "uuid", ] +[[package]] +name = "bevy_simple_prefs" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf9ac4eb21dbe02da048ea7f9f7a7ae1508ecd28f0ca9078f50dadc459efd70" +dependencies = [ + "bevy", + "bevy_simple_prefs_derive", + "ron", + "serde", + "web-sys", +] + +[[package]] +name = "bevy_simple_prefs_derive" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24c8a3f20efc0654c75ae7c3e1dd0748e44f5f963a02953346c13b8849a444e7" +dependencies = [ + "bevy", + "quote", + "syn 2.0.72", +] + [[package]] name = "bevy_sprite" version = "0.14.0" @@ -1614,6 +1637,7 @@ dependencies = [ "bevy_mod_debugdump", "bevy_pipelines_ready", "bevy_rapier3d", + "bevy_simple_prefs", "bevy_tiling_background", "interpolation", "leafwing-input-manager", @@ -4350,9 +4374,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "toml_datetime" -version = "0.6.6" +version = "0.6.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4badfd56924ae69bcc9039335b2e017639ce3f9b001c393c1b2d1ef846ce2cbf" +checksum = "f8fb9f64314842840f1d940ac544da178732128f1c78c21772e876579e0da1db" [[package]] name = "toml_edit" @@ -4367,13 +4391,13 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.22.16" +version = "0.22.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "278f3d518e152219c994ce877758516bca5e118eaed6996192a774fb9fbf0788" +checksum = "8d9f8729f5aea9562aac1cc0441f5d6de3cff1ee0c5d67293eeca5eb36ee7c16" dependencies = [ "indexmap", "toml_datetime", - "winnow 0.6.15", + "winnow 0.6.16", ] [[package]] @@ -5382,9 +5406,9 @@ dependencies = [ [[package]] name = "winnow" -version = "0.6.15" +version = "0.6.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "557404e450152cd6795bb558bca69e43c585055f4606e3bcae5894fc6dac9ba0" +checksum = "b480ae9340fc261e6be3e95a1ba86d54ae3f9171132a73ce8d4bbaf68339507c" dependencies = [ "memchr", ] diff --git a/Cargo.toml b/Cargo.toml index f955648..79540d5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -16,7 +16,7 @@ bevy_rapier3d = "0.27" bevy_asset_loader = "0.21" bevy-inspector-egui = { version = "0.25", optional = true } leafwing-input-manager = "0.14" -bevy_jornet = "0.8" +bevy_jornet = { git = "https://github.com/rparrett/jornet.git", branch = "reflect-player-14" } # https://github.com/BraymatterOrg/bevy_tiling_background/pull/25 bevy_tiling_background = { git = "https://github.com/rparrett/bevy_tiling_background.git", branch = "bevy-0.14" } bevy_mod_debugdump = { version = "0.11", optional = true } @@ -27,6 +27,7 @@ interpolation = "0.2" serde = "*" ron = "0.8" rand = "0.8" +bevy_simple_prefs = "0.2.0" # Dependencies for WASM only. [target.'cfg(target_arch = "wasm32")'.dependencies] diff --git a/src/leaderboard.rs b/src/leaderboard.rs index c1f2e79..aa912e6 100644 --- a/src/leaderboard.rs +++ b/src/leaderboard.rs @@ -21,7 +21,7 @@ impl Plugin for LeaderboardPlugin { .init_resource::() .add_plugins(JornetPlugin::with_leaderboard(id, key)) .add_systems(Update, save_leaderboard_setting) - .add_systems(OnEnter(GameState::Loading), create_player) + .add_systems(OnEnter(GameState::MainMenu), create_player) .add_systems( OnEnter(GameState::Leaderboard), (save_score, spawn_leaderboard), diff --git a/src/save.rs b/src/save.rs index 72ba158..a24e004 100644 --- a/src/save.rs +++ b/src/save.rs @@ -1,154 +1,25 @@ use crate::settings::{LeaderboardSetting, MusicSetting, SfxSetting, ShadowSetting}; use bevy::prelude::*; -use ron::ser::PrettyConfig; -use serde::{Deserialize, Serialize}; - -#[cfg(not(target_arch = "wasm32"))] -const SAVE_FILE: &str = "save.ron"; -#[cfg(target_arch = "wasm32")] -const LOCAL_STORAGE_KEY: &str = "combine-racers-save"; +use bevy_simple_prefs::{Prefs, PrefsPlugin}; pub struct SavePlugin; impl Plugin for SavePlugin { fn build(&self, app: &mut App) { - app.add_systems(Update, save_system); - app.add_systems(Startup, load_system); + app.add_plugins(PrefsPlugin:: { + #[cfg(not(target_arch = "wasm32"))] + filename: "save.ron".to_string(), + #[cfg(target_arch = "wasm32")] + filename: "combine-racers-save".to_string(), + ..default() + }); } } -#[derive(Debug, Deserialize, Serialize)] +#[derive(Prefs, Reflect, Default)] struct SaveFile { sfx: SfxSetting, music: MusicSetting, leaderboard: LeaderboardSetting, shadow: ShadowSetting, } - -pub fn load_system(mut commands: Commands) { - commands.insert_resource(SfxSetting::default()); - commands.insert_resource(MusicSetting::default()); - commands.insert_resource(LeaderboardSetting::default()); - commands.insert_resource(ShadowSetting::default()); - - #[cfg(not(target_arch = "wasm32"))] - { - let file = match std::fs::File::open(SAVE_FILE) { - Ok(f) => f, - Err(_) => return, - }; - - let save_file: SaveFile = match ron::de::from_reader(file) { - Ok(s) => s, - Err(e) => { - warn!("Failed to deserialize save file: {:?}", e); - return; - } - }; - - info!("Loaded settings: {:?}", save_file); - - commands.insert_resource(save_file.sfx); - commands.insert_resource(save_file.music); - commands.insert_resource(save_file.leaderboard); - commands.insert_resource(save_file.shadow); - } - #[cfg(target_arch = "wasm32")] - { - let window = match web_sys::window() { - Some(w) => w, - None => return, - }; - - let storage = match window.local_storage() { - Ok(Some(s)) => s, - _ => return, - }; - - let item = match storage.get_item(LOCAL_STORAGE_KEY) { - Ok(Some(i)) => i, - _ => return, - }; - - let save_file: SaveFile = match ron::de::from_str(&item) { - Ok(s) => s, - Err(e) => { - warn!("Failed to serialize save file: {:?}", e); - return; - } - }; - - info!("Loaded settings: {:?}", save_file); - - commands.insert_resource(save_file.sfx); - commands.insert_resource(save_file.music); - commands.insert_resource(save_file.leaderboard); - commands.insert_resource(save_file.shadow); - } -} - -pub fn save_system( - sfx: Res, - music: Res, - leaderboard: Res, - shadow: Res, -) { - let sfx_changed = sfx.is_changed() && !sfx.is_added(); - let music_changed = music.is_changed() && !music.is_added(); - let leaderboard_changed = leaderboard.is_changed() && !leaderboard.is_added(); - let shadow_changed = shadow.is_changed() && !shadow.is_added(); - - if !sfx_changed && !music_changed && !leaderboard_changed && !shadow_changed { - return; - } - - info!("Saving settings."); - - let save_file = SaveFile { - sfx: sfx.clone(), - music: music.clone(), - leaderboard: leaderboard.clone(), - shadow: shadow.clone(), - }; - - let pretty = PrettyConfig::new(); - - #[cfg(not(target_arch = "wasm32"))] - { - let file = match std::fs::File::create(SAVE_FILE) { - Ok(f) => f, - Err(e) => { - warn!("Failed to create save file: {:?}", e); - return; - } - }; - - if let Err(e) = ron::ser::to_writer_pretty(file, &save_file, pretty) { - warn!("Failed to serialize save data: {:?}", e); - } - } - #[cfg(target_arch = "wasm32")] - { - let data = match ron::ser::to_string_pretty(&save_file, pretty) { - Ok(d) => d, - Err(e) => { - warn!("Failed to serialize save data: {:?}", e); - return; - } - }; - - let window = match web_sys::window() { - Some(w) => w, - None => return, - }; - - let storage = match window.local_storage() { - Ok(Some(s)) => s, - _ => return, - }; - - if let Err(e) = storage.set_item(LOCAL_STORAGE_KEY, data.as_str()) { - warn!("Failed to store save file: {:?}", e); - } - } -} diff --git a/src/settings.rs b/src/settings.rs index 2b5c935..7f78fb2 100644 --- a/src/settings.rs +++ b/src/settings.rs @@ -1,24 +1,23 @@ use bevy::prelude::*; -use serde::{Deserialize, Serialize}; use std::fmt::Display; -#[derive(Resource, Deref, DerefMut, Debug, Serialize, Deserialize, Clone)] +#[derive(Resource, Deref, DerefMut, Debug, Clone, Reflect)] pub struct MusicSetting(u8); impl Default for MusicSetting { fn default() -> Self { - Self(100) + Self(50) } } -#[derive(Resource, Deref, DerefMut, Debug, Serialize, Deserialize, Clone)] +#[derive(Resource, Deref, DerefMut, Debug, Clone, Reflect)] pub struct SfxSetting(u8); impl Default for SfxSetting { fn default() -> Self { - Self(100) + Self(50) } } -#[derive(Resource, Debug, Serialize, Deserialize, Clone, Default)] +#[derive(Resource, Debug, Clone, Default, Reflect)] pub enum ShadowSetting { None, Low, @@ -51,5 +50,5 @@ impl Display for ShadowSetting { } } -#[derive(Resource, Default, Deref, DerefMut, Debug, Serialize, Deserialize, Clone)] +#[derive(Resource, Default, Deref, DerefMut, Debug, Clone, Reflect)] pub struct LeaderboardSetting(pub Option);