/* * This file is part of laurelin_client * Copyright (C) 2023 Jonni Liljamo * * Licensed under GPL-3.0-only. * See LICENSE for licensing information. */ use bevy::prelude::*; use bevy_rapier3d::prelude::*; use crate::{api::game::Game, game_status::GameStatus, AppState, Global}; use self::{hand::SpawnHandEvent, supply::SpawnSupplyPilesEvent}; use super::GameDetailsCallEvent; mod card; mod hand; mod supply; mod ui; pub struct GamePlugin; impl Plugin for GamePlugin { fn build(&self, app: &mut App) { app.insert_resource(GameData::default()) .add_plugin(ui::GameUIPlugin) .add_plugin(card::CardPlugin) .add_plugin(supply::SupplyPlugin) .add_plugin(hand::HandPlugin) .add_event::() .add_event::() .add_system(game_setup.in_schedule(OnEnter(AppState::InGame))) .add_system(handle_refresh_game_event.run_if(on_event::())) .add_system( handle_finished_refresh_game_event.run_if(on_event::()), ); } } #[derive(Resource, Clone)] pub struct GameData { pub game: Option, pub game_status: Option, pub locked: bool, } impl Default for GameData { fn default() -> Self { Self { game: None, game_status: None, locked: true, } } } fn game_setup(mut commands: Commands, mut rg_ev_w: EventWriter) { rg_ev_w.send(RefreshGameEvent); // create the playing surface commands .spawn(Collider::cuboid(20., 0.5, 20.)) .insert(TransformBundle::from(Transform::from_xyz(0., -0.5, 0.))); } pub struct RefreshGameEvent; fn handle_refresh_game_event( mut details_ev_w: EventWriter, mut game_data: ResMut, global: Res, ) { game_data.locked = true; game_data.game = None; game_data.game_status = None; details_ev_w.send(GameDetailsCallEvent { game_id: global.cur_game_id.clone(), }); } pub struct FinishedRefreshGameEvent; fn handle_finished_refresh_game_event( mut ssp_ev_w: EventWriter, mut sh_ev_w: EventWriter, ) { ssp_ev_w.send(SpawnSupplyPilesEvent); sh_ev_w.send(SpawnHandEvent); }