42 lines
1.1 KiB
Rust
42 lines
1.1 KiB
Rust
//! Player progress saved to `./.gameplay/state.yaml`.
|
|
|
|
use anyhow::Result;
|
|
use serde::{Deserialize, Serialize};
|
|
use std::path::PathBuf;
|
|
|
|
use crate::levels::Nugget;
|
|
|
|
#[derive(Default, Serialize, Deserialize)]
|
|
#[serde(default)]
|
|
pub struct Progress {
|
|
/// Nuggets awarded per level: `(level_id, nugget)` in order of
|
|
/// completion. A level appears at most once (re-runs after reset
|
|
/// rebuild the list from scratch).
|
|
pub nuggets: Vec<(u8, Nugget)>,
|
|
pub current_level: u8, // 1-indexed; 0 means a new game
|
|
pub current_seed: u64,
|
|
pub attempts: u32,
|
|
}
|
|
|
|
pub fn save_path() -> PathBuf {
|
|
PathBuf::from(".gameplay/state.yaml")
|
|
}
|
|
|
|
pub fn load() -> Result<Progress> {
|
|
let path = save_path();
|
|
if !path.exists() {
|
|
return Ok(Progress::default());
|
|
}
|
|
Ok(serde_yaml::from_str(&std::fs::read_to_string(&path)?)?)
|
|
}
|
|
|
|
pub fn save(progress: &Progress) -> Result<()> {
|
|
let path = save_path();
|
|
// First-run safeguard: `.gameplay/` won't exist yet.
|
|
if let Some(dir) = path.parent() {
|
|
std::fs::create_dir_all(dir)?;
|
|
}
|
|
std::fs::write(&path, serde_yaml::to_string(progress)?)?;
|
|
Ok(())
|
|
}
|