From 183e39d9ebfe6e48e5ce666dee36b5347d47f53e Mon Sep 17 00:00:00 2001 From: 简律纯 Date: Fri, 12 Sep 2025 18:06:17 +0800 Subject: feat: add unique modifier to dice calculations and parsing --- src/calculator.rs | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) (limited to 'src/calculator.rs') 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 = 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 -- cgit v1.2.3-70-g09d2