diff --git a/CHANGELOG.md b/CHANGELOG.md index cb28802a..d8674203 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,18 +2,24 @@ All notable changes to this project will be documented in this file. This project adheres to [Semantic Versioning](http://semver.org/). -## [1.5.6] - YYYY-MM-DD +## [1.5.5] - 2019-10-15 ### Changed -`Purge` Fixed bug where client animations would freeze when clearing a buff -`Purge` Cooldown increased to 1T +* Purge + * Fixed bug where client animations would freeze when clearing a buff + * Cooldown increased to 1T +* VBOX + * You can no longer select invalid combinations. -## [0.1.5] - 2019-10-10 +* Controls + * Abandon button now asks for confirmation. + +## [1.1.5] - 2019-10-10 ### Changed `Recharge` Skill multiplier reduced 85/130/200 -> 70/110/170 `Absorption` Skill duration reduced 5/7/9 -> 3/5/7 -## [0.1.4 2019-09-18] +## [1.1.4 2019-09-18] ### Changed Removed self targetting, all skills can be used on any target @@ -22,16 +28,16 @@ Removed self targetting, all skills can be used on any target `Purify` No cooldown `Recharge` No cooldown -`Banish` +`Banish` Now deals 40 / 75 / 125% target red / blue life before applying banish debuff Constant 2T duration at all levels Constant 3T cooldown at all levels -`Link` reworked -> +`Link` reworked -> Stuns caster for 3/2/1T If target has higher green life than caster: - Deal blue damage to target equal to difference between green life - Heal with green damage to source equal to difference between green life + Deal blue damage to target equal to difference between green life + Heal with green damage to source equal to difference between green life `Counter` effect no longer applies immunities Counter no cooldown @@ -39,7 +45,7 @@ Removed self targetting, all skills can be used on any target Counter skill now applies block at 40% / 60% / 80% reduction for 1T Counter no longer recharges red life -`Electrify` +`Electrify` No Cooldown Duration -> 1T Electrocute duration now 2/3/4T diff --git a/VERSION b/VERSION index 63ebd3fe..5ebba4f0 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.5.4 \ No newline at end of file +1.5.5 \ No newline at end of file diff --git a/WORKLOG.md b/WORKLOG.md index 90b71e3a..4aa80673 100644 --- a/WORKLOG.md +++ b/WORKLOG.md @@ -1,5 +1,5 @@ # WORK WORK -## NOW +## NOW *PRODUCTION* @@ -7,7 +7,6 @@ * rename vbox to shop * combat phase info system * drag and drop buy / equip / unequip items -* no combiner overflow (reset above 3) * mobile styles * mobile info page @@ -17,7 +16,7 @@ * can't reset password without knowing password =\ * Invert recharge -## SOON +## SOON * equip from shop (buy and equip without putting in your inventory) for bases @@ -54,7 +53,7 @@ reconnect based on time delta consolidate game and instance - * return of the combat log (last few events with condensed descriptions) + * return of the combat log (last few events with condensed descriptions) - click in to scroll * elo + leaderboards diff --git a/acp/package.json b/acp/package.json index 43040b88..c1034fe4 100644 --- a/acp/package.json +++ b/acp/package.json @@ -1,6 +1,6 @@ { "name": "mnml-client", - "version": "1.5.4", + "version": "1.5.5", "description": "", "main": "index.js", "scripts": { diff --git a/client/assets/styles/game.less b/client/assets/styles/game.less index 7c55e35a..4f22174a 100644 --- a/client/assets/styles/game.less +++ b/client/assets/styles/game.less @@ -205,7 +205,6 @@ .resolving-skill { grid-area: target; align-self: center; - text-align: center; height: auto; svg { display: inline; diff --git a/client/package.json b/client/package.json index e84f1421..acec772b 100644 --- a/client/package.json +++ b/client/package.json @@ -1,6 +1,6 @@ { "name": "mnml-client", - "version": "1.5.4", + "version": "1.5.5", "description": "", "main": "index.js", "scripts": { diff --git a/client/src/app.jsx b/client/src/app.jsx index b63b55a6..cfc877b7 100644 --- a/client/src/app.jsx +++ b/client/src/app.jsx @@ -30,23 +30,21 @@ const store = createStore( window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__(), ); -document.fonts.load('16pt "Jura"').then(() => { - const events = registerEvents(store); - // store.subscribe(() => console.log(store.getState())); - setupKeys(store); +const events = registerEvents(store); +// store.subscribe(() => console.log(store.getState())); +setupKeys(store); - const ws = createSocket(events); - ws.connect(); - events.setWs(ws); +const ws = createSocket(events); +ws.connect(); +events.setWs(ws); - const App = () => ( - - - - - - ); +const App = () => ( + + + + + +); - // eslint-disable-next-line - preact.render(, document.body); -}); +// eslint-disable-next-line +preact.render(, document.body); diff --git a/client/src/components/game.ctrl.btns.top.jsx b/client/src/components/game.ctrl.btns.top.jsx index 5abcdcae..4ab0d543 100644 --- a/client/src/components/game.ctrl.btns.top.jsx +++ b/client/src/components/game.ctrl.btns.top.jsx @@ -49,9 +49,10 @@ function GameCtrlTopBtns(args) { }; const abandonClasses = `abandon ${abandonState ? 'confirming' : ''}`; + const abandonText = abandonState ? 'Confirm' : 'Abandon'; const abandonAction = abandonState ? sendAbandon : abandonStateTrue; - const abandonBtn = ; + const abandonBtn = ; const leaveBtn = ; return ( diff --git a/client/src/components/instance.ctrl.top.btns.jsx b/client/src/components/instance.ctrl.top.btns.jsx index 0a93c693..528e5d0e 100644 --- a/client/src/components/instance.ctrl.top.btns.jsx +++ b/client/src/components/instance.ctrl.top.btns.jsx @@ -49,9 +49,10 @@ function InstanceTopBtns(args) { }; const abandonClasses = `abandon ${abandonState ? 'confirming' : ''}`; + const abandonText = abandonState ? 'Confirm' : 'Abandon'; const abandonAction = abandonState ? sendAbandon : abandonStateTrue; - const abandonBtn = ; + const abandonBtn = ; const leaveBtn = ; return ( diff --git a/client/src/components/vbox.component.jsx b/client/src/components/vbox.component.jsx index 53c03819..067f8310 100644 --- a/client/src/components/vbox.component.jsx +++ b/client/src/components/vbox.component.jsx @@ -1,5 +1,6 @@ const preact = require('preact'); const range = require('lodash/range'); +const countBy = require('lodash/countBy'); const without = require('lodash/without'); const { connect } = require('preact-redux'); @@ -249,12 +250,35 @@ function Vbox(args) { if (vboxSelecting) clearVboxSelected(); if (reclaiming) return sendVboxReclaim(i); + // 4 things selected + if (combiner.length > 2) return combinerChange([i]); + + // removing const combinerIndex = combiner.indexOf(i); if (combinerIndex > -1) { return combinerChange(without(combiner, i)); } combiner.push(i); + + // invalid combo + const combinerItems = combiner.map(j => vbox.bound[j]); + const combinerCounts = countBy(combinerItems, c => c); + + // unless some combo + // contains every combinerItems + // and combinerItems.count of item >= components.count(item) + + if (!itemInfo.combos + .some(combo => { + const comboCount = countBy(combo.components, c => c); + return combinerItems.every(c => + combo.components.includes(c) && comboCount[c] >= combinerCounts[c] + ); + })) { + return combinerChange([i]); + } + return combinerChange(combiner); } diff --git a/ops/package.json b/ops/package.json index cc715b58..8cb6c98f 100755 --- a/ops/package.json +++ b/ops/package.json @@ -1,6 +1,6 @@ { "name": "mnml-ops", - "version": "1.5.4", + "version": "1.5.5", "description": "", "main": "index.js", "scripts": { diff --git a/server/Cargo.toml b/server/Cargo.toml index 1855f2a4..fcf67d51 100644 --- a/server/Cargo.toml +++ b/server/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mnml" -version = "1.5.4" +version = "1.5.5" authors = ["ntr "] [dependencies] diff --git a/server/src/skill.rs b/server/src/skill.rs index a0f324d6..5bb44cea 100644 --- a/server/src/skill.rs +++ b/server/src/skill.rs @@ -415,7 +415,7 @@ pub enum EventStages { EndPost, // Skip Anim Anim EndOnly, // Skip Anim Skip PostOnly, // Skip Skip Anim - NoStages, // Skip Skip Skip + NoStages, // Skip Skip Skip } #[derive(Debug,Clone,PartialEq,Serialize,Deserialize)] @@ -1395,7 +1395,7 @@ fn sustain(source: &mut Construct, target: &mut Construct, mut results: Resoluti fn intercept(source: &mut Construct, target: &mut Construct, mut results: Resolutions, skill: Skill) -> Resolutions { let intercept = skill.effect()[0]; 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 { @@ -1614,7 +1614,7 @@ fn electrocute(source: &mut Construct, target: &mut Construct, mut results: Reso None => () } } - + let ConstructEffect { effect, duration, meta, tick: _ } = skill.effect()[0]; let tick_skill = match meta { Some(EffectMeta::Skill(s)) => s, @@ -1660,10 +1660,10 @@ fn absorption(source: &mut Construct, target: &mut Construct, mut results: Resol results.push(Resolution::new(source, target) .event(target.add_effect(reflect_skill, absorb)) .stages(EventStages::PostOnly)); - + let absorb_index = target.effects.iter().position(|e| e.effect == Effect::Absorb).expect("No absorb"); let ce = target.effects.remove(absorb_index); - + results.push(Resolution::new(source, target) .event(Event::Removal { effect: ce.effect, construct_effects: target.effects.clone() }) .stages(EventStages::PostOnly)); @@ -1717,7 +1717,7 @@ 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 {