From 170042753196cfd99765c90809a3622f788d6089 Mon Sep 17 00:00:00 2001 From: zmarlon Date: Sun, 6 Apr 2025 14:45:25 +0200 Subject: [PATCH] Started working on world --- Content/Levels/InGame.umap | 2 +- Source/land_of_barl/Cargo.toml | 4 ++ Source/land_of_barl/src/lib.rs | 2 + Source/land_of_barl/src/world/mod.rs | 67 ++++++++++++++++++++++++++++ 4 files changed, 74 insertions(+), 1 deletion(-) create mode 100644 Source/land_of_barl/src/world/mod.rs diff --git a/Content/Levels/InGame.umap b/Content/Levels/InGame.umap index 616ef29..4793322 100644 --- a/Content/Levels/InGame.umap +++ b/Content/Levels/InGame.umap @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:858daeb14b01631aec5d0a4050a0879c4bb5b961d6f3f5d99f4138874c4bdab6 +oid sha256:65c4a8cf39f10f101f0b2756ca5f14d9ac9ff3f4858bb8071f33785350456c81 size 76477 diff --git a/Source/land_of_barl/Cargo.toml b/Source/land_of_barl/Cargo.toml index 2dd3850..8f9dd71 100644 --- a/Source/land_of_barl/Cargo.toml +++ b/Source/land_of_barl/Cargo.toml @@ -4,6 +4,10 @@ version = "0.1.0" edition = "2024" [dependencies] +dirs = "6.0.0" +rmp-serde = "1.3.0" +serde = { version = "1.0.217", features = ["derive"] } +thiserror = "2.0.11" [build-dependencies] bindgen = "0.71.1" diff --git a/Source/land_of_barl/src/lib.rs b/Source/land_of_barl/src/lib.rs index b93cf3f..5421431 100644 --- a/Source/land_of_barl/src/lib.rs +++ b/Source/land_of_barl/src/lib.rs @@ -1,3 +1,5 @@ +mod world; + pub fn add(left: u64, right: u64) -> u64 { left + right } diff --git a/Source/land_of_barl/src/world/mod.rs b/Source/land_of_barl/src/world/mod.rs new file mode 100644 index 0000000..bde43f2 --- /dev/null +++ b/Source/land_of_barl/src/world/mod.rs @@ -0,0 +1,67 @@ +use serde::{Deserialize, Serialize}; +use std::fs; +use std::path::PathBuf; +use thiserror::Error; + +#[derive(Debug, Error)] +pub enum Error { + #[error("{0}")] + Custom(String), + #[error("{0}")] + Io(#[from] std::io::Error), + #[error("{0}")] + RmpEncode(#[from] rmp_serde::encode::Error), + #[error("{0}")] + RmpDecode(#[from] rmp_serde::decode::Error), +} + +fn get_save_dir() -> Result { + let path = dirs::home_dir() + .ok_or(Error::Custom("Failed to get home dir".into()))? + .join("land_of_barl"); + if !path.exists() { + std::fs::create_dir_all(&path)?; + } + Ok(path) +} + +#[derive(Serialize, Deserialize)] +pub struct SerializedWorld { + name: String, + day: u32, + time: f32, +} + +impl SerializedWorld { + pub fn new(name: String) -> Self { + Self { + name, + day: 0, + time: 7.0, + } + } + + pub fn save(&self) -> Result<(), Error> { + let path = Self::dir(&self.name)?; + if !path.exists() { + fs::create_dir_all(&path)?; + } + + let content = rmp_serde::to_vec(self)?; + fs::write(path.join("world.dat"), content)?; + + Ok(()) + } + + pub fn load(name: &str) -> Result { + let path = Self::dir(name)?; + + let content = fs::read(path.join("world.dat"))?; + + Ok(rmp_serde::from_slice(&content)?) + } + + fn dir(name: &str) -> Result { + Ok(get_save_dir()?.join(name)) + } +}