diff --git a/VERSION b/VERSION index c56eaaaf..f88cf52e 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.12.3 \ No newline at end of file +1.13.0 \ No newline at end of file diff --git a/WORKLOG.md b/WORKLOG.md index f504676b..73c8ea5b 100644 --- a/WORKLOG.md +++ b/WORKLOG.md @@ -5,6 +5,9 @@ _ntr_ * can't reset password without knowing password =\ * hard reload client on version change +decay reflected not applied +black out timer when game finished + * audio * animation effects * vbox combine / buy / equip etc diff --git a/acp/package.json b/acp/package.json index c072126b..088c98c3 100644 --- a/acp/package.json +++ b/acp/package.json @@ -1,6 +1,6 @@ { "name": "mnml-client", - "version": "1.12.3", + "version": "1.13.0", "description": "", "main": "index.js", "scripts": { diff --git a/bin/deploy.sh b/bin/deploy.sh index dcf11a59..41ae49c3 100755 --- a/bin/deploy.sh +++ b/bin/deploy.sh @@ -27,6 +27,3 @@ ssh -q "$TARGET" ls -lah "$CLIENT_DIST_DIR" echo "restarting mnml service" ssh -q -t "$TARGET" sudo service mnml restart && sleep 1 && systemctl --no-pager status mnml - -echo "restarting nginx service" -ssh -q -t "$TARGET" sudo service nginx restart && sleep 1 && systemctl --no-pager status nginx diff --git a/client/assets/styles/colours.less b/client/assets/styles/colours.less index 4d93f6fc..91c1ba73 100644 --- a/client/assets/styles/colours.less +++ b/client/assets/styles/colours.less @@ -33,6 +33,25 @@ svg { } } +// icons from ethan are fills not strokes +svg.ethan-icon { + fill: @white; + stroke: none; + + .red { + fill: @red; + } + + .green { + fill: @green; + } + + .blue { + fill: @blue; + } +} + + .green { color: @green; stroke: @green; diff --git a/client/assets/styles/styles.less b/client/assets/styles/styles.less index f2576ff4..441e4c11 100644 --- a/client/assets/styles/styles.less +++ b/client/assets/styles/styles.less @@ -271,7 +271,6 @@ figure.gray { .stats svg, .specs svg { height: 2em; - fill: none; } .credits { diff --git a/client/package.json b/client/package.json index 25380772..2d2452b2 100644 --- a/client/package.json +++ b/client/package.json @@ -1,6 +1,6 @@ { "name": "mnml-client", - "version": "1.12.3", + "version": "1.13.0", "description": "", "main": "index.js", "scripts": { diff --git a/client/src/components/game.construct.jsx b/client/src/components/game.construct.jsx index f3980794..2fa74788 100644 --- a/client/src/components/game.construct.jsx +++ b/client/src/components/game.construct.jsx @@ -15,7 +15,7 @@ const addState = connect( ws, game, - authenticated, + instance, activeSkill, animFocus, resolution, @@ -30,7 +30,7 @@ const addState = connect( return { game, - authenticated, + instance, activeSkill, animFocus, resolution, @@ -54,7 +54,7 @@ class GameConstruct extends preact.Component { render() { const { // Changing state variables - authenticated, + instance, game, activeSkill, animFocus, @@ -81,7 +81,9 @@ class GameConstruct extends preact.Component { const unfocus = animFocus && !animFocus.includes(construct.id) ? 'unfocus' : ''; const targeted = game.stack.find(c => c.target === construct.id); - const highlight = !authenticated && !targeted && activeSkill ? 'highlight' : ''; + + const firstRoundTutorial = instance && instance.time_control === 'Practice' && !game.resolutions.length; + const highlight = firstRoundTutorial && !targeted && activeSkill ? 'highlight' : ''; const crypSkills = player ?
{range(0, 3).map(j => )}
diff --git a/client/src/components/game.ctrl.btns.jsx b/client/src/components/game.ctrl.btns.jsx index a374ae80..24a7462c 100644 --- a/client/src/components/game.ctrl.btns.jsx +++ b/client/src/components/game.ctrl.btns.jsx @@ -10,6 +10,7 @@ const addState = connect( game, account, authenticated, + instance, chatShow, animating, } = state; @@ -35,6 +36,7 @@ const addState = connect( game, account, authenticated, + instance, chatShow, sendAbandon, sendGameSkillClear, @@ -68,6 +70,7 @@ function GameCtrlBtns(args) { account, chatShow, authenticated, + instance, getInstanceState, sendGameSkillClear, @@ -86,7 +89,8 @@ function GameCtrlBtns(args) { quit(); } - const noTargets = !authenticated && game.stack.length === 0; + const firstRoundTutorial = instance && instance.time_control === 'Practice' && !game.resolutions.length; + const noTargets = firstRoundTutorial && game.stack.length === 0; const readyBtn = ; const quitBtn = ; diff --git a/client/src/components/game.ctrl.jsx b/client/src/components/game.ctrl.jsx index 4d7de121..ccfb5904 100644 --- a/client/src/components/game.ctrl.jsx +++ b/client/src/components/game.ctrl.jsx @@ -45,7 +45,7 @@ function Controls(args) { const now = animating ? zero : Date.now(); const end = Date.parse(game.phase_end); - const timerPct = game.phase_end + const timerPct = game.phase_end || !game.phase == 'Finished' ? ((now - zero) / (end - zero) * 100) : 100; diff --git a/client/src/components/instance.constructs.jsx b/client/src/components/instance.constructs.jsx index 5a752394..7877c584 100644 --- a/client/src/components/instance.constructs.jsx +++ b/client/src/components/instance.constructs.jsx @@ -60,6 +60,10 @@ const addState = connect( } function setItemUnequip(v) { + const info = v.length ? v[1] : null; + dispatch(actions.setVboxInfo(info)); + dispatch(actions.setVboxCombiner(null)); + dispatch(actions.setVboxHighlight(false)); dispatch(actions.setVboxSelected({ storeSelect: [], stashSelect: [] })); return dispatch(actions.setItemUnequip(v)); } diff --git a/client/src/components/instance.ctrl.btns.jsx b/client/src/components/instance.ctrl.btns.jsx index 136987c2..42ce8883 100644 --- a/client/src/components/instance.ctrl.btns.jsx +++ b/client/src/components/instance.ctrl.btns.jsx @@ -50,7 +50,7 @@ function InstanceCtrlBtns(args) { } = args; const finished = instance && instance.phase === 'Finished'; - const tutorialDisable = tutorial && tutorial < 8; + const tutorialDisable = instance.time_control === 'Practice' && tutorial && tutorial < 8 && instance.rounds.length === 1; return (
diff --git a/client/src/components/shapes.jsx b/client/src/components/shapes.jsx index 454e51fe..c85f104c 100644 --- a/client/src/components/shapes.jsx +++ b/client/src/components/shapes.jsx @@ -11,6 +11,10 @@ const triangle = require('./svgs/triangle'); // const vboxColour = require('./svgs/colour'); const vboxColour = require('./svgs/vbox.colour'); +const speed = require('./svgs/speed'); +const power = require('./svgs/power'); +const life = require('./svgs/life'); + module.exports = { circle, diamond, @@ -19,6 +23,7 @@ module.exports = { square, squircle, triangle, + speed, saw, vboxColour, @@ -27,17 +32,17 @@ module.exports = { Blue: () => vboxColour('blue'), // stats - RedLife: () => square(['red']), - GreenLife: () => square(['green']), - BlueLife: () => square(['blue']), - RedPower: () => circle(['red']), - GreenPower: () => circle(['green']), - BluePower: () => circle(['blue']), - SpeedStat: () => triangle(['white']), + RedLife: () => life(['red']), + GreenLife: () => life(['green']), + BlueLife: () => life(['blue']), + RedPower: () => power(['red']), + GreenPower: () => power(['green']), + BluePower: () => power(['blue']), + SpeedStat: () => speed(['white']), - POWER: () => circle(['white']), - LIFE: () => square(['white']), - SPEED: () => triangle(['white']), + POWER: () => power(['white']), + LIFE: () => life(['white']), + SPEED: () => speed(['white']), // specs // Base @@ -50,343 +55,343 @@ module.exports = { Power: () =>
- {circle(['white'])} + {power(['white'])}
Power
, Life: () =>
- {square(['white'])} + {life(['white'])}
Life
, Speed: () =>
- {triangle(['white'])} + {speed(['white'])}
Speed
, // Lifes Upgrades LifeGG: () =>
- {square(['green'])} + {life(['green'])}
Life
, LifeRR: () =>
- {square(['red'])} + {life(['red'])}
Life
, LifeBB:() =>
- {square(['blue'])} + {life(['blue'])}
Life
, LifeRG: () =>
- {square(['red', 'green'])} + {life(['red', 'green'])}
Life
, LifeGB: () =>
- {square(['green', 'blue'])} + {life(['green', 'blue'])}
Life
, LifeRB:() =>
- {square(['red', 'blue'])} + {life(['red', 'blue'])}
Life
, LifeGGPlus: () =>
- {square(['green'])} + {life(['green'])}
Life+
, LifeRRPlus: () =>
- {square(['red'])} + {life(['red'])}
Life+
, LifeBBPlus:() =>
- {square(['blue'])} + {life(['blue'])}
Life+
, LifeRGPlus: () =>
- {square(['red', 'green'])} + {life(['red', 'green'])}
Life+
, LifeGBPlus: () =>
- {square(['green', 'blue'])} + {life(['green', 'blue'])}
Life+
, LifeRBPlus:() =>
- {square(['red', 'blue'])} + {life(['red', 'blue'])}
Life+
, LifeGGPlusPlus: () =>
- {square(['green'])} + {life(['green'])}
Life++
, LifeRRPlusPlus: () =>
- {square(['red'])} + {life(['red'])}
Life++
, LifeBBPlusPlus:() =>
- {square(['blue'])} + {life(['blue'])}
Life++
, LifeRGPlusPlus: () =>
- {square(['red', 'green'])} + {life(['red', 'green'])}
Life++
, LifeGBPlusPlus: () =>
- {square(['green', 'blue'])} + {life(['green', 'blue'])}
Life++
, LifeRBPlusPlus:() =>
- {square(['red', 'blue'])} + {life(['red', 'blue'])}
Life++
, // Powers Upgrades PowerGG: () =>
- {circle(['green'])} + {power(['green'])}
Power
, PowerRR: () =>
- {circle(['red'])} + {power(['red'])}
Power
, PowerBB:() =>
- {circle(['blue'])} + {power(['blue'])}
Power
, PowerRG: () =>
- {circle(['red', 'green'])} + {power(['red', 'green'])}
Power
, PowerGB: () =>
- {circle(['green', 'blue'])} + {power(['green', 'blue'])}
Power
, PowerRB:() =>
- {circle(['red', 'blue'])} + {power(['red', 'blue'])}
Power
, PowerGGPlus: () =>
- {circle(['green'])} + {power(['green'])}
Power+
, PowerRRPlus: () =>
- {circle(['red'])} + {power(['red'])}
Power+
, PowerBBPlus:() =>
- {circle(['blue'])} + {power(['blue'])}
Power+
, PowerRGPlus: () =>
- {circle(['red', 'green'])} + {power(['red', 'green'])}
Power+
, PowerGBPlus: () =>
- {circle(['green', 'blue'])} + {power(['green', 'blue'])}
Power+
, PowerRBPlus:() =>
- {circle(['red', 'blue'])} + {power(['red', 'blue'])}
Power+
, PowerGGPlusPlus: () =>
- {circle(['green'])} + {power(['green'])}
Power++
, PowerRRPlusPlus: () =>
- {circle(['red'])} + {power(['red'])}
Power++
, PowerBBPlusPlus:() =>
- {circle(['blue'])} + {power(['blue'])}
Power++
, PowerRGPlusPlus: () =>
- {circle(['red', 'green'])} + {power(['red', 'green'])}
Power++
, PowerGBPlusPlus: () =>
- {circle(['green', 'blue'])} + {power(['green', 'blue'])}
Power++
, PowerRBPlusPlus:() =>
- {circle(['red', 'blue'])} + {power(['red', 'blue'])}
Power++
, // Speeds Upgrades SpeedGG: () =>
- {triangle(['green'])} + {speed(['green'])}
Speed
, SpeedRR: () =>
- {triangle(['red'])} + {speed(['red'])}
Speed
, SpeedBB:() =>
- {triangle(['blue'])} + {speed(['blue'])}
Speed
, SpeedRG: () =>
- {triangle(['red', 'green'])} + {speed(['red', 'green'])}
Speed
, SpeedGB: () =>
- {triangle(['green', 'blue'])} + {speed(['green', 'blue'])}
Speed
, SpeedRB:() =>
- {triangle(['red', 'blue'])} + {speed(['red', 'blue'])}
Speed
, SpeedGGPlus: () =>
- {triangle(['green'])} + {speed(['green'])}
Speed+
, SpeedRRPlus: () =>
- {triangle(['red'])} + {speed(['red'])}
Speed+
, SpeedBBPlus:() =>
- {triangle(['blue'])} + {speed(['blue'])}
Speed+
, SpeedRGPlus: () =>
- {triangle(['red', 'green'])} + {speed(['red', 'green'])}
Speed+
, SpeedGBPlus: () =>
- {triangle(['green', 'blue'])} + {speed(['green', 'blue'])}
Speed+
, SpeedRBPlus:() =>
- {triangle(['red', 'blue'])} + {speed(['red', 'blue'])}
Speed+
, SpeedGGPlusPlus: () =>
- {triangle(['green'])} + {speed(['green'])}
Speed++
, SpeedRRPlusPlus: () =>
- {triangle(['red'])} + {speed(['red'])}
Speed++
, SpeedBBPlusPlus:() =>
- {triangle(['blue'])} + {speed(['blue'])}
Speed++
, SpeedRGPlusPlus: () =>
- {triangle(['red', 'green'])} + {speed(['red', 'green'])}
Speed++
, SpeedGBPlusPlus: () =>
- {triangle(['green', 'blue'])} + {speed(['green', 'blue'])}
Speed++
, SpeedRBPlusPlus:() =>
- {triangle(['red', 'blue'])} + {speed(['red', 'blue'])}
Speed++
, }; diff --git a/client/src/components/svgs/life.jsx b/client/src/components/svgs/life.jsx new file mode 100644 index 00000000..4756e2e5 --- /dev/null +++ b/client/src/components/svgs/life.jsx @@ -0,0 +1,33 @@ +const preact = require('preact'); + +module.exports = function triangle(colours) { + if (colours.length === 1) { + return ( + + + + + + ); + } + + return ( + + + + + + + + + + + + + + + ); +}; diff --git a/client/src/components/svgs/power.jsx b/client/src/components/svgs/power.jsx new file mode 100644 index 00000000..508f95e5 --- /dev/null +++ b/client/src/components/svgs/power.jsx @@ -0,0 +1,23 @@ +const preact = require('preact'); + +module.exports = function triangle(colours) { + if (colours.length === 1) { + return ( + + + + + + + ); + } + + return ( + + + + + + + ); +}; diff --git a/client/src/components/svgs/speed.jsx b/client/src/components/svgs/speed.jsx new file mode 100644 index 00000000..6c0d6aaa --- /dev/null +++ b/client/src/components/svgs/speed.jsx @@ -0,0 +1,37 @@ +const preact = require('preact'); + +module.exports = function triangle(colours) { + if (colours.length === 1) { + return ( + + + + + + + + ); + } + + return ( + + + + + + + + + + + + + + + + + + + ); +}; + diff --git a/client/src/components/targeting.arrows.jsx b/client/src/components/targeting.arrows.jsx index 2d570121..fba1b064 100644 --- a/client/src/components/targeting.arrows.jsx +++ b/client/src/components/targeting.arrows.jsx @@ -44,15 +44,14 @@ class TargetSvg extends Component { animating, game, gameEffectInfo, - authenticated, } = props; const { width, height } = state; if (!game) return false; // game will be null when battle ends if (game.phase === 'Finished') return false; // Clear everything if its over (in case of abandon) - // First time joining game phase - if (!authenticated && game.stack.length === 0) { + // First round of a game + if (!game.resolutions.length && game.stack.length === 0) { return (

Select a skill from each construct, click a target for that skill and then click READY.

diff --git a/client/src/components/vbox.stash.jsx b/client/src/components/vbox.stash.jsx index 0e737627..3d2f85dd 100644 --- a/client/src/components/vbox.stash.jsx +++ b/client/src/components/vbox.stash.jsx @@ -9,7 +9,7 @@ const buttons = require('./buttons'); const { removeTier } = require('../utils'); const addState = connect( - ({ itemUnequip, vboxHighlight, vboxSelected, tutorial }) => ({ itemUnequip, vboxHighlight, vboxSelected, tutorial })); + ({ itemUnequip, vboxHighlight, vboxSelected, tutorial, instance }) => ({ itemUnequip, vboxHighlight, vboxSelected, tutorial, instance })); class stashElement extends preact.Component { shouldComponentUpdate(newProps) { @@ -41,6 +41,7 @@ class stashElement extends preact.Component { vboxHighlight, vboxSelected, tutorial, + instance, } = props; const { storeSelect, stashSelect } = vboxSelected; @@ -97,7 +98,7 @@ class stashElement extends preact.Component { : `${border} ${notValidCombo ? 'fade' : ''}`; const invObject = shapes[v] ? shapes[v]() : v; - const tutorialDisable = tutorial === 1; + const tutorialDisable = tutorial === 1 && instance.time_control === 'Practice' && instance.rounds.length === 1; return (