use bevy::prelude::*; use spacetimedb::SpacetimeType; use strum::FromRepr; #[derive(Component, Debug, Clone, Copy, SpacetimeType)] pub struct Tile { pub suit: Suit, } #[derive(/* MapEntities, */ Debug, PartialEq, PartialOrd, Eq, Ord, Clone, Copy, SpacetimeType)] pub enum Suit { Man(Rank), Pin(Rank), Sou(Rank), Wind(Wind), Dragon(Dragon), } impl Suit { pub fn rank(&self) -> Option { match self { Suit::Man(rank) => Some(*rank), Suit::Pin(rank) => Some(*rank), Suit::Sou(rank) => Some(*rank), // Suit::Wind(wind) | Suit::Dragon(dragon) => None, _ => None, } } } #[derive(Deref, DerefMut, Debug, PartialEq, PartialOrd, Eq, Ord, Clone, Copy, SpacetimeType)] pub struct Rank { pub number: u8, } #[derive(FromRepr, Debug, PartialEq, PartialOrd, Eq, Ord, Clone, Copy, SpacetimeType)] pub enum Wind { Ton, Nan, Shaa, Pei, } #[derive(Debug, FromRepr, PartialEq, PartialOrd, Eq, Ord, Clone, Copy, SpacetimeType)] pub enum Dragon { Haku, Hatsu, Chun, } pub fn tiles() -> Vec { let mut tiles = vec![]; for _ in 0..4 { for i in 1..=9 { tiles.push(Tile { suit: Suit::Pin(Rank { number: i }), }); tiles.push(Tile { suit: Suit::Sou(Rank { number: i }), }); tiles.push(Tile { suit: Suit::Man(Rank { number: i }), }); } for i in 0..4 { tiles.push(Tile { suit: Suit::Wind(Wind::from_repr(i).unwrap()), }); } for i in 0..3 { tiles.push(Tile { suit: Suit::Dragon(Dragon::from_repr(i).unwrap()), }); } } tiles }