Merge branch 'master' of ssh://mnml.gg:40022/~/mnml

This commit is contained in:
ntr 2019-05-29 13:50:45 +10:00
commit cbe83b3a1e
4 changed files with 246 additions and 167 deletions

View File

@ -899,6 +899,30 @@ mod tests {
construct.spec_add(Spec::PowerRRI).unwrap();
construct.spec_add(Spec::PowerGGI).unwrap();
construct.spec_add(Spec::PowerBBI).unwrap();
construct.learn_mut(Skill::StrikeIII); // 18 reds (24 total)
let player_colours = Colours {
red: 5,
green: 15,
blue: 25,
};
construct.apply_modifiers(&player_colours);
assert!(construct.red_power.value == construct.red_power.base + construct.red_power.base.pct(80));
assert!(construct.green_power.value == construct.green_power.base + construct.green_power.base.pct(120));
assert!(construct.blue_power.value == construct.blue_power.base + construct.blue_power.base.pct(160));
return;
}
#[test]
fn construct_player_modifiers_base_test() {
let mut construct = Construct::new()
.named(&"player player".to_string());
construct.spec_add(Spec::Power).unwrap();
construct.spec_add(Spec::Life).unwrap();
let player_colours = Colours {
red: 5,
@ -909,9 +933,35 @@ mod tests {
construct.apply_modifiers(&player_colours);
assert!(construct.red_power.value == construct.red_power.base + construct.red_power.base.pct(20));
assert!(construct.green_power.value == construct.green_power.base + construct.green_power.base.pct(40));
assert!(construct.blue_power.value == construct.blue_power.base + construct.blue_power.base.pct(80));
assert!(construct.green_power.value == construct.green_power.base + construct.green_power.base.pct(20));
assert!(construct.blue_power.value == construct.blue_power.base + construct.blue_power.base.pct(20));
assert!(construct.green_life.value == construct.green_life.base + 150);
return;
}
#[test]
fn construct_player_modifiers_spec_bonus_test() {
let mut construct = Construct::new()
.named(&"player player".to_string());
construct.spec_add(Spec::PowerRRI).unwrap();
construct.spec_add(Spec::PowerGGI).unwrap();
construct.spec_add(Spec::PowerBBI).unwrap();
let player_colours = Colours {
red: 5,
green: 0,
blue: 0,
};
construct.apply_modifiers(&player_colours);
assert!(construct.red_power.value == construct.red_power.base + construct.red_power.base.pct(60));
assert!(construct.green_power.value == construct.green_power.base + construct.green_power.base.pct(40));
assert!(construct.blue_power.value == construct.blue_power.base + construct.blue_power.base.pct(40));
return;
}
}

View File

@ -786,6 +786,9 @@ impl From<Skill> for Item {
Skill::ChaosI => Item::ChaosI,
Skill::ChaosII => Item::ChaosII,
Skill::ChaosIII => Item::ChaosIII,
Skill::CorruptI => Item::CorruptI,
Skill::CorruptII => Item::CorruptII,
Skill::CorruptIII => Item::CorruptIII,
Skill::ClutchI => Item::ClutchI,
Skill::ClutchII => Item::ClutchII,
Skill::ClutchIII => Item::ClutchIII,
@ -866,16 +869,34 @@ impl From<Skill> for Item {
Skill::TriageI => Item::TriageI,
Skill::TriageII => Item::TriageII,
Skill::TriageIII => Item::TriageIII,
Skill::CorruptI => Item::CorruptI,
Skill::CorruptII => Item::CorruptII,
Skill::CorruptIII => Item::CorruptIII,
Skill::Attack => Item::Attack,
Skill::Stun => Item::Stun,
Skill::Block => Item::Block,
Skill::ParryI => Item::ParryI,
Skill::SiphonI => Item::SiphonI,
_ => panic!("{:?} not implemented with item conversion", skill),
// Convert subskills into parent skills
Skill::CorruptionI => Item::CorruptI,
Skill::CorruptionII => Item::CorruptII,
Skill::CorruptionIII => Item::CorruptIII,
Skill::CorruptionTickI => Item::CorruptI,
Skill::CorruptionTickII => Item::CorruptII,
Skill::CorruptionTickIII => Item::CorruptII,
Skill::DecayTickI => Item::DecayI,
Skill::DecayTickII => Item::DecayII,
Skill::DecayTickIII => Item::DecayIII,
Skill::HatredI => Item::HostilityI,
Skill::HatredII => Item::HostilityII,
Skill::HatredIII => Item::HostilityIII,
Skill::HasteStrike => Item::HasteI,
Skill::ImpureBlast => Item::ImpurityI,
Skill::RiposteI => Item::ParryI,
Skill::RiposteII => Item::ParryII,
Skill::RiposteIII => Item::ParryIII,
Skill::SiphonTickI => Item::SiphonI,
Skill::SiphonTickII => Item::SiphonII,
Skill::SiphonTickIII => Item::SiphonIII,
Skill::StrangleTickI => Item::StrangleI,
Skill::StrangleTickII => Item::StrangleII,
Skill::StrangleTickIII => Item::StrangleIII,
Skill::TriageTickI => Item::TriageI,
Skill::TriageTickII => Item::TriageII,
Skill::TriageTickIII => Item::TriageIII,
}
}
}

View File

@ -275,7 +275,7 @@ pub fn resolve(skill: Skill, source: &mut Construct, target: &mut Construct, mut
// Not used
Skill::Injure => injure(source, target, resolutions, skill),
// Skill::Injure => injure(source, target, resolutions, skill),
};
return resolutions;
@ -749,7 +749,7 @@ pub enum Skill {
ImpurityI,
ImpurityII,
ImpurityIII,
Injure,
// Injure,
InvertI,
InvertII,
@ -1077,7 +1077,7 @@ impl Skill {
Skill::TriageIII => vec![ConstructEffect {effect: Effect::Triage, duration: 4,
meta: Some(EffectMeta::Skill(Skill::TriageTickIII)), tick: None}],
//Unused
Skill::Injure => vec![ConstructEffect {effect: Effect::Injured, duration: 2, meta: None, tick: None }],
// Skill::Injure => vec![ConstructEffect {effect: Effect::Injured, duration: 2, meta: None, tick: None }],
_ => {
panic!("{:?} no skill effect", self);
@ -1204,7 +1204,7 @@ impl Skill {
Skill::TauntI => Some(2),
Skill::TauntII => Some(2),
Skill::TauntIII => Some(2),
Skill::Injure => Some(2),
// Skill::Injure => Some(2),
Skill::CorruptI =>Some(1),
Skill::CorruptII =>Some(1),
@ -2004,7 +2004,7 @@ mod tests {
};
}
#[test]
/* #[test]
fn injure_test() {
let mut x = Construct::new()
.named(&"muji".to_string());
@ -2016,7 +2016,7 @@ mod tests {
assert!(y.immune(Skill::HealI).is_some());
// resolutions = heal(&mut y.clone(), &mut y, resolutions);
}
*/
#[test]
fn invert_test() {
let mut x = Construct::new()

View File

@ -1,5 +1,6 @@
use construct::{Stat, Colours};
use util::{IntPct};
use std::cmp;
#[derive(Debug,Clone,Serialize,Deserialize)]
pub struct SpecBonus {
@ -19,9 +20,21 @@ impl SpecBonus {
#[derive(Debug,Clone,Serialize,Deserialize)]
pub struct SpecValues {
pub base: u64,
pub multi: u64,
pub bonuses: Vec<SpecBonus>,
}
impl SpecValues {
pub fn max_value (&self, c: &Colours) -> u64 {
self.bonuses.iter().fold(self.base, |acc, s| acc + s.get_bonus(c))
}
pub fn calc_multi (&self, c: &Colours) -> u64 {
self.multi * (c.red + c.green + c.blue) as u64
}
}
#[derive(Debug,Copy,Clone,Serialize,Deserialize,PartialEq,PartialOrd,Ord,Eq)]
pub enum Spec {
Speed,
@ -31,8 +44,7 @@ pub enum Spec {
SpeedRGI,
SpeedGBI,
SpeedRBI,
// Pure redLife has to come first as it applies the base amount
// that is multiplied
Life,
LifeGGI,
LifeRRI,
@ -82,217 +94,213 @@ impl Spec {
pub fn values(&self) -> SpecValues {
match *self {
Spec::Power => SpecValues {
base: 5,
multi: 0, base: 20,
bonuses: vec![]
},
Spec::PowerRRI => SpecValues {
base: 10,
multi: 10, base: 40,
bonuses: vec![
SpecBonus { req: Colours { red: 5, green: 0, blue: 0 }, bonus: 10 },
SpecBonus { req: Colours { red: 10, green: 0, blue: 0 }, bonus: 20 },
SpecBonus { req: Colours { red: 5, green: 0, blue: 0 }, bonus: 40 },
SpecBonus { req: Colours { red: 10, green: 0, blue: 0 }, bonus: 40 },
SpecBonus { req: Colours { red: 20, green: 0, blue: 0 }, bonus: 40 }
],
},
Spec::PowerGGI => SpecValues {
base: 10,
multi: 10, base: 40,
bonuses: vec![
SpecBonus { req: Colours { red: 0, green: 5, blue: 0 }, bonus: 10 },
SpecBonus { req: Colours { red: 0, green: 10, blue: 0 }, bonus: 20 },
SpecBonus { req: Colours { red: 0, green: 5, blue: 0 }, bonus: 40 },
SpecBonus { req: Colours { red: 0, green: 10, blue: 0 }, bonus: 40 },
SpecBonus { req: Colours { red: 0, green: 20, blue: 0 }, bonus: 40 }
],
},
Spec::PowerBBI => SpecValues {
base: 10,
multi: 10, base: 40,
bonuses: vec![
SpecBonus { req: Colours { red: 0, green: 0, blue: 5 }, bonus: 10 },
SpecBonus { req: Colours { red: 0, green: 0, blue: 10 }, bonus: 20 },
SpecBonus { req: Colours { red: 0, green: 0, blue: 5 }, bonus: 40 },
SpecBonus { req: Colours { red: 0, green: 0, blue: 10 }, bonus: 40 },
SpecBonus { req: Colours { red: 0, green: 0, blue: 20 }, bonus: 40 }
],
},
Spec::PowerRGI => SpecValues {
base: 5,
multi: 7, base: 25,
bonuses: vec![
SpecBonus { req: Colours { red: 2, green: 2, blue: 0 }, bonus: 10 },
SpecBonus { req: Colours { red: 5, green: 5, blue: 0 }, bonus: 15 },
SpecBonus { req: Colours { red: 10, green: 10, blue: 0 }, bonus: 30 }
SpecBonus { req: Colours { red: 2, green: 2, blue: 0 }, bonus: 25 },
SpecBonus { req: Colours { red: 5, green: 5, blue: 0 }, bonus: 25 },
SpecBonus { req: Colours { red: 10, green: 10, blue: 0 }, bonus: 25 }
],
},
Spec::PowerGBI => SpecValues {
base: 5,
multi: 7, base: 25,
bonuses: vec![
SpecBonus { req: Colours { red: 0, green: 2, blue: 2 }, bonus: 10 },
SpecBonus { req: Colours { red: 0, green: 5, blue: 5 }, bonus: 15 },
SpecBonus { req: Colours { red: 0, green: 10, blue: 10 }, bonus: 30 }
SpecBonus { req: Colours { red: 0, green: 2, blue: 2 }, bonus: 25 },
SpecBonus { req: Colours { red: 0, green: 5, blue: 5 }, bonus: 25 },
SpecBonus { req: Colours { red: 0, green: 10, blue: 10 }, bonus: 25 }
],
},
Spec::PowerRBI => SpecValues {
base: 5,
multi: 7, base: 25,
bonuses: vec![
SpecBonus { req: Colours { red: 2, green: 0, blue: 2 }, bonus: 10 },
SpecBonus { req: Colours { red: 5, green: 0, blue: 5 }, bonus: 15 },
SpecBonus { req: Colours { red: 10, green: 0, blue: 10 }, bonus: 30 }
SpecBonus { req: Colours { red: 2, green: 0, blue: 2 }, bonus: 25 },
SpecBonus { req: Colours { red: 5, green: 0, blue: 5 }, bonus: 25 },
SpecBonus { req: Colours { red: 10, green: 0, blue: 10 }, bonus: 25 }
],
},
Spec::Speed => SpecValues {
base: 5,
multi: 0, base: 40,
bonuses: vec![]
},
Spec::SpeedRRI => SpecValues {
base: 10,
multi: 20, base: 80,
bonuses: vec![
SpecBonus { req: Colours { red: 5, green: 0, blue: 0 }, bonus: 10 },
SpecBonus { req: Colours { red: 10, green: 0, blue: 0 }, bonus: 20 },
SpecBonus { req: Colours { red: 20, green: 0, blue: 0 }, bonus: 40 }
SpecBonus { req: Colours { red: 5, green: 0, blue: 0 }, bonus: 80 },
SpecBonus { req: Colours { red: 10, green: 0, blue: 0 }, bonus: 80 },
SpecBonus { req: Colours { red: 20, green: 0, blue: 0 }, bonus: 80 }
],
},
Spec::SpeedGGI => SpecValues {
base: 10,
multi: 20, base: 80,
bonuses: vec![
SpecBonus { req: Colours { red: 0, green: 5, blue: 0 }, bonus: 10 },
SpecBonus { req: Colours { red: 0, green: 10, blue: 0 }, bonus: 20 },
SpecBonus { req: Colours { red: 0, green: 20, blue: 0 }, bonus: 40 }
SpecBonus { req: Colours { red: 0, green: 5, blue: 0 }, bonus: 80 },
SpecBonus { req: Colours { red: 0, green: 10, blue: 0 }, bonus: 80 },
SpecBonus { req: Colours { red: 0, green: 20, blue: 0 }, bonus: 80 }
],
},
Spec::SpeedBBI => SpecValues {
base: 10,
multi: 20, base: 80,
bonuses: vec![
SpecBonus { req: Colours { red: 0, green: 0, blue: 5 }, bonus: 10 },
SpecBonus { req: Colours { red: 0, green: 0, blue: 10 }, bonus: 20 },
SpecBonus { req: Colours { red: 0, green: 0, blue: 20 }, bonus: 40 }
SpecBonus { req: Colours { red: 0, green: 0, blue: 5 }, bonus: 80 },
SpecBonus { req: Colours { red: 0, green: 0, blue: 10 }, bonus: 80 },
SpecBonus { req: Colours { red: 0, green: 0, blue: 20 }, bonus: 80 }
],
},
Spec::SpeedRGI => SpecValues {
base: 5,
multi: 15, base: 60,
bonuses: vec![
SpecBonus { req: Colours { red: 2, green: 2, blue: 0 }, bonus: 10 },
SpecBonus { req: Colours { red: 5, green: 5, blue: 0 }, bonus: 15 },
SpecBonus { req: Colours { red: 10, green: 10, blue: 0 }, bonus: 30 }
SpecBonus { req: Colours { red: 2, green: 2, blue: 0 }, bonus: 60 },
SpecBonus { req: Colours { red: 5, green: 5, blue: 0 }, bonus: 60 },
SpecBonus { req: Colours { red: 10, green: 10, blue: 0 }, bonus: 60 }
],
},
Spec::SpeedGBI => SpecValues {
base: 5,
multi: 15, base: 60,
bonuses: vec![
SpecBonus { req: Colours { red: 0, green: 2, blue: 2 }, bonus: 10 },
SpecBonus { req: Colours { red: 0, green: 5, blue: 5 }, bonus: 15 },
SpecBonus { req: Colours { red: 0, green: 10, blue: 10 }, bonus: 30 }
SpecBonus { req: Colours { red: 0, green: 2, blue: 2 }, bonus: 60 },
SpecBonus { req: Colours { red: 0, green: 5, blue: 5 }, bonus: 60 },
SpecBonus { req: Colours { red: 0, green: 10, blue: 10 }, bonus: 60 }
],
},
Spec::SpeedRBI => SpecValues {
base: 5,
multi: 15, base: 60,
bonuses: vec![
SpecBonus { req: Colours { red: 2, green: 0, blue: 2 }, bonus: 10 },
SpecBonus { req: Colours { red: 5, green: 0, blue: 5 }, bonus: 15 },
SpecBonus { req: Colours { red: 10, green: 0, blue: 10 }, bonus: 30 }
SpecBonus { req: Colours { red: 2, green: 0, blue: 2 }, bonus: 60 },
SpecBonus { req: Colours { red: 5, green: 0, blue: 5 }, bonus: 60 },
SpecBonus { req: Colours { red: 10, green: 0, blue: 10 }, bonus: 60 }
],
},
Spec::Life => SpecValues {
base: 5,
multi: 0, base: 150,
bonuses: vec![]},
Spec::LifeRRI => SpecValues {
base: 10,
multi: 75, base: 300,
bonuses: vec![
SpecBonus { req: Colours { red: 5, green: 0, blue: 0 }, bonus: 10 },
SpecBonus { req: Colours { red: 10, green: 0, blue: 0 }, bonus: 20 },
SpecBonus { req: Colours { red: 20, green: 0, blue: 0 }, bonus: 40 }
SpecBonus { req: Colours { red: 5, green: 0, blue: 0 }, bonus: 300 },
SpecBonus { req: Colours { red: 10, green: 0, blue: 0 }, bonus: 300 },
SpecBonus { req: Colours { red: 20, green: 0, blue: 0 }, bonus: 300 }
],
},
Spec::LifeGGI => SpecValues {
base: 10,
multi: 75, base: 300,
bonuses: vec![
SpecBonus { req: Colours { red: 0, green: 5, blue: 0 }, bonus: 10 },
SpecBonus { req: Colours { red: 0, green: 10, blue: 0 }, bonus: 20 },
SpecBonus { req: Colours { red: 0, green: 20, blue: 0 }, bonus: 40 }
SpecBonus { req: Colours { red: 0, green: 5, blue: 0 }, bonus: 300 },
SpecBonus { req: Colours { red: 0, green: 10, blue: 0 }, bonus: 300 },
SpecBonus { req: Colours { red: 0, green: 20, blue: 0 }, bonus: 300 }
],
},
Spec::LifeBBI => SpecValues {
base: 10,
multi: 75, base: 300,
bonuses: vec![
SpecBonus { req: Colours { red: 0, green: 0, blue: 5 }, bonus: 10 },
SpecBonus { req: Colours { red: 0, green: 0, blue: 10 }, bonus: 20 },
SpecBonus { req: Colours { red: 0, green: 0, blue: 20 }, bonus: 40 }
SpecBonus { req: Colours { red: 0, green: 0, blue: 5 }, bonus: 300 },
SpecBonus { req: Colours { red: 0, green: 0, blue: 10 }, bonus: 300 },
SpecBonus { req: Colours { red: 0, green: 0, blue: 20 }, bonus: 300 }
],
},
Spec::LifeRGI => SpecValues {
base: 5,
multi: 50, base: 200,
bonuses: vec![
SpecBonus { req: Colours { red: 2, green: 2, blue: 0 }, bonus: 10 },
SpecBonus { req: Colours { red: 5, green: 5, blue: 0 }, bonus: 15 },
SpecBonus { req: Colours { red: 10, green: 10, blue: 0 }, bonus: 30 }
SpecBonus { req: Colours { red: 2, green: 2, blue: 0 }, bonus: 200 },
SpecBonus { req: Colours { red: 5, green: 5, blue: 0 }, bonus: 200 },
SpecBonus { req: Colours { red: 10, green: 10, blue: 0 }, bonus: 200 }
],
},
Spec::LifeGBI => SpecValues {
base: 5,
multi: 50, base: 200,
bonuses: vec![
SpecBonus { req: Colours { red: 0, green: 2, blue: 2 }, bonus: 10 },
SpecBonus { req: Colours { red: 0, green: 5, blue: 5 }, bonus: 15 },
SpecBonus { req: Colours { red: 0, green: 10, blue: 10 }, bonus: 30 }
SpecBonus { req: Colours { red: 0, green: 2, blue: 2 }, bonus: 200 },
SpecBonus { req: Colours { red: 0, green: 5, blue: 5 }, bonus: 200 },
SpecBonus { req: Colours { red: 0, green: 10, blue: 10 }, bonus: 200 }
],
},
Spec::LifeRBI => SpecValues {
base: 5,
multi: 50, base: 200,
bonuses: vec![
SpecBonus { req: Colours { red: 2, green: 0, blue: 2 }, bonus: 10 },
SpecBonus { req: Colours { red: 5, green: 0, blue: 5 }, bonus: 15 },
SpecBonus { req: Colours { red: 10, green: 0, blue: 10 }, bonus: 30 }
SpecBonus { req: Colours { red: 2, green: 0, blue: 2 }, bonus: 200 },
SpecBonus { req: Colours { red: 5, green: 0, blue: 5 }, bonus: 200 },
SpecBonus { req: Colours { red: 10, green: 0, blue: 10 }, bonus: 200 }
],
},
}
}
pub fn apply(&self, modified: u64, base: u64, construct_colours: &Colours, player_colours: &Colours) -> u64 {
let construct_colour_total: u64 = (construct_colours.red + construct_colours.green + construct_colours.blue) as u64;
match *self {
// Upgrades to Power Spec
// Percentage multipliers based on base value
Spec::Power |
Spec::Speed => modified + base.pct(self.values().base),
Spec::PowerRRI |
Spec::PowerGGI |
Spec::PowerBBI |
Spec::PowerRGI |
Spec::PowerGBI |
Spec::PowerRBI |
Spec::Speed |
Spec::SpeedRRI |
Spec::SpeedGGI |
Spec::SpeedBBI |
Spec::SpeedRGI |
Spec::SpeedGBI |
Spec::SpeedRBI => modified + {
let spec_values = self.values();
base.pct(spec_values.bonuses.iter()
.fold(spec_values.base, |acc, s| acc + s.get_bonus(player_colours)))
base.pct(cmp::min(self.values().calc_multi(construct_colours),
self.values().max_value(player_colours)))
},
Spec::Life |
// Flat bonus
Spec::Life => modified + self.values().base,
Spec::LifeRRI |
Spec::LifeGGI |
Spec::LifeBBI |
Spec::LifeRGI |
Spec::LifeGBI |
Spec::LifeRBI => modified + {
let spec_values = self.values();
construct_colour_total * (spec_values.bonuses.iter()
.fold(spec_values.base, |acc, s| acc + s.get_bonus(player_colours)))
cmp::min(self.values().calc_multi(construct_colours),
self.values().max_value(player_colours))
},
}
}