use bevy::prelude::*; use strum::{EnumCount, FromRepr}; use crate::{ EnumNextCycle, game::{GameState, hand::DrawnTile, wall::Wall}, }; #[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, } } } #[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() } } } pub(crate) fn tsumo( mut commands: Commands, curr_player: Res, // players: Populated>, wall_ent: Single>, walltiles: Single<&Children, With>, curr_turnstate: Res>, mut next_turnstate: ResMut>, ) { trace!("tsumo for: {:?}", curr_player.0); let drawn = walltiles.last().unwrap(); commands.entity(*wall_ent).remove_child(*drawn); commands.entity(curr_player.0).insert(DrawnTile(*drawn)); debug!("drew: {:?}", drawn); next_turnstate.set(curr_turnstate.next()); }