use std::sync::Arc;
use serde::{Deserialize, Serialize};
use crate::player::wallet::Wallet;
use crate::{Money, Value};
use crate::{
messages::actions::Bidding,
{
animals::{Animal, AnimalSet},
player::base_player::PlayerId,
},
};
use pyo3::prelude::*;
pub type Points = usize;
#[pyclass()]
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct AuctionRound {
#[pyo3(get)]
pub host: PlayerId,
pub animal: Arc<Animal>,
#[pyo3(get)]
pub bids: Vec<(PlayerId, Bidding)>,
}
#[pymethods]
impl AuctionRound {
#[getter]
pub fn animal(&self) -> Animal {
*self.animal.clone()
}
}
#[pyclass()]
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct TradeOffer {
#[pyo3(get)]
pub challenger: PlayerId,
#[pyo3(get)]
pub animal: Animal,
#[pyo3(get)]
pub animal_count: usize,
#[pyo3(get)]
pub challenger_card_offer: usize,
}
#[pyclass()]
#[derive(Serialize, Deserialize, Debug, Clone)]
pub enum GameUpdate {
Auction(AuctionKind),
Trade {
challenger: PlayerId,
opponent: PlayerId,
animal: Animal,
animal_count: usize,
receiver: PlayerId,
money_trade: MoneyTrade,
},
Start {
wallet: Wallet,
players_in_turn_order: Vec<PlayerId>,
animals: Vec<AnimalSet>,
},
End {
ranking: Vec<(PlayerId, Points)>,
illegal_moves_made: Vec<String>,
},
ExposePlayer {
player: PlayerId,
wallet: Wallet,
},
Inflation(Money),
}
#[pyclass()]
#[derive(Serialize, Deserialize, Debug, Clone)]
pub enum AuctionKind {
NoBiddings {
host_id: PlayerId,
animal: Animal,
},
NormalAuction {
rounds: AuctionRound,
from: PlayerId,
to: PlayerId,
money_transfer: MoneyTransfer,
},
}
#[pyclass()]
#[derive(Serialize, Deserialize, Debug, Clone)]
pub enum MoneyTransfer {
Public {
card_amount: usize,
min_value: Value,
},
Private { amount: Vec<Money> },
}
#[pyclass()]
#[derive(Serialize, Deserialize, Debug, Clone)]
pub enum MoneyTrade {
Public {
challenger_card_offer: usize,
opponent_card_offer: Option<usize>,
},
Private {
challenger_card_offer: Vec<Money>,
opponent_card_offer: Option<Vec<Money>>,
},
}