feat: Add achievement tracking and persistence (#42)

This commit is contained in:
demenik
2025-12-11 17:26:19 +01:00
parent 1e7e4e7b95
commit 172f32a4d8
9 changed files with 139 additions and 4 deletions

View File

@@ -1,3 +1,4 @@
use crate::features::achievement::components::AchievementProgress;
use crate::features::phase::components::{SessionTracker, TimerSettings};
use crate::features::savegame::ui::load_popup_handler;
use crate::prelude::*;
@@ -34,6 +35,7 @@ struct SaveData {
tiles: Vec<Vec<TileState>>,
current_phase: CurrentPhase,
session_tracker: SessionTracker,
achievement_progress: AchievementProgress,
timer_settings: TimerSettings,
pom_position: GridPosition,
inventory: Vec<ItemStack>,
@@ -47,6 +49,7 @@ fn dump_savegame(
tile_query: Query<&TileState>,
phase: Res<CurrentPhase>,
tracker: Res<SessionTracker>,
achievement_progress: Res<AchievementProgress>,
settings: Res<TimerSettings>,
pom_query: Query<&GridPosition, With<Pom>>,
inventory: Res<Inventory>,
@@ -85,6 +88,7 @@ fn dump_savegame(
tiles: tile_states,
current_phase: phase.clone(),
session_tracker: tracker.clone(),
achievement_progress: achievement_progress.clone(),
timer_settings: settings.clone(),
pom_position: *pom_pos,
inventory: item_stacks,
@@ -118,6 +122,7 @@ fn load_savegame(
mut tile_query: Query<&mut TileState>,
mut phase: ResMut<CurrentPhase>,
mut tracker: ResMut<SessionTracker>,
mut achievement_progress: ResMut<AchievementProgress>,
mut settings: ResMut<TimerSettings>,
mut pom_query: Query<(&mut GridPosition, &mut Transform), With<Pom>>,
mut inventory: ResMut<Inventory>,
@@ -134,6 +139,7 @@ fn load_savegame(
Ok(save_data) => {
*phase = save_data.current_phase;
*tracker = save_data.session_tracker;
*achievement_progress = save_data.achievement_progress;
*settings = save_data.timer_settings;
if let Ok((mut pom_pos, mut pom_transform)) = pom_query.single_mut() {
@@ -185,11 +191,13 @@ fn reset_savegame(
mut tile_query: Query<&mut TileState>,
mut phase: ResMut<CurrentPhase>,
mut tracker: ResMut<SessionTracker>,
mut achievement_progress: ResMut<AchievementProgress>,
mut settings: ResMut<TimerSettings>,
mut pom_query: Query<(&mut GridPosition, &mut Transform), With<Pom>>,
mut inventory: ResMut<Inventory>,
) {
*tracker = SessionTracker::default();
*achievement_progress = AchievementProgress::default();
*settings = TimerSettings::default();
*phase = CurrentPhase(Phase::Focus {
duration: settings.focus_duration as f32,