From 2857f59a853e8fa6a53e8ea3fc7cc98a533510fe Mon Sep 17 00:00:00 2001 From: demenik Date: Thu, 11 Dec 2025 20:21:46 +0100 Subject: [PATCH] feat: Show achievement progress in savegame load menu (#47) --- src/features/savegame/components.rs | 7 ++++++- src/features/savegame/ui/load.rs | 25 ++++++++++++++++++++++++- src/features/start_screen/mod.rs | 3 ++- 3 files changed, 32 insertions(+), 3 deletions(-) diff --git a/src/features/savegame/components.rs b/src/features/savegame/components.rs index 4ed2aaf..349bed5 100644 --- a/src/features/savegame/components.rs +++ b/src/features/savegame/components.rs @@ -1,3 +1,4 @@ +use crate::features::achievement::components::AchievementProgress; use crate::prelude::*; use std::fs; use std::path::PathBuf; @@ -7,18 +8,20 @@ use std::path::PathBuf; pub struct SavegamePath(pub PathBuf); /// Metadata about a savegame. -#[derive(Debug)] +#[derive(Debug, Clone)] pub struct SavegameInfo { pub path: SavegamePath, pub index: u32, pub total_berries: u32, pub completed_focus: u32, + pub achievement_progress: AchievementProgress, } /// Helper for partial JSON deserialization. #[derive(Deserialize)] struct PartialSaveData { session_tracker: PartialSessionTracker, + achievement_progress: AchievementProgress, } /// Helper for partial JSON deserialization of session stats. @@ -87,6 +90,7 @@ impl SavegamePath { index, total_berries: data.session_tracker.total_berries_earned, completed_focus: data.session_tracker.completed_focus_phases, + achievement_progress: data.achievement_progress, }); } @@ -113,4 +117,5 @@ pub enum RootMarker { pub enum ButtonType { SavegameLoad { savegame_path: SavegamePath }, SavegameDelete { savegame_path: SavegamePath }, + Achievements { savegame: SavegameInfo }, } diff --git a/src/features/savegame/ui/load.rs b/src/features/savegame/ui/load.rs index 8871061..a03eb7c 100644 --- a/src/features/savegame/ui/load.rs +++ b/src/features/savegame/ui/load.rs @@ -1,8 +1,9 @@ use super::super::components::{ButtonType, RootMarker}; +use crate::features::achievement::ui::open_achievements_menu; use crate::{features::savegame::messages::SavegameLoadMessage, prelude::*}; /// Spawns the "Load Game" popup. -pub fn spawn_load_popup(commands: &mut Commands) { +pub fn spawn_load_popup(commands: &mut Commands, asset_server: &AssetServer) { spawn_popup( commands, RootMarker::PopupSavegameLoad, @@ -78,6 +79,25 @@ pub fn spawn_load_popup(commands: &mut Commands) { ..default() }, |color| text("X", 24.0, color) + ), + button( + ButtonType::Achievements { + savegame: savegame.clone() + }, + ButtonVariant::Primary, + Node { + width: px(40), + height: px(40), + ..default() + }, + |_| ( + ImageNode::default(), + AseSlice { + aseprite: asset_server + .load("achievement.aseprite"), + name: "Achievement".into() + } + ) ) ], ) @@ -111,6 +131,9 @@ pub fn load_popup_handler( println!("Error while deleting savegame: {:?}", e); } } + ButtonType::Achievements { savegame } => { + open_achievements_menu(&mut commands, &savegame.achievement_progress); + } }; for (entity, root) in root_query.iter() { diff --git a/src/features/start_screen/mod.rs b/src/features/start_screen/mod.rs index 81a833d..3109e67 100644 --- a/src/features/start_screen/mod.rs +++ b/src/features/start_screen/mod.rs @@ -80,12 +80,13 @@ fn menu( mut commands: Commands, mut next_state: ResMut>, mut interaction_query: Query<(&Interaction, &ButtonType), (Changed, With