Add transform support to fusion palette swaps
parent
5fc5f5b499
commit
e5fe0c6e3a
|
@ -530,13 +530,16 @@ export class PostSummonTransformAbAttr extends PostSummonAbAttr {
|
||||||
target = targets[0];
|
target = targets[0];
|
||||||
|
|
||||||
pokemon.summonData.speciesForm = target.getSpeciesForm();
|
pokemon.summonData.speciesForm = target.getSpeciesForm();
|
||||||
|
pokemon.summonData.fusionSpeciesForm = target.getFusionSpeciesForm();
|
||||||
pokemon.summonData.gender = target.getGender();
|
pokemon.summonData.gender = target.getGender();
|
||||||
|
pokemon.summonData.fusionGender = target.getFusionGender();
|
||||||
pokemon.summonData.stats = [ pokemon.stats[Stat.HP] ].concat(target.stats.slice(1));
|
pokemon.summonData.stats = [ pokemon.stats[Stat.HP] ].concat(target.stats.slice(1));
|
||||||
pokemon.summonData.battleStats = target.summonData.battleStats.slice(0);
|
pokemon.summonData.battleStats = target.summonData.battleStats.slice(0);
|
||||||
pokemon.summonData.moveset = target.getMoveset().map(m => new PokemonMove(m.moveId, m.ppUsed, m.ppUp));
|
pokemon.summonData.moveset = target.getMoveset().map(m => new PokemonMove(m.moveId, m.ppUsed, m.ppUp));
|
||||||
pokemon.summonData.types = target.getTypes();
|
pokemon.summonData.types = target.getTypes();
|
||||||
|
|
||||||
pokemon.scene.playSound('PRSFX- Transform');
|
pokemon.scene.playSound('PRSFX- Transform');
|
||||||
|
|
||||||
pokemon.loadAssets().then(() => pokemon.playAnim());
|
pokemon.loadAssets().then(() => pokemon.playAnim());
|
||||||
|
|
||||||
pokemon.scene.queueMessage(getPokemonMessage(pokemon, ` transformed\ninto ${target.name}!`));
|
pokemon.scene.queueMessage(getPokemonMessage(pokemon, ` transformed\ninto ${target.name}!`));
|
||||||
|
|
|
@ -2276,7 +2276,9 @@ export class TransformAttr extends MoveEffectAttr {
|
||||||
return resolve(false);
|
return resolve(false);
|
||||||
|
|
||||||
user.summonData.speciesForm = target.getSpeciesForm();
|
user.summonData.speciesForm = target.getSpeciesForm();
|
||||||
|
user.summonData.fusionSpeciesForm = target.getFusionSpeciesForm();
|
||||||
user.summonData.gender = target.getGender();
|
user.summonData.gender = target.getGender();
|
||||||
|
user.summonData.fusionGender = target.getFusionGender();
|
||||||
user.summonData.stats = [ user.stats[Stat.HP] ].concat(target.stats.slice(1));
|
user.summonData.stats = [ user.stats[Stat.HP] ].concat(target.stats.slice(1));
|
||||||
user.summonData.battleStats = target.summonData.battleStats.slice(0);
|
user.summonData.battleStats = target.summonData.battleStats.slice(0);
|
||||||
user.summonData.moveset = target.getMoveset().map(m => new PokemonMove(m.moveId, m.ppUsed, m.ppUp));
|
user.summonData.moveset = target.getMoveset().map(m => new PokemonMove(m.moveId, m.ppUsed, m.ppUp));
|
||||||
|
|
|
@ -81,9 +81,13 @@ export class EvolutionPhase extends BattlePhase {
|
||||||
const preName = pokemon.name;
|
const preName = pokemon.name;
|
||||||
|
|
||||||
[ this.pokemonSprite, this.pokemonTintSprite, this.pokemonEvoSprite, this.pokemonEvoTintSprite ].map(sprite => {
|
[ this.pokemonSprite, this.pokemonTintSprite, this.pokemonEvoSprite, this.pokemonEvoTintSprite ].map(sprite => {
|
||||||
sprite.play(pokemon.getSpriteKey());
|
sprite.play(pokemon.getSpriteKey(true));
|
||||||
sprite.setPipeline(this.scene.spritePipeline, { tone: [ 0.0, 0.0, 0.0, 0.0 ], hasShadow: false });
|
sprite.setPipeline(this.scene.spritePipeline, { tone: [ 0.0, 0.0, 0.0, 0.0 ], hasShadow: false });
|
||||||
[ 'spriteColors', 'fusionSpriteColors' ].map(k => sprite.pipelineData[k] = pokemon.getSprite().pipelineData[k]);
|
[ 'spriteColors', 'fusionSpriteColors' ].map(k => {
|
||||||
|
if (pokemon.summonData?.speciesForm)
|
||||||
|
k += 'Base';
|
||||||
|
sprite.pipelineData[k] = pokemon.getSprite().pipelineData[k];
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
this.scene.ui.showText(`What?\n${preName} is evolving!`, null, () => {
|
this.scene.ui.showText(`What?\n${preName} is evolving!`, null, () => {
|
||||||
|
@ -91,8 +95,12 @@ export class EvolutionPhase extends BattlePhase {
|
||||||
|
|
||||||
pokemon.evolve(this.evolution).then(() => {
|
pokemon.evolve(this.evolution).then(() => {
|
||||||
[ this.pokemonEvoSprite, this.pokemonEvoTintSprite ].map(sprite => {
|
[ this.pokemonEvoSprite, this.pokemonEvoTintSprite ].map(sprite => {
|
||||||
sprite.play(pokemon.getSpriteKey());
|
sprite.play(pokemon.getSpriteKey(true));
|
||||||
[ 'spriteColors', 'fusionSpriteColors' ].map(k => sprite.pipelineData[k] = pokemon.getSprite().pipelineData[k]);
|
[ 'spriteColors', 'fusionSpriteColors' ].map(k => {
|
||||||
|
if (pokemon.summonData?.speciesForm)
|
||||||
|
k += 'Base';
|
||||||
|
sprite.pipelineData[k] = pokemon.getSprite().pipelineData[k];
|
||||||
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
@ -162,8 +162,9 @@ export default class SpritePipeline extends Phaser.Renderer.WebGL.Pipelines.Mult
|
||||||
const data = sprite.pipelineData;
|
const data = sprite.pipelineData;
|
||||||
const tone = data['tone'] as number[];
|
const tone = data['tone'] as number[];
|
||||||
const hasShadow = data['hasShadow'] as boolean;
|
const hasShadow = data['hasShadow'] as boolean;
|
||||||
let spriteColors = data['spriteColors'] || [] as number[][];
|
const ignoreOverride = data['ignoreOverride'] as boolean;
|
||||||
const fusionSpriteColors = data['fusionSpriteColors'] || [] as number[][];
|
const spriteColors = (ignoreOverride && data['spriteColorsBase']) || data['spriteColors'] || [] as number[][];
|
||||||
|
const fusionSpriteColors = (ignoreOverride && data['fusionSpriteColorsBase']) || data['fusionSpriteColors'] || [] as number[][];
|
||||||
|
|
||||||
const position = sprite.parentContainer instanceof Pokemon || sprite.parentContainer instanceof Trainer
|
const position = sprite.parentContainer instanceof Pokemon || sprite.parentContainer instanceof Trainer
|
||||||
? [ sprite.parentContainer.x, sprite.parentContainer.y ]
|
? [ sprite.parentContainer.x, sprite.parentContainer.y ]
|
||||||
|
|
|
@ -247,10 +247,10 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
||||||
.then(() => {
|
.then(() => {
|
||||||
loadMoveAnimAssets(this.scene, moveIds);
|
loadMoveAnimAssets(this.scene, moveIds);
|
||||||
this.getSpeciesForm().loadAssets(this.scene, this.getGender() === Gender.FEMALE, this.formIndex, this.shiny);
|
this.getSpeciesForm().loadAssets(this.scene, this.getGender() === Gender.FEMALE, this.formIndex, this.shiny);
|
||||||
if (this.isPlayer() || this.fusionSpecies)
|
if (this.isPlayer() || this.getFusionSpeciesForm())
|
||||||
this.scene.loadAtlas(this.getBattleSpriteKey(true), 'pokemon', this.getBattleSpriteAtlasPath(true));
|
this.scene.loadAtlas(this.getBattleSpriteKey(true), 'pokemon', this.getBattleSpriteAtlasPath(true));
|
||||||
if (this.fusionSpecies) {
|
if (this.getFusionSpeciesForm()) {
|
||||||
this.getFusionSpeciesForm().loadAssets(this.scene, this.fusionGender === Gender.FEMALE, this.fusionFormIndex, this.fusionShiny);
|
this.getFusionSpeciesForm().loadAssets(this.scene, this.getFusionGender() === Gender.FEMALE, this.fusionFormIndex, this.fusionShiny);
|
||||||
this.scene.loadAtlas(this.getFusionBattleSpriteKey(true), 'pokemon', this.getFusionBattleSpriteAtlasPath(true));
|
this.scene.loadAtlas(this.getFusionBattleSpriteKey(true), 'pokemon', this.getFusionBattleSpriteAtlasPath(true));
|
||||||
}
|
}
|
||||||
this.scene.load.once(Phaser.Loader.Events.COMPLETE, () => {
|
this.scene.load.once(Phaser.Loader.Events.COMPLETE, () => {
|
||||||
|
@ -268,8 +268,9 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
this.playAnim();
|
this.playAnim();
|
||||||
if (this.fusionSpecies)
|
|
||||||
this.updateFusionPalette();
|
this.updateFusionPalette();
|
||||||
|
if (this.summonData?.speciesForm)
|
||||||
|
this.updateFusionPalette(true);
|
||||||
resolve();
|
resolve();
|
||||||
});
|
});
|
||||||
if (!this.scene.load.isLoading())
|
if (!this.scene.load.isLoading())
|
||||||
|
@ -304,22 +305,22 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
||||||
return `pkmn__${this.getBattleSpriteId(back, ignoreOverride)}`;
|
return `pkmn__${this.getBattleSpriteId(back, ignoreOverride)}`;
|
||||||
}
|
}
|
||||||
|
|
||||||
getFusionSpriteId(): string {
|
getFusionSpriteId(ignoreOverride?: boolean): string {
|
||||||
return this.getFusionSpeciesForm().getSpriteId(this.fusionGender === Gender.FEMALE, this.fusionFormIndex, this.fusionShiny);
|
return this.getFusionSpeciesForm(ignoreOverride).getSpriteId(this.getFusionGender(ignoreOverride) === Gender.FEMALE, this.fusionFormIndex, this.fusionShiny);
|
||||||
}
|
}
|
||||||
|
|
||||||
getFusionBattleSpriteId(back?: boolean): string {
|
getFusionBattleSpriteId(back?: boolean, ignoreOverride?: boolean): string {
|
||||||
if (back === undefined)
|
if (back === undefined)
|
||||||
back = this.isPlayer();
|
back = this.isPlayer();
|
||||||
return `${back ? 'back__' : ''}${this.getFusionSpriteId()}`;
|
return `${back ? 'back__' : ''}${this.getFusionSpriteId(ignoreOverride)}`;
|
||||||
}
|
}
|
||||||
|
|
||||||
getFusionBattleSpriteKey(back?: boolean): string {
|
getFusionBattleSpriteKey(back?: boolean, ignoreOverride?: boolean): string {
|
||||||
return `pkmn__${this.getFusionBattleSpriteId(back)}`;
|
return `pkmn__${this.getFusionBattleSpriteId(back, ignoreOverride)}`;
|
||||||
}
|
}
|
||||||
|
|
||||||
getFusionBattleSpriteAtlasPath(back?: boolean): string {
|
getFusionBattleSpriteAtlasPath(back?: boolean, ignoreOverride?: boolean): string {
|
||||||
return this.getFusionBattleSpriteId(back).replace(/\_{2}/g, '/');
|
return this.getFusionBattleSpriteId(back, ignoreOverride).replace(/\_{2}/g, '/');
|
||||||
}
|
}
|
||||||
|
|
||||||
getIconAtlasKey(ignoreOverride?: boolean): string {
|
getIconAtlasKey(ignoreOverride?: boolean): string {
|
||||||
|
@ -342,10 +343,12 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
||||||
return this.species.forms[this.formIndex];
|
return this.species.forms[this.formIndex];
|
||||||
}
|
}
|
||||||
|
|
||||||
getFusionSpeciesForm(): PokemonSpeciesForm {
|
getFusionSpeciesForm(ignoreOverride?: boolean): PokemonSpeciesForm {
|
||||||
if (!this.fusionSpecies.forms?.length || this.fusionFormIndex >= this.fusionSpecies.forms.length)
|
if (!ignoreOverride && this.summonData?.speciesForm)
|
||||||
|
return this.summonData.fusionSpeciesForm;
|
||||||
|
if (!this.fusionSpecies?.forms?.length || this.fusionFormIndex >= this.fusionSpecies?.forms.length)
|
||||||
return this.fusionSpecies;
|
return this.fusionSpecies;
|
||||||
return this.fusionSpecies.forms[this.fusionFormIndex];
|
return this.fusionSpecies?.forms[this.fusionFormIndex];
|
||||||
}
|
}
|
||||||
|
|
||||||
getSprite(): Phaser.GameObjects.Sprite {
|
getSprite(): Phaser.GameObjects.Sprite {
|
||||||
|
@ -485,6 +488,12 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
||||||
return this.gender;
|
return this.gender;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
getFusionGender(ignoreOverride?: boolean): Gender {
|
||||||
|
if (!ignoreOverride && this.summonData?.fusionGender !== undefined)
|
||||||
|
return this.summonData.fusionGender;
|
||||||
|
return this.fusionGender;
|
||||||
|
}
|
||||||
|
|
||||||
isShiny(): boolean {
|
isShiny(): boolean {
|
||||||
return this.shiny || (this.fusionSpecies && this.fusionShiny);
|
return this.shiny || (this.fusionSpecies && this.fusionShiny);
|
||||||
}
|
}
|
||||||
|
@ -1288,6 +1297,10 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
||||||
}
|
}
|
||||||
|
|
||||||
resetSummonData(): void {
|
resetSummonData(): void {
|
||||||
|
if (this.summonData?.speciesForm) {
|
||||||
|
this.summonData.speciesForm = null;
|
||||||
|
this.updateFusionPalette();
|
||||||
|
}
|
||||||
this.summonData = new PokemonSummonData();
|
this.summonData = new PokemonSummonData();
|
||||||
this.resetBattleSummonData();
|
this.resetBattleSummonData();
|
||||||
}
|
}
|
||||||
|
@ -1378,19 +1391,22 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
updateFusionPalette(): void {
|
updateFusionPalette(ignoreOveride?: boolean): void {
|
||||||
if (!this.fusionSpecies) {
|
if (!this.getFusionSpeciesForm(ignoreOveride)) {
|
||||||
[ this.getSprite(), this.getTintSprite() ].map(s => {
|
[ this.getSprite(), this.getTintSprite() ].map(s => {
|
||||||
s.pipelineData['spriteColors'] = [];
|
s.pipelineData[`spriteColors${ignoreOveride && this.summonData?.speciesForm ? 'Base' : ''}`] = [];
|
||||||
s.pipelineData['fusionSpriteColors'] = [];
|
s.pipelineData[`fusionSpriteColors${ignoreOveride && this.summonData?.speciesForm ? 'Base' : ''}`] = [];
|
||||||
});
|
});
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const sourceTexture = this.scene.textures.get(this.getSpeciesForm().getSpriteKey(this.gender === Gender.FEMALE, this.formIndex, this.shiny));
|
const speciesForm = this.getSpeciesForm(ignoreOveride);
|
||||||
const sourceBackTexture = this.scene.textures.get(this.getSpeciesForm().getSpriteKey(this.gender === Gender.FEMALE, this.formIndex, this.shiny).replace('pkmn__', 'pkmn__back__'));
|
const fusionSpeciesForm = this.getFusionSpeciesForm(ignoreOveride);
|
||||||
const fusionTexture = this.scene.textures.get(this.getFusionSpeciesForm().getSpriteKey(this.fusionGender === Gender.FEMALE, this.fusionFormIndex, this.fusionShiny));
|
|
||||||
const fusionBackTexture = this.scene.textures.get(this.getFusionSpeciesForm().getSpriteKey(this.fusionGender === Gender.FEMALE, this.fusionFormIndex, this.fusionShiny).replace('pkmn__', 'pkmn__back__'));
|
const sourceTexture = this.scene.textures.get(speciesForm.getSpriteKey(this.getGender(ignoreOveride) === Gender.FEMALE, speciesForm.formIndex, this.shiny));
|
||||||
|
const sourceBackTexture = this.scene.textures.get(speciesForm.getSpriteKey(this.getGender(ignoreOveride) === Gender.FEMALE, speciesForm.formIndex, this.shiny).replace('pkmn__', 'pkmn__back__'));
|
||||||
|
const fusionTexture = this.scene.textures.get(fusionSpeciesForm.getSpriteKey(this.getFusionGender(ignoreOveride) === Gender.FEMALE, fusionSpeciesForm.formIndex, this.fusionShiny));
|
||||||
|
const fusionBackTexture = this.scene.textures.get(fusionSpeciesForm.getSpriteKey(this.getFusionGender(ignoreOveride) === Gender.FEMALE, fusionSpeciesForm.formIndex, this.fusionShiny).replace('pkmn__', 'pkmn__back__'));
|
||||||
|
|
||||||
const [ sourceFrame, sourceBackFrame, fusionFrame, fusionBackFrame ] = [ sourceTexture, sourceBackTexture, fusionTexture, fusionBackTexture ].map(texture => texture.frames[texture.firstFrame]);
|
const [ sourceFrame, sourceBackFrame, fusionFrame, fusionBackFrame ] = [ sourceTexture, sourceBackTexture, fusionTexture, fusionBackTexture ].map(texture => texture.frames[texture.firstFrame]);
|
||||||
const [ sourceImage, sourceBackImage, fusionImage, fusionBackImage ] = [ sourceTexture, sourceBackTexture, fusionTexture, fusionBackTexture ].map(i => i.getSourceImage() as HTMLImageElement);
|
const [ sourceImage, sourceBackImage, fusionImage, fusionBackImage ] = [ sourceTexture, sourceBackTexture, fusionTexture, fusionBackTexture ].map(i => i.getSourceImage() as HTMLImageElement);
|
||||||
|
@ -1555,8 +1571,8 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
||||||
}
|
}
|
||||||
|
|
||||||
[ this.getSprite(), this.getTintSprite() ].map(s => {
|
[ this.getSprite(), this.getTintSprite() ].map(s => {
|
||||||
s.pipelineData['spriteColors'] = spriteColors;
|
s.pipelineData[`spriteColors${ignoreOveride && this.summonData?.speciesForm ? 'Base' : ''}`] = spriteColors;
|
||||||
s.pipelineData['fusionSpriteColors'] = fusionSpriteColors;
|
s.pipelineData[`fusionSpriteColors${ignoreOveride && this.summonData?.speciesForm ? 'Base' : ''}`] = fusionSpriteColors;
|
||||||
});
|
});
|
||||||
|
|
||||||
canvas.remove();
|
canvas.remove();
|
||||||
|
@ -1954,7 +1970,9 @@ export class PokemonSummonData {
|
||||||
public tags: BattlerTag[] = [];
|
public tags: BattlerTag[] = [];
|
||||||
|
|
||||||
public speciesForm: PokemonSpeciesForm;
|
public speciesForm: PokemonSpeciesForm;
|
||||||
|
public fusionSpeciesForm: PokemonSpeciesForm;
|
||||||
public gender: Gender;
|
public gender: Gender;
|
||||||
|
public fusionGender: Gender;
|
||||||
public stats: integer[];
|
public stats: integer[];
|
||||||
public moveset: PokemonMove[];
|
public moveset: PokemonMove[];
|
||||||
public types: Type[];
|
public types: Type[];
|
||||||
|
|
|
@ -98,7 +98,7 @@ export default class SummaryUiHandler extends UiHandler {
|
||||||
this.summaryContainer.add(this.numberText);
|
this.summaryContainer.add(this.numberText);
|
||||||
|
|
||||||
this.pokemonSprite = this.scene.add.sprite(56, -106, `pkmn__sub`);
|
this.pokemonSprite = this.scene.add.sprite(56, -106, `pkmn__sub`);
|
||||||
this.pokemonSprite.setPipeline(this.scene.spritePipeline, { tone: [ 0.0, 0.0, 0.0, 0.0 ], hasShadow: false });
|
this.pokemonSprite.setPipeline(this.scene.spritePipeline, { ignoreOverride: true, tone: [ 0.0, 0.0, 0.0, 0.0 ], hasShadow: false });
|
||||||
this.summaryContainer.add(this.pokemonSprite);
|
this.summaryContainer.add(this.pokemonSprite);
|
||||||
|
|
||||||
this.nameText = addTextObject(this.scene, 6, -54, '', TextStyle.SUMMARY);
|
this.nameText = addTextObject(this.scene, 6, -54, '', TextStyle.SUMMARY);
|
||||||
|
@ -198,7 +198,12 @@ export default class SummaryUiHandler extends UiHandler {
|
||||||
this.numberText.setShadowColor(getTextColor(!this.pokemon.isShiny() ? TextStyle.SUMMARY : TextStyle.SUMMARY_GOLD, true));
|
this.numberText.setShadowColor(getTextColor(!this.pokemon.isShiny() ? TextStyle.SUMMARY : TextStyle.SUMMARY_GOLD, true));
|
||||||
|
|
||||||
this.pokemonSprite.play(this.pokemon.getSpriteKey(true));
|
this.pokemonSprite.play(this.pokemon.getSpriteKey(true));
|
||||||
[ 'spriteColors', 'fusionSpriteColors' ].map(k => this.pokemonSprite.pipelineData[k] = this.pokemon.getSprite().pipelineData[k]);
|
[ 'spriteColors', 'fusionSpriteColors' ].map(k => {
|
||||||
|
delete this.pokemonSprite.pipelineData[`${k}Base`];
|
||||||
|
if (this.pokemon.summonData?.speciesForm)
|
||||||
|
k += 'Base';
|
||||||
|
this.pokemonSprite.pipelineData[k] = this.pokemon.getSprite().pipelineData[k];
|
||||||
|
});
|
||||||
this.pokemon.cry();
|
this.pokemon.cry();
|
||||||
|
|
||||||
let nameLabel = this.pokemon.name;
|
let nameLabel = this.pokemon.name;
|
||||||
|
|
Loading…
Reference in New Issue