Merge tag '1.5.5' into develop
1.5.5
This commit is contained in:
commit
1c611c31e9
26
CHANGELOG.md
26
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
|
||||
|
||||
@ -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
|
||||
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "mnml-client",
|
||||
"version": "1.5.4",
|
||||
"version": "1.5.5",
|
||||
"description": "",
|
||||
"main": "index.js",
|
||||
"scripts": {
|
||||
|
||||
@ -205,7 +205,6 @@
|
||||
.resolving-skill {
|
||||
grid-area: target;
|
||||
align-self: center;
|
||||
text-align: center;
|
||||
height: auto;
|
||||
svg {
|
||||
display: inline;
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "mnml-client",
|
||||
"version": "1.5.4",
|
||||
"version": "1.5.5",
|
||||
"description": "",
|
||||
"main": "index.js",
|
||||
"scripts": {
|
||||
|
||||
@ -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 = () => (
|
||||
<Provider store={store}>
|
||||
<StripeProvider apiKey={stripeKey()}>
|
||||
<Mnml />
|
||||
</StripeProvider>
|
||||
</Provider>
|
||||
);
|
||||
const App = () => (
|
||||
<Provider store={store}>
|
||||
<StripeProvider apiKey={stripeKey()}>
|
||||
<Mnml />
|
||||
</StripeProvider>
|
||||
</Provider>
|
||||
);
|
||||
|
||||
// eslint-disable-next-line
|
||||
preact.render(<App />, document.body);
|
||||
});
|
||||
// eslint-disable-next-line
|
||||
preact.render(<App />, document.body);
|
||||
|
||||
@ -49,9 +49,10 @@ function GameCtrlTopBtns(args) {
|
||||
};
|
||||
|
||||
const abandonClasses = `abandon ${abandonState ? 'confirming' : ''}`;
|
||||
const abandonText = abandonState ? 'Confirm' : 'Abandon';
|
||||
const abandonAction = abandonState ? sendAbandon : abandonStateTrue;
|
||||
|
||||
const abandonBtn = <button class={abandonClasses} disabled={finished} onClick={abandonAction}>Abandon</button>;
|
||||
const abandonBtn = <button class={abandonClasses} disabled={finished} onClick={abandonAction}>{abandonText}</button>;
|
||||
const leaveBtn = <button class='abandon confirming' onClick={leave}>Leave</button>;
|
||||
|
||||
return (
|
||||
|
||||
@ -49,9 +49,10 @@ function InstanceTopBtns(args) {
|
||||
};
|
||||
|
||||
const abandonClasses = `abandon ${abandonState ? 'confirming' : ''}`;
|
||||
const abandonText = abandonState ? 'Confirm' : 'Abandon';
|
||||
const abandonAction = abandonState ? sendAbandon : abandonStateTrue;
|
||||
|
||||
const abandonBtn = <button class={abandonClasses} disabled={finished} onClick={abandonAction}>Abandon</button>;
|
||||
const abandonBtn = <button class={abandonClasses} disabled={finished} onClick={abandonAction}>{abandonText}</button>;
|
||||
const leaveBtn = <button class='abandon confirming' onClick={leave}>Leave</button>;
|
||||
|
||||
return (
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "mnml-ops",
|
||||
"version": "1.5.4",
|
||||
"version": "1.5.5",
|
||||
"description": "",
|
||||
"main": "index.js",
|
||||
"scripts": {
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "mnml"
|
||||
version = "1.5.4"
|
||||
version = "1.5.5"
|
||||
authors = ["ntr <ntr@smokestack.io>"]
|
||||
|
||||
[dependencies]
|
||||
|
||||
@ -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 {
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user