use riichi_decomp::Wait;
use riichi_elements::prelude::*;
use crate::{
yaku::*,
};
use super::{ActionResult};
#[derive(Clone, Debug)]
#[cfg_attr(test, derive(Eq, PartialEq))] #[cfg_attr(feature = "serde", derive(serde::Serialize))]
pub struct AgariResult {
pub winner: Player,
pub contributor: Player,
pub liable_player: Player,
pub points_delta: [GamePoints; 4],
pub details: AgariCandidate,
}
impl AgariResult {
pub fn kind(&self) -> AgariKind {
if self.winner == self.contributor { AgariKind::Tsumo } else { AgariKind::Ron }
}
}
#[derive(Copy, Clone, Debug, Default, Hash, Eq, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[repr(u8)]
pub enum AgariKind {
#[default]
Ron = 0,
Tsumo = 1,
}
impl AgariKind {
pub fn to_action_result(self) -> ActionResult {
ActionResult::Agari(self)
}
}
#[derive(Clone, Debug, Eq, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize))]
pub struct AgariCandidate {
pub wait: Wait,
pub scoring: Scoring,
pub yaku_values: YakuValues,
}
#[derive(Copy, Clone, Debug, Default, Eq, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Scoring {
pub yakuman_total_value: u8,
pub yaku_total_value: u8,
pub dora_hits: DoraHits,
pub fu: u8,
}
impl Scoring {
pub fn han(&self) -> u8 {
self.yaku_total_value + self.dora_hits.sum()
}
}
#[derive(Copy, Clone, Debug, Default, Eq, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct DoraHits {
pub dora: u8,
pub ura_dora: u8,
pub aka_dora: u8,
}
impl DoraHits {
pub fn sum(self) -> u8 {
self.dora + self.ura_dora + self.aka_dora
}
}