DEVELOPMENT ENVIRONMENT

~liljamo/deck-builder

ref: 7ce88fae9680596019fc15be5ec510df7ea939b8 deck-builder/client/src/game_status/mod.rs -rw-r--r-- 2.0 KiB
7ce88faeJonni Liljamo feat(client): sorta finished log ui, remove old 1 year, 4 months ago
                                                                                
cd13a21d skye
c5909cd0 skye
89bbb3e7 skye
cd13a21d skye
c5909cd0 skye
c5909cd0 skye
55edf734 skye
c5909cd0 skye
c5909cd0 skye
c5909cd0 skye
c5909cd0 skye
cd13a21d 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
85
86
/*
 * 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, PartialEq)]
pub struct CardAction {
    pub command: Command,
}

#[derive(Deserialize, Serialize, Clone, PartialEq)]
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: usize,
    /// if set, use this?
    //vp_cost: Option<u32>,
    pub actions: Vec<CardAction>,
}

/// a supply pile holds an amount of some card
#[derive(Clone)]
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,
}

#[derive(Clone)]
pub struct PlayerStatus {
    pub turn_n: usize,
    pub display_name: String,
    pub state: PlayerState,
    pub plays: usize,
    pub buys: usize,
    pub currency: usize,
    pub vp: usize,
    pub hand: Vec<Card>,
    pub deck: Vec<Card>,
    pub discard: Vec<Card>,
}

/// constructed from a vector of [`Action`]s
#[derive(Clone)]
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"),
        }
    }
}