diff --git a/01.workspace/oxidice_lib/src/imp/die_roll.rs b/01.workspace/oxidice_lib/src/imp/die_roll.rs index db54751..90a8dca 100644 --- a/01.workspace/oxidice_lib/src/imp/die_roll.rs +++ b/01.workspace/oxidice_lib/src/imp/die_roll.rs @@ -11,11 +11,25 @@ fn roll_range(range: RangeInclusive) -> Vec { vec![rng.random_range(range)] } +fn roll_exploding(sides: u16, threshold: i32) -> Vec { + let mut rng = rand::rng(); + let mut results = Vec::::new(); + loop { + let result: i32 = rng.random_range(1..=sides as i32); + results.push(result); + if result < threshold { + break; + } + } + results +} + impl Die { pub fn roll(&self) -> Vec { match self { - Die::Sides(sides) => roll_sides(*sides), + Die::Exploding(sides, threshold) => roll_exploding(*sides, *threshold), Die::Range(range) => roll_range(range.clone()), + Die::Sides(sides) => roll_sides(*sides), } } } diff --git a/01.workspace/oxidice_lib/src/imp/handful_grab.rs b/01.workspace/oxidice_lib/src/imp/handful_grab.rs index 434cf36..dff4ef5 100644 --- a/01.workspace/oxidice_lib/src/imp/handful_grab.rs +++ b/01.workspace/oxidice_lib/src/imp/handful_grab.rs @@ -16,4 +16,11 @@ impl Handful { } Self { dice } } + pub fn grab_exploding(dice_num: u16, sides: u16, threshold: i32) -> Self { + let mut dice = Vec::::new(); + for _ in 1..=dice_num { + dice.push(Die::Exploding(sides, threshold)); + } + Self { dice } + } } diff --git a/01.workspace/oxidice_lib/src/str/die.rs b/01.workspace/oxidice_lib/src/str/die.rs index 8e0910d..9d2f812 100644 --- a/01.workspace/oxidice_lib/src/str/die.rs +++ b/01.workspace/oxidice_lib/src/str/die.rs @@ -5,8 +5,9 @@ use std::ops::*; #[derive(Debug, PartialEq, Eq, Clone, Hash)] pub enum E { - Sides(u16), + Exploding(u16, i32), Range(RangeInclusive), + Sides(u16), } // impl Display for E {