From eb3d42ea58164037208298b357db14e9476cd062 Mon Sep 17 00:00:00 2001 From: Mashy Date: Wed, 20 Nov 2019 15:59:03 +1000 Subject: [PATCH] validVboxSelect for vbox and inventory --- client/src/components/vbox.component.jsx | 111 ++++++++++------------- 1 file changed, 47 insertions(+), 64 deletions(-) diff --git a/client/src/components/vbox.component.jsx b/client/src/components/vbox.component.jsx index 2373cc32..239a0ab0 100644 --- a/client/src/components/vbox.component.jsx +++ b/client/src/components/vbox.component.jsx @@ -3,6 +3,7 @@ const { connect } = require('preact-redux'); const range = require('lodash/range'); const countBy = require('lodash/countBy'); const without = require('lodash/without'); +const forEach = require('lodash/forEach'); const { removeTier } = require('../utils'); const shapes = require('./shapes'); @@ -82,9 +83,38 @@ const addState = connect( setVboxSelected, }; } - ); +function validVboxSelect(vbox, itemInfo, shopSelect, stashSelect) { + if (shopSelect.length === 0 && stashSelect.length === 0) return false; + + const validSelects = []; + + const stashItems = stashSelect.map(j => vbox.bound[j]); + const shopItems = shopSelect.map(j => vbox.free[j[0]][j[1]]); + + const selectedItems = stashItems.concat(shopItems); + const itemCount = countBy(selectedItems, co => co); + + itemInfo.combos.forEach(combo => { + const comboCount = countBy(combo.components, co => co); + const buyCount = countBy(combo.components, co => co); + const valid = selectedItems.every(c => { + if (!combo.components.includes(c)) return false; + if (itemCount[c] > comboCount[c]) return false; + buyCount[c] -= itemCount[c]; + return true; + }); + if (valid) { + forEach(buyCount, (value, key) => { + if (value > 0 && !validSelects.includes(key)) validSelects.push(key); + }); + } + }); + + return validSelects; +} + class Vbox extends preact.Component { shouldComponentUpdate(newProps) { // Single variable props @@ -129,13 +159,14 @@ class Vbox extends preact.Component { return setVboxSelected({ shopSelect, stashSelect: newStashSelect }); } + const vboxHighlight = validVboxSelect(vbox, itemInfo, shopSelect, stashSelect); // // VBOX // function vboxHover(e, v) { if (v) { e.stopPropagation(); - if (shopSelect[0]) return true; // There is a base skill or spec selected in the vbox + if (shopSelect.find(c => c[0])) return true; // There is a base skill or spec selected in the vbox if (stashSelect.length !== 0) { const base = stashSelect.find(c => !['Red', 'Blue', 'Green'].includes(vbox.bound[c])); if (base || base === 0) return true; @@ -159,28 +190,8 @@ class Vbox extends preact.Component { function availableBtn(v, group, index) { if (!v) return ; const selected = shopSelect.length && shopSelect.some(vs => vs[0] === group && vs[1] === index); - // state not yet set in double click handler - /*function onDblClick(e) { - clearVboxSelected(); - sendVboxAccept(group, index); - e.stopPropagation(); - }*/ - console.log(stashSelect); - console.log(vboxSelected); - const combinerItems = stashSelect.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 comboHighlight = vboxHighlight && vboxHighlight.includes(v) ? 'combo-border' : ''; function onClick(e) { e.stopPropagation(); @@ -270,31 +281,12 @@ class Vbox extends preact.Component { return ; } - const combinerItems = stashSelect.map(j => vbox.bound[j]); - const combinerCount = countBy(combinerItems, co => co); - - const comboItem = itemInfo.combos.find(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; - }); - const comboHighlight = combinerItems.length > 0 && comboItem ? 'combo-border' : ''; + const comboHighlight = vboxHighlight && vboxHighlight.includes(v) ? 'combo-border' : ''; function onClick(type) { if (reclaiming) return sendVboxReclaim(i); const combinerContainsIndex = stashSelect.indexOf(i) > -1; - // 4 things selected - if (stashSelect.length > 2 && !combinerContainsIndex) { - setInfo(vbox.bound[i]); - return combinerChange([i]); - } // removing if (combinerContainsIndex) { if (type === 'click') { @@ -303,13 +295,13 @@ class Vbox extends preact.Component { return true; } - if (!comboHighlight && !combinerContainsIndex) { + if (!comboHighlight) { setInfo(vbox.bound[i]); - return combinerChange([i]); + return setVboxSelected({ shopSelect: [], stashSelect: [i] }); } stashSelect.push(i); - if (stashSelect.length === 3) setInfo(comboItem.item); + // if (stashSelect.length === 3) setInfo(comboItem.item); return combinerChange(stashSelect); } @@ -340,10 +332,10 @@ class Vbox extends preact.Component { function combinerBtn() { let text = ''; - let comboItem = ''; - if (stashSelect.length < 3) { + const combineLength = stashSelect.length + shopSelect.length; + if (combineLength < 3) { for (let i = 0; i < 3; i++) { - if (stashSelect.length > i) { + if (combineLength > i) { text += '■ '; } else { text += '▫ '; @@ -351,23 +343,16 @@ class Vbox extends preact.Component { } } else { // Since theres 3 items in combiner and you can't have invalid combos we can preview it - const combinerItems = stashSelect.map(j => vbox.bound[j]); - const combinerCount = countBy(combinerItems, co => co); - const comboItemObj = itemInfo.combos.find(combo => combinerItems.every(c => { - if (!combo.components.includes(c)) return false; - const comboCount = countBy(combo.components, co => co); - if (combinerCount[c] > comboCount[c]) return false; - return true; - })); - comboItem = comboItemObj ? comboItemObj.item : 'refine'; - comboItem = comboItem.replace('Plus', '+'); - text = `Combine - ${comboItem}`; + + // comboItem = comboItem.replace('Plus', '+'); + // text = `Combine - ${comboItem}`; + text = 'Combine'; } return (