DEVELOPMENT ENVIRONMENT

~liljamo/deck-builder

ref: 4fada74d49e3a80aba6948b0aba1f199935cab46 deck-builder/client/src/game_status/mod.rs -rw-r--r-- 1.9 KiB
4fada74dJonni Liljamo feat(client): click thing for cards 1 year, 7 months ago
                                                                                
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
/*
 * 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(Deserialize, Serialize, Clone, Copy, PartialEq)]
pub enum PlayerState {
    /// e.g. not their turn
    Idle,
    /// action phase, playing cards
    ActionPhase,
    /// buy phase, buying cards
    BuyPhase,
}

pub struct PlayerStatus {
    pub state: PlayerState,
    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"),
        }
    }
}