buff blue dmg spec

This commit is contained in:
ntr 2019-03-22 15:59:45 +11:00
commit 10848b1239
2 changed files with 167 additions and 55 deletions

View File

@ -4,23 +4,30 @@ use cryp::{Stat, Colours};
#[derive(Debug,Copy,Clone,Serialize,Deserialize,PartialEq,PartialOrd,Ord,Eq)] #[derive(Debug,Copy,Clone,Serialize,Deserialize,PartialEq,PartialOrd,Ord,Eq)]
pub enum Spec { pub enum Spec {
SpeedI, Speed,
RedSpeedI,
BlueSpeedI,
GreenSpeedI,
GRSpeedI,
GBSpeedI,
RBSpeedI,
// Pure redShield has to come first as it applies the base amount // Pure redShield has to come first as it applies the base amount
// that is multiplied // that is multiplied
Hp,
LifeI, LifeI,
RedShieldI, RedShieldI,
BlueShieldI, BlueShieldI,
LRSI, LRSI,
LBSI, LBSI,
RBSI, RBSI,
GRDI,
GBDI,
RBDI,
Damage,
RedDamageI, RedDamageI,
GreenDamageI, GreenDamageI,
BlueDamageI, BlueDamageI,
GRDI,
GBDI,
RBDI,
} }
pub trait IntPct { pub trait IntPct {
@ -36,6 +43,7 @@ impl IntPct for u64 {
impl Spec { impl Spec {
pub fn affects(&self) -> Vec<Stat> { pub fn affects(&self) -> Vec<Stat> {
match *self { match *self {
Spec::Damage => vec![Stat::BlueDamage, Stat::RedDamage, Stat::GreenDamage],
Spec::RedDamageI => vec![Stat::RedDamage], Spec::RedDamageI => vec![Stat::RedDamage],
Spec::GreenDamageI => vec![Stat::GreenDamage], Spec::GreenDamageI => vec![Stat::GreenDamage],
Spec::BlueDamageI => vec![Stat::BlueDamage], Spec::BlueDamageI => vec![Stat::BlueDamage],
@ -43,8 +51,15 @@ impl Spec {
Spec::GBDI => vec![Stat::GreenDamage, Stat::BlueDamage], Spec::GBDI => vec![Stat::GreenDamage, Stat::BlueDamage],
Spec::RBDI => vec![Stat::RedDamage, Stat::BlueDamage], Spec::RBDI => vec![Stat::RedDamage, Stat::BlueDamage],
Spec::SpeedI => vec![Stat::Speed], Spec::Speed => vec![Stat::Speed],
Spec::RedSpeedI => vec![Stat::Speed],
Spec::BlueSpeedI => vec![Stat::Speed],
Spec::GreenSpeedI => vec![Stat::Speed],
Spec::GRSpeedI => vec![Stat::Speed],
Spec::GBSpeedI => vec![Stat::Speed],
Spec::RBSpeedI => vec![Stat::Speed],
Spec::Hp => vec![Stat::Hp],
Spec::RedShieldI => vec![Stat::RedShield], Spec::RedShieldI => vec![Stat::RedShield],
Spec::BlueShieldI => vec![Stat::BlueShield], Spec::BlueShieldI => vec![Stat::BlueShield],
Spec::LifeI => vec![Stat::Hp], Spec::LifeI => vec![Stat::Hp],
@ -56,74 +71,139 @@ impl Spec {
} }
pub fn apply(&self, modified: u64, base: u64, team_colours: &Colours) -> u64 { 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<u8>, reqs: Vec<u8>, bonuses: Vec<u64>) -> 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 { match *self {
// Upgrades to Damage Spec
Spec::Damage => modified + base.pct(5),
Spec::RedDamageI => modified + { Spec::RedDamageI => modified + {
apply_bonus(base.pct(5), vec![team_colours.red], vec![5, 10, 20], let mut pct = 5;
vec![base.pct(5), base.pct(10), base.pct(20)]) 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 + { Spec::GreenDamageI => modified + {
apply_bonus(base.pct(5), vec![team_colours.green], vec![5, 10, 20], let mut pct = 5;
vec![base.pct(5), base.pct(10), base.pct(20)]) 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 + { Spec::BlueDamageI => modified + {
apply_bonus(base.pct(5), vec![team_colours.blue], vec![5, 10, 20], let mut pct = 5;
vec![base.pct(5), base.pct(10), base.pct(20)]) if team_colours.blue >= 5 { pct += 10 };
if team_colours.blue >= 10 { pct += 20 };
if team_colours.blue >= 20 { pct += 30 };
base.pct(pct)
}, },
Spec::GRDI => modified + { Spec::GRDI => modified + {
apply_bonus(base.pct(5), vec![team_colours.green, team_colours.red], let mut pct = 5;
vec![2, 5, 10], vec![base.pct(5), base.pct(10), base.pct(20)]) 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 + { Spec::GBDI => modified + {
apply_bonus(base.pct(5), vec![team_colours.green, team_colours.blue], let mut pct = 5;
vec![2, 5, 10], vec![base.pct(5), base.pct(10), base.pct(20)]) 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 + { Spec::RBDI => modified + {
apply_bonus(base.pct(5), vec![team_colours.red, team_colours.blue], let mut pct = 5;
vec![2, 5, 10], vec![base.pct(5), base.pct(10), base.pct(20)]) 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)
},
// Upgrades to speed Spec
Spec::Speed => modified + base.pct(5),
Spec::RedSpeedI => 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)
},
Spec::GreenSpeedI => 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)
},
Spec::BlueSpeedI => modified + {
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::GRSpeedI => modified + {
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::GBSpeedI => modified + {
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::RBSpeedI => modified + {
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), // Upgrades to HP Spec
Spec::Hp => modified + base.pct(5),
Spec::LifeI => modified + { Spec::LifeI => modified + {
let bonus = 10 * team_colours.green as u64; let mut mult = 10;
apply_bonus(bonus, vec![team_colours.green], vec![5, 10, 20], vec![bonus, bonus * 2, bonus * 3]) 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 + { Spec::RedShieldI => modified + {
let bonus = 10 * team_colours.red as u64; let mut mult = 10;
apply_bonus(bonus, vec![team_colours.red], vec![5, 10, 20], vec![bonus, bonus * 2, bonus * 3]) 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 + { Spec::BlueShieldI => modified + {
let bonus = 10 * team_colours.blue as u64; let mut mult = 10;
apply_bonus(bonus, vec![team_colours.blue], vec![5, 10, 20], vec![bonus, bonus * 2, bonus * 3]) 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 + { Spec::LRSI => modified + {
let bonus = 5 * (team_colours.green + team_colours.red) as u64; let mut mult = 5;
apply_bonus(bonus, vec![team_colours.green, team_colours.red], if team_colours.green >= 2 && team_colours.red >= 2 { mult += 5 };
vec![2, 5, 10], vec![bonus, bonus * 2, bonus * 3]) 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 + { Spec::LBSI => modified + {
let bonus = 5 * (team_colours.green + team_colours.blue) as u64; let mut mult = 5;
apply_bonus(bonus, vec![team_colours.green, team_colours.blue], if team_colours.green >= 2 && team_colours.red >= 2 { mult += 5 };
vec![2, 5, 10], vec![bonus, bonus * 2, bonus * 3]) 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 + { Spec::RBSI => modified + {
let bonus = 5 * (team_colours.red + team_colours.blue) as u64; let mut mult = 5;
apply_bonus(bonus, vec![team_colours.red, team_colours.blue], if team_colours.blue >= 2 && team_colours.red >= 2 { mult += 5 };
vec![2, 5, 10], vec![bonus, bonus * 2, bonus * 3]) 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
}, },
} }
} }

View File

@ -36,7 +36,7 @@ pub enum Var {
// Base // Base
Damage, Damage,
Hp, Hp,
SpeedI, Speed,
// Shields Upgrades // Shields Upgrades
LifeI, LifeI,
@ -54,6 +54,14 @@ pub enum Var {
GBDI, GBDI,
RBDI, RBDI,
// Speed Upgrades
RedSpeedI,
BlueSpeedI,
GreenSpeedI,
GRSpeedI,
GBSpeedI,
RBSpeedI,
Amplify, Amplify,
Banish, Banish,
Blast, Blast,
@ -126,7 +134,7 @@ impl Var {
Var::Damage => 3, Var::Damage => 3,
Var::Hp => 3, Var::Hp => 3,
Var::SpeedI => 3, Var::Speed => 3,
_ => { _ => {
let combos = get_combos(); let combos = get_combos();
@ -183,8 +191,15 @@ impl Var {
fn into_spec(&self) -> Option<Spec> { fn into_spec(&self) -> Option<Spec> {
match *self { match *self {
Var::SpeedI => Some(Spec::SpeedI), Var::Speed => Some(Spec::Speed),
Var::RedSpeedI => Some(Spec::RedSpeedI),
Var::BlueSpeedI => Some(Spec::BlueSpeedI),
Var::GreenSpeedI => Some(Spec::GreenSpeedI),
Var::GRSpeedI => Some(Spec::GRSpeedI),
Var::GBSpeedI => Some(Spec::GBSpeedI),
Var::RBSpeedI => Some(Spec::RBSpeedI),
Var::Damage => Some(Spec::Damage),
Var::RedDamageI => Some(Spec::RedDamageI), Var::RedDamageI => Some(Spec::RedDamageI),
Var::BlueDamageI => Some(Spec::BlueDamageI), Var::BlueDamageI => Some(Spec::BlueDamageI),
Var::GreenDamageI => Some(Spec::GreenDamageI), Var::GreenDamageI => Some(Spec::GreenDamageI),
@ -192,6 +207,7 @@ impl Var {
Var::GBDI => Some(Spec::GBDI), Var::GBDI => Some(Spec::GBDI),
Var::RBDI => Some(Spec::RBDI), Var::RBDI => Some(Spec::RBDI),
Var::Hp => Some(Spec::Hp),
Var::LifeI => Some(Spec::LifeI), Var::LifeI => Some(Spec::LifeI),
Var::LRSI => Some(Spec::LRSI), Var::LRSI => Some(Spec::LRSI),
Var::LBSI => Some(Spec::LBSI), Var::LBSI => Some(Spec::LBSI),
@ -245,8 +261,15 @@ impl From<Skill> for Var {
impl From<Spec> for Var { impl From<Spec> for Var {
fn from(spec: Spec) -> Var { fn from(spec: Spec) -> Var {
match spec { match spec {
Spec::SpeedI => Var::SpeedI, Spec::Speed => Var::Speed,
Spec::RedSpeedI => Var::RedSpeedI,
Spec::BlueSpeedI => Var::BlueSpeedI,
Spec::GreenSpeedI => Var::GreenSpeedI,
Spec::GRSpeedI => Var::GRSpeedI,
Spec::GBSpeedI => Var::GBSpeedI,
Spec::RBSpeedI => Var::RBSpeedI,
Spec::Damage => Var::Damage,
Spec::RedDamageI => Var::RedDamageI, Spec::RedDamageI => Var::RedDamageI,
Spec::BlueDamageI => Var::BlueDamageI, Spec::BlueDamageI => Var::BlueDamageI,
Spec::GreenDamageI => Var::GreenDamageI, Spec::GreenDamageI => Var::GreenDamageI,
@ -254,6 +277,7 @@ impl From<Spec> for Var {
Spec::GBDI => Var::GBDI, Spec::GBDI => Var::GBDI,
Spec::RBDI => Var::RBDI, Spec::RBDI => Var::RBDI,
Spec::Hp => Var::Hp,
Spec::LifeI => Var::LifeI, Spec::LifeI => Var::LifeI,
Spec::LRSI => Var::LRSI, Spec::LRSI => Var::LRSI,
Spec::LBSI => Var::LBSI, Spec::LBSI => Var::LBSI,
@ -321,6 +345,14 @@ fn get_combos() -> Vec<Combo> {
Combo { units: vec![Var::Hp, Var::Red, Var::Green], var: Var::LRSI }, Combo { units: vec![Var::Hp, Var::Red, Var::Green], var: Var::LRSI },
Combo { units: vec![Var::Hp, Var::Green, Var::Blue], var: Var::LBSI }, Combo { units: vec![Var::Hp, Var::Green, Var::Blue], var: Var::LBSI },
Combo { units: vec![Var::Hp, Var::Red, Var::Blue], var: Var::RBSI }, Combo { units: vec![Var::Hp, Var::Red, Var::Blue], var: Var::RBSI },
Combo { units: vec![Var::Speed, Var::Red, Var::Red], var: Var::RedSpeedI },
Combo { units: vec![Var::Speed, Var::Green, Var::Green], var: Var::GreenSpeedI },
Combo { units: vec![Var::Speed, Var::Blue, Var::Blue], var: Var::BlueSpeedI },
Combo { units: vec![Var::Speed, Var::Red, Var::Green], var: Var::GRSpeedI },
Combo { units: vec![Var::Speed, Var::Green, Var::Blue], var: Var::GBSpeedI },
Combo { units: vec![Var::Speed, Var::Red, Var::Blue], var: Var::RBSpeedI },
]; ];
combinations.iter_mut().for_each(|set| set.units.sort_unstable()); combinations.iter_mut().for_each(|set| set.units.sort_unstable());
@ -347,7 +379,7 @@ impl Vbox {
Var::Hp, Var::Hp,
Var::Green, Var::Green,
Var::Attack, Var::Attack,
Var::SpeedI, Var::Speed,
Var::Blue, Var::Blue,
Var::Attack, Var::Attack,
Var::Damage, Var::Damage,
@ -400,7 +432,7 @@ impl Vbox {
let specs = vec![ let specs = vec![
(Var::Damage, 1), (Var::Damage, 1),
(Var::Hp, 1), (Var::Hp, 1),
(Var::SpeedI, 1), (Var::Speed, 1),
]; ];
let mut rng = thread_rng(); let mut rng = thread_rng();