summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore1
-rw-r--r--Cargo.lock75
-rw-r--r--Cargo.toml9
-rw-r--r--src/main.rs304
4 files changed, 389 insertions, 0 deletions
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..70bd242
--- /dev/null
+++ b/Cargo.lock
@@ -0,0 +1,75 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+version = 3
+
+[[package]]
+name = "cfg-if"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
+
+[[package]]
+name = "cge"
+version = "0.1.0"
+dependencies = [
+ "rand",
+]
+
+[[package]]
+name = "getrandom"
+version = "0.2.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5"
+dependencies = [
+ "cfg-if",
+ "libc",
+ "wasi",
+]
+
+[[package]]
+name = "libc"
+version = "0.2.153"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd"
+
+[[package]]
+name = "ppv-lite86"
+version = "0.2.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de"
+
+[[package]]
+name = "rand"
+version = "0.8.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404"
+dependencies = [
+ "libc",
+ "rand_chacha",
+ "rand_core",
+]
+
+[[package]]
+name = "rand_chacha"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88"
+dependencies = [
+ "ppv-lite86",
+ "rand_core",
+]
+
+[[package]]
+name = "rand_core"
+version = "0.6.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
+dependencies = [
+ "getrandom",
+]
+
+[[package]]
+name = "wasi"
+version = "0.11.0+wasi-snapshot-preview1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
diff --git a/Cargo.toml b/Cargo.toml
new file mode 100644
index 0000000..e78aa95
--- /dev/null
+++ b/Cargo.toml
@@ -0,0 +1,9 @@
+[package]
+name = "cge"
+version = "0.1.0"
+edition = "2021"
+
+# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
+
+[dependencies]
+rand = { version = "*" }
diff --git a/src/main.rs b/src/main.rs
new file mode 100644
index 0000000..a839b2f
--- /dev/null
+++ b/src/main.rs
@@ -0,0 +1,304 @@
+use rand::Rng;
+
+fn rand_u8() -> u8 {
+ let mut rng = rand::thread_rng();
+ rng.gen()
+}
+
+#[allow(dead_code)]
+#[derive(Copy,Clone)]
+struct Card {
+ n: u8,
+ e: u8,
+ s: u8,
+ w: u8,
+ owner: PlayerId,
+ special: Option<&'static dyn Fn()>,
+}
+
+#[allow(non_camel_case_types)]
+#[allow(dead_code)]
+#[derive(Copy,Clone)]
+enum PlayerId {
+ NONE,
+ PLAYER_1,
+ PLAYER_2,
+}
+
+impl Default for PlayerId {
+ fn default() -> Self {
+ PlayerId::NONE
+ }
+}
+
+impl core::fmt::Debug for PlayerId {
+ fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
+ match *self {
+ PlayerId::NONE => {
+ write!(f, "PlayerId::NONE ")
+ },
+ PlayerId::PLAYER_1 => {
+ write!(f, "PlayerId::PLAYER_1")
+ },
+ PlayerId::PLAYER_2 => {
+ write!(f, "PlayerId::PLAYER_2")
+ },
+ }
+ }
+}
+
+#[allow(dead_code)]
+impl Default for Card {
+ fn default() -> Self {
+ Card {
+ n: 0,
+ e: 0,
+ s: 0,
+ w: 0,
+ owner: PlayerId::default(),
+ special: None,
+ }
+ }
+}
+
+impl core::fmt::Debug for Card {
+ fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
+ write!(f, "Card {{\n\tn: {:?},\n\te: {:?},\n\ts: {:?},\n\tw: {:?}\n\towner: {:?}\n}}", self.n, self.e, self.s, self.w, self.owner)
+ }
+}
+
+impl Card {
+ fn new(owner: PlayerId) -> Self {
+ Self {
+ n: 0,
+ e: 0,
+ s: 0,
+ w: 0,
+ owner: owner,
+ special: None,
+ }
+ }
+
+ fn randomize(&mut self) {
+ self.n = rand_u8();
+ self.e = rand_u8();
+ self.s = rand_u8();
+ self.w = rand_u8();
+ }
+}
+
+#[allow(dead_code)]
+struct Grid<const SIZE: usize> {
+ field: [[Option<Card>; SIZE]; SIZE],
+}
+
+const NO_CARD: Option<Card> = None;
+impl<const SIZE: usize> Default for Grid<SIZE> {
+ fn default() -> Self {
+ Self {
+ field: [[NO_CARD; SIZE]; SIZE],
+ }
+ }
+}
+
+impl<const SIZE: usize> Grid<SIZE> {
+ fn randomize(&mut self) {
+ for y in 0..SIZE {
+ for x in 0..SIZE {
+ let mut card = Card::default();
+ card.randomize();
+ self.field[y][x] = Some(card);
+ }
+ }
+ }
+}
+
+fn get_owner(some_card: Option<Card>) -> &'static str {
+ match some_card {
+ Some(card) => {
+ match card.owner {
+ PlayerId::NONE => "( )",
+ PlayerId::PLAYER_1 => "(1)",
+ PlayerId::PLAYER_2 => "(2)",
+ }
+ }
+ None => {
+ "( )"
+ }
+ }
+}
+
+fn get_values(some_card: Option<Card>) -> [u8; 4] {
+ match some_card {
+ Some(card) => {
+ [card.n, card.e, card.s, card.w]
+ },
+ None => {
+ [0; 4]
+ }
+ }
+}
+
+fn get_value_u8(dir: usize, some_card: Option<Card>) -> u8 {
+ let values = get_values(some_card);
+ match dir {
+ // P1N
+ 0 => {
+ match some_card {
+ Some(card) => {
+ match card.owner {
+ PlayerId::PLAYER_2 => values[2],
+ _ => values[0],
+ }
+ }
+ None => {0},
+ }
+ },
+ // P1E
+ 1 => {
+ match some_card {
+ Some(card) => {
+ match card.owner {
+ PlayerId::PLAYER_2 => values[3],
+ _ => values[1],
+ }
+ }
+ None => {0},
+ }
+ },
+ // P1S
+ 2 => {
+ match some_card {
+ Some(card) => {
+ match card.owner {
+ PlayerId::PLAYER_2 => values[0],
+ _ => values[2],
+ }
+ }
+ None => {0},
+ }
+ },
+ // P1W
+ 3 => {
+ match some_card {
+ Some(card) => {
+ match card.owner {
+ PlayerId::PLAYER_2 => values[1],
+ _ => values[3],
+ }
+ }
+ None => {0},
+ }
+ },
+ _ => {0},
+ }
+}
+
+fn get_value(dir: usize, some_card: Option<Card>) -> String {
+ let value = get_value_u8(dir, some_card);
+ if value == 0 {
+ return " ".to_string();
+ }
+ return format!("{:<3?}", value);
+}
+
+impl<const SIZE: usize> core::fmt::Debug for Grid<SIZE> {
+ fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
+ if let Err(error) = write!(f, ".") {
+ return Err(error);
+ }
+ for _x in 0..SIZE {
+ if let Err(error) = write!(f, "============") {
+ return Err(error);
+ }
+ }
+ if let Err(error) = write!(f, ".\n") {
+ return Err(error);
+ }
+ for y in (0..SIZE).rev() {
+ for s in 0..3 {
+ if let Err(error) = write!(f, "|") {
+ return Err(error);
+ }
+ for x in 0..SIZE {
+ match s {
+ 0 => {
+ if let Err(error) = write!(f, " {} ", get_value(0, self.field[y][x])) {
+ return Err(error);
+ }
+ },
+ 1 => {
+ if let Err(error) = write!(f, "{} {} {} ", get_value(3, self.field[y][x]), get_owner(self.field[y][x]), get_value(1, self.field[y][x])) {
+ return Err(error);
+ }
+ },
+ 2 => {
+ if let Err(error) = write!(f, " {} ", get_value(2, self.field[y][x])) {
+ return Err(error);
+ }
+ },
+ _ => {},
+ };
+ //buf = match self.field[y][x] {
+ // None => {write!(f, "{:?} ", PlayerId::NONE)},
+ // Some(card) => {write!(f, "{:?} ", card.owner)},
+ //};
+ }
+ if let Err(error) = write!(f, "|\n") {
+ return Err(error);
+ }
+ }
+ }
+ if let Err(error) = write!(f, "'") {
+ return Err(error);
+ }
+ for _x in 0..SIZE {
+ if let Err(error) = write!(f, "============") {
+ return Err(error);
+ }
+ }
+ if let Err(error) = write!(f, "'\n") {
+ return Err(error);
+ }
+ return Ok(())
+ }
+}
+
+#[allow(dead_code)]
+struct Entity {
+ attack: i64,
+ defense: i64,
+ special: Option<&'static dyn Fn()>
+}
+
+fn special_000() {
+ println!("Hello, world!");
+}
+
+#[allow(unused_variables)]
+fn main() {
+ let entity = Entity {
+ attack: 0,
+ defense: 0,
+ special: Some(&special_000),
+ };
+ if let Some(function) = entity.special {
+ function();
+ }
+ let mut card = Card::new(PlayerId::PLAYER_1);
+ println!("{:?}", card);
+ card.n ^= 5;
+ println!("{:?}", card);
+ card.n ^= 3;
+ println!("{:?}", card);
+ card.n = 254;
+ println!("{:?}", card);
+ card.randomize();
+ println!("{:?}", card);
+ let mut grid = Grid::<3>::default();
+ println!("{:?}", grid);
+ grid.field[0][1] = Some(card);
+ println!("{:?}", grid);
+ grid.randomize();
+ println!("{:?}", grid);
+}