From 0ac662962493f6e1e9790b85d8607c56a053fc69 Mon Sep 17 00:00:00 2001 From: ntr Date: Mon, 30 Sep 2019 21:18:48 +1000 Subject: [PATCH 01/28] logrocket --- client/package.json | 1 + client/src/app.jsx | 6 ++++++ 2 files changed, 7 insertions(+) diff --git a/client/package.json b/client/package.json index 4fd0e2f6..a97bc66a 100644 --- a/client/package.json +++ b/client/package.json @@ -24,6 +24,7 @@ "keymaster": "^1.6.2", "linkstate": "^1.1.1", "lodash": "^4.17.15", + "logrocket": "^1.0.3", "node-sass": "^4.12.0", "parcel": "^1.12.3", "preact": "^8.4.2", diff --git a/client/src/app.jsx b/client/src/app.jsx index ab17520c..c4cfb902 100644 --- a/client/src/app.jsx +++ b/client/src/app.jsx @@ -1,6 +1,8 @@ const preact = require('preact'); // const logger = require('redux-diff-logger'); +const LogRocket = require('logrocket'); + const { Provider, connect } = require('preact-redux'); const { createStore, combineReducers } = require('redux'); const { StripeProvider } = require('react-stripe-elements'); @@ -13,6 +15,10 @@ const registerEvents = require('./events'); const Mnml = require('./components/mnml'); +if (process.env.NODE_ENV === 'PRODUCTION') { + LogRocket.init('yh0dy3/mnml'); +} + function stripeKey() { if (window.location.host === 'mnml.gg') return 'pk_live_fQGrL1uWww2ot8W1G7vTySAv004ygmnMXq'; return 'pk_test_Cb49tTqTXpzk7nEmlGzRrNJg00AU0aNZDj'; From 2cab610575952a39ffd2b43400f8db8cca45a6d3 Mon Sep 17 00:00:00 2001 From: ntr Date: Tue, 1 Oct 2019 15:54:48 +1000 Subject: [PATCH 02/28] meta tags --- client/assets/styles/styles.less | 2 +- client/assets/styles/styles.mobile.css | 1 + client/index.html | 8 +++++--- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/client/assets/styles/styles.less b/client/assets/styles/styles.less index 589fc2d8..6f47fe2d 100644 --- a/client/assets/styles/styles.less +++ b/client/assets/styles/styles.less @@ -23,7 +23,7 @@ html body { /* stops inspector going skitz*/ overflow-x: hidden; - // overflow-y: hidden; + overflow-y: hidden; } @media (min-width: 1921px) { diff --git a/client/assets/styles/styles.mobile.css b/client/assets/styles/styles.mobile.css index 8cc73e6f..137e57b8 100644 --- a/client/assets/styles/styles.mobile.css +++ b/client/assets/styles/styles.mobile.css @@ -11,6 +11,7 @@ height: 100vh; max-height: initial; min-height: initial; + overflow-y: initial; } #mnml button { diff --git a/client/index.html b/client/index.html index 4ea0190e..57f8602d 100644 --- a/client/index.html +++ b/client/index.html @@ -1,13 +1,15 @@ - mnml - abstract strategy - - + + + + + mnml - abstract strategy From defcadbad29b081eceb115c2d60aee01ebe7786f Mon Sep 17 00:00:00 2001 From: Mashy Date: Tue, 1 Oct 2019 16:34:51 +1000 Subject: [PATCH 03/28] remove double tick dots, lose electrify on application --- WORKLOG.md | 4 ++++ server/src/skill.rs | 41 +++++++++++++++++++++++++++++++++++------ 2 files changed, 39 insertions(+), 6 deletions(-) diff --git a/WORKLOG.md b/WORKLOG.md index 8f93a003..4c2aa9e2 100644 --- a/WORKLOG.md +++ b/WORKLOG.md @@ -10,6 +10,8 @@ * can't reset password without knowing password =\ +* fix recharge combat display bug + ## SOON (Before or After PAX) * bot game grind @@ -45,6 +47,8 @@ reconnect based on time delta consolidate game and instance + * return of the combat log (last few events with condensed descriptions) + - click in to scroll * elo + leaderboards * mnml tv diff --git a/server/src/skill.rs b/server/src/skill.rs index a965f7de..949cbec5 100644 --- a/server/src/skill.rs +++ b/server/src/skill.rs @@ -779,7 +779,7 @@ impl Skill { Skill::BashPlusPlus => 140, // Debuff Base - Skill::DecayTick=> 25, + Skill::DecayTick=> 33, Skill::DecayTickPlus => 45, Skill::DecayTickPlusPlus => 70, Skill::Silence=> 55, // Deals more per blue skill on target @@ -1458,6 +1458,7 @@ fn heal(source: &mut Construct, target: &mut Construct, mut results: Resolutions } fn triage(source: &mut Construct, target: &mut Construct, mut results: Resolutions, skill: Skill) -> Resolutions { + let skip_tick = target.effects.iter().any(|e| e.effect == Effect::Triage); let ConstructEffect { effect, duration, meta, tick: _ } = skill.effect()[0]; let tick_skill = match meta { Some(EffectMeta::Skill(s)) => s, @@ -1465,7 +1466,11 @@ fn triage(source: &mut Construct, target: &mut Construct, mut results: Resolutio }; let triage = ConstructEffect::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, tick_skill); + + match skip_tick { + true => return results, + false => return triage_tick(source, target, results, tick_skill) + } } fn triage_tick(source: &mut Construct, target: &mut Construct, mut results: Resolutions, skill: Skill) -> Resolutions { @@ -1519,6 +1524,7 @@ fn decay(source: &mut Construct, target: &mut Construct, mut results: Resolution let wither = skill.effect()[0]; results.push(Resolution::new(source, target).event(target.add_effect(skill, wither))); + let skip_tick = target.effects.iter().any(|e| e.effect == Effect::Decay); let ConstructEffect { effect, duration, meta, tick: _ } = skill.effect()[1]; let tick_skill = match meta { Some(EffectMeta::Skill(s)) => s, @@ -1529,7 +1535,10 @@ fn decay(source: &mut Construct, target: &mut Construct, mut results: Resolution .event(target.add_effect(skill, decay)) .stages(EventStages::PostOnly)); - return decay_tick(source, target, results, tick_skill); + match skip_tick { + true => return results, + false => return decay_tick(source, target, results, tick_skill) + } } fn decay_tick(source: &mut Construct, target: &mut Construct, mut results: Resolutions, skill: Skill) -> Resolutions { @@ -1549,17 +1558,32 @@ fn electrify(source: &mut Construct, target: &mut Construct, mut results: Resolu } fn electrocute(source: &mut Construct, target: &mut Construct, mut results: Resolutions, skill: Skill) -> Resolutions { - + // Remove electric buff, no need to display if construct is dead + if !source.is_ko() { + let electric = source.effects.iter().position(|e| e.effect == Effect::Electric).expect("No electrify"); + let ce = source.effects.remove(electric); + results.push(Resolution::new(source, source) + .event(Event::Removal { effect: ce.effect, construct_effects: source.effects.clone() }) + .stages(EventStages::PostOnly)); + } + let ConstructEffect { effect, duration, meta, tick: _ } = skill.effect()[0]; let tick_skill = match meta { Some(EffectMeta::Skill(s)) => s, _ => panic!("no electrocute tick skill"), }; + + let skip_tick = target.effects.iter().any(|e| e.effect == Effect::Electrocute); let electrocute = ConstructEffect::new(effect, duration).set_tick(Cast::new_tick(source, target, tick_skill)); results.push(Resolution::new(source, target) .event(target.add_effect(skill, electrocute)) .stages(EventStages::EndPost)); - return electrocute_tick(source, target, results, tick_skill); + + + match skip_tick { + true => return results, + false => return electrocute_tick(source, target, results, tick_skill) + } } fn electrocute_tick(source: &mut Construct, target: &mut Construct, mut results: Resolutions, skill: Skill) -> Resolutions { @@ -1633,6 +1657,8 @@ fn recharge(source: &mut Construct, target: &mut Construct, mut results: Resolut } fn siphon(source: &mut Construct, target: &mut Construct, mut results: Resolutions, skill: Skill) -> Resolutions { + + let skip_tick = target.effects.iter().any(|e| e.effect == Effect::Siphon); let ConstructEffect { effect, duration, meta, tick: _ } = skill.effect()[0]; let tick_skill = match meta { Some(EffectMeta::Skill(s)) => s, @@ -1641,7 +1667,10 @@ fn siphon(source: &mut Construct, target: &mut Construct, mut results: Resolutio let siphon = ConstructEffect::new(effect, duration).set_tick(Cast::new_tick(source, target, tick_skill)); results.push(Resolution::new(source, target).event(target.add_effect(skill, siphon))); - return siphon_tick(source, target, results, tick_skill); + match skip_tick { + true => return results, + false => return siphon_tick(source, target, results, tick_skill) + } } fn siphon_tick(source: &mut Construct, target: &mut Construct, mut results: Resolutions, skill: Skill) -> Resolutions { From 86b73fc71a9f08a1b1f360d7c7bdd6f7fa2de1d7 Mon Sep 17 00:00:00 2001 From: Mashy Date: Tue, 1 Oct 2019 17:16:18 +1000 Subject: [PATCH 04/28] match electric buff check --- server/src/skill.rs | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/server/src/skill.rs b/server/src/skill.rs index 949cbec5..966771c0 100644 --- a/server/src/skill.rs +++ b/server/src/skill.rs @@ -1560,11 +1560,16 @@ fn electrify(source: &mut Construct, target: &mut Construct, mut results: Resolu fn electrocute(source: &mut Construct, target: &mut Construct, mut results: Resolutions, skill: Skill) -> Resolutions { // Remove electric buff, no need to display if construct is dead if !source.is_ko() { - let electric = source.effects.iter().position(|e| e.effect == Effect::Electric).expect("No electrify"); - let ce = source.effects.remove(electric); - results.push(Resolution::new(source, source) - .event(Event::Removal { effect: ce.effect, construct_effects: source.effects.clone() }) - .stages(EventStages::PostOnly)); + let electric = source.effects.iter().position(|e| e.effect == Effect::Electric); + match electric { + Some(eff) => { + let ce = source.effects.remove(eff); + results.push(Resolution::new(source, source) + .event(Event::Removal { effect: ce.effect, construct_effects: source.effects.clone() }) + .stages(EventStages::PostOnly)); + } + None => () + } } let ConstructEffect { effect, duration, meta, tick: _ } = skill.effect()[0]; From 85ec220511a3aeb465006a8816969149f3c2c6a2 Mon Sep 17 00:00:00 2001 From: Mashy Date: Wed, 2 Oct 2019 12:37:11 +1000 Subject: [PATCH 05/28] fix electrocute reflect --- server/src/skill.rs | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/server/src/skill.rs b/server/src/skill.rs index 966771c0..85f67625 100644 --- a/server/src/skill.rs +++ b/server/src/skill.rs @@ -299,7 +299,16 @@ fn post_resolve(_skill: Skill, game: &mut Game, mut resolutions: Resolutions) -> .find(|e| e.effect == Effect::Electric).unwrap().clone(); match meta { Some(EffectMeta::Skill(s)) => { - resolutions = electrocute(&mut target, &mut source, resolutions, s); + // Gurad against reflect overflow + if !(source.affected(Effect::Reflect) && target.affected(Effect::Reflect)) { + // Check reflect don't bother if electrocute is procing on death + if source.affected(Effect::Reflect) && !target.is_ko() { + resolutions.push(Resolution::new(&target, &source).event(Event::Reflection { skill: s }).stages(EventStages::EndPost)); + resolutions = electrocute(&mut source, &mut target, resolutions, s); + } else { + resolutions = electrocute(&mut target, &mut source, resolutions, s); + } + } }, _ => panic!("no electrify skill"), }; From 16d319c7061dbf9a1998ee016b977043461975df Mon Sep 17 00:00:00 2001 From: Mashy Date: Wed, 2 Oct 2019 14:39:36 +1000 Subject: [PATCH 06/28] reflect no longer triggers on ticks --- WORKLOG.md | 1 + server/src/skill.rs | 5 +++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/WORKLOG.md b/WORKLOG.md index 4c2aa9e2..ddf6f124 100644 --- a/WORKLOG.md +++ b/WORKLOG.md @@ -51,6 +51,7 @@ - click in to scroll * elo + leaderboards + * reflect event stages (for animations) * mnml tv ## LATER diff --git a/server/src/skill.rs b/server/src/skill.rs index 85f67625..787e5c61 100644 --- a/server/src/skill.rs +++ b/server/src/skill.rs @@ -78,7 +78,7 @@ pub fn resolve(skill: Skill, source: &mut Construct, target: &mut Construct, mut return resolutions; } - if target.affected(Effect::Reflect) && skill.colours().contains(&Colour::Blue) { + if target.affected(Effect::Reflect) && skill.colours().contains(&Colour::Blue) && !skill.is_tick() { // guard against overflow if source.affected(Effect::Reflect) { return resolutions; @@ -303,7 +303,8 @@ fn post_resolve(_skill: Skill, game: &mut Game, mut resolutions: Resolutions) -> if !(source.affected(Effect::Reflect) && target.affected(Effect::Reflect)) { // Check reflect don't bother if electrocute is procing on death if source.affected(Effect::Reflect) && !target.is_ko() { - resolutions.push(Resolution::new(&target, &source).event(Event::Reflection { skill: s }).stages(EventStages::EndPost)); + resolutions.push(Resolution::new(&target, &source) + .event(Event::Reflection { skill: s }).stages(EventStages::EndPost)); resolutions = electrocute(&mut source, &mut target, resolutions, s); } else { resolutions = electrocute(&mut target, &mut source, resolutions, s); From 962b72b85f97ca9c1c770bd650a00aa1025dd30d Mon Sep 17 00:00:00 2001 From: Mashy Date: Wed, 2 Oct 2019 16:06:39 +1000 Subject: [PATCH 07/28] fix recharge show current red / blue life during combat, skip if 0 recharge and apply css --- WORKLOG.md | 2 -- client/src/animations.utils.jsx | 5 ++- server/src/skill.rs | 56 ++++++++++++++++++++++++--------- 3 files changed, 45 insertions(+), 18 deletions(-) diff --git a/WORKLOG.md b/WORKLOG.md index ddf6f124..4419f540 100644 --- a/WORKLOG.md +++ b/WORKLOG.md @@ -10,8 +10,6 @@ * can't reset password without knowing password =\ -* fix recharge combat display bug - ## SOON (Before or After PAX) * bot game grind diff --git a/client/src/animations.utils.jsx b/client/src/animations.utils.jsx index 39ef17ef..788ba2f0 100644 --- a/client/src/animations.utils.jsx +++ b/client/src/animations.utils.jsx @@ -177,7 +177,10 @@ function getText(resolution, sequence) { if (type === 'Recharge') { const { red, blue } = event; - return { text: [`+${red}R ${blue}B`, ''], css: '' }; + if (red > 0 && blue > 0) return { text: [`+${red}R +${blue}B`, ''], css: 'purple-damage' }; + if (red > 0) return { text: [`+${red}R`, ''], css: 'red-damage' }; + if (blue > 0) return { text: [`+${blue}B`, ''], css: 'blue-damage' }; + return nullText; } if (type === 'Removal') { diff --git a/server/src/skill.rs b/server/src/skill.rs index 787e5c61..44cead79 100644 --- a/server/src/skill.rs +++ b/server/src/skill.rs @@ -1358,22 +1358,36 @@ fn sleep(source: &mut Construct, target: &mut Construct, mut results: Resolution fn sustain(source: &mut Construct, target: &mut Construct, mut results: Resolutions, skill: Skill) -> Resolutions { let red_amount = source.red_power().pct(skill.multiplier()); - results.push(Resolution::new(source, target) - .event(target.recharge(skill, red_amount, 0))); + results.push(Resolution::new(source, target).event(target.add_effect(skill, skill.effect()[0]))); + let e = target.recharge(skill, red_amount, 0); + let stages = match e { + Event::Recharge { red, blue, skill: _ } => { + if red > 0 || blue > 0 { EventStages::PostOnly } + else { EventStages::None } + } + _ => panic!("not recharge") + }; - results.push(Resolution::new(source, target) - .event(target.add_effect(skill, skill.effect()[0])) - .stages(EventStages::PostOnly)); + results.push(Resolution::new(source, target).event(e).stages(stages)); return results; } fn intercept(source: &mut Construct, target: &mut Construct, mut results: Resolutions, skill: Skill) -> Resolutions { - let red_amount = source.red_power().pct(skill.multiplier()); - results.push(Resolution::new(source, target).event(target.recharge(skill, red_amount, 0))); - let intercept = skill.effect()[0]; - results.push(Resolution::new(source, target).event(target.add_effect(skill, intercept)).stages(EventStages::PostOnly)); + results.push(Resolution::new(source, target).event(target.add_effect(skill, intercept))); + + let red_amount = source.red_power().pct(skill.multiplier()); + let e = target.recharge(skill, red_amount, 0); + let stages = match e { + Event::Recharge { red, blue, skill: _ } => { + if red > 0 || blue > 0 { EventStages::PostOnly } + else { EventStages::None } + } + _ => panic!("not recharge") + }; + results.push(Resolution::new(source, target).event(e).stages(stages)); + return results; } @@ -1656,18 +1670,30 @@ fn reflect(source: &mut Construct, target: &mut Construct, mut results: Resoluti results.push(Resolution::new(source, target).event(target.add_effect(skill, skill.effect()[0]))); let blue_amount = source.blue_power().pct(skill.multiplier()); - results.push(Resolution::new(source, target) - .event(target.recharge(skill, 0, blue_amount)) - .stages(EventStages::PostOnly)); - + let e = target.recharge(skill, 0, blue_amount); + let stages = match e { + Event::Recharge { red, blue, skill: _ } => { + if red > 0 || blue > 0 { EventStages::PostOnly } + else { EventStages::None } + } + _ => panic!("not recharge") + }; + results.push(Resolution::new(source, target).event(e).stages(stages)); return results;; } fn recharge(source: &mut Construct, target: &mut Construct, mut results: Resolutions, skill: Skill) -> Resolutions { let red_amount = source.red_power().pct(skill.multiplier()); let blue_amount = source.blue_power().pct(skill.multiplier()); - - results.push(Resolution::new(source, target).event(target.recharge(skill, red_amount, blue_amount))); + let e = target.recharge(skill, red_amount, blue_amount); + let stages = match e { + Event::Recharge { red, blue, skill: _ } => { + if red > 0 || blue > 0 { EventStages::AllStages } + else { EventStages::StartEnd } + } + _ => panic!("not recharge") + }; + results.push(Resolution::new(source, target).event(e).stages(stages)); return results; } From 0f1ae4d17a6b5d0dd8dc477a3445fadb05e082a6 Mon Sep 17 00:00:00 2001 From: Mashy Date: Thu, 3 Oct 2019 15:21:19 +1000 Subject: [PATCH 08/28] background for active skills --- client/assets/styles/game.less | 6 ++++++ client/src/components/anims/wiggle.jsx | 2 +- client/src/components/skill.btn.jsx | 3 +-- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/client/assets/styles/game.less b/client/assets/styles/game.less index 5e9586de..342350b6 100644 --- a/client/assets/styles/game.less +++ b/client/assets/styles/game.less @@ -116,6 +116,9 @@ height: 2em; height: 25%; } + button.active { + background: #2c2c2c; + } } .effects { @@ -337,6 +340,9 @@ padding: 0 0.5em ; margin: 0; } + button.active { + background: #2c2c2c; + } } .stats div { diff --git a/client/src/components/anims/wiggle.jsx b/client/src/components/anims/wiggle.jsx index 995af86a..b11a69c3 100644 --- a/client/src/components/anims/wiggle.jsx +++ b/client/src/components/anims/wiggle.jsx @@ -6,7 +6,7 @@ function wiggle(id, idle) { const x = window.screen.width * 0.01 * (Math.round(Math.random()) ? Math.random() : -Math.random()); const y = window.screen.height * 0.01 * (Math.round(Math.random()) ? Math.random() : -Math.random()); - console.log(x, y); + // console.log(x, y); return anime({ targets: target, rotate: 0, diff --git a/client/src/components/skill.btn.jsx b/client/src/components/skill.btn.jsx index d1f39939..96ac70fe 100644 --- a/client/src/components/skill.btn.jsx +++ b/client/src/components/skill.btn.jsx @@ -55,7 +55,6 @@ function Skill(props) { // if (skillChosen && !targeting) { // return false; // } - const cdText = construct.skills[i].cd > 0 ? `- ${s.cd}T` : ''; @@ -72,7 +71,7 @@ function Skill(props) { return (