diff --git a/Cargo.lock b/Cargo.lock index 91ebe45..24b2baa 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -108,6 +108,12 @@ dependencies = [ "parking_lot", ] +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + [[package]] name = "getrandom" version = "0.2.8" @@ -177,6 +183,7 @@ name = "mantle-diver" version = "0.1.0" dependencies = [ "egui-sfml", + "fnv", "hecs", "rand", "s2dc", diff --git a/Cargo.toml b/Cargo.toml index cb4c04a..e1f4fec 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,6 +7,7 @@ edition = "2021" [dependencies] egui-sfml = "0.4.0" +fnv = "1.0.7" hecs = "0.10.1" rand = "0.8.5" sfml = "0.20.0" diff --git a/src/game.rs b/src/game.rs new file mode 100644 index 0000000..16457da --- /dev/null +++ b/src/game.rs @@ -0,0 +1,16 @@ +use crate::{math::WorldPos, world::World}; + +pub struct GameState { + transient: TransientGameState, + persistent: PersistentGameState, +} + +/// Transient game state, not saved to disk +pub struct TransientGameState { + camera_offset: WorldPos, +} + +/// Persistent game state, saved to disk +pub struct PersistentGameState { + world: World, +} diff --git a/src/main.rs b/src/main.rs index 96457cc..64262d6 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,5 +1,8 @@ mod app; +mod game; mod graphics; +mod math; +mod world; use app::App; diff --git a/src/math.rs b/src/math.rs new file mode 100644 index 0000000..42a0c17 --- /dev/null +++ b/src/math.rs @@ -0,0 +1,6 @@ +pub type WorldPosScalar = i32; + +pub struct WorldPos { + x: WorldPosScalar, + y: WorldPosScalar, +} diff --git a/src/world.rs b/src/world.rs new file mode 100644 index 0000000..509c682 --- /dev/null +++ b/src/world.rs @@ -0,0 +1,28 @@ +use fnv::FnvHashMap; + +type ChunkPosScalar = i16; + +#[derive(Hash)] +struct ChunkPos { + x: ChunkPosScalar, + y: ChunkPosScalar, +} + +pub struct World { + chunks: FnvHashMap, +} + +const CHUNK_EXTENT: u16 = 256; +const CHUNK_N_BLOCKS: usize = CHUNK_EXTENT as usize * CHUNK_EXTENT as usize; + +type ChunkBlocks = [Block; CHUNK_N_BLOCKS]; + +pub struct Chunk { + blocks: ChunkBlocks, +} + +type BlockId = u16; + +pub struct Block { + id: BlockId, +}