130 lines
4.7 KiB
JavaScript
130 lines
4.7 KiB
JavaScript
const Phaser = require('phaser');
|
|
const fs = require('fs');
|
|
const { throttle } = require('lodash');
|
|
|
|
const CombatLog = require('./combat.log');
|
|
const CombatCryps = require('./combat.cryps');
|
|
const CombatSkills = require('./combat.skills');
|
|
const CombatHitBox = require('./combat.hitbox');
|
|
|
|
const renderResolutions = require('./combat.render.resolutions');
|
|
|
|
const aztecAtlas = require('../../assets/aztec.atlas.json');
|
|
|
|
class Combat extends Phaser.Scene {
|
|
constructor() {
|
|
super({ key: 'Combat' });
|
|
}
|
|
|
|
preload() {
|
|
// Textures already loaded can do proper check in future when theres more textures
|
|
if (!(this.textures.getTextureKeys().length > 2)) {
|
|
const aztecImg = new Image();
|
|
aztecImg.src = `data:image/png;base64,${new Buffer.from(fs.readFileSync('./assets/aztec.clean.png')).toString('base64')}`;
|
|
aztecImg.onload = () => {
|
|
this.textures.addAtlas('aztec', aztecImg, aztecAtlas);
|
|
};
|
|
this.load.image('proj', 'https://labs.phaser.io/assets/sprites/bullet.png');
|
|
this.load.image('blue', 'https://labs.phaser.io/assets/particles/blue.png');
|
|
this.load.image('green', 'https://labs.phaser.io/assets/particles/green.png');
|
|
this.load.image('red', 'https://labs.phaser.io/assets/particles/red.png');
|
|
this.load.image('white', 'https://labs.phaser.io/assets/particles/white.png');
|
|
this.load.image('yellow', 'https://labs.phaser.io/assets/particles/yellow.png');
|
|
}
|
|
}
|
|
|
|
create() {
|
|
console.log('creating game');
|
|
this.registry.events.off('changedata', this.updateData);
|
|
this.registry.events.on('changedata', this.updateData, this);
|
|
this.input.keyboard.on('keydown_BACKSPACE', () => {
|
|
this.cleanUp();
|
|
}, 0, this);
|
|
this.registry.set('gamePhase', false);
|
|
this.registry.set('inGame', true);
|
|
this.registry.set('gameAnimating', false);
|
|
this.account = this.registry.get('account');
|
|
this.fetchGame = throttle(() => {
|
|
const game = this.registry.get('game');
|
|
if (game) {
|
|
const ws = this.registry.get('ws');
|
|
return ws.sendGameState(game.id);
|
|
}
|
|
return false;
|
|
}, 500);
|
|
|
|
return true;
|
|
}
|
|
|
|
startGame(game) {
|
|
this.scene.manager.add('CombatCryps', CombatCryps, true, game);
|
|
this.scene.manager.add('CombatLog', CombatLog, true, game);
|
|
this.renderedResolves = game.resolved.length; // In case you rejoin mid way
|
|
this.scene.manager.add('CombatSkills', CombatSkills, true, game.phase);
|
|
this.scene.manager.add('CombatHitBox', CombatHitBox, true, game.phase);
|
|
this.registry.set('gamePhase', game.phase);
|
|
this.phase = game.phase;
|
|
return true;
|
|
}
|
|
|
|
update() {
|
|
this.fetchGame();
|
|
return true;
|
|
}
|
|
|
|
updateData(parent, key, data) {
|
|
if (key === 'game') {
|
|
if (!data) return false;
|
|
const startGame = this.registry.get('gamePhase') === false;
|
|
if (startGame) { this.startGame(data); return true; }
|
|
this.checkAnimation(data);
|
|
// Game over?
|
|
// if (data.phase === 'Finish') {
|
|
// this.time.delayedCall(10000, () => {
|
|
// this.endGame();
|
|
// });
|
|
// }
|
|
}
|
|
return true;
|
|
}
|
|
|
|
checkAnimation(game) {
|
|
// Check cryps are loaded and whether game is animating
|
|
const cantAnimate = this.registry.get('gamePhase') === 'animating';
|
|
if (cantAnimate) return false;
|
|
if (game.resolved.length !== this.renderedResolves) {
|
|
const newResolutions = game.resolved.slice(this.renderedResolves);
|
|
renderResolutions(this, game, newResolutions);
|
|
this.renderedResolves = game.resolved.length;
|
|
return true;
|
|
}
|
|
if (this.phase !== game.phase) {
|
|
this.phase = game.phase;
|
|
this.registry.set('gamePhase', game.phase);
|
|
}
|
|
if (this.registry.get('gameLog') !== game.log.length) {
|
|
this.registry.set('gameLog', game.log.length);
|
|
}
|
|
return true;
|
|
}
|
|
|
|
cleanUp() {
|
|
this.registry.events.off('changedata', this.updateData, this);
|
|
this.registry.events.off('setdata', this.updateData, this);
|
|
|
|
this.registry.set('inGame', null);
|
|
this.registry.set('menu', true);
|
|
this.registry.set('game', null);
|
|
|
|
this.scene.get('CombatLog').cleanUp();
|
|
this.scene.get('CombatCryps').cleanUp();
|
|
this.scene.get('CombatSkills').cleanUp();
|
|
this.scene.get('CombatHitBox').cleanUp();
|
|
this.scene.remove();
|
|
|
|
return true;
|
|
}
|
|
}
|
|
|
|
module.exports = Combat;
|