70 lines
1.6 KiB
Rust
70 lines
1.6 KiB
Rust
|
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||
|
#[serde(rename_all = "snake_case")]
|
||
|
#[serde(tag = "type", content = "content")]
|
||
|
pub enum ServerMessage {
|
||
|
/// Game state in current turn
|
||
|
GameState(State),
|
||
|
/// The action that was performed
|
||
|
PlayerAction(PlayerAction),
|
||
|
/// The game is over, and this is the concluding state.
|
||
|
FinalState(State),
|
||
|
}
|
||
|
|
||
|
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||
|
#[serde(rename_all = "snake_case")]
|
||
|
#[serde(tag = "type", content = "value")]
|
||
|
pub enum PlayerAction {
|
||
|
Timeout,
|
||
|
ParseError(String),
|
||
|
Commands(Vec<PlayerCommand>),
|
||
|
}
|
||
|
|
||
|
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||
|
pub struct PlayerCommand {
|
||
|
pub command: Command,
|
||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||
|
pub error: Option<CommandError>,
|
||
|
}
|
||
|
|
||
|
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||
|
pub enum CommandError {
|
||
|
NotEnoughShips,
|
||
|
OriginNotOwned,
|
||
|
ZeroShipMove,
|
||
|
OriginDoesNotExist,
|
||
|
DestinationDoesNotExist,
|
||
|
}
|
||
|
|
||
|
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||
|
pub struct Command {
|
||
|
pub origin: String,
|
||
|
pub destination: String,
|
||
|
pub ship_count: u64,
|
||
|
}
|
||
|
|
||
|
|
||
|
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||
|
pub struct State {
|
||
|
pub planets: Vec<Planet>,
|
||
|
pub expeditions: Vec<Expedition>,
|
||
|
}
|
||
|
|
||
|
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||
|
pub struct Expedition {
|
||
|
pub id: u64,
|
||
|
pub ship_count: u64,
|
||
|
pub origin: String,
|
||
|
pub destination: String,
|
||
|
pub owner: usize,
|
||
|
pub turns_remaining: u64,
|
||
|
}
|
||
|
|
||
|
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||
|
pub struct Planet {
|
||
|
pub ship_count: u64,
|
||
|
pub x: f64,
|
||
|
pub y: f64,
|
||
|
pub owner: Option<usize>,
|
||
|
pub name: String,
|
||
|
}
|