143 lines
5.0 KiB
JavaScript
143 lines
5.0 KiB
JavaScript
const Phaser = require('phaser');
|
|
const { remove } = require('lodash');
|
|
|
|
const { TEXT, COLOURS, POSITIONS: { CRYP_LIST } } = require('./constants');
|
|
const genAvatar = require('./avatar');
|
|
const { LineGroup, LineBox } = require('./elements/outline.rotate');
|
|
|
|
const ROW_HEIGHT = CRYP_LIST.height() * 0.1;
|
|
const ROW_WIDTH = CRYP_LIST.width();
|
|
|
|
const menuY = CRYP_LIST.height() * 0.8;
|
|
|
|
const KEY_MAP = [
|
|
'keydown-ONE',
|
|
'keydown-TWO',
|
|
'keydown-THREE',
|
|
];
|
|
|
|
const NULL_UUID = '00000000-0000-0000-0000-000000000000';
|
|
|
|
class HomeCrypList extends Phaser.Scene {
|
|
constructor() {
|
|
super({ key: 'HomeCryps' });
|
|
}
|
|
|
|
|
|
updateData(parent, key, data) {
|
|
if (key === 'crypList') {
|
|
KEY_MAP.forEach(k => this.input.keyboard.removeListener(k));
|
|
this.scene.restart();
|
|
}
|
|
}
|
|
|
|
create() {
|
|
// this.cameras.main.setViewport(CRYP_LIST.x(), CRYP_LIST.y(), CRYP_LIST.width(), CRYP_LIST.height());
|
|
this.registry.events.on('changedata', this.updateData, this);
|
|
this.registry.events.on('setdata', this.updateData, this);
|
|
const cryps = this.registry.get('crypList');
|
|
const lineGroup = this.add.existing(new LineGroup(this));
|
|
|
|
if (!cryps) return true;
|
|
const ws = this.registry.get('ws');
|
|
this.activeCryps = [];
|
|
// We only display 3 cryps others can be viewed in cryp list (soon TM)
|
|
for (let i = 0; i < cryps.length; i += 1) {
|
|
const cryp = cryps[i];
|
|
const BOX_WIDTH = Math.floor(ROW_WIDTH / 5);
|
|
const ROW_X = BOX_WIDTH * 2 * (i % 3);
|
|
const ROW_Y = CRYP_LIST.y() + (Math.floor(i / 3)) * ROW_HEIGHT * 1.5;
|
|
const ACTIVE_FILL = 0.2;
|
|
|
|
const FILL = Object.values(COLOURS)[i];
|
|
// Selection of cryps
|
|
|
|
// Cryp avatar and interaction box
|
|
const cReady = this.add
|
|
.rectangle(ROW_X, ROW_Y + ROW_HEIGHT * 0.2, BOX_WIDTH * 2, ROW_HEIGHT, FILL)
|
|
.setInteractive()
|
|
.setOrigin(0);
|
|
cReady.setAlpha(0.2);
|
|
cReady.on('pointerdown', () => {
|
|
lineGroup.clear(true, true);
|
|
if (this.activeCryps.includes(cReady)) {
|
|
remove(this.activeCryps, n => n === cReady);
|
|
cReady.setAlpha(0.2);
|
|
} else {
|
|
this.activeCryps.push(cReady);
|
|
cReady.setAlpha(0.75);
|
|
lineGroup.add(this.add.existing(
|
|
new LineBox(this, cReady.x, cReady.y, cReady.width, cReady.height, cReady.fillColor, 3)
|
|
));
|
|
}
|
|
});
|
|
|
|
cReady.itemSelect = () => {
|
|
cReady.setFillStyle(COLOURS.SELECT);
|
|
};
|
|
cReady.itemDeselect = () => {
|
|
cReady.setFillStyle(FILL, ACTIVE_FILL);
|
|
};
|
|
|
|
cReady.cryp = cryp;
|
|
this.add.image(
|
|
cReady.getCenter().x,
|
|
cReady.getCenter().y,
|
|
'aztec',
|
|
genAvatar(cryp.name)
|
|
);
|
|
this.add.text(ROW_X + BOX_WIDTH, ROW_Y, cryp.name, TEXT.HEADER)
|
|
.setOrigin(0.5, 0.5);
|
|
}
|
|
|
|
// Add Spawn Cryp Option
|
|
const spawn = this.add
|
|
.rectangle(ROW_WIDTH * 0.05, menuY, ROW_WIDTH * 0.2, ROW_HEIGHT * 0.5, 0x888888)
|
|
.setInteractive()
|
|
.setOrigin(0)
|
|
.on('pointerdown', () => {
|
|
this.game.events.emit('CRYP_SPAWN');
|
|
});
|
|
this.add
|
|
.text(spawn.getCenter().x, spawn.getCenter().y, '+', TEXT.HEADER)
|
|
.setOrigin(0.5, 0.5);
|
|
|
|
const joinNormal = this.add
|
|
.rectangle(ROW_WIDTH * 0.3, menuY, ROW_WIDTH * 0.4, ROW_HEIGHT * 0.5, 0x888888)
|
|
.setInteractive()
|
|
.setOrigin(0)
|
|
.on('pointerdown', () => {
|
|
const playerCryps = [];
|
|
this.activeCryps.forEach(obj => playerCryps.push(obj.cryp.id));
|
|
ws.sendPlayerCrypsSet(NULL_UUID, playerCryps);
|
|
});
|
|
this.add
|
|
.text(joinNormal.getCenter().x, joinNormal.getCenter().y, 'Join Normal', TEXT.HEADER)
|
|
.setOrigin(0.5, 0.5);
|
|
|
|
const joinInstance = this.add
|
|
.rectangle(ROW_WIDTH * 0.8, menuY, ROW_WIDTH * 0.4, ROW_HEIGHT * 0.5, 0x888888)
|
|
.setInteractive()
|
|
.setOrigin(0)
|
|
.on('pointerdown', () => {
|
|
const playerCryps = [];
|
|
this.activeCryps.forEach(obj => playerCryps.push(obj.cryp.id));
|
|
ws.sendInstanceJoin(playerCryps);
|
|
});
|
|
this.add
|
|
.text(joinInstance.getCenter().x, joinInstance.getCenter().y, 'New Instance', TEXT.HEADER)
|
|
.setOrigin(0.5, 0.5);
|
|
|
|
return this;
|
|
}
|
|
|
|
cleanUp() {
|
|
KEY_MAP.forEach(k => this.input.keyboard.removeListener(k));
|
|
this.registry.events.off('changedata', this.updateData, this);
|
|
this.registry.events.off('setdata', this.updateData, this);
|
|
this.scene.remove();
|
|
}
|
|
}
|
|
|
|
module.exports = HomeCrypList;
|