tick tiers and formatting

This commit is contained in:
Mashy 2019-05-27 12:11:14 +10:00
parent b0eb9a8a51
commit 9aa6346be6
4 changed files with 690 additions and 510 deletions

View File

@ -62,6 +62,7 @@ impl CrypSkill {
#[derive(Debug,Clone,Copy,PartialEq,Serialize,Deserialize)]
pub enum EffectMeta {
SkillTick(Skill),
TickAmount(u64),
AddedDamage(u64),
ScatterTarget(Uuid),

View File

@ -1432,8 +1432,8 @@ mod tests {
// make the purify cryp super fast so it beats out decay
game.cryp_by_id(y_cryp.id).unwrap().speed.force(10000000);
game.cryp_by_id(x_cryp.id).unwrap().learn_mut(Skill::Decay);
while game.cryp_by_id(x_cryp.id).unwrap().skill_on_cd(Skill::Decay).is_some() {
game.cryp_by_id(x_cryp.id).unwrap().learn_mut(Skill::DecayI);
while game.cryp_by_id(x_cryp.id).unwrap().skill_on_cd(Skill::DecayI).is_some() {
game.cryp_by_id(x_cryp.id).unwrap().reduce_cooldowns();
}
@ -1448,7 +1448,7 @@ mod tests {
}
// apply buff
game.add_skill(x_player.id, x_cryp.id, Some(y_cryp.id), Skill::Decay).unwrap();
game.add_skill(x_player.id, x_cryp.id, Some(y_cryp.id), Skill::DecayI).unwrap();
game.player_ready(x_player.id).unwrap();
game.player_ready(y_player.id).unwrap();
game = game.resolve_phase_start();
@ -1456,7 +1456,7 @@ mod tests {
let Resolution { source: _, target: _, event } = game.resolved.pop().unwrap();
match event {
Event::Damage { amount: _, skill, mitigation: _, colour: _ } => assert_eq!(skill, Skill::DecayTick),
Event::Damage { amount: _, skill, mitigation: _, colour: _ } => assert_eq!(skill, Skill::DecayTickI),
_ => panic!("not decay"),
};

View File

@ -63,7 +63,9 @@ pub enum Item {
CurseI,
CurseII,
CurseIII,
Decay,
DecayI,
DecayII,
DecayIII,
Hostility,
Haste,
HealI,
@ -118,7 +120,9 @@ pub enum Item {
ThrowI,
ThrowII,
ThrowIII,
Triage,
TriageI,
TriageII,
TriageIII,
TestTouch,
@ -239,7 +243,9 @@ impl Item {
Item::CurseII => Some(Skill::CurseII),
Item::CurseIII => Some(Skill::CurseIII),
Item::Debuff => Some(Skill::Debuff),
Item::Decay => Some(Skill::Decay),
Item::DecayI => Some(Skill::DecayI),
Item::DecayII => Some(Skill::DecayII),
Item::DecayIII => Some(Skill::DecayIII),
Item::Haste => Some(Skill::Haste),
Item::HealI => Some(Skill::HealI),
Item::HealII => Some(Skill::HealII),
@ -299,7 +305,9 @@ impl Item {
Item::ThrowII => Some(Skill::ThrowII),
Item::ThrowIII => Some(Skill::ThrowIII),
Item::Corrupt => Some(Skill::Corrupt),
Item::Triage => Some(Skill::Triage),
Item::TriageI => Some(Skill::TriageI),
Item::TriageII => Some(Skill::TriageII),
Item::TriageIII => Some(Skill::TriageIII),
_ => None,
}
}
@ -438,7 +446,9 @@ impl Item {
self.into_skill().unwrap().effect().first().unwrap().get_multiplier() - 100,
self.into_skill().unwrap().effect().first().unwrap().get_duration()),
Item::Decay => format!(
Item::DecayI |
Item::DecayII |
Item::DecayIII => format!(
"Reduces healing taken by {:?}% and deals blue damage {:?}% blue power each turn. Lasts {:?}T",
100 - self.into_skill().unwrap().effect().first().unwrap().get_multiplier(),
self.into_skill().unwrap().multiplier(),
@ -582,7 +592,9 @@ impl Item {
self.into_skill().unwrap().effect().first().unwrap().get_multiplier() - 100,
self.into_skill().unwrap().effect().last().unwrap().get_duration()),
Item::Triage => format!(
Item::TriageI |
Item::TriageII |
Item::TriageIII => format!(
"Heals target for {:?}% green power each turn. Lasts {:?}T",
self.into_skill().unwrap().multiplier(),
self.into_skill().unwrap().effect().first().unwrap().get_duration()),
@ -598,7 +610,9 @@ impl Item {
Item::TauntI => vec![Item::Buff, Item::Red, Item::Red],
Item::TauntII => vec![Item::TauntI, Item::TauntI, Item::TauntI],
Item::TauntIII => vec![Item::TauntII, Item::TauntII, Item::TauntII],
Item::Triage => vec![Item::Buff, Item::Green, Item::Green],
Item::TriageI => vec![Item::Buff, Item::Green, Item::Green],
Item::TriageII => vec![Item::TriageI, Item::TriageI, Item::TriageI],
Item::TriageIII => vec![Item::TriageII, Item::TriageII, Item::TriageII],
Item::ScatterI => vec![Item::Buff, Item::Blue, Item::Blue],
Item::ScatterII => vec![Item::ScatterI, Item::ScatterI, Item::ScatterI],
Item::ScatterIII => vec![Item::ScatterIII, Item::ScatterIII, Item::ScatterIII],
@ -620,7 +634,9 @@ impl Item {
Item::CurseI => vec![Item::Debuff, Item::Red, Item::Green],
Item::CurseII => vec![Item::CurseI, Item::CurseI, Item::CurseI],
Item::CurseIII => vec![Item::CurseII, Item::CurseII, Item::CurseII],
Item::Decay => vec![Item::Debuff, Item::Green, Item::Blue],
Item::DecayI => vec![Item::Debuff, Item::Green, Item::Blue],
Item::DecayII => vec![Item::DecayI, Item::DecayI, Item::DecayI],
Item::DecayIII => vec![Item::DecayII, Item::DecayII, Item::DecayII],
Item::InvertI => vec![Item::Debuff, Item::Red, Item::Blue],
Item::InvertII => vec![Item::InvertI, Item::InvertI, Item::InvertI],
Item::InvertIII => vec![Item::InvertII, Item::InvertII, Item::InvertII],
@ -721,7 +737,9 @@ impl From<Skill> for Item {
Skill::CurseI => Item::CurseI,
Skill::CurseII => Item::CurseII,
Skill::CurseIII => Item::CurseIII,
Skill::Decay => Item::Decay,
Skill::DecayI => Item::DecayI,
Skill::DecayII => Item::DecayII,
Skill::DecayIII => Item::DecayIII,
Skill::Debuff => Item::Debuff,
Skill::Haste => Item::Haste,
Skill::Hostility => Item::Hostility,
@ -778,14 +796,14 @@ impl From<Skill> for Item {
Skill::ThrowI => Item::ThrowI,
Skill::ThrowII => Item::ThrowII,
Skill::ThrowIII => Item::ThrowIII,
Skill::Triage => Item::Triage,
Skill::TriageI => Item::TriageI,
Skill::TriageII => Item::TriageII,
Skill::TriageIII => Item::TriageIII,
Skill::Corrupt => Item::Corrupt,
Skill::CorruptionTick => Item::Corrupt,
Skill::DecayTick => Item::Decay,
Skill::SiphonTick => Item::Siphon,
Skill::StrangleTick => Item::Strangle,
Skill::TriageTick => Item::Triage,
Skill::TestTouch => Item::TestTouch,
Skill::TestStun => Item::TestStun,
@ -840,7 +858,11 @@ pub fn get_combos() -> Vec<Combo> {
Combo { components: Item::TauntI.combo(), item: Item::TauntI },
Combo { components: Item::TauntII.combo(), item: Item::TauntII },
Combo { components: Item::TauntIII.combo(), item: Item::TauntIII },
Combo { components: Item::Triage.combo(), item: Item::Triage },
Combo { components: Item::TriageI.combo(), item: Item::TriageI },
Combo { components: Item::TriageII.combo(), item: Item::TriageII },
Combo { components: Item::TriageIII.combo(), item: Item::TriageIII },
Combo { components: Item::ScatterI.combo(), item: Item::ScatterI },
Combo { components: Item::ScatterII.combo(), item: Item::ScatterII },
Combo { components: Item::ScatterIII.combo(), item: Item::ScatterIII },
@ -865,7 +887,9 @@ pub fn get_combos() -> Vec<Combo> {
Combo { components: Item::CurseI.combo(), item: Item::CurseI },
Combo { components: Item::CurseII.combo(), item: Item::CurseII },
Combo { components: Item::CurseIII.combo(), item: Item::CurseIII },
Combo { components: Item::Decay.combo(), item: Item::Decay },
Combo { components: Item::DecayI.combo(), item: Item::DecayI },
Combo { components: Item::DecayII.combo(), item: Item::DecayII },
Combo { components: Item::DecayIII.combo(), item: Item::DecayIII },
Combo { components: Item::InvertI.combo(), item: Item::InvertI },
Combo { components: Item::InvertII.combo(), item: Item::InvertII },
Combo { components: Item::InvertIII.combo(), item: Item::InvertIII },

View File

@ -137,8 +137,12 @@ pub fn resolve(skill: Skill, source: &mut Cryp, target: &mut Cryp, mut resolutio
Skill::CurseII |
Skill::CurseIII => curse(source, target, resolutions, skill),
Skill::Decay => decay(source, target, resolutions, skill), // dot
Skill::DecayTick => decay_tick(source, target, resolutions, skill), // dot
Skill::DecayI |
Skill::DecayII |
Skill::DecayIII => decay(source, target, resolutions, skill), // dot
Skill::DecayTickI |
Skill::DecayTickII |
Skill::DecayTickIII => decay_tick(source, target, resolutions, skill), // dot
Skill::Haste => haste(source, target, resolutions, skill), // speed slow
@ -217,8 +221,13 @@ pub fn resolve(skill: Skill, source: &mut Cryp, target: &mut Cryp, mut resolutio
Skill::ThrowII |
Skill::ThrowIII => throw(source, target, resolutions, skill), // no damage stun, adds vulnerable
Skill::Triage => triage(source, target, resolutions, skill), // hot
Skill::TriageTick => triage_tick(source, target, resolutions, skill), // hot
Skill::TriageI |
Skill::TriageII |
Skill::TriageIII => triage(source, target, resolutions, skill), // hot
Skill::TriageTickI |
Skill::TriageTickII |
Skill::TriageTickIII => triage_tick(source, target, resolutions, skill), // hot
// Base Skills
Skill::Attack => attack(source, target, resolutions, skill),
@ -625,85 +634,124 @@ pub enum Skill {
AmplifyI,
AmplifyII,
AmplifyIII,
Banish,
BlastI,
BlastII,
BlastIII,
ChaosI,
ChaosII,
ChaosIII,
ClutchI,
ClutchII,
ClutchIII,
Corrupt,
CorruptionTick,
CurseI,
CurseII,
CurseIII,
Decay, // dot
DecayTick, // dot
DecayI, // dot
DecayII,
DecayIII,
DecayTickI, // dot
DecayTickII,
DecayTickIII,
Haste,
HasteStrike,
HealI,
HealII,
HealIII,
HexI,
HexII,
HexIII,
Hostility,
ImpureBlast,
Impurity,
Injure,
InvertI,
InvertII,
InvertIII,
Parry, // avoid all damage
PurgeI,
PurgeII,
PurgeIII,
PurifyI,
PurifyII,
PurifyIII,
RechargeI,
RechargeII,
RechargeIII,
ReflectI,
ReflectII,
ReflectIII,
Riposte,
RuinI,
RuinII,
RuinIII,
ScatterI,
ScatterII,
ScatterIII,
SilenceI,
SilenceII,
SilenceIII,
Siphon,
SiphonTick,
SlayI,
SlayII,
SlayIII,
SleepI,
SleepII,
SleepIII,
SnareI,
SnareII,
SnareIII,
Strangle,
StrangleTick,
StrikeI,
StrikeII,
StrikeIII,
TauntI,
TauntII,
TauntIII,
ThrowI, // no damage stun, adds vulnerable
ThrowII,
ThrowIII,
Triage, // hot
TriageTick,
TriageI, // hot
TriageII,
TriageIII,
TriageTickI,
TriageTickII,
TriageTickIII,
// used by tests, no cd, 100% multiplier
TestAttack,
@ -724,16 +772,20 @@ impl Skill {
Skill::BlastI => 110, // BB
Skill::BlastII => 130, // BB
Skill::BlastIII => 150, // BB
Skill::ChaosI => 40, // BR
Skill::ChaosII => 50, // BR
Skill::ChaosIII => 60, // BR
Skill::HealI => 130, //GG
Skill::HealII => 160, //GG
Skill::HealIII => 200, //GG
Skill::SiphonTick => 40, // GB
Skill::SlayI => 70, // RG
Skill::SlayII => 90,
Skill::SlayIII => 120,
Skill::StrikeI => 90, //RR
Skill::StrikeII => 110,
Skill::StrikeIII => 140,
@ -742,12 +794,15 @@ impl Skill {
Skill::CorruptionTick => 80,
Skill::Parry => 110,
Skill::Riposte => 70,
Skill::PurifyI => 45, //Green dmg (heal)
Skill::PurifyII => 70,
Skill::PurifyIII => 105,
Skill::ReflectI => 45, //restore blue life (heal)
Skill::ReflectII => 70,
Skill::ReflectIII => 100,
Skill::RechargeI => 85, //restore red and blue life (heal)
Skill::RechargeII => 130,
Skill::RechargeIII => 200,
@ -759,10 +814,12 @@ impl Skill {
Skill::StrangleTick => 65,
// Debuff Base
Skill::DecayTick => 25,
Skill::DecayTickI => 25,
Skill::DecayTickII => 45,
Skill::DecayTickIII => 70,
Skill::SilenceI => 55, // Deals more per blue skill on target
Skill::SilenceII => 80, // Deals more per blue skill on target
Skill::SilenceIII => 110, // Deals more per blue skill on target
Skill::SilenceII => 80,
Skill::SilenceIII => 110,
Skill::SnareI => 40, // Deals more per red skill on target
Skill::SnareII => 65,
Skill::SnareIII => 100,
@ -776,7 +833,9 @@ impl Skill {
Skill::TauntI => 80,
Skill::TauntII => 110,
Skill::TauntIII => 150,
Skill::TriageTick => 75,
Skill::TriageTickI => 75,
Skill::TriageTickII => 110,
Skill::TriageTickIII => 140,
_ => 100,
}
@ -785,12 +844,18 @@ impl Skill {
pub fn effect(&self) -> Vec<CrypEffect> {
match self {
// Modifiers
Skill::AmplifyI => vec![CrypEffect {effect: Effect::Amplify, duration: 2, meta: Some(EffectMeta::Multiplier(150)), tick: None}],
Skill::AmplifyII => vec![CrypEffect {effect: Effect::Amplify, duration: 3, meta: Some(EffectMeta::Multiplier(175)), tick: None}],
Skill::AmplifyIII => vec![CrypEffect {effect: Effect::Amplify, duration: 4, meta: Some(EffectMeta::Multiplier(200)), tick: None}],
Skill::Banish => vec![CrypEffect {effect: Effect::Banish, duration: 1, meta: None, tick: None}],
Skill::Block => vec![CrypEffect {effect: Effect::Block, duration: 1, meta: Some(EffectMeta::Multiplier(50)), tick: None}],
Skill::Buff => vec![CrypEffect {effect: Effect::Buff, duration: 2, meta: Some(EffectMeta::Multiplier(125)), tick: None }],
Skill::AmplifyI => vec![CrypEffect {effect: Effect::Amplify, duration: 2,
meta: Some(EffectMeta::Multiplier(150)), tick: None}],
Skill::AmplifyII => vec![CrypEffect {effect: Effect::Amplify, duration: 3,
meta: Some(EffectMeta::Multiplier(175)), tick: None}],
Skill::AmplifyIII => vec![CrypEffect {effect: Effect::Amplify, duration: 4,
meta: Some(EffectMeta::Multiplier(200)), tick: None}],
Skill::Banish => vec![CrypEffect {effect: Effect::Banish, duration: 1,meta: None, tick: None}],
Skill::Block => vec![CrypEffect {effect: Effect::Block, duration: 1,
meta: Some(EffectMeta::Multiplier(50)), tick: None}],
Skill::Buff => vec![CrypEffect {effect: Effect::Buff, duration: 2,
meta: Some(EffectMeta::Multiplier(125)), tick: None }],
Skill::Corrupt => vec![CrypEffect {effect: Effect::Corrupt, duration: 2, meta: None, tick: None},
CrypEffect {effect: Effect::Corruption, duration: 3, meta: None, tick: None}],
@ -798,25 +863,45 @@ impl Skill {
Skill::ClutchI => vec![CrypEffect {effect: Effect::Clutch, duration: 1, meta: None, tick: None }],
Skill::ClutchII => vec![CrypEffect {effect: Effect::Clutch, duration: 2, meta: None, tick: None }],
Skill::ClutchIII => vec![CrypEffect {effect: Effect::Clutch, duration: 3, meta: None, tick: None }],
Skill::CurseI => vec![CrypEffect {effect: Effect::Curse, duration: 2, meta: Some(EffectMeta::Multiplier(150)), tick: None}],
Skill::CurseII => vec![CrypEffect {effect: Effect::Curse, duration: 2, meta: Some(EffectMeta::Multiplier(200)), tick: None}],
Skill::CurseIII => vec![CrypEffect {effect: Effect::Curse, duration: 3, meta: Some(EffectMeta::Multiplier(250)), tick: None}],
Skill::Debuff => vec![CrypEffect {effect: Effect::Slow, duration: 3, meta: Some(EffectMeta::Multiplier(50)), tick: None }],
Skill::Decay => vec![CrypEffect {effect: Effect::Wither, duration: 3, meta: Some(EffectMeta::Multiplier(50)), tick: None },
CrypEffect {effect: Effect::Decay, duration: 3, meta: None, tick: None }],
Skill::Haste => vec![CrypEffect {effect: Effect::Haste, duration: 2, meta: Some(EffectMeta::Multiplier(150)), tick: None }],
Skill::CurseI => vec![CrypEffect {effect: Effect::Curse, duration: 2,
meta: Some(EffectMeta::Multiplier(150)), tick: None}],
Skill::CurseII => vec![CrypEffect {effect: Effect::Curse, duration: 2,
meta: Some(EffectMeta::Multiplier(200)), tick: None}],
Skill::CurseIII => vec![CrypEffect {effect: Effect::Curse, duration: 3,
meta: Some(EffectMeta::Multiplier(250)), tick: None}],
Skill::Debuff => vec![CrypEffect {effect: Effect::Slow, duration: 3,
meta: Some(EffectMeta::Multiplier(50)), tick: None }],
Skill::DecayI => vec![CrypEffect {effect: Effect::Wither, duration: 3, meta: Some(EffectMeta::Multiplier(50)), tick: None },
CrypEffect {effect: Effect::Decay, duration: 3,
meta: Some(EffectMeta::SkillTick(Skill::DecayTickI)), tick: None}],
Skill::DecayII => vec![CrypEffect {effect: Effect::Wither, duration: 3, meta: Some(EffectMeta::Multiplier(35)), tick: None },
CrypEffect {effect: Effect::Decay, duration: 3,
meta: Some(EffectMeta::SkillTick(Skill::DecayTickII)), tick: None}],
Skill::DecayIII => vec![CrypEffect {effect: Effect::Wither, duration: 4, meta: Some(EffectMeta::Multiplier(20)), tick: None },
CrypEffect {effect: Effect::Decay, duration: 4,
meta: Some(EffectMeta::SkillTick(Skill::DecayTickIII)), tick: None}],
Skill::Haste => vec![CrypEffect {effect: Effect::Haste, duration: 2,
meta: Some(EffectMeta::Multiplier(150)), tick: None }],
Skill::HexI => vec![CrypEffect {effect: Effect::Hex, duration: 2, meta: None, tick: None}],
Skill::HexII => vec![CrypEffect {effect: Effect::Hex, duration: 3, meta: None, tick: None}],
Skill::HexIII => vec![CrypEffect {effect: Effect::Hex, duration: 4, meta: None, tick: None}],
Skill::Hostility => vec![CrypEffect {effect: Effect::Hostility, duration: 2, meta: None, tick: None},
CrypEffect {effect: Effect::Hatred, duration: 5, meta: None, tick: None}],
Skill::Impurity => vec![CrypEffect {effect: Effect::Impurity, duration: 3, meta: Some(EffectMeta::Multiplier(150)), tick: None }],
Skill::Impurity => vec![CrypEffect {effect: Effect::Impurity, duration: 3,
meta: Some(EffectMeta::Multiplier(150)), tick: None }],
Skill::InvertI => vec![CrypEffect {effect: Effect::Invert, duration: 2, meta: None, tick: None}],
Skill::InvertII => vec![CrypEffect {effect: Effect::Invert, duration: 3, meta: None, tick: None}],
Skill::InvertIII => vec![CrypEffect {effect: Effect::Invert, duration: 4, meta: None, tick: None}],
Skill::Parry => vec![CrypEffect {effect: Effect::Parry, duration: 2, meta: None, tick: None }],
Skill::ReflectI => vec![CrypEffect {effect: Effect::Reflect, duration: 1, meta: None, tick: None }],
Skill::ReflectII => vec![CrypEffect {effect: Effect::Reflect, duration: 2, meta: None, tick: None }],
Skill::ReflectIII => vec![CrypEffect {effect: Effect::Reflect, duration: 3, meta: None, tick: None }],
@ -831,13 +916,17 @@ impl Skill {
Skill::RuinI => vec![CrypEffect {effect: Effect::Stun, duration: 1, meta: None, tick: None}],
Skill::RuinII => vec![CrypEffect {effect: Effect::Stun, duration: 1, meta: None, tick: None}],
Skill::RuinIII => vec![CrypEffect {effect: Effect::Stun, duration: 2, meta: None, tick: None}],
Skill::ScatterI => vec![CrypEffect {effect: Effect::Scatter, duration: 2, meta: None, tick: None}],
Skill::ScatterII => vec![CrypEffect {effect: Effect::Scatter, duration: 3, meta: None, tick: None}],
Skill::ScatterIII => vec![CrypEffect {effect: Effect::Scatter, duration: 4, meta: None, tick: None}],
Skill::SilenceI => vec![CrypEffect {effect: Effect::Silence, duration: 2, meta: None, tick: None}],
Skill::SilenceII => vec![CrypEffect {effect: Effect::Silence, duration: 2, meta: None, tick: None}],
Skill::SilenceIII => vec![CrypEffect {effect: Effect::Silence, duration: 3, meta: None, tick: None}],
Skill::SilenceII => vec![CrypEffect {effect: Effect::Silence, duration: 3, meta: None, tick: None}],
Skill::SilenceIII => vec![CrypEffect {effect: Effect::Silence, duration: 4, meta: None, tick: None}],
Skill::Siphon => vec![CrypEffect {effect: Effect::Siphon, duration: 2, meta: None, tick: None}],
Skill::SleepI => vec![CrypEffect {effect: Effect::Stun, duration: 2, meta: None, tick: None}],
Skill::SleepII => vec![CrypEffect {effect: Effect::Stun, duration: 3, meta: None, tick: None}],
Skill::SleepIII => vec![CrypEffect {effect: Effect::Stun, duration: 4, meta: None, tick: None}],
@ -848,10 +937,17 @@ impl Skill {
Skill::Strangle => vec![CrypEffect {effect: Effect::Strangle, duration: 2, meta: None, tick: None}],
Skill::Stun => vec![CrypEffect {effect: Effect::Stun, duration: 2, meta: None, tick: None}],
Skill::TauntI => vec![CrypEffect {effect: Effect::Taunt, duration: 2, meta: None, tick: None}],
Skill::TauntII => vec![CrypEffect {effect: Effect::Taunt, duration: 3, meta: None, tick: None}],
Skill::TauntIII => vec![CrypEffect {effect: Effect::Taunt, duration: 4, meta: None, tick: None}],
Skill::Triage => vec![CrypEffect {effect: Effect::Triage, duration: 2, meta: None, tick: None}],
Skill::TriageI => vec![CrypEffect {effect: Effect::Triage, duration: 2,
meta: Some(EffectMeta::SkillTick(Skill::TriageTickI)), tick: None}],
Skill::TriageII => vec![CrypEffect {effect: Effect::Triage, duration: 3,
meta: Some(EffectMeta::SkillTick(Skill::TriageTickII)), tick: None}],
Skill::TriageIII => vec![CrypEffect {effect: Effect::Triage, duration: 4,
meta: Some(EffectMeta::SkillTick(Skill::TriageTickIII)), tick: None}],
//Unused
Skill::Injure => vec![CrypEffect {effect: Effect::Injured, duration: 2, meta: None, tick: None }],
@ -867,95 +963,131 @@ impl Skill {
Skill::Attack => None,
Skill::Debuff => Some(1),
Skill::Buff => None,
Skill::StrikeI => None,
Skill::StrikeII => None,
Skill::StrikeIII => None,
Skill::Block => None, // reduce damage
Skill::Parry => Some(2), // avoid all damage
Skill::Riposte => None, // used on parry
Skill::SnareI => Some(2),
Skill::SnareII => Some(2),
Skill::SnareIII => Some(2),
Skill::Stun => Some(2),
Skill::HealI => None,
Skill::HealII => None,
Skill::HealIII => None,
Skill::Triage => None, // hot
Skill::TriageTick => None,
Skill::TriageI => None, // hot
Skill::TriageII => None, // hot
Skill::TriageIII => None, // hot
Skill::ThrowI => Some(1), // no damage stun, adds vulnerable
Skill::ThrowII => Some(1),
Skill::ThrowIII => Some(1),
Skill::BlastI => None,
Skill::BlastII => None,
Skill::BlastIII => None,
Skill::ChaosI => None,
Skill::ChaosII => None,
Skill::ChaosIII => None,
Skill::AmplifyI => Some(1),
Skill::AmplifyII => Some(1),
Skill::AmplifyIII => Some(1),
Skill::Impurity => Some(3),
Skill::ImpureBlast => None,
Skill::InvertI => Some(2),
Skill::InvertII => Some(2),
Skill::InvertIII => Some(2),
Skill::Decay => Some(1), // dot
Skill::DecayTick => None,
Skill::DecayI => Some(1), // dot
Skill::DecayII => Some(1),
Skill::DecayIII => Some(1),
Skill::Siphon => None,
Skill::SiphonTick => None,
Skill::CurseI => Some(1),
Skill::CurseII => Some(1),
Skill::CurseIII => Some(1),
Skill::ScatterI => Some(2),
Skill::ScatterII => Some(2),
Skill::ScatterIII => Some(2),
Skill::SilenceI => Some(3),
Skill::SilenceII => Some(2),
Skill::SilenceIII => Some(2),
Skill::PurifyI => None,
Skill::PurifyII => None,
Skill::PurifyIII => None,
Skill::PurgeI => None,
Skill::PurgeII => None,
Skill::PurgeIII => None,
Skill::Banish => Some(1),
Skill::HexI => Some(1),
Skill::HexII => Some(2),
Skill::HexIII => Some(2),
Skill::Haste => Some(2),
Skill::HasteStrike => None, // Used in haste
Skill::ReflectI => Some(2),
Skill::ReflectII => Some(2),
Skill::ReflectIII => Some(2),
Skill::RechargeI => Some(2),
Skill::RechargeII => Some(2),
Skill::RechargeIII => Some(2),
Skill::RuinI => Some(3),
Skill::RuinII => Some(2),
Skill::RuinIII => Some(2),
Skill::SlayI => None,
Skill::SlayII => None,
Skill::SlayIII => None,
Skill::SleepI => Some(3),
Skill::SleepII => Some(3),
Skill::SleepIII => Some(3),
Skill::Strangle => Some(2),
Skill::StrangleTick => None,
Skill::ClutchI => Some(1),
Skill::ClutchII => Some(2),
Skill::ClutchIII => Some(3),
Skill::TauntI => Some(2),
Skill::TauntII => Some(2),
Skill::TauntIII => Some(2),
Skill::Injure => Some(2),
Skill::Corrupt => Some(1),
Skill::CorruptionTick => None,
Skill::Hostility => Some(1),
//-----------
// Never cast directly
//---------
// Trigger
Skill::ImpureBlast |
Skill::HasteStrike |
Skill::Riposte | // parry
// Ticks
Skill::CorruptionTick |
Skill::DecayTickI |
Skill::DecayTickII |
Skill::DecayTickIII |
Skill::SiphonTick |
Skill::StrangleTick |
Skill::TriageTickI |
Skill::TriageTickII |
Skill::TriageTickIII => None,
// Triggers
// -----------------
// Test
// -----------------
@ -971,21 +1103,32 @@ impl Skill {
pub fn ko_castable(&self) -> bool {
match self {
Skill::TriageTick => true,
Skill::DecayTick => true,
Skill::SiphonTick => true,
Skill::CorruptionTick => true,
Skill::CorruptionTick |
Skill::DecayTickI |
Skill::DecayTickII |
Skill::DecayTickIII |
Skill::SiphonTick |
Skill::TriageTickI |
Skill::TriageTickII |
Skill::TriageTickIII => true,
_ => false,
}
}
pub fn is_tick(&self) -> bool {
match self {
Skill::CorruptionTick => true,
Skill::DecayTick => true,
Skill::SiphonTick => true,
Skill::StrangleTick => true,
Skill::TriageTick => true,
Skill::CorruptionTick |
Skill::DecayTickI |
Skill::DecayTickII |
Skill::DecayTickIII |
Skill::SiphonTick |
Skill::StrangleTick |
Skill::TriageTickI |
Skill::TriageTickII |
Skill::TriageTickIII => true,
_ => false,
}
}
@ -1006,8 +1149,14 @@ impl Skill {
Skill::StrikeIII => Skill::StrikeI.speed(),
Skill::SiphonTick => Skill::Siphon.speed(),
Skill::DecayTick => Skill::Decay.speed(),
Skill::TriageTick => Skill::Triage.speed(),
Skill::DecayTickI |
Skill::DecayTickII |
Skill::DecayTickIII => Skill::DecayI.speed(),
Skill::TriageTickI |
Skill::TriageTickII |
Skill::TriageTickIII => Skill::TriageI.speed(),
Skill::StrangleTick => Skill::Strangle.speed(),
Skill::CorruptionTick => Skill::Corrupt.speed(),
@ -1027,11 +1176,11 @@ impl Skill {
pub fn self_targeting(&self) -> bool {
match self {
Skill::Block |
Skill::Parry |
Skill::Corrupt |
Skill::ClutchI |
Skill::ClutchII |
Skill::ClutchIII |
Skill::Corrupt |
Skill::Parry |
Skill::TestBlock |
Skill::TestParry => true,
@ -1043,36 +1192,38 @@ impl Skill {
let mut rng = thread_rng();
match self {
Skill::HealI |
Skill::HealII |
Skill::HealIII |
Skill::Triage |
Skill::PurifyI |
Skill::PurifyII |
Skill::PurifyIII |
Skill::Parry |
Skill::AmplifyI |
Skill::AmplifyII |
Skill::AmplifyIII |
Skill::Block |
Skill::ClutchI |
Skill::ClutchII |
Skill::ClutchIII |
Skill::ScatterI |
Skill::ScatterII |
Skill::ScatterIII |
Skill::Corrupt |
Skill::Haste |
Skill::HealI |
Skill::HealII |
Skill::HealIII |
Skill::Hostility |
Skill::InvertI |
Skill::InvertII |
Skill::InvertIII |
Skill::Parry |
Skill::PurifyI |
Skill::PurifyII |
Skill::PurifyIII |
Skill::RechargeI |
Skill::RechargeII |
Skill::RechargeIII |
Skill::ReflectI |
Skill::ReflectII |
Skill::ReflectIII |
Skill::Haste |
Skill::InvertI |
Skill::InvertII |
Skill::InvertIII |
Skill::AmplifyI |
Skill::AmplifyII |
Skill::AmplifyIII |
Skill::Hostility |
Skill::Corrupt |
Skill::Block => true,
Skill::ScatterI |
Skill::ScatterII |
Skill::ScatterIII |
Skill::TriageI |
Skill::TriageII |
Skill::TriageIII => true,
Skill::Banish => rng.gen_bool(0.5),
@ -1297,17 +1448,20 @@ fn heal(source: &mut Cryp, target: &mut Cryp, mut results: Resolutions, skill: S
}
fn triage(source: &mut Cryp, target: &mut Cryp, mut results: Resolutions, skill: Skill) -> Resolutions {
skill.effect().into_iter().for_each(|e| {
let triage = e.clone().set_tick(Cast::new_tick(source, target, Skill::TriageTick));
let CrypEffect { effect, duration, meta, tick: _ } = skill.effect().first().unwrap().clone();
let tick_skill = match meta {
Some(EffectMeta::SkillTick(s)) => s,
_ => panic!("no triage tick skill"),
};
let triage = CrypEffect::new(effect, duration).set_tick(Cast::new_tick(source, target, tick_skill));
results.push(Resolution::new(source, target).event(target.add_effect(skill, triage)));
});
return triage_tick(source, target, results, Skill::TriageTick);
return triage_tick(source, target, results, tick_skill);
}
fn triage_tick(source: &mut Cryp, target: &mut Cryp, mut results: Resolutions, skill: Skill) -> Resolutions {
let amount = source.green_damage().pct(skill.multiplier());
target.deal_green_damage(Skill::TriageTick, amount)
target.deal_green_damage(skill, amount)
.into_iter()
.for_each(|e| results.push(Resolution::new(source, target).event(e)));
return results;
@ -1356,17 +1510,18 @@ fn debuff(source: &mut Cryp, target: &mut Cryp, mut results: Resolutions, skill:
fn decay(source: &mut Cryp, target: &mut Cryp, mut results: Resolutions, skill: Skill) -> Resolutions {
skill.effect().into_iter().for_each(|e| {
let CrypEffect { effect, duration: _, meta: _, tick: _ } = e;
let apply_effect = match effect {
Effect::Wither => e.clone(),
Effect::Decay => e.clone().set_tick(Cast::new_tick(source, target, Skill::DecayTick)),
_ => panic!("wrong decay effects"),
};
results.push(Resolution::new(source, target).event(target.add_effect(skill, apply_effect)));
});
let wither = skill.effect().first().unwrap().clone();
results.push(Resolution::new(source, target).event(target.add_effect(skill, wither)));
return decay_tick(source, target, results, Skill::DecayTick);
let CrypEffect { effect, duration, meta, tick: _ } = skill.effect().last().unwrap().clone();
let tick_skill = match meta {
Some(EffectMeta::SkillTick(s)) => s,
_ => panic!("no decay tick skill"),
};
let decay = CrypEffect::new(effect, duration).set_tick(Cast::new_tick(source, target, tick_skill));
results.push(Resolution::new(source, target).event(target.add_effect(skill, decay)));
return decay_tick(source, target, results, tick_skill);
}
fn decay_tick(source: &mut Cryp, target: &mut Cryp, mut results: Resolutions, skill: Skill) -> Resolutions {
@ -1610,7 +1765,7 @@ mod tests {
let mut y = Cryp::new()
.named(&"camel".to_string());
decay(&mut x, &mut y, vec![], Skill::Decay);
decay(&mut x, &mut y, vec![], Skill::DecayI);
assert!(y.effects.iter().any(|e| e.effect == Effect::Decay));
@ -1809,7 +1964,7 @@ mod tests {
y.deal_red_damage(Skill::Attack, 5);
let prev_hp = y.green_life();
triage(&mut x, &mut y, vec![], Skill::Triage);
triage(&mut x, &mut y, vec![], Skill::TriageI);
assert!(y.effects.iter().any(|e| e.effect == Effect::Triage));
assert!(y.green_life() > prev_hp);
@ -1869,7 +2024,7 @@ mod tests {
let mut x = Cryp::new()
.named(&"muji".to_string());
decay(&mut x.clone(), &mut x, vec![], Skill::Decay);
decay(&mut x.clone(), &mut x, vec![], Skill::DecayI);
assert!(x.effects.iter().any(|e| e.effect == Effect::Decay));
purify(&mut x.clone(), &mut x, vec![], Skill::PurifyI);