From c267d00c3ca78b568b19a4452f0c7f31e7a991e5 Mon Sep 17 00:00:00 2001 From: r0r-5chach Date: Fri, 8 Nov 2024 19:43:15 +0000 Subject: [PATCH] world. objects. chunks. --- .gitignore | 1 + Cargo.lock | 72 +++++++++++++++++++++++++++++++++ Cargo.toml | 8 ++++ src/lib.rs | 2 + src/main.rs | 3 ++ src/types.rs | 32 +++++++++++++++ src/types/blocks.rs | 13 ++++++ src/types/blocks/ores.rs | 0 src/types/characters.rs | 14 +++++++ src/types/items.rs | 4 ++ src/world.rs | 31 +++++++++++++++ src/world/chunks.rs | 86 ++++++++++++++++++++++++++++++++++++++++ 12 files changed, 266 insertions(+) create mode 100644 .gitignore create mode 100644 Cargo.lock create mode 100644 Cargo.toml create mode 100644 src/lib.rs create mode 100644 src/main.rs create mode 100644 src/types.rs create mode 100644 src/types/blocks.rs create mode 100644 src/types/blocks/ores.rs create mode 100644 src/types/characters.rs create mode 100644 src/types/items.rs create mode 100644 src/world.rs create mode 100644 src/world/chunks.rs diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ea8c4bf --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/target diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..fc33f22 --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,72 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "anyhow" +version = "1.0.93" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c95c10ba0b00a02636238b814946408b1322d5ac4760326e6fb8ec956d85775" + +[[package]] +name = "proc-macro2" +version = "1.0.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f139b0662de085916d1fb67d2b4169d1addddda1919e696f3252b740b629986e" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "serde" +version = "1.0.214" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f55c3193aca71c12ad7890f1785d2b73e1b9f63a0bbc353c08ef26fe03fc56b5" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.214" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de523f781f095e28fa605cdce0f8307e451cc0fd14e2eb4cd2e98a355b147766" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "settlement-engine" +version = "0.1.0" +dependencies = [ + "anyhow", + "serde", +] + +[[package]] +name = "syn" +version = "2.0.87" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25aa4ce346d03a6dcd68dd8b4010bcb74e54e62c90c573f394c46eae99aba32d" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "unicode-ident" +version = "1.0.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..1e4a911 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "settlement-engine" +version = "0.1.0" +edition = "2021" + +[dependencies] +anyhow = "1.0.92" +serde = { version = "1.0.214", features = ["derive"] } diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 0000000..26ac423 --- /dev/null +++ b/src/lib.rs @@ -0,0 +1,2 @@ +pub mod types; +pub mod world; diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..e7a11a9 --- /dev/null +++ b/src/main.rs @@ -0,0 +1,3 @@ +fn main() { + println!("Hello, world!"); +} diff --git a/src/types.rs b/src/types.rs new file mode 100644 index 0000000..81ef95f --- /dev/null +++ b/src/types.rs @@ -0,0 +1,32 @@ +use std::time::Duration; + +pub trait GameObject { +} + +pub trait Harvestable { + fn harvest_time(&self) -> Duration; + fn harvest(&self) -> O; +} + +pub trait Spawnable { + fn spawn_chance(&self) -> f32; +} + +pub trait Smeltable { + fn smelt_time(&self) -> Duration; + fn smelt (&self) -> I; +} + +pub trait Stackable { + fn stack_size(&self) -> usize; +} + +pub mod blocks; +pub use blocks::Block; + +pub mod characters; +pub use characters::Character; + +pub mod items; +pub use items::Item; + diff --git a/src/types/blocks.rs b/src/types/blocks.rs new file mode 100644 index 0000000..b8e4082 --- /dev/null +++ b/src/types/blocks.rs @@ -0,0 +1,13 @@ +use crate::types; + +pub trait Block: types::GameObject {} + +pub trait ItemSpace { + fn item_in_space(&self) -> I; +} + +pub trait Vein { + fn vein_chance(&self) -> f32; +} + +pub mod ores; diff --git a/src/types/blocks/ores.rs b/src/types/blocks/ores.rs new file mode 100644 index 0000000..e69de29 diff --git a/src/types/characters.rs b/src/types/characters.rs new file mode 100644 index 0000000..f8f54ae --- /dev/null +++ b/src/types/characters.rs @@ -0,0 +1,14 @@ +pub trait Character { + fn profession(&self) -> Profession; + fn automation_unlocked(&self) -> bool; + fn maximum_health(&self) -> f32; + fn current_health(&self) -> f32; + fn is_unique(&self) -> bool; +} + +pub enum Profession { + LumberJack, + Carpenter, + Hunter, + Butcher, +} diff --git a/src/types/items.rs b/src/types/items.rs new file mode 100644 index 0000000..5b1bb8a --- /dev/null +++ b/src/types/items.rs @@ -0,0 +1,4 @@ +use crate::types; + +pub trait Item: types::GameObject {} + diff --git a/src/world.rs b/src/world.rs new file mode 100644 index 0000000..63247cf --- /dev/null +++ b/src/world.rs @@ -0,0 +1,31 @@ +use crate::types; + +pub type WorldObject = Box; + +pub struct Layer { + grid: Vec>, +} + +pub mod chunks; +pub use chunks::Chunks; + +pub struct World { + name: String, + chunks: Vec>, + loaded_chunk: chunks::LoadedChunk, +} +impl World { + fn new(name: String, world_size: usize) -> anyhow::Result { + let chunks = chunks::generate_new_chunks(&name, world_size)?; + let middle = world_size / 2; + let loaded_chunk = chunks::LoadedChunk::from(&chunks[middle][middle]); + Ok(Self { + name, + chunks, + loaded_chunk, + }) + } + +} + + diff --git a/src/world/chunks.rs b/src/world/chunks.rs new file mode 100644 index 0000000..243a501 --- /dev/null +++ b/src/world/chunks.rs @@ -0,0 +1,86 @@ +use std::{ + fs::{self, File}, + path::{Path, PathBuf} +}; + +pub fn generate_new_chunks(name: &str, world_size: usize) -> anyhow::Result { + let dir = PathBuf::from(name).join("chunks/"); + if !dir.is_dir() { + fs::create_dir(&dir)?; + } + create_chunk_files(&dir, world_size) +} + +fn create_chunk_files(dir: &Path, world_size: usize) -> anyhow::Result { + Ok( + (0..world_size) + .map(|x| { + let x = coordinate_to_string(&x, world_size); + (0..world_size) + .map(|y| { + let y = coordinate_to_string(&y, world_size); + let file_name = middle_chunk_file(&x, &y); + File::create(dir.join(&file_name)).unwrap(); + ChunkAlias::from(dir.join(&file_name)) + }).collect() + }).collect() + ) +} + +fn coordinate_to_string(coordinate: &usize, world_size: usize) -> String { + let digit_len = world_size.to_string().len(); + let coordinate = coordinate.to_string(); + let delta_len = coordinate.len() % digit_len; + + "0".repeat(digit_len - delta_len) + &coordinate +} + +fn middle_chunk_file(x: &str, y: &str) -> String { + x.to_string() + "_" + y + ".chunk" +} + +pub trait Chunk { + fn generate() -> Self; +} + +pub struct LoadedChunk { + stack: Vec, + neighbours: ChunkNeighbours, +} +impl Chunk for LoadedChunk { + fn generate() -> Self { + todo!("- Generate chunk") + } +} + +impl From<&ChunkAlias> for LoadedChunk { + fn from(alias: &ChunkAlias) -> Self { + todo!( + "- Return contents of path as Chunk + - If file is empty, generate new chunk" + ); + } +} + +#[derive(Clone)] +pub struct ChunkAlias { + file: PathBuf, +} + +impl From for ChunkAlias { + fn from(path: PathBuf) -> Self { + Self { + file: path, + } + } + +} + +pub struct ChunkNeighbours { + pos_x: ChunkAlias, + pos_y: ChunkAlias, + neg_x: ChunkAlias, + neg_y: ChunkAlias, +} + +pub type Chunks = Vec>;