Add candy system for passives and value reductions
This commit is contained in:
1 parent
ccf956a63c
commit
824a73ef71
22 files changed
+2497
-1848
No files matched your search
@@ -4,6 +4,7 @@ import { Mode } from "./ui";
|
||||
import UiHandler from "./ui-handler";
|
||||
import { addWindow } from "./ui-theme";
|
||||
import * as Utils from "../utils";
|
||||
import { argbFromRgba } from "@material/material-color-utilities";
|
||||
|
||||
export interface OptionSelectConfig {
|
||||
xOffset?: number;
|
||||
@@ -16,9 +17,11 @@ export interface OptionSelectConfig {
|
||||
|
||||
export interface OptionSelectItem {
|
||||
label: string;
|
||||
handler: Function;
|
||||
handler: () => boolean;
|
||||
keepOpen?: boolean;
|
||||
overrideSound?: boolean;
|
||||
item?: string;
|
||||
itemArgs?: any[]
|
||||
}
|
||||
|
||||
const scrollUpLabel = '↑';
|
||||
@@ -28,6 +31,7 @@ export default abstract class AbstractOptionSelectUiHandler extends UiHandler {
|
||||
protected optionSelectContainer: Phaser.GameObjects.Container;
|
||||
protected optionSelectBg: Phaser.GameObjects.NineSlice;
|
||||
protected optionSelectText: Phaser.GameObjects.Text;
|
||||
protected optionSelectIcons: Phaser.GameObjects.Sprite[];
|
||||
|
||||
protected config: OptionSelectConfig;
|
||||
|
||||
@@ -58,6 +62,8 @@ export default abstract class AbstractOptionSelectUiHandler extends UiHandler {
|
||||
this.optionSelectBg.setOrigin(1, 1);
|
||||
this.optionSelectContainer.add(this.optionSelectBg);
|
||||
|
||||
this.optionSelectIcons = [];
|
||||
|
||||
this.setCursor(0);
|
||||
}
|
||||
|
||||
@@ -66,8 +72,12 @@ export default abstract class AbstractOptionSelectUiHandler extends UiHandler {
|
||||
|
||||
if (this.optionSelectText)
|
||||
this.optionSelectText.destroy();
|
||||
if (this.optionSelectIcons?.length) {
|
||||
this.optionSelectIcons.map(i => i.destroy());
|
||||
this.optionSelectIcons.splice(0, this.optionSelectIcons.length);
|
||||
}
|
||||
|
||||
this.optionSelectText = addTextObject(this.scene, 0, 0, options.map(o => o.label).join('\n'), TextStyle.WINDOW, { maxLines: options.length });
|
||||
this.optionSelectText = addTextObject(this.scene, 0, 0, options.map(o => o.item ? ` ${o.label}` : o.label).join('\n'), TextStyle.WINDOW, { maxLines: options.length });
|
||||
this.optionSelectText.setLineSpacing(12);
|
||||
this.optionSelectContainer.add(this.optionSelectText);
|
||||
this.optionSelectContainer.setPosition((this.scene.game.canvas.width / 6) - 1 - (this.config?.xOffset || 0), -48 + (this.config?.yOffset || 0));
|
||||
@@ -80,6 +90,31 @@ export default abstract class AbstractOptionSelectUiHandler extends UiHandler {
|
||||
this.optionSelectBg.height = this.getWindowHeight();
|
||||
|
||||
this.optionSelectText.setPositionRelative(this.optionSelectBg, 16, 9);
|
||||
|
||||
options.forEach((option: OptionSelectItem, i: integer) => {
|
||||
if (option.item) {
|
||||
const itemIcon = this.scene.add.sprite(0, 0, 'items', option.item);
|
||||
itemIcon.setScale(0.5);
|
||||
this.optionSelectIcons.push(itemIcon);
|
||||
|
||||
this.optionSelectContainer.add(itemIcon);
|
||||
|
||||
itemIcon.setPositionRelative(this.optionSelectText, 6, 7 + 16 * i);
|
||||
|
||||
if (option.item === 'candy') {
|
||||
const itemOverlayIcon = this.scene.add.sprite(0, 0, 'items', 'candy_overlay');
|
||||
itemOverlayIcon.setScale(0.5);
|
||||
this.optionSelectIcons.push(itemOverlayIcon);
|
||||
|
||||
this.optionSelectContainer.add(itemOverlayIcon);
|
||||
|
||||
itemOverlayIcon.setPositionRelative(this.optionSelectText, 6, 7 + 16 * i);
|
||||
|
||||
itemIcon.setTint(argbFromRgba(Utils.rgbHexToRgba(option.itemArgs[0])));
|
||||
itemOverlayIcon.setTint(argbFromRgba(Utils.rgbHexToRgba(option.itemArgs[1])));
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
show(args: any[]): boolean {
|
||||
@@ -132,10 +167,12 @@ export default abstract class AbstractOptionSelectUiHandler extends UiHandler {
|
||||
return false;
|
||||
}
|
||||
const option = this.config.options[this.cursor + (this.scrollCursor - (this.scrollCursor ? 1 : 0))];
|
||||
option.handler();
|
||||
if (!option.keepOpen)
|
||||
this.clear();
|
||||
playSound = !option.overrideSound;
|
||||
if (option.handler()) {
|
||||
if (!option.keepOpen)
|
||||
this.clear();
|
||||
playSound = !option.overrideSound;
|
||||
} else
|
||||
ui.playError();
|
||||
} else {
|
||||
switch (button) {
|
||||
case Button.UP:
|
||||
@@ -182,12 +219,12 @@ export default abstract class AbstractOptionSelectUiHandler extends UiHandler {
|
||||
if (optionStartIndex)
|
||||
options.unshift({
|
||||
label: scrollUpLabel,
|
||||
handler: () => { }
|
||||
handler: () => true
|
||||
});
|
||||
if (optionEndIndex < optionsScrollTotal)
|
||||
options.push({
|
||||
label: scrollDownLabel,
|
||||
handler: () => { }
|
||||
handler: () => true
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,123 @@
|
||||
import BattleScene, { starterColors } from "../battle-scene";
|
||||
import { TextStyle, addTextObject } from "./text";
|
||||
import { argbFromRgba } from "@material/material-color-utilities";
|
||||
import * as Utils from "../utils";
|
||||
import { Species } from "#app/data/enums/species";
|
||||
|
||||
export default class CandyBar extends Phaser.GameObjects.Container {
|
||||
private bg: Phaser.GameObjects.NineSlice;
|
||||
private candyIcon: Phaser.GameObjects.Sprite;
|
||||
private candyOverlayIcon: Phaser.GameObjects.Sprite;
|
||||
private countText: Phaser.GameObjects.Text;
|
||||
private speciesId: Species;
|
||||
|
||||
private tween: Phaser.Tweens.Tween;
|
||||
private autoHideTimer: number;
|
||||
|
||||
public shown: boolean;
|
||||
|
||||
constructor(scene: BattleScene) {
|
||||
super(scene, (scene.game.canvas.width / 6), -((scene.game.canvas.height) / 6) + 15);
|
||||
}
|
||||
|
||||
setup(): void {
|
||||
this.bg = this.scene.add.nineslice(0, 0, 'party_exp_bar', null, 8, 18, 21, 5, 6, 4);
|
||||
this.bg.setOrigin(0, 0);
|
||||
|
||||
this.add(this.bg);
|
||||
|
||||
this.candyIcon = this.scene.add.sprite(14, 0, 'items', 'candy');
|
||||
this.candyIcon.setOrigin(0.5, 0);
|
||||
this.candyIcon.setScale(0.5);
|
||||
|
||||
this.add(this.candyIcon);
|
||||
|
||||
this.candyOverlayIcon = this.scene.add.sprite(14, 0, 'items', 'candy_overlay');
|
||||
this.candyOverlayIcon.setOrigin(0.5, 0);
|
||||
this.candyOverlayIcon.setScale(0.5);
|
||||
|
||||
this.add(this.candyOverlayIcon);
|
||||
|
||||
this.countText = addTextObject(this.scene, 22, 4, '', TextStyle.BATTLE_INFO);
|
||||
this.countText.setOrigin(0, 0);
|
||||
this.add(this.countText);
|
||||
|
||||
this.setVisible(false);
|
||||
this.shown = false;
|
||||
}
|
||||
|
||||
showStarterSpeciesCandy(starterSpeciesId: Species, count: integer): Promise<void> {
|
||||
return new Promise<void>(resolve => {
|
||||
if (this.shown) {
|
||||
if (this.speciesId === starterSpeciesId)
|
||||
return resolve();
|
||||
else
|
||||
return this.hide().then(() => this.showStarterSpeciesCandy(starterSpeciesId, count)).then(() => resolve());
|
||||
}
|
||||
|
||||
const colorScheme = starterColors[starterSpeciesId];
|
||||
|
||||
this.candyIcon.setTint(argbFromRgba(Utils.rgbHexToRgba(colorScheme[0])));
|
||||
this.candyOverlayIcon.setTint(argbFromRgba(Utils.rgbHexToRgba(colorScheme[1])));
|
||||
|
||||
this.countText.setText(`${(this.scene as BattleScene).gameData.starterData[starterSpeciesId].candyCount + count} (+${count.toString()})`);
|
||||
|
||||
this.bg.width = this.countText.displayWidth + 28;
|
||||
|
||||
(this.scene as BattleScene).fieldUI.bringToTop(this);
|
||||
|
||||
if (this.tween)
|
||||
this.tween.stop();
|
||||
|
||||
this.tween = this.scene.tweens.add({
|
||||
targets: this,
|
||||
x: (this.scene.game.canvas.width / 6) - (this.bg.width - 5),
|
||||
duration: 500,
|
||||
ease: 'Sine.easeOut',
|
||||
onComplete: () => {
|
||||
this.tween = null;
|
||||
this.resetAutoHideTimer();
|
||||
resolve();
|
||||
}
|
||||
});
|
||||
|
||||
this.setVisible(true);
|
||||
this.shown = true;
|
||||
});
|
||||
}
|
||||
|
||||
hide(): Promise<void> {
|
||||
return new Promise<void>(resolve => {
|
||||
if (!this.shown)
|
||||
return resolve();
|
||||
|
||||
if (this.autoHideTimer)
|
||||
clearInterval(this.autoHideTimer);
|
||||
|
||||
if (this.tween)
|
||||
this.tween.stop();
|
||||
|
||||
this.tween = this.scene.tweens.add({
|
||||
targets: this,
|
||||
x: (this.scene.game.canvas.width / 6),
|
||||
duration: 500,
|
||||
ease: 'Sine.easeIn',
|
||||
onComplete: () => {
|
||||
this.tween = null;
|
||||
this.shown = false;
|
||||
this.setVisible(false);
|
||||
resolve();
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
resetAutoHideTimer(): void {
|
||||
if (this.autoHideTimer)
|
||||
clearInterval(this.autoHideTimer);
|
||||
this.autoHideTimer = setTimeout(() => {
|
||||
this.hide();
|
||||
this.autoHideTimer = null;
|
||||
}, 2500);
|
||||
}
|
||||
}
|
||||
@@ -20,11 +20,17 @@ export default class ConfirmUiHandler extends AbstractOptionSelectUiHandler {
|
||||
options: [
|
||||
{
|
||||
label: 'Yes',
|
||||
handler: args[0]
|
||||
handler: () => {
|
||||
args[0]();
|
||||
return true;
|
||||
}
|
||||
},
|
||||
{
|
||||
label: 'No',
|
||||
handler: args[1]
|
||||
handler: () => {
|
||||
args[1]();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
],
|
||||
delay: args.length >= 6 && args[5] !== null ? args[5] as integer : 0
|
||||
|
||||
+37
-10
@@ -5,7 +5,7 @@ import * as Utils from "../utils";
|
||||
import { addWindow } from "./ui-theme";
|
||||
import MessageUiHandler from "./message-ui-handler";
|
||||
import { GameDataType } from "../system/game-data";
|
||||
import { OptionSelectConfig } from "./abstact-option-select-ui-handler";
|
||||
import { OptionSelectConfig, OptionSelectItem } from "./abstact-option-select-ui-handler";
|
||||
import { Tutorial, handleTutorial } from "../tutorial";
|
||||
import { updateUserInfo } from "../account";
|
||||
|
||||
@@ -99,6 +99,7 @@ export default class MenuUiHandler extends MessageUiHandler {
|
||||
callback(i);
|
||||
ui.revertMode();
|
||||
ui.showText(null, 0);
|
||||
return true;
|
||||
}
|
||||
};
|
||||
}).concat([{
|
||||
@@ -106,6 +107,7 @@ export default class MenuUiHandler extends MessageUiHandler {
|
||||
handler: () => {
|
||||
ui.revertMode();
|
||||
ui.showText(null, 0);
|
||||
return true;
|
||||
}
|
||||
}]),
|
||||
xOffset: 98
|
||||
@@ -117,7 +119,10 @@ export default class MenuUiHandler extends MessageUiHandler {
|
||||
if (Utils.isLocal) {
|
||||
manageDataOptions.push({
|
||||
label: 'Import Session',
|
||||
handler: () => confirmSlot('Select a slot to import to.', () => true, slotId => this.scene.gameData.importData(GameDataType.SESSION, slotId)),
|
||||
handler: () => {
|
||||
confirmSlot('Select a slot to import to.', () => true, slotId => this.scene.gameData.importData(GameDataType.SESSION, slotId));
|
||||
return true;
|
||||
},
|
||||
keepOpen: true
|
||||
});
|
||||
}
|
||||
@@ -137,25 +142,35 @@ export default class MenuUiHandler extends MessageUiHandler {
|
||||
i => dataSlots.indexOf(i) > -1,
|
||||
slotId => this.scene.gameData.tryExportData(GameDataType.SESSION, slotId));
|
||||
});
|
||||
return true;
|
||||
},
|
||||
keepOpen: true
|
||||
});
|
||||
if (Utils.isLocal) {
|
||||
manageDataOptions.push({
|
||||
label: 'Import Data',
|
||||
handler: () => this.scene.gameData.importData(GameDataType.SYSTEM),
|
||||
handler: () => {
|
||||
this.scene.gameData.importData(GameDataType.SYSTEM);
|
||||
return true;
|
||||
},
|
||||
keepOpen: true
|
||||
});
|
||||
}
|
||||
manageDataOptions.push(
|
||||
{
|
||||
label: 'Export Data',
|
||||
handler: () => this.scene.gameData.tryExportData(GameDataType.SYSTEM),
|
||||
handler: () => {
|
||||
this.scene.gameData.tryExportData(GameDataType.SYSTEM);
|
||||
return true;
|
||||
},
|
||||
keepOpen: true
|
||||
},
|
||||
{
|
||||
label: 'Cancel',
|
||||
handler: () => this.scene.ui.revertMode()
|
||||
handler: () => {
|
||||
this.scene.ui.revertMode();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
@@ -164,25 +179,37 @@ export default class MenuUiHandler extends MessageUiHandler {
|
||||
options: manageDataOptions
|
||||
};
|
||||
|
||||
const communityOptions = [
|
||||
const communityOptions: OptionSelectItem[] = [
|
||||
{
|
||||
label: 'Wiki',
|
||||
handler: () => window.open(wikiUrl, '_blank').focus(),
|
||||
handler: () => {
|
||||
window.open(wikiUrl, '_blank').focus();
|
||||
return true;
|
||||
},
|
||||
keepOpen: true
|
||||
},
|
||||
{
|
||||
label: 'Discord',
|
||||
handler: () => window.open(discordUrl, '_blank').focus(),
|
||||
handler: () => {
|
||||
window.open(discordUrl, '_blank').focus();
|
||||
return true;
|
||||
},
|
||||
keepOpen: true
|
||||
},
|
||||
{
|
||||
label: 'GitHub',
|
||||
handler: () => window.open(githubUrl, '_blank').focus(),
|
||||
handler: () => {
|
||||
window.open(githubUrl, '_blank').focus();
|
||||
return true;
|
||||
},
|
||||
keepOpen: true
|
||||
},
|
||||
{
|
||||
label: 'Cancel',
|
||||
handler: () => this.scene.ui.revertMode()
|
||||
handler: () => {
|
||||
this.scene.ui.revertMode();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
];
|
||||
|
||||
|
||||
@@ -1,15 +1,14 @@
|
||||
import BattleScene, { Button } from "../battle-scene";
|
||||
import PokemonSpecies, { allSpecies, getPokemonSpecies, getPokemonSpeciesForm, speciesStarters } from "../data/pokemon-species";
|
||||
import BattleScene, { Button, starterColors } from "../battle-scene";
|
||||
import PokemonSpecies, { allSpecies, getPokemonSpecies, getPokemonSpeciesForm, speciesStarters, starterPassiveAbilities } from "../data/pokemon-species";
|
||||
import { Species } from "../data/enums/species";
|
||||
import { TextStyle, addBBCodeTextObject, addTextObject, getTextColor } from "./text";
|
||||
import { TextStyle, addBBCodeTextObject, addTextObject } from "./text";
|
||||
import { Mode } from "./ui";
|
||||
import MessageUiHandler from "./message-ui-handler";
|
||||
import { Gender, getGenderColor, getGenderSymbol } from "../data/gender";
|
||||
import { allAbilities } from "../data/ability";
|
||||
import { GameMode, GameModes, gameModes } from "../game-mode";
|
||||
import { Unlockables } from "../system/unlockables";
|
||||
import { GameModes, gameModes } from "../game-mode";
|
||||
import { GrowthRate, getGrowthRateColor } from "../data/exp";
|
||||
import { DexAttr, DexAttrProps, DexEntry, StarterFormMoveData, StarterMoveset } from "../system/game-data";
|
||||
import { 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";
|
||||
@@ -24,17 +23,65 @@ import { Type } from "../data/type";
|
||||
import { Moves } from "../data/enums/moves";
|
||||
import { speciesEggMoves } from "../data/egg-moves";
|
||||
import { TitlePhase } from "../phases";
|
||||
import { argbFromRgba } from "@material/material-color-utilities";
|
||||
import { OptionSelectItem } from "./abstact-option-select-ui-handler";
|
||||
|
||||
export type StarterSelectCallback = (starters: Starter[]) => void;
|
||||
|
||||
export interface Starter {
|
||||
species: PokemonSpecies;
|
||||
dexAttr: bigint;
|
||||
passive: boolean;
|
||||
variant: integer;
|
||||
nature: Nature;
|
||||
moveset?: StarterMoveset;
|
||||
pokerus: boolean;
|
||||
}
|
||||
|
||||
function getPassiveCandyCount(baseValue: integer): integer {
|
||||
switch (baseValue) {
|
||||
case 1:
|
||||
return 100;
|
||||
case 2:
|
||||
return 75;
|
||||
case 3:
|
||||
return 50;
|
||||
case 4:
|
||||
return 40
|
||||
case 5:
|
||||
return 30;
|
||||
case 6:
|
||||
return 20;
|
||||
case 7:
|
||||
return 15;
|
||||
default:
|
||||
return 10;
|
||||
}
|
||||
}
|
||||
|
||||
function getValueReductionCandyCounts(baseValue: integer): [integer, integer] {
|
||||
switch (baseValue) {
|
||||
case 1:
|
||||
return [ 50, 150 ];
|
||||
case 2:
|
||||
return [ 30, 100 ];
|
||||
case 3:
|
||||
return [ 25, 75 ];
|
||||
case 4:
|
||||
return [ 20, 60 ];
|
||||
case 5:
|
||||
return [ 15, 50 ];
|
||||
case 6:
|
||||
return [ 10, 30 ];
|
||||
case 7:
|
||||
return [ 8, 20 ];
|
||||
case 8:
|
||||
return [ 5, 15 ];
|
||||
default:
|
||||
return [ 3, 10 ];
|
||||
}
|
||||
}
|
||||
|
||||
const gens = [ 'I', 'II', 'III', 'IV', 'V', 'VI', 'VII', 'VIII', 'IX' ];
|
||||
|
||||
export default class StarterSelectUiHandler extends MessageUiHandler {
|
||||
@@ -52,10 +99,10 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
|
||||
private pokemonUncaughtText: Phaser.GameObjects.Text;
|
||||
private pokemonAbilityLabelText: Phaser.GameObjects.Text;
|
||||
private pokemonAbilityText: Phaser.GameObjects.Text;
|
||||
private pokemonPassiveLabelText: Phaser.GameObjects.Text;
|
||||
private pokemonPassiveText: Phaser.GameObjects.Text;
|
||||
private pokemonNatureLabelText: Phaser.GameObjects.Text;
|
||||
private pokemonNatureText: BBCodeText;
|
||||
private pokemonCaughtCountLabelText: Phaser.GameObjects.Text;
|
||||
private pokemonCaughtCountText: Phaser.GameObjects.Text;
|
||||
private pokemonMovesContainer: Phaser.GameObjects.Container;
|
||||
private pokemonMoveContainers: Phaser.GameObjects.Container[];
|
||||
private pokemonMoveBgs: Phaser.GameObjects.NineSlice[];
|
||||
@@ -65,6 +112,12 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
|
||||
private pokemonEggMoveContainers: Phaser.GameObjects.Container[];
|
||||
private pokemonEggMoveBgs: Phaser.GameObjects.NineSlice[];
|
||||
private pokemonEggMoveLabels: Phaser.GameObjects.Text[];
|
||||
private pokemonCandyIcon: Phaser.GameObjects.Sprite;
|
||||
private pokemonCandyOverlayIcon: Phaser.GameObjects.Sprite;
|
||||
private pokemonCandyCountText: Phaser.GameObjects.Text;
|
||||
private pokemonCaughtHatchedContainer: Phaser.GameObjects.Container;
|
||||
private pokemonCaughtCountText: Phaser.GameObjects.Text;
|
||||
private pokemonHatchedCountText: Phaser.GameObjects.Text;
|
||||
private genOptionsText: Phaser.GameObjects.Text;
|
||||
private instructionsText: Phaser.GameObjects.Text;
|
||||
private starterSelectMessageBox: Phaser.GameObjects.NineSlice;
|
||||
@@ -179,41 +232,77 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
|
||||
this.type2Icon.setOrigin(0, 0);
|
||||
this.starterSelectContainer.add(this.type2Icon);
|
||||
|
||||
this.pokemonCandyIcon = this.scene.add.sprite(1, 12, 'items', 'candy');
|
||||
this.pokemonCandyIcon.setScale(0.5);
|
||||
this.pokemonCandyIcon.setOrigin(0, 0);
|
||||
this.starterSelectContainer.add(this.pokemonCandyIcon);
|
||||
|
||||
this.pokemonCandyOverlayIcon = this.scene.add.sprite(1, 12, 'items', 'candy_overlay');
|
||||
this.pokemonCandyOverlayIcon.setScale(0.5);
|
||||
this.pokemonCandyOverlayIcon.setOrigin(0, 0);
|
||||
this.starterSelectContainer.add(this.pokemonCandyOverlayIcon);
|
||||
|
||||
this.pokemonCandyCountText = addTextObject(this.scene, 14, 18, 'x0', TextStyle.WINDOW_ALT, { fontSize: '56px' });
|
||||
this.pokemonCandyCountText.setOrigin(0, 0);
|
||||
this.starterSelectContainer.add(this.pokemonCandyCountText);
|
||||
|
||||
this.pokemonCaughtHatchedContainer = this.scene.add.container(2, 25);
|
||||
this.pokemonCaughtHatchedContainer.setScale(0.5);
|
||||
this.starterSelectContainer.add(this.pokemonCaughtHatchedContainer);
|
||||
|
||||
const pokemonCaughtIcon = this.scene.add.sprite(1, 0, 'items', 'pb');
|
||||
pokemonCaughtIcon.setOrigin(0, 0);
|
||||
pokemonCaughtIcon.setScale(0.75);
|
||||
this.pokemonCaughtHatchedContainer.add(pokemonCaughtIcon);
|
||||
|
||||
this.pokemonCaughtCountText = addTextObject(this.scene, 24, 4, '0', TextStyle.SUMMARY_ALT);
|
||||
this.pokemonCaughtCountText.setOrigin(0, 0);
|
||||
this.pokemonCaughtHatchedContainer.add(this.pokemonCaughtCountText);
|
||||
|
||||
const pokemonHatchedIcon = this.scene.add.sprite(1, 14, 'items', 'mystery_egg');
|
||||
pokemonHatchedIcon.setOrigin(0, 0);
|
||||
pokemonHatchedIcon.setScale(0.75);
|
||||
this.pokemonCaughtHatchedContainer.add(pokemonHatchedIcon);
|
||||
|
||||
this.pokemonHatchedCountText = addTextObject(this.scene, 24, 19, '0', TextStyle.SUMMARY_ALT);
|
||||
this.pokemonHatchedCountText.setOrigin(0, 0);
|
||||
this.pokemonCaughtHatchedContainer.add(this.pokemonHatchedCountText);
|
||||
|
||||
this.pokemonGenderText = addTextObject(this.scene, 96, 112, '', TextStyle.SUMMARY_ALT);
|
||||
this.pokemonGenderText.setOrigin(0, 0);
|
||||
this.starterSelectContainer.add(this.pokemonGenderText);
|
||||
|
||||
this.pokemonUncaughtText = addTextObject(this.scene, 6, 126, 'Uncaught', TextStyle.SUMMARY_ALT, { fontSize: '56px' });
|
||||
this.pokemonUncaughtText = addTextObject(this.scene, 6, 127, 'Uncaught', TextStyle.SUMMARY_ALT, { fontSize: '56px' });
|
||||
this.pokemonUncaughtText.setOrigin(0, 0);
|
||||
this.starterSelectContainer.add(this.pokemonUncaughtText);
|
||||
|
||||
this.pokemonAbilityLabelText = addTextObject(this.scene, 6, 126, 'Ability:', TextStyle.SUMMARY_ALT, { fontSize: '56px' });
|
||||
this.pokemonAbilityLabelText = addTextObject(this.scene, 6, 127, 'Ability:', TextStyle.SUMMARY_ALT, { fontSize: '56px' });
|
||||
this.pokemonAbilityLabelText.setOrigin(0, 0);
|
||||
this.pokemonAbilityLabelText.setVisible(false);
|
||||
this.starterSelectContainer.add(this.pokemonAbilityLabelText);
|
||||
|
||||
this.pokemonAbilityText = addTextObject(this.scene, 30, 126, '', TextStyle.SUMMARY_ALT, { fontSize: '56px' });
|
||||
this.pokemonAbilityText = addTextObject(this.scene, 31, 127, '', TextStyle.SUMMARY_ALT, { fontSize: '56px' });
|
||||
this.pokemonAbilityText.setOrigin(0, 0);
|
||||
this.starterSelectContainer.add(this.pokemonAbilityText);
|
||||
|
||||
this.pokemonNatureLabelText = addTextObject(this.scene, 6, 135, 'Nature:', TextStyle.SUMMARY_ALT, { fontSize: '56px' });
|
||||
this.pokemonPassiveLabelText = addTextObject(this.scene, 6, 136, 'Passive:', TextStyle.SUMMARY_ALT, { fontSize: '56px' });
|
||||
this.pokemonPassiveLabelText.setOrigin(0, 0);
|
||||
this.pokemonPassiveLabelText.setVisible(false);
|
||||
this.starterSelectContainer.add(this.pokemonPassiveLabelText);
|
||||
|
||||
this.pokemonPassiveText = addTextObject(this.scene, 31, 136, '', TextStyle.SUMMARY_ALT, { fontSize: '56px' });
|
||||
this.pokemonPassiveText.setOrigin(0, 0);
|
||||
this.starterSelectContainer.add(this.pokemonPassiveText);
|
||||
|
||||
this.pokemonNatureLabelText = addTextObject(this.scene, 6, 145, 'Nature:', TextStyle.SUMMARY_ALT, { fontSize: '56px' });
|
||||
this.pokemonNatureLabelText.setOrigin(0, 0);
|
||||
this.pokemonNatureLabelText.setVisible(false);
|
||||
this.starterSelectContainer.add(this.pokemonNatureLabelText);
|
||||
|
||||
this.pokemonNatureText = addBBCodeTextObject(this.scene, 30, 135, '', TextStyle.SUMMARY_ALT, { fontSize: '56px' });
|
||||
this.pokemonNatureText = addBBCodeTextObject(this.scene, 31, 145, '', TextStyle.SUMMARY_ALT, { fontSize: '56px' });
|
||||
this.pokemonNatureText.setOrigin(0, 0);
|
||||
this.starterSelectContainer.add(this.pokemonNatureText);
|
||||
|
||||
this.pokemonCaughtCountLabelText = addTextObject(this.scene, 6, 144, 'Caught/Hatched:', TextStyle.SUMMARY_ALT, { fontSize: '56px' });
|
||||
this.pokemonCaughtCountLabelText.setOrigin(0, 0);
|
||||
this.pokemonCaughtCountLabelText.setVisible(false);
|
||||
this.starterSelectContainer.add(this.pokemonCaughtCountLabelText);
|
||||
|
||||
this.pokemonCaughtCountText = addTextObject(this.scene, 58, 144, '0/0 (0)', TextStyle.SUMMARY_ALT, { fontSize: '56px' });
|
||||
this.pokemonCaughtCountText.setOrigin(0, 0);
|
||||
this.starterSelectContainer.add(this.pokemonCaughtCountText);
|
||||
|
||||
this.pokemonMoveContainers = [];
|
||||
this.pokemonMoveBgs = [];
|
||||
this.pokemonMoveLabels = [];
|
||||
@@ -373,7 +462,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
|
||||
this.pokemonEggMovesContainer = this.scene.add.container(102, 85);
|
||||
this.pokemonEggMovesContainer.setScale(0.375);
|
||||
|
||||
const eggMovesLabel = addTextObject(this.scene, -46, 0, 'Egg Moves', TextStyle.SUMMARY_ALT);
|
||||
const eggMovesLabel = addTextObject(this.scene, -46, 0, 'Egg Moves', TextStyle.WINDOW_ALT);
|
||||
eggMovesLabel.setOrigin(0.5, 0);
|
||||
|
||||
this.pokemonEggMovesContainer.add(eggMovesLabel);
|
||||
@@ -622,6 +711,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
|
||||
ui.playSelect();
|
||||
} else
|
||||
ui.playError();
|
||||
return true;
|
||||
},
|
||||
overrideSound: true
|
||||
},
|
||||
@@ -630,6 +720,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
|
||||
handler: () => {
|
||||
this.toggleStatsMode();
|
||||
ui.setMode(Mode.STARTER_SELECT);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
];
|
||||
@@ -639,7 +730,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
|
||||
ui.showText('Select a move to swap out.', null, () => {
|
||||
ui.setModeWithoutClear(Mode.OPTION_SELECT, {
|
||||
options: moveset.map((m: Moves, i: number) => {
|
||||
return {
|
||||
const option: OptionSelectItem = {
|
||||
label: allMoves[m].name,
|
||||
handler: () => {
|
||||
ui.setMode(Mode.STARTER_SELECT).then(() => {
|
||||
@@ -647,29 +738,37 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
|
||||
ui.setModeWithoutClear(Mode.OPTION_SELECT, {
|
||||
options: this.speciesStarterMoves.filter((sm: Moves) => sm !== m).map(sm => {
|
||||
// make an option for each available starter move
|
||||
return {
|
||||
const option = {
|
||||
label: allMoves[sm].name,
|
||||
handler: () => {
|
||||
this.switchMoveHandler(i, sm, m)
|
||||
showSwapOptions(this.starterMoveset);
|
||||
return true;
|
||||
}
|
||||
};
|
||||
return option;
|
||||
}).concat({
|
||||
label: 'Cancel',
|
||||
handler: () => showSwapOptions(this.starterMoveset)
|
||||
handler: () => {
|
||||
showSwapOptions(this.starterMoveset);
|
||||
return true;
|
||||
}
|
||||
}),
|
||||
maxOptions: 8,
|
||||
yOffset: 19
|
||||
});
|
||||
});
|
||||
});
|
||||
return true;
|
||||
}
|
||||
}
|
||||
};
|
||||
return option;
|
||||
}).concat({
|
||||
label: 'Cancel',
|
||||
handler: () => {
|
||||
this.clearText();
|
||||
ui.setMode(Mode.STARTER_SELECT);
|
||||
return true;
|
||||
}
|
||||
}),
|
||||
maxOptions: 8,
|
||||
@@ -682,6 +781,103 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
|
||||
label: 'Manage Moves',
|
||||
handler: () => {
|
||||
showSwapOptions(this.starterMoveset);
|
||||
return true;
|
||||
}
|
||||
});
|
||||
const starterData = this.scene.gameData.starterData[this.lastSpecies.speciesId];
|
||||
const candyCount = starterData.candyCount;
|
||||
const passiveAttr = starterData.passiveAttr;
|
||||
if (passiveAttr & PassiveAttr.UNLOCKED) {
|
||||
if (!(passiveAttr & PassiveAttr.ENABLED)) {
|
||||
options.push({
|
||||
label: 'Enable Passive',
|
||||
handler: () => {
|
||||
starterData.passiveAttr |= PassiveAttr.ENABLED;
|
||||
ui.setMode(Mode.STARTER_SELECT);
|
||||
this.setSpeciesDetails(this.lastSpecies, undefined, undefined, undefined, undefined, undefined);
|
||||
return true;
|
||||
}
|
||||
});
|
||||
} else {
|
||||
options.push({
|
||||
label: 'Disable Passive',
|
||||
handler: () => {
|
||||
starterData.passiveAttr ^= PassiveAttr.ENABLED;
|
||||
ui.setMode(Mode.STARTER_SELECT);
|
||||
this.setSpeciesDetails(this.lastSpecies, undefined, undefined, undefined, undefined, undefined);
|
||||
return true;
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
const showUseCandies = () => {
|
||||
const options = [];
|
||||
if (!(passiveAttr & PassiveAttr.UNLOCKED)) {
|
||||
const passiveCost = getPassiveCandyCount(speciesStarters[this.lastSpecies.speciesId]);
|
||||
options.push({
|
||||
label: `x${passiveCost} Unlock Passive (${allAbilities[starterPassiveAbilities[this.lastSpecies.speciesId]].name})`,
|
||||
handler: () => {
|
||||
if (candyCount >= passiveCost) {
|
||||
starterData.passiveAttr |= PassiveAttr.UNLOCKED | PassiveAttr.ENABLED;
|
||||
starterData.candyCount -= passiveCost;
|
||||
this.pokemonCandyCountText.setText(`x${starterData.candyCount}`);
|
||||
this.scene.gameData.saveSystem().then(success => {
|
||||
if (!success)
|
||||
return this.scene.reset(true);
|
||||
});
|
||||
ui.setMode(Mode.STARTER_SELECT);
|
||||
this.setSpeciesDetails(this.lastSpecies, undefined, undefined, undefined, undefined, undefined);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
},
|
||||
item: 'candy',
|
||||
itemArgs: starterColors[this.lastSpecies.speciesId]
|
||||
});
|
||||
}
|
||||
const valueReduction = starterData.valueReduction;
|
||||
if (valueReduction < 2) {
|
||||
const reductionCost = getValueReductionCandyCounts(speciesStarters[this.lastSpecies.speciesId])[valueReduction];
|
||||
options.push({
|
||||
label: `x${reductionCost} Reduce Cost`,
|
||||
handler: () => {
|
||||
if (candyCount >= reductionCost) {
|
||||
starterData.valueReduction++;
|
||||
starterData.candyCount -= reductionCost;
|
||||
this.pokemonCandyCountText.setText(`x${starterData.candyCount}`);
|
||||
this.scene.gameData.saveSystem().then(success => {
|
||||
if (!success)
|
||||
return this.scene.reset(true);
|
||||
});
|
||||
this.updateStarterValueLabel(this.cursor);
|
||||
this.tryUpdateValue(0);
|
||||
ui.setMode(Mode.STARTER_SELECT);
|
||||
this.scene.playSound('buy');
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
},
|
||||
item: 'candy',
|
||||
itemArgs: starterColors[this.lastSpecies.speciesId]
|
||||
});
|
||||
}
|
||||
options.push({
|
||||
label: 'Cancel',
|
||||
handler: () => {
|
||||
ui.setMode(Mode.STARTER_SELECT);
|
||||
return true;
|
||||
}
|
||||
});
|
||||
ui.setModeWithoutClear(Mode.OPTION_SELECT, {
|
||||
options: options,
|
||||
yOffset: 47
|
||||
});
|
||||
};
|
||||
options.push({
|
||||
label: 'Use Candies',
|
||||
handler: () => {
|
||||
ui.setMode(Mode.STARTER_SELECT).then(() => showUseCandies());
|
||||
return true;
|
||||
}
|
||||
});
|
||||
}
|
||||
@@ -689,6 +885,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
|
||||
label: 'Cancel',
|
||||
handler: () => {
|
||||
ui.setMode(Mode.STARTER_SELECT);
|
||||
return true;
|
||||
}
|
||||
});
|
||||
ui.setModeWithoutClear(Mode.OPTION_SELECT, {
|
||||
@@ -809,22 +1006,22 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
|
||||
// species has different forms
|
||||
if (pokemonFormLevelMoves.hasOwnProperty(speciesId)) {
|
||||
// starterMoveData doesn't have base form moves or is using the single form format
|
||||
if (!this.scene.gameData.starterMoveData.hasOwnProperty(speciesId) || Array.isArray(this.scene.gameData.starterMoveData[speciesId]))
|
||||
this.scene.gameData.starterMoveData[speciesId] = { [props.formIndex]: this.starterMoveset.slice(0) as StarterMoveset };
|
||||
const starterMoveData = this.scene.gameData.starterMoveData[speciesId][props.formIndex];
|
||||
if (!this.scene.gameData.starterData[speciesId].moveset || Array.isArray(this.scene.gameData.starterData[speciesId].moveset))
|
||||
this.scene.gameData.starterData[speciesId].moveset = { [props.formIndex]: this.starterMoveset.slice(0) as StarterMoveset };
|
||||
const starterMoveData = this.scene.gameData.starterData[speciesId].moveset[props.formIndex];
|
||||
|
||||
// starterMoveData doesn't have active form moves
|
||||
if (!starterMoveData.hasOwnProperty(props.formIndex))
|
||||
this.scene.gameData.starterMoveData[speciesId][props.formIndex] = this.starterMoveset.slice(0) as StarterMoveset;
|
||||
this.scene.gameData.starterData[speciesId].moveset[props.formIndex] = this.starterMoveset.slice(0) as StarterMoveset;
|
||||
|
||||
// does the species' starter move data have its form's starter moves and has it been updated
|
||||
if (starterMoveData.hasOwnProperty(props.formIndex)) {
|
||||
// active form move hasn't been updated
|
||||
if (starterMoveData[props.formIndex][existingMoveIndex] !== newMove)
|
||||
this.scene.gameData.starterMoveData[speciesId][props.formIndex] = this.starterMoveset.slice(0) as StarterMoveset;
|
||||
this.scene.gameData.starterData[speciesId].moveset[props.formIndex] = this.starterMoveset.slice(0) as StarterMoveset;
|
||||
}
|
||||
} else
|
||||
this.scene.gameData.starterMoveData[speciesId] = this.starterMoveset.slice(0) as StarterMoveset;
|
||||
this.scene.gameData.starterData[speciesId].moveset = this.starterMoveset.slice(0) as StarterMoveset;
|
||||
this.setSpeciesDetails(this.lastSpecies, undefined, undefined, undefined, undefined, undefined, false);
|
||||
}
|
||||
|
||||
@@ -902,29 +1099,8 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
|
||||
for (let s = 0; s < 81; s++) {
|
||||
const speciesId = s < genLimit ? this.genSpecies[genCursorWithScroll][s].speciesId : 0 as Species;
|
||||
const slotVisible = !!speciesId;
|
||||
if (slotVisible) {
|
||||
const baseStarterValue = speciesStarters[speciesId];
|
||||
const starterValue = slotVisible ? this.scene.gameData.getSpeciesStarterValue(speciesId) : 0;
|
||||
let valueStr = starterValue.toString();
|
||||
if (valueStr.startsWith('0.'))
|
||||
valueStr = valueStr.slice(1);
|
||||
this.starterValueLabels[s].setText(valueStr);
|
||||
let textStyle: TextStyle;
|
||||
switch (baseStarterValue - starterValue) {
|
||||
case 0:
|
||||
textStyle = TextStyle.WINDOW;
|
||||
break;
|
||||
case 1:
|
||||
case 0.5:
|
||||
textStyle = TextStyle.SUMMARY_BLUE;
|
||||
break;
|
||||
default:
|
||||
textStyle = TextStyle.SUMMARY_GOLD;
|
||||
break;
|
||||
}
|
||||
this.starterValueLabels[s].setColor(this.getTextColor(textStyle));
|
||||
this.starterValueLabels[s].setShadowColor(this.getTextColor(textStyle, true));
|
||||
}
|
||||
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));
|
||||
}
|
||||
@@ -1007,16 +1183,25 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
|
||||
this.pokemonNameText.setText(species.name);
|
||||
|
||||
if (this.speciesStarterDexEntry?.caughtAttr) {
|
||||
const colorScheme = starterColors[species.speciesId];
|
||||
|
||||
this.pokemonGrowthRateText.setText(Utils.toReadableString(GrowthRate[species.growthRate]));
|
||||
this.pokemonGrowthRateText.setColor(getGrowthRateColor(species.growthRate));
|
||||
this.pokemonGrowthRateText.setShadowColor(getGrowthRateColor(species.growthRate, true));
|
||||
this.pokemonGrowthRateLabelText.setVisible(true);
|
||||
this.pokemonUncaughtText.setVisible(false);
|
||||
this.pokemonAbilityLabelText.setVisible(true);
|
||||
this.pokemonPassiveLabelText.setVisible(true);
|
||||
this.pokemonNatureLabelText.setVisible(true);
|
||||
this.pokemonCaughtCountLabelText.setVisible(true);
|
||||
this.pokemonCaughtCountText.setText(`${this.speciesStarterDexEntry.caughtCount}/${this.speciesStarterDexEntry.hatchedCount} (${this.speciesStarterDexEntry.caughtCount + this.speciesStarterDexEntry.hatchedCount})`);
|
||||
this.pokemonCaughtCountText.setVisible(true);
|
||||
this.pokemonCaughtCountText.setText(`${this.speciesStarterDexEntry.caughtCount}`);
|
||||
this.pokemonHatchedCountText.setText(`${this.speciesStarterDexEntry.hatchedCount}`);
|
||||
this.pokemonCaughtHatchedContainer.setVisible(true);
|
||||
this.pokemonCandyIcon.setTint(argbFromRgba(Utils.rgbHexToRgba(colorScheme[0])));
|
||||
this.pokemonCandyIcon.setVisible(true);
|
||||
this.pokemonCandyOverlayIcon.setTint(argbFromRgba(Utils.rgbHexToRgba(colorScheme[1])));
|
||||
this.pokemonCandyOverlayIcon.setVisible(true);
|
||||
this.pokemonCandyCountText.setText(`x${this.scene.gameData.starterData[species.speciesId].candyCount}`);
|
||||
this.pokemonCandyCountText.setVisible(true);
|
||||
this.iconAnimHandler.addOrUpdate(this.starterSelectGenIconContainers[species.generation - 1].getAt(this.genSpecies[species.generation - 1].indexOf(species)) as Phaser.GameObjects.Sprite, PokemonIconAnimMode.PASSIVE);
|
||||
|
||||
let starterIndex = -1;
|
||||
@@ -1056,9 +1241,12 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
|
||||
this.type2Icon.setVisible(false);
|
||||
this.pokemonUncaughtText.setVisible(true);
|
||||
this.pokemonAbilityLabelText.setVisible(false);
|
||||
this.pokemonPassiveLabelText.setVisible(false);
|
||||
this.pokemonNatureLabelText.setVisible(false);
|
||||
this.pokemonCaughtCountLabelText.setVisible(false);
|
||||
this.pokemonCaughtCountText.setVisible(false);
|
||||
this.pokemonCaughtHatchedContainer.setVisible(false);
|
||||
this.pokemonCandyIcon.setVisible(false);
|
||||
this.pokemonCandyOverlayIcon.setVisible(false);
|
||||
this.pokemonCandyCountText.setVisible(false);
|
||||
|
||||
const defaultDexAttr = this.scene.gameData.getSpeciesDefaultDexAttr(species, true);
|
||||
const defaultNature = this.scene.gameData.getSpeciesDefaultNature(species);
|
||||
@@ -1076,9 +1264,12 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
|
||||
this.type2Icon.setVisible(false);
|
||||
this.pokemonUncaughtText.setVisible(!!species);
|
||||
this.pokemonAbilityLabelText.setVisible(false);
|
||||
this.pokemonPassiveLabelText.setVisible(false);
|
||||
this.pokemonNatureLabelText.setVisible(false);
|
||||
this.pokemonCaughtCountLabelText.setVisible(false);
|
||||
this.pokemonCaughtCountText.setVisible(false);
|
||||
this.pokemonCaughtHatchedContainer.setVisible(false);
|
||||
this.pokemonCandyIcon.setVisible(false);
|
||||
this.pokemonCandyOverlayIcon.setVisible(false);
|
||||
this.pokemonCandyCountText.setVisible(false);
|
||||
|
||||
this.setSpeciesDetails(species, false, 0, false, 0, 0);
|
||||
this.pokemonSprite.clearTint();
|
||||
@@ -1185,6 +1376,11 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
|
||||
this.pokemonAbilityText.setColor(this.getTextColor(!isHidden ? TextStyle.SUMMARY_ALT : TextStyle.SUMMARY_GOLD));
|
||||
this.pokemonAbilityText.setShadowColor(this.getTextColor(!isHidden ? TextStyle.SUMMARY_ALT : TextStyle.SUMMARY_GOLD, true));
|
||||
|
||||
const passiveAttr = this.scene.gameData.starterData[species.speciesId].passiveAttr;
|
||||
this.pokemonPassiveText.setText(passiveAttr & PassiveAttr.UNLOCKED ? passiveAttr & PassiveAttr.ENABLED ? allAbilities[starterPassiveAbilities[this.lastSpecies.speciesId]].name : 'Disabled' : 'Locked');
|
||||
this.pokemonPassiveText.setColor(this.getTextColor(passiveAttr === (PassiveAttr.UNLOCKED | PassiveAttr.ENABLED) ? TextStyle.SUMMARY_ALT : TextStyle.SUMMARY_GRAY));
|
||||
this.pokemonPassiveText.setShadowColor(this.getTextColor(passiveAttr === (PassiveAttr.UNLOCKED | PassiveAttr.ENABLED) ? TextStyle.SUMMARY_ALT : TextStyle.SUMMARY_GRAY, true));
|
||||
|
||||
this.pokemonNatureText.setText(getNatureName(natureIndex as unknown as Nature, true, true, false, this.scene.uiTheme));
|
||||
|
||||
let levelMoves: LevelMoves;
|
||||
@@ -1195,18 +1391,18 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
|
||||
this.speciesStarterMoves.push(...levelMoves.filter(lm => lm[0] <= 5).map(lm => lm[1]));
|
||||
if (speciesEggMoves.hasOwnProperty(species.speciesId)) {
|
||||
for (let em = 0; em < 4; em++) {
|
||||
if (this.scene.gameData.starterEggMoveData[species.speciesId] & Math.pow(2, em))
|
||||
if (this.scene.gameData.starterData[species.speciesId].eggMoves & Math.pow(2, em))
|
||||
this.speciesStarterMoves.push(speciesEggMoves[species.speciesId][em]);
|
||||
}
|
||||
}
|
||||
|
||||
const speciesMoveData = this.scene.gameData.starterMoveData[species.speciesId];
|
||||
const speciesMoveData = this.scene.gameData.starterData[species.speciesId].moveset;
|
||||
let moveData: StarterMoveset = speciesMoveData
|
||||
? Array.isArray(speciesMoveData)
|
||||
? speciesMoveData as StarterMoveset
|
||||
: (speciesMoveData as StarterFormMoveData)[formIndex]
|
||||
: null;
|
||||
const availableStarterMoves = this.speciesStarterMoves.concat(speciesEggMoves.hasOwnProperty(species.speciesId) ? speciesEggMoves[species.speciesId].filter((_, em: integer) => this.scene.gameData.starterEggMoveData[species.speciesId] & Math.pow(2, em)) : []);
|
||||
const availableStarterMoves = this.speciesStarterMoves.concat(speciesEggMoves.hasOwnProperty(species.speciesId) ? speciesEggMoves[species.speciesId].filter((_, em: integer) => this.scene.gameData.starterData[species.speciesId].eggMoves & Math.pow(2, em)) : []);
|
||||
this.starterMoveset = (moveData || (this.speciesStarterMoves.slice(0, 4) as StarterMoveset)).filter(m => availableStarterMoves.find(sm => sm === m)) as StarterMoveset;
|
||||
// Consolidate move data if it contains an incompatible move
|
||||
if (this.starterMoveset.length < 4 && this.starterMoveset.length < availableStarterMoves.length)
|
||||
@@ -1216,6 +1412,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
|
||||
this.setTypeIcons(speciesForm.type1, speciesForm.type2);
|
||||
} else {
|
||||
this.pokemonAbilityText.setText('');
|
||||
this.pokemonPassiveText.setText('');
|
||||
this.pokemonNatureText.setText('');
|
||||
this.setTypeIcons(null, null);
|
||||
}
|
||||
@@ -1225,6 +1422,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
|
||||
this.pokemonNumberText.setShadowColor(this.getTextColor(TextStyle.SUMMARY, true));
|
||||
this.pokemonGenderText.setText('');
|
||||
this.pokemonAbilityText.setText('');
|
||||
this.pokemonPassiveText.setText('');
|
||||
this.pokemonNatureText.setText('');
|
||||
this.setTypeIcons(null, null);
|
||||
}
|
||||
@@ -1243,7 +1441,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
|
||||
|
||||
for (let em = 0; em < 4; em++) {
|
||||
const eggMove = hasEggMoves ? allMoves[speciesEggMoves[species.speciesId][em]] : null;
|
||||
const eggMoveUnlocked = eggMove && this.scene.gameData.starterEggMoveData.hasOwnProperty(species.speciesId) && this.scene.gameData.starterEggMoveData[species.speciesId] & Math.pow(2, em);
|
||||
const eggMoveUnlocked = eggMove && this.scene.gameData.starterData[species.speciesId].eggMoves & Math.pow(2, em);
|
||||
this.pokemonEggMoveBgs[em].setFrame(Type[eggMove ? eggMove.type : Type.UNKNOWN].toString().toLowerCase());
|
||||
this.pokemonEggMoveLabels[em].setText(eggMove && eggMoveUnlocked ? eggMove.name : '???');
|
||||
}
|
||||
@@ -1281,6 +1479,31 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
|
||||
this.tryUpdateValue();
|
||||
}
|
||||
|
||||
updateStarterValueLabel(cursor: integer): void {
|
||||
const speciesId = this.genSpecies[this.genCursor][cursor].speciesId;
|
||||
const baseStarterValue = speciesStarters[speciesId];
|
||||
const starterValue = this.scene.gameData.getSpeciesStarterValue(speciesId);
|
||||
let valueStr = starterValue.toString();
|
||||
if (valueStr.startsWith('0.'))
|
||||
valueStr = valueStr.slice(1);
|
||||
this.starterValueLabels[cursor].setText(valueStr);
|
||||
let textStyle: TextStyle;
|
||||
switch (baseStarterValue - starterValue) {
|
||||
case 0:
|
||||
textStyle = TextStyle.WINDOW;
|
||||
break;
|
||||
case 1:
|
||||
case 0.5:
|
||||
textStyle = TextStyle.SUMMARY_BLUE;
|
||||
break;
|
||||
default:
|
||||
textStyle = TextStyle.SUMMARY_GOLD;
|
||||
break;
|
||||
}
|
||||
this.starterValueLabels[cursor].setColor(this.getTextColor(textStyle));
|
||||
this.starterValueLabels[cursor].setShadowColor(this.getTextColor(textStyle, true));
|
||||
}
|
||||
|
||||
tryUpdateValue(add?: integer): boolean {
|
||||
const value = this.starterGens.reduce((total: integer, gen: integer, i: integer) => total += this.scene.gameData.getSpeciesStarterValue(this.genSpecies[gen][this.starterCursors[i]].speciesId), 0);
|
||||
const newValue = value + (add || 0);
|
||||
@@ -1331,6 +1554,8 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
|
||||
return {
|
||||
species: starterSpecies,
|
||||
dexAttr: thisObj.starterAttr[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
|
||||
|
||||
+8
-1
@@ -18,6 +18,7 @@ export enum TextStyle {
|
||||
SUMMARY_BLUE,
|
||||
SUMMARY_PINK,
|
||||
SUMMARY_GOLD,
|
||||
SUMMARY_GRAY,
|
||||
MONEY,
|
||||
SETTINGS_LABEL,
|
||||
SETTINGS_SELECTED,
|
||||
@@ -75,10 +76,14 @@ function getTextStyleOptions(style: TextStyle, uiTheme: UiTheme, extraStyleOptio
|
||||
|
||||
switch (style) {
|
||||
case TextStyle.SUMMARY:
|
||||
case TextStyle.SUMMARY_ALT:
|
||||
case TextStyle.SUMMARY_BLUE:
|
||||
case TextStyle.SUMMARY_RED:
|
||||
case TextStyle.SUMMARY_PINK:
|
||||
case TextStyle.SUMMARY_GOLD:
|
||||
case TextStyle.SUMMARY_GRAY:
|
||||
case TextStyle.WINDOW:
|
||||
case TextStyle.WINDOW_ALT:
|
||||
case TextStyle.MESSAGE:
|
||||
case TextStyle.SETTINGS_LABEL:
|
||||
case TextStyle.SETTINGS_SELECTED:
|
||||
@@ -152,7 +157,9 @@ export function getTextColor(textStyle: TextStyle, shadow?: boolean, uiTheme: Ui
|
||||
return !shadow ? '#f89890' : '#984038';
|
||||
case TextStyle.SUMMARY_GOLD:
|
||||
case TextStyle.MONEY:
|
||||
return !shadow ? '#e8e8a8' : '#a0a060'
|
||||
return !shadow ? '#e8e8a8' : '#a0a060';
|
||||
case TextStyle.SUMMARY_GRAY:
|
||||
return !shadow ? '#a0a0a0' : '#636363';
|
||||
case TextStyle.SETTINGS_LABEL:
|
||||
return !shadow ? '#f8b050' : '#c07800';
|
||||
case TextStyle.SETTINGS_SELECTED:
|
||||
|
||||
Reference in new issue
Block a user