diff --git a/server/src/spec.rs b/server/src/spec.rs index ceb0d7a4..dd492c10 100644 --- a/server/src/spec.rs +++ b/server/src/spec.rs @@ -56,74 +56,93 @@ impl Spec { } pub fn apply(&self, modified: u64, base: u64, team_colours: &Colours) -> u64 { - let mut rng = thread_rng(); - - let i_min = 32; - let i_max = 64; - - fn apply_bonus(base: u64, colours: Vec, reqs: Vec, bonuses: Vec) -> u64 { - base + bonuses.iter().enumerate().fold(0, |acc, (i, b)| { - acc + match (colours.iter().all(|colour| colour >= &reqs[i])) { - true => bonuses[i], - false => 0 - } - }) - } - match *self { Spec::RedDamageI => modified + { - apply_bonus(base.pct(5), vec![team_colours.red], vec![5, 10, 20], - vec![base.pct(5), base.pct(10), base.pct(20)]) + let mut pct = 5; + if team_colours.red >= 5 { pct += 5 }; + if team_colours.red >= 10 { pct += 10 }; + if team_colours.red >= 20 { pct += 20 }; + base.pct(pct) }, Spec::GreenDamageI => modified + { - apply_bonus(base.pct(5), vec![team_colours.green], vec![5, 10, 20], - vec![base.pct(5), base.pct(10), base.pct(20)]) + let mut pct = 5; + if team_colours.green >= 5 { pct += 5 }; + if team_colours.green >= 10 { pct += 10 }; + if team_colours.green >= 20 { pct += 20 }; + base.pct(pct) }, Spec::BlueDamageI => modified + { - apply_bonus(base.pct(5), vec![team_colours.blue], vec![5, 10, 20], - vec![base.pct(5), base.pct(10), base.pct(20)]) + let mut pct = 5; + if team_colours.blue >= 5 { pct += 5 }; + if team_colours.blue >= 10 { pct += 10 }; + if team_colours.blue >= 20 { pct += 20 }; + base.pct(pct) }, Spec::GRDI => modified + { - apply_bonus(base.pct(5), vec![team_colours.green, team_colours.red], - vec![2, 5, 10], vec![base.pct(5), base.pct(10), base.pct(20)]) + let mut pct = 5; + if team_colours.green >= 2 && team_colours.red >= 2 { pct += 5 }; + if team_colours.green >= 5 && team_colours.red >= 5 { pct += 10 }; + if team_colours.green >= 10 && team_colours.red >= 10 { pct += 20 }; + base.pct(pct) }, Spec::GBDI => modified + { - apply_bonus(base.pct(5), vec![team_colours.green, team_colours.blue], - vec![2, 5, 10], vec![base.pct(5), base.pct(10), base.pct(20)]) + let mut pct = 5; + if team_colours.green >= 2 && team_colours.blue >= 2 { pct += 5 }; + if team_colours.green >= 5 && team_colours.blue >= 5 { pct += 10 }; + if team_colours.green >= 10 && team_colours.blue >= 10 { pct += 20 }; + base.pct(pct) }, Spec::RBDI => modified + { - apply_bonus(base.pct(5), vec![team_colours.red, team_colours.blue], - vec![2, 5, 10], vec![base.pct(5), base.pct(10), base.pct(20)]) + let mut pct = 5; + if team_colours.blue >= 2 && team_colours.red >= 2 { pct += 5 }; + if team_colours.blue >= 5 && team_colours.red >= 5 { pct += 10 }; + if team_colours.blue >= 10 && team_colours.red >= 10 { pct += 20 }; + base.pct(pct) }, Spec::SpeedI => modified + base.pct(5), Spec::LifeI => modified + { - let bonus = 10 * team_colours.green as u64; - apply_bonus(bonus, vec![team_colours.green], vec![5, 10, 20], vec![bonus, bonus * 2, bonus * 3]) + let mut mult = 10; + if team_colours.red >= 5 { mult += 20 }; + if team_colours.red >= 10 { mult += 30 }; + if team_colours.red >= 20 { mult += 50 }; + mult * team_colours.green as u64 }, Spec::RedShieldI => modified + { - let bonus = 10 * team_colours.red as u64; - apply_bonus(bonus, vec![team_colours.red], vec![5, 10, 20], vec![bonus, bonus * 2, bonus * 3]) + let mut mult = 10; + if team_colours.red >= 5 { mult += 20 }; + if team_colours.red >= 10 { mult += 30 }; + if team_colours.red >= 20 { mult += 50 }; + mult * team_colours.red as u64 }, Spec::BlueShieldI => modified + { - let bonus = 10 * team_colours.blue as u64; - apply_bonus(bonus, vec![team_colours.blue], vec![5, 10, 20], vec![bonus, bonus * 2, bonus * 3]) + let mut mult = 10; + if team_colours.red >= 5 { mult += 20 }; + if team_colours.red >= 10 { mult += 30 }; + if team_colours.red >= 20 { mult += 50 }; + (mult * team_colours.blue) as u64 }, Spec::LRSI => modified + { - let bonus = 5 * (team_colours.green + team_colours.red) as u64; - apply_bonus(bonus, vec![team_colours.green, team_colours.red], - vec![2, 5, 10], vec![bonus, bonus * 2, bonus * 3]) + let mut mult = 5; + if team_colours.green >= 2 && team_colours.red >= 2 { mult += 5 }; + if team_colours.green >= 5 && team_colours.red >= 5 { mult += 10 }; + if team_colours.green >= 10 && team_colours.red >= 10 { mult += 20 }; + mult * (team_colours.green + team_colours.red) as u64 }, Spec::LBSI => modified + { - let bonus = 5 * (team_colours.green + team_colours.blue) as u64; - apply_bonus(bonus, vec![team_colours.green, team_colours.blue], - vec![2, 5, 10], vec![bonus, bonus * 2, bonus * 3]) + let mut mult = 5; + if team_colours.green >= 2 && team_colours.red >= 2 { mult += 5 }; + if team_colours.green >= 5 && team_colours.red >= 5 { mult += 10 }; + if team_colours.green >= 10 && team_colours.red >= 10 { mult += 20 }; + mult * (team_colours.green + team_colours.red) as u64 }, Spec::RBSI => modified + { - let bonus = 5 * (team_colours.red + team_colours.blue) as u64; - apply_bonus(bonus, vec![team_colours.red, team_colours.blue], - vec![2, 5, 10], vec![bonus, bonus * 2, bonus * 3]) + let mut mult = 5; + if team_colours.blue >= 2 && team_colours.red >= 2 { mult += 5 }; + if team_colours.blue >= 5 && team_colours.red >= 5 { mult += 10 }; + if team_colours.blue >= 10 && team_colours.red >= 10 { mult += 20 }; + mult * (team_colours.blue + team_colours.red) as u64 }, } }