Add tiered shiny variants
This commit is contained in:
1 parent
a6ddda38ae
commit
c76f8c5e7e
690 files changed
+94645
-199
No files matched your search
+20
-12
@@ -6,6 +6,7 @@ import { getGenderSymbol, getGenderColor, Gender } from '../data/gender';
|
||||
import { StatusEffect } from '../data/status-effect';
|
||||
import BattleScene from '../battle-scene';
|
||||
import { Type, getTypeRgb } from '../data/type';
|
||||
import { getVariantTint } from '#app/data/variant';
|
||||
|
||||
export default class BattleInfo extends Phaser.GameObjects.Container {
|
||||
private player: boolean;
|
||||
@@ -29,8 +30,8 @@ export default class BattleInfo extends Phaser.GameObjects.Container {
|
||||
private genderText: Phaser.GameObjects.Text;
|
||||
private ownedIcon: Phaser.GameObjects.Sprite;
|
||||
private teraIcon: Phaser.GameObjects.Sprite;
|
||||
private splicedIcon: Phaser.GameObjects.Sprite;
|
||||
private shinyIcon: Phaser.GameObjects.Sprite;
|
||||
private splicedIcon: Phaser.GameObjects.Sprite;
|
||||
private statusIndicator: Phaser.GameObjects.Sprite;
|
||||
private levelContainer: Phaser.GameObjects.Container;
|
||||
private hpBar: Phaser.GameObjects.Image;
|
||||
@@ -91,6 +92,14 @@ export default class BattleInfo extends Phaser.GameObjects.Container {
|
||||
this.teraIcon.setInteractive(new Phaser.Geom.Rectangle(0, 0, 12, 15), Phaser.Geom.Rectangle.Contains);
|
||||
this.add(this.teraIcon);
|
||||
|
||||
this.shinyIcon = this.scene.add.sprite(0, 0, 'shiny_star');
|
||||
this.shinyIcon.setVisible(false);
|
||||
this.shinyIcon.setOrigin(0, 0);
|
||||
this.shinyIcon.setScale(0.5)
|
||||
this.shinyIcon.setPositionRelative(this.nameText, 0, 2);
|
||||
this.shinyIcon.setInteractive(new Phaser.Geom.Rectangle(0, 0, 12, 15), Phaser.Geom.Rectangle.Contains);
|
||||
this.add(this.shinyIcon);
|
||||
|
||||
this.splicedIcon = this.scene.add.sprite(0, 0, 'icon_spliced');
|
||||
this.splicedIcon.setVisible(false);
|
||||
this.splicedIcon.setOrigin(0, 0);
|
||||
@@ -111,12 +120,6 @@ export default class BattleInfo extends Phaser.GameObjects.Container {
|
||||
const levelOverlay = this.scene.add.image(0, 0, 'overlay_lv');
|
||||
this.levelContainer.add(levelOverlay);
|
||||
|
||||
this.shinyIcon = this.scene.add.sprite(0, 0, 'shiny_star');
|
||||
this.shinyIcon.setVisible(false);
|
||||
this.shinyIcon.setOrigin(0, 0);
|
||||
this.shinyIcon.setPositionRelative(this.levelContainer, -12, -5);
|
||||
this.add(this.shinyIcon);
|
||||
|
||||
this.hpBar = this.scene.add.image(player ? -61 : -71, player ? -1 : 4.5, 'overlay_hp');
|
||||
this.hpBar.setOrigin(0);
|
||||
this.add(this.hpBar);
|
||||
@@ -182,6 +185,14 @@ export default class BattleInfo extends Phaser.GameObjects.Container {
|
||||
this.splicedIcon.on('pointerout', () => (this.scene as BattleScene).ui.hideTooltip());
|
||||
}
|
||||
|
||||
this.shinyIcon.setPositionRelative(this.nameText, nameTextWidth + this.genderText.displayWidth + 1 + (this.teraIcon.visible ? this.teraIcon.displayWidth + 1 : 0) + (this.splicedIcon.visible ? this.splicedIcon.displayWidth + 1 : 0), 2.5);
|
||||
this.shinyIcon.setVisible(!!pokemon.isShiny());
|
||||
this.shinyIcon.setTint(getVariantTint(pokemon.getVariant()));
|
||||
if (this.shinyIcon.visible) {
|
||||
this.shinyIcon.on('pointerover', () => (this.scene as BattleScene).ui.showTooltip(null, `Shiny${pokemon.getVariant() ? ` (${pokemon.getVariant() === 2 ? 'Epic' : 'Rare'})` : ''}`));
|
||||
this.shinyIcon.on('pointerout', () => (this.scene as BattleScene).ui.hideTooltip());
|
||||
}
|
||||
|
||||
if (!this.player) {
|
||||
const dexEntry = pokemon.scene.gameData.dexData[pokemon.species.speciesId];
|
||||
this.ownedIcon.setVisible(!!dexEntry.caughtAttr);
|
||||
@@ -235,7 +246,7 @@ export default class BattleInfo extends Phaser.GameObjects.Container {
|
||||
if (this.player)
|
||||
this.y -= 12 * (mini ? 1 : -1);
|
||||
|
||||
const offsetElements = [ this.nameText, this.genderText, this.teraIcon, this.splicedIcon, this.statusIndicator, this.levelContainer ];
|
||||
const offsetElements = [ this.nameText, this.genderText, this.teraIcon, this.splicedIcon, this.shinyIcon, this.statusIndicator, this.levelContainer ];
|
||||
offsetElements.forEach(el => el.y += 1.5 * (mini ? -1 : 1));
|
||||
|
||||
[ this.type1Icon, this.type2Icon ].forEach(el => {
|
||||
@@ -243,8 +254,6 @@ export default class BattleInfo extends Phaser.GameObjects.Container {
|
||||
el.y += -8 * (mini ? 1 : -1);
|
||||
});
|
||||
|
||||
this.shinyIcon.setPositionRelative(this.levelContainer, -12, -5);
|
||||
|
||||
const toggledElements = [ this.hpNumbersContainer, this.expBar ];
|
||||
toggledElements.forEach(el => el.setVisible(!mini));
|
||||
}
|
||||
@@ -255,7 +264,7 @@ export default class BattleInfo extends Phaser.GameObjects.Container {
|
||||
if (boss !== this.boss) {
|
||||
this.boss = boss;
|
||||
|
||||
[ this.nameText, this.genderText, this.teraIcon, this.splicedIcon, this.ownedIcon, this.statusIndicator, this.levelContainer ].map(e => e.x += 48 * (boss ? -1 : 1));
|
||||
[ this.nameText, this.genderText, this.teraIcon, this.splicedIcon, this.shinyIcon, this.ownedIcon, this.statusIndicator, this.levelContainer ].map(e => e.x += 48 * (boss ? -1 : 1));
|
||||
this.hpBar.x += 38 * (boss ? -1 : 1);
|
||||
this.hpBar.y += 2 * (this.boss ? -1 : 1);
|
||||
this.hpBar.setTexture(`overlay_hp${boss ? '_boss' : ''}`);
|
||||
@@ -478,7 +487,6 @@ export default class BattleInfo extends Phaser.GameObjects.Container {
|
||||
for (let i = 0; i < levelStr.length; i++)
|
||||
this.levelNumbersContainer.add(this.scene.add.image(i * 8, 0, `numbers${isCapped && this.player ? '_red' : ''}`, levelStr[i]));
|
||||
this.levelContainer.setX((this.player ? -41 : -50) - 8 * Math.max(levelStr.length - 3, 0));
|
||||
this.shinyIcon.setPositionRelative(this.levelContainer, -12, -5);
|
||||
}
|
||||
|
||||
setHpNumbers(hp: integer, maxHp: integer) {
|
||||
|
||||
@@ -15,6 +15,7 @@ import PokemonIconAnimHandler, { PokemonIconAnimMode } from "./pokemon-icon-anim
|
||||
import { pokemonEvolutions } from "../data/pokemon-evolutions";
|
||||
import { addWindow } from "./ui-theme";
|
||||
import { SpeciesFormChangeItemTrigger } from "../data/pokemon-forms";
|
||||
import { getVariantTint } from "#app/data/variant";
|
||||
|
||||
const defaultMessage = 'Choose a Pokémon.';
|
||||
|
||||
@@ -899,9 +900,10 @@ class PartySlot extends Phaser.GameObjects.Container {
|
||||
}
|
||||
|
||||
if (this.pokemon.isShiny()) {
|
||||
const shinyStar = this.scene.add.image(0, 0, 'shiny_star');
|
||||
const shinyStar = this.scene.add.image(0, 0, 'shiny_star_small');
|
||||
shinyStar.setOrigin(0, 0);
|
||||
shinyStar.setPositionRelative(slotName, -8, 2);
|
||||
shinyStar.setPositionRelative(slotName, -9, 3);
|
||||
shinyStar.setTint(getVariantTint(this.pokemon.getVariant()));
|
||||
|
||||
slotInfoContainer.add(shinyStar);
|
||||
}
|
||||
|
||||
@@ -8,7 +8,7 @@ import { Gender, getGenderColor, getGenderSymbol } from "../data/gender";
|
||||
import { allAbilities } from "../data/ability";
|
||||
import { GameModes, gameModes } from "../game-mode";
|
||||
import { GrowthRate, getGrowthRateColor } from "../data/exp";
|
||||
import { DexAttr, DexAttrProps, DexEntry, Passive as PassiveAttr, StarterFormMoveData, StarterMoveset } from "../system/game-data";
|
||||
import { AbilityAttr, DexAttr, DexAttrProps, DexEntry, Passive as PassiveAttr, StarterFormMoveData, StarterMoveset } from "../system/game-data";
|
||||
import * as Utils from "../utils";
|
||||
import PokemonIconAnimHandler, { PokemonIconAnimMode } from "./pokemon-icon-anim-handler";
|
||||
import { StatsContainer } from "./stats-container";
|
||||
@@ -26,14 +26,15 @@ import { TitlePhase } from "../phases";
|
||||
import { argbFromRgba } from "@material/material-color-utilities";
|
||||
import { OptionSelectItem } from "./abstact-option-select-ui-handler";
|
||||
import { pokemonPrevolutions } from "#app/data/pokemon-evolutions";
|
||||
import { Variant, getVariantTint } from "#app/data/variant";
|
||||
|
||||
export type StarterSelectCallback = (starters: Starter[]) => void;
|
||||
|
||||
export interface Starter {
|
||||
species: PokemonSpecies;
|
||||
dexAttr: bigint;
|
||||
abilityIndex: integer,
|
||||
passive: boolean;
|
||||
variant: integer;
|
||||
nature: Nature;
|
||||
moveset?: StarterMoveset;
|
||||
pokerus: boolean;
|
||||
@@ -128,6 +129,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
|
||||
private genMode: boolean;
|
||||
private statsMode: boolean;
|
||||
private dexAttrCursor: bigint = 0n;
|
||||
private abilityCursor: integer = -1;
|
||||
private natureCursor: integer = -1;
|
||||
private genCursor: integer = 0;
|
||||
private genScrollCursor: integer = 0;
|
||||
@@ -141,6 +143,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
|
||||
private pokerusGens: integer[] = [];
|
||||
private pokerusCursors: integer[] = [];
|
||||
private starterAttr: bigint[] = [];
|
||||
private starterAbilityIndexes: integer[] = [];
|
||||
private starterNatures: Nature[] = [];
|
||||
private starterMovesets: StarterMoveset[] = [];
|
||||
private speciesStarterDexEntry: DexEntry;
|
||||
@@ -150,6 +153,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
|
||||
private canCycleGender: boolean;
|
||||
private canCycleAbility: boolean;
|
||||
private canCycleNature: boolean;
|
||||
private canCycleVariant: boolean;
|
||||
private value: integer = 0;
|
||||
|
||||
private assetLoadCancelled: Utils.BooleanHolder;
|
||||
@@ -162,7 +166,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
|
||||
private valueLimitLabel: Phaser.GameObjects.Text;
|
||||
private startCursorObj: Phaser.GameObjects.NineSlice;
|
||||
private starterValueLabels: Phaser.GameObjects.Text[];
|
||||
private shinyIcons: Phaser.GameObjects.Image[];
|
||||
private shinyIcons: Phaser.GameObjects.Image[][];
|
||||
private hiddenAbilityIcons: Phaser.GameObjects.Image[];
|
||||
|
||||
private iconAnimHandler: PokemonIconAnimHandler;
|
||||
@@ -338,14 +342,14 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
|
||||
starterSpecies.push(species.speciesId);
|
||||
this.speciesLoaded.set(species.speciesId, false);
|
||||
this.genSpecies[g].push(species);
|
||||
const defaultDexAttr = this.scene.gameData.getSpeciesDefaultDexAttr(species);
|
||||
const defaultDexAttr = this.scene.gameData.getSpeciesDefaultDexAttr(species, false, true);
|
||||
const defaultProps = this.scene.gameData.getSpeciesDexAttrProps(species, defaultDexAttr);
|
||||
const x = (s % 9) * 18;
|
||||
const y = Math.floor(s / 9) * 18;
|
||||
const icon = this.scene.add.sprite(x - 2, y + 2, species.getIconAtlasKey(defaultProps.formIndex));
|
||||
const icon = this.scene.add.sprite(x - 2, y + 2, species.getIconAtlasKey(defaultProps.formIndex, defaultProps.shiny, defaultProps.variant));
|
||||
icon.setScale(0.5);
|
||||
icon.setOrigin(0, 0);
|
||||
icon.setFrame(species.getIconId(defaultProps.female, defaultProps.formIndex, defaultProps.shiny));
|
||||
icon.setFrame(species.getIconId(defaultProps.female, defaultProps.formIndex, defaultProps.shiny, defaultProps.variant));
|
||||
icon.setTint(0);
|
||||
this.starterSelectGenIconContainers[g].add(icon);
|
||||
this.iconAnimHandler.addOrUpdate(icon, PokemonIconAnimMode.NONE);
|
||||
@@ -374,15 +378,19 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
|
||||
return ret;
|
||||
});
|
||||
|
||||
this.shinyIcons = new Array(81).fill(null).map((_, i) => {
|
||||
const x = (i % 9) * 18;
|
||||
const getShinyStar = (i: integer, v: integer): Phaser.GameObjects.Image => {
|
||||
const x = (i % 9) * 18 - v * 3;
|
||||
const y = Math.floor(i / 9) * 18;
|
||||
const ret = this.scene.add.image(x + 163, y + 11, 'shiny_star');
|
||||
const ret = this.scene.add.image(x + 163, y + 11, 'shiny_star_small');
|
||||
ret.setOrigin(0, 0);
|
||||
ret.setScale(0.5);
|
||||
ret.setVisible(false);
|
||||
this.starterSelectContainer.add(ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
this.shinyIcons = new Array(81).fill(null).map((_, i) => {
|
||||
return new Array(3).fill(null).map((_, v) => getShinyStar(i, v));
|
||||
});
|
||||
|
||||
this.hiddenAbilityIcons = new Array(81).fill(null).map((_, i) => {
|
||||
@@ -397,6 +405,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
|
||||
});
|
||||
|
||||
this.pokemonSprite = this.scene.add.sprite(53, 63, `pkmn__sub`);
|
||||
this.pokemonSprite.setPipeline(this.scene.spritePipeline, { tone: [ 0.0, 0.0, 0.0, 0.0 ], ignoreTimeTint: true });
|
||||
this.starterSelectContainer.add(this.pokemonSprite);
|
||||
|
||||
this.type1Icon = this.scene.add.sprite(8, 98, 'types');
|
||||
@@ -715,8 +724,8 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
|
||||
cursorObj.setVisible(true);
|
||||
cursorObj.setPosition(this.cursorObj.x, this.cursorObj.y);
|
||||
const props = this.scene.gameData.getSpeciesDexAttrProps(species, this.dexAttrCursor);
|
||||
this.starterIcons[this.starterCursors.length].setTexture(species.getIconAtlasKey(props.formIndex));
|
||||
this.starterIcons[this.starterCursors.length].setFrame(species.getIconId(props.female, props.formIndex, props.shiny));
|
||||
this.starterIcons[this.starterCursors.length].setTexture(species.getIconAtlasKey(props.formIndex, props.shiny, props.variant));
|
||||
this.starterIcons[this.starterCursors.length].setFrame(species.getIconId(props.female, props.formIndex, props.shiny, props.variant));
|
||||
this.starterGens.push(this.getGenCursorWithScroll());
|
||||
this.starterCursors.push(this.cursor);
|
||||
this.starterAttr.push(this.dexAttrCursor);
|
||||
@@ -814,7 +823,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
|
||||
handler: () => {
|
||||
starterData.passiveAttr |= PassiveAttr.ENABLED;
|
||||
ui.setMode(Mode.STARTER_SELECT);
|
||||
this.setSpeciesDetails(this.lastSpecies, undefined, undefined, undefined, undefined, undefined);
|
||||
this.setSpeciesDetails(this.lastSpecies, undefined, undefined, undefined, undefined, undefined, undefined);
|
||||
return true;
|
||||
}
|
||||
});
|
||||
@@ -824,7 +833,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
|
||||
handler: () => {
|
||||
starterData.passiveAttr ^= PassiveAttr.ENABLED;
|
||||
ui.setMode(Mode.STARTER_SELECT);
|
||||
this.setSpeciesDetails(this.lastSpecies, undefined, undefined, undefined, undefined, undefined);
|
||||
this.setSpeciesDetails(this.lastSpecies, undefined, undefined, undefined, undefined, undefined, undefined);
|
||||
return true;
|
||||
}
|
||||
});
|
||||
@@ -846,7 +855,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
|
||||
return this.scene.reset(true);
|
||||
});
|
||||
ui.setMode(Mode.STARTER_SELECT);
|
||||
this.setSpeciesDetails(this.lastSpecies, undefined, undefined, undefined, undefined, undefined);
|
||||
this.setSpeciesDetails(this.lastSpecies, undefined, undefined, undefined, undefined, undefined, undefined);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
@@ -923,7 +932,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
|
||||
switch (button) {
|
||||
case Button.CYCLE_SHINY:
|
||||
if (this.canCycleShiny) {
|
||||
this.setSpeciesDetails(this.lastSpecies, !props.shiny, undefined, undefined, undefined, undefined);
|
||||
this.setSpeciesDetails(this.lastSpecies, !props.shiny, undefined, undefined, props.shiny ? 0 : undefined, undefined, undefined);
|
||||
if (this.dexAttrCursor & DexAttr.SHINY)
|
||||
this.scene.playSound('sparkle');
|
||||
else
|
||||
@@ -939,34 +948,35 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
|
||||
if (this.speciesStarterDexEntry.caughtAttr & this.scene.gameData.getFormAttr(newFormIndex))
|
||||
break;
|
||||
} while (newFormIndex !== props.formIndex);
|
||||
this.setSpeciesDetails(this.lastSpecies, undefined, newFormIndex, undefined, undefined, undefined);
|
||||
this.setSpeciesDetails(this.lastSpecies, undefined, newFormIndex, undefined, undefined, undefined, undefined);
|
||||
success = true;
|
||||
}
|
||||
break;
|
||||
case Button.CYCLE_GENDER:
|
||||
if (this.canCycleGender) {
|
||||
this.setSpeciesDetails(this.lastSpecies, undefined, undefined, !props.female, undefined, undefined);
|
||||
this.setSpeciesDetails(this.lastSpecies, undefined, undefined, !props.female, undefined, undefined, undefined);
|
||||
success = true;
|
||||
}
|
||||
break;
|
||||
case Button.CYCLE_ABILITY:
|
||||
if (this.canCycleAbility) {
|
||||
const abilityCount = this.lastSpecies.getAbilityCount();
|
||||
let newAbilityIndex = props.abilityIndex;
|
||||
const abilityAttr = this.scene.gameData.starterData[this.lastSpecies.speciesId].abilityAttr;
|
||||
let newAbilityIndex = this.abilityCursor;
|
||||
do {
|
||||
newAbilityIndex = (newAbilityIndex + 1) % abilityCount;
|
||||
if (!newAbilityIndex) {
|
||||
if (this.speciesStarterDexEntry.caughtAttr & DexAttr.ABILITY_1)
|
||||
if (abilityAttr & AbilityAttr.ABILITY_1)
|
||||
break;
|
||||
} else if (newAbilityIndex === 1) {
|
||||
if (this.speciesStarterDexEntry.caughtAttr & (this.lastSpecies.ability2 ? DexAttr.ABILITY_2 : DexAttr.ABILITY_HIDDEN))
|
||||
if (abilityAttr & (this.lastSpecies.ability2 ? AbilityAttr.ABILITY_2 : AbilityAttr.ABILITY_HIDDEN))
|
||||
break;
|
||||
} else {
|
||||
if (this.speciesStarterDexEntry.caughtAttr & DexAttr.ABILITY_HIDDEN)
|
||||
if (abilityAttr & AbilityAttr.ABILITY_HIDDEN)
|
||||
break;
|
||||
}
|
||||
} while (newAbilityIndex !== props.abilityIndex);
|
||||
this.setSpeciesDetails(this.lastSpecies, undefined, undefined, undefined, newAbilityIndex, undefined);
|
||||
} while (newAbilityIndex !== this.abilityCursor);
|
||||
this.setSpeciesDetails(this.lastSpecies, undefined, undefined, undefined, undefined, newAbilityIndex, undefined);
|
||||
success = true;
|
||||
}
|
||||
break;
|
||||
@@ -975,7 +985,27 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
|
||||
const natures = this.scene.gameData.getNaturesForAttr(this.speciesStarterDexEntry.natureAttr);
|
||||
const natureIndex = natures.indexOf(this.natureCursor);
|
||||
const newNature = natures[natureIndex < natures.length - 1 ? natureIndex + 1 : 0];
|
||||
this.setSpeciesDetails(this.lastSpecies, undefined, undefined, undefined, undefined, newNature);
|
||||
this.setSpeciesDetails(this.lastSpecies, undefined, undefined, undefined, undefined, newNature, undefined);
|
||||
success = true;
|
||||
}
|
||||
break;
|
||||
case Button.CYCLE_VARIANT:
|
||||
if (this.canCycleVariant) {
|
||||
let newVariant = props.variant;
|
||||
do {
|
||||
newVariant = (newVariant + 1) % 3;
|
||||
if (!newVariant) {
|
||||
if (this.speciesStarterDexEntry.caughtAttr & DexAttr.DEFAULT_VARIANT)
|
||||
break;
|
||||
} else if (newVariant === 1) {
|
||||
if (this.speciesStarterDexEntry.caughtAttr & DexAttr.VARIANT_2)
|
||||
break;
|
||||
} else {
|
||||
if (this.speciesStarterDexEntry.caughtAttr & DexAttr.VARIANT_3)
|
||||
break;
|
||||
}
|
||||
} while (newVariant !== props.variant);
|
||||
this.setSpeciesDetails(this.lastSpecies, undefined, undefined, undefined, newVariant, undefined, undefined);
|
||||
success = true;
|
||||
}
|
||||
break;
|
||||
@@ -1043,7 +1073,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
|
||||
}
|
||||
} else
|
||||
this.scene.gameData.starterData[speciesId].moveset = this.starterMoveset.slice(0) as StarterMoveset;
|
||||
this.setSpeciesDetails(this.lastSpecies, undefined, undefined, undefined, undefined, undefined, false);
|
||||
this.setSpeciesDetails(this.lastSpecies, undefined, undefined, undefined, undefined, undefined, undefined, false);
|
||||
}
|
||||
|
||||
updateInstructions(): void {
|
||||
@@ -1060,6 +1090,8 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
|
||||
cycleInstructionLines.push('E: Cycle Ability');
|
||||
if (this.canCycleNature)
|
||||
cycleInstructionLines.push('N: Cycle Nature');
|
||||
if (this.canCycleVariant)
|
||||
cycleInstructionLines.push('V: Cycle Variant');
|
||||
}
|
||||
|
||||
if (cycleInstructionLines.length > 2) {
|
||||
@@ -1123,8 +1155,16 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
|
||||
if (slotVisible)
|
||||
this.updateStarterValueLabel(s);
|
||||
this.starterValueLabels[s].setVisible(slotVisible);
|
||||
this.shinyIcons[s].setVisible(slotVisible && !!this.scene.gameData.dexData[speciesId].caughtAttr && !!(this.scene.gameData.dexData[speciesId].caughtAttr & DexAttr.SHINY));
|
||||
this.hiddenAbilityIcons[s].setVisible(slotVisible && !!this.scene.gameData.dexData[speciesId].caughtAttr && !!(this.scene.gameData.dexData[speciesId].caughtAttr & DexAttr.ABILITY_HIDDEN));
|
||||
const speciesVariants = speciesId && this.scene.gameData.dexData[speciesId].caughtAttr & DexAttr.SHINY
|
||||
? [ DexAttr.DEFAULT_VARIANT, DexAttr.VARIANT_2, DexAttr.VARIANT_3 ].filter(v => !!(this.scene.gameData.dexData[speciesId].caughtAttr & v))
|
||||
: [];
|
||||
for (let v = 0; v < 3; v++) {
|
||||
const hasVariant = speciesVariants.length > v;
|
||||
this.shinyIcons[s][v].setVisible(slotVisible && hasVariant);
|
||||
if (hasVariant)
|
||||
this.shinyIcons[s][v].setTint(getVariantTint(speciesVariants[v] === DexAttr.DEFAULT_VARIANT ? 0 : speciesVariants[v] === DexAttr.VARIANT_2 ? 1 : 2));
|
||||
}
|
||||
this.hiddenAbilityIcons[s].setVisible(slotVisible && !!this.scene.gameData.dexData[speciesId].caughtAttr && !!(this.scene.gameData.starterData[speciesId].abilityAttr & 4));
|
||||
}
|
||||
} else {
|
||||
changed = super.setCursor(cursor);
|
||||
@@ -1177,7 +1217,8 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
|
||||
|
||||
setSpecies(species: PokemonSpecies) {
|
||||
this.speciesStarterDexEntry = species ? this.scene.gameData.dexData[species.speciesId] : null;
|
||||
this.dexAttrCursor = species ? this.scene.gameData.getSpeciesDefaultDexAttr(species) : 0n;
|
||||
this.dexAttrCursor = species ? this.scene.gameData.getSpeciesDefaultDexAttr(species, false, true) : 0n;
|
||||
this.abilityCursor = species ? this.scene.gameData.getStarterSpeciesDefaultAbilityIndex(species) : 0;
|
||||
this.natureCursor = species ? this.scene.gameData.getSpeciesDefaultNature(species) : 0;
|
||||
|
||||
if (this.statsMode) {
|
||||
@@ -1191,10 +1232,10 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
|
||||
}
|
||||
|
||||
if (this.lastSpecies) {
|
||||
const dexAttr = this.scene.gameData.getSpeciesDefaultDexAttr(this.lastSpecies);
|
||||
const dexAttr = this.scene.gameData.getSpeciesDefaultDexAttr(this.lastSpecies, false, true);
|
||||
const props = this.scene.gameData.getSpeciesDexAttrProps(this.lastSpecies, dexAttr);
|
||||
const lastSpeciesIcon = (this.starterSelectGenIconContainers[this.lastSpecies.generation - 1].getAt(this.genSpecies[this.lastSpecies.generation - 1].indexOf(this.lastSpecies)) as Phaser.GameObjects.Sprite);
|
||||
lastSpeciesIcon.setFrame(this.lastSpecies.getIconId(props.female, props.formIndex, props.shiny));
|
||||
lastSpeciesIcon.setTexture(this.lastSpecies.getIconAtlasKey(props.formIndex, props.shiny, props.variant), this.lastSpecies.getIconId(props.female, props.formIndex, props.shiny, props.variant));
|
||||
this.iconAnimHandler.addOrUpdate(lastSpeciesIcon, PokemonIconAnimMode.NONE);
|
||||
}
|
||||
|
||||
@@ -1247,13 +1288,14 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
|
||||
|
||||
if (starterIndex > -1) {
|
||||
props = this.scene.gameData.getSpeciesDexAttrProps(species, this.starterAttr[starterIndex]);
|
||||
this.setSpeciesDetails(species, props.shiny, props.formIndex, props.female, props.abilityIndex, this.starterNatures[starterIndex]);
|
||||
this.setSpeciesDetails(species, props.shiny, props.formIndex, props.female, props.variant, this.starterAbilityIndexes[starterIndex], this.starterNatures[starterIndex]);
|
||||
} else {
|
||||
const defaultDexAttr = this.scene.gameData.getSpeciesDefaultDexAttr(species);
|
||||
const defaultDexAttr = this.scene.gameData.getSpeciesDefaultDexAttr(species, false, true);
|
||||
const defaultAbilityIndex = this.scene.gameData.getStarterSpeciesDefaultAbilityIndex(species);
|
||||
const defaultNature = this.scene.gameData.getSpeciesDefaultNature(species);
|
||||
props = this.scene.gameData.getSpeciesDexAttrProps(species, defaultDexAttr);
|
||||
|
||||
this.setSpeciesDetails(species, props.shiny, props.formIndex, props.female, props.abilityIndex, defaultNature);
|
||||
this.setSpeciesDetails(species, props.shiny, props.formIndex, props.female, props.variant, defaultAbilityIndex, defaultNature);
|
||||
}
|
||||
|
||||
const speciesForm = getPokemonSpeciesForm(species.speciesId, props.formIndex);
|
||||
@@ -1276,11 +1318,12 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
|
||||
this.pokemonCandyOverlayIcon.setVisible(false);
|
||||
this.pokemonCandyCountText.setVisible(false);
|
||||
|
||||
const defaultDexAttr = this.scene.gameData.getSpeciesDefaultDexAttr(species, true);
|
||||
const defaultDexAttr = this.scene.gameData.getSpeciesDefaultDexAttr(species, true, true);
|
||||
const defaultAbilityIndex = this.scene.gameData.getStarterSpeciesDefaultAbilityIndex(species);
|
||||
const defaultNature = this.scene.gameData.getSpeciesDefaultNature(species);
|
||||
const props = this.scene.gameData.getSpeciesDexAttrProps(species, defaultDexAttr);
|
||||
|
||||
this.setSpeciesDetails(species, props.shiny, props.formIndex, props.female, props.abilityIndex, defaultNature, true);
|
||||
this.setSpeciesDetails(species, props.shiny, props.formIndex, props.female, props.variant, defaultAbilityIndex, defaultNature, true);
|
||||
this.pokemonSprite.setTint(0x808080);
|
||||
}
|
||||
} else {
|
||||
@@ -1299,15 +1342,17 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
|
||||
this.pokemonCandyOverlayIcon.setVisible(false);
|
||||
this.pokemonCandyCountText.setVisible(false);
|
||||
|
||||
this.setSpeciesDetails(species, false, 0, false, 0, 0);
|
||||
this.setSpeciesDetails(species, false, 0, false, 0, 0, 0);
|
||||
this.pokemonSprite.clearTint();
|
||||
}
|
||||
}
|
||||
|
||||
setSpeciesDetails(species: PokemonSpecies, shiny: boolean, formIndex: integer, female: boolean, abilityIndex: integer, natureIndex: integer, forSeen: boolean = false): void {
|
||||
setSpeciesDetails(species: PokemonSpecies, shiny: boolean, formIndex: integer, female: boolean, variant: Variant, abilityIndex: integer, natureIndex: integer, forSeen: boolean = false): void {
|
||||
const oldProps = species ? this.scene.gameData.getSpeciesDexAttrProps(species, this.dexAttrCursor) : null;
|
||||
const oldAbilityIndex = this.abilityCursor > -1 ? this.abilityCursor : this.scene.gameData.getStarterSpeciesDefaultAbilityIndex(species);
|
||||
const oldNatureIndex = this.natureCursor > -1 ? this.natureCursor : this.scene.gameData.getSpeciesDefaultNature(species);
|
||||
this.dexAttrCursor = 0n;
|
||||
this.abilityCursor = -1;
|
||||
this.natureCursor = -1;
|
||||
|
||||
if (species?.forms?.find(f => f.formKey === 'female')) {
|
||||
@@ -1320,8 +1365,9 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
|
||||
if (species) {
|
||||
this.dexAttrCursor |= (shiny !== undefined ? !shiny : !(shiny = oldProps.shiny)) ? DexAttr.NON_SHINY : DexAttr.SHINY;
|
||||
this.dexAttrCursor |= (female !== undefined ? !female : !(female = oldProps.female)) ? DexAttr.MALE : DexAttr.FEMALE;
|
||||
this.dexAttrCursor |= (abilityIndex !== undefined ? !abilityIndex : !(abilityIndex = oldProps.abilityIndex)) ? DexAttr.ABILITY_1 : species.ability2 && abilityIndex === 1 ? DexAttr.ABILITY_2 : DexAttr.ABILITY_HIDDEN;
|
||||
this.dexAttrCursor |= (variant !== undefined ? !variant : !(variant = oldProps.variant)) ? DexAttr.DEFAULT_VARIANT : variant === 1 ? DexAttr.VARIANT_2 : DexAttr.VARIANT_3;
|
||||
this.dexAttrCursor |= this.scene.gameData.getFormAttr(formIndex !== undefined ? formIndex : (formIndex = oldProps.formIndex));
|
||||
this.abilityCursor = abilityIndex !== undefined ? abilityIndex : (abilityIndex = oldAbilityIndex);
|
||||
this.natureCursor = natureIndex !== undefined ? natureIndex : (natureIndex = oldNatureIndex);
|
||||
}
|
||||
|
||||
@@ -1337,8 +1383,10 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
|
||||
|
||||
if (species) {
|
||||
const dexEntry = this.scene.gameData.dexData[species.speciesId];
|
||||
const abilityAttr = this.scene.gameData.starterData[species.speciesId].abilityAttr;
|
||||
if (!dexEntry.caughtAttr) {
|
||||
const props = this.scene.gameData.getSpeciesDexAttrProps(species, this.scene.gameData.getSpeciesDefaultDexAttr(species, forSeen));
|
||||
const props = this.scene.gameData.getSpeciesDexAttrProps(species, this.scene.gameData.getSpeciesDefaultDexAttr(species, forSeen, !forSeen));
|
||||
const defaultAbilityIndex = this.scene.gameData.getStarterSpeciesDefaultAbilityIndex(species);
|
||||
const defaultNature = this.scene.gameData.getSpeciesDefaultNature(species);
|
||||
if (shiny === undefined || shiny !== props.shiny)
|
||||
shiny = props.shiny;
|
||||
@@ -1346,8 +1394,10 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
|
||||
formIndex = props.formIndex;
|
||||
if (female === undefined || female !== props.female)
|
||||
female = props.female;
|
||||
if (abilityIndex === undefined || abilityIndex !== props.abilityIndex)
|
||||
abilityIndex = props.abilityIndex;
|
||||
if (variant === undefined || variant !== props.variant)
|
||||
variant = props.variant;
|
||||
if (abilityIndex === undefined || abilityIndex !== defaultAbilityIndex)
|
||||
abilityIndex = defaultAbilityIndex;
|
||||
if (natureIndex === undefined || natureIndex !== defaultNature)
|
||||
natureIndex = defaultNature;
|
||||
}
|
||||
@@ -1376,23 +1426,27 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
|
||||
const assetLoadCancelled = new Utils.BooleanHolder(false);
|
||||
this.assetLoadCancelled = assetLoadCancelled;
|
||||
|
||||
species.loadAssets(this.scene, female, formIndex, shiny, true).then(() => {
|
||||
species.loadAssets(this.scene, female, formIndex, shiny, variant, true).then(() => {
|
||||
if (assetLoadCancelled.value)
|
||||
return;
|
||||
this.assetLoadCancelled = null;
|
||||
this.speciesLoaded.set(species.speciesId, true);
|
||||
this.pokemonSprite.play(species.getSpriteKey(female, formIndex, shiny));
|
||||
this.pokemonSprite.play(species.getSpriteKey(female, formIndex, shiny, variant));
|
||||
this.pokemonSprite.setPipelineData('variant', variant);
|
||||
this.pokemonSprite.setPipelineData('spriteKey', species.getSpriteKey(female, formIndex, shiny, variant));
|
||||
this.pokemonSprite.setVisible(!this.statsMode);
|
||||
});
|
||||
|
||||
(this.starterSelectGenIconContainers[this.getGenCursorWithScroll()].getAt(this.cursor) as Phaser.GameObjects.Sprite).setFrame(species.getIconId(female, formIndex, shiny));
|
||||
(this.starterSelectGenIconContainers[this.getGenCursorWithScroll()].getAt(this.cursor) as Phaser.GameObjects.Sprite)
|
||||
.setTexture(species.getIconAtlasKey(formIndex, shiny, variant), species.getIconId(female, formIndex, shiny, variant));
|
||||
|
||||
this.canCycleShiny = !!(dexEntry.caughtAttr & DexAttr.NON_SHINY && dexEntry.caughtAttr & DexAttr.SHINY);
|
||||
this.canCycleGender = !!(dexEntry.caughtAttr & DexAttr.MALE && dexEntry.caughtAttr & DexAttr.FEMALE);
|
||||
this.canCycleAbility = [ dexEntry.caughtAttr & DexAttr.ABILITY_1, dexEntry.caughtAttr & DexAttr.ABILITY_2, dexEntry.caughtAttr & DexAttr.ABILITY_HIDDEN ].filter(a => a).length > 1;
|
||||
this.canCycleAbility = [ abilityAttr & AbilityAttr.ABILITY_1, abilityAttr & AbilityAttr.ABILITY_2, abilityAttr & AbilityAttr.ABILITY_HIDDEN ].filter(a => a).length > 1;
|
||||
this.canCycleForm = species.forms.filter(f => !f.formKey || !pokemonFormChanges[species.speciesId]?.find(fc => fc.formKey))
|
||||
.map((_, f) => dexEntry.caughtAttr & this.scene.gameData.getFormAttr(f)).filter(a => a).length > 1;
|
||||
.map((_, f) => dexEntry.caughtAttr & this.scene.gameData.getFormAttr(f)).filter(f => f).length > 1;
|
||||
this.canCycleNature = this.scene.gameData.getNaturesForAttr(dexEntry.natureAttr).length > 1;
|
||||
this.canCycleVariant = shiny && [ dexEntry.caughtAttr & DexAttr.DEFAULT_VARIANT, dexEntry.caughtAttr & DexAttr.VARIANT_2, dexEntry.caughtAttr & DexAttr.VARIANT_3].filter(v => v).length > 1;
|
||||
}
|
||||
|
||||
if (dexEntry.caughtAttr && species.malePercent !== null) {
|
||||
@@ -1589,8 +1643,8 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
|
||||
return {
|
||||
species: starterSpecies,
|
||||
dexAttr: thisObj.starterAttr[i],
|
||||
abilityIndex: thisObj.starterAbilityIndexes[i],
|
||||
passive: !(thisObj.scene.gameData.starterData[starterSpecies.speciesId].passiveAttr ^ (PassiveAttr.ENABLED | PassiveAttr.UNLOCKED)),
|
||||
variant: 0,
|
||||
nature: thisObj.starterNatures[i] as Nature,
|
||||
moveset: thisObj.starterMovesets[i],
|
||||
pokerus: !![ 0, 1, 2 ].filter(n => thisObj.pokerusGens[n] === starterSpecies.generation - 1 && thisObj.pokerusCursors[n] === thisObj.genSpecies[starterSpecies.generation - 1].indexOf(starterSpecies)).length
|
||||
|
||||
@@ -16,6 +16,7 @@ import { getBiomeName } from "../data/biomes";
|
||||
import { Nature, getNatureStatMultiplier } from "../data/nature";
|
||||
import { loggedInUser } from "../account";
|
||||
import { PlayerGender } from "../system/game-data";
|
||||
import { getVariantTint } from "#app/data/variant";
|
||||
|
||||
enum Page {
|
||||
PROFILE,
|
||||
@@ -41,7 +42,7 @@ export default class SummaryUiHandler extends UiHandler {
|
||||
private pokeball: Phaser.GameObjects.Sprite;
|
||||
private levelText: Phaser.GameObjects.Text;
|
||||
private genderText: Phaser.GameObjects.Text;
|
||||
private shinyStar: Phaser.GameObjects.Image;
|
||||
private shinyIcon: Phaser.GameObjects.Image;
|
||||
private statusContainer: Phaser.GameObjects.Container;
|
||||
private status: Phaser.GameObjects.Image;
|
||||
private summaryPageContainer: Phaser.GameObjects.Container;
|
||||
@@ -116,6 +117,13 @@ export default class SummaryUiHandler extends UiHandler {
|
||||
this.splicedIcon.setScale(0.75);
|
||||
this.splicedIcon.setInteractive(new Phaser.Geom.Rectangle(0, 0, 12, 15), Phaser.Geom.Rectangle.Contains);
|
||||
this.summaryContainer.add(this.splicedIcon);
|
||||
|
||||
this.shinyIcon = this.scene.add.image(0, -54, 'shiny_star');
|
||||
this.shinyIcon.setVisible(false);
|
||||
this.shinyIcon.setOrigin(0, 0);
|
||||
this.shinyIcon.setScale(0.75);
|
||||
this.shinyIcon.setInteractive(new Phaser.Geom.Rectangle(0, 0, 12, 15), Phaser.Geom.Rectangle.Contains);
|
||||
this.summaryContainer.add(this.shinyIcon);
|
||||
|
||||
this.pokeball = this.scene.add.sprite(6, -19, 'pb');
|
||||
this.pokeball.setOrigin(0, 1);
|
||||
@@ -129,10 +137,7 @@ export default class SummaryUiHandler extends UiHandler {
|
||||
this.genderText.setOrigin(0, 1);
|
||||
this.summaryContainer.add(this.genderText);
|
||||
|
||||
this.shinyStar = this.scene.add.image(96, -19, 'shiny_star');
|
||||
this.shinyStar.setOrigin(0, 1);
|
||||
this.shinyStar.setVisible(false);
|
||||
this.summaryContainer.add(this.shinyStar);
|
||||
|
||||
|
||||
this.statusContainer = this.scene.add.container(-106, -16);
|
||||
|
||||
@@ -217,8 +222,10 @@ export default class SummaryUiHandler extends UiHandler {
|
||||
this.numberText.setShadowColor(this.getTextColor(!this.pokemon.isShiny() ? TextStyle.SUMMARY : TextStyle.SUMMARY_GOLD, true));
|
||||
|
||||
this.pokemonSprite.play(this.pokemon.getSpriteKey(true));
|
||||
this.pokemonSprite.pipelineData['teraColor'] = getTypeRgb(this.pokemon.getTeraType());
|
||||
this.pokemonSprite.pipelineData['ignoreTimeTint'] = true;
|
||||
this.pokemonSprite.setPipelineData('teraColor', getTypeRgb(this.pokemon.getTeraType()));
|
||||
this.pokemonSprite.setPipelineData('ignoreTimeTint', true);
|
||||
this.pokemonSprite.setPipelineData('spriteKey', this.pokemon.getSpriteKey());
|
||||
this.pokemonSprite.setPipelineData('variant', this.pokemon.variant);
|
||||
[ 'spriteColors', 'fusionSpriteColors' ].map(k => {
|
||||
delete this.pokemonSprite.pipelineData[`${k}Base`];
|
||||
if (this.pokemon.summonData?.speciesForm)
|
||||
@@ -235,6 +242,14 @@ export default class SummaryUiHandler extends UiHandler {
|
||||
this.splicedIcon.on('pointerover', () => (this.scene as BattleScene).ui.showTooltip(null, `${this.pokemon.species.getName(this.pokemon.formIndex)}/${this.pokemon.fusionSpecies.getName(this.pokemon.fusionFormIndex)}`, true));
|
||||
this.splicedIcon.on('pointerout', () => (this.scene as BattleScene).ui.hideTooltip());
|
||||
}
|
||||
|
||||
this.shinyIcon.setPositionRelative(this.nameText, this.nameText.displayWidth + (this.splicedIcon.visible ? this.splicedIcon.displayWidth + 1 : 0) + 1, 3);
|
||||
this.shinyIcon.setTint(getVariantTint(this.pokemon.getVariant()));
|
||||
this.shinyIcon.setVisible(this.pokemon.isShiny());
|
||||
if (this.shinyIcon.visible) {
|
||||
this.shinyIcon.on('pointerover', () => (this.scene as BattleScene).ui.showTooltip(null, `Shiny${this.pokemon.getVariant() ? ` (${this.pokemon.getVariant() === 2 ? 'Epic' : 'Rare'})` : ''}`, true));
|
||||
this.shinyIcon.on('pointerout', () => (this.scene as BattleScene).ui.hideTooltip());
|
||||
}
|
||||
|
||||
this.pokeball.setFrame(getPokeballAtlasKey(this.pokemon.pokeball));
|
||||
this.levelText.setText(this.pokemon.level.toString());
|
||||
@@ -242,9 +257,6 @@ export default class SummaryUiHandler extends UiHandler {
|
||||
this.genderText.setColor(getGenderColor(this.pokemon.getGender(true)));
|
||||
this.genderText.setShadowColor(getGenderColor(this.pokemon.getGender(true), true));
|
||||
|
||||
this.shinyStar.setX(96 - (this.genderText.text ? 10 : 0));
|
||||
this.shinyStar.setVisible(this.pokemon.isShiny());
|
||||
|
||||
switch (this.summaryUiMode) {
|
||||
case SummaryUiMode.DEFAULT:
|
||||
const page = args.length < 2 ? Page.PROFILE : args[2] as Page;
|
||||
|
||||
Reference in new issue
Block a user