diff --git a/CHANGELOG.md b/CHANGELOG.md
index 1d23182c..46d96690 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -113,7 +113,7 @@ New skill `Hybrid`
Changed to Buff + RR (was Buff + RG)
Now recharges 80% source red damage as red life to target
-- Throw
+- Break
Stun duration reduced from 2T -> 1T
Vulnerable dmg bonus reduced 200% -> 150%
@@ -178,7 +178,7 @@ New skill `Hybrid`
Hex is now Stun + GB (was Stun + RB)
Banish is now Stun + RB (was Stun + RG) for rng theme
- Throw is now Stun + RG (was Stun + GG)
+ Break is now Stun + RG (was Stun + GG)
- Better fit as it applies inc Red taken debuff (vulnerability)
diff --git a/COMBOS.md b/COMBOS.md
index a75ea911..cf563a8c 100644
--- a/COMBOS.md
+++ b/COMBOS.md
@@ -70,7 +70,7 @@ RB - Blast
# Stun Base #
RR - Strangle
-GG - Throw
+GG - Break
BB - Ruin
RG - Banish
GB - Silence
diff --git a/client/.eslintrc.js b/client/.eslintrc.js
index 6fde25f3..3ec74b6b 100644
--- a/client/.eslintrc.js
+++ b/client/.eslintrc.js
@@ -302,8 +302,8 @@ module.exports = {
// disallow use of comma operator
'no-sequences': 'error',
- // restrict what can be thrown as an exception
- 'no-throw-literal': 'error',
+ // restrict what can be breakn as an exception
+ 'no-break-literal': 'error',
// disallow unmodified conditions of loops
// https://eslint.org/docs/rules/no-unmodified-loop-condition
@@ -479,10 +479,10 @@ module.exports = {
// https://eslint.org/docs/rules/no-unexpected-multiline
'no-unexpected-multiline': 'error',
- // disallow unreachable statements after a return, throw, continue, or break statement
+ // disallow unreachable statements after a return, break, continue, or break statement
'no-unreachable': 'error',
- // disallow return/throw/break/continue inside finally blocks
+ // disallow return/break/break/continue inside finally blocks
// https://eslint.org/docs/rules/no-unsafe-finally
'no-unsafe-finally': 'error',
@@ -870,7 +870,7 @@ module.exports = {
after: true,
overrides: {
return: { after: true },
- throw: { after: true },
+ break: { after: true },
case: { after: true }
}
}],
diff --git a/client/src/animations.test.jsx b/client/src/animations.test.jsx
index 9cfbda91..1cda0e2a 100644
--- a/client/src/animations.test.jsx
+++ b/client/src/animations.test.jsx
@@ -111,7 +111,7 @@ const SKILLS = [
'SleepI',
'StrikeI',
'SustainI',
- 'ThrowI',
+ 'BreakI',
'TriageI',
'TriageTickI',
];
diff --git a/client/src/components/animations.jsx b/client/src/components/animations.jsx
index f60207f8..727d9c8e 100644
--- a/client/src/components/animations.jsx
+++ b/client/src/components/animations.jsx
@@ -10,6 +10,7 @@ const Bash = require('./anims/bash');
const Blast = require('./anims/blast');
const Block = require('./anims/block');
const Buff = require('./anims/buff');
+const Break = require('./anims/break');
const Chaos = require('./anims/chaos');
const Sustain = require('./anims/sustain');
const Counter = require('./anims/counter');
@@ -143,7 +144,7 @@ function animations(props) {
case 'Bash': return ;
case 'Absorb': return ;
case 'Sleep': return ;
- case 'Throw': return false;
+ case 'Break': return ;
case 'Ruin': return false;
// Block Base
diff --git a/client/src/components/anims/break.jsx b/client/src/components/anims/break.jsx
new file mode 100644
index 00000000..8a984d6d
--- /dev/null
+++ b/client/src/components/anims/break.jsx
@@ -0,0 +1,93 @@
+const preact = require('preact');
+const { Component } = require('preact');
+const anime = require('animejs').default;
+
+const { TIMES } = require('../../constants');
+
+// logarithmic spiral lifted from
+// https://upload.wikimedia.org/wikipedia/commons/5/5b/Logarithmic_spiral_(1).svg
+
+class Break extends Component {
+ constructor() {
+ super();
+ this.animations = [];
+ }
+
+ render() {
+ const path = 'M0,100 C100,100 100,100 200,100';
+
+ return (
+
+ );
+ }
+
+ componentDidMount() {
+ this.animations.push(anime({
+ targets: ['#break'],
+ opacity: [
+ { value: 1, delay: TIMES.TARGET_DELAY_MS, duration: TIMES.TARGET_DURATION_MS * 0.2 },
+ { value: 0, delay: TIMES.TARGET_DURATION_MS * 0.6, duration: TIMES.TARGET_DURATION_MS * 0.2 },
+ ],
+ easing: 'easeInOutSine',
+ }));
+
+ this.animations.push(anime({
+ targets: ['#break'],
+ rotate: 180,
+ easing: 'linear',
+ loop: true,
+ delay: TIMES.TARGET_DELAY_MS,
+ duration: TIMES.TARGET_DURATION_MS,
+ }));
+
+ this.animations.push(anime({
+ targets: ['#breakFilter feTurbulence', '#breakFilter feDisplacementMap'],
+ baseFrequency: 2,
+ scale: 10,
+ numOctaves: 5,
+ easing: 'easeOutSine',
+
+ delay: TIMES.TARGET_DELAY_MS,
+ duration: TIMES.TARGET_DURATION_MS,
+ }));
+
+ }
+
+ // 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 = Break;
diff --git a/client/src/test.instance.js b/client/src/test.instance.js
index 8619eeab..b1e77036 100644
--- a/client/src/test.instance.js
+++ b/client/src/test.instance.js
@@ -261,7 +261,7 @@ function testInstance(uuid) {
"cd": null
},
{
- "skill": "Throw",
+ "skill": "Break",
"self_targeting": false,
"cd": 1
},
@@ -835,7 +835,7 @@ function testInstance(uuid) {
"cd": null
},
{
- "skill": "Throw",
+ "skill": "Break",
"self_targeting": false,
"cd": 1
},
@@ -961,7 +961,7 @@ function testInstance(uuid) {
"cd": 3
},
{
- "skill": "Throw",
+ "skill": "Break",
"self_targeting": false,
"cd": 1
}
@@ -2112,7 +2112,7 @@ function testInstance(uuid) {
"cd": null
},
{
- "skill": "Throw",
+ "skill": "Break",
"self_targeting": false,
"cd": 1
},
diff --git a/client/src/utils.jsx b/client/src/utils.jsx
index ba71dd37..4c1ebb46 100644
--- a/client/src/utils.jsx
+++ b/client/src/utils.jsx
@@ -369,7 +369,7 @@ const removeTier = skill => {
if (skill.includes('Bash')) return 'Bash';
if (skill.includes('Sleep')) return 'Sleep';
if (skill.includes('Ruin')) return 'Ruin';
- if (skill.includes('Throw')) return 'Throw';
+ if (skill.includes('Break')) return 'Break';
if (skill.includes('Hex')) return 'Hex';
if (skill.includes('Absorb')) return 'Absorb';
if (skill.includes('Banish')) return 'Banish';
diff --git a/server/src/item.rs b/server/src/item.rs
index 45555723..39a3006e 100644
--- a/server/src/item.rs
+++ b/server/src/item.rs
@@ -172,9 +172,9 @@ pub enum Item {
InterceptI,
InterceptII,
InterceptIII,
- ThrowI,
- ThrowII,
- ThrowIII,
+ BreakI,
+ BreakII,
+ BreakIII,
TriageI,
TriageII,
TriageIII,
@@ -384,9 +384,9 @@ impl Item {
Item::SustainI => Some(Skill::SustainI),
Item::SustainII => Some(Skill::SustainII),
Item::SustainIII => Some(Skill::SustainIII),
- Item::ThrowI => Some(Skill::ThrowI),
- Item::ThrowII => Some(Skill::ThrowII),
- Item::ThrowIII => Some(Skill::ThrowIII),
+ Item::BreakI => Some(Skill::BreakI),
+ Item::BreakII => Some(Skill::BreakII),
+ Item::BreakIII => Some(Skill::BreakIII),
Item::TriageI => Some(Skill::TriageI),
Item::TriageII => Some(Skill::TriageII),
Item::TriageIII => Some(Skill::TriageIII),
@@ -765,9 +765,9 @@ impl Item {
self.into_skill().unwrap().effect()[0].get_duration(),
self.into_skill().unwrap().multiplier()),
- Item::ThrowI |
- Item::ThrowII |
- Item::ThrowIII => format!(
+ Item::BreakI |
+ Item::BreakII |
+ Item::BreakIII => format!(
"Stun the target for {:?}T and applies Vulnerable increasing RedDamage taken by {:?}% for {:?}T",
self.into_skill().unwrap().effect()[0].get_duration(),
self.into_skill().unwrap().effect()[1].get_multiplier() - 100,
@@ -850,9 +850,9 @@ impl Item {
Item::RuinI => vec![Item::Stun, Item::Blue, Item::Blue],
Item::RuinII => vec![Item::RuinI, Item::RuinI, Item::RuinI],
Item::RuinIII => vec![Item::RuinII, Item::RuinII, Item::RuinII],
- Item::ThrowI => vec![Item::Stun, Item::Red, Item::Green],
- Item::ThrowII => vec![Item::ThrowI, Item::ThrowI, Item::ThrowI],
- Item::ThrowIII => vec![Item::ThrowII, Item::ThrowII, Item::ThrowII],
+ Item::BreakI => vec![Item::Stun, Item::Red, Item::Green],
+ Item::BreakII => vec![Item::BreakI, Item::BreakI, Item::BreakI],
+ Item::BreakIII => vec![Item::BreakII, Item::BreakII, Item::BreakII],
Item::AbsorbI => vec![Item::Stun, Item::Green, Item::Blue],
Item::AbsorbII => vec![Item::AbsorbI, Item::AbsorbI, Item::AbsorbI],
Item::AbsorbIII => vec![Item::AbsorbII, Item::AbsorbII, Item::AbsorbII],
@@ -1040,9 +1040,9 @@ impl From for Item {
Skill::SustainI => Item::SustainI,
Skill::SustainII => Item::SustainII,
Skill::SustainIII => Item::SustainIII,
- Skill::ThrowI => Item::ThrowI,
- Skill::ThrowII => Item::ThrowII,
- Skill::ThrowIII => Item::ThrowIII,
+ Skill::BreakI => Item::BreakI,
+ Skill::BreakII => Item::BreakII,
+ Skill::BreakIII => Item::BreakIII,
Skill::TriageI => Item::TriageI,
Skill::TriageII => Item::TriageII,
Skill::TriageIII => Item::TriageIII,
@@ -1235,9 +1235,9 @@ pub fn get_combos() -> Vec {
Combo { components: Item::RuinII.combo(), item: Item::RuinII },
Combo { components: Item::RuinIII.combo(), item: Item::RuinIII },
- Combo { components: Item::ThrowI.combo(), item: Item::ThrowI },
- Combo { components: Item::ThrowII.combo(), item: Item::ThrowII },
- Combo { components: Item::ThrowIII.combo(), item: Item::ThrowIII },
+ Combo { components: Item::BreakI.combo(), item: Item::BreakI },
+ Combo { components: Item::BreakII.combo(), item: Item::BreakII },
+ Combo { components: Item::BreakIII.combo(), item: Item::BreakIII },
Combo { components: Item::AbsorbI.combo(), item: Item::AbsorbI },
Combo { components: Item::AbsorbII.combo(), item: Item::AbsorbII },
Combo { components: Item::AbsorbIII.combo(), item: Item::AbsorbIII },
diff --git a/server/src/skill.rs b/server/src/skill.rs
index 299c2be3..5147ce00 100644
--- a/server/src/skill.rs
+++ b/server/src/skill.rs
@@ -247,9 +247,9 @@ pub fn resolve(skill: Skill, source: &mut Construct, target: &mut Construct, mut
Skill::InterceptII |
Skill::InterceptIII => intercept(source, target, resolutions, skill),
- Skill::ThrowI |
- Skill::ThrowII |
- Skill::ThrowIII => throw(source, target, resolutions, skill), // no damage stun, adds vulnerable
+ Skill::BreakI |
+ Skill::BreakII |
+ Skill::BreakIII => break(source, target, resolutions, skill), // no damage stun, adds vulnerable
Skill::TriageI |
Skill::TriageII |
@@ -622,9 +622,9 @@ pub enum Skill {
InterceptII,
InterceptIII,
- ThrowI, // no damage stun, adds vulnerable
- ThrowII,
- ThrowIII,
+ BreakI, // no damage stun, adds vulnerable
+ BreakII,
+ BreakIII,
TriageI, // hot
TriageII,
@@ -823,11 +823,11 @@ impl Skill {
Skill::ReflectII => vec![ConstructEffect {effect: Effect::Reflect, duration: 2, meta: None, tick: None }],
Skill::ReflectIII => vec![ConstructEffect {effect: Effect::Reflect, duration: 3, meta: None, tick: None }],
- Skill::ThrowI => vec![ConstructEffect {effect: Effect::Stun, duration: 1, meta: None, tick: None},
+ Skill::BreakI => vec![ConstructEffect {effect: Effect::Stun, duration: 1, meta: None, tick: None},
ConstructEffect {effect: Effect::Vulnerable, duration: 3, meta: Some(EffectMeta::Multiplier(150)), tick: None}],
- Skill::ThrowII => vec![ConstructEffect {effect: Effect::Stun, duration: 1, meta: None, tick: None},
+ Skill::BreakII => vec![ConstructEffect {effect: Effect::Stun, duration: 1, meta: None, tick: None},
ConstructEffect {effect: Effect::Vulnerable, duration: 4, meta: Some(EffectMeta::Multiplier(200)), tick: None}],
- Skill::ThrowIII => vec![ConstructEffect {effect: Effect::Stun, duration: 2, meta: None, tick: None},
+ Skill::BreakIII => vec![ConstructEffect {effect: Effect::Stun, duration: 2, meta: None, tick: None},
ConstructEffect {effect: Effect::Vulnerable, duration: 4, meta: Some(EffectMeta::Multiplier(250)), tick: None}],
Skill::RuinI => vec![ConstructEffect {effect: Effect::Stun, duration: 1, meta: None, tick: None}],
@@ -916,9 +916,9 @@ impl Skill {
Skill::TriageII => None, // hot
Skill::TriageIII => None, // hot
- Skill::ThrowI => Some(1), // no damage stun, adds vulnerable
- Skill::ThrowII => Some(1),
- Skill::ThrowIII => Some(1),
+ Skill::BreakI => Some(1), // no damage stun, adds vulnerable
+ Skill::BreakII => Some(1),
+ Skill::BreakIII => Some(1),
Skill::BlastI => None,
Skill::BlastII => None,
@@ -1296,7 +1296,7 @@ fn intercept(source: &mut Construct, target: &mut Construct, mut results: Resolu
return results;
}
-fn throw(source: &mut Construct, target: &mut Construct, mut results: Resolutions, skill: Skill) -> Resolutions {
+fn break(source: &mut Construct, target: &mut Construct, mut results: Resolutions, skill: Skill) -> Resolutions {
let stun = skill.effect()[0];
results.push(Resolution::new(source, target).event(target.add_effect(skill, stun)));
let vuln = skill.effect()[1];