const Phaser = require('phaser'); const { POSITIONS: { COMBAT } } = require('./constants'); const CRYP_HEIGHT = COMBAT.height() / 7; const CRYP_WIDTH = COMBAT.width() * 0.2; const TEAM_MARGIN = COMBAT.width() * 0.775; const Y_PADDING = COMBAT.height() * 0.1; class CrypHitBox extends Phaser.GameObjects.Rectangle { constructor(scene, iter, team, cback) { const y = Y_PADDING + iter * (CRYP_HEIGHT + (Y_PADDING * 0.5)); super(scene, TEAM_MARGIN * team, y, CRYP_WIDTH, CRYP_HEIGHT, 0x222222); this.setOrigin(0); this.clickHandler = () => cback(); } select() { this.setFillStyle(0x003300); } deselect() { this.setFillStyle(0x222222); } } class CombatHitBox extends Phaser.Scene { constructor() { super({ key: 'CombatHitBox' }); } create(phase) { this.phase = phase; this.registry.events.off('changedata', this.updateData); this.registry.events.on('changedata', this.updateData, this); if (phase === 'animating') return true; this.selectHitBox(phase); return true; } updateData(parent, key, data) { if (key === 'game' && data) { // In the case that we hit skill phase but teams change we restart if (data.teams.length !== this.teams) this.scene.restart(data.phase); } if (key === 'gamePhase' && data) { const shouldUpdate = data !== this.phase; if (shouldUpdate) this.scene.restart(data); return false; } return true; } selectHitBox(phase) { const game = this.registry.get('game'); this.teams = game.teams.length; if (phase === 'Skill') return this.skillHitBox(game); return false; } skillHitBox(game) { const account = this.registry.get('account'); const group = this.scene.get('CombatCryps').cryps; const skillScene = this.scene.get('CombatSkills'); game.teams.forEach((t) => { t.cryps.forEach((c) => { const cback = () => { const { activeSkill } = skillScene; if (activeSkill) { activeSkill.activate(); skillScene.activeSkill = null; this.game.events.emit('SEND_SKILL', game.id, activeSkill.cryp.id, c.id, activeSkill.skill.skill); } }; const crypSpawn = group.children.entries.find(s => s.cryp.id === c.id); const team = c.account === account.id ? 0 : 1; this.add.existing(new CrypHitBox(this, crypSpawn.iter, team, cback)); }); }); this.scene.moveBelow('Combat'); } cleanUp() { this.registry.events.off('changedata', this.updateData); this.scene.remove(); } } module.exports = CombatHitBox;