diff --git a/src/features/pom/components.rs b/src/features/pom/components.rs index 43dfa25..5e9866a 100644 --- a/src/features/pom/components.rs +++ b/src/features/pom/components.rs @@ -5,7 +5,7 @@ use std::collections::VecDeque; #[derive(Component)] pub struct Pom; -#[derive(Component, Serialize, Deserialize, Clone, Copy)] +#[derive(Component, Serialize, Deserialize, Clone, Copy, Default)] pub struct GridPosition { pub x: u32, pub y: u32, diff --git a/src/features/savegame/mod.rs b/src/features/savegame/mod.rs index 61b97e4..347cf06 100644 --- a/src/features/savegame/mod.rs +++ b/src/features/savegame/mod.rs @@ -19,6 +19,7 @@ impl Plugin for SavegamePlugin { app.add_systems(Update, dump_savegame.run_if(in_state(AppState::GameScreen))); app.add_systems(Update, load_savegame.run_if(in_state(AppState::GameScreen))); + app.add_systems(OnExit(AppState::GameScreen), reset_savegame); app.add_systems(Update, load_popup_handler); } @@ -172,3 +173,36 @@ fn load_savegame( } } } + +// Resets all components/resources loaded by `load_savegame` +fn reset_savegame( + mut commands: Commands, + grid: Res, + mut tile_query: Query<&mut TileState>, + mut phase: ResMut, + mut tracker: ResMut, + mut settings: ResMut, + mut pom_query: Query<(&mut GridPosition, &mut Transform), With>, + mut inventory: ResMut, +) { + *tracker = SessionTracker::default(); + *settings = TimerSettings::default(); + *phase = CurrentPhase(Phase::Focus { + duration: settings.focus_duration as f32, + }); + + inventory + .items + .iter() + .for_each(|entity| commands.entity(*entity).despawn()); + inventory.items.clear(); + + if let Ok((mut pom_pos, mut pom_transform)) = pom_query.single_mut() { + *pom_pos = GridPosition::default(); + pom_transform.translation = grid_to_world_coords(0, 0, Some(1.0), grid.width, grid.height); + } + + tile_query + .iter_mut() + .for_each(|mut state| *state = TileState::default()); +}