cryp colours

This commit is contained in:
ntr 2019-03-17 17:28:30 +11:00
parent f91c31d502
commit 0d37444b73
2 changed files with 103 additions and 6 deletions

View File

@ -12,6 +12,37 @@ use rpc::{CrypSpawnParams};
use skill::{Skill, Cooldown, Effect, Cast, Category, Immunity, Disable, ResolutionResult}; use skill::{Skill, Cooldown, Effect, Cast, Category, Immunity, Disable, ResolutionResult};
use spec::{Spec}; use spec::{Spec};
use game::{Log}; use game::{Log};
use vbox::Var;
#[derive(Debug,Clone,Serialize,Deserialize)]
pub struct Colours {
pub red: u8,
pub green: u8,
pub blue: u8,
}
impl Colours {
pub fn new() -> Colours {
Colours { red: 0, green: 0, blue: 0 }
}
pub fn from_cryp(cryp: &Cryp) -> Colours {
let mut count = Colours::new();
for spec in cryp.specs.iter() {
let v = Var::from(*spec);
v.colours(&mut count);
}
for cs in cryp.skills.iter() {
let v = Var::from(cs.skill);
v.colours(&mut count);
}
count
}
}
#[derive(Debug,Clone,Copy,PartialEq,Serialize,Deserialize)] #[derive(Debug,Clone,Copy,PartialEq,Serialize,Deserialize)]
pub struct CrypSkill { pub struct CrypSkill {
@ -107,7 +138,6 @@ impl CrypStat {
pub struct CrypRecover { pub struct CrypRecover {
pub id: Uuid, pub id: Uuid,
pub account: Uuid, pub account: Uuid,
pub xp: u64,
pub name: String, pub name: String,
} }
@ -125,6 +155,7 @@ pub struct Cryp {
pub skills: Vec<CrypSkill>, pub skills: Vec<CrypSkill>,
pub effects: Vec<CrypEffect>, pub effects: Vec<CrypEffect>,
pub specs: Vec<Spec>, pub specs: Vec<Spec>,
pub colours: Colours,
pub name: String, pub name: String,
pub ko_logged: bool, pub ko_logged: bool,
} }
@ -145,6 +176,7 @@ impl Cryp {
skills: vec![], skills: vec![],
effects: vec![], effects: vec![],
specs: vec![], specs: vec![],
colours: Colours::new(),
name: String::new(), name: String::new(),
ko_logged: false, ko_logged: false,
}; };
@ -162,11 +194,13 @@ impl Cryp {
pub fn learn(mut self, s: Skill) -> Cryp { pub fn learn(mut self, s: Skill) -> Cryp {
self.skills.push(CrypSkill::new(s)); self.skills.push(CrypSkill::new(s));
self.colours = Colours::from_cryp(&self);
self self
} }
pub fn learn_mut(&mut self, s: Skill) -> &mut Cryp { pub fn learn_mut(&mut self, s: Skill) -> &mut Cryp {
self.skills.push(CrypSkill::new(s)); self.skills.push(CrypSkill::new(s));
self.colours = Colours::from_cryp(&self);
self self
} }
@ -197,6 +231,10 @@ impl Cryp {
fn recalculate_stats(&mut self) -> &mut Cryp { fn recalculate_stats(&mut self) -> &mut Cryp {
self.specs.sort_unstable(); self.specs.sort_unstable();
// recalculate the colours for the spec bonuses
self.colours = Colours::from_cryp(&self);
self.red_damage.recalculate(&self.specs); self.red_damage.recalculate(&self.specs);
self.red_shield.recalculate(&self.specs); self.red_shield.recalculate(&self.specs);
self.blue_damage.recalculate(&self.specs); self.blue_damage.recalculate(&self.specs);
@ -620,4 +658,23 @@ mod tests {
assert_eq!(cryp.name, "hatchling".to_string()); assert_eq!(cryp.name, "hatchling".to_string());
return; return;
} }
#[test]
fn cryp_colours_test() {
let mut cryp = Cryp::new()
.named(&"redboi".to_string());
cryp.learn_mut(Skill::Strike);
cryp.spec_add(Spec::LifeI).unwrap();
cryp.spec_add(Spec::RedDamageI).unwrap();
cryp.spec_add(Spec::RedDamageI).unwrap();
cryp.spec_add(Spec::BlueShieldI).unwrap();
assert_eq!(cryp.colours.red, 6);
assert_eq!(cryp.colours.green, 2);
assert_eq!(cryp.colours.blue, 2);
return;
}
} }

View File

@ -16,6 +16,7 @@ use rpc::{VboxAcceptParams, VboxDiscardParams, VboxCombineParams, VboxApplyParam
use skill::{Skill}; use skill::{Skill};
use spec::{Spec}; use spec::{Spec};
use player::{Player, player_get, player_update}; use player::{Player, player_get, player_update};
use cryp::{Colours};
#[derive(Debug,Copy,Clone,Serialize,Deserialize,PartialEq,PartialOrd,Ord,Eq)] #[derive(Debug,Copy,Clone,Serialize,Deserialize,PartialEq,PartialOrd,Ord,Eq)]
pub enum Var { pub enum Var {
@ -51,6 +52,7 @@ pub enum Var {
Banish, Banish,
Blast, Blast,
Curse, Curse,
Decay,
Empower, Empower,
Haste, Haste,
Heal, Heal,
@ -73,6 +75,13 @@ pub enum Var {
Throw, Throw,
Toxic, Toxic,
Triage, Triage,
TestTouch,
TestStun,
TestBlock,
TestParry,
TestSiphon,
} }
enum VarEffect { enum VarEffect {
@ -81,6 +90,20 @@ enum VarEffect {
} }
impl Var { impl Var {
pub fn colours(&self, count: &mut Colours) {
let combos = get_combos();
let combo = combos.iter().find(|c| c.var == *self);
match combo {
Some(c) => c.units.iter().for_each(|unit| match unit {
Var::Red => count.red += 1,
Var::Blue => count.blue += 1,
Var::Green => count.green += 1,
_ => (),
}),
None => (),
}
}
fn cost(&self) -> u16 { fn cost(&self) -> u16 {
match self { match self {
Var::Red => 1, Var::Red => 1,
@ -193,6 +216,13 @@ impl From<Skill> for Var {
Skill::Stun => Var::Stun, Skill::Stun => Var::Stun,
Skill::Throw => Var::Throw, Skill::Throw => Var::Throw,
Skill::Triage => Var::Triage, Skill::Triage => Var::Triage,
Skill::Decay => Var::Decay,
Skill::TestTouch => Var::TestTouch,
Skill::TestStun => Var::TestStun,
Skill::TestBlock => Var::TestBlock,
Skill::TestParry => Var::TestParry,
Skill::TestSiphon => Var::TestSiphon,
_ => panic!("{:?} not implemented as a var", skill), _ => panic!("{:?} not implemented as a var", skill),
} }
} }
@ -218,6 +248,7 @@ impl From<Spec> for Var {
} }
} }
struct Combo { struct Combo {
var: Var, var: Var,
units: Vec<Var>, units: Vec<Var>,
@ -228,9 +259,9 @@ fn get_combos() -> Vec<Combo> {
Combo { units: vec![Var::Attack, Var::Red, Var::Red], var: Var::Strike }, Combo { units: vec![Var::Attack, Var::Red, Var::Red], var: Var::Strike },
Combo { units: vec![Var::Attack, Var::Green, Var::Green], var: Var::Heal }, Combo { units: vec![Var::Attack, Var::Green, Var::Green], var: Var::Heal },
Combo { units: vec![Var::Attack, Var::Blue, Var::Blue], var: Var::Blast }, Combo { units: vec![Var::Attack, Var::Blue, Var::Blue], var: Var::Blast },
Combo { units: vec![Var::Attack, Var::Red, Var::Green], var: Var::Strike }, // Combo { units: vec![Var::Attack, Var::Red, Var::Green], var: Var::Strike },
Combo { units: vec![Var::Attack, Var::Green, Var::Blue], var: Var::Heal }, Combo { units: vec![Var::Attack, Var::Green, Var::Blue], var: Var::Decay },
Combo { units: vec![Var::Attack, Var::Red, Var::Blue], var: Var::Blast }, // Combo { units: vec![Var::Attack, Var::Red, Var::Blue], var: Var::Blast },
Combo { units: vec![Var::Block, Var::Red, Var::Red], var: Var::Parry }, Combo { units: vec![Var::Block, Var::Red, Var::Red], var: Var::Parry },
Combo { units: vec![Var::Block, Var::Green, Var::Green], var: Var::Reflect }, Combo { units: vec![Var::Block, Var::Green, Var::Green], var: Var::Reflect },
@ -547,4 +578,13 @@ mod tests {
assert_eq!(vbox.bits, 22); assert_eq!(vbox.bits, 22);
} }
#[test]
fn colours_count_test() {
let strike = Var::Strike;
let mut count = Colours::new();
strike.colours(&mut count);
assert_eq!(count.red, 2);
}
} }