use bevy::prelude::*; use strum::{EnumCount, FromRepr}; use crate::{ EnumNextCycle, game::{ hand::{Drawn, Hand}, player::{MainPlayer, Player}, round::{CurrentPlayer, TurnState, Wind}, wall::Wall, }, tile::{self, *}, }; pub mod hand; pub mod player; pub mod round; pub mod wall; #[derive(States, Default, Hash, Clone, Eq, Debug, PartialEq, Copy)] pub enum GameState { #[default] None, Setup, Deal, Play, } pub struct Riichi; impl Plugin for Riichi { fn build(&self, app: &mut App) { app // start stopper .init_state::() .add_sub_state::() .init_resource::() .init_resource::() .add_systems(Startup, tile::init_tiles) .add_systems(OnEnter(GameState::Setup), setup) .add_systems(OnEnter(GameState::Deal), hand::shuffle_deal) .add_systems(Update, hand::sort_hands.run_if(in_state(GameState::Play))) // .add_systems(Update, turn_manager.run_if(in_state(GameState::Play))) .add_systems(OnEnter(TurnState::Tsumo), tsumo) // semicolon stopper ; } } // struct TurnEvent { // pub next: Option, // pub prev: Option, // } // fn turn_manager() {} 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(Drawn(*drawn)); debug!("wall: {:?}", *walltiles); next_turnstate.set(curr_turnstate.next()); } pub(crate) fn setup( mut commands: Commands, matchsettings: Res, // mut compass: ResMut tiles: Query>, mut next_gamestate: ResMut>, ) { for i in 1..=matchsettings.player_count { let player = player::Player { name: format!("Player {}", i), }; let points = player::Points(matchsettings.starting_points); let bundle = ( player, points, Hand, Wind::from_repr((i - 1) as usize).unwrap(), ); if i == 1 { let player = commands.spawn((bundle, MainPlayer)).id(); commands.insert_resource(CurrentPlayer(player)); } else { commands.spawn(bundle); } } commands.spawn(Wall); next_gamestate.set(GameState::Deal); }