use super::*;
#[derive(Clone, Debug, Ord, PartialOrd, Eq, PartialEq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct EnhanceLevel<T, R> {
#[cfg_attr(feature = "serde", serde(default))]
pub relative_rate: BTreeMap<i16, R>,
#[cfg_attr(feature = "serde", serde(default))]
pub absolute_rate: BTreeMap<u16, R>,
#[cfg_attr(feature = "serde", serde(default))]
pub broken_rate: R,
#[cfg_attr(feature = "serde", serde(default))]
pub enhance_cost: BTreeMap<T, u128>,
#[cfg_attr(feature = "serde", serde(default))]
pub relegate_cost: BTreeMap<T, u128>,
#[cfg_attr(feature = "serde", serde(default))]
pub protect_cost: BTreeMap<T, u128>,
}
impl<T, R> EnhanceLevel<T, R> {
pub fn simple(success: R, failure: R, change: i16) -> Self where R:Default {
let mut relative_rate = BTreeMap::new();
relative_rate.insert(1, success);
relative_rate.insert(change, failure);
Self {
relative_rate,
absolute_rate: BTreeMap::new(),
broken_rate: Default::default(),
enhance_cost: BTreeMap::new(),
relegate_cost: BTreeMap::new(),
protect_cost: BTreeMap::new(),
}
}
fn total_rate(&self) -> R
where
R: Clone + Add<R, Output = R>,
{
let mut out = self.broken_rate.clone();
for weight in self.relative_rate.values() {
out = out.add(weight.clone());
}
for weight in self.absolute_rate.values() {
out = out.add(weight.clone());
}
out
}
}