mnml/client/src/scenes/combat.render.js
2018-11-27 19:47:53 +10:00

84 lines
3.2 KiB
JavaScript

const { CrypImage } = require('./combat.cryps');
const { DELAYS, POSITIONS: { COMBAT } } = require('./constants');
const randomSkill = () => {
const skills = ['wall', 'spit', 'gravBlast', 'gravBomb', 'chargeBall'];
return skills[Math.floor(Math.random() * 5)];
};
function findResolveCryps(scene, group, game) {
const resolved = game.resolved[scene.resolvedIter];
const allyCryp = scene.allyTeam.cryps.find(
c => c.id === resolved.source_cryp_id || c.id === resolved.target_cryp_id
);
const enemyCryp = scene.enemyTeam.cryps.find(
c => c.id === resolved.source_cryp_id || c.id === resolved.target_cryp_id
);
const allySpawn = group.children.entries
.filter(obj => obj instanceof CrypImage)
.find(c => c.cryp.id === allyCryp.id);
const enemySpawn = group.children.entries
.filter(obj => obj instanceof CrypImage)
.find(c => c.cryp.id === enemyCryp.id);
const target = allyCryp.id === resolved.target_cryp_id ? allySpawn : enemySpawn;
return {allySpawn, enemySpawn, target };
}
function animatePhase(scene, group, game, delay) {
// Find cryps and targets
const tweenParams = (targets, centreSpot, enemy) => {
let x = centreSpot ? COMBAT.width() * 0.3 : targets.x;
x = (enemy && centreSpot) ? x + COMBAT.width() * 0.4 : x;
const y = centreSpot ? COMBAT.height() * 13.25 / 35 : targets.y;
const ease = 'Power1';
const duration = DELAYS.MOVE_CREEP;
return { targets, x, y, ease, duration };
};
const { allySpawn, enemySpawn, target } = findResolveCryps(scene, group, game);
const moveAllyBattle = tweenParams(allySpawn, true, false);
const moveAllyOrig = tweenParams(allySpawn, false, false);
const moveEnemyBattle = tweenParams(enemySpawn, true, true);
const moveEnemyOrig = tweenParams(enemySpawn, false, true);
// Move cryps into posistion
scene.tweens.add(moveAllyBattle);
scene.tweens.add(moveEnemyBattle);
// Target cryp takes damage into posistion
scene.time.delayedCall(delay + DELAYS.MOVE_CREEP, () => {
target.takeDamage(100);
});
// Move cryps back
scene.time.delayedCall(delay + DELAYS.MOVE_CREEP + DELAYS.DAMAGE_TICK, () => {
scene.tweens.add(moveAllyOrig);
scene.tweens.add(moveEnemyOrig);
});
}
function combatRender(scene, game, group) {
const skill = randomSkill();
const resolved = game.resolved[scene.resolvedIter];
const target = resolved.source_team_id === scene.account.id;
const delay = DELAYS[skill];
scene.time.delayedCall(DELAYS.MOVE_CREEP, () => {
scene.skills[skill](target);
});
animatePhase(scene, group, game, delay[0]);
if (scene.iterateLog(game)) {
scene.time.delayedCall(delay[1] + DELAYS.MOVE_CREEP * 2, () => {
scene.registry.set('resolve', false);
scene.skills.cleanup();
scene.renderLog(game);
});
} else {
scene.time.delayedCall(delay[1] + DELAYS.MOVE_CREEP * 2, () => {
scene.skills.cleanup();
combatRender(scene, game, group);
});
}
return true;
}
module.exports = combatRender;