DEVELOPMENT ENVIRONMENT

~liljamo/deck-builder

ref: 8ff7082fab928e954c84a91bc6d7aeea4ac35723 deck-builder/client/src/game_status/mod.rs -rw-r--r-- 2.0 KiB
8ff7082fJonni Liljamo fix(client): rename action phase to play phase 1 year, 5 months ago
                                                                                
cd13a21d skye
c5909cd0 skye
89bbb3e7 skye
cd13a21d skye
c5909cd0 skye
55edf734 skye
c5909cd0 skye
c5909cd0 skye
c5909cd0 skye
cd13a21d skye
25673a08 skye
c5909cd0 skye
cd13a21d skye
89bbb3e7 skye
c5909cd0 skye
cd13a21d 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
/*
 * 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 std::collections::HashMap;

use serde::{Deserialize, Serialize};

use crate::api::game::{Action, Command, Game};

mod parser;

#[derive(Deserialize, Serialize, Clone)]
pub struct CardAction {
    pub target: String,
    pub command: Command,
    pub seed: u64,
}

#[derive(Deserialize, Serialize, Clone)]
pub struct Card {
    pub name: String,
    /// short details shown on the card, e.g. Draw 2
    pub short_details: Vec<String>,
    /// longer explanations of features of the card
    pub long_details: Vec<String>,
    pub cost: i16,
    /// if set, use this?
    //vp_cost: Option<u32>,
    pub actions: Vec<CardAction>,
}

/// a supply pile holds an amount of some card
pub struct SupplyPile {
    /// the card type that the supply pile holds
    pub card: Card,
    /// the amount of cards currently in the pile
    pub amount: usize,
}

#[derive(Debug, Deserialize, Serialize, Clone, Copy, PartialEq)]
pub enum PlayerState {
    /// e.g. not their turn
    Idle,
    /// play phase, playing cards
    PlayPhase,
    /// buy phase, buying cards
    BuyPhase,
}

pub struct PlayerStatus {
    pub display_name: String,
    pub state: PlayerState,
    pub plays: i16,
    pub buys: i16,
    pub currency: i16,
    pub vp: i16,
    pub hand: Vec<Card>,
    pub deck: Vec<Card>,
    pub discard: Vec<Card>,
}

/// constructed from a vector of [`Action`]s
pub struct GameStatus {
    /// a modifiable Actions Vector, will be modified when parsing actions,
    /// used for showing the log
    pub actions: Vec<Action>,
    pub supply_piles: Vec<SupplyPile>,
    /// player ids mapped to statuses
    pub players: HashMap<String, PlayerStatus>,
}

impl GameStatus {
    pub fn new(game: &Game) -> Self {
        match parser::parse(game) {
            Ok(res) => res,
            Err(_) => panic!("parsing actions failed"),
        }
    }
}