use crate::pieces::{PieceSet, Side};
use std::cmp::PartialEq;
#[cfg(feature = "serde")]
use serde::{Serialize, Deserialize};
#[derive(PartialEq, Eq, Copy, Clone, Debug)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub enum KingStrength {
Strong,
StrongByThrone,
Weak
}
#[derive(PartialEq, Eq, Copy, Clone, Debug)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub enum KingAttack {
Armed,
Anvil,
Hammer
}
#[derive(PartialEq, Eq, Copy, Clone, Debug)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct HostilityRules {
pub throne: PieceSet,
pub corners: PieceSet,
pub edge: PieceSet
}
#[derive(PartialEq, Eq, Copy, Clone, Debug)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct OccupyRules {
pub throne: PieceSet,
pub corners: PieceSet
}
#[derive(PartialEq, Eq, Copy, Clone, Debug)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct PassRules {
pub throne: PieceSet,
}
#[derive(PartialEq, Eq, Clone, Copy, Debug)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct ShieldwallRules {
pub corners_may_close: bool,
pub captures: PieceSet
}
#[derive(PartialEq, Eq, Copy, Clone, Debug)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub enum EnclosureWinRules {
WithEdgeAccess,
WithoutEdgeAccess,
}
#[derive(PartialEq, Eq, Clone, Copy, Debug)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct RepetitionRule {
pub n_repetitions: usize,
pub is_loss: bool
}
#[derive(Copy, Clone, Debug, Eq, PartialEq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct Ruleset {
pub pieces: PieceSet,
pub edge_escape: bool,
pub king_strength: KingStrength,
pub king_attack: KingAttack,
pub shieldwall: Option<ShieldwallRules>,
pub exit_fort: bool,
pub hostile_tiles: HostilityRules,
pub occupiable_tiles: OccupyRules,
pub passable_tiles: PassRules,
pub slow_pieces: PieceSet,
pub starting_side: Side,
pub enclosure_win: Option<EnclosureWinRules>,
pub repetition_rule: Option<RepetitionRule>,
pub draw_on_no_plays: bool,
pub linnaean_capture: bool,
}