diff --git a/CHANGELOG.md b/CHANGELOG.md
index 0f026d90..1d23182c 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -37,7 +37,7 @@ var / skill info rpc
## [0.1.2] - 2019-05-07
### Added
-New skill `Scatter `
+New skill `Link `
Combines - Buff + BB
Links targets together so dmg taken is split
Recharge 140% source blue damage as blue life to target
diff --git a/WORKLOG.md b/WORKLOG.md
index 6bb67000..f123d083 100644
--- a/WORKLOG.md
+++ b/WORKLOG.md
@@ -68,7 +68,7 @@
mobile info page
-rework scatter
+rework link
absorb maybe
reconnect based on time delta
diff --git a/client/src/animations.test.jsx b/client/src/animations.test.jsx
index 8e6a2860..9cfbda91 100644
--- a/client/src/animations.test.jsx
+++ b/client/src/animations.test.jsx
@@ -103,7 +103,7 @@ const SKILLS = [
'ReflectI',
'RestrictI',
'RuinI',
- 'ScatterI',
+ 'LinkI',
'SilenceI',
'SiphonI',
'SiphonTickI',
diff --git a/client/src/components/animations.jsx b/client/src/components/animations.jsx
index a69c1ad3..f60207f8 100644
--- a/client/src/components/animations.jsx
+++ b/client/src/components/animations.jsx
@@ -27,7 +27,7 @@ const Purify = require('./anims/purify');
const Recharge = require('./anims/recharge');
const Refl = require('./anims/reflect');
const Restrict = require('./anims/restrict');
-const Scatter = require('./anims/scatter');
+const Link = require('./anims/link');
const Siphon = require('./anims/siphon');
const SiphonTick = require('./anims/siphon.tick');
const Slay = require('./anims/slay');
@@ -123,7 +123,7 @@ function animations(props) {
case 'Haste': return ;
case 'Triage': return ;
case 'TriageTick': return ;
- case 'Scatter': return ;
+ case 'Link': return ;
case 'Hybrid': return ;
case 'Intercept': return ;
diff --git a/client/src/components/anims/scatter.jsx b/client/src/components/anims/scatter.jsx
deleted file mode 100644
index ab26af47..00000000
--- a/client/src/components/anims/scatter.jsx
+++ /dev/null
@@ -1,77 +0,0 @@
-const preact = require('preact');
-const { Component } = require('preact');
-
-const anime = require('animejs').default;
-
-const { TIMES } = require('../../constants');
-
-class Scatter extends Component {
- constructor() {
- super();
- this.animations = [];
- }
-
- render() {
- return (
-
- );
- }
-
- componentDidMount() {
- this.animations.push(anime({
- targets: ['#scatter'],
- opacity: [
- { value: 1, delay: TIMES.TARGET_DELAY_MS, duration: 1000 },
- // { value: 0, delay: TIMES.TARGET_DURATION_MS * 0.6, duration: TIMES.TARGET_DURATION_MS * 0.2 },
- ],
- easing: 'easeInOutSine',
- }));
-
- anime({
- targets: ['#scatter path'],
- strokeDashoffset: [anime.setDashoffset, 0],
- duration: TIMES.TARGET_DURATION_MS * 0.8,
- delay: TIMES.TARGET_DELAY_MS,
- easing: 'easeInOutSine',
- });
- }
-
- // this is necessary because
- // skipping / timing / unmounting race conditions
- // can cause the animations to cut short, this will ensure the values are reset
- // because preact will recycle all these components
- componentWillUnmount() {
- for (let i = this.animations.length - 1; i >= 0; i--) {
- this.animations[i].reset();
- }
- }
-}
-
-module.exports = Scatter;
diff --git a/client/src/test.instance.js b/client/src/test.instance.js
index fd7a9a24..8619eeab 100644
--- a/client/src/test.instance.js
+++ b/client/src/test.instance.js
@@ -1823,7 +1823,7 @@ function testInstance(uuid) {
"cd": null
},
{
- "skill": "Scatter",
+ "skill": "Link",
"self_targeting": false,
"cd": 2
},
@@ -4300,7 +4300,7 @@ function testInstance(uuid) {
"cd": null
},
{
- "skill": "Scatter",
+ "skill": "Link",
"self_targeting": false,
"cd": 2
}
diff --git a/client/src/utils.jsx b/client/src/utils.jsx
index d8c5a31c..ba71dd37 100644
--- a/client/src/utils.jsx
+++ b/client/src/utils.jsx
@@ -353,7 +353,7 @@ const removeTier = skill => {
if (skill.includes('Intercept')) return 'Intercept';
if (skill.includes('Triage')) return 'Triage';
- if (skill.includes('Scatter')) return 'Scatter';
+ if (skill.includes('Link')) return 'Link';
if (skill.includes('Haste')) return 'Haste';
if (skill.includes('Hybrid')) return 'Hybrid';
if (skill.includes('Amplify')) return 'Amplify';
diff --git a/server/src/construct.rs b/server/src/construct.rs
index 51cfe733..2b7eb90e 100644
--- a/server/src/construct.rs
+++ b/server/src/construct.rs
@@ -69,7 +69,7 @@ pub enum EffectMeta {
Skill(Skill),
TickAmount(u64),
AddedDamage(u64),
- ScatterTarget(Uuid),
+ LinkTarget(Uuid),
Multiplier(u64),
}
diff --git a/server/src/effect.rs b/server/src/effect.rs
index bd881cfc..95079f3a 100644
--- a/server/src/effect.rs
+++ b/server/src/effect.rs
@@ -38,7 +38,7 @@ pub enum Effect {
Absorption,
// magic immunity
- Scatter,
+ Link,
// effects over time
Triage,
@@ -125,7 +125,7 @@ impl Effect {
Effect::Haste => vec![Stat::Speed],
Effect::Slow => vec![Stat::Speed],
- Effect::Scatter => vec![Stat::BlueDamageTaken, Stat::GreenDamageTaken, Stat::RedDamageTaken],
+ Effect::Link => vec![Stat::BlueDamageTaken, Stat::GreenDamageTaken, Stat::RedDamageTaken],
_ => vec![],
}
@@ -146,7 +146,7 @@ impl Effect {
_ => 100,
}),
- Effect::Scatter => value >> 1,
+ Effect::Link => value >> 1,
Effect::Absorption => value + match meta {
Some(EffectMeta::AddedDamage(d)) => d,
@@ -194,7 +194,7 @@ impl Effect {
// magic
Effect::Hybrid => Some(Colour::Green),
- Effect::Scatter => Some(Colour::Green),
+ Effect::Link => Some(Colour::Green),
Effect::Invert => Some(Colour::Green),
// effects over time
diff --git a/server/src/game.rs b/server/src/game.rs
index 6cd0291b..428f819c 100644
--- a/server/src/game.rs
+++ b/server/src/game.rs
@@ -1138,7 +1138,7 @@ mod tests {
}
#[test]
- fn scatter_test() {
+ fn link_test() {
let mut game = create_test_game();
let x_player = game.players[0].clone();
@@ -1147,32 +1147,32 @@ mod tests {
let x_construct = x_player.constructs[0].clone();
let y_construct = y_player.constructs[0].clone();
- game.construct_by_id(x_construct.id).unwrap().learn_mut(Skill::ScatterI);
+ game.construct_by_id(x_construct.id).unwrap().learn_mut(Skill::LinkI);
- while game.construct_by_id(x_construct.id).unwrap().skill_on_cd(Skill::ScatterI).is_some() {
+ while game.construct_by_id(x_construct.id).unwrap().skill_on_cd(Skill::LinkI).is_some() {
game.construct_by_id(x_construct.id).unwrap().reduce_cooldowns();
}
// apply buff
- game.add_skill(x_player.id, x_construct.id, Some(y_construct.id), Skill::ScatterI).unwrap();
+ game.add_skill(x_player.id, x_construct.id, Some(y_construct.id), Skill::LinkI).unwrap();
game.player_ready(x_player.id).unwrap();
game.player_ready(y_player.id).unwrap();
game = game.resolve_phase_start();
- assert!(game.construct_by_id(x_construct.id).unwrap().affected(Effect::Scatter));
+ assert!(game.construct_by_id(x_construct.id).unwrap().affected(Effect::Link));
let Resolution { source: _, target: _, event, stages: _ } = game.resolved.pop().unwrap();
match event {
- Event::Effect { effect, skill: _, duration: _, construct_effects: _ } => assert_eq!(effect, Effect::Scatter),
+ Event::Effect { effect, skill: _, duration: _, construct_effects: _ } => assert_eq!(effect, Effect::Link),
_ => panic!("not siphon"),
};
let Resolution { source: _, target: _, event, stages: _ } = game.resolved.pop().unwrap();
match event {
Event::Recharge { red: _, blue: _, skill: _ } => (),
- _ => panic!("scatter result was not recharge"),
+ _ => panic!("link result was not recharge"),
}
- // attack and receive scatter hit
+ // attack and receive link hit
game.add_skill(y_player.id, y_construct.id, Some(x_construct.id), Skill::Attack).unwrap();
game.player_ready(x_player.id).unwrap();
game.player_ready(y_player.id).unwrap();
@@ -1183,7 +1183,7 @@ mod tests {
match event {
Event::Damage { amount, skill: _, mitigation: _, colour: _} =>
assert_eq!(amount, 256.pct(Skill::Attack.multiplier()) >> 1),
- _ => panic!("not damage scatter"),
+ _ => panic!("not damage link"),
};
}
diff --git a/server/src/item.rs b/server/src/item.rs
index 51d0a901..45555723 100644
--- a/server/src/item.rs
+++ b/server/src/item.rs
@@ -148,9 +148,9 @@ pub enum Item {
RuinI,
RuinII,
RuinIII,
- ScatterI,
- ScatterII,
- ScatterIII,
+ LinkI,
+ LinkII,
+ LinkIII,
SilenceI,
SilenceII,
SilenceIII,
@@ -362,9 +362,9 @@ impl Item {
Item::RuinI => Some(Skill::RuinI),
Item::RuinII => Some(Skill::RuinII),
Item::RuinIII => Some(Skill::RuinIII),
- Item::ScatterI => Some(Skill::ScatterI),
- Item::ScatterII => Some(Skill::ScatterII),
- Item::ScatterIII => Some(Skill::ScatterIII),
+ Item::LinkI => Some(Skill::LinkI),
+ Item::LinkII => Some(Skill::LinkII),
+ Item::LinkIII => Some(Skill::LinkIII),
Item::SilenceI => Some(Skill::SilenceI),
Item::SilenceII => Some(Skill::SilenceII),
Item::SilenceIII => Some(Skill::SilenceIII),
@@ -702,9 +702,9 @@ impl Item {
"Team wide Stun for {:?}T. Stunned constructs are unable to cast skills.",
self.into_skill().unwrap().effect()[0].get_duration()),
- Item::ScatterI |
- Item::ScatterII |
- Item::ScatterIII => format!(
+ Item::LinkI |
+ Item::LinkII |
+ Item::LinkIII => format!(
"Caster links with target. Linked constructs split incoming Damage evenly. Recharges target Blue Life {:?}% of BluePower",
self.into_skill().unwrap().multiplier()),
@@ -790,9 +790,9 @@ impl Item {
Item::TriageI => vec![Item::Buff, Item::Green, Item::Green],
Item::TriageII => vec![Item::TriageI, Item::TriageI, Item::TriageI],
Item::TriageIII => vec![Item::TriageII, Item::TriageII, Item::TriageII],
- Item::ScatterI => vec![Item::Buff, Item::Blue, Item::Blue],
- Item::ScatterII => vec![Item::ScatterI, Item::ScatterI, Item::ScatterI],
- Item::ScatterIII => vec![Item::ScatterIII, Item::ScatterIII, Item::ScatterIII],
+ Item::LinkI => vec![Item::Buff, Item::Blue, Item::Blue],
+ Item::LinkII => vec![Item::LinkI, Item::LinkI, Item::LinkI],
+ Item::LinkIII => vec![Item::LinkIII, Item::LinkIII, Item::LinkIII],
Item::HasteI => vec![Item::Buff, Item::Red, Item::Green],
Item::HasteII => vec![Item::HasteI, Item::HasteI, Item::HasteI],
Item::HasteIII => vec![Item::HasteII, Item::HasteII, Item::HasteII],
@@ -1018,9 +1018,9 @@ impl From for Item {
Skill::RuinI => Item::RuinI,
Skill::RuinII => Item::RuinII,
Skill::RuinIII => Item::RuinIII,
- Skill::ScatterI => Item::ScatterI,
- Skill::ScatterII => Item::ScatterII,
- Skill::ScatterIII => Item::ScatterIII,
+ Skill::LinkI => Item::LinkI,
+ Skill::LinkII => Item::LinkII,
+ Skill::LinkIII => Item::LinkIII,
Skill::SilenceI => Item::SilenceI,
Skill::SilenceII => Item::SilenceII,
Skill::SilenceIII => Item::SilenceIII,
@@ -1162,9 +1162,9 @@ pub fn get_combos() -> Vec {
Combo { components: Item::TriageII.combo(), item: Item::TriageII },
Combo { components: Item::TriageIII.combo(), item: Item::TriageIII },
- Combo { components: Item::ScatterI.combo(), item: Item::ScatterI },
- Combo { components: Item::ScatterII.combo(), item: Item::ScatterII },
- Combo { components: Item::ScatterIII.combo(), item: Item::ScatterIII },
+ Combo { components: Item::LinkI.combo(), item: Item::LinkI },
+ Combo { components: Item::LinkII.combo(), item: Item::LinkII },
+ Combo { components: Item::LinkIII.combo(), item: Item::LinkIII },
Combo { components: Item::HasteI.combo(), item: Item::HasteI },
Combo { components: Item::HasteII.combo(), item: Item::HasteII },
diff --git a/server/src/skill.rs b/server/src/skill.rs
index 6b582295..299c2be3 100644
--- a/server/src/skill.rs
+++ b/server/src/skill.rs
@@ -212,9 +212,9 @@ pub fn resolve(skill: Skill, source: &mut Construct, target: &mut Construct, mut
Skill::RuinII |
Skill::RuinIII => ruin(source, target, resolutions, skill),
- Skill::ScatterI |
- Skill::ScatterII |
- Skill::ScatterIII => scatter(source, target, resolutions, skill), // target is immune to magic damage and fx
+ Skill::LinkI |
+ Skill::LinkII |
+ Skill::LinkIII => link(source, target, resolutions, skill), // target is immune to magic damage and fx
Skill::SilenceI |
Skill::SilenceII |
@@ -315,10 +315,10 @@ fn post_resolve(_skill: Skill, game: &mut Game, mut resolutions: Resolutions) ->
};
}
- // beware that scatter doesn't cause any damage
+ // beware that link doesn't cause any damage
// because then applying it will proc this
- if target.affected(Effect::Scatter) {
- resolutions = scatter_hit(&source, &target, resolutions, game, event)
+ if target.affected(Effect::Link) {
+ resolutions = link_hit(&source, &target, resolutions, game, event)
}
},
@@ -587,9 +587,9 @@ pub enum Skill {
RuinII,
RuinIII,
- ScatterI,
- ScatterII,
- ScatterIII,
+ LinkI,
+ LinkII,
+ LinkIII,
SilenceI,
SilenceII,
@@ -711,9 +711,9 @@ impl Skill {
// Buff base
Skill::HybridBlast => 25,
Skill::HasteStrike => 30,
- Skill::ScatterI => 140,
- Skill::ScatterII => 200,
- Skill::ScatterIII => 300,
+ Skill::LinkI => 140,
+ Skill::LinkII => 200,
+ Skill::LinkIII => 300,
Skill::InterceptI => 80,
Skill::InterceptII => 110,
Skill::InterceptIII => 150,
@@ -838,9 +838,9 @@ impl Skill {
Skill::PurgeII => vec![ConstructEffect {effect: Effect::Purge, duration: 2, meta: None, tick: None}],
Skill::PurgeIII => vec![ConstructEffect {effect: Effect::Purge, duration: 3, meta: None, tick: None}],
- Skill::ScatterI => vec![ConstructEffect {effect: Effect::Scatter, duration: 2, meta: None, tick: None}],
- Skill::ScatterII => vec![ConstructEffect {effect: Effect::Scatter, duration: 3, meta: None, tick: None}],
- Skill::ScatterIII => vec![ConstructEffect {effect: Effect::Scatter, duration: 4, meta: None, tick: None}],
+ Skill::LinkI => vec![ConstructEffect {effect: Effect::Link, duration: 2, meta: None, tick: None}],
+ Skill::LinkII => vec![ConstructEffect {effect: Effect::Link, duration: 3, meta: None, tick: None}],
+ Skill::LinkIII => vec![ConstructEffect {effect: Effect::Link, duration: 4, meta: None, tick: None}],
Skill::SilenceI => vec![ConstructEffect {effect: Effect::Silence, duration: 2, meta: None, tick: None}],
Skill::SilenceII => vec![ConstructEffect {effect: Effect::Silence, duration: 3, meta: None, tick: None}],
@@ -949,9 +949,9 @@ impl Skill {
Skill::CurseII => Some(1),
Skill::CurseIII => Some(1),
- Skill::ScatterI => Some(2),
- Skill::ScatterII => Some(2),
- Skill::ScatterIII => Some(2),
+ Skill::LinkI => Some(2),
+ Skill::LinkII => Some(2),
+ Skill::LinkIII => Some(2),
Skill::SilenceI => Some(3),
Skill::SilenceII => Some(2),
@@ -1171,9 +1171,9 @@ impl Skill {
Skill::ReflectI |
Skill::ReflectII |
Skill::ReflectIII |
- Skill::ScatterI |
- Skill::ScatterII |
- Skill::ScatterIII |
+ Skill::LinkI |
+ Skill::LinkII |
+ Skill::LinkIII |
Skill::TriageI |
Skill::TriageII |
Skill::TriageIII => true,
@@ -1593,40 +1593,40 @@ fn siphon_tick(source: &mut Construct, target: &mut Construct, mut results: Reso
return results;
}
-fn scatter(source: &mut Construct, target: &mut Construct, mut results: Resolutions, skill: Skill) -> Resolutions {
+fn link(source: &mut Construct, target: &mut Construct, mut results: Resolutions, skill: Skill) -> Resolutions {
let blue_amount = source.blue_power().pct(skill.multiplier());
results.push(Resolution::new(source, target).event(target.recharge(skill, 0, blue_amount)));
- let scatter = skill.effect()[0].set_meta(EffectMeta::ScatterTarget(target.id));
- results.push(Resolution::new(source, target).event(source.add_effect(skill, scatter)).stages(LogStages::PostOnly));
+ let link = skill.effect()[0].set_meta(EffectMeta::LinkTarget(target.id));
+ results.push(Resolution::new(source, target).event(source.add_effect(skill, link)).stages(LogStages::PostOnly));
return results;
}
-fn scatter_hit(source: &Construct, target: &Construct, mut results: Resolutions, game: &mut Game, event: Event) -> Resolutions {
+fn link_hit(source: &Construct, target: &Construct, mut results: Resolutions, game: &mut Game, event: Event) -> Resolutions {
match event {
Event::Damage { amount, skill, mitigation: _, colour } => {
- let scatter = target.effects.iter().find(|e| e.effect == Effect::Scatter).unwrap();
+ let link = target.effects.iter().find(|e| e.effect == Effect::Link).unwrap();
- if let Some(EffectMeta::ScatterTarget(scatter_target_id)) = scatter.meta {
- let mut scatter_target = game.construct_by_id(scatter_target_id).unwrap();
+ if let Some(EffectMeta::LinkTarget(link_target_id)) = link.meta {
+ let mut link_target = game.construct_by_id(link_target_id).unwrap();
let res = match colour {
- Colour::Red => scatter_target.deal_red_damage(skill, amount),
- Colour::Blue => scatter_target.deal_blue_damage(skill, amount),
- Colour::Green => scatter_target.deal_green_damage(skill, amount),
+ Colour::Red => link_target.deal_red_damage(skill, amount),
+ Colour::Blue => link_target.deal_blue_damage(skill, amount),
+ Colour::Green => link_target.deal_green_damage(skill, amount),
};
- results.push(Resolution::new(target, scatter_target).event(Event::Skill { skill: Skill::ScatterI }));
- res.into_iter().for_each(|e| results.push(Resolution::new(&source, &scatter_target)
+ results.push(Resolution::new(target, link_target).event(Event::Skill { skill: Skill::LinkI }));
+ res.into_iter().for_each(|e| results.push(Resolution::new(&source, &link_target)
.event(e).stages(LogStages::EndPost)));
} else {
- panic!("not a scatter target {:?}", scatter);
+ panic!("not a link target {:?}", link);
}
return results;
},
- _ => panic!("{:?} scatter hit not damage event", event),
+ _ => panic!("{:?} link hit not damage event", event),
}
}