const { connect } = require('preact-redux'); const preact = require('preact'); const range = require('lodash/range'); const buttons = require('./buttons'); const shapes = require('./shapes'); const { STATS } = require('../utils'); const { ConstructAvatar } = require('./construct'); const actions = require('../actions'); const { removeTier } = require('../utils'); const { tutorialConstructDisplay, tutorialShouldDisableEquip } = require('../tutorial.utils.jsx'); const addState = connect( function receiveState(state) { const { ws, instance, player, account, itemInfo, itemEquip, itemUnequip, vboxSelected, tutorial, } = state; function sendVboxAcceptEquip(constructId) { return ws.sendVboxAcceptEquip(instance.id, vboxSelected[0], vboxSelected[1], constructId); } function sendVboxApply(constructId, i) { return ws.sendVboxApply(instance.id, constructId, i); } function sendUnequip(constructId, item) { return ws.sendVboxUnequip(instance.id, constructId, item); } function sendVboxUnequipApply(targetConstructId) { return ws.sendVboxUnequipApply(instance.id, itemUnequip[0], itemUnequip[1], targetConstructId); } return { instance, player, account, sendVboxAcceptEquip, sendVboxUnequipApply, sendVboxApply, itemInfo, itemEquip, itemUnequip, sendUnequip, vboxSelected, tutorial, }; }, function receiveDispatch(dispatch) { function quit() { dispatch(actions.setInstance(null)); } function setInfo(item) { dispatch(actions.setInfo(item)); } function setActiveConstruct(value) { dispatch(actions.setActiveConstruct(value)); } function setItemEquip(v) { return dispatch(actions.setItemEquip(v)); } function setItemUnequip(v) { return dispatch(actions.setItemUnequip(v)); } return { quit, setInfo, setActiveConstruct, setItemUnequip, setItemEquip }; } ); function Construct(props) { const { // Changing state variables construct, iter, itemEquip, itemUnequip, instance, player, vboxSelected, tutorial, // Static Info itemInfo, // Function Calls sendVboxApply, sendVboxAcceptEquip, sendVboxUnequipApply, sendUnequip, setActiveConstruct, setItemUnequip, setItemEquip, setInfo, } = props; const { vbox } = player; const duplicateSkill = construct.skills.length !== 0 && construct.skills.every(sk => { if (!itemEquip && itemEquip !== 0) return false; if (!sk) return false; return sk.skill === vbox.bound[itemEquip]; }); const tutorialDisableEquip = tutorialShouldDisableEquip(tutorial, iter, instance, construct); function onClick(e) { e.stopPropagation(); e.preventDefault(); if (duplicateSkill || tutorialDisableEquip) return true; if (itemEquip !== null) return sendVboxApply(construct.id, itemEquip); if (vboxSelected[0]) return sendVboxAcceptEquip(construct.id); if (itemUnequip.length && itemUnequip[0] !== construct.id) return sendVboxUnequipApply(construct.id); setItemEquip(null); setItemUnequip([]); return true; } function hoverInfo(e, info) { if (!info) return false; e.stopPropagation(); return setInfo(info); } const skillList = itemInfo.items.filter(v => v.skill).map(v => v.item); const specList = itemInfo.items.filter(v => v.spec).map(v => v.item); const skills = range(0, 3).map(i => { const skill = construct.skills[i]; const s = skill ? skill.skill : (SKILL); function skillClick(e) { if (!skill) return false; setItemUnequip([construct.id, skill.skill]); setActiveConstruct(construct); e.stopPropagation(); return true; } function skillDblClick(e) { if (!skill) return false; sendUnequip(construct.id, skill.skill); setActiveConstruct(null); setItemUnequip([]); e.stopPropagation(); e.preventDefault(); return true; } const equipping = skillList.includes(vbox.bound[itemEquip]) && !skill && !tutorialDisableEquip && !duplicateSkill; const border = () => { if (!skill) return ''; const borderFn = buttons[removeTier(skill.skill)]; if (!borderFn) return ''; return borderFn(); }; const classes = `${equipping ? 'equipping' : ''} ${!skill ? 'empty' : ''} ${border()}`; return ( ); }); const specs = range(0, 3).map(i => { const s = construct.specs[i]; if (!s) { const equipping = specList.includes(vbox.bound[itemEquip]); const classes = `${equipping ? 'equipping' : 'gray'} empty`; return ( ); } function specClick(e) { e.stopPropagation(); setItemUnequip([construct.id, s]); setActiveConstruct(construct); } function specDblClick(e) { sendUnequip(construct.id, s); setActiveConstruct(null); setItemUnequip([]); e.stopPropagation(); e.preventDefault(); return true; } return ( ); }); const stats = Object.keys(STATS).map(s => { const stat = STATS[s]; const info = (s === 'SpeedStat' && 'speedStat') || (s.includes('Power') && 'powerStat') || (s.includes('Life') && 'lifeStat'); return