commit 7e397c3c56979fa1ebde0347e168fff1f62284fe Author: danial23 Date: Sat Dec 16 16:29:22 2023 -0500 Initial commit 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..925d672 --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,496 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "ahash" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91429305e9f0a25f6205c5b8e0d2db09e0708a7a6df0f42212bb56c32c8ac97a" +dependencies = [ + "cfg-if", + "once_cell", + "version_check", + "zerocopy", +] + +[[package]] +name = "allocator-api2" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5" + +[[package]] +name = "autocfg" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07" + +[[package]] +name = "cassowary" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df8670b8c7b9dae1793364eafadf7239c40d669904660c5960d74cfd80b46a53" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "crossterm" +version = "0.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f476fe445d41c9e991fd07515a6f463074b782242ccf4a5b7b1d1012e70824df" +dependencies = [ + "bitflags 2.4.1", + "crossterm_winapi", + "libc", + "mio", + "parking_lot", + "signal-hook", + "signal-hook-mio", + "winapi", +] + +[[package]] +name = "crossterm_winapi" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "acdd7c62a3665c7f6830a51635d9ac9b23ed385797f70a83bb8bafe9c572ab2b" +dependencies = [ + "winapi", +] + +[[package]] +name = "either" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" + +[[package]] +name = "hashbrown" +version = "0.14.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" +dependencies = [ + "ahash", + "allocator-api2", +] + +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + +[[package]] +name = "indoc" +version = "2.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e186cfbae8084e513daff4240b4797e342f988cecda4fb6c939150f96315fd8" + +[[package]] +name = "itertools" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57" +dependencies = [ + "either", +] + +[[package]] +name = "libc" +version = "0.2.151" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "302d7ab3130588088d277783b1e2d2e10c9e9e4a16dd9050e6ec93fb3e7048f4" + +[[package]] +name = "lock_api" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" + +[[package]] +name = "lru" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2994eeba8ed550fd9b47a0b38f0242bc3344e496483c6180b69139cc2fa5d1d7" +dependencies = [ + "hashbrown", +] + +[[package]] +name = "mio" +version = "0.8.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f3d0b296e374a4e6f3c7b0a1f5a51d748a0d34c85e7dc48fc3fa9a87657fe09" +dependencies = [ + "libc", + "log", + "wasi", + "windows-sys", +] + +[[package]] +name = "once_cell" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" + +[[package]] +name = "parking_lot" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-targets", +] + +[[package]] +name = "paste" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" + +[[package]] +name = "proc-macro2" +version = "1.0.70" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39278fbbf5fb4f646ce651690877f89d1c5811a3d4acb27700c1cb3cdb78fd3b" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" + +[[package]] +name = "rand_xoshiro" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f97cdb2a36ed4183de61b2f824cc45c9f1037f28afe0a322e9fff4c108b5aaa" +dependencies = [ + "rand_core", +] + +[[package]] +name = "ratatui" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ebc917cfb527a566c37ecb94c7e3fd098353516fb4eb6bea17015ade0182425" +dependencies = [ + "bitflags 2.4.1", + "cassowary", + "crossterm", + "indoc", + "itertools", + "lru", + "paste", + "strum", + "unicode-segmentation", + "unicode-width", +] + +[[package]] +name = "redox_syscall" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" +dependencies = [ + "bitflags 1.3.2", +] + +[[package]] +name = "rustversion" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "signal-hook" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8621587d4798caf8eb44879d42e56b9a93ea5dcd315a6487c357130095b62801" +dependencies = [ + "libc", + "signal-hook-registry", +] + +[[package]] +name = "signal-hook-mio" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29ad2e15f37ec9a6cc544097b78a1ec90001e9f71b81338ca39f430adaca99af" +dependencies = [ + "libc", + "mio", + "signal-hook", +] + +[[package]] +name = "signal-hook-registry" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1" +dependencies = [ + "libc", +] + +[[package]] +name = "smallvec" +version = "1.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4dccd0940a2dcdf68d092b8cbab7dc0ad8fa938bf95787e1b916b0e3d0e8e970" + +[[package]] +name = "strum" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "290d54ea6f91c969195bdbcd7442c8c2a2ba87da8bf60a7ee86a235d4bc1e125" +dependencies = [ + "strum_macros", +] + +[[package]] +name = "strum_macros" +version = "0.25.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23dc1fa9ac9c169a78ba62f0b841814b7abae11bdd047b9c58f893439e309ea0" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "rustversion", + "syn", +] + +[[package]] +name = "syn" +version = "2.0.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44c8b28c477cc3bf0e7966561e3460130e1255f7a1cf71931075f1c5e7a7e269" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "three-ore" +version = "0.1.0" +dependencies = [ + "crossterm", + "rand", + "rand_xoshiro", + "ratatui", + "xxhash-rust", +] + +[[package]] +name = "unicode-ident" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" + +[[package]] +name = "unicode-segmentation" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1dd624098567895118886609431a7c3b8f516e41d30e0643f03d94592a147e36" + +[[package]] +name = "unicode-width" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e51733f11c9c4f72aa0c160008246859e340b00807569a0da0e7a1079b27ba85" + +[[package]] +name = "version_check" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + +[[package]] +name = "xxhash-rust" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9828b178da53440fa9c766a3d2f73f7cf5d0ac1fe3980c1e5018d899fd19e07b" + +[[package]] +name = "zerocopy" +version = "0.7.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c4061bedbb353041c12f413700357bec76df2c7e2ca8e4df8bac24c6bf68e3d" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3c129550b3e6de3fd0ba67ba5c81818f9805e58b8d7fee80a3a59d2c9fc601a" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..8de6c80 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,13 @@ +[package] +name = "three-ore" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +crossterm = "0.27.0" +rand = { version = "0.8.5", default-features = false } +rand_xoshiro = "0.6.0" +ratatui = "0.24.0" +xxhash-rust = { version = "0.8.7", features = ["xxh3"] } diff --git a/src/board.rs b/src/board.rs new file mode 100644 index 0000000..df7435a --- /dev/null +++ b/src/board.rs @@ -0,0 +1,189 @@ +use crate::logic::*; +use rand::seq::SliceRandom; +use rand::{Rng, SeedableRng}; +use rand_xoshiro::SplitMix64; +use xxhash_rust::xxh3::xxh3_64; + +impl Board { + pub fn new(seed: &str) -> Board { + let mut rng = SplitMix64::seed_from_u64(xxh3_64(seed.as_bytes())); + let hexes = { + let mut arr = [[None; 7]; 7]; + for h in Board::hexes(&mut rng) { + arr[h.position.0 as usize][h.position.1 as usize] = Some(h); + } + arr + }; + let (edges, vertices) = { + let mut es = [[None; 15]; 15]; + let mut vs = [[None; 15]; 15]; + for hex in hexes.iter().flatten() { + match hex { + Some(Hex { + hextype: HexType::Resource | HexType::Desert, + position: p, + .. + }) => { + let mut d = Position::new(1, 0); + for _ in 0..6 { + let e = p.edge(&d); + if es[e.0 as usize][e.1 as usize].is_none() { + es[e.0 as usize][e.1 as usize] = Some(Edge { + position: e, + road: None, + }); + } + if vs[e.0 as usize][e.1 as usize].is_none() { + vs[e.0 as usize][e.1 as usize] = Some(Vertex { + position: e.vertex(&d), + settlement: None, + city: None, + }); + } + d.rotate(); + } + } + _ => (), + } + } + (es, vs) + }; + + let board = Board { + hexes, + edges, + vertices, + robber: hexes + .iter() + .flatten() + .find(|h| h.is_some() && h.unwrap().hextype == HexType::Desert) + .unwrap() + .unwrap() + .position, + }; + board + } + + fn hexes(mut rng: &mut R) -> Vec { + // get random direction + let direction = { + let mut d = Position::new(1, 0); + for _ in 0..rng.gen_range(0..6) { + d.rotate(); + } + d + }; + let ps = Board::spiral_order(&direction); + let mut hexes = Vec::new(); + + // randomize port resources + let mut port_resources = { + let mut v = vec![ + None, + None, + None, + None, + Some(Resource::Wood), + Some(Resource::Brick), + Some(Resource::Sheep), + Some(Resource::Wheat), + Some(Resource::Ore), + ]; + v.shuffle(&mut rng); + v + }; + let mut orientation = direction; + orientation.rotate().rotate(); + for (i, p) in ps[0..18].iter().enumerate() { + if i % 2 == 0 { + //is a port + if i % 3 != 2 { + orientation.rotate(); + } + hexes.push(Hex { + hextype: HexType::Port, + resource: port_resources.pop().unwrap(), + position: *p, + number: None, + orientation: Some(orientation), + }); + } else { + hexes.push(Hex { + hextype: HexType::Ocean, + resource: None, + position: *p, + number: None, + orientation: None, + }); + } + } + + let mut numbers = { + let mut v = vec![5, 2, 6, 3, 8, 10, 9, 12, 11, 4, 8, 10, 9, 4, 5, 6, 3, 11]; + v.reverse(); + v + }; + let mut hex_resources = { + let mut h = Vec::new(); + for _ in 0..4 { + h.push(Resource::Wood); + h.push(Resource::Sheep); + h.push(Resource::Wheat); + } + for _ in 0..3 { + h.push(Resource::Brick); + h.push(Resource::Ore); + } + h.shuffle(&mut rng); + h + }; + let desert_pos = rng.gen_range(0..18); + for (i, p) in ps[18..].iter().enumerate() { + if i == desert_pos { + hexes.push(Hex { + hextype: HexType::Desert, + resource: None, + position: *p, + number: None, + orientation: None, + }); + } else { + hexes.push(Hex { + hextype: HexType::Resource, + resource: Some(hex_resources.pop().unwrap()), + position: *p, + number: Some(numbers.pop().unwrap()), + orientation: None, + }); + }; + } + hexes + } + + fn spiral_order(direction: &Position) -> Vec { + let mut ps = Vec::new(); + for r in (1..=3).rev() { + ps.extend(&Board::ring(&direction, r)); + } + ps.push(Position::new(3, 3)); + ps + } + + fn ring(direction: &Position, radius: u32) -> Vec { + let mut ps = Vec::new(); + let mut current = Position::new(3, 3); + for _ in 0..radius { + current.add(direction); + } + let mut d = *direction; + d.rotate().rotate(); + for _ in 0..6 { + for _ in 0..radius { + ps.push(current); + current.add(&d); + } + d.rotate(); + } + ps + } +} diff --git a/src/logic.rs b/src/logic.rs new file mode 100644 index 0000000..1a5a4c6 --- /dev/null +++ b/src/logic.rs @@ -0,0 +1,162 @@ +#[derive(Eq, PartialEq, Copy, Clone, Debug)] +pub enum Color { + Red, + Green, + Yellow, + Blue, +} + +#[derive(Eq, PartialEq, Copy, Clone, Debug)] +pub enum Resource { + Brick, + Wood, + Sheep, + Wheat, + Ore, +} + +#[derive(Eq, PartialEq, Copy, Clone, Debug)] +pub enum DevCard { + Knight, + VictoryPoint, + RoadBuilding, + YearOfPlenty, + Monopoly, +} + +#[derive(Eq, PartialEq, Copy, Clone, Debug)] +pub enum HexType { + Desert, + Resource, + Port, + Ocean, +} + +/** +* Skewed 2d coordinate system +* +* \ +* \ +* -----\-----> y +* \ 60 deg +* \ x +*/ +#[derive(Eq, Ord, PartialEq, PartialOrd, Copy, Clone, Debug)] +pub struct Position(pub i32, pub i32); + +#[derive(Eq, PartialEq, Copy, Clone, Debug)] +pub struct Settlement(pub Color); +#[derive(Eq, PartialEq, Copy, Clone, Debug)] +pub struct City(pub Color); +#[derive(Eq, PartialEq, Copy, Clone, Debug)] +pub struct Road(pub Color); + +pub struct Player { + pub name: String, + pub color: Color, + pub resources: Vec, + pub dev_cards: Vec, + pub settlements: u32, + pub cities: u32, + pub roads: u32, + pub knights: u32, + pub points: u32, + pub ports: Vec, +} +#[derive(Eq, PartialEq, Copy, Clone, Debug)] +pub struct Hex { + pub hextype: HexType, + pub resource: Option, + pub position: Position, + pub number: Option, + pub orientation: Option, // orientation of the port +} + +#[derive(Eq, PartialEq, Copy, Clone, Debug)] +pub struct Edge { + pub position: Position, // half scale coordinates + pub road: Option, +} + +#[derive(Eq, PartialEq, Copy, Clone, Debug)] +pub struct Vertex { + pub position: Position, // rotated 30 deg, half scale coordinates + pub settlement: Option, + pub city: Option, +} + +#[derive(Debug)] +pub struct Board { + pub hexes: [[Option; 7]; 7], // center is 3,3 + pub edges: [[Option; 15]; 15], + pub vertices: [[Option; 15]; 15], + pub robber: Position, +} + +pub enum GamePhase { + Setup, + Main, +} + +pub struct Game { + pub players: Vec, + pub board: Board, + pub phase: GamePhase, + pub turn: Player, + pub dev_cards: Vec, + pub longest_road: Option, + pub larget_army: Option, +} + +impl Position { + pub fn new(x: i32, y: i32) -> Position { + Position(x, y) + } + + pub fn distance(&self, other: &Position) -> u32 { + let a = self.0 - other.0; + let b = self.1 - other.1; + if a ^ b >= 0 { + (a.abs() + b.abs()) as u32 + } else { + (a.abs().max(b.abs())) as u32 + } + } + + pub fn rotate(&mut self) -> &mut Position { + let x = self.0; + let y = self.1; + self.0 = -y; + self.1 = x + y; + self + } + + pub fn add(&mut self, other: &Position) -> &mut Position { + self.0 += other.0; + self.1 += other.1; + self + } + + pub fn neg(&mut self) -> &mut Position { + self.0 = -self.0; + self.1 = -self.1; + self + } + + pub fn scale(&mut self, n: i32) -> &mut Position { + self.0 *= n; + self.1 *= n; + self + } + + pub fn edge(&self, direction: &Position) -> Position { + let mut p = *self; + p.scale(2).add(&Position(1, 1)).add(direction); + p + } + + pub fn vertex(&self, direction: &Position) -> Position { + let Position(x, y) = *self; + Position(2 * x + y - 2 + direction.0, y - x + 7 + direction.1) + } +} diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..4e5d5d4 --- /dev/null +++ b/src/main.rs @@ -0,0 +1,10 @@ +mod board; +mod logic; + +/** +* Three Ore Two Wheat +*/ + +fn main() { + println!("Hello, world!"); +}