parry and other T2/T3

This commit is contained in:
Mashy 2019-05-27 14:21:01 +10:00
parent 9aa6346be6
commit 88c3e97bc1
4 changed files with 335 additions and 188 deletions

View File

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

View File

@ -1166,7 +1166,7 @@ mod tests {
// should not be stunned because of parry // should not be stunned because of parry
assert!(game.player_by_id(x_player.id).unwrap().cryps[0].is_stunned() == false); assert!(game.player_by_id(x_player.id).unwrap().cryps[0].is_stunned() == false);
// riposte // riposte
assert_eq!(game.player_by_id(y_player.id).unwrap().cryps[0].green_life(), (1024 - x_cryp.red_damage().pct(Skill::Riposte.multiplier()))); assert_eq!(game.player_by_id(y_player.id).unwrap().cryps[0].green_life(), (1024 - x_cryp.red_damage().pct(Skill::RiposteI.multiplier())));
} }
#[test] #[test]
@ -1437,8 +1437,8 @@ mod tests {
game.cryp_by_id(x_cryp.id).unwrap().reduce_cooldowns(); game.cryp_by_id(x_cryp.id).unwrap().reduce_cooldowns();
} }
game.cryp_by_id(x_cryp.id).unwrap().learn_mut(Skill::Siphon); game.cryp_by_id(x_cryp.id).unwrap().learn_mut(Skill::SiphonI);
while game.cryp_by_id(x_cryp.id).unwrap().skill_on_cd(Skill::Siphon).is_some() { while game.cryp_by_id(x_cryp.id).unwrap().skill_on_cd(Skill::SiphonI).is_some() {
game.cryp_by_id(x_cryp.id).unwrap().reduce_cooldowns(); game.cryp_by_id(x_cryp.id).unwrap().reduce_cooldowns();
} }
@ -1476,7 +1476,7 @@ mod tests {
} }
}; };
game.add_skill(y_player.id, x_cryp.id, Some(y_cryp.id), Skill::Siphon).unwrap(); game.add_skill(y_player.id, x_cryp.id, Some(y_cryp.id), Skill::SiphonI).unwrap();
game.player_ready(x_player.id).unwrap(); game.player_ready(x_player.id).unwrap();
game.player_ready(y_player.id).unwrap(); game.player_ready(y_player.id).unwrap();
game = game.resolve_phase_start(); game = game.resolve_phase_start();

View File

@ -49,7 +49,9 @@ pub enum Item {
AmplifyI, AmplifyI,
AmplifyII, AmplifyII,
AmplifyIII, AmplifyIII,
Banish, BanishI,
BanishII,
BanishIII,
BlastI, BlastI,
BlastII, BlastII,
BlastIII, BlastIII,
@ -78,7 +80,9 @@ pub enum Item {
InvertI, InvertI,
InvertII, InvertII,
InvertIII, InvertIII,
Parry, ParryI,
ParryII,
ParryIII,
PurgeI, PurgeI,
PurgeII, PurgeII,
PurgeIII, PurgeIII,
@ -109,11 +113,15 @@ pub enum Item {
SnareI, SnareI,
SnareII, SnareII,
SnareIII, SnareIII,
Strangle, StrangleI,
StrangleII,
StrangleIII,
StrikeI, StrikeI,
StrikeII, StrikeII,
StrikeIII, StrikeIII,
Siphon, SiphonI,
SiphonII,
SiphonIII,
TauntI, TauntI,
TauntII, TauntII,
TauntIII, TauntIII,
@ -230,7 +238,9 @@ impl Item {
Item::AmplifyI => Some(Skill::AmplifyI), Item::AmplifyI => Some(Skill::AmplifyI),
Item::AmplifyII => Some(Skill::AmplifyII), Item::AmplifyII => Some(Skill::AmplifyII),
Item::AmplifyIII => Some(Skill::AmplifyIII), Item::AmplifyIII => Some(Skill::AmplifyIII),
Item::Banish => Some(Skill::Banish), Item::BanishI => Some(Skill::BanishI),
Item::BanishII => Some(Skill::BanishII),
Item::BanishIII => Some(Skill::BanishIII),
Item::BlastI => Some(Skill::BlastI), Item::BlastI => Some(Skill::BlastI),
Item::BlastII => Some(Skill::BlastII), Item::BlastII => Some(Skill::BlastII),
Item::BlastIII => Some(Skill::BlastIII), Item::BlastIII => Some(Skill::BlastIII),
@ -258,7 +268,9 @@ impl Item {
Item::InvertI => Some(Skill::InvertI), Item::InvertI => Some(Skill::InvertI),
Item::InvertII => Some(Skill::InvertII), Item::InvertII => Some(Skill::InvertII),
Item::InvertIII => Some(Skill::InvertIII), Item::InvertIII => Some(Skill::InvertIII),
Item::Parry => Some(Skill::Parry), Item::ParryI => Some(Skill::ParryI),
Item::ParryII => Some(Skill::ParryII),
Item::ParryIII => Some(Skill::ParryIII),
Item::PurgeI => Some(Skill::PurgeI), Item::PurgeI => Some(Skill::PurgeI),
Item::PurgeII => Some(Skill::PurgeII), Item::PurgeII => Some(Skill::PurgeII),
Item::PurgeIII => Some(Skill::PurgeIII), Item::PurgeIII => Some(Skill::PurgeIII),
@ -286,11 +298,15 @@ impl Item {
Item::SleepI => Some(Skill::SleepI), Item::SleepI => Some(Skill::SleepI),
Item::SleepII => Some(Skill::SleepII), Item::SleepII => Some(Skill::SleepII),
Item::SleepIII => Some(Skill::SleepIII), Item::SleepIII => Some(Skill::SleepIII),
Item::Siphon => Some(Skill::Siphon), Item::SiphonI => Some(Skill::SiphonI),
Item::SiphonII => Some(Skill::SiphonII),
Item::SiphonIII => Some(Skill::SiphonIII),
Item::SnareI => Some(Skill::SnareI), Item::SnareI => Some(Skill::SnareI),
Item::SnareII => Some(Skill::SnareII), Item::SnareII => Some(Skill::SnareII),
Item::SnareIII => Some(Skill::SnareIII), Item::SnareIII => Some(Skill::SnareIII),
Item::Strangle => Some(Skill::Strangle), Item::StrangleI => Some(Skill::StrangleI),
Item::StrangleII => Some(Skill::StrangleII),
Item::StrangleIII => Some(Skill::StrangleIII),
Item::Stun => Some(Skill::Stun), Item::Stun => Some(Skill::Stun),
Item::StrikeI => Some(Skill::StrikeI), Item::StrikeI => Some(Skill::StrikeI),
Item::StrikeII => Some(Skill::StrikeII), Item::StrikeII => Some(Skill::StrikeII),
@ -413,7 +429,9 @@ impl Item {
self.into_skill().unwrap().effect().first().unwrap().get_multiplier() - 100, self.into_skill().unwrap().effect().first().unwrap().get_multiplier() - 100,
self.into_skill().unwrap().effect().first().unwrap().get_duration()), self.into_skill().unwrap().effect().first().unwrap().get_duration()),
Item::Banish => format!("Banish target for {:?}T. Item::BanishI |
Item::BanishII |
Item::BanishIII => format!("Banish target for {:?}T.
Banished cryps are immune to all skills and effects.", Banished cryps are immune to all skills and effects.",
self.into_skill().unwrap().effect().first().unwrap().get_duration()), self.into_skill().unwrap().effect().first().unwrap().get_duration()),
@ -491,12 +509,14 @@ impl Item {
"Reverse healing into damage and damage into healing. "Reverse healing into damage and damage into healing.
Any excess red or blue damage is converted into shield recharge."), Any excess red or blue damage is converted into shield recharge."),
Item::Parry => format!("{} {:?}% red power and blocks red skills for {:?}T. {} {:?}% red power.", Item::ParryI |
Item::ParryII |
Item::ParryIII => format!("{} {:?}% red power and blocks red skills for {:?}T. {} {:?}% red power.",
"Self targetting skill. Recharges RedLife for", "Self targetting skill. Recharges RedLife for",
self.into_skill().unwrap().multiplier(), self.into_skill().unwrap().multiplier(),
self.into_skill().unwrap().effect().first().unwrap().get_duration(), self.into_skill().unwrap().effect().first().unwrap().get_duration(),
"If a red skill is parried the cryp will riposte the source dealing red damage", "If a red skill is parried the cryp will riposte the source dealing red damage",
Skill::Riposte.multiplier()), Skill::RiposteI.multiplier()),
Item::PurgeI | Item::PurgeI |
Item::PurgeII | Item::PurgeII |
@ -560,7 +580,9 @@ impl Item {
self.into_skill().unwrap().multiplier(), self.into_skill().unwrap().multiplier(),
"Deals 35% more damage per red skill on target"), "Deals 35% more damage per red skill on target"),
Item::Strangle => format!( Item::StrangleI |
Item::StrangleII |
Item::StrangleIII => format!(
"Strangle the target disabling skills from both the caster and the target. "Strangle the target disabling skills from both the caster and the target.
While strangling deal red damage each turn {:?}% red power. Lasts {:?}T.", While strangling deal red damage each turn {:?}% red power. Lasts {:?}T.",
self.into_skill().unwrap().multiplier(), self.into_skill().unwrap().multiplier(),
@ -572,7 +594,9 @@ impl Item {
"Hits at maximum speed dealing red damage {:?}% red power", "Hits at maximum speed dealing red damage {:?}% red power",
self.into_skill().unwrap().multiplier()), self.into_skill().unwrap().multiplier()),
Item::Siphon => format!( Item::SiphonI |
Item::SiphonII |
Item::SiphonIII => format!(
"Deals blue damage {:?}% blue power each turn and heals caster based on damage dealt. Lasts {:?}T", "Deals blue damage {:?}% blue power each turn and heals caster based on damage dealt. Lasts {:?}T",
self.into_skill().unwrap().multiplier(), self.into_skill().unwrap().multiplier(),
self.into_skill().unwrap().effect().first().unwrap().get_duration()), self.into_skill().unwrap().effect().first().unwrap().get_duration()),
@ -607,87 +631,95 @@ impl Item {
fn combo(&self) -> Vec<Item> { fn combo(&self) -> Vec<Item> {
match self { match self {
Item::TauntI => vec![Item::Buff, Item::Red, Item::Red], Item::TauntI => vec![Item::Buff, Item::Red, Item::Red],
Item::TauntII => vec![Item::TauntI, Item::TauntI, Item::TauntI], Item::TauntII => vec![Item::TauntI, Item::TauntI, Item::TauntI],
Item::TauntIII => vec![Item::TauntII, Item::TauntII, Item::TauntII], Item::TauntIII => vec![Item::TauntII, Item::TauntII, Item::TauntII],
Item::TriageI => 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::TriageII => vec![Item::TriageI, Item::TriageI, Item::TriageI],
Item::TriageIII => vec![Item::TriageII, Item::TriageII, Item::TriageII], Item::TriageIII => vec![Item::TriageII, Item::TriageII, Item::TriageII],
Item::ScatterI => vec![Item::Buff, Item::Blue, Item::Blue], Item::ScatterI => vec![Item::Buff, Item::Blue, Item::Blue],
Item::ScatterII => vec![Item::ScatterI, Item::ScatterI, Item::ScatterI], Item::ScatterII => vec![Item::ScatterI, Item::ScatterI, Item::ScatterI],
Item::ScatterIII => vec![Item::ScatterIII, Item::ScatterIII, Item::ScatterIII], Item::ScatterIII => vec![Item::ScatterIII, Item::ScatterIII, Item::ScatterIII],
Item::Haste => vec![Item::Buff, Item::Red, Item::Green], Item::Haste => vec![Item::Buff, Item::Red, Item::Green],
Item::Impurity => vec![Item::Buff, Item::Green, Item::Blue], Item::Impurity => vec![Item::Buff, Item::Green, Item::Blue],
Item::AmplifyI => vec![Item::Buff, Item::Red, Item::Blue], Item::AmplifyI => vec![Item::Buff, Item::Red, Item::Blue],
Item::AmplifyII => vec![Item::AmplifyI, Item::AmplifyI, Item::AmplifyI], Item::AmplifyII => vec![Item::AmplifyI, Item::AmplifyI, Item::AmplifyI],
Item::AmplifyIII => vec![Item::AmplifyII, Item::AmplifyII, Item::AmplifyII], Item::AmplifyIII => vec![Item::AmplifyII, Item::AmplifyII, Item::AmplifyII],
Item::SnareI => vec![Item::Debuff, Item::Red, Item::Red], Item::SnareI => vec![Item::Debuff, Item::Red, Item::Red],
Item::SnareII => vec![Item::SnareI, Item::SnareI, Item::SnareI], Item::SnareII => vec![Item::SnareI, Item::SnareI, Item::SnareI],
Item::SnareIII => vec![Item::SnareII, Item::SnareII, Item::SnareII], Item::SnareIII => vec![Item::SnareII, Item::SnareII, Item::SnareII],
Item::PurgeI => vec![Item::Debuff, Item::Green, Item::Green], // Needs flavour Item::PurgeI => vec![Item::Debuff, Item::Green, Item::Green], // Needs flavour
Item::PurgeII => vec![Item::PurgeI, Item::PurgeI, Item::PurgeI], // Needs flavour Item::PurgeII => vec![Item::PurgeI, Item::PurgeI, Item::PurgeI], // Needs flavour
Item::PurgeIII => vec![Item::PurgeII, Item::PurgeII, Item::PurgeII], // Needs flavour Item::PurgeIII => vec![Item::PurgeII, Item::PurgeII, Item::PurgeII], // Needs flavour
Item::SilenceI => vec![Item::Debuff, Item::Blue, Item::Blue], Item::SilenceI => vec![Item::Debuff, Item::Blue, Item::Blue],
Item::SilenceII => vec![Item::SilenceI, Item::SilenceI, Item::SilenceI], Item::SilenceII => vec![Item::SilenceI, Item::SilenceI, Item::SilenceI],
Item::SilenceIII => vec![Item::SilenceII, Item::SilenceII, Item::SilenceII], Item::SilenceIII => vec![Item::SilenceII, Item::SilenceII, Item::SilenceII],
Item::CurseI => vec![Item::Debuff, Item::Red, Item::Green], Item::CurseI => vec![Item::Debuff, Item::Red, Item::Green],
Item::CurseII => vec![Item::CurseI, Item::CurseI, Item::CurseI], Item::CurseII => vec![Item::CurseI, Item::CurseI, Item::CurseI],
Item::CurseIII => vec![Item::CurseII, Item::CurseII, Item::CurseII], Item::CurseIII => vec![Item::CurseII, Item::CurseII, Item::CurseII],
Item::DecayI => 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::DecayII => vec![Item::DecayI, Item::DecayI, Item::DecayI],
Item::DecayIII => vec![Item::DecayII, Item::DecayII, Item::DecayII], Item::DecayIII => vec![Item::DecayII, Item::DecayII, Item::DecayII],
Item::InvertI => vec![Item::Debuff, Item::Red, Item::Blue], Item::InvertI => vec![Item::Debuff, Item::Red, Item::Blue],
Item::InvertII => vec![Item::InvertI, Item::InvertI, Item::InvertI], Item::InvertII => vec![Item::InvertI, Item::InvertI, Item::InvertI],
Item::InvertIII => vec![Item::InvertII, Item::InvertII, Item::InvertII], Item::InvertIII => vec![Item::InvertII, Item::InvertII, Item::InvertII],
Item::Parry => vec![Item::Block, Item::Red, Item::Red], // Add red recharge Item::ParryI => vec![Item::Block, Item::Red, Item::Red],
Item::PurifyI => vec![Item::Block, Item::Green, Item::Green], Item::ParryII => vec![Item::ParryI, Item::ParryI, Item::ParryI],
Item::PurifyII => vec![Item::PurifyI, Item::PurifyI, Item::PurifyI], Item::ParryIII => vec![Item::ParryII, Item::ParryII, Item::ParryII], // Add red recharge
Item::PurifyIII => vec![Item::PurifyII, Item::PurifyII, Item::PurifyII], Item::PurifyI => vec![Item::Block, Item::Green, Item::Green],
Item::Corrupt => vec![Item::Block, Item::Blue, Item::Blue], Item::PurifyII => vec![Item::PurifyI, Item::PurifyI, Item::PurifyI],
Item::ClutchI => vec![Item::Block, Item::Red, Item::Green], Item::PurifyIII => vec![Item::PurifyII, Item::PurifyII, Item::PurifyII],
Item::ClutchII => vec![Item::ClutchI, Item::ClutchI, Item::ClutchI], Item::Corrupt => vec![Item::Block, Item::Blue, Item::Blue],
Item::ClutchIII => vec![Item::ClutchII, Item::ClutchII, Item::ClutchII], Item::ClutchI => vec![Item::Block, Item::Red, Item::Green],
Item::ReflectI => vec![Item::Block, Item::Green, Item::Blue], Item::ClutchII => vec![Item::ClutchI, Item::ClutchI, Item::ClutchI],
Item::ReflectII => vec![Item::ReflectI, Item::ReflectI, Item::ReflectI], Item::ClutchIII => vec![Item::ClutchII, Item::ClutchII, Item::ClutchII],
Item::ReflectIII => vec![Item::ReflectII, Item::ReflectII, Item::ReflectII], Item::ReflectI => vec![Item::Block, Item::Green, Item::Blue],
Item::RechargeI => vec![Item::Block, Item::Red, Item::Blue], Item::ReflectII => vec![Item::ReflectI, Item::ReflectI, Item::ReflectI],
Item::RechargeII => vec![Item::RechargeI, Item::RechargeI, Item::RechargeI], Item::ReflectIII => vec![Item::ReflectII, Item::ReflectII, Item::ReflectII],
Item::RechargeIII => vec![Item::RechargeII, Item::RechargeII, Item::RechargeII], Item::RechargeI => vec![Item::Block, Item::Red, Item::Blue],
Item::RechargeII => vec![Item::RechargeI, Item::RechargeI, Item::RechargeI],
Item::RechargeIII => vec![Item::RechargeII, Item::RechargeII, Item::RechargeII],
Item::Strangle => vec![Item::Stun, Item::Red, Item::Red], Item::StrangleI => vec![Item::Stun, Item::Red, Item::Red],
Item::SleepI => vec![Item::Stun, Item::Green, Item::Green], Item::StrangleII => vec![Item::StrangleI, Item::StrangleI, Item::StrangleI],
Item::SleepII => vec![Item::SleepI, Item::SleepI, Item::SleepI], Item::StrangleIII => vec![Item::StrangleII, Item::StrangleII, Item::StrangleII],
Item::SleepIII => vec![Item::SleepII, Item::SleepII, Item::SleepII], Item::SleepI => vec![Item::Stun, Item::Green, Item::Green],
Item::RuinI => vec![Item::Stun, Item::Blue, Item::Blue], Item::SleepII => vec![Item::SleepI, Item::SleepI, Item::SleepI],
Item::RuinII => vec![Item::RuinI, Item::RuinI, Item::RuinI], Item::SleepIII => vec![Item::SleepII, Item::SleepII, Item::SleepII],
Item::RuinIII => vec![Item::RuinII, Item::RuinII, Item::RuinII], Item::RuinI => vec![Item::Stun, Item::Blue, Item::Blue],
Item::ThrowI => vec![Item::Stun, Item::Red, Item::Green], Item::RuinII => vec![Item::RuinI, Item::RuinI, Item::RuinI],
Item::ThrowII => vec![Item::ThrowI, Item::ThrowI, Item::ThrowI], Item::RuinIII => vec![Item::RuinII, Item::RuinII, Item::RuinII],
Item::ThrowIII => vec![Item::ThrowII, Item::ThrowII, Item::ThrowII], Item::ThrowI => vec![Item::Stun, Item::Red, Item::Green],
Item::HexI => vec![Item::Stun, Item::Green, Item::Blue], Item::ThrowII => vec![Item::ThrowI, Item::ThrowI, Item::ThrowI],
Item::HexII => vec![Item::HexI, Item::HexI, Item::HexI], Item::ThrowIII => vec![Item::ThrowII, Item::ThrowII, Item::ThrowII],
Item::HexIII => vec![Item::HexII, Item::HexII, Item::HexII], Item::HexI => vec![Item::Stun, Item::Green, Item::Blue],
Item::Banish => vec![Item::Stun, Item::Red, Item::Blue], Item::HexII => vec![Item::HexI, Item::HexI, Item::HexI],
Item::HexIII => vec![Item::HexII, Item::HexII, Item::HexII],
Item::BanishI => vec![Item::Stun, Item::Red, Item::Blue],
Item::BanishII => vec![Item::BanishI, Item::BanishI, Item::BanishI],
Item::BanishIII => vec![Item::BanishII, Item::BanishII, Item::BanishII],
Item::StrikeI => vec![Item::Attack, Item::Red, Item::Red], Item::StrikeI => vec![Item::Attack, Item::Red, Item::Red],
Item::StrikeII => vec![Item::StrikeI, Item::StrikeI, Item::StrikeI], Item::StrikeII => vec![Item::StrikeI, Item::StrikeI, Item::StrikeI],
Item::StrikeIII => vec![Item::StrikeII, Item::StrikeII, Item::StrikeII], Item::StrikeIII => vec![Item::StrikeII, Item::StrikeII, Item::StrikeII],
Item::HealI => vec![Item::Attack, Item::Green, Item::Green], Item::HealI => vec![Item::Attack, Item::Green, Item::Green],
Item::HealII => vec![Item::HealI, Item::HealI, Item::HealI], Item::HealII => vec![Item::HealI, Item::HealI, Item::HealI],
Item::HealIII => vec![Item::HealII, Item::HealII, Item::HealII], Item::HealIII => vec![Item::HealII, Item::HealII, Item::HealII],
Item::BlastI => vec![Item::Attack, Item::Blue, Item::Blue], Item::BlastI => vec![Item::Attack, Item::Blue, Item::Blue],
Item::BlastII => vec![Item::BlastI, Item::BlastI, Item::BlastI], Item::BlastII => vec![Item::BlastI, Item::BlastI, Item::BlastI],
Item::BlastIII => vec![Item::BlastII, Item::BlastII, Item::BlastII], Item::BlastIII => vec![Item::BlastII, Item::BlastII, Item::BlastII],
Item::SlayI => vec![Item::Attack, Item::Red, Item::Green], Item::SlayI => vec![Item::Attack, Item::Red, Item::Green],
Item::SlayII => vec![Item::SlayI, Item::SlayI, Item::SlayI], Item::SlayII => vec![Item::SlayI, Item::SlayI, Item::SlayI],
Item::SlayIII => vec![Item::SlayII, Item::SlayII, Item::SlayII], Item::SlayIII => vec![Item::SlayII, Item::SlayII, Item::SlayII],
Item::Siphon => vec![Item::Attack, Item::Green, Item::Blue], Item::SiphonI => vec![Item::Attack, Item::Green, Item::Blue],
Item::ChaosI => vec![Item::Attack, Item::Red, Item::Blue], Item::SiphonII => vec![Item::SiphonI, Item::SiphonI, Item::SiphonI],
Item::ChaosII => vec![Item::ChaosI, Item::ChaosI, Item::ChaosI], Item::SiphonIII => vec![Item::SiphonII, Item::SiphonII, Item::SiphonII],
Item::ChaosIII => vec![Item::ChaosII, Item::ChaosII, Item::ChaosII], Item::ChaosI => vec![Item::Attack, Item::Red, Item::Blue],
Item::ChaosII => vec![Item::ChaosI, Item::ChaosI, Item::ChaosI],
Item::ChaosIII => vec![Item::ChaosII, Item::ChaosII, Item::ChaosII],
Item::RedDamageI => vec![Item::Damage, Item::Red, Item::Red], Item::RedDamageI => vec![Item::Damage, Item::Red, Item::Red],
Item::GreenDamageI => vec![Item::Damage, Item::Green, Item::Green], Item::GreenDamageI => vec![Item::Damage, Item::Green, Item::Green],
@ -722,7 +754,9 @@ impl From<Skill> for Item {
Skill::AmplifyII => Item::AmplifyII, Skill::AmplifyII => Item::AmplifyII,
Skill::AmplifyIII => Item::AmplifyIII, Skill::AmplifyIII => Item::AmplifyIII,
Skill::Attack => Item::Attack, Skill::Attack => Item::Attack,
Skill::Banish => Item::Banish, Skill::BanishI => Item::BanishI,
Skill::BanishII => Item::BanishII,
Skill::BanishIII => Item::BanishIII,
Skill::BlastI => Item::BlastI, Skill::BlastI => Item::BlastI,
Skill::BlastII => Item::BlastII, Skill::BlastII => Item::BlastII,
Skill::BlastIII => Item::BlastIII, Skill::BlastIII => Item::BlastIII,
@ -753,7 +787,9 @@ impl From<Skill> for Item {
Skill::InvertI => Item::InvertI, Skill::InvertI => Item::InvertI,
Skill::InvertII => Item::InvertII, Skill::InvertII => Item::InvertII,
Skill::InvertIII => Item::InvertIII, Skill::InvertIII => Item::InvertIII,
Skill::Parry => Item::Parry, Skill::ParryI => Item::ParryI,
Skill::ParryII => Item::ParryII,
Skill::ParryIII => Item::ParryIII,
Skill::PurgeI => Item::PurgeI, Skill::PurgeI => Item::PurgeI,
Skill::PurgeII => Item::PurgeII, Skill::PurgeII => Item::PurgeII,
Skill::PurgeIII => Item::PurgeIII, Skill::PurgeIII => Item::PurgeIII,
@ -775,7 +811,9 @@ impl From<Skill> for Item {
Skill::SilenceI => Item::SilenceI, Skill::SilenceI => Item::SilenceI,
Skill::SilenceII => Item::SilenceII, Skill::SilenceII => Item::SilenceII,
Skill::SilenceIII => Item::SilenceIII, Skill::SilenceIII => Item::SilenceIII,
Skill::Siphon => Item::Siphon, Skill::SiphonI => Item::SiphonI,
Skill::SiphonII => Item::SiphonII,
Skill::SiphonIII => Item::SiphonIII,
Skill::SlayI => Item::SlayI, Skill::SlayI => Item::SlayI,
Skill::SlayII => Item::SlayII, Skill::SlayII => Item::SlayII,
Skill::SlayIII => Item::SlayIII, Skill::SlayIII => Item::SlayIII,
@ -785,7 +823,9 @@ impl From<Skill> for Item {
Skill::SnareI => Item::SnareI, Skill::SnareI => Item::SnareI,
Skill::SnareII => Item::SnareII, Skill::SnareII => Item::SnareII,
Skill::SnareIII => Item::SnareIII, Skill::SnareIII => Item::SnareIII,
Skill::Strangle => Item::Strangle, Skill::StrangleI => Item::StrangleI,
Skill::StrangleII => Item::StrangleII,
Skill::StrangleIII => Item::StrangleIII,
Skill::StrikeI => Item::StrikeI, Skill::StrikeI => Item::StrikeI,
Skill::StrikeII => Item::StrikeII, Skill::StrikeII => Item::StrikeII,
Skill::StrikeIII => Item::StrikeIII, Skill::StrikeIII => Item::StrikeIII,
@ -802,8 +842,6 @@ impl From<Skill> for Item {
Skill::Corrupt => Item::Corrupt, Skill::Corrupt => Item::Corrupt,
Skill::CorruptionTick => Item::Corrupt, Skill::CorruptionTick => Item::Corrupt,
Skill::SiphonTick => Item::Siphon,
Skill::StrangleTick => Item::Strangle,
Skill::TestTouch => Item::TestTouch, Skill::TestTouch => Item::TestTouch,
Skill::TestStun => Item::TestStun, Skill::TestStun => Item::TestStun,
@ -894,7 +932,9 @@ pub fn get_combos() -> Vec<Combo> {
Combo { components: Item::InvertII.combo(), item: Item::InvertII }, Combo { components: Item::InvertII.combo(), item: Item::InvertII },
Combo { components: Item::InvertIII.combo(), item: Item::InvertIII }, Combo { components: Item::InvertIII.combo(), item: Item::InvertIII },
Combo { components: Item::Parry.combo(), item: Item::Parry }, // Add red recharge Combo { components: Item::ParryI.combo(), item: Item::ParryI },
Combo { components: Item::ParryII.combo(), item: Item::ParryII },
Combo { components: Item::ParryIII.combo(), item: Item::ParryIII },
Combo { components: Item::PurifyI.combo(), item: Item::PurifyI }, Combo { components: Item::PurifyI.combo(), item: Item::PurifyI },
Combo { components: Item::PurifyII.combo(), item: Item::PurifyII }, Combo { components: Item::PurifyII.combo(), item: Item::PurifyII },
Combo { components: Item::PurifyIII.combo(), item: Item::PurifyIII }, Combo { components: Item::PurifyIII.combo(), item: Item::PurifyIII },
@ -911,10 +951,12 @@ pub fn get_combos() -> Vec<Combo> {
Combo { components: Item::RechargeII.combo(), item: Item::RechargeII }, Combo { components: Item::RechargeII.combo(), item: Item::RechargeII },
Combo { components: Item::RechargeIII.combo(), item: Item::RechargeIII }, Combo { components: Item::RechargeIII.combo(), item: Item::RechargeIII },
Combo { components: Item::Strangle.combo(), item: Item::Strangle }, Combo { components: Item::StrangleI.combo(), item: Item::StrangleI },
Combo { components: Item::StrangleII.combo(), item: Item::StrangleII },
Combo { components: Item::StrangleIII.combo(), item: Item::StrangleIII },
Combo { components: Item::SleepI.combo(), item: Item::SleepI }, Combo { components: Item::SleepI.combo(), item: Item::SleepI },
Combo { components: Item::SleepII.combo(), item: Item::SleepII }, Combo { components: Item::SleepII.combo(), item: Item::SleepII },
Combo { components: Item::SleepIII.combo(), item: Item::SleepIII }, Combo { components: Item::SleepIII.combo(), item: Item::SleepIII },
Combo { components: Item::RuinI.combo(), item: Item::RuinI }, Combo { components: Item::RuinI.combo(), item: Item::RuinI },
Combo { components: Item::RuinII.combo(), item: Item::RuinII }, Combo { components: Item::RuinII.combo(), item: Item::RuinII },
Combo { components: Item::RuinIII.combo(), item: Item::RuinIII }, Combo { components: Item::RuinIII.combo(), item: Item::RuinIII },
@ -926,7 +968,9 @@ pub fn get_combos() -> Vec<Combo> {
Combo { components: Item::HexI.combo(), item: Item::HexI }, Combo { components: Item::HexI.combo(), item: Item::HexI },
Combo { components: Item::HexII.combo(), item: Item::HexII }, Combo { components: Item::HexII.combo(), item: Item::HexII },
Combo { components: Item::HexIII.combo(), item: Item::HexIII }, Combo { components: Item::HexIII.combo(), item: Item::HexIII },
Combo { components: Item::Banish.combo(), item: Item::Banish }, Combo { components: Item::BanishI.combo(), item: Item::BanishI },
Combo { components: Item::BanishII.combo(), item: Item::BanishII },
Combo { components: Item::BanishIII.combo(), item: Item::BanishIII },
Combo { components: Item::StrikeI.combo(), item: Item::StrikeI }, Combo { components: Item::StrikeI.combo(), item: Item::StrikeI },
Combo { components: Item::StrikeII.combo(), item: Item::StrikeII }, Combo { components: Item::StrikeII.combo(), item: Item::StrikeII },
@ -941,7 +985,9 @@ pub fn get_combos() -> Vec<Combo> {
Combo { components: Item::SlayI.combo(), item: Item::SlayI }, Combo { components: Item::SlayI.combo(), item: Item::SlayI },
Combo { components: Item::SlayII.combo(), item: Item::SlayII }, Combo { components: Item::SlayII.combo(), item: Item::SlayII },
Combo { components: Item::SlayIII.combo(), item: Item::SlayIII }, Combo { components: Item::SlayIII.combo(), item: Item::SlayIII },
Combo { components: Item::Siphon.combo(), item: Item::Siphon }, Combo { components: Item::SiphonI.combo(), item: Item::SiphonI },
Combo { components: Item::SiphonII.combo(), item: Item::SiphonII },
Combo { components: Item::SiphonIII.combo(), item: Item::SiphonIII },
Combo { components: Item::ChaosI.combo(), item: Item::ChaosI }, Combo { components: Item::ChaosI.combo(), item: Item::ChaosI },
Combo { components: Item::ChaosII.combo(), item: Item::ChaosII }, Combo { components: Item::ChaosII.combo(), item: Item::ChaosII },
Combo { components: Item::ChaosIII.combo(), item: Item::ChaosIII }, Combo { components: Item::ChaosIII.combo(), item: Item::ChaosIII },

View File

@ -91,7 +91,7 @@ pub fn resolve(skill: Skill, source: &mut Cryp, target: &mut Cryp, mut resolutio
match skill { match skill {
Skill::BlastI | Skill::BlastI |
Skill::ChaosI | Skill::ChaosI |
Skill::Siphon => { Skill::SiphonI => {
let amount = source.green_damage().pct(Skill::ImpureBlast.multiplier()); let amount = source.green_damage().pct(Skill::ImpureBlast.multiplier());
target.deal_blue_damage(Skill::ImpureBlast, amount) target.deal_blue_damage(Skill::ImpureBlast, amount)
.into_iter() .into_iter()
@ -116,7 +116,9 @@ pub fn resolve(skill: Skill, source: &mut Cryp, target: &mut Cryp, mut resolutio
Skill::AmplifyII | Skill::AmplifyII |
Skill::AmplifyIII => amplify(source, target, resolutions, skill), Skill::AmplifyIII => amplify(source, target, resolutions, skill),
Skill::Banish => banish(source, target, resolutions, skill), // TODO prevent all actions Skill::BanishI |
Skill::BanishII |
Skill::BanishIII => banish(source, target, resolutions, skill), // TODO prevent all actions
Skill::BlastI | Skill::BlastI |
Skill::BlastII | Skill::BlastII |
@ -161,7 +163,9 @@ pub fn resolve(skill: Skill, source: &mut Cryp, target: &mut Cryp, mut resolutio
Skill::InvertII | Skill::InvertII |
Skill::InvertIII => invert(source, target, resolutions, skill), Skill::InvertIII => invert(source, target, resolutions, skill),
Skill::Parry => parry(source, target, resolutions, skill), Skill::ParryI |
Skill::ParryII |
Skill::ParryIII => parry(source, target, resolutions, skill),
Skill::PurgeI | Skill::PurgeI |
Skill::PurgeII | Skill::PurgeII |
@ -191,8 +195,12 @@ pub fn resolve(skill: Skill, source: &mut Cryp, target: &mut Cryp, mut resolutio
Skill::SilenceII | Skill::SilenceII |
Skill::SilenceIII => silence(source, target, resolutions, skill), // target cannot cast spells Skill::SilenceIII => silence(source, target, resolutions, skill), // target cannot cast spells
Skill::Siphon => siphon(source, target, resolutions, skill), Skill::SiphonI |
Skill::SiphonTick => siphon_tick(source, target, resolutions, skill), // hot Skill::SiphonII |
Skill::SiphonIII => siphon(source, target, resolutions, skill), // dot
Skill::SiphonTickI |
Skill::SiphonTickII |
Skill::SiphonTickIII => siphon_tick(source, target, resolutions, skill), // dot
Skill::SlayI | Skill::SlayI |
Skill::SlayII | Skill::SlayII |
@ -206,8 +214,12 @@ pub fn resolve(skill: Skill, source: &mut Cryp, target: &mut Cryp, mut resolutio
Skill::SnareII | Skill::SnareII |
Skill::SnareIII => snare(source, target, resolutions, skill), Skill::SnareIII => snare(source, target, resolutions, skill),
Skill::Strangle => strangle(source, target, resolutions, skill), Skill::StrangleI |
Skill::StrangleTick => strangle_tick(source, target, resolutions, skill), Skill::StrangleII |
Skill::StrangleIII => strangle(source, target, resolutions, skill),
Skill::StrangleTickI |
Skill::StrangleTickII |
Skill::StrangleTickIII => strangle_tick(source, target, resolutions, skill),
Skill::StrikeI | Skill::StrikeI |
Skill::StrikeII | Skill::StrikeII |
@ -239,7 +251,9 @@ pub fn resolve(skill: Skill, source: &mut Cryp, target: &mut Cryp, mut resolutio
//Triggered //Triggered
Skill::HasteStrike => panic!("should only trigger from haste"), Skill::HasteStrike => panic!("should only trigger from haste"),
Skill::ImpureBlast => panic!("should only trigger from impurity"), Skill::ImpureBlast => panic!("should only trigger from impurity"),
Skill::Riposte => panic!("should only trigger from parry"), Skill::RiposteI |
Skill::RiposteII |
Skill::RiposteIII => panic!("should only trigger from parry"),
// Not used // Not used
@ -252,8 +266,8 @@ pub fn resolve(skill: Skill, source: &mut Cryp, target: &mut Cryp, mut resolutio
Skill::TestTouch => touch(source, target, resolutions, skill), Skill::TestTouch => touch(source, target, resolutions, skill),
Skill::TestStun => stun(source, target, resolutions, Skill::Stun), Skill::TestStun => stun(source, target, resolutions, Skill::Stun),
Skill::TestBlock => block(source, target, resolutions, Skill::Block), Skill::TestBlock => block(source, target, resolutions, Skill::Block),
Skill::TestParry => parry(source, target, resolutions, Skill::Parry), Skill::TestParry => parry(source, target, resolutions, Skill::ParryI),
Skill::TestSiphon => siphon(source, target, resolutions, Skill::Siphon), Skill::TestSiphon => siphon(source, target, resolutions, Skill::SiphonI),
}; };
return resolutions; return resolutions;
@ -283,8 +297,15 @@ fn post_resolve(_skill: Skill, game: &mut Game, mut resolutions: Resolutions) ->
Event::Immunity { skill: _, immunity } => match immunity.contains(&Effect::Parry) { Event::Immunity { skill: _, immunity } => match immunity.contains(&Effect::Parry) {
true => { true => {
resolutions = riposte(&mut target, &mut source, resolutions, Skill::Riposte); let im_targ = target.clone();
} let CrypEffect { effect: _, duration: _, meta, tick: _ } = im_targ.effects.iter()
.find(|e| e.effect == Effect::Parry).unwrap();
let &riposte_skill = match meta {
Some(EffectMeta::Skill(s)) => s,
_ => panic!("no parry skill"),
};
resolutions = riposte(&mut target, &mut source, resolutions, riposte_skill);
},
false => (), false => (),
}, },
_ => (), _ => (),
@ -472,18 +493,20 @@ impl Effect {
Effect::Clutch => [ Effect::Clutch => [
Skill::Stun, Skill::Stun,
Skill::HexI, Skill::HexI,
Skill::HexII, Skill::HexII,
Skill::HexIII, Skill::HexIII,
Skill::SilenceI, Skill::SilenceI,
Skill::SilenceII, Skill::SilenceII,
Skill::SilenceIII, Skill::SilenceIII,
Skill::RuinI, Skill::RuinI,
Skill::RuinII, Skill::RuinII,
Skill::RuinIII, Skill::RuinIII,
Skill::Strangle, Skill::StrangleI,
Skill::StrangleII,
Skill::StrangleIII,
Skill::SnareI, Skill::SnareI,
Skill::SnareII, Skill::SnareII,
Skill::SnareIII Skill::SnareIII
].contains(&skill), ].contains(&skill),
Effect::Injured => skill.colours().contains(&Colour::Green), Effect::Injured => skill.colours().contains(&Colour::Green),
_ => false, _ => false,
@ -500,7 +523,12 @@ impl Effect {
Effect::Hex => true, Effect::Hex => true,
Effect::Banish => true, Effect::Banish => true,
Effect::Strangle => true, Effect::Strangle => true,
Effect::Strangling => skill != Skill::StrangleTick, Effect::Strangling => match skill {
Skill::StrangleTickI |
Skill::StrangleTickII |
Skill::StrangleTickIII => false,
_ => true,
},
Effect::Silence => skill.colours().contains(&Colour::Blue), Effect::Silence => skill.colours().contains(&Colour::Blue),
Effect::Snare => skill.colours().contains(&Colour::Red), Effect::Snare => skill.colours().contains(&Colour::Red),
Effect::Ko => skill.ko_castable(), Effect::Ko => skill.ko_castable(),
@ -635,7 +663,9 @@ pub enum Skill {
AmplifyII, AmplifyII,
AmplifyIII, AmplifyIII,
Banish, BanishI,
BanishII,
BanishIII,
BlastI, BlastI,
BlastII, BlastII,
@ -683,8 +713,9 @@ pub enum Skill {
InvertII, InvertII,
InvertIII, InvertIII,
Parry, // avoid all damage ParryI, // avoid all damage
ParryII,
ParryIII,
PurgeI, PurgeI,
PurgeII, PurgeII,
PurgeIII, PurgeIII,
@ -701,7 +732,9 @@ pub enum Skill {
ReflectII, ReflectII,
ReflectIII, ReflectIII,
Riposte, RiposteI,
RiposteII,
RiposteIII,
RuinI, RuinI,
RuinII, RuinII,
@ -715,8 +748,12 @@ pub enum Skill {
SilenceII, SilenceII,
SilenceIII, SilenceIII,
Siphon, SiphonI,
SiphonTick, SiphonII,
SiphonIII,
SiphonTickI,
SiphonTickII,
SiphonTickIII,
SlayI, SlayI,
SlayII, SlayII,
@ -730,8 +767,12 @@ pub enum Skill {
SnareII, SnareII,
SnareIII, SnareIII,
Strangle, StrangleI,
StrangleTick, StrangleII,
StrangleIII,
StrangleTickI,
StrangleTickII,
StrangleTickIII,
StrikeI, StrikeI,
StrikeII, StrikeII,
@ -780,7 +821,9 @@ impl Skill {
Skill::HealI => 130, //GG Skill::HealI => 130, //GG
Skill::HealII => 160, //GG Skill::HealII => 160, //GG
Skill::HealIII => 200, //GG Skill::HealIII => 200, //GG
Skill::SiphonTick => 40, // GB Skill::SiphonTickI => 40, // GB
Skill::SiphonTickII => 70,
Skill::SiphonTickIII => 110,
Skill::SlayI => 70, // RG Skill::SlayI => 70, // RG
Skill::SlayII => 90, Skill::SlayII => 90,
@ -792,8 +835,12 @@ impl Skill {
// Block Base // Block Base
Skill::CorruptionTick => 80, Skill::CorruptionTick => 80,
Skill::Parry => 110, Skill::ParryI => 110,
Skill::Riposte => 70, Skill::ParryII => 145,
Skill::ParryIII => 200,
Skill::RiposteI => 70,
Skill::RiposteII => 95,
Skill::RiposteIII => 120,
Skill::PurifyI => 45, //Green dmg (heal) Skill::PurifyI => 45, //Green dmg (heal)
Skill::PurifyII => 70, Skill::PurifyII => 70,
@ -811,7 +858,9 @@ impl Skill {
Skill::SleepI => 240, //Green dmg (heal) Skill::SleepI => 240, //Green dmg (heal)
Skill::SleepII => 300, Skill::SleepII => 300,
Skill::SleepIII => 400, Skill::SleepIII => 400,
Skill::StrangleTick => 65, Skill::StrangleTickI => 65,
Skill::StrangleTickII => 95,
Skill::StrangleTickIII => 140,
// Debuff Base // Debuff Base
Skill::DecayTickI => 25, Skill::DecayTickI => 25,
@ -851,7 +900,9 @@ impl Skill {
Skill::AmplifyIII => vec![CrypEffect {effect: Effect::Amplify, duration: 4, Skill::AmplifyIII => vec![CrypEffect {effect: Effect::Amplify, duration: 4,
meta: Some(EffectMeta::Multiplier(200)), tick: None}], meta: Some(EffectMeta::Multiplier(200)), tick: None}],
Skill::Banish => vec![CrypEffect {effect: Effect::Banish, duration: 1,meta: None, tick: None}], Skill::BanishI => vec![CrypEffect {effect: Effect::Banish, duration: 1,meta: None, tick: None}],
Skill::BanishII => vec![CrypEffect {effect: Effect::Banish, duration: 2,meta: None, tick: None}],
Skill::BanishIII => vec![CrypEffect {effect: Effect::Banish, duration: 3,meta: None, tick: None}],
Skill::Block => vec![CrypEffect {effect: Effect::Block, duration: 1, Skill::Block => vec![CrypEffect {effect: Effect::Block, duration: 1,
meta: Some(EffectMeta::Multiplier(50)), tick: None}], meta: Some(EffectMeta::Multiplier(50)), tick: None}],
Skill::Buff => vec![CrypEffect {effect: Effect::Buff, duration: 2, Skill::Buff => vec![CrypEffect {effect: Effect::Buff, duration: 2,
@ -876,13 +927,13 @@ impl Skill {
Skill::DecayI => vec![CrypEffect {effect: Effect::Wither, 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, CrypEffect {effect: Effect::Decay, duration: 3,
meta: Some(EffectMeta::SkillTick(Skill::DecayTickI)), tick: None}], meta: Some(EffectMeta::Skill(Skill::DecayTickI)), tick: None}],
Skill::DecayII => vec![CrypEffect {effect: Effect::Wither, duration: 3, meta: Some(EffectMeta::Multiplier(35)), tick: None }, Skill::DecayII => vec![CrypEffect {effect: Effect::Wither, duration: 3, meta: Some(EffectMeta::Multiplier(35)), tick: None },
CrypEffect {effect: Effect::Decay, duration: 3, CrypEffect {effect: Effect::Decay, duration: 3,
meta: Some(EffectMeta::SkillTick(Skill::DecayTickII)), tick: None}], meta: Some(EffectMeta::Skill(Skill::DecayTickII)), tick: None}],
Skill::DecayIII => vec![CrypEffect {effect: Effect::Wither, duration: 4, meta: Some(EffectMeta::Multiplier(20)), tick: None }, Skill::DecayIII => vec![CrypEffect {effect: Effect::Wither, duration: 4, meta: Some(EffectMeta::Multiplier(20)), tick: None },
CrypEffect {effect: Effect::Decay, duration: 4, CrypEffect {effect: Effect::Decay, duration: 4,
meta: Some(EffectMeta::SkillTick(Skill::DecayTickIII)), tick: None}], meta: Some(EffectMeta::Skill(Skill::DecayTickIII)), tick: None}],
Skill::Haste => vec![CrypEffect {effect: Effect::Haste, duration: 2, Skill::Haste => vec![CrypEffect {effect: Effect::Haste, duration: 2,
meta: Some(EffectMeta::Multiplier(150)), tick: None }], meta: Some(EffectMeta::Multiplier(150)), tick: None }],
@ -900,8 +951,13 @@ impl Skill {
Skill::InvertII => vec![CrypEffect {effect: Effect::Invert, duration: 3, 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::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::ParryI => vec![CrypEffect {effect: Effect::Parry, duration: 2,
meta: Some(EffectMeta::Skill(Skill::RiposteI)), tick: None}],
Skill::ParryII => vec![CrypEffect {effect: Effect::Parry, duration: 2,
meta: Some(EffectMeta::Skill(Skill::RiposteII)), tick: None}],
Skill::ParryIII => vec![CrypEffect {effect: Effect::Parry, duration: 2,
meta: Some(EffectMeta::Skill(Skill::RiposteIII)), tick: None}],
Skill::ReflectI => vec![CrypEffect {effect: Effect::Reflect, duration: 1, 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::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 }], Skill::ReflectIII => vec![CrypEffect {effect: Effect::Reflect, duration: 3, meta: None, tick: None }],
@ -925,7 +981,12 @@ impl Skill {
Skill::SilenceII => 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::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::SiphonI => vec![CrypEffect {effect: Effect::Siphon, duration: 2,
meta: Some(EffectMeta::Skill(Skill::SiphonTickI)), tick: None}],
Skill::SiphonII => vec![CrypEffect {effect: Effect::Siphon, duration: 3,
meta: Some(EffectMeta::Skill(Skill::SiphonTickII)), tick: None}],
Skill::SiphonIII => vec![CrypEffect {effect: Effect::Siphon, duration: 4,
meta: Some(EffectMeta::Skill(Skill::SiphonTickIII)), tick: None}],
Skill::SleepI => vec![CrypEffect {effect: Effect::Stun, 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::SleepII => vec![CrypEffect {effect: Effect::Stun, duration: 3, meta: None, tick: None}],
@ -935,7 +996,12 @@ impl Skill {
Skill::SnareII => vec![CrypEffect {effect: Effect::Snare, duration: 3, meta: None, tick: None}], Skill::SnareII => vec![CrypEffect {effect: Effect::Snare, duration: 3, meta: None, tick: None}],
Skill::SnareIII => vec![CrypEffect {effect: Effect::Snare, duration: 4, meta: None, tick: None}], Skill::SnareIII => vec![CrypEffect {effect: Effect::Snare, duration: 4, meta: None, tick: None}],
Skill::Strangle => vec![CrypEffect {effect: Effect::Strangle, duration: 2, meta: None, tick: None}], Skill::StrangleI => vec![CrypEffect {effect: Effect::Strangle, duration: 2,
meta: Some(EffectMeta::Skill(Skill::StrangleTickI)), tick: None}],
Skill::StrangleII => vec![CrypEffect {effect: Effect::Strangle, duration: 2,
meta: Some(EffectMeta::Skill(Skill::StrangleTickII)), tick: None}],
Skill::StrangleIII => vec![CrypEffect {effect: Effect::Strangle, duration: 2,
meta: Some(EffectMeta::Skill(Skill::StrangleTickIII)), tick: None}],
Skill::Stun => vec![CrypEffect {effect: Effect::Stun, 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::TauntI => vec![CrypEffect {effect: Effect::Taunt, duration: 2, meta: None, tick: None}],
@ -943,11 +1009,11 @@ impl Skill {
Skill::TauntIII => vec![CrypEffect {effect: Effect::Taunt, duration: 4, meta: None, tick: None}], Skill::TauntIII => vec![CrypEffect {effect: Effect::Taunt, duration: 4, meta: None, tick: None}],
Skill::TriageI => vec![CrypEffect {effect: Effect::Triage, duration: 2, Skill::TriageI => vec![CrypEffect {effect: Effect::Triage, duration: 2,
meta: Some(EffectMeta::SkillTick(Skill::TriageTickI)), tick: None}], meta: Some(EffectMeta::Skill(Skill::TriageTickI)), tick: None}],
Skill::TriageII => vec![CrypEffect {effect: Effect::Triage, duration: 3, Skill::TriageII => vec![CrypEffect {effect: Effect::Triage, duration: 3,
meta: Some(EffectMeta::SkillTick(Skill::TriageTickII)), tick: None}], meta: Some(EffectMeta::Skill(Skill::TriageTickII)), tick: None}],
Skill::TriageIII => vec![CrypEffect {effect: Effect::Triage, duration: 4, Skill::TriageIII => vec![CrypEffect {effect: Effect::Triage, duration: 4,
meta: Some(EffectMeta::SkillTick(Skill::TriageTickIII)), tick: None}], meta: Some(EffectMeta::Skill(Skill::TriageTickIII)), tick: None}],
//Unused //Unused
Skill::Injure => vec![CrypEffect {effect: Effect::Injured, duration: 2, meta: None, tick: None }], Skill::Injure => vec![CrypEffect {effect: Effect::Injured, duration: 2, meta: None, tick: None }],
@ -968,7 +1034,9 @@ impl Skill {
Skill::StrikeII => None, Skill::StrikeII => None,
Skill::StrikeIII => None, Skill::StrikeIII => None,
Skill::Block => None, // reduce damage Skill::Block => None, // reduce damage
Skill::Parry => Some(2), // avoid all damage Skill::ParryI |
Skill::ParryII |
Skill::ParryIII => Some(2), // avoid all damage
Skill::SnareI => Some(2), Skill::SnareI => Some(2),
Skill::SnareII => Some(2), Skill::SnareII => Some(2),
@ -1006,7 +1074,9 @@ impl Skill {
Skill::DecayI => Some(1), // dot Skill::DecayI => Some(1), // dot
Skill::DecayII => Some(1), Skill::DecayII => Some(1),
Skill::DecayIII => Some(1), Skill::DecayIII => Some(1),
Skill::Siphon => None, Skill::SiphonI |
Skill::SiphonII |
Skill::SiphonIII => None,
Skill::CurseI => Some(1), Skill::CurseI => Some(1),
Skill::CurseII => Some(1), Skill::CurseII => Some(1),
@ -1028,7 +1098,9 @@ impl Skill {
Skill::PurgeII => None, Skill::PurgeII => None,
Skill::PurgeIII => None, Skill::PurgeIII => None,
Skill::Banish => Some(1), Skill::BanishI => Some(1),
Skill::BanishII => Some(1),
Skill::BanishIII => Some(1),
Skill::HexI => Some(1), Skill::HexI => Some(1),
Skill::HexII => Some(2), Skill::HexII => Some(2),
@ -1055,7 +1127,9 @@ impl Skill {
Skill::SleepII => Some(3), Skill::SleepII => Some(3),
Skill::SleepIII => Some(3), Skill::SleepIII => Some(3),
Skill::Strangle => Some(2), Skill::StrangleI => Some(2),
Skill::StrangleII => Some(2),
Skill::StrangleIII => Some(2),
Skill::ClutchI => Some(1), Skill::ClutchI => Some(1),
Skill::ClutchII => Some(2), Skill::ClutchII => Some(2),
@ -1076,14 +1150,20 @@ impl Skill {
// Trigger // Trigger
Skill::ImpureBlast | Skill::ImpureBlast |
Skill::HasteStrike | Skill::HasteStrike |
Skill::Riposte | // parry Skill::RiposteI |
Skill::RiposteII |
Skill::RiposteIII | // parry
// Ticks // Ticks
Skill::CorruptionTick | Skill::CorruptionTick |
Skill::DecayTickI | Skill::DecayTickI |
Skill::DecayTickII | Skill::DecayTickII |
Skill::DecayTickIII | Skill::DecayTickIII |
Skill::SiphonTick | Skill::SiphonTickI |
Skill::StrangleTick | Skill::SiphonTickII |
Skill::SiphonTickIII |
Skill::StrangleTickI |
Skill::StrangleTickII |
Skill::StrangleTickIII |
Skill::TriageTickI | Skill::TriageTickI |
Skill::TriageTickII | Skill::TriageTickII |
Skill::TriageTickIII => None, Skill::TriageTickIII => None,
@ -1107,7 +1187,9 @@ impl Skill {
Skill::DecayTickI | Skill::DecayTickI |
Skill::DecayTickII | Skill::DecayTickII |
Skill::DecayTickIII | Skill::DecayTickIII |
Skill::SiphonTick | Skill::SiphonTickI |
Skill::SiphonTickII |
Skill::SiphonTickIII |
Skill::TriageTickI | Skill::TriageTickI |
Skill::TriageTickII | Skill::TriageTickII |
@ -1122,8 +1204,12 @@ impl Skill {
Skill::DecayTickI | Skill::DecayTickI |
Skill::DecayTickII | Skill::DecayTickII |
Skill::DecayTickIII | Skill::DecayTickIII |
Skill::SiphonTick | Skill::SiphonTickI |
Skill::StrangleTick | Skill::SiphonTickII |
Skill::SiphonTickIII |
Skill::StrangleTickI |
Skill::StrangleTickII |
Skill::StrangleTickIII |
Skill::TriageTickI | Skill::TriageTickI |
Skill::TriageTickII | Skill::TriageTickII |
@ -1148,7 +1234,9 @@ impl Skill {
Skill::StrikeII => Skill::StrikeI.speed(), Skill::StrikeII => Skill::StrikeI.speed(),
Skill::StrikeIII => Skill::StrikeI.speed(), Skill::StrikeIII => Skill::StrikeI.speed(),
Skill::SiphonTick => Skill::Siphon.speed(), Skill::SiphonTickI |
Skill::SiphonTickII |
Skill::SiphonTickIII => Skill::SiphonI.speed(),
Skill::DecayTickI | Skill::DecayTickI |
Skill::DecayTickII | Skill::DecayTickII |
Skill::DecayTickIII => Skill::DecayI.speed(), Skill::DecayTickIII => Skill::DecayI.speed(),
@ -1157,7 +1245,9 @@ impl Skill {
Skill::TriageTickII | Skill::TriageTickII |
Skill::TriageTickIII => Skill::TriageI.speed(), Skill::TriageTickIII => Skill::TriageI.speed(),
Skill::StrangleTick => Skill::Strangle.speed(), Skill::StrangleTickI |
Skill::StrangleTickII |
Skill::StrangleTickIII => Skill::StrangleI.speed(),
Skill::CorruptionTick => Skill::Corrupt.speed(), Skill::CorruptionTick => Skill::Corrupt.speed(),
_ => Item::from(*self).speed(), _ => Item::from(*self).speed(),
@ -1180,7 +1270,9 @@ impl Skill {
Skill::ClutchI | Skill::ClutchI |
Skill::ClutchII | Skill::ClutchII |
Skill::ClutchIII | Skill::ClutchIII |
Skill::Parry | Skill::ParryI |
Skill::ParryII |
Skill::ParryIII |
Skill::TestBlock | Skill::TestBlock |
Skill::TestParry => true, Skill::TestParry => true,
@ -1208,7 +1300,9 @@ impl Skill {
Skill::InvertI | Skill::InvertI |
Skill::InvertII | Skill::InvertII |
Skill::InvertIII | Skill::InvertIII |
Skill::Parry | Skill::ParryI |
Skill::ParryII |
Skill::ParryIII |
Skill::PurifyI | Skill::PurifyI |
Skill::PurifyII | Skill::PurifyII |
Skill::PurifyIII | Skill::PurifyIII |
@ -1225,7 +1319,9 @@ impl Skill {
Skill::TriageII | Skill::TriageII |
Skill::TriageIII => true, Skill::TriageIII => true,
Skill::Banish => rng.gen_bool(0.5), Skill::BanishI |
Skill::BanishII |
Skill::BanishIII => rng.gen_bool(0.5),
_ => false, _ => false,
} }
@ -1337,17 +1433,19 @@ fn throw(source: &mut Cryp, target: &mut Cryp, mut results: Resolutions, skill:
} }
fn strangle(source: &mut Cryp, target: &mut Cryp, mut results: Resolutions, skill: Skill) -> Resolutions { fn strangle(source: &mut Cryp, target: &mut Cryp, mut results: Resolutions, skill: Skill) -> Resolutions {
let CrypEffect { effect, duration, meta, tick: _ } = skill.effect().first().unwrap().clone();
let tick_skill = match meta {
Some(EffectMeta::Skill(s)) => s,
_ => panic!("no strangle tick skill"),
};
let strangle = CrypEffect::new(effect, duration).set_tick(Cast::new_tick(source, target, tick_skill));
results.push(Resolution::new(source, target).event(target.add_effect(skill, strangle)));
skill.effect().into_iter().for_each(|e| { let attacker_strangle = CrypEffect::new(Effect::Strangling, duration);
let CrypEffect { effect: _, duration, meta: _, tick: _ } = e; results.push(Resolution::new(source, source).event(source.add_effect(skill, attacker_strangle)));
let strangle = e.clone().set_tick(Cast::new_tick(source, target, Skill::StrangleTick));
results.push(Resolution::new(source, target).event(target.add_effect(skill, strangle)));
let attacker_strangle = CrypEffect::new(Effect::Strangling, duration);
results.push(Resolution::new(source, source).event(source.add_effect(skill, attacker_strangle))); return strangle_tick(source, target, results, tick_skill);
});
return strangle_tick(source, target, results, Skill::StrangleTick);
} }
fn strangle_tick(source: &mut Cryp, target: &mut Cryp, mut results: Resolutions, skill: Skill) -> Resolutions { fn strangle_tick(source: &mut Cryp, target: &mut Cryp, mut results: Resolutions, skill: Skill) -> Resolutions {
@ -1450,7 +1548,7 @@ 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 { fn triage(source: &mut Cryp, target: &mut Cryp, mut results: Resolutions, skill: Skill) -> Resolutions {
let CrypEffect { effect, duration, meta, tick: _ } = skill.effect().first().unwrap().clone(); let CrypEffect { effect, duration, meta, tick: _ } = skill.effect().first().unwrap().clone();
let tick_skill = match meta { let tick_skill = match meta {
Some(EffectMeta::SkillTick(s)) => s, Some(EffectMeta::Skill(s)) => s,
_ => panic!("no triage tick skill"), _ => panic!("no triage tick skill"),
}; };
let triage = CrypEffect::new(effect, duration).set_tick(Cast::new_tick(source, target, tick_skill)); let triage = CrypEffect::new(effect, duration).set_tick(Cast::new_tick(source, target, tick_skill));
@ -1515,7 +1613,7 @@ fn decay(source: &mut Cryp, target: &mut Cryp, mut results: Resolutions, skill:
let CrypEffect { effect, duration, meta, tick: _ } = skill.effect().last().unwrap().clone(); let CrypEffect { effect, duration, meta, tick: _ } = skill.effect().last().unwrap().clone();
let tick_skill = match meta { let tick_skill = match meta {
Some(EffectMeta::SkillTick(s)) => s, Some(EffectMeta::Skill(s)) => s,
_ => panic!("no decay tick skill"), _ => panic!("no decay tick skill"),
}; };
let decay = CrypEffect::new(effect, duration).set_tick(Cast::new_tick(source, target, tick_skill)); let decay = CrypEffect::new(effect, duration).set_tick(Cast::new_tick(source, target, tick_skill));
@ -1620,23 +1718,26 @@ fn recharge(source: &mut Cryp, target: &mut Cryp, mut results: Resolutions, skil
} }
fn siphon(source: &mut Cryp, target: &mut Cryp, mut results: Resolutions, skill: Skill) -> Resolutions { fn siphon(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: _ } = skill.effect().first().unwrap().clone();
let siphon = e.clone().set_tick(Cast::new_tick(source, target, Skill::SiphonTick)); let tick_skill = match meta {
results.push(Resolution::new(source, target).event(target.add_effect(skill, siphon))); Some(EffectMeta::Skill(s)) => s,
}); _ => panic!("no siphon tick skill"),
};
let siphon = CrypEffect::new(effect, duration).set_tick(Cast::new_tick(source, target, tick_skill));
results.push(Resolution::new(source, target).event(target.add_effect(skill, siphon)));
return siphon_tick(source, target, results, Skill::SiphonTick); return siphon_tick(source, target, results, tick_skill);
} }
fn siphon_tick(source: &mut Cryp, target: &mut Cryp, mut results: Resolutions, skill: Skill) -> Resolutions { fn siphon_tick(source: &mut Cryp, target: &mut Cryp, mut results: Resolutions, skill: Skill) -> Resolutions {
let amount = source.blue_damage().pct(skill.multiplier()); let amount = source.blue_damage().pct(skill.multiplier());
let siphon_events = target.deal_blue_damage(Skill::SiphonTick, amount); let siphon_events = target.deal_blue_damage(skill, amount);
for e in siphon_events { for e in siphon_events {
match e { match e {
Event::Damage { amount, mitigation: _, colour: _, skill: _ } => { Event::Damage { amount, mitigation: _, colour: _, skill: _ } => {
results.push(Resolution::new(source, target).event(e)); results.push(Resolution::new(source, target).event(e));
let heal = source.deal_green_damage(Skill::SiphonTick, amount); let heal = source.deal_green_damage(skill, amount);
for h in heal { for h in heal {
results.push(Resolution::new(source, source).event(h)); results.push(Resolution::new(source, source).event(h));
}; };
@ -1919,10 +2020,10 @@ mod tests {
x.green_life.reduce(512); x.green_life.reduce(512);
let mut results = resolve(Skill::Siphon, &mut x, &mut y, vec![]); let mut results = resolve(Skill::SiphonI, &mut x, &mut y, vec![]);
assert!(y.affected(Effect::Siphon)); assert!(y.affected(Effect::Siphon));
assert!(x.green_life() == (512 + 256.pct(Skill::SiphonTick.multiplier()))); assert!(x.green_life() == (512 + 256.pct(Skill::SiphonTickI.multiplier())));
let Resolution { source: _, target: _, event } = results.remove(0); let Resolution { source: _, target: _, event } = results.remove(0);
match event { match event {
@ -1932,14 +2033,14 @@ mod tests {
let Resolution { source: _, target: _, event } = results.remove(0); let Resolution { source: _, target: _, event } = results.remove(0);
match event { match event {
Event::Damage { amount, skill: _, mitigation: _, colour: _} => assert_eq!(amount, 256.pct(Skill::SiphonTick.multiplier())), Event::Damage { amount, skill: _, mitigation: _, colour: _} => assert_eq!(amount, 256.pct(Skill::SiphonTickI.multiplier())),
_ => panic!("not damage siphon"), _ => panic!("not damage siphon"),
}; };
let Resolution { source: _, target, event } = results.remove(0); let Resolution { source: _, target, event } = results.remove(0);
match event { match event {
Event::Healing { amount, skill: _, overhealing: _ } => { Event::Healing { amount, skill: _, overhealing: _ } => {
assert_eq!(amount, 256.pct(Skill::SiphonTick.multiplier())); assert_eq!(amount, 256.pct(Skill::SiphonTickI.multiplier()));
assert_eq!(target.id, x.id); assert_eq!(target.id, x.id);
}, },
_ => panic!("not healing"), _ => panic!("not healing"),