mnml/server/src/spec.rs
2019-03-22 17:20:49 +11:00

211 lines
8.7 KiB
Rust

use rand::prelude::*;
use cryp::{Stat, Colours};
#[derive(Debug,Copy,Clone,Serialize,Deserialize,PartialEq,PartialOrd,Ord,Eq)]
pub enum Spec {
Speed,
RedSpeedI,
BlueSpeedI,
GreenSpeedI,
GRSpeedI,
GBSpeedI,
RBSpeedI,
// Pure redShield has to come first as it applies the base amount
// that is multiplied
Hp,
LifeI,
RedShieldI,
BlueShieldI,
LRSI,
LBSI,
RBSI,
Damage,
RedDamageI,
GreenDamageI,
BlueDamageI,
GRDI,
GBDI,
RBDI,
}
pub trait IntPct {
fn pct(self, pct: u64) -> u64;
}
impl IntPct for u64 {
fn pct(self, pct: u64) -> u64 {
self * pct / 100
}
}
impl Spec {
pub fn affects(&self) -> Vec<Stat> {
match *self {
Spec::Damage => vec![Stat::BlueDamage, Stat::RedDamage, Stat::GreenDamage],
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::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::BlueShieldI => vec![Stat::BlueShield],
Spec::LifeI => vec![Stat::Hp],
Spec::LRSI => vec![Stat::Hp, Stat::RedShield],
Spec::LBSI => vec![Stat::Hp, Stat::BlueShield],
Spec::RBSI => vec![Stat::BlueShield, Stat::RedShield],
}
}
pub fn apply(&self, modified: u64, base: u64, team_colours: &Colours) -> u64 {
match *self {
// Upgrades to Damage Spec
Spec::Damage => modified + base.pct(5),
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)
},
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)
},
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)
},
Spec::GRDI => 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::GBDI => 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::RBDI => 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)
},
// 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)
},
// Upgrades to HP Spec
Spec::Hp => modified + base.pct(5),
Spec::LifeI => modified + {
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 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 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 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 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 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
},
}
}
}