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
use std::collections;

use serde_json::Value;

use bot::Score;

// TODO: Replace all UserState with structure-sharing collections from the 'im' package.
type Vector<T> = Vec<T>;
type HashSet<T> = collections::HashSet<T>;

#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct Context {
    pub turn: u64,
    pub num_players: u16,
    pub current_player: u16,

    pub action_players: Option<Vec<u16>>,
    _action_players_once: bool,

    pub play_order: Vector<u16>,
    pub play_order_pos: u16,

    pub gameover: Option<Value>,
    pub score: Option<Score>,

    pub seed: Option<u128>
}

impl Context {
    pub fn new (players: &Vec<u16>, seed: Option<u128>) -> Self {
        Context {
            turn: 0,
            num_players: players.len() as u16,
            current_player: players[0],

            action_players: None,
            _action_players_once: true,

            play_order: players.clone(),
            play_order_pos: 0,

            score: None,
            gameover: None,

            seed
        }
    }
}

#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct UserState<T: Default> {
    pub g: T,
    pub ctx: Context
}

#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct GameState<T: Default> {
    user_state: UserState<T>,
    context: Context,
    state_id: u128,
}

#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct Move {
    pub move_type: String,
    pub player_id: u16,
    pub args: Option<Value>
}

#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct GameEvent {
    pub event_type: String,
    pub player_id: u16,
    pub args: Option<Value>,
    pub score: Option<Score>,
    pub automatic: bool
}