const preact = require('preact');
const range = require('lodash/range');
const shapes = require('./shapes');
function convertVar(v) {
if (['Red', 'Green', 'Blue'].includes(v)) {
return (
shapes.vboxColour(v.toLowerCase())
);
}
return v || ;
// uncomment for double borders in vbox;
// if (v) {
// return
{v}
;
// }
// return;
}
function Vbox(args) {
const {
activeVar,
activeCryp,
player,
// instance,
combiner,
reclaiming,
sendVboxAccept,
sendVboxDiscard,
sendVboxReclaim,
sendVboxCombine,
setCombiner,
setReclaiming,
setActiveVar,
setInfo,
} = args;
if (!player) return false;
const { vbox } = player;
//
// VBOX
//
const free = [];
for (let i = 0; i < 6; i++) {
free.push([vbox.free[0][i], vbox.free[1][i], vbox.free[2][i]]);
}
let vboxTimer;
const LONG_TOUCH_TIME = 500;
function vboxTouchStart(e, i, j) {
vboxTimer = (setTimeout(() => {
sendVboxAccept(j, i);
vboxTimer = null;
}, LONG_TOUCH_TIME));
return true;
}
function vboxTouchEnd(e, i, j) {
if (vboxTimer) {
clearTimeout(vboxTimer);
}
return true;
}
function vboxTouchMove(e) {
if (vboxTimer) clearTimeout(vboxTimer);
e.stopPropagation();
return true;
}
const freeRows = free.map((row, i) => {
const cells = row.map((c, j) => (
vboxTouchStart(e, i, j)}
onTouchEnd={e => vboxTouchEnd(e, i, j)}
onTouchMove={e => vboxTouchMove(e)}
onClick={() => { if (c) return setInfo('item', c); }}
onDblClick={() => sendVboxAccept(j, i) }
>
{convertVar(c)}
|
));
return (
{cells}
);
});
//
// INVENTORY
//
let boundTimer;
function boundTouchStart(e, i) {
// e.preventDefault();
// e.stopPropagation();
boundTimer = (setTimeout(() => {
boundTimer = null;
return setActiveVar(i);
}, LONG_TOUCH_TIME));
return true;
}
function boundTouchEnd(e, i) {
if (boundTimer) {
clearTimeout(boundTimer);
if (reclaiming && vbox.bound[i]) sendVboxReclaim(i);
else if (vbox.bound[i]) {
const insert = combiner.findIndex(j => j === null);
if (insert === -1) return setCombiner([i, null, null]);
combiner[insert] = i;
return setCombiner(combiner);
}
}
return true;
}
function boundTouchMove(e) {
if (boundTimer) clearTimeout(boundTimer);
e.stopPropagation();
return true;
}
function boundClick(e, i) {
if (reclaiming && vbox.bound[i]) sendVboxReclaim(i);
else if (vbox.bound[i]) {
const insert = combiner.findIndex(j => j === null);
if (insert === -1) return setCombiner([i, null, null]);
combiner[insert] = i;
boundTimer = null;
return setCombiner(combiner);
}
return false;
}
const boundTds = range(0, 9).map(i => {
if (combiner.indexOf(i) > -1) {
return (
|
);
}
return (
e.dataTransfer.setData('text', i)}
onTouchStart={e => boundTouchStart(e, i)}
onTouchEnd={e => boundTouchEnd(e, i)}
onTouchMove={e => boundTouchMove(e)}
onClick={e => boundClick(e, i) }>
{convertVar(vbox.bound[i])}
|
);
});
const boundRows = [
{boundTds[0]}
{boundTds[1]}
{boundTds[2]}
,
{boundTds[3]}
{boundTds[4]}
{boundTds[5]}
,
{boundTds[6]}
{boundTds[7]}
{boundTds[8]}
,
];
//
// COMBINER
//
function combinerRmv(i) {
combiner[i] = null;
return setCombiner(combiner);
}
const combinerElement = (
| combinerRmv(0)}>{convertVar(vbox.bound[combiner[0]])} |
combinerRmv(1)}>{convertVar(vbox.bound[combiner[1]])} |
combinerRmv(2)}>{convertVar(vbox.bound[combiner[2]])} |
);
//
// EVERYTHING
//
function reclaimClick(e) {
e.stopPropagation();
return setReclaiming(!reclaiming);
}
const classes = `vbox ${activeVar !== null || activeCryp ? 'hidden' : ''}`;
const reclaimClass = `instance-btn instance-ui-btn vbox-btn ${reclaiming ? 'reclaiming' : ''}`;
return (
setReclaiming(false)} >
e.target.scrollIntoView(true)}>VBOX
{vbox.bits}b
e.target.scrollIntoView(true)}>INVENTORY
e.target.scrollIntoView(true)}>I-COMBINATOR
{combinerElement}
);
}
module.exports = Vbox;