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];