Implement Pokemon fusion icons
parent
973eefee1d
commit
ca778e07d5
|
@ -580,6 +580,64 @@ export default class BattleScene extends SceneBase {
|
||||||
return pokemon;
|
return pokemon;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
addPokemonIcon(pokemon: Pokemon, x: number, y: number, originX: number = 0.5, originY: number = 0.5, ignoreOverride: boolean = false): Phaser.GameObjects.Container {
|
||||||
|
const container = this.add.container(x, y);
|
||||||
|
|
||||||
|
const icon = this.add.sprite(0, 0, pokemon.getIconAtlasKey(ignoreOverride));
|
||||||
|
icon.setFrame(pokemon.getIconId(true));
|
||||||
|
icon.setOrigin(0.5, 0);
|
||||||
|
|
||||||
|
container.add(icon);
|
||||||
|
|
||||||
|
if (pokemon.isFusion()) {
|
||||||
|
const fusionIcon = this.add.sprite(0, 0, pokemon.getFusionIconAtlasKey(ignoreOverride));
|
||||||
|
fusionIcon.setOrigin(0.5, 0)
|
||||||
|
fusionIcon.setFrame(pokemon.getFusionIconId(true));
|
||||||
|
|
||||||
|
const originalWidth = icon.width;
|
||||||
|
const originalHeight = icon.height;
|
||||||
|
const originalFrame = icon.frame;
|
||||||
|
|
||||||
|
const iconHeight = (icon.frame.cutHeight <= fusionIcon.frame.cutHeight ? Math.ceil : Math.floor)((icon.frame.cutHeight + fusionIcon.frame.cutHeight) / 4);
|
||||||
|
|
||||||
|
const iconFrameId = `${icon.frame.name}h${iconHeight}`;
|
||||||
|
|
||||||
|
if (!icon.frame.texture.has(iconFrameId))
|
||||||
|
icon.frame.texture.add(iconFrameId, icon.frame.sourceIndex, icon.frame.cutX, icon.frame.cutY, icon.frame.cutWidth, iconHeight);
|
||||||
|
|
||||||
|
icon.setFrame(iconFrameId);
|
||||||
|
|
||||||
|
fusionIcon.y = icon.frame.cutHeight;
|
||||||
|
|
||||||
|
const originalFusionFrame = fusionIcon.frame;
|
||||||
|
|
||||||
|
const fusionIconY = fusionIcon.frame.cutY + icon.frame.cutHeight;
|
||||||
|
const fusionIconHeight = fusionIcon.frame.cutHeight - icon.frame.cutHeight;
|
||||||
|
const fusionIconFrameId = `${fusionIcon.frame.name}y${fusionIconY}`;
|
||||||
|
|
||||||
|
if (!fusionIcon.frame.texture.has(fusionIconFrameId))
|
||||||
|
fusionIcon.frame.texture.add(fusionIconFrameId, fusionIcon.frame.sourceIndex, fusionIcon.frame.cutX, fusionIconY, fusionIcon.frame.cutWidth, fusionIconHeight);
|
||||||
|
fusionIcon.setFrame(fusionIconFrameId);
|
||||||
|
|
||||||
|
const frameY = (originalFrame.y + originalFusionFrame.y) / 2;
|
||||||
|
icon.frame.y = fusionIcon.frame.y = frameY;
|
||||||
|
|
||||||
|
container.add(fusionIcon);
|
||||||
|
|
||||||
|
if (originX !== 0.5)
|
||||||
|
container.x -= originalWidth * (originX - 0.5);
|
||||||
|
if (originY !== 0)
|
||||||
|
container.y -= (originalHeight) * originY;
|
||||||
|
} else {
|
||||||
|
if (originX !== 0.5)
|
||||||
|
container.x -= icon.width * (originX - 0.5);
|
||||||
|
if (originY !== 0)
|
||||||
|
container.y -= icon.height * originY;
|
||||||
|
}
|
||||||
|
|
||||||
|
return container;
|
||||||
|
}
|
||||||
|
|
||||||
setSeed(seed: string): void {
|
setSeed(seed: string): void {
|
||||||
this.seed = seed;
|
this.seed = seed;
|
||||||
this.rngCounter = 0;
|
this.rngCounter = 0;
|
||||||
|
|
|
@ -357,10 +357,18 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
||||||
return this.getSpeciesForm(ignoreOverride).getIconAtlasKey(this.formIndex);
|
return this.getSpeciesForm(ignoreOverride).getIconAtlasKey(this.formIndex);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
getFusionIconAtlasKey(ignoreOverride?: boolean): string {
|
||||||
|
return this.getFusionSpeciesForm(ignoreOverride).getIconAtlasKey(this.fusionFormIndex);
|
||||||
|
}
|
||||||
|
|
||||||
getIconId(ignoreOverride?: boolean): string {
|
getIconId(ignoreOverride?: boolean): string {
|
||||||
return this.getSpeciesForm(ignoreOverride).getIconId(this.getGender(ignoreOverride) === Gender.FEMALE, this.formIndex, this.isShiny());
|
return this.getSpeciesForm(ignoreOverride).getIconId(this.getGender(ignoreOverride) === Gender.FEMALE, this.formIndex, this.isShiny());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
getFusionIconId(ignoreOverride?: boolean): string {
|
||||||
|
return this.getFusionSpeciesForm(ignoreOverride).getIconId(this.getFusionGender(ignoreOverride) === Gender.FEMALE, this.fusionFormIndex, this.isShiny());
|
||||||
|
}
|
||||||
|
|
||||||
getSpeciesForm(ignoreOverride?: boolean): PokemonSpeciesForm {
|
getSpeciesForm(ignoreOverride?: boolean): PokemonSpeciesForm {
|
||||||
if (!ignoreOverride && this.summonData?.speciesForm)
|
if (!ignoreOverride && this.summonData?.speciesForm)
|
||||||
return this.summonData.speciesForm;
|
return this.summonData.speciesForm;
|
||||||
|
|
|
@ -455,11 +455,7 @@ export abstract class PokemonHeldItemModifier extends PersistentModifier {
|
||||||
|
|
||||||
if (!forSummary) {
|
if (!forSummary) {
|
||||||
const pokemon = this.getPokemon(scene);
|
const pokemon = this.getPokemon(scene);
|
||||||
const isIconShown = pokemon instanceof PlayerPokemon || scene.currentBattle.seenEnemyPartyMemberIds.has(pokemon.id);
|
const pokemonIcon = scene.addPokemonIcon(pokemon, -2, 10, 0, 0.5);
|
||||||
const iconAtlasKey = isIconShown ? pokemon.getIconAtlasKey() : 'pokemon_icons_0';
|
|
||||||
const pokemonIcon = scene.add.sprite(-2, 10, iconAtlasKey);
|
|
||||||
pokemonIcon.setFrame(pokemon.getIconId());
|
|
||||||
pokemonIcon.setOrigin(0, 0.5);
|
|
||||||
|
|
||||||
container.add(pokemonIcon);
|
container.add(pokemonIcon);
|
||||||
|
|
||||||
|
|
|
@ -4,7 +4,7 @@ import { TextStyle, addTextObject } from "./text";
|
||||||
|
|
||||||
export default class PartyExpBar extends Phaser.GameObjects.Container {
|
export default class PartyExpBar extends Phaser.GameObjects.Container {
|
||||||
private bg: Phaser.GameObjects.NineSlice;
|
private bg: Phaser.GameObjects.NineSlice;
|
||||||
private pokemonIcon: Phaser.GameObjects.Sprite;
|
private pokemonIcon: Phaser.GameObjects.Container;
|
||||||
private expText: Phaser.GameObjects.Text;
|
private expText: Phaser.GameObjects.Text;
|
||||||
|
|
||||||
private tween: Phaser.Tweens.Tween;
|
private tween: Phaser.Tweens.Tween;
|
||||||
|
@ -21,11 +21,6 @@ export default class PartyExpBar extends Phaser.GameObjects.Container {
|
||||||
|
|
||||||
this.add(this.bg);
|
this.add(this.bg);
|
||||||
|
|
||||||
this.pokemonIcon = this.scene.add.sprite(1, 9, 'pokemon_icons_0');
|
|
||||||
this.pokemonIcon.setOrigin(0, 0.5);
|
|
||||||
this.pokemonIcon.setScale(0.5);
|
|
||||||
this.add(this.pokemonIcon);
|
|
||||||
|
|
||||||
this.expText = addTextObject(this.scene, 22, 4, '', TextStyle.BATTLE_INFO);
|
this.expText = addTextObject(this.scene, 22, 4, '', TextStyle.BATTLE_INFO);
|
||||||
this.expText.setOrigin(0, 0);
|
this.expText.setOrigin(0, 0);
|
||||||
this.add(this.expText);
|
this.add(this.expText);
|
||||||
|
@ -39,8 +34,11 @@ export default class PartyExpBar extends Phaser.GameObjects.Container {
|
||||||
if (this.shown)
|
if (this.shown)
|
||||||
return resolve();
|
return resolve();
|
||||||
|
|
||||||
this.pokemonIcon.setTexture(pokemon.getIconAtlasKey());
|
this.pokemonIcon = (this.scene as BattleScene).addPokemonIcon(pokemon, -8, 15, 0, 0.5);
|
||||||
this.pokemonIcon.setFrame(pokemon.getIconId());
|
this.pokemonIcon.setScale(0.5);
|
||||||
|
|
||||||
|
this.add(this.pokemonIcon);
|
||||||
|
|
||||||
this.expText.setText(`+${expValue.toString()}`);
|
this.expText.setText(`+${expValue.toString()}`);
|
||||||
|
|
||||||
this.bg.width = this.expText.displayWidth + 28;
|
this.bg.width = this.expText.displayWidth + 28;
|
||||||
|
@ -83,6 +81,7 @@ export default class PartyExpBar extends Phaser.GameObjects.Container {
|
||||||
this.tween = null;
|
this.tween = null;
|
||||||
this.shown = false;
|
this.shown = false;
|
||||||
this.setVisible(false);
|
this.setVisible(false);
|
||||||
|
this.pokemonIcon?.destroy();
|
||||||
resolve();
|
resolve();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
|
@ -795,7 +795,7 @@ class PartySlot extends Phaser.GameObjects.Container {
|
||||||
private slotBg: Phaser.GameObjects.Image;
|
private slotBg: Phaser.GameObjects.Image;
|
||||||
private slotPb: Phaser.GameObjects.Sprite;
|
private slotPb: Phaser.GameObjects.Sprite;
|
||||||
|
|
||||||
private pokemonIcon: Phaser.GameObjects.Sprite;
|
private pokemonIcon: Phaser.GameObjects.Container;
|
||||||
private iconAnimHandler: PokemonIconAnimHandler;
|
private iconAnimHandler: PokemonIconAnimHandler;
|
||||||
|
|
||||||
constructor(scene: BattleScene, slotIndex: integer, pokemon: PlayerPokemon, iconAnimHandler: PokemonIconAnimHandler, partyUiMode: PartyUiMode, tmMoveId: Moves) {
|
constructor(scene: BattleScene, slotIndex: integer, pokemon: PlayerPokemon, iconAnimHandler: PokemonIconAnimHandler, partyUiMode: PartyUiMode, tmMoveId: Moves) {
|
||||||
|
@ -825,8 +825,7 @@ class PartySlot extends Phaser.GameObjects.Container {
|
||||||
|
|
||||||
this.add(slotPb);
|
this.add(slotPb);
|
||||||
|
|
||||||
this.pokemonIcon = this.scene.add.sprite(slotPb.x, slotPb.y, this.pokemon.getIconAtlasKey(true));
|
this.pokemonIcon = (this.scene as BattleScene).addPokemonIcon(this.pokemon, slotPb.x, slotPb.y, 0.5, 0.5, true);
|
||||||
this.pokemonIcon.setFrame(this.pokemon.getIconId(true));
|
|
||||||
|
|
||||||
this.add(this.pokemonIcon);
|
this.add(this.pokemonIcon);
|
||||||
|
|
||||||
|
|
|
@ -8,7 +8,7 @@ export enum PokemonIconAnimMode {
|
||||||
}
|
}
|
||||||
|
|
||||||
export default class PokemonIconAnimHandler {
|
export default class PokemonIconAnimHandler {
|
||||||
private icons: Map<Phaser.GameObjects.Sprite, PokemonIconAnimMode>;
|
private icons: Map<Phaser.GameObjects.Container, PokemonIconAnimMode>;
|
||||||
private toggled: boolean;
|
private toggled: boolean;
|
||||||
|
|
||||||
setup(scene: BattleScene): void {
|
setup(scene: BattleScene): void {
|
||||||
|
@ -43,7 +43,7 @@ export default class PokemonIconAnimHandler {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
addOrUpdate(icons: Phaser.GameObjects.Sprite | Phaser.GameObjects.Sprite[], mode: PokemonIconAnimMode): void {
|
addOrUpdate(icons: Phaser.GameObjects.Container | Phaser.GameObjects.Container[], mode: PokemonIconAnimMode): void {
|
||||||
if (!Array.isArray(icons))
|
if (!Array.isArray(icons))
|
||||||
icons = [ icons ];
|
icons = [ icons ];
|
||||||
for (let i of icons) {
|
for (let i of icons) {
|
||||||
|
@ -60,7 +60,7 @@ export default class PokemonIconAnimHandler {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
remove(icons: Phaser.GameObjects.Sprite | Phaser.GameObjects.Sprite[]): void {
|
remove(icons: Phaser.GameObjects.Container | Phaser.GameObjects.Container[]): void {
|
||||||
if (!Array.isArray(icons))
|
if (!Array.isArray(icons))
|
||||||
icons = [ icons ];
|
icons = [ icons ];
|
||||||
for (let i of icons) {
|
for (let i of icons) {
|
||||||
|
|
|
@ -242,8 +242,7 @@ class SessionSlot extends Phaser.GameObjects.Container {
|
||||||
iconContainer.setScale(0.75);
|
iconContainer.setScale(0.75);
|
||||||
|
|
||||||
const pokemon = p.toPokemon(this.scene);
|
const pokemon = p.toPokemon(this.scene);
|
||||||
const icon = this.scene.add.sprite(0, 0, pokemon.getIconAtlasKey(), pokemon.getIconId());
|
const icon = this.scene.addPokemonIcon(pokemon, 0, 0, 0, 0);
|
||||||
icon.setOrigin(0, 0);
|
|
||||||
|
|
||||||
const text = addTextObject(this.scene, 32, 20, `Lv${Utils.formatLargeNumber(pokemon.level, 1000)}`, TextStyle.PARTY, { fontSize: '54px', color: '#f8f8f8' });
|
const text = addTextObject(this.scene, 32, 20, `Lv${Utils.formatLargeNumber(pokemon.level, 1000)}`, TextStyle.PARTY, { fontSize: '54px', color: '#f8f8f8' });
|
||||||
text.setShadow(0, 0, null);
|
text.setShadow(0, 0, null);
|
||||||
|
|
Loading…
Reference in New Issue