DEVELOPMENT ENVIRONMENT

~liljamo/deck-builder

ref: b8bd27dd7fcbade514bc75433e7a0ed068be3f65 deck-builder/client/src/plugins/game/mod.rs -rw-r--r-- 2.2 KiB
b8bd27ddJonni Liljamo feat(client): finish new refresh, impl game lock 1 year, 5 months ago
                                                                                
443c9b0c skye
443c9b0c skye
443c9b0c skye
443c9b0c skye
9352c9d4 skye
443c9b0c skye
9352c9d4 skye
443c9b0c skye
443c9b0c skye
c5909cd0 skye
443c9b0c skye
c5909cd0 skye
443c9b0c skye
443c9b0c skye
443c9b0c skye
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
/*
 * This file is part of laurelin_client
 * Copyright (C) 2023 Jonni Liljamo <jonni@liljamo.com>
 *
 * 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::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::<RefreshGameEvent>()
            .add_event::<FinishedRefreshGameEvent>()
            .add_system(game_setup.in_schedule(OnEnter(AppState::InGame)))
            .add_system(handle_refresh_game_event.run_if(on_event::<RefreshGameEvent>()))
            .add_system(handle_finished_refresh_game_event.run_if(on_event::<FinishedRefreshGameEvent>()));
    }
}

#[derive(Resource, Clone)]
pub struct GameData {
    pub game: Option<Game>,
    pub game_status: Option<GameStatus>,

    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<RefreshGameEvent>,
) {
    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<GameDetailsCallEvent>,
    mut game_data: ResMut<GameData>,
    global: Res<Global>,
) {
    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<SpawnSupplyPilesEvent>,
) {
    ssp_ev_w.send(SpawnSupplyPilesEvent);
}