/* * This file is part of laurelin_client * Copyright (C) 2023 Jonni Liljamo * * Licensed under GPL-3.0-only. * See LICENSE for licensing information. */ use serde::{Deserialize, Serialize}; use serde_repr::Deserialize_repr; use crate::game_status::{Card, PlayerState}; use super::user::User; mod forming; pub use forming::*; mod my_games; pub use my_games::*; mod join; pub use join::*; mod create; pub use create::*; mod create_action; pub use create_action::*; mod details; pub use details::*; #[derive(Deserialize, Serialize, Clone, PartialEq)] pub enum Command { InitSupplyPile { card: Card, amount: usize, }, /// take a card from pile N TakeFromPile { index: usize, for_cost: i16, }, /// draw N amount of cards from deck Draw { amount: usize, }, /// discard card from hand in slot N Discard { index: usize, }, /// end the invokers turn, and invoke StartTurn for the target EndTurn {}, /// start the targets turn StartTurn {}, /// change player state to another ChangePlayerState { state: PlayerState, }, } #[derive(Deserialize, Serialize, Clone, PartialEq)] pub struct Action { pub id: String, pub created_at: chrono::DateTime, pub updated_at: chrono::DateTime, pub game_id: String, pub invoker: String, pub target: String, pub command: Command, /// it's actually u64, but we handle it as a string to make psql happy pub seed: String, } impl Action { pub fn new(game_id: &str, invoker: &str, target: &str, command: &Command, seed: u64) -> Self { Self { id: "".to_string(), created_at: chrono::Utc::now(), updated_at: chrono::Utc::now(), game_id: game_id.to_string(), invoker: invoker.to_string(), target: target.to_string(), command: command.clone(), seed: seed.to_string(), } } } #[derive(Debug, Deserialize_repr, Clone, PartialEq)] #[repr(u8)] pub enum GameState { Forming = 0, InProgress = 1, Finished = 2, Cancelled = 3, } #[derive(Deserialize, Clone)] pub struct Game { pub id: String, pub created_at: chrono::DateTime, pub updated_at: chrono::DateTime, pub ended_at: chrono::DateTime, pub host_id: String, pub host: Option, pub guest_id: String, pub guest: Option, pub state: GameState, pub turn: u8, pub actions: Option>, }