mnml/core/src/effect.rs
2020-01-03 11:13:08 +10:00

241 lines
6.7 KiB
Rust

use construct::{Stat, EffectMeta};
use game::{Colour};
use skill::{Skill};
use util::{IntPct};
pub type Cooldown = Option<usize>;
#[derive(Debug,Clone,Copy,PartialEq,Serialize,Deserialize)]
pub enum Effect {
Amplify,
Banish,
Block,
Buff,
Counter,
Curse,
Haste,
Hybrid,
Intercept,
Invert,
Pure,
Purge,
Reflect,
Restrict,
Silence,
Slow,
Stun,
Sustain,
Vulnerable,
Wither, // Reduce green dmg (healing) taken
// electric is the buff that applies
// electrocute the dmg debuff
Electric,
Electrocute,
// absorbtion is the buff
// absorb is the increased damage
Absorb,
Absorption,
// magic immunity
// effects over time
Triage,
Triaged, // immunity
Decay,
Decayed, // immunity
Siphon,
Siphoned, // immunity
Countered,
// Regen,
// Airborne,
// Boost
// Bleed,
// Blind,
// Deadly,
// Enslave,
// Fury,
// Injured,
// Leech,
// Mesmerise,
// Untouchable,
// SpeedSiphon,
// SpeedIncrease,
Ko,
}
impl Effect {
pub fn immune(&self, skill: Skill) -> bool {
match self {
Effect::Banish => true,
// these provide immunity for the ticks
// the base skills will still resolve
// but they have early return checks
// to ensure the effect is reapplied but damage is not
Effect::Siphoned => [
Skill::SiphonTick,
].contains(&skill),
Effect::Decayed => [
Skill::DecayTick,
].contains(&skill),
Effect::Triaged => [
Skill::TriageTick,
].contains(&skill),
Effect::Countered => [
Skill::CounterAttack,
Skill::CounterAttackPlus,
Skill::CounterAttackPlusPlus,
].contains(&skill),
_ => false,
}
}
// hidden effects are used generally for immunities
// they are not displayed on client
// and not included in counts
pub fn hidden(&self) -> bool {
match self {
Effect::Siphoned => true,
Effect::Decayed => true,
Effect::Triaged => true,
Effect::Countered => true,
_ => false,
}
}
pub fn disables_skill(&self, skill: Skill) -> bool {
if skill.is_tick() {
return false;
}
match self {
Effect::Stun => true,
Effect::Banish => true,
Effect::Silence => skill.colours().contains(&Colour::Blue),
Effect::Restrict => skill.colours().contains(&Colour::Red),
Effect::Purge => skill.colours().contains(&Colour::Green),
Effect::Ko => skill.ko_castable(),
_ => false,
}
}
pub fn modifications(&self) -> Vec<Stat> {
match self {
// Bases
Effect::Block => vec![Stat::RedDamageReceived, Stat::BlueDamageReceived],
Effect::Buff => vec![Stat::BluePower, Stat::RedPower, Stat::Speed],
Effect::Slow => vec![Stat::Speed],
// Power changes
Effect::Absorption => vec![Stat::RedPower, Stat::BluePower],
Effect::Amplify => vec![Stat::RedPower, Stat::BluePower],
Effect::Hybrid => vec![Stat::GreenPower],
// Damage taken changes
Effect::Curse => vec![Stat::RedDamageReceived, Stat::BlueDamageReceived],
Effect::Pure => vec![Stat::GreenHealingReceived], // increased green taken
Effect::Vulnerable => vec![Stat::RedDamageReceived],
Effect::Wither => vec![Stat::GreenHealingReceived], // reduced green taken
// Speed
Effect::Haste => vec![Stat::Speed],
_ => vec![],
}
}
pub fn apply(&self, value: usize, meta: Option<EffectMeta>) -> usize {
match self {
Effect::Amplify |
Effect::Vulnerable |
Effect::Block |
Effect::Buff |
Effect::Curse |
Effect::Haste |
Effect::Slow |
Effect::Hybrid |
Effect::Pure |
Effect::Wither => value.pct(match meta {
Some(EffectMeta::Multiplier(d)) => d,
_ => 100,
}),
Effect::Absorption => value + match meta {
Some(EffectMeta::AddedDamage(d)) => d,
_ => {
warn!("absorb meta not damage");
return 0;
}
},
_ => {
warn!("{:?} does not have a mod effect", self);
return value;
},
}
}
// Old colour matching system for buffs / debuffs
// Had issues as some effects will be considered as both a buff and debuff e.g. invert,
// Ended up being confusing with mismatch skills that have red / blue e.g. amplify, haste, hybrid
/* pub fn colour(&self) -> Option<Colour> {
match self {
// physical
Effect::Stun => Some(Colour::Red),
Effect::Block => Some(Colour::Green),
Effect::Buff => Some(Colour::Green),
Effect::Counter => Some(Colour::Green),
Effect::Vulnerable => Some(Colour::Red),
Effect::Restrict => Some(Colour::Red),
Effect::Sustain => Some(Colour::Green),
Effect::Intercept => Some(Colour::Green),
// magic
Effect::Curse => Some(Colour::Blue),
Effect::Banish => None,
// Effect::Banish => rng.gen_bool(0.5),
Effect::Slow => Some(Colour::Blue),
Effect::Haste => Some(Colour::Green),
Effect::Absorption => Some(Colour::Green),
Effect::Reflect => Some(Colour::Green),
Effect::Amplify => Some(Colour::Green),
Effect::Silence => Some(Colour::Blue),
Effect::Wither => Some(Colour::Blue),
Effect::Purge => Some(Colour::Blue),
Effect::Electric => Some(Colour::Green),
Effect::Electrocute => Some(Colour::Blue),
Effect::Absorb => Some(Colour::Green),
// magic
Effect::Hybrid => Some(Colour::Green),
Effect::Invert => Some(Colour::Green),
// effects over time
Effect::Triage => Some(Colour::Green),
Effect::Decay => Some(Colour::Blue),
Effect::Siphon => Some(Colour::Blue),
Effect::Pure => Some(Colour::Green),
Effect::Triaged => None,
Effect::Decayed => None,
Effect::Siphoned => None,
Effect::Countered => None,
Effect::Ko => None,
}
}*/
}