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()),
@ -641,7 +665,9 @@ impl Item {
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::ParryII => vec![Item::ParryI, Item::ParryI, Item::ParryI],
Item::ParryIII => vec![Item::ParryII, Item::ParryII, Item::ParryII], // Add red recharge
Item::PurifyI => vec![Item::Block, Item::Green, Item::Green], Item::PurifyI => vec![Item::Block, Item::Green, Item::Green],
Item::PurifyII => vec![Item::PurifyI, Item::PurifyI, Item::PurifyI], Item::PurifyII => vec![Item::PurifyI, Item::PurifyI, Item::PurifyI],
Item::PurifyIII => vec![Item::PurifyII, Item::PurifyII, Item::PurifyII], Item::PurifyIII => vec![Item::PurifyII, Item::PurifyII, Item::PurifyII],
@ -657,7 +683,9 @@ impl Item {
Item::RechargeIII => vec![Item::RechargeII, Item::RechargeII, Item::RechargeII], 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::StrangleII => vec![Item::StrangleI, Item::StrangleI, Item::StrangleI],
Item::StrangleIII => vec![Item::StrangleII, Item::StrangleII, Item::StrangleII],
Item::SleepI => vec![Item::Stun, Item::Green, Item::Green], Item::SleepI => vec![Item::Stun, Item::Green, Item::Green],
Item::SleepII => vec![Item::SleepI, Item::SleepI, Item::SleepI], Item::SleepII => vec![Item::SleepI, Item::SleepI, Item::SleepI],
Item::SleepIII => vec![Item::SleepII, Item::SleepII, Item::SleepII], Item::SleepIII => vec![Item::SleepII, Item::SleepII, Item::SleepII],
@ -670,7 +698,9 @@ impl Item {
Item::HexI => vec![Item::Stun, Item::Green, Item::Blue], Item::HexI => vec![Item::Stun, Item::Green, Item::Blue],
Item::HexII => vec![Item::HexI, Item::HexI, Item::HexI], Item::HexII => vec![Item::HexI, Item::HexI, Item::HexI],
Item::HexIII => vec![Item::HexII, Item::HexII, Item::HexII], Item::HexIII => vec![Item::HexII, Item::HexII, Item::HexII],
Item::Banish => vec![Item::Stun, Item::Red, Item::Blue], 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],
@ -684,7 +714,9 @@ impl Item {
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::SiphonII => vec![Item::SiphonI, Item::SiphonI, Item::SiphonI],
Item::SiphonIII => vec![Item::SiphonII, Item::SiphonII, Item::SiphonII],
Item::ChaosI => vec![Item::Attack, Item::Red, Item::Blue], Item::ChaosI => vec![Item::Attack, Item::Red, Item::Blue],
Item::ChaosII => vec![Item::ChaosI, Item::ChaosI, Item::ChaosI], Item::ChaosII => vec![Item::ChaosI, Item::ChaosI, Item::ChaosI],
Item::ChaosIII => vec![Item::ChaosII, Item::ChaosII, Item::ChaosII], Item::ChaosIII => vec![Item::ChaosII, Item::ChaosII, Item::ChaosII],
@ -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,7 +951,9 @@ 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 },
@ -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 => (),
}, },
_ => (), _ => (),
@ -480,7 +501,9 @@ impl Effect {
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
@ -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,7 +951,12 @@ 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 }],
@ -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();
skill.effect().into_iter().for_each(|e| { let tick_skill = match meta {
let CrypEffect { effect: _, duration, meta: _, tick: _ } = e; Some(EffectMeta::Skill(s)) => s,
let strangle = e.clone().set_tick(Cast::new_tick(source, target, Skill::StrangleTick)); _ => 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))); results.push(Resolution::new(source, target).event(target.add_effect(skill, strangle)));
let attacker_strangle = CrypEffect::new(Effect::Strangling, duration); let attacker_strangle = CrypEffect::new(Effect::Strangling, duration);
results.push(Resolution::new(source, source).event(source.add_effect(skill, attacker_strangle))); results.push(Resolution::new(source, source).event(source.add_effect(skill, attacker_strangle)));
});
return strangle_tick(source, target, results, Skill::StrangleTick); return strangle_tick(source, target, results, tick_skill);
} }
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 {
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))); 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"),