Merge branch 'release/1.5.6'

This commit is contained in:
ntr 2019-10-17 11:55:47 +11:00
commit cf39e006cd
16 changed files with 269 additions and 32 deletions

View File

@ -1 +1 @@
1.5.5 1.5.6

View File

@ -1,6 +1,6 @@
{ {
"name": "mnml-client", "name": "mnml-client",
"version": "1.5.5", "version": "1.5.6",
"description": "", "description": "",
"main": "index.js", "main": "index.js",
"scripts": { "scripts": {

View File

@ -61,3 +61,84 @@ svg {
color: @white; color: @white;
stroke: @white; stroke: @white;
} }
.red-border {
border-color: @red;
}
.blue-border {
border-color: @blue;
}
.green-border {
border-color: @green;
}
.red-blue-border {
animation: rb 2s cubic-bezier(0.5, 0, 0.5, 1) 0s infinite alternate;
}
.red-green-border {
animation: rg 2s cubic-bezier(0.5, 0, 0.5, 1) 0s infinite alternate;
}
.blue-green-border {
animation: bg 2s cubic-bezier(0.5, 0, 0.5, 1) 0s infinite alternate;
}
.combo-border:not(.highlight) {
animation: co 0.75s cubic-bezier(0, 0, 1, 1) 0s infinite alternate;
}
@keyframes rg {
0% {
border-color: @red;
}
50% {
border-color: @gray-box;
}
100% {
border-color: @green;
}
}
@keyframes rb {
0% {
border-color: @red;
}
50% {
border-color: @gray-box;
}
100% {
border-color: @blue;
}
}
@keyframes bg {
0% {
border-color: @blue;
}
50% {
border-color: @gray-box;
}
100% {
border-color: @green;
}
}
@keyframes co {
from {
background: @black;
}
to {
background: @gray-exists;
}
}
button {
&.blue {
border-color: @blue;
}
&.red {
border-color: @red;
}
&.green {
border-color: @green;
}
}

View File

@ -361,12 +361,16 @@
// } // }
.equipping, .receiving { .equipping, .receiving {
transition: border-color 0.5s ease-in; animation: eq 0.75s cubic-bezier(0, 0, 1, 1) 0s infinite alternate;
transition-duration: 0.25s; }
transition-delay: 0;
transition-timing-function: ease;
border: 2px dashed @gray-hint; @keyframes eq {
from {
background: @black;
}
to {
background: @gray;
}
} }
.thresholds { .thresholds {

View File

@ -204,6 +204,7 @@ table .highlight {
button[disabled] { button[disabled] {
color: #222; color: #222;
border-color: #222; border-color: #222;
animation: 0;
} }
#mnml input, #mnml select { #mnml input, #mnml select {

View File

@ -1,6 +1,6 @@
{ {
"name": "mnml-client", "name": "mnml-client",
"version": "1.5.5", "version": "1.5.6",
"description": "", "description": "",
"main": "index.js", "main": "index.js",
"scripts": { "scripts": {

View File

@ -118,6 +118,7 @@ class ConstructAnimation extends Component {
case 'Electrocute': return <Electrocute />; case 'Electrocute': return <Electrocute />;
case 'ElectrocuteTick': return <Electrocute />; case 'ElectrocuteTick': return <Electrocute />;
case 'Counter': return <Counter player={player} />; case 'Counter': return <Counter player={player} />;
case 'CounterAttack': return <Attack direction={direction} />;
case 'Purify': return <Purify player={player} />; case 'Purify': return <Purify player={player} />;
case 'Recharge': return <Recharge player={player} />; case 'Recharge': return <Recharge player={player} />;
case 'Reflect': return <Refl player={player} />; case 'Reflect': return <Refl player={player} />;

View File

@ -20,6 +20,7 @@ function projectile(x, y, radius, colour) {
cy={y} cy={y}
r={radius} r={radius}
fill={colour} fill={colour}
filter={colour === '#a52a2a' ? 'url(#chaosRedFilter)' : 'url(#chaosBlueFilter)'}
/> />
); );
} }
@ -43,6 +44,19 @@ class Chaos extends Component {
id="Layer_1" id="Layer_1"
xmlns="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 300 400"> viewBox="0 0 300 400">
<defs>
<filter id="chaosBlueFilter">
<feGaussianBlur in="SourceGraphic" stdDeviation="5" />
<feMerge>
<feMergeNode />
<feMergeNode in="SourceGraphic" />
</feMerge>
</filter>
<filter id='chaosRedFilter'>
<feTurbulence type="turbulence" baseFrequency="0" numOctaves="1" result="turbulence"></feTurbulence>
<feDisplacementMap in2="turbulence" in="SourceGraphic" scale="1" xChannelSelector="R" yChannelSelector="G"></feDisplacementMap>
</filter>
</defs>
{this.charges} {this.charges}
</svg> </svg>
); );
@ -75,6 +89,17 @@ class Chaos extends Component {
easing: 'easeInQuad', easing: 'easeInQuad',
})); }));
this.animations.push(anime({
targets: ['#chaosRedFilter feTurbulence', '#chaosRedFilter feDisplacementMap'],
baseFrequency: 2,
scale: 20,
numOctaves: 5,
easing: 'easeOutSine',
delay: TIMES.TARGET_DELAY_MS,
duration: TIMES.TARGET_DURATION_MS,
}));
projectiles.forEach(proj => this.animations.push(anime({ projectiles.forEach(proj => this.animations.push(anime({
targets: proj, targets: proj,
cx: 150 + (Math.random() * 50 * (Math.random() < 0.5 ? -1 : 1)), cx: 150 + (Math.random() * 50 * (Math.random() < 0.5 ? -1 : 1)),

View File

@ -93,7 +93,7 @@ class SiphonTick extends Component {
cy: 150 + (Math.random() * 300 * (Math.random() < 0.5 ? -1 : 1)), cy: 150 + (Math.random() * 300 * (Math.random() < 0.5 ? -1 : 1)),
delay: (Math.random() * duration * 1 / 2), delay: (Math.random() * duration * 1 / 2),
duration, duration,
easing: 'easeInQuad', easing: 'easeOutQuad',
}); });
}); });
} }

View File

@ -28,7 +28,7 @@ function projectile(x, y, radius, colour) {
function sword(colour) { function sword(colour) {
return ( return (
<polygon points='150,150 75,75, 150,300, 225,75' fill={colour} id="sword" filter="url(#slayFilter)"></polygon> <polygon points='150,150 100,75, 150,300, 200,75' fill={colour} id="sword" filter="url(#slayFilter)"></polygon>
); );
} }

View File

@ -0,0 +1,92 @@
module.exports = { // This will need to be edited if we change server recipes
// Attack
Strike: () => 'red-border',
Blast: () => 'blue-border',
Heal: () => 'green-border',
Chaos: () => 'red-blue-border',
Slay: () => 'red-green-border',
Siphon: () => 'blue-green-border',
// Stun
Link: () => 'blue-greenborder',
Bash: () => 'red-border',
Sleep: () => 'green-border',
Ruin: () => 'blue-border',
Break: () => 'red-green-border',
Banish: () => 'red-blue-border',
// Block
Counter: () => 'red-border',
Purify: () => 'green-border',
Electrify: () => 'blue-border',
Sustain: () => 'red-green-border',
Reflect: () => 'blue-green-border',
Recharge: () => 'blue-red-border',
// Buff
Intercept: () => 'red-border',
Triage: () => 'green-border',
Haste: () => 'red-green-border',
Absorb: () => 'blue-border',
Hybrid: () => 'blue-green-border',
Amplify: () => 'red-blue-border',
// Debuff
Restrict: () => 'red-border',
Purge: () => 'green-border',
Silence: () => 'blue-border',
Curse: () => 'red-green-border',
Decay: () => 'blue-green-border',
Invert: () => 'red-blue-border',
// // Lifes Upgrades
// LifeGG: () => 'green-border',
// LifeRR: () => 'red-border',
// LifeBB:() => 'blue-border',
// LifeRG: () => 'red-green-border',
// LifeGB: () => 'green-blue-border',
// LifeRB:() => 'red-blue-border',
// LifeRRPlus: () => 'red-border',
// LifeBBPlus:() => 'blue-border',
// LifeRGPlus: () => 'red-green-border',
// LifeGBPlus: () => 'green-blue-border',
// LifeRBPlus:() => 'red-blue-border',
// LifeGGPlusPlus: () => 'green-border',
// LifeRRPlusPlus: () => 'red-border',
// LifeBBPlusPlus:() => 'blue-border',
// LifeRGPlusPlus: () => 'red-green-border',
// LifeGBPlusPlus: () => 'green-blue-border',
// LifeRBPlusPlus:() => 'red-blue-border',
// // Powers Upgrades
// PowerGG: () => 'green-border',
// PowerRR: () => 'red-border',
// PowerBB:() => 'blue-border',
// PowerRG: () => 'red-green-border',
// PowerGB: () => 'green-blue-border',
// PowerRB:() => 'red-blue-border',
// PowerRRPlus: () => 'red-border',
// PowerBBPlus:() => 'blue-border',
// PowerRGPlus: () => 'red-green-border',
// PowerGBPlus: () => 'green-blue-border',
// PowerRBPlus:() => 'red-blue-border',
// PowerGGPlusPlus: () => 'green-border',
// PowerRRPlusPlus: () => 'red-border',
// PowerBBPlusPlus:() => 'blue-border',
// PowerRGPlusPlus: () => 'red-green-border',
// PowerGBPlusPlus: () => 'green-blue-border',
// PowerRBPlusPlus:() => 'red-blue-border',
// // Speeds Upgrades
// SpeedGG: () => 'green-border',
// SpeedRR: () => 'red-border',
// SpeedBB: () => 'blue-border',
// SpeedRG: () => 'red-green-border',
// SpeedGB: () => 'green-blue-border',
// SpeedRB: () => 'red-blue-border',
// SpeedRRPlus: () => 'red-border',
// SpeedBBPlus: () => 'blue-border',
// SpeedRGPlus: () => 'red-green-border',
// SpeedGBPlus: () => 'green-blue-border',
// SpeedRBPlus: () => 'red-blue-border',
// SpeedGGPlusPlus: () => 'green-border',
// SpeedRRPlusPlus: () => 'red-border',
// SpeedBBPlusPlus: () => 'blue-border',
// SpeedRGPlusPlus: () => 'red-green-border',
// SpeedGBPlusPlus: () => 'green-blue-border',
// SpeedRBPlusPlus: () => 'red-blue-border',
};

View File

@ -2,10 +2,12 @@ const { connect } = require('preact-redux');
const preact = require('preact'); const preact = require('preact');
const range = require('lodash/range'); const range = require('lodash/range');
const buttons = require('./buttons');
const shapes = require('./shapes'); const shapes = require('./shapes');
const { STATS } = require('../utils'); const { STATS } = require('../utils');
const { ConstructAvatar } = require('./construct'); const { ConstructAvatar } = require('./construct');
const actions = require('../actions'); const actions = require('../actions');
const { removeTier } = require('../utils');
const addState = connect( const addState = connect(
function receiveState(state) { function receiveState(state) {
@ -130,7 +132,14 @@ function Construct(props) {
// const action = skill ? '' : 'action'; // const action = skill ? '' : 'action';
const equipping = skillList.includes(vbox.bound[itemEquip]) && !skill; const equipping = skillList.includes(vbox.bound[itemEquip]) && !skill;
const classes = `${equipping ? 'equipping' : ''} ${!skill ? 'empty' : ''}`; const border = () => {
if (!skill) return '';
const borderFn = buttons[removeTier(skill.skill)];
if (!borderFn) return '';
return borderFn();
};
const classes = `${equipping ? 'equipping' : ''} ${!skill ? 'empty' : ''} ${border()}`;
return ( return (
<button <button
key={i} key={i}

View File

@ -2,6 +2,8 @@ const preact = require('preact');
const { connect } = require('preact-redux'); const { connect } = require('preact-redux');
const actions = require('../actions'); const actions = require('../actions');
const { removeTier } = require('../utils');
const buttons = require('./buttons');
const addState = connect( const addState = connect(
function receiveState(state) { function receiveState(state) {
@ -68,10 +70,12 @@ function Skill(props) {
return setActiveSkill(construct.id, s.skill); return setActiveSkill(construct.id, s.skill);
} }
const border = buttons[removeTier(s.skill)] ? buttons[removeTier(s.skill)]() : '';
return ( return (
<button <button
disabled={cdText || s.disabled || ko} disabled={cdText || s.disabled || ko}
class={`${(targeting || highlight) ? 'active' : ''}`} class={`${(targeting || highlight) ? 'active' : ''} ${border}`}
type="submit" type="submit"
onClick={onClick}> onClick={onClick}>
{s.skill} {cdText} {s.skill} {cdText}

View File

@ -3,9 +3,10 @@ const range = require('lodash/range');
const countBy = require('lodash/countBy'); const countBy = require('lodash/countBy');
const without = require('lodash/without'); const without = require('lodash/without');
const { connect } = require('preact-redux'); const { connect } = require('preact-redux');
const { removeTier } = require('../utils');
const shapes = require('./shapes'); const shapes = require('./shapes');
const actions = require('../actions'); const actions = require('../actions');
const buttons = require('./buttons');
const addState = connect( const addState = connect(
function receiveState(state) { function receiveState(state) {
@ -168,12 +169,29 @@ function Vbox(args) {
function onClick(e) { function onClick(e) {
e.stopPropagation(); e.stopPropagation();
setItemEquip(null);
setCombiner([]); setCombiner([]);
if (selected) return clearVboxSelected(); if (selected) return clearVboxSelected();
return setVboxSelected([group, index]); return setVboxSelected([group, index]);
} }
const classes = `${selected ? 'highlight' : ''}`; const combinerItems = combiner.map(j => vbox.bound[j]);
const combinerCount = countBy(combinerItems, co => co);
const comboHighlight = combinerItems.length > 0 && itemInfo.combos.some(combo => {
if (combo.components.includes(v)) {
return combinerItems.every(c => {
if (!combo.components.includes(c)) return false;
const comboCount = countBy(combo.components, co => co);
if (combinerCount[c] > comboCount[c]) return false;
if (c === v && combinerCount[c] + 1 > comboCount[c]) return false;
return true;
});
} return false;
}) ? 'combo-border' : '';
const classes = `${v.toLowerCase()} ${selected ? 'highlight' : ''} ${comboHighlight}`;
if (shapes[v]) { if (shapes[v]) {
return ( return (
@ -246,6 +264,21 @@ function Vbox(args) {
return <button disabled={!inventoryHighlight} class={inventoryHighlight ? 'receiving' : 'empty'} >&nbsp;</button>; return <button disabled={!inventoryHighlight} class={inventoryHighlight ? 'receiving' : 'empty'} >&nbsp;</button>;
} }
const combinerItems = combiner.map(j => vbox.bound[j]);
const combinerCount = countBy(combinerItems, co => co);
const comboHighlight = combinerItems.length > 0 && itemInfo.combos.some(combo => {
if (combo.components.includes(v)) {
return combinerItems.every(c => {
if (!combo.components.includes(c)) return false;
const comboCount = countBy(combo.components, co => co);
if (combinerCount[c] > comboCount[c]) return false;
if (c === v && combinerCount[c] + 1 > comboCount[c]) return false;
return true;
});
} return false;
}) ? 'combo-border' : '';
function onClick(e) { function onClick(e) {
if (vboxSelecting) clearVboxSelected(); if (vboxSelecting) clearVboxSelected();
if (reclaiming) return sendVboxReclaim(i); if (reclaiming) return sendVboxReclaim(i);
@ -261,21 +294,7 @@ function Vbox(args) {
combiner.push(i); combiner.push(i);
// invalid combo if (!comboHighlight) {
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([i]);
} }
@ -283,7 +302,8 @@ function Vbox(args) {
} }
const highlighted = combiner.indexOf(i) > -1; const highlighted = combiner.indexOf(i) > -1;
const classes = `${highlighted ? 'highlight' : ''}`; const border = buttons[removeTier(v)] ? buttons[removeTier(v)]() : '';
const classes = `${highlighted ? 'highlight' : border} ${comboHighlight}`;
if (shapes[v]) { if (shapes[v]) {
return ( return (
<button <button

View File

@ -1,6 +1,6 @@
{ {
"name": "mnml-ops", "name": "mnml-ops",
"version": "1.5.5", "version": "1.5.6",
"description": "", "description": "",
"main": "index.js", "main": "index.js",
"scripts": { "scripts": {

View File

@ -1,6 +1,6 @@
[package] [package]
name = "mnml" name = "mnml"
version = "1.5.5" version = "1.5.6"
authors = ["ntr <ntr@smokestack.io>"] authors = ["ntr <ntr@smokestack.io>"]
[dependencies] [dependencies]