diff options
| author | 2025-09-12 18:06:17 +0800 | |
|---|---|---|
| committer | 2025-09-12 18:06:17 +0800 | |
| commit | 183e39d9ebfe6e48e5ce666dee36b5347d47f53e (patch) | |
| tree | 88a512d05a49d805be392a1113054297d3461188 /src/calculator.rs | |
| parent | b8fa77736a3c3b9c9d898e7ffa87e057cfab005d (diff) | |
| download | OneRoll-183e39d9ebfe6e48e5ce666dee36b5347d47f53e.tar.gz OneRoll-183e39d9ebfe6e48e5ce666dee36b5347d47f53e.zip | |
feat: add unique modifier to dice calculations and parsing
Diffstat (limited to 'src/calculator.rs')
| -rw-r--r-- | src/calculator.rs | 14 |
1 files changed, 13 insertions, 1 deletions
diff --git a/src/calculator.rs b/src/calculator.rs index 9611a2b..7289921 100644 --- a/src/calculator.rs +++ b/src/calculator.rs @@ -61,7 +61,7 @@ impl DiceCalculator { rolls.push(final_rolls); } - // handle high/low and discard high/low + // handle high/low, discard high/low and unique deduplication let mut final_rolls = rolls; for modifier in &dice.modifiers { match modifier { @@ -89,6 +89,17 @@ impl DiceCalculator { sorted.sort(); final_rolls = sorted.iter().skip(*n as usize).map(|&v| vec![v]).collect(); } + DiceModifier::Unique => { + use std::collections::HashSet; + let mut seen = HashSet::new(); + let mut uniques: Vec<i32> = Vec::new(); + for v in final_rolls.iter().flatten() { + if seen.insert(*v) { + uniques.push(*v); + } + } + final_rolls = uniques.into_iter().map(|v| vec![v]).collect(); + } _ => {} } } @@ -204,6 +215,7 @@ impl DiceCalculator { DiceModifier::KeepLow(n) => result.push_str(&format!("kl{}", n)), DiceModifier::DropHigh(n) => result.push_str(&format!("dh{}", n)), DiceModifier::DropLow(n) => result.push_str(&format!("dl{}", n)), + DiceModifier::Unique => result.push('u'), } } result |
