diff --git a/core/fixme.md b/core/fixme.md index 9cc3cf06..bb199c64 100644 --- a/core/fixme.md +++ b/core/fixme.md @@ -6,4 +6,5 @@ purify conditional healing set static speed for dot ticks infinite counter loop -cooldowns reduced after 1 complete cast \ No newline at end of file +cooldowns set after cast +cooldowns reduced after 1 complete cast diff --git a/core/src/construct.rs b/core/src/construct.rs index b56ac669..2377252c 100644 --- a/core/src/construct.rs +++ b/core/src/construct.rs @@ -63,7 +63,7 @@ impl ConstructSkill { #[derive(Debug,Clone,Copy,PartialEq,Serialize,Deserialize)] pub enum EffectMeta { CastOnHit(Skill), // maybe needs source/target - CastTick { source: Uuid, target: Uuid, skill: Skill }, + CastTick { source: Uuid, target: Uuid, skill: Skill, speed: usize, amount: usize }, AddedDamage(usize), Multiplier(usize), } @@ -98,7 +98,7 @@ impl ConstructEffect { pub fn get_skill(&self) -> Option { match self.meta { - Some(EffectMeta::CastTick { source, target, skill }) => Some(skill), + Some(EffectMeta::CastTick { source, target, skill, speed, amount }) => Some(skill), Some(EffectMeta::CastOnHit(s)) => Some(s), _ => None, } @@ -128,6 +128,7 @@ pub enum Stat { Cooldowns, EffectsCount, Skills(Colour), + TickDamage(Effect), } #[derive(Debug,Clone,Copy,PartialEq,Serialize,Deserialize)] @@ -520,10 +521,28 @@ impl Construct { Stat::Skills(colour) => self.skills.iter().filter(|cs| cs.skill.colours().contains(&colour)).count(), Stat::EffectsCount => self.effects.iter().filter(|ce| !ce.effect.hidden()).count(), + Stat::TickDamage(effect) => self.tick_damage(effect), + _ => panic!("{:?} cannot be calculated without an amount", stat), } } + fn tick_damage(&self, effect: Effect) -> usize { + match self.effects.iter().find_map(|ce| match ce.effect == effect { + true => match ce.meta { + Some(EffectMeta::CastTick { source, target, skill, speed, amount }) => Some(amount), + _ => None, + }, + false => None, + }) { + Some(amount) => amount, + None => { + warn!("no tick damage {:?} {:?}", self.effects, effect); + 0 + } + } + } + pub fn skill_speed(&self, s: Skill) -> usize { self.stat(Stat::Speed).saturating_mul(s.speed() as usize) } @@ -988,8 +1007,8 @@ impl Construct { self.effects.iter().find(|e| e.effect == Effect::Electric).unwrap(); match meta { - Some(EffectMeta::CastTick { source: _, target, skill }) => - casts.push(Cast::new(self.id, self.account, *target, *skill)), + Some(EffectMeta::CastOnHit(skill)) => + casts.push(Cast::new(self.id, self.account, cast.target, *skill)), _ => panic!("no electrify skill {:?}", meta), }; } diff --git a/core/src/effect.rs b/core/src/effect.rs index edc74998..f927ea65 100644 --- a/core/src/effect.rs +++ b/core/src/effect.rs @@ -91,8 +91,6 @@ impl Effect { Skill::SiphonPlus, Skill::SiphonPlusPlus, Skill::SiphonTick, - Skill::SiphonTickPlus, - Skill::SiphonTickPlusPlus, ].contains(&skill), Effect::Decayed => [ @@ -100,8 +98,6 @@ impl Effect { Skill::DecayPlus, Skill::DecayPlusPlus, Skill::DecayTick, - Skill::DecayTickPlus, - Skill::DecayTickPlusPlus, ].contains(&skill), Effect::Triaged => [ @@ -109,8 +105,6 @@ impl Effect { Skill::TriagePlus, Skill::TriagePlusPlus, Skill::TriageTick, - Skill::TriageTickPlus, - Skill::TriageTickPlusPlus, ].contains(&skill), _ => false, diff --git a/core/src/game.rs b/core/src/game.rs index 008564ac..1ec23c5a 100644 --- a/core/src/game.rs +++ b/core/src/game.rs @@ -428,7 +428,7 @@ impl Game { .cloned() .filter_map(|e| e.meta) .filter_map(move |m| match m { - EffectMeta::CastTick { source, target, skill } => Some(Cast::new(source, c.account, target, skill)), + EffectMeta::CastTick { source, target, skill, speed, amount } => Some(Cast::new(source, c.account, target, skill)), _ => None, }) ) @@ -633,6 +633,10 @@ impl Game { } _ => dmg, }), + + Value::TickDamage { construct, effect } => + self.construct(construct).stat(Stat::TickDamage(effect)), + // Skills { construct: Uuid, colour: Colour }, } } @@ -831,6 +835,7 @@ pub enum Value { Effects { construct: Uuid }, Removals { construct: Uuid }, DamageReceived { construct: Uuid, colour: Colour }, + TickDamage { construct: Uuid, effect: Effect }, } #[derive(Debug,Clone,PartialEq)] @@ -1688,7 +1693,7 @@ mod tests { let source = game.players[0].constructs[0].id; let target = game.players[1].constructs[0].id; - game.resolve(Cast::new(source, player_id, target, Skill::Slay)); + game.new_resolve(Cast::new(source, player_id, target, Skill::Slay)); let last = game.resolutions.len() - 1; let resolutions = &game.resolutions[last]; @@ -1715,12 +1720,12 @@ mod tests { let source = game.players[0].constructs[0].id; let target = game.players[1].constructs[0].id; - game.resolve(Cast::new(source, source_player_id, target, Skill::Decay)); + game.new_resolve(Cast::new(source, source_player_id, target, Skill::Decay)); // don't mention 3 we volvo now assert!(game.players[1].constructs[0].effects.len() == 3); - game.resolve(Cast::new(target, target_player_id, target, Skill::Purify)); + game.new_resolve(Cast::new(target, target_player_id, target, Skill::Purify)); assert!(game.players[1].constructs[0].effects.len() == 1); @@ -1744,9 +1749,9 @@ mod tests { let source = game.players[0].constructs[0].id; let target = game.players[1].constructs[0].id; - game.resolve(Cast::new(source, player_id, target, Skill::Strike)); - game.resolve(Cast::new(source, player_id, target, Skill::Invert)); - game.resolve(Cast::new(source, player_id, target, Skill::Strike)); + game.new_resolve(Cast::new(source, player_id, target, Skill::Strike)); + game.new_resolve(Cast::new(source, player_id, target, Skill::Invert)); + game.new_resolve(Cast::new(source, player_id, target, Skill::Strike)); let last = game.resolutions.len() - 1; let resolutions = &game.resolutions[last]; @@ -1771,7 +1776,7 @@ mod tests { let source = game.players[0].constructs[0].id; let target = game.players[1].constructs[0].id; - game.resolve(Cast::new(source, player_id, target, Skill::Siphon)); + game.new_resolve(Cast::new(source, player_id, target, Skill::Siphon)); let last = game.resolutions.len() - 1; let resolutions = &game.resolutions[last]; @@ -1784,6 +1789,7 @@ mod tests { _ => false, })); + println!("{:#?}", resolutions); assert!(resolutions.iter().any(|r| match r.event { Event::Damage { construct, colour, amount, mitigation: _, display: _ } => construct == target && amount > 0 && colour == Colour::Blue, diff --git a/core/src/item.rs b/core/src/item.rs index 1390e6fe..fbdd7e68 100644 --- a/core/src/item.rs +++ b/core/src/item.rs @@ -1215,11 +1215,7 @@ impl From for Item { Skill::ElectrocutePlus => Item::ElectrifyPlus, Skill::ElectrocutePlusPlus => Item::ElectrifyPlusPlus, Skill::ElectrocuteTick => Item::Electrify, - Skill::ElectrocuteTickPlus => Item::ElectrifyPlus, - Skill::ElectrocuteTickPlusPlus => Item::ElectrifyPlus, Skill::DecayTick => Item::Decay, - Skill::DecayTickPlus => Item::DecayPlus, - Skill::DecayTickPlusPlus => Item::DecayPlusPlus, Skill::Absorption => Item::Absorb, Skill::AbsorptionPlus => Item::AbsorbPlus, Skill::AbsorptionPlusPlus => Item::AbsorbPlusPlus, @@ -1229,11 +1225,7 @@ impl From for Item { Skill::CounterAttackPlus => Item::CounterPlus, Skill::CounterAttackPlusPlus => Item::CounterPlusPlus, Skill::SiphonTick => Item::Siphon, - Skill::SiphonTickPlus => Item::SiphonPlus, - Skill::SiphonTickPlusPlus => Item::SiphonPlusPlus, Skill::TriageTick => Item::Triage, - Skill::TriageTickPlus => Item::TriagePlus, - Skill::TriageTickPlusPlus => Item::TriagePlusPlus, } } } diff --git a/core/src/skill.rs b/core/src/skill.rs index 155b3963..f01f6020 100644 --- a/core/src/skill.rs +++ b/core/src/skill.rs @@ -107,9 +107,7 @@ impl Cast { Skill::Decay => decay(self, game), Skill::DecayPlus => decay_plus(self, game), Skill::DecayPlusPlus => decay_plus_plus(self, game), - Skill::DecayTick | - Skill::DecayTickPlus | - Skill::DecayTickPlusPlus => decay_tick(self, game), + Skill::DecayTick => decay_tick(self, game), Skill::Electrify => electrify(self, game), Skill::ElectrifyPlus => electrify_plus(self, game), @@ -117,9 +115,7 @@ impl Cast { Skill::Electrocute => electrocute(self, game), Skill::ElectrocutePlus => electrocute_plus(self, game), Skill::ElectrocutePlusPlus => electrocute_plus_plus(self, game), - Skill::ElectrocuteTick | - Skill::ElectrocuteTickPlus | - Skill::ElectrocuteTickPlusPlus => electrocute_tick(self, game), + Skill::ElectrocuteTick => electrocute_tick(self, game), Skill::Heal | Skill::HealPlus | @@ -178,9 +174,7 @@ impl Cast { Skill::Siphon => siphon(self, game), Skill::SiphonPlus => siphon_plus(self, game), Skill::SiphonPlusPlus => siphon_plus_plus(self, game), - Skill::SiphonTick | - Skill::SiphonTickPlus | - Skill::SiphonTickPlusPlus => siphon_tick(self, game), + Skill::SiphonTick=> siphon_tick(self, game), Skill::Slay | Skill::SlayPlus | @@ -205,9 +199,7 @@ impl Cast { Skill::Triage => triage(self, game), Skill::TriagePlus => triage_plus(self, game), Skill::TriagePlusPlus => triage_plus_plus(self, game), - Skill::TriageTick | - Skill::TriageTickPlus | - Skill::TriageTickPlusPlus => triage_tick(self, game), + Skill::TriageTick => triage_tick(self, game), }; // actions.append(&mut rest); @@ -301,6 +293,7 @@ pub enum Skill { DecayPlus, #[serde(rename = "Decay++")] DecayPlusPlus, + DecayTick, // dot Haste, #[serde(rename = "Haste+")] @@ -403,6 +396,7 @@ pub enum Skill { SiphonPlus, #[serde(rename = "Siphon++")] SiphonPlusPlus, + SiphonTick, Intercept, #[serde(rename = "Intercept+")] @@ -421,6 +415,7 @@ pub enum Skill { TriagePlus, #[serde(rename = "Triage++")] TriagePlusPlus, + TriageTick, Absorption, #[serde(rename = "Absorption+")] @@ -440,31 +435,11 @@ pub enum Skill { #[serde(rename = "Electrocute++")] ElectrocutePlusPlus, ElectrocuteTick, - #[serde(rename = "ElectrocuteTick+")] - ElectrocuteTickPlus, - #[serde(rename = "ElectrocuteTick++")] - ElectrocuteTickPlusPlus, - DecayTick, // dot - #[serde(rename = "DecayTick+")] - DecayTickPlus, - #[serde(rename = "DecayTick++")] - DecayTickPlusPlus, HasteStrike, HybridBlast, - SiphonTick, - #[serde(rename = "SiphonTick+")] - SiphonTickPlus, - #[serde(rename = "SiphonTick++")] - SiphonTickPlusPlus, - - TriageTick, - #[serde(rename = "TriageTick+")] - TriageTickPlus, - #[serde(rename = "TriageTick++")] - TriageTickPlusPlus, } impl Skill { @@ -485,9 +460,9 @@ impl Skill { Skill::HealPlus => 135, //GG Skill::HealPlusPlus => 160, //GG - Skill::SiphonTick => 25, // GB - Skill::SiphonTickPlus => 27, - Skill::SiphonTickPlusPlus => 30, + Skill::Siphon => 25, // GB + Skill::SiphonPlus => 27, + Skill::SiphonPlusPlus => 30, Skill::Slay => 40, // RG Skill::SlayPlus => 50, @@ -498,9 +473,9 @@ impl Skill { Skill::StrikePlusPlus => 140, // Block Base - Skill::ElectrocuteTick => 80, - Skill::ElectrocuteTickPlus => 90, - Skill::ElectrocuteTickPlusPlus => 100, + Skill::Electrocute => 80, + Skill::ElectrocutePlus => 90, + Skill::ElectrocutePlusPlus => 100, Skill::CounterAttack => 115, Skill::CounterAttackPlus => 130, @@ -544,9 +519,9 @@ impl Skill { Skill::RuinPlusPlus => 70, // Debuff Base - Skill::DecayTick => 33, - Skill::DecayTickPlus => 37, - Skill::DecayTickPlusPlus => 45, + Skill::Decay => 33, + Skill::DecayPlus => 37, + Skill::DecayPlusPlus => 45, Skill::Silence => 55, // Deals more per blue skill on target Skill::SilencePlus => 65, @@ -569,9 +544,9 @@ impl Skill { Skill::InterceptPlus => 100, Skill::InterceptPlusPlus => 125, - Skill::TriageTick => 75, - Skill::TriageTickPlus => 90, - Skill::TriageTickPlusPlus => 110, + Skill::Triage => 75, + Skill::TriagePlus => 90, + Skill::TriagePlusPlus => 110, _ => 100, } @@ -605,9 +580,9 @@ impl Skill { Skill::Electrocute => vec![ConstructEffect { effect: Effect::Electrocute, duration: 2, meta: Some(EffectMeta::CastOnHit(Skill::ElectrocuteTick)) }], Skill::ElectrocutePlus => vec![ConstructEffect { effect: Effect::Electrocute, duration: 3, - meta: Some(EffectMeta::CastOnHit(Skill::ElectrocuteTickPlus)) }], + meta: Some(EffectMeta::CastOnHit(Skill::ElectrocuteTick)) }], Skill::ElectrocutePlusPlus => vec![ConstructEffect { effect: Effect::Electrocute, duration: 4, - meta: Some(EffectMeta::CastOnHit(Skill::ElectrocuteTickPlusPlus)) }], + meta: Some(EffectMeta::CastOnHit(Skill::ElectrocuteTick)) }], Skill::Sustain => vec![ConstructEffect { effect: Effect::Sustain, duration: 1, meta: None }], Skill::SustainPlus => vec![ConstructEffect { effect: Effect::Sustain, duration: 1, meta: None }], @@ -630,11 +605,11 @@ impl Skill { Skill::DecayPlus => vec![ConstructEffect { effect: Effect::Wither, duration: 3, meta: Some(EffectMeta::Multiplier(35)) }, ConstructEffect { effect: Effect::Decay, duration: 3, - meta: Some(EffectMeta::CastOnHit(Skill::DecayTickPlus)) }], + meta: Some(EffectMeta::CastOnHit(Skill::DecayTick)) }], Skill::DecayPlusPlus => vec![ConstructEffect { effect: Effect::Wither, duration: 4, meta: Some(EffectMeta::Multiplier(20)) }, ConstructEffect { effect: Effect::Decay, duration: 4, - meta: Some(EffectMeta::CastOnHit(Skill::DecayTickPlusPlus)) }], + meta: Some(EffectMeta::CastOnHit(Skill::DecayTick)) }], Skill::Haste => vec![ConstructEffect { effect: Effect::Haste, duration: 3, meta: Some(EffectMeta::Multiplier(150)) }], @@ -705,9 +680,9 @@ impl Skill { Skill::Siphon => vec![ConstructEffect { effect: Effect::Siphon, duration: 2, meta: Some(EffectMeta::CastOnHit(Skill::SiphonTick)) }], Skill::SiphonPlus => vec![ConstructEffect { effect: Effect::Siphon, duration: 3, - meta: Some(EffectMeta::CastOnHit(Skill::SiphonTickPlus)) }], + meta: Some(EffectMeta::CastOnHit(Skill::SiphonTick)) }], Skill::SiphonPlusPlus => vec![ConstructEffect { effect: Effect::Siphon, duration: 4, - meta: Some(EffectMeta::CastOnHit(Skill::SiphonTickPlusPlus)) }], + meta: Some(EffectMeta::CastOnHit(Skill::SiphonTick)) }], Skill::Sleep => vec![ConstructEffect { effect: Effect::Stun, duration: 2, meta: None }], Skill::SleepPlus => vec![ConstructEffect { effect: Effect::Stun, duration: 3, meta: None }], @@ -732,9 +707,9 @@ impl Skill { Skill::Triage => vec![ConstructEffect { effect: Effect::Triage, duration: 2, meta: Some(EffectMeta::CastOnHit(Skill::TriageTick)) }], Skill::TriagePlus => vec![ConstructEffect { effect: Effect::Triage, duration: 3, - meta: Some(EffectMeta::CastOnHit(Skill::TriageTickPlus)) }], + meta: Some(EffectMeta::CastOnHit(Skill::TriageTick)) }], Skill::TriagePlusPlus => vec![ConstructEffect { effect: Effect::Triage, duration: 4, - meta: Some(EffectMeta::CastOnHit(Skill::TriageTickPlusPlus)) }], + meta: Some(EffectMeta::CastOnHit(Skill::TriageTick)) }], Skill::Purify => vec![ConstructEffect { effect: Effect::Pure, duration: 2, meta: Some(EffectMeta::Multiplier(150)) }], @@ -894,17 +869,9 @@ impl Skill { Skill::AbsorptionPlusPlus | // Ticks Skill::ElectrocuteTick| - Skill::ElectrocuteTickPlus | - Skill::ElectrocuteTickPlusPlus | Skill::DecayTick| - Skill::DecayTickPlus | - Skill::DecayTickPlusPlus | Skill::SiphonTick| - Skill::SiphonTickPlus | - Skill::SiphonTickPlusPlus | - Skill::TriageTick| - Skill::TriageTickPlus | - Skill::TriageTickPlusPlus => None, + Skill::TriageTick => None, } } @@ -921,18 +888,10 @@ impl Skill { Skill::Absorption| Skill::AbsorptionPlus | Skill::AbsorptionPlusPlus | - Skill::ElectrocuteTick| - Skill::ElectrocuteTickPlus | - Skill::ElectrocuteTickPlusPlus | - Skill::DecayTick| - Skill::DecayTickPlus | - Skill::DecayTickPlusPlus | - Skill::SiphonTick| - Skill::SiphonTickPlus | - Skill::SiphonTickPlusPlus | - Skill::TriageTick| - Skill::TriageTickPlus | - Skill::TriageTickPlusPlus => false, + Skill::ElectrocuteTick | + Skill::DecayTick | + Skill::SiphonTick | + Skill::TriageTick => false, _ => true, } } @@ -940,18 +899,9 @@ impl Skill { pub fn ko_castable(&self) -> bool { match self { Skill::ElectrocuteTick | - Skill::ElectrocuteTickPlus | - Skill::ElectrocuteTickPlusPlus | Skill::DecayTick | - Skill::DecayTickPlus | - Skill::DecayTickPlusPlus | Skill::SiphonTick | - Skill::SiphonTickPlus | - Skill::SiphonTickPlusPlus | - - Skill::TriageTick | - Skill::TriageTickPlus | - Skill::TriageTickPlusPlus => true, + Skill::TriageTick => true, _ => false, } } @@ -959,17 +909,9 @@ impl Skill { pub fn is_tick(&self) -> bool { match self { Skill::ElectrocuteTick | - Skill::ElectrocuteTickPlus | - Skill::ElectrocuteTickPlusPlus | Skill::DecayTick | - Skill::DecayTickPlus | - Skill::DecayTickPlusPlus | Skill::SiphonTick | - Skill::SiphonTickPlus | - Skill::SiphonTickPlusPlus | - Skill::TriageTick | - Skill::TriageTickPlus | - Skill::TriageTickPlusPlus => true, + Skill::TriageTick => true, _ => false, } @@ -977,21 +919,10 @@ impl Skill { pub fn speed(&self) -> usize { match self { - Skill::SiphonTick | - Skill::SiphonTickPlus | - Skill::SiphonTickPlusPlus => Skill::Siphon.speed(), - - Skill::DecayTick | - Skill::DecayTickPlus | - Skill::DecayTickPlusPlus => Skill::Decay.speed(), - - Skill::TriageTick | - Skill::TriageTickPlus | - Skill::TriageTickPlusPlus => Skill::Triage.speed(), - - Skill::ElectrocuteTick | - Skill::ElectrocuteTickPlus | - Skill::ElectrocuteTickPlusPlus => Skill::Electrify.speed(), + Skill::SiphonTick => Skill::Siphon.speed(), + Skill::DecayTick => Skill::Decay.speed(), + Skill::TriageTick => Skill::Triage.speed(), + Skill::ElectrocuteTick => Skill::Electrify.speed(), _ => Item::from(*self).speed(), } @@ -1490,11 +1421,12 @@ fn counter_attack(cast: Cast, game: &mut Game) { } fn decay(cast: Cast, game: &mut Game) { + let amount = game.value(Value::Stat { construct: cast.source, stat: Stat::BluePower }).pct(cast.skill.multiplier()); game.action(cast, Action::Damage { construct: cast.target, colour: Colour::Blue, - amount: game.value(Value::Stat { construct: cast.source, stat: Stat::BluePower }).pct(cast.skill.multiplier()), + amount, } ); game.action(cast, @@ -1507,7 +1439,7 @@ fn decay(cast: Cast, game: &mut Game) { Action::Effect { construct: cast.target, effect: ConstructEffect { effect: Effect::Decay, duration: 2, meta: - Some(EffectMeta::CastTick { source: cast.source, target: cast.target, skill: Skill::DecayTick }) }, + Some(EffectMeta::CastTick { source: cast.source, target: cast.target, skill: Skill::DecayTick, speed: cast.speed, amount }) }, } ); game.action(cast, @@ -1519,11 +1451,12 @@ fn decay(cast: Cast, game: &mut Game) { } fn decay_plus(cast: Cast, game: &mut Game) { + let amount = game.value(Value::Stat { construct: cast.source, stat: Stat::BluePower }).pct(cast.skill.multiplier()); game.action(cast, Action::Damage { construct: cast.target, colour: Colour::Blue, - amount: game.value(Value::Stat { construct: cast.source, stat: Stat::BluePower }).pct(cast.skill.multiplier()), + amount, } ); game.action(cast, @@ -1536,7 +1469,7 @@ fn decay_plus(cast: Cast, game: &mut Game) { Action::Effect { construct: cast.target, effect: ConstructEffect { effect: Effect::Decay, duration: 4, meta: - Some(EffectMeta::CastTick { source: cast.source, target: cast.target, skill: Skill::DecayTickPlus }) }, + Some(EffectMeta::CastTick { source: cast.source, target: cast.target, skill: Skill::DecayTick, speed: cast.speed, amount }) }, } ); game.action(cast, @@ -1548,11 +1481,12 @@ fn decay_plus(cast: Cast, game: &mut Game) { } fn decay_plus_plus(cast: Cast, game: &mut Game) { + let amount = game.value(Value::Stat { construct: cast.source, stat: Stat::BluePower }).pct(cast.skill.multiplier()); game.action(cast, Action::Damage { construct: cast.target, colour: Colour::Blue, - amount: game.value(Value::Stat { construct: cast.source, stat: Stat::BluePower }).pct(cast.skill.multiplier()), + amount, } ); game.action(cast, @@ -1565,7 +1499,7 @@ fn decay_plus_plus(cast: Cast, game: &mut Game) { Action::Effect { construct: cast.target, effect: ConstructEffect { effect: Effect::Decay, duration: 4, meta: - Some(EffectMeta::CastTick { source: cast.source, target: cast.target, skill: Skill::DecayTickPlusPlus }) }, + Some(EffectMeta::CastTick { source: cast.source, target: cast.target, skill: Skill::DecayTick, speed: cast.speed, amount }) }, } ); game.action(cast, @@ -1577,11 +1511,13 @@ fn decay_plus_plus(cast: Cast, game: &mut Game) { } fn decay_tick(cast: Cast, game: &mut Game) { + let amount = game.value(Value::TickDamage { construct: cast.target, effect: Effect::Decay }); + game.action(cast, Action::Damage { construct: cast.target, colour: Colour::Blue, - amount: game.value(Value::Stat { construct: cast.source, stat: Stat::BluePower }).pct(cast.skill.multiplier()), + amount, } ); game.action(cast, @@ -1620,6 +1556,8 @@ fn electrify_plus_plus(cast: Cast, game: &mut Game) { } fn electrocute(cast: Cast, game: &mut Game) { + let amount = game.value(Value::Stat { construct: cast.source, stat: Stat::BluePower }).pct(cast.skill.multiplier()); + game.action(cast, Action::Remove { construct: cast.source, @@ -1630,11 +1568,13 @@ fn electrocute(cast: Cast, game: &mut Game) { Action::Effect { construct: cast.target, effect: ConstructEffect { effect: Effect::Electric, duration: 2, meta: - Some(EffectMeta::CastTick { source: cast.source, target: cast.target, skill: Skill::ElectrocuteTick }) }, + Some(EffectMeta::CastTick { source: cast.source, target: cast.target, skill: Skill::ElectrocuteTick, speed: cast.speed, amount }) }, }, ); } fn electrocute_plus(cast: Cast, game: &mut Game) { + let amount = game.value(Value::Stat { construct: cast.source, stat: Stat::BluePower }).pct(cast.skill.multiplier()); + game.action(cast, Action::Remove { construct: cast.source, @@ -1645,12 +1585,14 @@ fn electrocute_plus(cast: Cast, game: &mut Game) { Action::Effect { construct: cast.target, effect: ConstructEffect { effect: Effect::Electric, duration: 3, meta: - Some(EffectMeta::CastTick { source: cast.source, target: cast.target, skill: Skill::ElectrocuteTickPlus }) }, + Some(EffectMeta::CastTick { source: cast.source, target: cast.target, skill: Skill::ElectrocuteTick, speed: cast.speed, amount }) }, }, ); } fn electrocute_plus_plus(cast: Cast, game: &mut Game) { + let amount = game.value(Value::Stat { construct: cast.source, stat: Stat::BluePower }).pct(cast.skill.multiplier()); + game.action(cast, Action::Remove { construct: cast.source, @@ -1661,7 +1603,7 @@ fn electrocute_plus_plus(cast: Cast, game: &mut Game) { Action::Effect { construct: cast.target, effect: ConstructEffect { effect: Effect::Electric, duration: 4, meta: - Some(EffectMeta::CastTick { source: cast.source, target: cast.target, skill: Skill::ElectrocuteTickPlusPlus }) }, + Some(EffectMeta::CastTick { source: cast.source, target: cast.target, skill: Skill::ElectrocuteTick, speed: cast.speed, amount }) }, }, ); } @@ -1671,7 +1613,7 @@ fn electrocute_tick(cast: Cast, game: &mut Game) { Action::Damage { construct: cast.target, colour: Colour::Blue, - amount: game.value(Value::Stat { construct: cast.source, stat: Stat::BluePower }).pct(cast.skill.multiplier()), + amount: game.value(Value::TickDamage { construct: cast.target, effect: Effect::Electrocute }), }, ); } @@ -2002,20 +1944,23 @@ fn ruin(cast: Cast, game: &mut Game) { ); } - fn siphon(cast: Cast, game: &mut Game) { + let amount = + game.value(Value::Stat { construct: cast.source, stat: Stat::BluePower }).pct(cast.skill.multiplier()) + + game.value(Value::Stat { construct: cast.source, stat: Stat::GreenPower }).pct(cast.skill.multiplier()); + game.action(cast, Action::Effect { construct: cast.target, effect: ConstructEffect { effect: Effect::Siphon, duration: 2, meta: - Some(EffectMeta::CastTick { source: cast.source, target: cast.target, skill: Skill::SiphonTick }) }, + Some(EffectMeta::CastTick { source: cast.source, target: cast.target, skill: Skill::SiphonTick, speed: cast.speed, amount }) }, } ); game.action(cast, Action::Damage { construct: cast.target, colour: Colour::Blue, - amount: game.value(Value::Stat { construct: cast.source, stat: Stat::BluePower }).pct(cast.skill.multiplier()), + amount, } ); game.action(cast, @@ -2034,18 +1979,22 @@ fn siphon(cast: Cast, game: &mut Game) { } fn siphon_plus(cast: Cast, game: &mut Game) { + let amount = + game.value(Value::Stat { construct: cast.source, stat: Stat::BluePower }).pct(cast.skill.multiplier()) + + game.value(Value::Stat { construct: cast.source, stat: Stat::GreenPower }).pct(cast.skill.multiplier()); + game.action(cast, Action::Effect { construct: cast.target, effect: ConstructEffect { effect: Effect::Siphon, duration: 3, meta: - Some(EffectMeta::CastTick { source: cast.source, target: cast.target, skill: Skill::SiphonTickPlus }) }, + Some(EffectMeta::CastTick { source: cast.source, target: cast.target, skill: Skill::SiphonTick, speed: cast.speed, amount }) }, } ); game.action(cast, Action::Damage { construct: cast.target, colour: Colour::Blue, - amount: game.value(Value::Stat { construct: cast.source, stat: Stat::BluePower }).pct(cast.skill.multiplier()), + amount, } ); game.action(cast, @@ -2064,18 +2013,22 @@ fn siphon_plus(cast: Cast, game: &mut Game) { } fn siphon_plus_plus(cast: Cast, game: &mut Game) { + let amount = + game.value(Value::Stat { construct: cast.source, stat: Stat::BluePower }).pct(cast.skill.multiplier()) + + game.value(Value::Stat { construct: cast.source, stat: Stat::GreenPower }).pct(cast.skill.multiplier()); + game.action(cast, Action::Effect { construct: cast.target, effect: ConstructEffect { effect: Effect::Siphon, duration: 4, meta: - Some(EffectMeta::CastTick { source: cast.source, target: cast.target, skill: Skill::SiphonTickPlusPlus }) }, + Some(EffectMeta::CastTick { source: cast.source, target: cast.target, skill: Skill::SiphonTick, speed: cast.speed, amount }) }, } ); game.action(cast, Action::Damage { construct: cast.target, colour: Colour::Blue, - amount: game.value(Value::Stat { construct: cast.source, stat: Stat::BluePower }).pct(cast.skill.multiplier()), + amount, } ); game.action(cast, @@ -2098,7 +2051,7 @@ fn siphon_tick(cast: Cast, game: &mut Game) { Action::Damage { construct: cast.target, colour: Colour::Blue, - amount: game.value(Value::Stat { construct: cast.source, stat: Stat::BluePower }).pct(cast.skill.multiplier()), + amount: game.value(Value::TickDamage { construct: cast.target, effect: Effect::Siphon }), } ); game.action(cast, @@ -2228,18 +2181,20 @@ fn sustain(cast: Cast, game: &mut Game) { } fn triage(cast: Cast, game: &mut Game) { + let amount = game.value(Value::Stat { construct: cast.source, stat: Stat::GreenPower }).pct(cast.skill.multiplier()); + game.action(cast, Action::Effect { construct: cast.target, effect: ConstructEffect { effect: Effect::Triage, duration: 2, meta: - Some(EffectMeta::CastTick { source: cast.source, target: cast.target, skill: Skill::TriageTick }) }, + Some(EffectMeta::CastTick { source: cast.source, target: cast.target, skill: Skill::TriageTick, speed: cast.speed, amount }) }, } ); game.action(cast, Action::Heal { construct: cast.target, colour: Colour::Green, - amount: game.value(Value::Stat { construct: cast.source, stat: Stat::GreenPower }).pct(cast.skill.multiplier()), + amount, } ); game.action(cast, @@ -2251,18 +2206,20 @@ fn triage(cast: Cast, game: &mut Game) { } fn triage_plus(cast: Cast, game: &mut Game) { + let amount = game.value(Value::Stat { construct: cast.source, stat: Stat::GreenPower }).pct(cast.skill.multiplier()); + game.action(cast, Action::Effect { construct: cast.target, effect: ConstructEffect { effect: Effect::Triage, duration: 3, meta: - Some(EffectMeta::CastTick { source: cast.source, target: cast.target, skill: Skill::TriageTickPlus }) }, + Some(EffectMeta::CastTick { source: cast.source, target: cast.target, skill: Skill::TriageTick, speed: cast.speed, amount }) }, } ); game.action(cast, Action::Heal { construct: cast.target, colour: Colour::Green, - amount: game.value(Value::Stat { construct: cast.source, stat: Stat::GreenPower }).pct(cast.skill.multiplier()), + amount, } ); game.action(cast, @@ -2274,18 +2231,20 @@ fn triage_plus(cast: Cast, game: &mut Game) { } fn triage_plus_plus(cast: Cast, game: &mut Game) { + let amount = game.value(Value::Stat { construct: cast.source, stat: Stat::GreenPower }).pct(cast.skill.multiplier()); + game.action(cast, Action::Effect { construct: cast.target, effect: ConstructEffect { effect: Effect::Triage, duration: 4, meta: - Some(EffectMeta::CastTick { source: cast.source, target: cast.target, skill: Skill::TriageTickPlusPlus }) }, + Some(EffectMeta::CastTick { source: cast.source, target: cast.target, skill: Skill::TriageTick, speed: cast.speed, amount }) }, } ); game.action(cast, Action::Heal { construct: cast.target, colour: Colour::Green, - amount: game.value(Value::Stat { construct: cast.source, stat: Stat::GreenPower }).pct(cast.skill.multiplier()), + amount, } ); game.action(cast, @@ -2301,7 +2260,7 @@ fn triage_tick(cast: Cast, game: &mut Game) { Action::Heal { construct: cast.target, colour: Colour::Green, - amount: game.value(Value::Stat { construct: cast.source, stat: Stat::GreenPower }).pct(cast.skill.multiplier()), + amount: game.value(Value::TickDamage { construct: cast.target, effect: Effect::Electrocute }), } ); game.action(cast,