tick tiers and formatting

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

View File

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

View File

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

View File

@ -47,78 +47,82 @@ pub enum Item {
RBSpeedI, RBSpeedI,
AmplifyI, AmplifyI,
AmplifyII, AmplifyII,
AmplifyIII, AmplifyIII,
Banish, Banish,
BlastI, BlastI,
BlastII, BlastII,
BlastIII, BlastIII,
ChaosI, ChaosI,
ChaosII, ChaosII,
ChaosIII, ChaosIII,
ClutchI, ClutchI,
ClutchII, ClutchII,
ClutchIII, ClutchIII,
Corrupt, Corrupt,
CurseI, CurseI,
CurseII, CurseII,
CurseIII, CurseIII,
Decay, DecayI,
DecayII,
DecayIII,
Hostility, Hostility,
Haste, Haste,
HealI, HealI,
HealII, HealII,
HealIII, HealIII,
HexI, HexI,
HexII, HexII,
HexIII, HexIII,
Impurity, Impurity,
InvertI, InvertI,
InvertII, InvertII,
InvertIII, InvertIII,
Parry, Parry,
PurgeI, PurgeI,
PurgeII, PurgeII,
PurgeIII, PurgeIII,
PurifyI, PurifyI,
PurifyII, PurifyII,
PurifyIII, PurifyIII,
ReflectI, ReflectI,
ReflectII, ReflectII,
ReflectIII, ReflectIII,
RechargeI, RechargeI,
RechargeII, RechargeII,
RechargeIII, RechargeIII,
RuinI, RuinI,
RuinII, RuinII,
RuinIII, RuinIII,
ScatterI, ScatterI,
ScatterII, ScatterII,
ScatterIII, ScatterIII,
SilenceI, SilenceI,
SilenceII, SilenceII,
SilenceIII, SilenceIII,
SlayI, SlayI,
SlayII, SlayII,
SlayIII, SlayIII,
SleepI, SleepI,
SleepII, SleepII,
SleepIII, SleepIII,
SnareI, SnareI,
SnareII, SnareII,
SnareIII, SnareIII,
Strangle, Strangle,
StrikeI, StrikeI,
StrikeII, StrikeII,
StrikeIII, StrikeIII,
Siphon, Siphon,
TauntI, TauntI,
TauntII, TauntII,
TauntIII, TauntIII,
ThrowI, ThrowI,
ThrowII, ThrowII,
ThrowIII, ThrowIII,
Triage, TriageI,
TriageII,
TriageIII,
TestTouch, TestTouch,
@ -222,84 +226,88 @@ impl Item {
pub fn into_skill(&self) -> Option<Skill> { pub fn into_skill(&self) -> Option<Skill> {
match self { match self {
Item::Attack => Some(Skill::Attack), Item::Attack => Some(Skill::Attack),
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::Banish => Some(Skill::Banish),
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),
Item::Block => Some(Skill::Block), Item::Block => Some(Skill::Block),
Item::Buff => Some(Skill::Buff), Item::Buff => Some(Skill::Buff),
Item::ChaosI => Some(Skill::ChaosI), Item::ChaosI => Some(Skill::ChaosI),
Item::ChaosII => Some(Skill::ChaosII), Item::ChaosII => Some(Skill::ChaosII),
Item::ChaosIII => Some(Skill::ChaosIII), Item::ChaosIII => Some(Skill::ChaosIII),
Item::CurseI => Some(Skill::CurseI), Item::CurseI => Some(Skill::CurseI),
Item::CurseII => Some(Skill::CurseII), Item::CurseII => Some(Skill::CurseII),
Item::CurseIII => Some(Skill::CurseIII), Item::CurseIII => Some(Skill::CurseIII),
Item::Debuff => Some(Skill::Debuff), Item::Debuff => Some(Skill::Debuff),
Item::Decay => Some(Skill::Decay), Item::DecayI => Some(Skill::DecayI),
Item::Haste => Some(Skill::Haste), Item::DecayII => Some(Skill::DecayII),
Item::DecayIII => Some(Skill::DecayIII),
Item::Haste => Some(Skill::Haste),
Item::HealI => Some(Skill::HealI), Item::HealI => Some(Skill::HealI),
Item::HealII => Some(Skill::HealII), Item::HealII => Some(Skill::HealII),
Item::HealIII => Some(Skill::HealIII), Item::HealIII => Some(Skill::HealIII),
Item::HexI => Some(Skill::HexI), Item::HexI => Some(Skill::HexI),
Item::HexII => Some(Skill::HexII), Item::HexII => Some(Skill::HexII),
Item::HexIII => Some(Skill::HexIII), Item::HexIII => Some(Skill::HexIII),
Item::Hostility => Some(Skill::Hostility), Item::Hostility => Some(Skill::Hostility),
Item::Impurity => Some(Skill::Impurity), Item::Impurity => Some(Skill::Impurity),
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::Parry => Some(Skill::Parry),
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),
Item::PurifyI => Some(Skill::PurifyI), Item::PurifyI => Some(Skill::PurifyI),
Item::PurifyII => Some(Skill::PurifyII), Item::PurifyII => Some(Skill::PurifyII),
Item::PurifyIII => Some(Skill::PurifyIII), Item::PurifyIII => Some(Skill::PurifyIII),
Item::RechargeI => Some(Skill::RechargeI), Item::RechargeI => Some(Skill::RechargeI),
Item::RechargeII => Some(Skill::RechargeII), Item::RechargeII => Some(Skill::RechargeII),
Item::RechargeIII => Some(Skill::RechargeIII), Item::RechargeIII => Some(Skill::RechargeIII),
Item::ReflectI => Some(Skill::ReflectI), Item::ReflectI => Some(Skill::ReflectI),
Item::ReflectII => Some(Skill::ReflectII), Item::ReflectII => Some(Skill::ReflectII),
Item::ReflectIII => Some(Skill::ReflectIII), Item::ReflectIII => Some(Skill::ReflectIII),
Item::RuinI => Some(Skill::RuinI), Item::RuinI => Some(Skill::RuinI),
Item::RuinII => Some(Skill::RuinII), Item::RuinII => Some(Skill::RuinII),
Item::RuinIII => Some(Skill::RuinIII), Item::RuinIII => Some(Skill::RuinIII),
Item::ScatterI => Some(Skill::ScatterI), Item::ScatterI => Some(Skill::ScatterI),
Item::ScatterII => Some(Skill::ScatterII), Item::ScatterII => Some(Skill::ScatterII),
Item::ScatterIII => Some(Skill::ScatterIII), Item::ScatterIII => Some(Skill::ScatterIII),
Item::SilenceI => Some(Skill::SilenceI), Item::SilenceI => Some(Skill::SilenceI),
Item::SilenceII => Some(Skill::SilenceII), Item::SilenceII => Some(Skill::SilenceII),
Item::SilenceIII => Some(Skill::SilenceIII), Item::SilenceIII => Some(Skill::SilenceIII),
Item::SlayI => Some(Skill::SlayI), Item::SlayI => Some(Skill::SlayI),
Item::SlayII => Some(Skill::SlayII), Item::SlayII => Some(Skill::SlayII),
Item::SlayIII => Some(Skill::SlayIII), Item::SlayIII => Some(Skill::SlayIII),
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::Siphon => Some(Skill::Siphon),
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::Strangle => Some(Skill::Strangle),
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),
Item::StrikeIII => Some(Skill::StrikeIII), Item::StrikeIII => Some(Skill::StrikeIII),
Item::ClutchI => Some(Skill::ClutchI), Item::ClutchI => Some(Skill::ClutchI),
Item::ClutchII => Some(Skill::ClutchII), Item::ClutchII => Some(Skill::ClutchII),
Item::ClutchIII => Some(Skill::ClutchIII), Item::ClutchIII => Some(Skill::ClutchIII),
Item::TauntI => Some(Skill::TauntI), Item::TauntI => Some(Skill::TauntI),
Item::TauntII => Some(Skill::TauntII), Item::TauntII => Some(Skill::TauntII),
Item::TauntIII => Some(Skill::TauntIII), Item::TauntIII => Some(Skill::TauntIII),
Item::ThrowI => Some(Skill::ThrowI), Item::ThrowI => Some(Skill::ThrowI),
Item::ThrowII => Some(Skill::ThrowII), Item::ThrowII => Some(Skill::ThrowII),
Item::ThrowIII => Some(Skill::ThrowIII), Item::ThrowIII => Some(Skill::ThrowIII),
Item::Corrupt => Some(Skill::Corrupt), Item::Corrupt => Some(Skill::Corrupt),
Item::Triage => Some(Skill::Triage), Item::TriageI => Some(Skill::TriageI),
Item::TriageII => Some(Skill::TriageII),
Item::TriageIII => Some(Skill::TriageIII),
_ => None, _ => None,
} }
} }
@ -438,7 +446,9 @@ impl Item {
self.into_skill().unwrap().effect().first().unwrap().get_multiplier() - 100, self.into_skill().unwrap().effect().first().unwrap().get_multiplier() - 100,
self.into_skill().unwrap().effect().first().unwrap().get_duration()), self.into_skill().unwrap().effect().first().unwrap().get_duration()),
Item::Decay => format!( Item::DecayI |
Item::DecayII |
Item::DecayIII => format!(
"Reduces healing taken by {:?}% and deals blue damage {:?}% blue power each turn. Lasts {:?}T", "Reduces healing taken by {:?}% and deals blue damage {:?}% blue power each turn. Lasts {:?}T",
100 - self.into_skill().unwrap().effect().first().unwrap().get_multiplier(), 100 - self.into_skill().unwrap().effect().first().unwrap().get_multiplier(),
self.into_skill().unwrap().multiplier(), self.into_skill().unwrap().multiplier(),
@ -582,7 +592,9 @@ impl Item {
self.into_skill().unwrap().effect().first().unwrap().get_multiplier() - 100, self.into_skill().unwrap().effect().first().unwrap().get_multiplier() - 100,
self.into_skill().unwrap().effect().last().unwrap().get_duration()), self.into_skill().unwrap().effect().last().unwrap().get_duration()),
Item::Triage => format!( Item::TriageI |
Item::TriageII |
Item::TriageIII => format!(
"Heals target for {:?}% green power each turn. Lasts {:?}T", "Heals target for {:?}% green power each turn. 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()),
@ -596,82 +608,86 @@ 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::Triage => vec![Item::Buff, Item::Green, Item::Green], Item::TriageI => vec![Item::Buff, Item::Green, Item::Green],
Item::TriageII => vec![Item::TriageI, Item::TriageI, Item::TriageI],
Item::TriageIII => vec![Item::TriageII, Item::TriageII, Item::TriageII],
Item::ScatterI => vec![Item::Buff, Item::Blue, Item::Blue], Item::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::Decay => vec![Item::Debuff, Item::Green, Item::Blue], Item::DecayI => vec![Item::Debuff, Item::Green, Item::Blue],
Item::DecayII => vec![Item::DecayI, Item::DecayI, Item::DecayI],
Item::DecayIII => vec![Item::DecayII, Item::DecayII, Item::DecayII],
Item::InvertI => vec![Item::Debuff, Item::Red, Item::Blue], Item::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::Parry => vec![Item::Block, Item::Red, Item::Red], // 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],
Item::Corrupt => vec![Item::Block, Item::Blue, Item::Blue], Item::Corrupt => vec![Item::Block, Item::Blue, Item::Blue],
Item::ClutchI => vec![Item::Block, Item::Red, Item::Green], Item::ClutchI => vec![Item::Block, Item::Red, Item::Green],
Item::ClutchII => vec![Item::ClutchI, Item::ClutchI, Item::ClutchI], Item::ClutchII => vec![Item::ClutchI, Item::ClutchI, Item::ClutchI],
Item::ClutchIII => vec![Item::ClutchII, Item::ClutchII, Item::ClutchII], Item::ClutchIII => vec![Item::ClutchII, Item::ClutchII, Item::ClutchII],
Item::ReflectI => vec![Item::Block, Item::Green, Item::Blue], Item::ReflectI => vec![Item::Block, Item::Green, Item::Blue],
Item::ReflectII => vec![Item::ReflectI, Item::ReflectI, Item::ReflectI], Item::ReflectII => vec![Item::ReflectI, Item::ReflectI, Item::ReflectI],
Item::ReflectIII => vec![Item::ReflectII, Item::ReflectII, Item::ReflectII], Item::ReflectIII => vec![Item::ReflectII, Item::ReflectII, Item::ReflectII],
Item::RechargeI => vec![Item::Block, Item::Red, Item::Blue], Item::RechargeI => vec![Item::Block, Item::Red, Item::Blue],
Item::RechargeII => vec![Item::RechargeI, Item::RechargeI, Item::RechargeI], Item::RechargeII => vec![Item::RechargeI, Item::RechargeI, Item::RechargeI],
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::Strangle => vec![Item::Stun, Item::Red, Item::Red],
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],
Item::RuinI => vec![Item::Stun, Item::Blue, Item::Blue], Item::RuinI => vec![Item::Stun, Item::Blue, Item::Blue],
Item::RuinII => vec![Item::RuinI, Item::RuinI, Item::RuinI], Item::RuinII => vec![Item::RuinI, Item::RuinI, Item::RuinI],
Item::RuinIII => vec![Item::RuinII, Item::RuinII, Item::RuinII], Item::RuinIII => vec![Item::RuinII, Item::RuinII, Item::RuinII],
Item::ThrowI => vec![Item::Stun, Item::Red, Item::Green], Item::ThrowI => vec![Item::Stun, Item::Red, Item::Green],
Item::ThrowII => vec![Item::ThrowI, Item::ThrowI, Item::ThrowI], Item::ThrowII => vec![Item::ThrowI, Item::ThrowI, Item::ThrowI],
Item::ThrowIII => vec![Item::ThrowII, Item::ThrowII, Item::ThrowII], Item::ThrowIII => vec![Item::ThrowII, Item::ThrowII, Item::ThrowII],
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::Banish => vec![Item::Stun, Item::Red, Item::Blue],
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::Siphon => vec![Item::Attack, Item::Green, Item::Blue],
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],
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],
@ -703,89 +719,91 @@ impl From<Skill> for Item {
fn from(skill: Skill) -> Item { fn from(skill: Skill) -> Item {
match skill { match skill {
Skill::AmplifyI => Item::AmplifyI, Skill::AmplifyI => Item::AmplifyI,
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::Banish => Item::Banish,
Skill::BlastI => Item::BlastI, Skill::BlastI => Item::BlastI,
Skill::BlastII => Item::BlastII, Skill::BlastII => Item::BlastII,
Skill::BlastIII => Item::BlastIII, Skill::BlastIII => Item::BlastIII,
Skill::Block => Item::Block, Skill::Block => Item::Block,
Skill::Buff => Item::Buff, Skill::Buff => Item::Buff,
Skill::ChaosI => Item::ChaosI, Skill::ChaosI => Item::ChaosI,
Skill::ChaosII => Item::ChaosII, Skill::ChaosII => Item::ChaosII,
Skill::ChaosIII => Item::ChaosIII, Skill::ChaosIII => Item::ChaosIII,
Skill::ClutchI => Item::ClutchI, Skill::ClutchI => Item::ClutchI,
Skill::ClutchII => Item::ClutchII, Skill::ClutchII => Item::ClutchII,
Skill::ClutchIII => Item::ClutchIII, Skill::ClutchIII => Item::ClutchIII,
Skill::CurseI => Item::CurseI, Skill::CurseI => Item::CurseI,
Skill::CurseII => Item::CurseII, Skill::CurseII => Item::CurseII,
Skill::CurseIII => Item::CurseIII, Skill::CurseIII => Item::CurseIII,
Skill::Decay => Item::Decay, Skill::DecayI => Item::DecayI,
Skill::DecayII => Item::DecayII,
Skill::DecayIII => Item::DecayIII,
Skill::Debuff => Item::Debuff, Skill::Debuff => Item::Debuff,
Skill::Haste => Item::Haste, Skill::Haste => Item::Haste,
Skill::Hostility => Item::Hostility, Skill::Hostility => Item::Hostility,
Skill::HealI => Item::HealI, Skill::HealI => Item::HealI,
Skill::HealII => Item::HealII, Skill::HealII => Item::HealII,
Skill::HealIII => Item::HealIII, Skill::HealIII => Item::HealIII,
Skill::HexI => Item::HexI, Skill::HexI => Item::HexI,
Skill::HexII => Item::HexII, Skill::HexII => Item::HexII,
Skill::HexIII => Item::HexIII, Skill::HexIII => Item::HexIII,
Skill::Impurity => Item::Impurity, Skill::Impurity => Item::Impurity,
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::Parry => Item::Parry,
Skill::PurgeI => Item::PurgeI, Skill::PurgeI => Item::PurgeI,
Skill::PurgeII => Item::PurgeII, Skill::PurgeII => Item::PurgeII,
Skill::PurgeIII => Item::PurgeIII, Skill::PurgeIII => Item::PurgeIII,
Skill::PurifyI => Item::PurifyI, Skill::PurifyI => Item::PurifyI,
Skill::PurifyII => Item::PurifyII, Skill::PurifyII => Item::PurifyII,
Skill::PurifyIII => Item::PurifyIII, Skill::PurifyIII => Item::PurifyIII,
Skill::RechargeI => Item::RechargeI, Skill::RechargeI => Item::RechargeI,
Skill::RechargeII => Item::RechargeII, Skill::RechargeII => Item::RechargeII,
Skill::RechargeIII => Item::RechargeIII, Skill::RechargeIII => Item::RechargeIII,
Skill::ReflectI => Item::ReflectI, Skill::ReflectI => Item::ReflectI,
Skill::ReflectII => Item::ReflectII, Skill::ReflectII => Item::ReflectII,
Skill::ReflectIII => Item::ReflectIII, Skill::ReflectIII => Item::ReflectIII,
Skill::RuinI => Item::RuinI, Skill::RuinI => Item::RuinI,
Skill::RuinII => Item::RuinII, Skill::RuinII => Item::RuinII,
Skill::RuinIII => Item::RuinIII, Skill::RuinIII => Item::RuinIII,
Skill::ScatterI => Item::ScatterI, Skill::ScatterI => Item::ScatterI,
Skill::ScatterII => Item::ScatterII, Skill::ScatterII => Item::ScatterII,
Skill::ScatterIII => Item::ScatterIII, Skill::ScatterIII => Item::ScatterIII,
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::Siphon => Item::Siphon,
Skill::SlayI => Item::SlayI, Skill::SlayI => Item::SlayI,
Skill::SlayII => Item::SlayII, Skill::SlayII => Item::SlayII,
Skill::SlayIII => Item::SlayIII, Skill::SlayIII => Item::SlayIII,
Skill::SleepI => Item::SleepI, Skill::SleepI => Item::SleepI,
Skill::SleepII => Item::SleepII, Skill::SleepII => Item::SleepII,
Skill::SleepIII => Item::SleepIII, Skill::SleepIII => Item::SleepIII,
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::Strangle => Item::Strangle,
Skill::StrikeI => Item::StrikeI, Skill::StrikeI => Item::StrikeI,
Skill::StrikeII => Item::StrikeII, Skill::StrikeII => Item::StrikeII,
Skill::StrikeIII => Item::StrikeIII, Skill::StrikeIII => Item::StrikeIII,
Skill::Stun => Item::Stun, Skill::Stun => Item::Stun,
Skill::TauntI => Item::TauntI, Skill::TauntI => Item::TauntI,
Skill::TauntII => Item::TauntII, Skill::TauntII => Item::TauntII,
Skill::TauntIII => Item::TauntIII, Skill::TauntIII => Item::TauntIII,
Skill::ThrowI => Item::ThrowI, Skill::ThrowI => Item::ThrowI,
Skill::ThrowII => Item::ThrowII, Skill::ThrowII => Item::ThrowII,
Skill::ThrowIII => Item::ThrowIII, Skill::ThrowIII => Item::ThrowIII,
Skill::Triage => Item::Triage, Skill::TriageI => Item::TriageI,
Skill::TriageII => Item::TriageII,
Skill::TriageIII => Item::TriageIII,
Skill::Corrupt => Item::Corrupt, Skill::Corrupt => Item::Corrupt,
Skill::CorruptionTick => Item::Corrupt, Skill::CorruptionTick => Item::Corrupt,
Skill::DecayTick => Item::Decay,
Skill::SiphonTick => Item::Siphon, Skill::SiphonTick => Item::Siphon,
Skill::StrangleTick => Item::Strangle, Skill::StrangleTick => Item::Strangle,
Skill::TriageTick => Item::Triage,
Skill::TestTouch => Item::TestTouch, Skill::TestTouch => Item::TestTouch,
Skill::TestStun => Item::TestStun, Skill::TestStun => Item::TestStun,
@ -838,70 +856,76 @@ pub struct Combo {
pub fn get_combos() -> Vec<Combo> { pub fn get_combos() -> Vec<Combo> {
let mut combinations = vec![ let mut combinations = vec![
Combo { components: Item::TauntI.combo(), item: Item::TauntI }, Combo { components: Item::TauntI.combo(), item: Item::TauntI },
Combo { components: Item::TauntII.combo(), item: Item::TauntII }, Combo { components: Item::TauntII.combo(), item: Item::TauntII },
Combo { components: Item::TauntIII.combo(), item: Item::TauntIII }, Combo { components: Item::TauntIII.combo(), item: Item::TauntIII },
Combo { components: Item::Triage.combo(), item: Item::Triage },
Combo { components: Item::TriageI.combo(), item: Item::TriageI },
Combo { components: Item::TriageII.combo(), item: Item::TriageII },
Combo { components: Item::TriageIII.combo(), item: Item::TriageIII },
Combo { components: Item::ScatterI.combo(), item: Item::ScatterI }, Combo { components: Item::ScatterI.combo(), item: Item::ScatterI },
Combo { components: Item::ScatterII.combo(), item: Item::ScatterII }, Combo { components: Item::ScatterII.combo(), item: Item::ScatterII },
Combo { components: Item::ScatterIII.combo(), item: Item::ScatterIII }, Combo { components: Item::ScatterIII.combo(), item: Item::ScatterIII },
Combo { components: Item::Haste.combo(), item: Item::Haste }, Combo { components: Item::Haste.combo(), item: Item::Haste },
Combo { components: Item::Impurity.combo(), item: Item::Impurity }, Combo { components: Item::Impurity.combo(), item: Item::Impurity },
Combo { components: Item::AmplifyI.combo(), item: Item::AmplifyI }, Combo { components: Item::AmplifyI.combo(), item: Item::AmplifyI },
Combo { components: Item::AmplifyII.combo(), item: Item::AmplifyII }, Combo { components: Item::AmplifyII.combo(), item: Item::AmplifyII },
Combo { components: Item::AmplifyIII.combo(), item: Item::AmplifyIII }, Combo { components: Item::AmplifyIII.combo(), item: Item::AmplifyIII },
Combo { components: Item::SnareI.combo(), item: Item::SnareI }, Combo { components: Item::SnareI.combo(), item: Item::SnareI },
Combo { components: Item::SnareII.combo(), item: Item::SnareII }, Combo { components: Item::SnareII.combo(), item: Item::SnareII },
Combo { components: Item::SnareIII.combo(), item: Item::SnareIII }, Combo { components: Item::SnareIII.combo(), item: Item::SnareIII },
Combo { components: Item::PurgeI.combo(), item: Item::PurgeI }, // Needs flavour Combo { components: Item::PurgeI.combo(), item: Item::PurgeI }, // Needs flavour
Combo { components: Item::PurgeII.combo(), item: Item::PurgeII }, Combo { components: Item::PurgeII.combo(), item: Item::PurgeII },
Combo { components: Item::PurgeIII.combo(), item: Item::PurgeIII }, Combo { components: Item::PurgeIII.combo(), item: Item::PurgeIII },
Combo { components: Item::SilenceI.combo(), item: Item::SilenceI }, Combo { components: Item::SilenceI.combo(), item: Item::SilenceI },
Combo { components: Item::SilenceII.combo(), item: Item::SilenceII }, Combo { components: Item::SilenceII.combo(), item: Item::SilenceII },
Combo { components: Item::SilenceIII.combo(), item: Item::SilenceIII }, Combo { components: Item::SilenceIII.combo(), item: Item::SilenceIII },
Combo { components: Item::CurseI.combo(), item: Item::CurseI }, Combo { components: Item::CurseI.combo(), item: Item::CurseI },
Combo { components: Item::CurseII.combo(), item: Item::CurseII }, Combo { components: Item::CurseII.combo(), item: Item::CurseII },
Combo { components: Item::CurseIII.combo(), item: Item::CurseIII }, Combo { components: Item::CurseIII.combo(), item: Item::CurseIII },
Combo { components: Item::Decay.combo(), item: Item::Decay }, Combo { components: Item::DecayI.combo(), item: Item::DecayI },
Combo { components: Item::DecayII.combo(), item: Item::DecayII },
Combo { components: Item::DecayIII.combo(), item: Item::DecayIII },
Combo { components: Item::InvertI.combo(), item: Item::InvertI }, Combo { components: Item::InvertI.combo(), item: Item::InvertI },
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::Parry.combo(), item: Item::Parry }, // Add red recharge
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 },
Combo { components: Item::Corrupt.combo(), item: Item::Corrupt }, Combo { components: Item::Corrupt.combo(), item: Item::Corrupt },
Combo { components: Item::ClutchI.combo(), item: Item::ClutchI }, Combo { components: Item::ClutchI.combo(), item: Item::ClutchI },
Combo { components: Item::ClutchII.combo(), item: Item::ClutchII }, Combo { components: Item::ClutchII.combo(), item: Item::ClutchII },
Combo { components: Item::ClutchIII.combo(), item: Item::ClutchIII }, Combo { components: Item::ClutchIII.combo(), item: Item::ClutchIII },
Combo { components: Item::ReflectI.combo(), item: Item::ReflectI }, Combo { components: Item::ReflectI.combo(), item: Item::ReflectI },
Combo { components: Item::ReflectII.combo(), item: Item::ReflectII }, Combo { components: Item::ReflectII.combo(), item: Item::ReflectII },
Combo { components: Item::ReflectIII.combo(), item: Item::ReflectIII }, Combo { components: Item::ReflectIII.combo(), item: Item::ReflectIII },
Combo { components: Item::RechargeI.combo(), item: Item::RechargeI }, Combo { components: Item::RechargeI.combo(), item: Item::RechargeI },
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::Strangle.combo(), item: Item::Strangle },
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 },
Combo { components: Item::ThrowI.combo(), item: Item::ThrowI }, Combo { components: Item::ThrowI.combo(), item: Item::ThrowI },
Combo { components: Item::ThrowII.combo(), item: Item::ThrowII }, Combo { components: Item::ThrowII.combo(), item: Item::ThrowII },
Combo { components: Item::ThrowIII.combo(), item: Item::ThrowIII }, Combo { components: Item::ThrowIII.combo(), item: Item::ThrowIII },
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::Banish.combo(), item: Item::Banish },
Combo { components: Item::StrikeI.combo(), item: Item::StrikeI }, Combo { components: Item::StrikeI.combo(), item: Item::StrikeI },
@ -909,18 +933,18 @@ pub fn get_combos() -> Vec<Combo> {
Combo { components: Item::StrikeIII.combo(), item: Item::StrikeIII }, Combo { components: Item::StrikeIII.combo(), item: Item::StrikeIII },
Combo { components: Item::HealI.combo(), item: Item::HealI }, Combo { components: Item::HealI.combo(), item: Item::HealI },
Combo { components: Item::HealII.combo(), item: Item::HealII }, Combo { components: Item::HealII.combo(), item: Item::HealII },
Combo { components: Item::HealIII.combo(), item: Item::HealIII }, Combo { components: Item::HealIII.combo(), item: Item::HealIII },
Combo { components: Item::BlastI.combo(), item: Item::BlastI }, Combo { components: Item::BlastI.combo(), item: Item::BlastI },
Combo { components: Item::BlastII.combo(), item: Item::BlastII }, Combo { components: Item::BlastII.combo(), item: Item::BlastII },
Combo { components: Item::BlastIII.combo(), item: Item::BlastIII }, Combo { components: Item::BlastIII.combo(), item: Item::BlastIII },
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::Siphon.combo(), item: Item::Siphon },
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 },
Combo { components: Item::RedDamageI.combo(), item: Item::RedDamageI }, Combo { components: Item::RedDamageI.combo(), item: Item::RedDamageI },
Combo { components: Item::GreenDamageI.combo(), item: Item::GreenDamageI }, Combo { components: Item::GreenDamageI.combo(), item: Item::GreenDamageI },

View File

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