use rand::Rng;
use crate::Damage;
use crate::RollExpression;
pub use checkoutcome::{CheckOutcome, CheckOutcomeBuilder, CritScore};
mod checkoutcome;
mod checkparse;
#[derive(PartialEq, Debug, Clone, Copy)]
pub enum AdvState {
Advantage,
Neutral,
Disadvantage,
}
impl Default for AdvState {
fn default() -> Self {
Self::Neutral
}
}
#[derive(PartialEq, Debug, Clone)]
pub struct Check {
adv: AdvState,
modifier: Damage,
}
impl Check {
pub fn roll_with_advantage(&self, adv: AdvState) -> CheckOutcome {
let r1 = rand::thread_rng().gen_range(1, 21);
let r2 = rand::thread_rng().gen_range(1, 21);
let mods = self.modifier.roll();
CheckOutcome::new(adv, r1, r2, mods.into_modifiers().into_inner())
}
}
impl RollExpression for Check {
type Outcome = CheckOutcome;
fn roll(&self) -> Self::Outcome {
self.roll_with_advantage(self.adv)
}
}