2026-01-13 00:01:38 -08:00
|
|
|
use bevy::prelude::*;
|
2026-01-13 12:38:41 -08:00
|
|
|
use strum::{EnumCount, FromRepr};
|
2026-01-13 00:01:38 -08:00
|
|
|
|
2026-01-13 12:38:41 -08:00
|
|
|
use crate::{EnumNextCycle, game::GameState};
|
2026-01-13 00:01:38 -08:00
|
|
|
|
|
|
|
|
#[derive(Component)]
|
|
|
|
|
pub(crate) struct Dice(u8, u8);
|
|
|
|
|
|
|
|
|
|
#[derive(Resource)]
|
|
|
|
|
pub(crate) struct Compass {
|
|
|
|
|
pub(crate) prevalent_wind: Wind,
|
|
|
|
|
pub(crate) round: u8,
|
|
|
|
|
pub(crate) dealer_wind: Wind,
|
|
|
|
|
pub(crate) riichi: usize,
|
|
|
|
|
pub(crate) honba: usize,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
impl Default for Compass {
|
|
|
|
|
fn default() -> Self {
|
|
|
|
|
Self {
|
|
|
|
|
prevalent_wind: Wind::Ton,
|
|
|
|
|
round: 1,
|
|
|
|
|
dealer_wind: Wind::Ton,
|
|
|
|
|
riichi: 0,
|
|
|
|
|
honba: 0,
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#[derive(Resource)]
|
|
|
|
|
pub(crate) struct MatchSettings {
|
|
|
|
|
pub(crate) starting_points: isize,
|
|
|
|
|
pub(crate) player_count: u8,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
impl Default for MatchSettings {
|
|
|
|
|
fn default() -> Self {
|
|
|
|
|
Self {
|
|
|
|
|
starting_points: 25000,
|
|
|
|
|
player_count: 4,
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2026-01-13 12:38:41 -08:00
|
|
|
|
|
|
|
|
#[derive(Component, Clone, Copy, FromRepr, EnumCount)]
|
|
|
|
|
pub enum Wind {
|
|
|
|
|
Ton,
|
|
|
|
|
Nan,
|
|
|
|
|
Shaa,
|
|
|
|
|
Pei,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
impl EnumNextCycle for Wind {
|
|
|
|
|
fn next(&self) -> Self {
|
|
|
|
|
if (*self as usize + 1) >= Self::COUNT {
|
|
|
|
|
Self::from_repr(0).unwrap()
|
|
|
|
|
} else {
|
|
|
|
|
Self::from_repr(*self as usize + 1).unwrap()
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#[derive(Resource)]
|
|
|
|
|
pub(crate) struct CurrentPlayer(pub Entity);
|
|
|
|
|
|
|
|
|
|
#[derive(SubStates, Default, Clone, Copy, PartialEq, Eq, Hash, Debug, FromRepr, EnumCount)]
|
|
|
|
|
#[source(GameState = GameState::Play)]
|
|
|
|
|
pub(crate) enum TurnState {
|
|
|
|
|
#[default]
|
|
|
|
|
Tsumo,
|
|
|
|
|
Menzen,
|
|
|
|
|
RiichiKan,
|
|
|
|
|
Discard,
|
|
|
|
|
RonChiiPonKan,
|
|
|
|
|
End,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
impl EnumNextCycle for TurnState {
|
|
|
|
|
fn next(&self) -> Self {
|
|
|
|
|
if (*self as usize + 1) >= Self::COUNT {
|
|
|
|
|
Self::from_repr(0).unwrap()
|
|
|
|
|
} else {
|
|
|
|
|
Self::from_repr(*self as usize + 1).unwrap()
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|