mirror of
https://github.com/pagefaultgames/pokerogue.git
synced 2025-07-17 22:02:18 +02:00
Merge branch 'main' into draft/Teamgrunt
This commit is contained in:
commit
0b3ae77624
@ -74,7 +74,7 @@ Check out our [Trello Board](https://trello.com/b/z10B703R/pokerogue-board) to s
|
||||
### 🎨 Trainer Portraits
|
||||
- pkmn_realidea (Paid Commissions)
|
||||
|
||||
### 🎨 Pokemon Sprites
|
||||
### 🎨 Pokemon Sprites and Animation
|
||||
- GAMEFREAK (Pokémon Black/White 2)
|
||||
- Smogon Sprite Project (Various Artists)
|
||||
- Skyflyer
|
||||
@ -100,6 +100,7 @@ Check out our [Trello Board](https://trello.com/b/z10B703R/pokerogue-board) to s
|
||||
- bizcoeindoloro
|
||||
- mangalos810
|
||||
- Involuntary-Twitch
|
||||
- selstar
|
||||
|
||||
### 🎨 Move Animations
|
||||
- Pokémon Reborn
|
||||
|
@ -2282,6 +2282,34 @@ export class PostTurnFormChangeAbAttr extends PostTurnAbAttr {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Attribute used for abilities (Bad Dreams) that damages the opponents for being asleep
|
||||
*/
|
||||
export class PostTurnHurtIfSleepingAbAttr extends PostTurnAbAttr {
|
||||
|
||||
/**
|
||||
* Deals damage to all sleeping opponents equal to 1/8 of their max hp (min 1)
|
||||
* @param {Pokemon} pokemon Pokemon that has this ability
|
||||
* @param {boolean} passive N/A
|
||||
* @param {any[]} args N/A
|
||||
* @returns {boolean} true if any opponents are sleeping
|
||||
*/
|
||||
applyPostTurn(pokemon: Pokemon, passive: boolean, args: any[]): boolean | Promise<boolean> {
|
||||
let hadEffect: boolean = false;
|
||||
for(let opp of pokemon.getOpponents()) {
|
||||
if(opp.status !== undefined && opp.status.effect === StatusEffect.SLEEP) {
|
||||
opp.damageAndUpdate(Math.floor(Math.max(1, opp.getMaxHp() / 8)), HitResult.OTHER);
|
||||
pokemon.scene.queueMessage(i18next.t('abilityTriggers:badDreams', {pokemonName: `${getPokemonPrefix(opp)}${opp.name}`}));
|
||||
hadEffect = true;
|
||||
}
|
||||
|
||||
}
|
||||
return hadEffect;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Grabs the last failed Pokeball used
|
||||
* @extends PostTurnAbAttr
|
||||
@ -3327,7 +3355,7 @@ export function initAbilities() {
|
||||
.ignorable()
|
||||
.partial(),
|
||||
new Ability(Abilities.BAD_DREAMS, 4)
|
||||
.unimplemented(),
|
||||
.attr(PostTurnHurtIfSleepingAbAttr),
|
||||
new Ability(Abilities.PICKPOCKET, 5)
|
||||
.attr(PostDefendStealHeldItemAbAttr, (target, user, move) => move.hasFlag(MoveFlags.MAKES_CONTACT)),
|
||||
new Ability(Abilities.SHEER_FORCE, 5)
|
||||
|
@ -1608,8 +1608,7 @@ export const pokemonEvolutions: PokemonEvolutions = {
|
||||
new SpeciesEvolution(Species.FROSMOTH, 1, null, new SpeciesFriendshipEvolutionCondition(90, p => p.scene.arena.getTimeOfDay() === TimeOfDay.DUSK || p.scene.arena.getTimeOfDay() === TimeOfDay.NIGHT), SpeciesWildEvolutionDelay.MEDIUM)
|
||||
],
|
||||
[Species.GIMMIGHOUL]: [
|
||||
new SpeciesEvolution(Species.GHOLDENGO, 1, null, new SpeciesFriendshipEvolutionCondition(70), SpeciesWildEvolutionDelay.VERY_LONG)
|
||||
]
|
||||
new SpeciesEvolution(Species.GHOLDENGO, 1, null, new SpeciesFriendshipEvolutionCondition(70), SpeciesWildEvolutionDelay.VERY_LONG) ]
|
||||
};
|
||||
|
||||
interface PokemonPrevolutions {
|
||||
|
@ -2634,7 +2634,7 @@ export const speciesStarters = {
|
||||
[Species.MOLTRES]: 6,
|
||||
[Species.DRATINI]: 4,
|
||||
[Species.MEWTWO]: 8,
|
||||
[Species.MEW]: 7,
|
||||
[Species.MEW]: 6,
|
||||
|
||||
[Species.CHIKORITA]: 3,
|
||||
[Species.CYNDAQUIL]: 3,
|
||||
@ -2693,7 +2693,7 @@ export const speciesStarters = {
|
||||
[Species.LARVITAR]: 4,
|
||||
[Species.LUGIA]: 8,
|
||||
[Species.HO_OH]: 8,
|
||||
[Species.CELEBI]: 7,
|
||||
[Species.CELEBI]: 6,
|
||||
|
||||
[Species.TREECKO]: 3,
|
||||
[Species.TORCHIC]: 3,
|
||||
@ -2765,9 +2765,9 @@ export const speciesStarters = {
|
||||
[Species.REGISTEEL]: 6,
|
||||
[Species.LATIAS]: 7,
|
||||
[Species.LATIOS]: 7,
|
||||
[Species.KYOGRE]: 8,
|
||||
[Species.GROUDON]: 8,
|
||||
[Species.RAYQUAZA]: 8,
|
||||
[Species.KYOGRE]: 9,
|
||||
[Species.GROUDON]: 9,
|
||||
[Species.RAYQUAZA]: 9,
|
||||
[Species.JIRACHI]: 7,
|
||||
[Species.DEOXYS]: 7,
|
||||
|
||||
@ -2809,19 +2809,19 @@ export const speciesStarters = {
|
||||
[Species.MANTYKE]: 3,
|
||||
[Species.SNOVER]: 3,
|
||||
[Species.ROTOM]: 5,
|
||||
[Species.UXIE]: 7,
|
||||
[Species.MESPRIT]: 7,
|
||||
[Species.AZELF]: 7,
|
||||
[Species.UXIE]: 6,
|
||||
[Species.MESPRIT]: 6,
|
||||
[Species.AZELF]: 6,
|
||||
[Species.DIALGA]: 8,
|
||||
[Species.PALKIA]: 8,
|
||||
[Species.HEATRAN]: 7,
|
||||
[Species.REGIGIGAS]: 8,
|
||||
[Species.HEATRAN]: 6,
|
||||
[Species.REGIGIGAS]: 7,
|
||||
[Species.GIRATINA]: 8,
|
||||
[Species.CRESSELIA]: 7,
|
||||
[Species.PHIONE]: 5,
|
||||
[Species.CRESSELIA]: 6,
|
||||
[Species.PHIONE]: 4,
|
||||
[Species.MANAPHY]: 7,
|
||||
[Species.DARKRAI]: 7,
|
||||
[Species.SHAYMIN]: 7,
|
||||
[Species.DARKRAI]: 6,
|
||||
[Species.SHAYMIN]: 6,
|
||||
[Species.ARCEUS]: 9,
|
||||
[Species.VICTINI]: 7,
|
||||
|
||||
@ -2903,9 +2903,9 @@ export const speciesStarters = {
|
||||
[Species.ZEKROM]: 8,
|
||||
[Species.LANDORUS]: 7,
|
||||
[Species.KYUREM]: 8,
|
||||
[Species.KELDEO]: 7,
|
||||
[Species.MELOETTA]: 7,
|
||||
[Species.GENESECT]: 7,
|
||||
[Species.KELDEO]: 6,
|
||||
[Species.MELOETTA]: 6,
|
||||
[Species.GENESECT]: 6,
|
||||
|
||||
[Species.CHESPIN]: 3,
|
||||
[Species.FENNEKIN]: 3,
|
||||
@ -2943,7 +2943,7 @@ export const speciesStarters = {
|
||||
[Species.ZYGARDE]: 8,
|
||||
[Species.DIANCIE]: 7,
|
||||
[Species.HOOPA]: 7,
|
||||
[Species.VOLCANION]: 7,
|
||||
[Species.VOLCANION]: 6,
|
||||
[Species.ETERNAL_FLOETTE]: 5,
|
||||
|
||||
[Species.ROWLET]: 3,
|
||||
@ -2971,7 +2971,7 @@ export const speciesStarters = {
|
||||
[Species.WIMPOD]: 3,
|
||||
[Species.SANDYGAST]: 3,
|
||||
[Species.PYUKUMUKU]: 3,
|
||||
[Species.TYPE_NULL]: 6,
|
||||
[Species.TYPE_NULL]: 5,
|
||||
[Species.MINIOR]: 5,
|
||||
[Species.KOMALA]: 5,
|
||||
[Species.TURTONATOR]: 5,
|
||||
@ -2985,21 +2985,21 @@ export const speciesStarters = {
|
||||
[Species.TAPU_LELE]: 6,
|
||||
[Species.TAPU_BULU]: 6,
|
||||
[Species.TAPU_FINI]: 6,
|
||||
[Species.COSMOG]: 7,
|
||||
[Species.NIHILEGO]: 7,
|
||||
[Species.BUZZWOLE]: 7,
|
||||
[Species.COSMOG]: 6,
|
||||
[Species.NIHILEGO]: 6,
|
||||
[Species.BUZZWOLE]: 6,
|
||||
[Species.PHEROMOSA]: 7,
|
||||
[Species.XURKITREE]: 7,
|
||||
[Species.CELESTEELA]: 7,
|
||||
[Species.XURKITREE]: 6,
|
||||
[Species.CELESTEELA]: 6,
|
||||
[Species.KARTANA]: 7,
|
||||
[Species.GUZZLORD]: 7,
|
||||
[Species.GUZZLORD]: 6,
|
||||
[Species.NECROZMA]: 8,
|
||||
[Species.MAGEARNA]: 7,
|
||||
[Species.MARSHADOW]: 7,
|
||||
[Species.POIPOLE]: 7,
|
||||
[Species.STAKATAKA]: 7,
|
||||
[Species.STAKATAKA]: 6,
|
||||
[Species.BLACEPHALON]: 7,
|
||||
[Species.ZERAORA]: 7,
|
||||
[Species.ZERAORA]: 6,
|
||||
[Species.MELTAN]: 6,
|
||||
[Species.ALOLA_RATTATA]: 2,
|
||||
[Species.ALOLA_SANDSHREW]: 4,
|
||||
@ -3046,14 +3046,14 @@ export const speciesStarters = {
|
||||
[Species.ARCTOVISH]: 5,
|
||||
[Species.DURALUDON]: 5,
|
||||
[Species.DREEPY]: 4,
|
||||
[Species.ZACIAN]: 8,
|
||||
[Species.ZACIAN]: 9,
|
||||
[Species.ZAMAZENTA]: 8,
|
||||
[Species.ETERNATUS]: 10,
|
||||
[Species.KUBFU]: 7,
|
||||
[Species.ZARUDE]: 7,
|
||||
[Species.KUBFU]: 6,
|
||||
[Species.ZARUDE]: 6,
|
||||
[Species.REGIELEKI]: 6,
|
||||
[Species.REGIDRAGO]: 6,
|
||||
[Species.GLASTRIER]: 7,
|
||||
[Species.GLASTRIER]: 6,
|
||||
[Species.SPECTRIER]: 7,
|
||||
[Species.CALYREX]: 8,
|
||||
[Species.GALAR_MEOWTH]: 4,
|
||||
@ -3127,27 +3127,27 @@ export const speciesStarters = {
|
||||
[Species.IRON_THORNS]: 6,
|
||||
[Species.FRIGIBAX]: 4,
|
||||
[Species.GIMMIGHOUL]: 5,
|
||||
[Species.WO_CHIEN]: 7,
|
||||
[Species.WO_CHIEN]: 6,
|
||||
[Species.CHIEN_PAO]: 7,
|
||||
[Species.TING_LU]: 7,
|
||||
[Species.TING_LU]: 6,
|
||||
[Species.CHI_YU]: 7,
|
||||
[Species.ROARING_MOON]: 6,
|
||||
[Species.IRON_VALIANT]: 6,
|
||||
[Species.KORAIDON]: 8,
|
||||
[Species.MIRAIDON]: 8,
|
||||
[Species.WALKING_WAKE]: 7,
|
||||
[Species.IRON_LEAVES]: 7,
|
||||
[Species.KORAIDON]: 9,
|
||||
[Species.MIRAIDON]: 9,
|
||||
[Species.WALKING_WAKE]: 6,
|
||||
[Species.IRON_LEAVES]: 6,
|
||||
[Species.POLTCHAGEIST]: 4,
|
||||
[Species.OKIDOGI]: 7,
|
||||
[Species.MUNKIDORI]: 7,
|
||||
[Species.FEZANDIPITI]: 7,
|
||||
[Species.OGERPON]: 8,
|
||||
[Species.OKIDOGI]: 6,
|
||||
[Species.MUNKIDORI]: 6,
|
||||
[Species.FEZANDIPITI]: 6,
|
||||
[Species.OGERPON]: 7,
|
||||
[Species.GOUGING_FIRE]: 7,
|
||||
[Species.RAGING_BOLT]: 7,
|
||||
[Species.RAGING_BOLT]: 6,
|
||||
[Species.IRON_BOULDER]: 7,
|
||||
[Species.IRON_CROWN]: 7,
|
||||
[Species.IRON_CROWN]: 6,
|
||||
[Species.TERAPAGOS]: 8,
|
||||
[Species.PECHARUNT]: 7,
|
||||
[Species.PECHARUNT]: 6,
|
||||
[Species.PALDEA_TAUROS]: 5,
|
||||
[Species.PALDEA_WOOPER]: 3,
|
||||
[Species.BLOODMOON_URSALUNA]: 7,
|
||||
|
@ -4,7 +4,7 @@ import { Variant, VariantSet, variantColorCache } from '#app/data/variant';
|
||||
import { variantData } from '#app/data/variant';
|
||||
import BattleInfo, { PlayerBattleInfo, EnemyBattleInfo } from '../ui/battle-info';
|
||||
import { Moves } from "../data/enums/moves";
|
||||
import Move, { HighCritAttr, HitsTagAttr, applyMoveAttrs, FixedDamageAttr, VariableAtkAttr, VariablePowerAttr, allMoves, MoveCategory, TypelessAttr, CritOnlyAttr, getMoveTargets, OneHitKOAttr, MultiHitAttr, StatusMoveTypeImmunityAttr, MoveTarget, VariableDefAttr, AttackMove, ModifiedDamageAttr, VariableMoveTypeMultiplierAttr, IgnoreOpponentStatChangesAttr, SacrificialAttr, VariableMoveTypeAttr, VariableMoveCategoryAttr, CounterDamageAttr, StatChangeAttr, RechargeAttr, ChargeAttr, IgnoreWeatherTypeDebuffAttr, BypassBurnDamageReductionAttr } from "../data/move";
|
||||
import Move, { HighCritAttr, HitsTagAttr, applyMoveAttrs, FixedDamageAttr, VariableAtkAttr, VariablePowerAttr, allMoves, MoveCategory, TypelessAttr, CritOnlyAttr, getMoveTargets, OneHitKOAttr, MultiHitAttr, StatusMoveTypeImmunityAttr, MoveTarget, VariableDefAttr, AttackMove, ModifiedDamageAttr, VariableMoveTypeMultiplierAttr, IgnoreOpponentStatChangesAttr, SacrificialAttr, VariableMoveTypeAttr, VariableMoveCategoryAttr, CounterDamageAttr, StatChangeAttr, RechargeAttr, ChargeAttr, IgnoreWeatherTypeDebuffAttr, BypassBurnDamageReductionAttr, SacrificialAttrOnHit } from "../data/move";
|
||||
import { default as PokemonSpecies, PokemonSpeciesForm, SpeciesFormKey, getFusedSpeciesName, getPokemonSpecies, getPokemonSpeciesForm, getStarterValueFriendshipCap, speciesStarters, starterPassiveAbilities } from '../data/pokemon-species';
|
||||
import * as Utils from '../utils';
|
||||
import { Type, TypeDamageMultiplier, getTypeDamageMultiplier, getTypeRgb } from '../data/type';
|
||||
@ -336,7 +336,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
||||
console.error(`Could not load ${res.url}!`);
|
||||
return;
|
||||
}
|
||||
res.json()
|
||||
return res.json()
|
||||
}).then(c => {
|
||||
variantColorCache[key] = c;
|
||||
resolve();
|
||||
@ -1127,7 +1127,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
||||
let shinyThreshold = new Utils.IntegerHolder(32);
|
||||
if (thresholdOverride === undefined) {
|
||||
if (!this.hasTrainer()) {
|
||||
if (new Date() < new Date(2024, 4, 21, 20))
|
||||
if (new Date() < new Date(Date.UTC(2024, 4, 22, 0)))
|
||||
shinyThreshold.value *= 3;
|
||||
this.scene.applyModifiers(ShinyRateBoosterModifier, true, shinyThreshold);
|
||||
}
|
||||
@ -1282,11 +1282,13 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
||||
|
||||
if (this.isBoss()) // Bosses never get self ko moves
|
||||
movePool = movePool.filter(m => !allMoves[m[0]].getAttrs(SacrificialAttr).length);
|
||||
movePool = movePool.filter(m => !allMoves[m[0]].getAttrs(SacrificialAttrOnHit).length);
|
||||
if (this.hasTrainer()) {
|
||||
// Trainers never get OHKO moves
|
||||
movePool = movePool.filter(m => !allMoves[m[0]].getAttrs(OneHitKOAttr).length);
|
||||
// Half the weight of self KO moves
|
||||
movePool = movePool.map(m => [m[0], m[1] * (!!allMoves[m[0]].getAttrs(SacrificialAttr).length ? 0.5 : 1)]);
|
||||
movePool = movePool.map(m => [m[0], m[1] * (!!allMoves[m[0]].getAttrs(SacrificialAttrOnHit).length ? 0.5 : 1)]);
|
||||
// Trainers get a weight bump to stat buffing moves
|
||||
movePool = movePool.map(m => [m[0], m[1] * (allMoves[m[0]].getAttrs(StatChangeAttr).some(a => (a as StatChangeAttr).levels > 1 && (a as StatChangeAttr).selfTarget) ? 1.25 : 1)]);
|
||||
// Trainers get a weight decrease to multiturn moves
|
||||
|
@ -2,4 +2,5 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n";
|
||||
|
||||
export const abilityTriggers: SimpleTranslationEntries = {
|
||||
'blockRecoilDamage' : `{{pokemonName}} wurde durch {{abilityName}}\nvor Rückstoß geschützt!`,
|
||||
'badDreams': `{{pokemonName}} ist in einem Alptraum gefangen!`,
|
||||
} as const;
|
||||
|
@ -2,4 +2,5 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n";
|
||||
|
||||
export const abilityTriggers: SimpleTranslationEntries = {
|
||||
'blockRecoilDamage' : `{{pokemonName}}'s {{abilityName}}\nprotected it from recoil!`,
|
||||
'badDreams': `{{pokemonName}} is tormented!`,
|
||||
} as const;
|
@ -2,4 +2,5 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n";
|
||||
|
||||
export const abilityTriggers: SimpleTranslationEntries = {
|
||||
'blockRecoilDamage' : `{{pokemonName}}'s {{abilityName}}\nprotected it from recoil!`,
|
||||
} as const;
|
||||
'badDreams': `{{pokemonName}} Está atormentado!`
|
||||
} as const;
|
||||
|
@ -2,4 +2,5 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n";
|
||||
|
||||
export const abilityTriggers: SimpleTranslationEntries = {
|
||||
'blockRecoilDamage' : `{{abilityName}}\nde {{pokemonName}} le protège du contrecoup !`,
|
||||
'badDreams': `{{pokemonName}} a le sommeil agité !`
|
||||
} as const;
|
||||
|
@ -2,4 +2,5 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n";
|
||||
|
||||
export const abilityTriggers: SimpleTranslationEntries = {
|
||||
'blockRecoilDamage' : `{{abilityName}} di {{pokemonName}}\nl'ha protetto dal contraccolpo!`,
|
||||
'badDreams': `{{pokemonName}} è tormentato!`,
|
||||
} as const;
|
@ -2,4 +2,5 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n";
|
||||
|
||||
export const abilityTriggers: SimpleTranslationEntries = {
|
||||
'blockRecoilDamage' : `{{pokemonName}} 的 {{abilityName}}\n抵消了反作用力!`,
|
||||
'badDreams': `{{pokemonName}} 被折磨着!`
|
||||
} as const;
|
@ -366,10 +366,14 @@ export class TitlePhase extends Phase {
|
||||
this.scene.pushPhase(new SummonPhase(this.scene, 0, true, true));
|
||||
if (this.scene.currentBattle.double && availablePartyMembers > 1)
|
||||
this.scene.pushPhase(new SummonPhase(this.scene, 1, true, true));
|
||||
if (this.scene.currentBattle.waveIndex > 1 && this.scene.currentBattle.battleType !== BattleType.TRAINER) {
|
||||
this.scene.pushPhase(new CheckSwitchPhase(this.scene, 0, this.scene.currentBattle.double));
|
||||
if (this.scene.currentBattle.double && availablePartyMembers > 1)
|
||||
this.scene.pushPhase(new CheckSwitchPhase(this.scene, 1, this.scene.currentBattle.double));
|
||||
|
||||
if (this.scene.currentBattle.battleType !== BattleType.TRAINER && (this.scene.currentBattle.waveIndex > 1 || !this.scene.gameMode.isDaily)) {
|
||||
const minPartySize = this.scene.currentBattle.double ? 2 : 1;
|
||||
if (availablePartyMembers > minPartySize) {
|
||||
this.scene.pushPhase(new CheckSwitchPhase(this.scene, 0, this.scene.currentBattle.double));
|
||||
if (this.scene.currentBattle.double)
|
||||
this.scene.pushPhase(new CheckSwitchPhase(this.scene, 1, this.scene.currentBattle.double));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -955,10 +959,13 @@ export class EncounterPhase extends BattlePhase {
|
||||
this.scene.pushPhase(new ToggleDoublePositionPhase(this.scene, false));
|
||||
}
|
||||
|
||||
if (this.scene.currentBattle.waveIndex > startingWave && this.scene.currentBattle.battleType !== BattleType.TRAINER) {
|
||||
this.scene.pushPhase(new CheckSwitchPhase(this.scene, 0, this.scene.currentBattle.double));
|
||||
if (this.scene.currentBattle.double && availablePartyMembers.length > 1)
|
||||
this.scene.pushPhase(new CheckSwitchPhase(this.scene, 1, this.scene.currentBattle.double));
|
||||
if (this.scene.currentBattle.battleType !== BattleType.TRAINER && (this.scene.currentBattle.waveIndex > 1 || !this.scene.gameMode.isDaily)) {
|
||||
const minPartySize = this.scene.currentBattle.double ? 2 : 1;
|
||||
if (availablePartyMembers.length > minPartySize) {
|
||||
this.scene.pushPhase(new CheckSwitchPhase(this.scene, 0, this.scene.currentBattle.double));
|
||||
if (this.scene.currentBattle.double)
|
||||
this.scene.pushPhase(new CheckSwitchPhase(this.scene, 1, this.scene.currentBattle.double));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -4416,6 +4423,7 @@ export class AttemptCapturePhase extends PokemonPhase {
|
||||
if (this.scene.getParty().length === 6) {
|
||||
const promptRelease = () => {
|
||||
this.scene.ui.showText(`Your party is full.\nRelease a Pokémon to make room for ${pokemon.name}?`, null, () => {
|
||||
this.scene.pokemonInfoContainer.makeRoomForConfirmUi();
|
||||
this.scene.ui.setMode(Mode.CONFIRM, () => {
|
||||
this.scene.ui.setMode(Mode.PARTY, PartyUiMode.RELEASE, this.fieldIndex, (slotIndex: integer, _option: PartyOption) => {
|
||||
this.scene.ui.setMode(Mode.MESSAGE).then(() => {
|
||||
|
@ -93,8 +93,9 @@ export function initI18n(): void {
|
||||
|
||||
i18next.use(LanguageDetector).init({
|
||||
lng: lang,
|
||||
nonExplicitSupportedLngs: true,
|
||||
fallbackLng: 'en',
|
||||
supportedLngs: ['en', 'es', 'fr', 'it', 'de', 'zh_CN','pt_BR'],
|
||||
supportedLngs: ['en', 'es', 'fr', 'it', 'de', 'zh','pt'],
|
||||
debug: true,
|
||||
interpolation: {
|
||||
escapeValue: false,
|
||||
|
@ -5,6 +5,9 @@ import i18next from "i18next";
|
||||
import {Button} from "../enums/buttons";
|
||||
|
||||
export default class ConfirmUiHandler extends AbstractOptionSelectUiHandler {
|
||||
|
||||
public static readonly windowWidth: integer = 48;
|
||||
|
||||
private switchCheck: boolean;
|
||||
private switchCheckCursor: integer;
|
||||
|
||||
@ -13,7 +16,7 @@ export default class ConfirmUiHandler extends AbstractOptionSelectUiHandler {
|
||||
}
|
||||
|
||||
getWindowWidth(): integer {
|
||||
return 48;
|
||||
return ConfirmUiHandler.windowWidth;
|
||||
}
|
||||
|
||||
show(args: any[]): boolean {
|
||||
|
@ -9,8 +9,11 @@ import { getNatureName } from "../data/nature";
|
||||
import * as Utils from "../utils";
|
||||
import { Type } from "../data/type";
|
||||
import { getVariantTint } from "#app/data/variant";
|
||||
import ConfirmUiHandler from "./confirm-ui-handler";
|
||||
|
||||
export default class PokemonInfoContainer extends Phaser.GameObjects.Container {
|
||||
private readonly infoWindowWidth = 104;
|
||||
|
||||
private pokemonGenderLabelText: Phaser.GameObjects.Text;
|
||||
private pokemonGenderText: Phaser.GameObjects.Text;
|
||||
private pokemonAbilityLabelText: Phaser.GameObjects.Text;
|
||||
@ -37,7 +40,7 @@ export default class PokemonInfoContainer extends Phaser.GameObjects.Container {
|
||||
}
|
||||
|
||||
setup(): void {
|
||||
const infoBg = addWindow(this.scene, 0, 0, 104, 132);
|
||||
const infoBg = addWindow(this.scene, 0, 0, this.infoWindowWidth, 132);
|
||||
infoBg.setOrigin(0.5, 0.5);
|
||||
|
||||
this.pokemonMovesContainer = this.scene.add.container(6, 14);
|
||||
@ -172,7 +175,7 @@ export default class PokemonInfoContainer extends Phaser.GameObjects.Container {
|
||||
targets: this,
|
||||
duration: Utils.fixedInt(Math.floor(750 / speedMultiplier)),
|
||||
ease: 'Cubic.easeInOut',
|
||||
x: this.initialX - 104,
|
||||
x: this.initialX - this.infoWindowWidth,
|
||||
onComplete: () => {
|
||||
resolve();
|
||||
}
|
||||
@ -201,6 +204,20 @@ export default class PokemonInfoContainer extends Phaser.GameObjects.Container {
|
||||
});
|
||||
}
|
||||
|
||||
makeRoomForConfirmUi(speedMultiplier: number = 1): Promise<void> {
|
||||
return new Promise<void>(resolve => {
|
||||
this.scene.tweens.add({
|
||||
targets: this,
|
||||
duration: Utils.fixedInt(Math.floor(150 / speedMultiplier)),
|
||||
ease: 'Cubic.easeInOut',
|
||||
x: this.initialX - this.infoWindowWidth - ConfirmUiHandler.windowWidth,
|
||||
onComplete: () => {
|
||||
resolve();
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
hide(speedMultiplier: number = 1): Promise<void> {
|
||||
return new Promise(resolve => {
|
||||
if (!this.shown)
|
||||
|
@ -70,12 +70,12 @@ const languageSettings: { [key: string]: LanguageSetting } = {
|
||||
starterInfoTextSize: '54px',
|
||||
instructionTextSize: '42px',
|
||||
},
|
||||
"zh_CN":{
|
||||
"zh":{
|
||||
starterInfoTextSize: '40px',
|
||||
instructionTextSize: '42px',
|
||||
starterInfoYOffset: 2
|
||||
},
|
||||
"pt_BR":{
|
||||
"pt":{
|
||||
starterInfoTextSize: '47px',
|
||||
instructionTextSize: '38px',
|
||||
starterInfoXPos: 32,
|
||||
@ -85,11 +85,11 @@ const languageSettings: { [key: string]: LanguageSetting } = {
|
||||
const starterCandyCosts: { passive: integer, costReduction: [integer, integer] }[] = [
|
||||
{ passive: 50, costReduction: [30, 75] }, // 1
|
||||
{ passive: 45, costReduction: [25, 60] }, // 2
|
||||
{ passive: 30, costReduction: [20, 50] }, // 3
|
||||
{ passive: 25, costReduction: [15, 40] }, // 4
|
||||
{ passive: 20, costReduction: [12, 35] }, // 5
|
||||
{ passive: 15, costReduction: [10, 30] }, // 6
|
||||
{ passive: 10, costReduction: [8, 20] }, // 7
|
||||
{ passive: 40, costReduction: [20, 50] }, // 3
|
||||
{ passive: 30, costReduction: [15, 40] }, // 4
|
||||
{ passive: 25, costReduction: [12, 35] }, // 5
|
||||
{ passive: 20, costReduction: [10, 30] }, // 6
|
||||
{ passive: 15, costReduction: [8, 20] }, // 7
|
||||
{ passive: 10, costReduction: [5, 15] }, // 8
|
||||
{ passive: 10, costReduction: [3, 10] }, // 9
|
||||
{ passive: 10, costReduction: [3, 10] }, // 10
|
||||
@ -217,7 +217,8 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
|
||||
setup() {
|
||||
const ui = this.getUi();
|
||||
const currentLanguage = i18next.language;
|
||||
const textSettings = languageSettings[currentLanguage];
|
||||
const langSettingKey = Object.keys(languageSettings).find(lang => currentLanguage.includes(lang));
|
||||
const textSettings = languageSettings[langSettingKey];
|
||||
|
||||
this.starterSelectContainer = this.scene.add.container(0, -this.scene.game.canvas.height / 6);
|
||||
this.starterSelectContainer.setVisible(false);
|
||||
@ -280,7 +281,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
|
||||
let starterInfoYOffset = textSettings?.starterInfoYOffset || 0;
|
||||
|
||||
// The font size should be set per language
|
||||
let starterInfoTextSize = textSettings.starterInfoTextSize;
|
||||
let starterInfoTextSize = textSettings?.starterInfoTextSize || 56;
|
||||
|
||||
this.pokemonAbilityLabelText = addTextObject(this.scene, 6, 127 + starterInfoYOffset, i18next.t("starterSelectUiHandler:ability"), TextStyle.SUMMARY_ALT, { fontSize: starterInfoTextSize });
|
||||
this.pokemonAbilityLabelText.setOrigin(0, 0);
|
||||
|
@ -49,11 +49,11 @@ const languageSettings: { [key: string]: LanguageSetting } = {
|
||||
}
|
||||
|
||||
export function addTextObject(scene: Phaser.Scene, x: number, y: number, content: string, style: TextStyle, extraStyleOptions?: Phaser.Types.GameObjects.Text.TextStyle): Phaser.GameObjects.Text {
|
||||
const [ styleOptions, shadowColor, shadowSize ] = getTextStyleOptions(style, (scene as BattleScene).uiTheme, extraStyleOptions);
|
||||
const [ styleOptions, shadowColor, shadowXpos, shadowYpos ] = getTextStyleOptions(style, (scene as BattleScene).uiTheme, extraStyleOptions);
|
||||
|
||||
const ret = scene.add.text(x, y, content, styleOptions);
|
||||
ret.setScale(0.1666666667);
|
||||
ret.setShadow(shadowSize, shadowSize, shadowColor);
|
||||
ret.setShadow(shadowXpos, shadowYpos, shadowColor);
|
||||
if (!(styleOptions as Phaser.Types.GameObjects.Text.TextStyle).lineSpacing)
|
||||
ret.setLineSpacing(5);
|
||||
|
||||
@ -61,12 +61,12 @@ export function addTextObject(scene: Phaser.Scene, x: number, y: number, content
|
||||
}
|
||||
|
||||
export function addBBCodeTextObject(scene: Phaser.Scene, x: number, y: number, content: string, style: TextStyle, extraStyleOptions?: Phaser.Types.GameObjects.Text.TextStyle): BBCodeText {
|
||||
const [ styleOptions, shadowColor, shadowSize ] = getTextStyleOptions(style, (scene as BattleScene).uiTheme, extraStyleOptions);
|
||||
const [ styleOptions, shadowColor, shadowXpos, shadowYpos ] = getTextStyleOptions(style, (scene as BattleScene).uiTheme, extraStyleOptions);
|
||||
|
||||
const ret = new BBCodeText(scene, x, y, content, styleOptions as BBCodeText.TextStyle);
|
||||
scene.add.existing(ret);
|
||||
ret.setScale(0.1666666667);
|
||||
ret.setShadow(shadowSize, shadowSize, shadowColor);
|
||||
ret.setShadow(shadowXpos, shadowYpos, shadowColor);
|
||||
if (!(styleOptions as BBCodeText.TextStyle).lineSpacing)
|
||||
ret.setLineSpacing(10);
|
||||
|
||||
@ -86,7 +86,8 @@ export function addTextInputObject(scene: Phaser.Scene, x: number, y: number, wi
|
||||
function getTextStyleOptions(style: TextStyle, uiTheme: UiTheme, extraStyleOptions?: Phaser.Types.GameObjects.Text.TextStyle): [ Phaser.Types.GameObjects.Text.TextStyle | InputText.IConfig, string, integer ] {
|
||||
const lang = i18next.language;
|
||||
let shadowColor: string;
|
||||
let shadowSize = 6;
|
||||
let shadowXpos = 4;
|
||||
let shadowYpos = 5;
|
||||
|
||||
let styleOptions: Phaser.Types.GameObjects.Text.TextStyle = {
|
||||
fontFamily: 'emerald',
|
||||
@ -117,7 +118,8 @@ function getTextStyleOptions(style: TextStyle, uiTheme: UiTheme, extraStyleOptio
|
||||
case TextStyle.MONEY:
|
||||
case TextStyle.TOOLTIP_TITLE:
|
||||
styleOptions.fontSize = languageSettings[lang]?.battleInfoFontSize || '72px';
|
||||
shadowSize = 4.5;
|
||||
shadowXpos = 3.5;
|
||||
shadowYpos = 3.5;
|
||||
break;
|
||||
case TextStyle.PARTY:
|
||||
case TextStyle.PARTY_RED:
|
||||
@ -126,11 +128,13 @@ function getTextStyleOptions(style: TextStyle, uiTheme: UiTheme, extraStyleOptio
|
||||
break;
|
||||
case TextStyle.TOOLTIP_CONTENT:
|
||||
styleOptions.fontSize = languageSettings[lang]?.tooltipContentFontSize || '64px';
|
||||
shadowSize = 4;
|
||||
shadowXpos = 3;
|
||||
shadowYpos = 3;
|
||||
break;
|
||||
case TextStyle.MOVE_INFO_CONTENT:
|
||||
styleOptions.fontSize = languageSettings[lang]?.moveInfoFontSize || '56px';
|
||||
shadowSize = 3;
|
||||
shadowXpos = 3;
|
||||
shadowYpos = 3;
|
||||
break;
|
||||
}
|
||||
|
||||
@ -139,12 +143,12 @@ function getTextStyleOptions(style: TextStyle, uiTheme: UiTheme, extraStyleOptio
|
||||
if (extraStyleOptions) {
|
||||
if (extraStyleOptions.fontSize) {
|
||||
const sizeRatio = parseInt(extraStyleOptions.fontSize.toString().slice(0, -2)) / parseInt(styleOptions.fontSize.toString().slice(0, -2));
|
||||
shadowSize *= sizeRatio;
|
||||
shadowXpos *= sizeRatio;
|
||||
}
|
||||
styleOptions = Object.assign(styleOptions, extraStyleOptions);
|
||||
}
|
||||
|
||||
return [ styleOptions, shadowColor, shadowSize ];
|
||||
return [ styleOptions, shadowColor, shadowXpos, shadowYpos ];
|
||||
}
|
||||
|
||||
export function getBBCodeFrag(content: string, textStyle: TextStyle, uiTheme: UiTheme = UiTheme.DEFAULT): string {
|
||||
|
Loading…
Reference in New Issue
Block a user