diff --git a/server/src/spec.rs b/server/src/spec.rs index 2dcc768c..ce55b96a 100644 --- a/server/src/spec.rs +++ b/server/src/spec.rs @@ -14,6 +14,9 @@ pub enum Spec { LRSI, LBSI, RBSI, + GRDI, + GBDI, + RBDI, RedDamageI, GreenDamageI, @@ -36,6 +39,9 @@ impl Spec { Spec::RedDamageI => vec![Stat::RedDamage], Spec::GreenDamageI => vec![Stat::GreenDamage], Spec::BlueDamageI => vec![Stat::BlueDamage], + Spec::GRDI => vec![Stat::GreenDamage, Stat::RedDamage], + Spec::GBDI => vec![Stat::GreenDamage, Stat::BlueDamage], + Spec::RBDI => vec![Stat::RedDamage, Stat::BlueDamage], Spec::SpeedI => vec![Stat::Speed], @@ -54,42 +60,77 @@ impl Spec { let i_min = 32; let i_max = 64; + + fn apply_bonus(colours: Vec, reqs: Vec, bonuses: Vec) -> u64 { + 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 + { - 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) + let mut bonus = base.pct(5); + bonus + apply_bonus(vec![team_colours.red], vec![5, 10, 20], + vec![base.pct(5), base.pct(10), base.pct(20)]) }, Spec::GreenDamageI => modified + { - 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) + let mut bonus = base.pct(5) as u64; + bonus + apply_bonus(vec![team_colours.green], vec![5, 10, 20], + vec![base.pct(5), base.pct(10), base.pct(20)]) }, Spec::BlueDamageI => modified + { - let mut pct = 5; - if team_colours.blue >= 5 { pct += 10 }; - if team_colours.blue >= 10 { pct += 20 }; - if team_colours.blue >= 20 { pct += 30 }; - base.pct(pct) + let mut bonus = base.pct(5) as u64; + bonus + apply_bonus(vec![team_colours.blue], vec![5, 10, 20], + vec![base.pct(5), base.pct(10), base.pct(20)]) + }, + Spec::GRDI => modified + { + let mut bonus = base.pct(5) as u64; + bonus + apply_bonus(vec![team_colours.green, team_colours.red], + vec![2, 5, 10], vec![base.pct(5), base.pct(10), base.pct(20)]) + }, + Spec::GBDI => modified + { + let mut bonus = base.pct(5) as u64; + bonus + apply_bonus(vec![team_colours.green, team_colours.blue], + vec![2, 5, 10], vec![base.pct(5), base.pct(10), base.pct(20)]) + }, + Spec::RBDI => modified + { + let mut bonus = base.pct(5) as u64; + bonus + apply_bonus(vec![team_colours.red, team_colours.blue], + vec![2, 5, 10], vec![base.pct(5), base.pct(10), base.pct(20)]) }, Spec::SpeedI => modified + base.pct(5), - Spec::LifeI => modified + base.pct(5), - Spec::RedShieldI => modified + rng.gen_range(i_min, i_max), - Spec::BlueShieldI => modified + rng.gen_range(i_min, i_max), - Spec::LRSI => modified + { - if team_colours.red > 5 && team_colours.green > 5 { base.pct(10) } - else { base.pct(5) } + Spec::LifeI => modified + { + let mut bonus = 10 * team_colours.green as u64; + bonus + apply_bonus(vec![team_colours.green], vec![5, 10, 20], vec![bonus, bonus * 2, bonus * 3]) + }, + Spec::RedShieldI => modified + { + let mut bonus = 10 * team_colours.red as u64; + bonus + apply_bonus(vec![team_colours.red], vec![5, 10, 20], vec![bonus, bonus * 2, bonus * 3]) + }, + Spec::BlueShieldI => modified + { + let mut bonus = 10 * team_colours.blue as u64; + bonus + apply_bonus(vec![team_colours.blue], vec![5, 10, 20], vec![bonus, bonus * 2, bonus * 3]) + }, + Spec::LRSI => modified + { + let mut bonus = 5 * (team_colours.green + team_colours.red) as u64; + bonus + apply_bonus(vec![team_colours.green, team_colours.red], + vec![2, 5, 10], vec![bonus, bonus * 2, bonus * 3]) + }, + Spec::LBSI => modified + { + let mut bonus = 5 * (team_colours.green + team_colours.blue) as u64; + bonus + apply_bonus(vec![team_colours.green, team_colours.blue], + vec![2, 5, 10], vec![bonus, bonus * 2, bonus * 3]) + }, + Spec::RBSI => modified + { + let mut bonus = 5 * (team_colours.red + team_colours.blue) as u64; + bonus + apply_bonus(vec![team_colours.red, team_colours.blue], + vec![2, 5, 10], vec![bonus, bonus * 2, bonus * 3]) }, - Spec::LBSI => modified + base.pct(5), - Spec::RBSI => modified + base.pct(5), } } - } diff --git a/server/src/vbox.rs b/server/src/vbox.rs index 8950a796..b93e91dd 100644 --- a/server/src/vbox.rs +++ b/server/src/vbox.rs @@ -33,20 +33,26 @@ pub enum Var { Debuff, // specs + // Base Damage, Hp, SpeedI, + // Shields Upgrades LifeI, + RedShieldI, + BlueShieldI, LRSI, LBSI, RBSI, + // Damage Upgrades RedDamageI, BlueDamageI, GreenDamageI, - RedShieldI, - BlueShieldI, + GRDI, + GBDI, + RBDI, Amplify, Banish, @@ -182,6 +188,9 @@ impl Var { Var::RedDamageI => Some(Spec::RedDamageI), Var::BlueDamageI => Some(Spec::BlueDamageI), Var::GreenDamageI => Some(Spec::GreenDamageI), + Var::GRDI => Some(Spec::GRDI), + Var::GBDI => Some(Spec::GBDI), + Var::RBDI => Some(Spec::RBDI), Var::LifeI => Some(Spec::LifeI), Var::LRSI => Some(Spec::LRSI), @@ -241,6 +250,9 @@ impl From for Var { Spec::RedDamageI => Var::RedDamageI, Spec::BlueDamageI => Var::BlueDamageI, Spec::GreenDamageI => Var::GreenDamageI, + Spec::GRDI => Var::GRDI, + Spec::GBDI => Var::GBDI, + Spec::RBDI => Var::RBDI, Spec::LifeI => Var::LifeI, Spec::LRSI => Var::LRSI, @@ -299,9 +311,9 @@ fn get_combos() -> Vec { Combo { units: vec![Var::Damage, Var::Red, Var::Red], var: Var::RedDamageI }, Combo { units: vec![Var::Damage, Var::Green, Var::Green], var: Var::GreenDamageI }, Combo { units: vec![Var::Damage, Var::Blue, Var::Blue], var: Var::BlueDamageI }, - // Combo { units: vec![Var::Damage, Var::Red, Var::Green], var: Var::Strike }, - // Combo { units: vec![Var::Damage, Var::Green, Var::Blue], var: Var::Silence }, - // Combo { units: vec![Var::Damage, Var::Red, Var::Blue], var: Var::Hex }, + Combo { units: vec![Var::Damage, Var::Red, Var::Green], var: Var::GRDI }, + Combo { units: vec![Var::Damage, Var::Green, Var::Blue], var: Var::GBDI }, + Combo { units: vec![Var::Damage, Var::Red, Var::Blue], var: Var::RBDI }, Combo { units: vec![Var::Hp, Var::Red, Var::Red], var: Var::RedShieldI }, Combo { units: vec![Var::Hp, Var::Green, Var::Green], var: Var::LifeI },