/*
* 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 bevy::reflect::{Reflect, FromReflect};
use serde::{Deserialize, Serialize};
use serde_repr::Deserialize_repr;
use crate::{game_status::{Card, PlayerState}, seed_gen};
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: usize,
},
/// play card from hand index N
PlayCard {
index: usize,
},
/// 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,
},
RollForCurrency {
amount: usize,
sides: usize,
},
}
#[derive(Deserialize, Serialize, Clone, PartialEq)]
pub struct Action {
pub id: String,
pub created_at: chrono::DateTime<chrono::Utc>,
pub updated_at: chrono::DateTime<chrono::Utc>,
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: Option<u64>) -> Self {
let seed = if seed.is_none() {
seed_gen!()
} else {
seed.unwrap()
};
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, Reflect, FromReflect)]
#[repr(u8)]
pub enum GameState {
Forming = 0,
InProgress = 1,
Finished = 2,
Cancelled = 3,
}
#[derive(Deserialize, Clone, Reflect, FromReflect)]
pub struct Game {
pub id: String,
#[reflect(ignore)]
pub created_at: chrono::DateTime<chrono::Utc>,
#[reflect(ignore)]
pub updated_at: chrono::DateTime<chrono::Utc>,
#[reflect(ignore)]
pub ended_at: chrono::DateTime<chrono::Utc>,
pub host_id: String,
pub host: Option<User>,
pub guest_id: String,
pub guest: Option<User>,
pub state: GameState,
pub turn: u8,
#[reflect(ignore)]
pub actions: Option<Vec<Action>>,
}