Add Terestallization mechanics
Add Terestallization mechanics; implement Stellar type; fix bug with held item weights
This commit is contained in:
1 parent
5ec199a428
commit
dadc08d16e
60 files changed
+3585
-2258
No files matched your search
+42
-7
@@ -5,6 +5,7 @@ import { addTextObject, TextStyle } from './text';
|
||||
import { getGenderSymbol, getGenderColor, Gender } from '../data/gender';
|
||||
import { StatusEffect } from '../data/status-effect';
|
||||
import BattleScene from '../battle-scene';
|
||||
import { Type, getTypeRgb } from '../data/type';
|
||||
|
||||
export default class BattleInfo extends Phaser.GameObjects.Container {
|
||||
private player: boolean;
|
||||
@@ -13,6 +14,7 @@ export default class BattleInfo extends Phaser.GameObjects.Container {
|
||||
private bossSegments: integer;
|
||||
private offset: boolean;
|
||||
private lastName: string;
|
||||
private lastTeraType: Type;
|
||||
private lastStatus: StatusEffect;
|
||||
private lastHp: integer;
|
||||
private lastMaxHp: integer;
|
||||
@@ -26,6 +28,7 @@ export default class BattleInfo extends Phaser.GameObjects.Container {
|
||||
private nameText: Phaser.GameObjects.Text;
|
||||
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 statusIndicator: Phaser.GameObjects.Sprite;
|
||||
@@ -43,6 +46,7 @@ export default class BattleInfo extends Phaser.GameObjects.Container {
|
||||
this.boss = false;
|
||||
this.offset = false;
|
||||
this.lastName = null;
|
||||
this.lastTeraType = Type.UNKNOWN;
|
||||
this.lastStatus = StatusEffect.NONE;
|
||||
this.lastHp = -1;
|
||||
this.lastMaxHp = -1;
|
||||
@@ -75,11 +79,19 @@ export default class BattleInfo extends Phaser.GameObjects.Container {
|
||||
this.add(this.ownedIcon);
|
||||
}
|
||||
|
||||
this.teraIcon = this.scene.add.sprite(0, 0, 'icon_tera');
|
||||
this.teraIcon.setVisible(false);
|
||||
this.teraIcon.setOrigin(0, 0);
|
||||
this.teraIcon.setScale(0.5);
|
||||
this.teraIcon.setPositionRelative(this.nameText, 0, 2);
|
||||
this.teraIcon.setInteractive(new Phaser.Geom.Rectangle(0, 0, 14, 15), Phaser.Geom.Rectangle.Contains);
|
||||
this.add(this.teraIcon);
|
||||
|
||||
this.splicedIcon = this.scene.add.sprite(0, 0, 'icon_spliced');
|
||||
this.splicedIcon.setVisible(false);
|
||||
this.splicedIcon.setOrigin(0, 0);
|
||||
this.splicedIcon.setPositionRelative(this.nameText, 0, 2);
|
||||
this.splicedIcon.setInteractive(new Phaser.Geom.Rectangle(0, 0, 5, 7), Phaser.Geom.Rectangle.Contains);
|
||||
this.splicedIcon.setInteractive(new Phaser.Geom.Rectangle(0, 0, 5, 8), Phaser.Geom.Rectangle.Contains);
|
||||
this.add(this.splicedIcon);
|
||||
|
||||
this.statusIndicator = this.scene.add.sprite(0, 0, 'statuses');
|
||||
@@ -130,7 +142,17 @@ export default class BattleInfo extends Phaser.GameObjects.Container {
|
||||
this.genderText.setColor(getGenderColor(pokemon.gender));
|
||||
this.genderText.setPositionRelative(this.nameText, nameTextWidth, 0);
|
||||
|
||||
this.splicedIcon.setPositionRelative(this.nameText, nameTextWidth + this.genderText.displayWidth + 1, 1);
|
||||
this.lastTeraType = pokemon.getTeraType();
|
||||
|
||||
this.teraIcon.setPositionRelative(this.nameText, nameTextWidth + this.genderText.displayWidth + 1, 2);
|
||||
this.teraIcon.setVisible(this.lastTeraType !== Type.UNKNOWN);
|
||||
this.teraIcon.on('pointerover', () => {
|
||||
if (this.lastTeraType !== Type.UNKNOWN)
|
||||
(this.scene as BattleScene).ui.showTooltip(null, `${Utils.toReadableString(Type[this.lastTeraType])} Terastallized`);
|
||||
});
|
||||
this.teraIcon.on('pointerout', () => (this.scene as BattleScene).ui.hideTooltip());
|
||||
|
||||
this.splicedIcon.setPositionRelative(this.nameText, nameTextWidth + this.genderText.displayWidth + 1 + (this.teraIcon.visible ? this.teraIcon.displayWidth + 1 : 0), 1);
|
||||
this.splicedIcon.setVisible(!!pokemon.fusionSpecies);
|
||||
if (this.splicedIcon.visible) {
|
||||
this.splicedIcon.on('pointerover', () => (this.scene as BattleScene).ui.showTooltip(null, `${pokemon.species.getName(pokemon.formIndex)}/${pokemon.fusionSpecies.getName(pokemon.fusionFormIndex)}`));
|
||||
@@ -197,7 +219,7 @@ export default class BattleInfo extends Phaser.GameObjects.Container {
|
||||
if (boss !== this.boss) {
|
||||
this.boss = boss;
|
||||
|
||||
[ this.nameText, this.genderText, 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.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' : ''}`);
|
||||
@@ -240,12 +262,25 @@ export default class BattleInfo extends Phaser.GameObjects.Container {
|
||||
if (!this.scene)
|
||||
return resolve();
|
||||
|
||||
if (this.lastName !== pokemon.name) {
|
||||
const nameUpdated = this.lastName !== pokemon.name;
|
||||
|
||||
if (nameUpdated) {
|
||||
this.updateNameText(pokemon);
|
||||
const nameTextWidth = this.nameText.displayWidth;
|
||||
this.genderText.setPositionRelative(this.nameText, nameTextWidth, 0);
|
||||
this.splicedIcon.setPositionRelative(this.nameText, nameTextWidth + this.genderText.displayWidth + 1, 1);
|
||||
this.genderText.setPositionRelative(this.nameText, this.nameText.displayWidth, 0);
|
||||
}
|
||||
|
||||
const teraType = pokemon.getTeraType();
|
||||
const teraTypeUpdated = this.lastTeraType !== teraType;
|
||||
|
||||
if (teraTypeUpdated) {
|
||||
this.teraIcon.setVisible(teraType !== Type.UNKNOWN);
|
||||
this.teraIcon.setPositionRelative(this.nameText, this.nameText.displayWidth + this.genderText.displayWidth + 1, 2);
|
||||
this.teraIcon.setTintFill(Phaser.Display.Color.GetColor(...getTypeRgb(teraType)));
|
||||
this.lastTeraType = teraType;
|
||||
}
|
||||
|
||||
if (nameUpdated || teraTypeUpdated)
|
||||
this.splicedIcon.setPositionRelative(this.nameText, this.nameText.displayWidth + this.genderText.displayWidth + 1 + (this.teraIcon.visible ? this.teraIcon.displayWidth + 1 : 0), 1);
|
||||
|
||||
if (this.lastStatus !== (pokemon.status?.effect || StatusEffect.NONE)) {
|
||||
this.lastStatus = pokemon.status?.effect || StatusEffect.NONE;
|
||||
|
||||
@@ -192,7 +192,7 @@ export default class BattleMessageUiHandler extends MessageUiHandler {
|
||||
if (shownIvsCount < 6) {
|
||||
let statsPool = stats.slice(0);
|
||||
for (let i = 0; i < shownIvsCount; i++) {
|
||||
const shownStat = Phaser.Math.RND.pick(statsPool);
|
||||
const shownStat = Utils.randSeedItem(statsPool);
|
||||
shownStats.push(shownStat);
|
||||
statsPool.splice(statsPool.indexOf(shownStat), 1);
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import BattleScene, { Button } from "../battle-scene";
|
||||
import { Mode } from "./ui";
|
||||
import PokemonIconAnimHandler, { PokemonIconAnimMode } from "./pokemon-icon-anim-handler";
|
||||
import PokemonIconAnimHandler, { PokemonIconAnimMode } from "../sprite/pokemon-icon-anim-handler";
|
||||
import { TextStyle, addTextObject } from "./text";
|
||||
import MessageUiHandler from "./message-ui-handler";
|
||||
import { EGG_SEED, Egg, GachaType, getEggGachaTypeDescriptor, getEggHatchWavesMessage, getEggDescriptor } from "../data/egg";
|
||||
|
||||
@@ -11,7 +11,7 @@ import { allMoves } from "../data/move";
|
||||
import { Moves } from "../data/enums/moves";
|
||||
import { getGenderColor, getGenderSymbol } from "../data/gender";
|
||||
import { StatusEffect } from "../data/status-effect";
|
||||
import PokemonIconAnimHandler, { PokemonIconAnimMode } from "./pokemon-icon-anim-handler";
|
||||
import PokemonIconAnimHandler, { PokemonIconAnimMode } from "../sprite/pokemon-icon-anim-handler";
|
||||
import { pokemonEvolutions } from "../data/pokemon-evolutions";
|
||||
import { addWindow } from "./window";
|
||||
import { SpeciesFormChangeItemTrigger } from "../data/pokemon-forms";
|
||||
@@ -102,7 +102,7 @@ export default class PartyUiHandler extends MessageUiHandler {
|
||||
private static FilterAllMoves = (_pokemonMove: PokemonMove) => null;
|
||||
|
||||
public static FilterItemMaxStacks = (pokemon: PlayerPokemon, modifier: PokemonHeldItemModifier) => {
|
||||
const matchingModifier = pokemon.scene.findModifier(m => m instanceof PokemonHeldItemModifier && (m as PokemonHeldItemModifier).matchType(modifier)) as PokemonHeldItemModifier;
|
||||
const matchingModifier = pokemon.scene.findModifier(m => m instanceof PokemonHeldItemModifier && m.pokemonId === pokemon.id && m.matchType(modifier)) as PokemonHeldItemModifier;
|
||||
if (matchingModifier && matchingModifier.stackCount === matchingModifier.getMaxStackCount(pokemon.scene))
|
||||
return `${pokemon.name} has too many\nof this item!`;
|
||||
return null;
|
||||
|
||||
@@ -1,80 +0,0 @@
|
||||
import BattleScene from "../battle-scene";
|
||||
import * as Utils from "../utils";
|
||||
|
||||
export enum PokemonIconAnimMode {
|
||||
NONE,
|
||||
PASSIVE,
|
||||
ACTIVE
|
||||
}
|
||||
|
||||
export default class PokemonIconAnimHandler {
|
||||
private icons: Map<Phaser.GameObjects.Sprite, PokemonIconAnimMode>;
|
||||
private toggled: boolean;
|
||||
|
||||
setup(scene: BattleScene): void {
|
||||
this.icons = new Map();
|
||||
this.toggled = false;
|
||||
|
||||
const onAlternate = (tween: Phaser.Tweens.Tween) => {
|
||||
const value = tween.getValue();
|
||||
this.toggled = !!value;
|
||||
for (let i of this.icons.keys())
|
||||
i.y += this.getModeYDelta(this.icons.get(i)) * (this.toggled ? 1 : -1);
|
||||
};
|
||||
scene.tweens.addCounter({
|
||||
duration: Utils.fixedInt(200),
|
||||
from: 0,
|
||||
to: 1,
|
||||
yoyo: true,
|
||||
repeat: -1,
|
||||
onRepeat: onAlternate,
|
||||
onYoyo: onAlternate
|
||||
});
|
||||
}
|
||||
|
||||
getModeYDelta(mode: PokemonIconAnimMode): number {
|
||||
switch (mode) {
|
||||
case PokemonIconAnimMode.NONE:
|
||||
return 0;
|
||||
case PokemonIconAnimMode.PASSIVE:
|
||||
return -1;
|
||||
case PokemonIconAnimMode.ACTIVE:
|
||||
return -2;
|
||||
}
|
||||
}
|
||||
|
||||
addOrUpdate(icons: Phaser.GameObjects.Sprite | Phaser.GameObjects.Sprite[], mode: PokemonIconAnimMode): void {
|
||||
if (!Array.isArray(icons))
|
||||
icons = [ icons ];
|
||||
for (let i of icons) {
|
||||
if (this.icons.has(i) && this.icons.get(i) === mode)
|
||||
continue;
|
||||
if (this.toggled) {
|
||||
const lastYDelta = this.icons.has(i)
|
||||
? this.icons.get(i)
|
||||
: 0;
|
||||
const yDelta = this.getModeYDelta(mode);
|
||||
i.y += yDelta + lastYDelta;
|
||||
}
|
||||
this.icons.set(i, mode);
|
||||
}
|
||||
}
|
||||
|
||||
remove(icons: Phaser.GameObjects.Sprite | Phaser.GameObjects.Sprite[]): void {
|
||||
if (!Array.isArray(icons))
|
||||
icons = [ icons ];
|
||||
for (let i of icons) {
|
||||
if (this.toggled)
|
||||
i.y -= this.getModeYDelta(this.icons.get(i));
|
||||
this.icons.delete(i);
|
||||
}
|
||||
}
|
||||
|
||||
removeAll(): void {
|
||||
for (let i of this.icons.keys()) {
|
||||
if (this.toggled)
|
||||
i.y -= this.getModeYDelta(this.icons.get(i));
|
||||
this.icons.delete(i);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -11,13 +11,14 @@ import { Unlockables } from "../system/unlockables";
|
||||
import { GrowthRate, getGrowthRateColor } from "../data/exp";
|
||||
import { DexAttr, DexEntry } from "../system/game-data";
|
||||
import * as Utils from "../utils";
|
||||
import PokemonIconAnimHandler, { PokemonIconAnimMode } from "./pokemon-icon-anim-handler";
|
||||
import PokemonIconAnimHandler, { PokemonIconAnimMode } from "../sprite/pokemon-icon-anim-handler";
|
||||
import { StatsContainer } from "./stats-container";
|
||||
import { addWindow } from "./window";
|
||||
import { Nature, getNatureName } from "../data/nature";
|
||||
import BBCodeText from "phaser3-rex-plugins/plugins/bbcodetext";
|
||||
import { pokemonFormChanges } from "../data/pokemon-forms";
|
||||
import { Tutorial, handleTutorial } from "../tutorial";
|
||||
import PokemonSpriteSparkleHandler from "../sprite/pokemon-sprite-sparkle-handler";
|
||||
|
||||
export type StarterSelectCallback = (starters: Starter[]) => void;
|
||||
|
||||
@@ -310,7 +311,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
|
||||
let pokerusCursor: integer;
|
||||
|
||||
const generateSpecies = () => {
|
||||
randomSpeciesId = Phaser.Math.RND.pick(starterSpecies);
|
||||
randomSpeciesId = Utils.randSeedItem(starterSpecies);
|
||||
species = getPokemonSpecies(randomSpeciesId);
|
||||
pokerusCursor = this.genSpecies[species.generation - 1].indexOf(species);
|
||||
};
|
||||
|
||||
@@ -3,7 +3,7 @@ import { Mode } from "./ui";
|
||||
import UiHandler from "./ui-handler";
|
||||
import * as Utils from "../utils";
|
||||
import { PlayerPokemon } from "../pokemon";
|
||||
import { Type } from "../data/type";
|
||||
import { Type, getTypeRgb } from "../data/type";
|
||||
import { TextStyle, addBBCodeTextObject, addTextObject, getBBCodeFrag, getTextColor } from "./text";
|
||||
import Move, { MoveCategory } from "../data/move";
|
||||
import { getPokeballAtlasKey } from "../data/pokeball";
|
||||
@@ -98,8 +98,7 @@ export default class SummaryUiHandler extends UiHandler {
|
||||
this.numberText.setOrigin(0, 1);
|
||||
this.summaryContainer.add(this.numberText);
|
||||
|
||||
this.pokemonSprite = this.scene.add.sprite(56, -106, `pkmn__sub`);
|
||||
this.pokemonSprite.setPipeline(this.scene.spritePipeline, { ignoreOverride: true, tone: [ 0.0, 0.0, 0.0, 0.0 ], hasShadow: false });
|
||||
this.pokemonSprite = this.scene.initPokemonSprite(this.scene.add.sprite(56, -106, `pkmn__sub`), null, false, true);
|
||||
this.summaryContainer.add(this.pokemonSprite);
|
||||
|
||||
this.nameText = addTextObject(this.scene, 6, -54, '', TextStyle.SUMMARY);
|
||||
@@ -201,6 +200,7 @@ export default class SummaryUiHandler extends UiHandler {
|
||||
this.numberText.setShadowColor(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;
|
||||
[ 'spriteColors', 'fusionSpriteColors' ].map(k => {
|
||||
delete this.pokemonSprite.pipelineData[`${k}Base`];
|
||||
@@ -489,16 +489,26 @@ export default class SummaryUiHandler extends UiHandler {
|
||||
typeLabel.setOrigin(0, 0);
|
||||
profileContainer.add(typeLabel);
|
||||
|
||||
const getTypeIcon = (index: integer, type: Type) => {
|
||||
const typeIcon = this.scene.add.sprite(39 + 34 * index, 42, 'types', Type[type].toLowerCase());
|
||||
const getTypeIcon = (index: integer, type: Type, tera: boolean = false) => {
|
||||
const xCoord = 39 + 34 * index;
|
||||
const typeIcon = !tera
|
||||
? this.scene.add.sprite(xCoord, 42, 'types', Type[type].toLowerCase())
|
||||
: this.scene.add.sprite(xCoord, 42, 'type_tera');
|
||||
if (tera) {
|
||||
typeIcon.setScale(0.5);
|
||||
const typeRgb = getTypeRgb(type);
|
||||
typeIcon.setTint(Phaser.Display.Color.GetColor(typeRgb[0], typeRgb[1], typeRgb[2]));
|
||||
}
|
||||
typeIcon.setOrigin(0, 1);
|
||||
return typeIcon;
|
||||
};
|
||||
|
||||
const types = this.pokemon.getTypes(true);
|
||||
const types = this.pokemon.getTypes(false, true);
|
||||
profileContainer.add(getTypeIcon(0, types[0]));
|
||||
if (types.length > 1)
|
||||
profileContainer.add(getTypeIcon(1, types[1]));
|
||||
if (this.pokemon.isTerastallized())
|
||||
profileContainer.add(getTypeIcon(types.length, this.pokemon.getTeraType(), true));
|
||||
|
||||
const ability = this.pokemon.getAbility();
|
||||
|
||||
@@ -534,7 +544,7 @@ export default class SummaryUiHandler extends UiHandler {
|
||||
});
|
||||
}
|
||||
|
||||
let memoString = `${getBBCodeFrag(Utils.toReadableString(Nature[this.pokemon.nature]), TextStyle.SUMMARY_RED)} nature,\n${getBBCodeFrag(`${this.pokemon.metBiome === -1 ? 'apparently ' : ''}met at Lv`, TextStyle.WINDOW)}${getBBCodeFrag(this.pokemon.metLevel.toString(), TextStyle.SUMMARY_RED)}${getBBCodeFrag(',', TextStyle.WINDOW)}\n${getBBCodeFrag(getBiomeName(this.pokemon.metBiome), TextStyle.SUMMARY_RED)}${getBBCodeFrag('.', TextStyle.WINDOW)}`;
|
||||
let memoString = `${getBBCodeFrag(Utils.toReadableString(Nature[this.pokemon.nature]), TextStyle.SUMMARY_RED)}${getBBCodeFrag(' nature,', TextStyle.WINDOW)}\n${getBBCodeFrag(`${this.pokemon.metBiome === -1 ? 'apparently ' : ''}met at Lv`, TextStyle.WINDOW)}${getBBCodeFrag(this.pokemon.metLevel.toString(), TextStyle.SUMMARY_RED)}${getBBCodeFrag(',', TextStyle.WINDOW)}\n${getBBCodeFrag(getBiomeName(this.pokemon.metBiome), TextStyle.SUMMARY_RED)}${getBBCodeFrag('.', TextStyle.WINDOW)}`;
|
||||
|
||||
const memoText = addBBCodeTextObject(this.scene, 7, 113, memoString, TextStyle.WINDOW);
|
||||
memoText.setOrigin(0, 0);
|
||||
|
||||
Reference in new issue
Block a user