136 lines
5.1 KiB
JavaScript
136 lines
5.1 KiB
JavaScript
const { eachSeries } = require('async');
|
|
|
|
const CombatAnimations = require('./combat.animations');
|
|
const {
|
|
DELAYS: { ANIMATION_DURATION, MOVE_CREEP, DAMAGE_TICK },
|
|
POSITIONS: { COMBAT },
|
|
} = require('./constants');
|
|
|
|
function findResolutionCryps(scene, group, resolution, game) {
|
|
const sourceSpawn = group.children.entries.find(c => c.cryp.id === resolution.source.id);
|
|
|
|
/* const sourceCryp = game.teams.find(t => t.cryps.find(c => c.id === resolution.source_cryp_id))
|
|
.cryps.find(c => c.id === resolution.source_cryp_id);
|
|
|
|
const targetCryp = game.teams.find(t => t.cryps.find(c => c.id === resolution.target_cryp_id))
|
|
.cryps.find(c => c.id === resolution.target_cryp_id);
|
|
*/
|
|
const targetSpawn = group.children.entries.find(c => c.cryp.id === resolution.target.id);
|
|
|
|
return { sourceSpawn, targetSpawn };
|
|
}
|
|
|
|
function calculateTweenParams(sourceSpawn, targetSpawn, account, skill) {
|
|
const tweenParams = (targets, centreSpot) => {
|
|
const enemy = targets.cryp.account !== account.id;
|
|
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 = MOVE_CREEP;
|
|
return {
|
|
targets, x, y, ease, duration,
|
|
};
|
|
};
|
|
let moveSourceBattle = false;
|
|
let moveSourceOrig = false;
|
|
const targetOnlySkill = ['DecayTick'];
|
|
if (!(targetOnlySkill.includes(skill))) {
|
|
if (sourceSpawn.cryp.account !== targetSpawn.cryp.account) {
|
|
moveSourceBattle = tweenParams(sourceSpawn, true);
|
|
moveSourceOrig = tweenParams(sourceSpawn, false);
|
|
}
|
|
}
|
|
|
|
const moveTargetBattle = tweenParams(targetSpawn, true);
|
|
const moveTargetOrig = tweenParams(targetSpawn, false);
|
|
|
|
return {
|
|
moveSourceBattle, moveSourceOrig, moveTargetBattle, moveTargetOrig,
|
|
};
|
|
}
|
|
|
|
function animatePhase(scene, game, resolution, cb) {
|
|
// return early for disabled skills
|
|
if (resolution.length === 0) return cb();
|
|
if (resolution.event[0] === 'Disable'
|
|
|| resolution.event[0] === 'TargetKo'
|
|
|| resolution.event === 'Ko') return cb();
|
|
|
|
const group = scene.scene.get('CombatCryps').cryps;
|
|
const animations = new CombatAnimations(scene);
|
|
const account = scene.registry.get('account');
|
|
|
|
// Find cryps, targets
|
|
const { sourceSpawn, targetSpawn } = findResolutionCryps(scene, group, resolution, game);
|
|
const {
|
|
moveSourceBattle, moveSourceOrig, moveTargetBattle, moveTargetOrig,
|
|
} = calculateTweenParams(sourceSpawn, targetSpawn, account, resolution.event[1].skill);
|
|
|
|
const castParams = () => {
|
|
const x = (sourceSpawn === targetSpawn) ? moveTargetBattle.x : sourceSpawn.x;
|
|
const y = (sourceSpawn === targetSpawn) ? moveTargetBattle.y : sourceSpawn.y;
|
|
return { x, y };
|
|
};
|
|
const castLocation = castParams();
|
|
|
|
// Move cryps into position
|
|
if (moveSourceBattle) scene.tweens.add(moveSourceBattle);
|
|
scene.tweens.add(moveTargetBattle);
|
|
|
|
return scene.time.delayedCall(MOVE_CREEP, () => {
|
|
const sourceAlly = sourceSpawn.cryp.account === account.id;
|
|
const targetAlly = targetSpawn.cryp.account === account.id;
|
|
// animate animation
|
|
animations.getSkill(resolution.event[1].skill, sourceAlly, targetAlly, castLocation);
|
|
// Target cryp takes damage
|
|
scene.time.delayedCall(ANIMATION_DURATION, () => {
|
|
console.log(resolution);
|
|
if (resolution.event[0] === 'Damage') {
|
|
targetSpawn.takeDamage(resolution.event[1]);
|
|
scene.registry.set('gameLog', scene.registry.get('gameLog') + 1);
|
|
}
|
|
if (resolution.event[0] === 'Healing') {
|
|
targetSpawn.takeHealing(resolution.event[1]);
|
|
scene.registry.set('gameLog', scene.registry.get('gameLog') + 1);
|
|
}
|
|
if (resolution.event[0] === 'Effect') {
|
|
targetSpawn.effects.addEffect(resolution.event[1]);
|
|
console.log('target has new effect', resolution.event[1].effect);
|
|
}
|
|
|
|
if (resolution.event[0] === 'Removal') {
|
|
targetSpawn.effects.removeEffect(resolution.event[1].effect);
|
|
console.log('target effect removed', resolution.event[1].effect);
|
|
}
|
|
if (moveSourceOrig) scene.tweens.add(moveSourceOrig);
|
|
scene.tweens.add(moveTargetOrig);
|
|
|
|
// all done
|
|
scene.time.delayedCall(MOVE_CREEP, () => {
|
|
animations.destroy(true);
|
|
return cb();
|
|
});
|
|
});
|
|
});
|
|
}
|
|
|
|
function renderResolutions(scene, game, resolutions) {
|
|
scene.registry.set('gamePhase', 'animating');
|
|
scene.registry.set('gameLog', scene.registry.get('gameLog') + 1);
|
|
|
|
eachSeries(
|
|
resolutions,
|
|
(resolution, cb) => animatePhase(scene, game, resolution, cb),
|
|
(err) => {
|
|
if (err) return console.error(err);
|
|
scene.registry.set('gamePhase', 'Skill');
|
|
return true;
|
|
}
|
|
);
|
|
|
|
return true;
|
|
}
|
|
|
|
module.exports = renderResolutions;
|