more refactor, start using stdb for everything???

4.5th rewrite for tui
This commit is contained in:
Tao Tien 2026-02-16 00:05:57 -08:00
parent 034e543d40
commit c3686221aa
29 changed files with 478 additions and 744 deletions

View file

@ -9,127 +9,8 @@ mod derive_alias {
}
use derive_aliases::derive;
use bevy::prelude::*;
use spacetimedb::SpacetimeType;
use strum::{EnumCount, FromRepr};
pub mod states;
pub mod tiles;
#[derive(..Base, Hash, Default, FromRepr)]
#[derive(States, SpacetimeType)]
pub enum GameState {
#[default]
None,
Lobby,
Setup,
Deal,
Play,
Exit,
}
#[derive(..Base)]
#[derive(Component, SpacetimeType)]
pub struct Tile {
pub suit: Suit,
}
#[derive(..Base)]
#[derive(SpacetimeType)]
pub enum Suit {
Man(Rank),
Pin(Rank),
Sou(Rank),
Wind(Wind),
Dragon(Dragon),
}
impl Suit {
pub fn rank(&self) -> Option<Rank> {
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(
..Base,
Deref,
DerefMut,
)]
#[derive(SpacetimeType)]
pub struct Rank {
pub number: u8,
}
#[derive(
..Base,
FromRepr,
)]
#[derive(SpacetimeType)]
pub enum Wind {
Ton,
Nan,
Shaa,
Pei,
}
#[derive(
..Base,
FromRepr,
)]
#[derive(SpacetimeType)]
pub enum Dragon {
Haku,
Hatsu,
Chun,
}
pub fn tiles() -> Vec<Tile> {
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
}
#[derive(
Default,
..Copy,
PartialEq,
Eq,
Hash,
Debug,
)]
#[derive(SubStates, FromRepr, EnumCount, SpacetimeType)]
#[source(GameState = GameState::Play)]
pub enum TurnState {
#[default]
None,
Tsumo,
Menzen,
RiichiKan,
RonChiiPonKan,
End,
}
pub use states::*;
pub use tiles::*;

37
jong-types/src/states.rs Normal file
View file

@ -0,0 +1,37 @@
use bevy::prelude::*;
use spacetimedb::SpacetimeType;
use strum::{EnumCount, FromRepr};
use super::derive;
#[derive(..Base, Hash, Default, FromRepr)]
#[derive(States, SpacetimeType)]
pub enum GameState {
#[default]
None,
Lobby,
Setup,
Deal,
Play,
Exit,
}
#[derive(
Default,
..Copy,
PartialEq,
Eq,
Hash,
Debug,
)]
#[derive(SubStates, FromRepr, EnumCount, SpacetimeType)]
#[source(GameState = GameState::Play)]
pub enum TurnState {
#[default]
None,
Tsumo,
Menzen,
RiichiKan,
RonChiiPonKan,
End,
}

94
jong-types/src/tiles.rs Normal file
View file

@ -0,0 +1,94 @@
use bevy::prelude::*;
use spacetimedb::SpacetimeType;
use strum::{EnumCount, FromRepr};
use super::derive;
#[derive(..Base)]
#[derive(Component, SpacetimeType)]
pub struct Tile {
pub suit: Suit,
}
#[derive(..Base)]
#[derive(SpacetimeType)]
pub enum Suit {
Man(Rank),
Pin(Rank),
Sou(Rank),
Wind(Wind),
Dragon(Dragon),
}
impl Suit {
pub fn rank(&self) -> Option<Rank> {
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(
..Base,
Deref,
DerefMut,
)]
#[derive(SpacetimeType)]
pub struct Rank {
pub number: u8,
}
#[derive(
..Base,
FromRepr,
)]
#[derive(SpacetimeType)]
pub enum Wind {
Ton,
Nan,
Shaa,
Pei,
}
#[derive(
..Base,
FromRepr,
)]
#[derive(SpacetimeType)]
pub enum Dragon {
Haku,
Hatsu,
Chun,
}
pub fn tiles() -> Vec<Tile> {
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
}