Add form change animation and additional final boss changes
parent
052564f902
commit
40d2c200a4
|
@ -286,7 +286,7 @@ export abstract class FieldPhase extends BattlePhase {
|
||||||
}
|
}
|
||||||
|
|
||||||
executeForAll(func: PokemonFunc): void {
|
executeForAll(func: PokemonFunc): void {
|
||||||
const field = this.scene.getField().filter(p => p?.isActive());
|
const field = this.scene.getField().filter(p => p?.summonData && p.isActive());
|
||||||
field.forEach(pokemon => func(pokemon));
|
field.forEach(pokemon => func(pokemon));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2389,6 +2389,14 @@ export class DamagePhase extends PokemonPhase {
|
||||||
this.scene.addEnemyModifier(getModifierType(modifierTypes.MINI_BLACK_HOLE).newModifier(pokemon) as PersistentModifier, false, true);
|
this.scene.addEnemyModifier(getModifierType(modifierTypes.MINI_BLACK_HOLE).newModifier(pokemon) as PersistentModifier, false, true);
|
||||||
pokemon.generateAndPopulateMoveset(1);
|
pokemon.generateAndPopulateMoveset(1);
|
||||||
this.scene.triggerPokemonFormChange(pokemon, SpeciesFormChangeManualTrigger, false);
|
this.scene.triggerPokemonFormChange(pokemon, SpeciesFormChangeManualTrigger, false);
|
||||||
|
this.scene.currentBattle.double = true;
|
||||||
|
const availablePartyMembers = this.scene.getParty().filter(p => !p.isFainted());
|
||||||
|
if (availablePartyMembers.length > 1) {
|
||||||
|
this.scene.pushPhase(new ToggleDoublePositionPhase(this.scene, true));
|
||||||
|
if (!availablePartyMembers[1].isOnField())
|
||||||
|
this.scene.pushPhase(new SummonPhase(this.scene, 1));
|
||||||
|
}
|
||||||
|
|
||||||
super.end();
|
super.end();
|
||||||
}, null, true);
|
}, null, true);
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -760,8 +760,8 @@ export abstract class BattleAnim {
|
||||||
if (isUser && target === user)
|
if (isUser && target === user)
|
||||||
continue;
|
continue;
|
||||||
const sprites = spriteCache[isUser ? AnimFrameTarget.USER : AnimFrameTarget.TARGET];
|
const sprites = spriteCache[isUser ? AnimFrameTarget.USER : AnimFrameTarget.TARGET];
|
||||||
|
const spriteSource = isUser ? userSprite : targetSprite;
|
||||||
if ((isUser ? u : t) === sprites.length) {
|
if ((isUser ? u : t) === sprites.length) {
|
||||||
const spriteSource = isUser ? userSprite : targetSprite;
|
|
||||||
let sprite: Phaser.GameObjects.Sprite;
|
let sprite: Phaser.GameObjects.Sprite;
|
||||||
sprite = scene.addFieldSprite(0, 0, spriteSource.texture, spriteSource.frame.name);
|
sprite = scene.addFieldSprite(0, 0, spriteSource.texture, spriteSource.frame.name);
|
||||||
sprite.setPipeline(scene.spritePipeline, { tone: [ 0.0, 0.0, 0.0, 0.0 ], hasShadow: true });
|
sprite.setPipeline(scene.spritePipeline, { tone: [ 0.0, 0.0, 0.0, 0.0 ], hasShadow: true });
|
||||||
|
@ -772,12 +772,12 @@ export abstract class BattleAnim {
|
||||||
}
|
}
|
||||||
|
|
||||||
const spriteIndex = isUser ? u++ : t++;
|
const spriteIndex = isUser ? u++ : t++;
|
||||||
const pokemonSprite = sprites[spriteIndex];
|
const pokemonSprite = sprites[spriteIndex];
|
||||||
const graphicFrameData = frameData.get(frame.target).get(spriteIndex);
|
const graphicFrameData = frameData.get(frame.target).get(spriteIndex);
|
||||||
pokemonSprite.setPosition(graphicFrameData.x, graphicFrameData.y);
|
pokemonSprite.setPosition(graphicFrameData.x, graphicFrameData.y - ((spriteSource.height / 2) * (spriteSource.parentContainer.scale - 1)));
|
||||||
|
|
||||||
pokemonSprite.setAngle(graphicFrameData.angle);
|
pokemonSprite.setAngle(graphicFrameData.angle);
|
||||||
pokemonSprite.setScale(graphicFrameData.scaleX, graphicFrameData.scaleY);
|
pokemonSprite.setScale(graphicFrameData.scaleX * spriteSource.parentContainer.scale, graphicFrameData.scaleY * spriteSource.parentContainer.scale);
|
||||||
|
|
||||||
pokemonSprite.setData('locked', frame.locked);
|
pokemonSprite.setData('locked', frame.locked);
|
||||||
|
|
||||||
|
|
|
@ -257,7 +257,7 @@ export const battleSpecDialogue = {
|
||||||
$Each cycle your mind reverts to its former state.\nEven so, somehow, remnants of your former selves remain.
|
$Each cycle your mind reverts to its former state.\nEven so, somehow, remnants of your former selves remain.
|
||||||
$Until now you have yet to succeed, but I sense a different presence in you this time.\n
|
$Until now you have yet to succeed, but I sense a different presence in you this time.\n
|
||||||
$You are the only one here, though it is as if there is… another.
|
$You are the only one here, though it is as if there is… another.
|
||||||
$Will you finally prove a formidable challenge to me?\nThe challenge I have longed for for millenia?
|
$Will you finally prove a formidable challenge to me?\nThe challenge I have longed for for millennia?
|
||||||
$We begin.`,
|
$We begin.`,
|
||||||
firstStageWin: `I see. The presence I felt was indeed real.\nIt appears I no longer need to hold back.
|
firstStageWin: `I see. The presence I felt was indeed real.\nIt appears I no longer need to hold back.
|
||||||
$Do not disappoint me.`,
|
$Do not disappoint me.`,
|
||||||
|
|
|
@ -182,8 +182,79 @@ export class QuietFormChangePhase extends BattlePhase {
|
||||||
return this.end();
|
return this.end();
|
||||||
|
|
||||||
const preName = this.pokemon.name;
|
const preName = this.pokemon.name;
|
||||||
this.pokemon.changeForm(this.formChange).then(() => {
|
|
||||||
this.scene.ui.showText(getSpeciesFormChangeMessage(this.pokemon, this.formChange, preName), null, () => this.end(), Utils.fixedInt(1500));
|
const getPokemonSprite = () => {
|
||||||
|
const sprite = this.scene.addFieldSprite(this.pokemon.x + this.pokemon.getSprite().x, this.pokemon.y + this.pokemon.getSprite().y, `pkmn__sub`);
|
||||||
|
sprite.setOrigin(0.5, 1);
|
||||||
|
sprite.play(this.pokemon.getSpriteKey()).stop();
|
||||||
|
sprite.setPipeline(this.scene.spritePipeline, { tone: [ 0.0, 0.0, 0.0, 0.0 ], hasShadow: false });
|
||||||
|
[ 'spriteColors', 'fusionSpriteColors' ].map(k => {
|
||||||
|
if (this.pokemon.summonData?.speciesForm)
|
||||||
|
k += 'Base';
|
||||||
|
sprite.pipelineData[k] = this.pokemon.getSprite().pipelineData[k];
|
||||||
|
});
|
||||||
|
this.scene.field.add(sprite);
|
||||||
|
return sprite;
|
||||||
|
}
|
||||||
|
|
||||||
|
const [ pokemonTintSprite, pokemonFormTintSprite ] = [ getPokemonSprite(), getPokemonSprite() ];
|
||||||
|
|
||||||
|
this.pokemon.getSprite().on('animationupdate', (_anim, frame) => {
|
||||||
|
if (frame.textureKey === pokemonTintSprite.texture.key)
|
||||||
|
pokemonTintSprite.setFrame(frame.textureFrame);
|
||||||
|
else
|
||||||
|
pokemonFormTintSprite.setFrame(frame.textureFrame);
|
||||||
|
});
|
||||||
|
|
||||||
|
pokemonTintSprite.setAlpha(0);
|
||||||
|
pokemonTintSprite.setTintFill(0xFFFFFF);
|
||||||
|
pokemonFormTintSprite.setVisible(false);
|
||||||
|
pokemonFormTintSprite.setTintFill(0xFFFFFF);
|
||||||
|
|
||||||
|
this.scene.playSound('PRSFX- Transform');
|
||||||
|
|
||||||
|
this.scene.tweens.add({
|
||||||
|
targets: pokemonTintSprite,
|
||||||
|
alpha: 1,
|
||||||
|
duration: 1000,
|
||||||
|
ease: 'Cubic.easeIn',
|
||||||
|
onComplete: () => {
|
||||||
|
this.pokemon.setVisible(false);
|
||||||
|
this.pokemon.changeForm(this.formChange).then(() => {
|
||||||
|
pokemonFormTintSprite.setScale(0.01);
|
||||||
|
pokemonFormTintSprite.play(this.pokemon.getSpriteKey()).stop();
|
||||||
|
pokemonFormTintSprite.setVisible(true);
|
||||||
|
this.scene.tweens.add({
|
||||||
|
targets: pokemonTintSprite,
|
||||||
|
delay: 250,
|
||||||
|
scale: 0.01,
|
||||||
|
ease: 'Cubic.easeInOut',
|
||||||
|
duration: 500,
|
||||||
|
onComplete: () => pokemonTintSprite.destroy()
|
||||||
|
});
|
||||||
|
this.scene.tweens.add({
|
||||||
|
targets: pokemonFormTintSprite,
|
||||||
|
delay: 250,
|
||||||
|
scale: 1,
|
||||||
|
ease: 'Cubic.easeInOut',
|
||||||
|
duration: 500,
|
||||||
|
onComplete: () => {
|
||||||
|
this.pokemon.setVisible(true);
|
||||||
|
this.scene.tweens.add({
|
||||||
|
targets: pokemonFormTintSprite,
|
||||||
|
delay: 250,
|
||||||
|
alpha: 0,
|
||||||
|
ease: 'Cubic.easeOut',
|
||||||
|
duration: 1000,
|
||||||
|
onComplete: () => {
|
||||||
|
pokemonTintSprite.setVisible(false);
|
||||||
|
this.scene.ui.showText(getSpeciesFormChangeMessage(this.pokemon, this.formChange, preName), null, () => this.end(), Utils.fixedInt(1500));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -212,15 +212,18 @@ export default class SpritePipeline extends FieldSpritePipeline {
|
||||||
const spriteColors = (ignoreOverride && data['spriteColorsBase']) || data['spriteColors'] || [] as number[][];
|
const spriteColors = (ignoreOverride && data['spriteColorsBase']) || data['spriteColors'] || [] as number[][];
|
||||||
const fusionSpriteColors = (ignoreOverride && data['fusionSpriteColorsBase']) || data['fusionSpriteColors'] || [] as number[][];
|
const fusionSpriteColors = (ignoreOverride && data['fusionSpriteColorsBase']) || data['fusionSpriteColors'] || [] as number[][];
|
||||||
|
|
||||||
const position = sprite.parentContainer instanceof Pokemon || sprite.parentContainer instanceof Trainer
|
const isEntityObj = sprite.parentContainer instanceof Pokemon || sprite.parentContainer instanceof Trainer;
|
||||||
|
const position = isEntityObj
|
||||||
? [ sprite.parentContainer.x, sprite.parentContainer.y ]
|
? [ sprite.parentContainer.x, sprite.parentContainer.y ]
|
||||||
: [ sprite.x, sprite.y ];
|
: [ sprite.x, sprite.y ];
|
||||||
position[0] += -(sprite.width - sprite.frame.width) / 2 + sprite.frame.x;
|
position[0] += -(sprite.width - sprite.frame.width) / 2 + sprite.frame.x;
|
||||||
|
if (sprite.originY === 0.5)
|
||||||
|
position[1] += (sprite.height / 2) * ((isEntityObj ? sprite.parentContainer : sprite).scale - 1);
|
||||||
this.set1i('hasShadow', hasShadow ? 1 : 0);
|
this.set1i('hasShadow', hasShadow ? 1 : 0);
|
||||||
this.set1i('yCenter', sprite.originY === 0.5 ? 1 : 0);
|
this.set1i('yCenter', sprite.originY === 0.5 ? 1 : 0);
|
||||||
this.set2f('relPosition', position[0], position[1]);
|
this.set2f('relPosition', position[0], position[1]);
|
||||||
this.set2f('size', sprite.frame.width, sprite.height);
|
this.set2f('size', sprite.frame.width, sprite.height);
|
||||||
this.set1f('yOffset', sprite.height - sprite.frame.height);
|
this.set1f('yOffset', sprite.height - sprite.frame.height * (isEntityObj ? sprite.parentContainer.scale : sprite.scale));
|
||||||
this.set4fv('tone', tone);
|
this.set4fv('tone', tone);
|
||||||
const emptyColors = [ 0, 0, 0, 0 ];
|
const emptyColors = [ 0, 0, 0, 0 ];
|
||||||
const flatSpriteColors: integer[] = [];
|
const flatSpriteColors: integer[] = [];
|
||||||
|
@ -243,13 +246,14 @@ export default class SpritePipeline extends FieldSpritePipeline {
|
||||||
|
|
||||||
const hasShadow = sprite.pipelineData['hasShadow'] as boolean;
|
const hasShadow = sprite.pipelineData['hasShadow'] as boolean;
|
||||||
if (hasShadow) {
|
if (hasShadow) {
|
||||||
const baseY = (sprite.parentContainer instanceof Pokemon || sprite.parentContainer instanceof Trainer
|
const isEntityObj = sprite.parentContainer instanceof Pokemon || sprite.parentContainer instanceof Trainer;
|
||||||
|
const baseY = (isEntityObj
|
||||||
? sprite.parentContainer.y
|
? sprite.parentContainer.y
|
||||||
: sprite.y + sprite.height / 2) * 6;
|
: sprite.y + sprite.height) * 6;
|
||||||
const bottomPadding = Math.ceil(sprite.height * 0.05) * 6;
|
const bottomPadding = Math.ceil(sprite.height * 0.05) * 6;
|
||||||
const yDelta = (baseY - y1) / 6;
|
const yDelta = (baseY - y1) / 6;
|
||||||
y2 = y1 = baseY + bottomPadding;
|
y2 = y1 = baseY + bottomPadding;
|
||||||
const pixelHeight = (v1 - v0) / sprite.frame.height;
|
const pixelHeight = ((v1 - v0) / (sprite.frame.height * (isEntityObj ? sprite.parentContainer.scale : sprite.scale)));
|
||||||
v1 += (yDelta + bottomPadding / 6) * pixelHeight;
|
v1 += (yDelta + bottomPadding / 6) * pixelHeight;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -207,6 +207,8 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
||||||
ret.setPipeline(this.scene.spritePipeline, { tone: [ 0.0, 0.0, 0.0, 0.0 ], hasShadow: !!hasShadow });
|
ret.setPipeline(this.scene.spritePipeline, { tone: [ 0.0, 0.0, 0.0, 0.0 ], hasShadow: !!hasShadow });
|
||||||
return ret;
|
return ret;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
this.setScale(this.getSpriteScale());
|
||||||
|
|
||||||
const sprite = getSprite(true);
|
const sprite = getSprite(true);
|
||||||
const tintSprite = getSprite();
|
const tintSprite = getSprite();
|
||||||
|
@ -396,6 +398,10 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
||||||
: this.maskSprite;
|
: this.maskSprite;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
getSpriteScale(): number {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
initShinySparkle(): void {
|
initShinySparkle(): void {
|
||||||
const shinySparkle = this.scene.addFieldSprite(0, 0, 'shiny');
|
const shinySparkle = this.scene.addFieldSprite(0, 0, 'shiny');
|
||||||
shinySparkle.setVisible(false);
|
shinySparkle.setVisible(false);
|
||||||
|
@ -1250,6 +1256,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
||||||
if (this.abilityIndex >= abilityCount) // Shouldn't happen
|
if (this.abilityIndex >= abilityCount) // Shouldn't happen
|
||||||
this.abilityIndex = abilityCount - 1;
|
this.abilityIndex = abilityCount - 1;
|
||||||
this.scene.gameData.setPokemonSeen(this, true);
|
this.scene.gameData.setPokemonSeen(this, true);
|
||||||
|
this.setScale(this.getSpriteScale());
|
||||||
this.loadAssets().then(() => {
|
this.loadAssets().then(() => {
|
||||||
this.calculateStats();
|
this.calculateStats();
|
||||||
this.scene.updateModifiers(this.isPlayer(), true);
|
this.scene.updateModifiers(this.isPlayer(), true);
|
||||||
|
@ -1559,7 +1566,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
||||||
this.maskSprite = this.getTintSprite();
|
this.maskSprite = this.getTintSprite();
|
||||||
this.maskSprite.setVisible(true);
|
this.maskSprite.setVisible(true);
|
||||||
this.maskSprite.setPosition(this.x * 6, this.y * 6);
|
this.maskSprite.setPosition(this.x * 6, this.y * 6);
|
||||||
this.maskSprite.setScale(6);
|
this.maskSprite.setScale(6 * this.getSpriteScale());
|
||||||
this.maskEnabled = true;
|
this.maskEnabled = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1568,7 +1575,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
||||||
if (this.maskEnabled) {
|
if (this.maskEnabled) {
|
||||||
this.maskSprite.setVisible(false);
|
this.maskSprite.setVisible(false);
|
||||||
this.maskSprite.setPosition(0, 0);
|
this.maskSprite.setPosition(0, 0);
|
||||||
this.maskSprite.setScale(1);
|
this.maskSprite.setScale(this.getSpriteScale());
|
||||||
this.maskSprite = null;
|
this.maskSprite = null;
|
||||||
this.maskEnabled = false;
|
this.maskEnabled = false;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue