refactor: Refactor to features (#53)

This commit is contained in:
demenik
2025-11-26 19:59:53 +01:00
parent 4c3aeb08ed
commit 3b7bfb17e1
35 changed files with 167 additions and 185 deletions

View File

@@ -0,0 +1,89 @@
use crate::features::phase::components::{SessionTracker, TimerSettings};
use crate::prelude::*;
use messages::*;
use std::fs::File;
use std::io::Write;
pub mod components;
pub mod messages;
pub struct SavegamePlugin;
impl Plugin for SavegamePlugin {
fn build(&self, app: &mut App) {
app.add_message::<SavegameDumpMessage>();
app.add_systems(Update, dump_savegame.run_if(in_state(AppState::GameScreen)));
}
}
#[derive(Serialize, Deserialize)]
struct SaveData {
grid_width: u32,
grid_height: u32,
tiles: Vec<Vec<TileState>>,
current_phase: CurrentPhase,
session_tracker: SessionTracker,
timer_settings: TimerSettings,
pom_position: GridPosition,
}
fn dump_savegame(
mut messages: MessageReader<SavegameDumpMessage>,
grid: Res<Grid>,
tile_query: Query<&TileState>,
phase: Res<CurrentPhase>,
tracker: Res<SessionTracker>,
settings: Res<TimerSettings>,
pom_query: Query<&GridPosition, With<Pom>>,
save_path: Res<SavegamePath>,
) {
for _ in messages.read() {
let mut tile_states = Vec::new();
for x in 0..grid.width {
let mut col = Vec::new();
for y in 0..grid.height {
if let Ok(entity) = grid.get_tile((x, y)) {
if let Ok(state) = tile_query.get(entity) {
col.push(*state);
} else {
col.push(TileState::Unclaimed);
}
} else {
col.push(TileState::Unclaimed);
}
}
tile_states.push(col);
}
let pom_pos = pom_query.single().unwrap();
let save_data = SaveData {
grid_width: grid.width,
grid_height: grid.height,
tiles: tile_states,
current_phase: phase.clone(),
session_tracker: tracker.clone(),
timer_settings: settings.clone(),
pom_position: *pom_pos,
};
match serde_json::to_string_pretty(&save_data) {
Ok(serialized) => {
if let Ok(mut file) = File::create(&save_path.0) {
if let Err(e) = file.write_all(serialized.as_bytes()) {
panic!("Failed to write save file: {}", e);
} else {
println!("Game saved to {}", save_path.0.display());
}
} else {
panic!("Failed to create save file at {}", save_path.0.display());
}
}
Err(e) => {
panic!("Failed to serialize save data: {}", e);
}
}
}
}