update some phases after merge
2
.github/ISSUE_TEMPLATE/feature_request.yml
vendored
@ -35,5 +35,3 @@ body:
|
|||||||
attributes:
|
attributes:
|
||||||
label: Additional context
|
label: Additional context
|
||||||
description: Add any other context or screenshots about the feature request here.
|
description: Add any other context or screenshots about the feature request here.
|
||||||
validations:
|
|
||||||
required: true
|
|
||||||
|
BIN
public/images/events/august-variant-update.png
Normal file
After Width: | Height: | Size: 370 KiB |
Before Width: | Height: | Size: 2.1 KiB After Width: | Height: | Size: 1.0 KiB |
Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 800 B |
Before Width: | Height: | Size: 5.8 KiB After Width: | Height: | Size: 6.2 KiB |
Before Width: | Height: | Size: 23 KiB After Width: | Height: | Size: 23 KiB |
Before Width: | Height: | Size: 743 B After Width: | Height: | Size: 793 B |
Before Width: | Height: | Size: 5.8 KiB After Width: | Height: | Size: 6.2 KiB |
@ -2513,7 +2513,6 @@
|
|||||||
],
|
],
|
||||||
"meta": {
|
"meta": {
|
||||||
"app": "https://www.codeandweb.com/texturepacker",
|
"app": "https://www.codeandweb.com/texturepacker",
|
||||||
"version": "3.0",
|
"version": "3.0"
|
||||||
"smartupdate": "$TexturePacker:SmartUpdate:edb2df3a947401efb05329a2c96d5d73:f256d83ef4df17c17958acc6e0432ab0:bad05b37c157676604256a043511a6a2$"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Before Width: | Height: | Size: 23 KiB After Width: | Height: | Size: 13 KiB |
Before Width: | Height: | Size: 7.2 KiB After Width: | Height: | Size: 3.6 KiB |
Before Width: | Height: | Size: 3.2 KiB After Width: | Height: | Size: 3.6 KiB |
Before Width: | Height: | Size: 5.0 KiB After Width: | Height: | Size: 5.2 KiB |
Before Width: | Height: | Size: 20 KiB After Width: | Height: | Size: 21 KiB |
Before Width: | Height: | Size: 326 B After Width: | Height: | Size: 318 B |
Before Width: | Height: | Size: 326 B After Width: | Height: | Size: 318 B |
BIN
public/images/pokemon/icons/variant/2/177_2.png
Normal file
After Width: | Height: | Size: 271 B |
BIN
public/images/pokemon/icons/variant/2/177_3.png
Normal file
After Width: | Height: | Size: 271 B |
BIN
public/images/pokemon/icons/variant/2/178_2.png
Normal file
After Width: | Height: | Size: 318 B |
BIN
public/images/pokemon/icons/variant/2/178_3.png
Normal file
After Width: | Height: | Size: 318 B |
Before Width: | Height: | Size: 976 B After Width: | Height: | Size: 1.0 KiB |
Before Width: | Height: | Size: 5.0 KiB After Width: | Height: | Size: 5.2 KiB |
@ -3815,6 +3815,11 @@
|
|||||||
1,
|
1,
|
||||||
1
|
1
|
||||||
],
|
],
|
||||||
|
"178": [
|
||||||
|
0,
|
||||||
|
2,
|
||||||
|
2
|
||||||
|
],
|
||||||
"185": [
|
"185": [
|
||||||
0,
|
0,
|
||||||
1,
|
1,
|
||||||
@ -7833,6 +7838,11 @@
|
|||||||
1,
|
1,
|
||||||
1
|
1
|
||||||
],
|
],
|
||||||
|
"178": [
|
||||||
|
0,
|
||||||
|
2,
|
||||||
|
2
|
||||||
|
],
|
||||||
"185": [
|
"185": [
|
||||||
0,
|
0,
|
||||||
1,
|
1,
|
||||||
|
BIN
public/images/pokemon/variant/back/177_2.png
Normal file
After Width: | Height: | Size: 7.1 KiB |
BIN
public/images/pokemon/variant/back/177_3.png
Normal file
After Width: | Height: | Size: 7.1 KiB |
2372
public/images/pokemon/variant/back/female/178_2.json
Normal file
BIN
public/images/pokemon/variant/back/female/178_2.png
Normal file
After Width: | Height: | Size: 6.2 KiB |
2372
public/images/pokemon/variant/back/female/178_3.json
Normal file
BIN
public/images/pokemon/variant/back/female/178_3.png
Normal file
After Width: | Height: | Size: 6.2 KiB |
@ -1,21 +1,5 @@
|
|||||||
{
|
{
|
||||||
"1": {
|
"1": {
|
||||||
"b0a080": "e552ec",
|
|
||||||
"f8f8e8": "ffe2ed",
|
|
||||||
"9b8259": "b021c5",
|
|
||||||
"e5e4c2": "ffb9f9",
|
|
||||||
"000000": "000000",
|
|
||||||
"bc9b4e": "900090",
|
|
||||||
"f8f8d0": "ff8ae9",
|
|
||||||
"e8e088": "ff49e7",
|
|
||||||
"d0b868": "d10cc7",
|
|
||||||
"7d673b": "510059",
|
|
||||||
"282828": "282828",
|
|
||||||
"f84040": "f84040",
|
|
||||||
"f88888": "1ae2e6",
|
|
||||||
"c81010": "00c2d2"
|
|
||||||
},
|
|
||||||
"2": {
|
|
||||||
"b0a080": "d96b23",
|
"b0a080": "d96b23",
|
||||||
"f8f8e8": "ffe1b8",
|
"f8f8e8": "ffe1b8",
|
||||||
"9b8259": "b43c06",
|
"9b8259": "b43c06",
|
||||||
@ -30,5 +14,21 @@
|
|||||||
"f84040": "f84040",
|
"f84040": "f84040",
|
||||||
"f88888": "f88888",
|
"f88888": "f88888",
|
||||||
"c81010": "c81010"
|
"c81010": "c81010"
|
||||||
|
},
|
||||||
|
"2": {
|
||||||
|
"b0a080": "e552ec",
|
||||||
|
"f8f8e8": "ffe2ed",
|
||||||
|
"9b8259": "b021c5",
|
||||||
|
"e5e4c2": "ffb9f9",
|
||||||
|
"000000": "000000",
|
||||||
|
"bc9b4e": "900090",
|
||||||
|
"f8f8d0": "ff8ae9",
|
||||||
|
"e8e088": "ff49e7",
|
||||||
|
"d0b868": "d10cc7",
|
||||||
|
"7d673b": "510059",
|
||||||
|
"282828": "282828",
|
||||||
|
"f84040": "f84040",
|
||||||
|
"f88888": "1ae2e6",
|
||||||
|
"c81010": "00c2d2"
|
||||||
}
|
}
|
||||||
}
|
}
|
2372
public/images/pokemon/variant/female/178_2.json
Normal file
BIN
public/images/pokemon/variant/female/178_2.png
Normal file
After Width: | Height: | Size: 5.2 KiB |
2372
public/images/pokemon/variant/female/178_3.json
Normal file
BIN
public/images/pokemon/variant/female/178_3.png
Normal file
After Width: | Height: | Size: 5.2 KiB |
Before Width: | Height: | Size: 43 KiB After Width: | Height: | Size: 49 KiB |
Before Width: | Height: | Size: 24 KiB After Width: | Height: | Size: 28 KiB |
Before Width: | Height: | Size: 34 KiB After Width: | Height: | Size: 38 KiB |
Before Width: | Height: | Size: 53 KiB After Width: | Height: | Size: 54 KiB |
Before Width: | Height: | Size: 29 KiB After Width: | Height: | Size: 37 KiB |
Before Width: | Height: | Size: 31 KiB After Width: | Height: | Size: 34 KiB |
Before Width: | Height: | Size: 20 KiB After Width: | Height: | Size: 26 KiB |
Before Width: | Height: | Size: 60 KiB After Width: | Height: | Size: 25 KiB |
Before Width: | Height: | Size: 34 KiB After Width: | Height: | Size: 40 KiB |
Before Width: | Height: | Size: 27 KiB After Width: | Height: | Size: 32 KiB |
@ -1,11 +1,10 @@
|
|||||||
import Phaser from "phaser";
|
import Phaser from "phaser";
|
||||||
import UI from "./ui/ui";
|
import UI from "./ui/ui";
|
||||||
import { NextEncounterPhase, NewBiomeEncounterPhase, SelectBiomePhase, MessagePhase, TurnInitPhase, ReturnPhase, LevelCapPhase, ShowTrainerPhase, LoginPhase, MovePhase, TitlePhase, SwitchPhase, SummonPhase, ToggleDoublePositionPhase } from "./phases";
|
|
||||||
import Pokemon, { PlayerPokemon, EnemyPokemon } from "./field/pokemon";
|
import Pokemon, { PlayerPokemon, EnemyPokemon } from "./field/pokemon";
|
||||||
import PokemonSpecies, { PokemonSpeciesFilter, allSpecies, getPokemonSpecies } from "./data/pokemon-species";
|
import PokemonSpecies, { PokemonSpeciesFilter, allSpecies, getPokemonSpecies } from "./data/pokemon-species";
|
||||||
import { Constructor } from "#app/utils";
|
import { Constructor } from "#app/utils";
|
||||||
import * as Utils from "./utils";
|
import * as Utils from "./utils";
|
||||||
import { Modifier, ModifierBar, ConsumablePokemonModifier, ConsumableModifier, PokemonHpRestoreModifier, HealingBoosterModifier, PersistentModifier, PokemonHeldItemModifier, ModifierPredicate, DoubleBattleChanceBoosterModifier, FusePokemonModifier, PokemonFormChangeItemModifier, TerastallizeModifier, overrideModifiers, overrideHeldItems } from "./modifier/modifier";
|
import { Modifier, ModifierBar, ConsumablePokemonModifier, ConsumableModifier, PokemonHpRestoreModifier, TurnHeldItemTransferModifier, HealingBoosterModifier, PersistentModifier, PokemonHeldItemModifier, ModifierPredicate, DoubleBattleChanceBoosterModifier, FusePokemonModifier, PokemonFormChangeItemModifier, TerastallizeModifier, overrideModifiers, overrideHeldItems } from "./modifier/modifier";
|
||||||
import { PokeballType } from "./data/pokeball";
|
import { PokeballType } from "./data/pokeball";
|
||||||
import { initCommonAnims, initMoveAnim, loadCommonAnimAssets, loadMoveAnimAssets, populateAnims } from "./data/battle-anims";
|
import { initCommonAnims, initMoveAnim, loadCommonAnimAssets, loadMoveAnimAssets, populateAnims } from "./data/battle-anims";
|
||||||
import { Phase } from "./phase";
|
import { Phase } from "./phase";
|
||||||
@ -37,8 +36,8 @@ import UIPlugin from "phaser3-rex-plugins/templates/ui/ui-plugin";
|
|||||||
import { addUiThemeOverrides } from "./ui/ui-theme";
|
import { addUiThemeOverrides } from "./ui/ui-theme";
|
||||||
import PokemonData from "./system/pokemon-data";
|
import PokemonData from "./system/pokemon-data";
|
||||||
import { Nature } from "./data/nature";
|
import { Nature } from "./data/nature";
|
||||||
import { SpeciesFormChangeManualTrigger, SpeciesFormChangeTimeOfDayTrigger, SpeciesFormChangeTrigger, pokemonFormChanges, FormChangeItem } from "./data/pokemon-forms";
|
import { SpeciesFormChangeManualTrigger, SpeciesFormChangeTimeOfDayTrigger, SpeciesFormChangeTrigger, pokemonFormChanges, FormChangeItem, SpeciesFormChange } from "./data/pokemon-forms";
|
||||||
import { FormChangePhase, QuietFormChangePhase } from "./form-change-phase";
|
import { FormChangePhase } from "./phases/form-change-phase";
|
||||||
import { getTypeRgb } from "./data/type";
|
import { getTypeRgb } from "./data/type";
|
||||||
import PokemonSpriteSparkleHandler from "./field/pokemon-sprite-sparkle-handler";
|
import PokemonSpriteSparkleHandler from "./field/pokemon-sprite-sparkle-handler";
|
||||||
import CharSprite from "./ui/char-sprite";
|
import CharSprite from "./ui/char-sprite";
|
||||||
@ -69,6 +68,21 @@ import i18next from "i18next";
|
|||||||
import {TrainerType} from "#enums/trainer-type";
|
import {TrainerType} from "#enums/trainer-type";
|
||||||
import { battleSpecDialogue } from "./data/dialogue";
|
import { battleSpecDialogue } from "./data/dialogue";
|
||||||
import { LoadingScene } from "./loading-scene";
|
import { LoadingScene } from "./loading-scene";
|
||||||
|
import { LevelCapPhase } from "./phases/level-cap-phase";
|
||||||
|
import { LoginPhase } from "./phases/login-phase";
|
||||||
|
import { MessagePhase } from "./phases/message-phase";
|
||||||
|
import { MovePhase } from "./phases/move-phase";
|
||||||
|
import { NewBiomeEncounterPhase } from "./phases/new-biome-encounter-phase";
|
||||||
|
import { NextEncounterPhase } from "./phases/next-encounter-phase";
|
||||||
|
import { QuietFormChangePhase } from "./phases/quiet-form-change-phase";
|
||||||
|
import { ReturnPhase } from "./phases/return-phase";
|
||||||
|
import { SelectBiomePhase } from "./phases/select-biome-phase";
|
||||||
|
import { ShowTrainerPhase } from "./phases/show-trainer-phase";
|
||||||
|
import { SummonPhase } from "./phases/summon-phase";
|
||||||
|
import { SwitchPhase } from "./phases/switch-phase";
|
||||||
|
import { TitlePhase } from "./phases/title-phase";
|
||||||
|
import { ToggleDoublePositionPhase } from "./phases/toggle-double-position-phase";
|
||||||
|
import { TurnInitPhase } from "./phases/turn-init-phase";
|
||||||
|
|
||||||
export const bypassLogin = import.meta.env.VITE_BYPASS_LOGIN === "1";
|
export const bypassLogin = import.meta.env.VITE_BYPASS_LOGIN === "1";
|
||||||
|
|
||||||
@ -2421,7 +2435,6 @@ export default class BattleScene extends SceneBase {
|
|||||||
getEnemyModifierTypesForWave(difficultyWaveIndex, count, [ enemyPokemon ], this.currentBattle.battleType === BattleType.TRAINER ? ModifierPoolType.TRAINER : ModifierPoolType.WILD, upgradeChance)
|
getEnemyModifierTypesForWave(difficultyWaveIndex, count, [ enemyPokemon ], this.currentBattle.battleType === BattleType.TRAINER ? ModifierPoolType.TRAINER : ModifierPoolType.WILD, upgradeChance)
|
||||||
.map(mt => mt.newModifier(enemyPokemon).add(this.enemyModifiers, false, this));
|
.map(mt => mt.newModifier(enemyPokemon).add(this.enemyModifiers, false, this));
|
||||||
});
|
});
|
||||||
|
|
||||||
this.updateModifiers(false).then(() => resolve());
|
this.updateModifiers(false).then(() => resolve());
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -2579,7 +2592,7 @@ export default class BattleScene extends SceneBase {
|
|||||||
|
|
||||||
// in case this is NECROZMA, determine which forms this
|
// in case this is NECROZMA, determine which forms this
|
||||||
const matchingFormChangeOpts = pokemonFormChanges[pokemon.species.speciesId].filter(fc => fc.findTrigger(formChangeTriggerType) && fc.canChange(pokemon));
|
const matchingFormChangeOpts = pokemonFormChanges[pokemon.species.speciesId].filter(fc => fc.findTrigger(formChangeTriggerType) && fc.canChange(pokemon));
|
||||||
let matchingFormChange;
|
let matchingFormChange: SpeciesFormChange | null;
|
||||||
if (pokemon.species.speciesId === Species.NECROZMA && matchingFormChangeOpts.length > 1) {
|
if (pokemon.species.speciesId === Species.NECROZMA && matchingFormChangeOpts.length > 1) {
|
||||||
// Ultra Necrozma is changing its form back, so we need to figure out into which form it devolves.
|
// Ultra Necrozma is changing its form back, so we need to figure out into which form it devolves.
|
||||||
const formChangeItemModifiers = (this.findModifiers(m => m instanceof PokemonFormChangeItemModifier && m.pokemonId === pokemon.id) as PokemonFormChangeItemModifier[]).filter(m => m.active).map(m => m.formChangeItem);
|
const formChangeItemModifiers = (this.findModifiers(m => m instanceof PokemonFormChangeItemModifier && m.pokemonId === pokemon.id) as PokemonFormChangeItemModifier[]).filter(m => m.active).map(m => m.formChangeItem);
|
||||||
@ -2666,7 +2679,9 @@ export default class BattleScene extends SceneBase {
|
|||||||
if (pokemon instanceof EnemyPokemon && pokemon.isBoss() && !pokemon.formIndex && pokemon.bossSegmentIndex < 1) {
|
if (pokemon instanceof EnemyPokemon && pokemon.isBoss() && !pokemon.formIndex && pokemon.bossSegmentIndex < 1) {
|
||||||
this.fadeOutBgm(Utils.fixedInt(2000), false);
|
this.fadeOutBgm(Utils.fixedInt(2000), false);
|
||||||
this.ui.showDialogue(battleSpecDialogue[BattleSpec.FINAL_BOSS].firstStageWin, pokemon.species.name, undefined, () => {
|
this.ui.showDialogue(battleSpecDialogue[BattleSpec.FINAL_BOSS].firstStageWin, pokemon.species.name, undefined, () => {
|
||||||
this.addEnemyModifier(getModifierType(modifierTypes.MINI_BLACK_HOLE).newModifier(pokemon) as PersistentModifier, false, true);
|
const finalBossMBH = getModifierType(modifierTypes.MINI_BLACK_HOLE).newModifier(pokemon) as TurnHeldItemTransferModifier;
|
||||||
|
finalBossMBH.setTransferrableFalse();
|
||||||
|
this.addEnemyModifier(finalBossMBH, false, true);
|
||||||
pokemon.generateAndPopulateMoveset(1);
|
pokemon.generateAndPopulateMoveset(1);
|
||||||
this.setFieldScale(0.75);
|
this.setFieldScale(0.75);
|
||||||
this.triggerPokemonFormChange(pokemon, SpeciesFormChangeManualTrigger, false);
|
this.triggerPokemonFormChange(pokemon, SpeciesFormChangeManualTrigger, false);
|
||||||
|
@ -3,7 +3,6 @@ import { Type } from "./type";
|
|||||||
import { Constructor } from "#app/utils";
|
import { Constructor } from "#app/utils";
|
||||||
import * as Utils from "../utils";
|
import * as Utils from "../utils";
|
||||||
import { BattleStat, getBattleStatName } from "./battle-stat";
|
import { BattleStat, getBattleStatName } from "./battle-stat";
|
||||||
import { MovePhase, PokemonHealPhase, ShowAbilityPhase, StatChangePhase } from "../phases";
|
|
||||||
import { getPokemonNameWithAffix } from "../messages";
|
import { getPokemonNameWithAffix } from "../messages";
|
||||||
import { Weather, WeatherType } from "./weather";
|
import { Weather, WeatherType } from "./weather";
|
||||||
import { BattlerTag, GroundedTag, GulpMissileTag, SemiInvulnerableTag } from "./battler-tags";
|
import { BattlerTag, GroundedTag, GulpMissileTag, SemiInvulnerableTag } from "./battler-tags";
|
||||||
@ -26,6 +25,10 @@ import { ArenaTagType } from "#enums/arena-tag-type";
|
|||||||
import { BattlerTagType } from "#enums/battler-tag-type";
|
import { BattlerTagType } from "#enums/battler-tag-type";
|
||||||
import { Moves } from "#enums/moves";
|
import { Moves } from "#enums/moves";
|
||||||
import { Species } from "#enums/species";
|
import { Species } from "#enums/species";
|
||||||
|
import { MovePhase } from "#app/phases/move-phase.js";
|
||||||
|
import { PokemonHealPhase } from "#app/phases/pokemon-heal-phase.js";
|
||||||
|
import { ShowAbilityPhase } from "#app/phases/show-ability-phase.js";
|
||||||
|
import { StatChangePhase } from "#app/phases/stat-change-phase.js";
|
||||||
|
|
||||||
export class Ability implements Localizable {
|
export class Ability implements Localizable {
|
||||||
public id: Abilities;
|
public id: Abilities;
|
||||||
@ -2406,16 +2409,16 @@ export class PreStatChangeAbAttr extends AbAttr {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export class ProtectStatAbAttr extends PreStatChangeAbAttr {
|
export class ProtectStatAbAttr extends PreStatChangeAbAttr {
|
||||||
private protectedStat: BattleStat | null;
|
private protectedStat?: BattleStat;
|
||||||
|
|
||||||
constructor(protectedStat?: BattleStat) {
|
constructor(protectedStat?: BattleStat) {
|
||||||
super();
|
super();
|
||||||
|
|
||||||
this.protectedStat = protectedStat ?? null;
|
this.protectedStat = protectedStat;
|
||||||
}
|
}
|
||||||
|
|
||||||
applyPreStatChange(pokemon: Pokemon, passive: boolean, stat: BattleStat, cancelled: Utils.BooleanHolder, args: any[]): boolean {
|
applyPreStatChange(pokemon: Pokemon, passive: boolean, stat: BattleStat, cancelled: Utils.BooleanHolder, args: any[]): boolean {
|
||||||
if (!this.protectedStat || stat === this.protectedStat) {
|
if (Utils.isNullOrUndefined(this.protectedStat) || stat === this.protectedStat) {
|
||||||
cancelled.value = true;
|
cancelled.value = true;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -5158,6 +5161,7 @@ export function initAbilities() {
|
|||||||
(pokemon, abilityName) => i18next.t("abilityTriggers:disguiseAvoidedDamage", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), abilityName: abilityName }),
|
(pokemon, abilityName) => i18next.t("abilityTriggers:disguiseAvoidedDamage", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), abilityName: abilityName }),
|
||||||
(pokemon) => Math.floor(pokemon.getMaxHp() / 8))
|
(pokemon) => Math.floor(pokemon.getMaxHp() / 8))
|
||||||
.attr(PostBattleInitFormChangeAbAttr, () => 0)
|
.attr(PostBattleInitFormChangeAbAttr, () => 0)
|
||||||
|
.bypassFaint()
|
||||||
.ignorable(),
|
.ignorable(),
|
||||||
new Ability(Abilities.BATTLE_BOND, 7)
|
new Ability(Abilities.BATTLE_BOND, 7)
|
||||||
.attr(PostVictoryFormChangeAbAttr, () => 2)
|
.attr(PostVictoryFormChangeAbAttr, () => 2)
|
||||||
@ -5310,6 +5314,7 @@ export function initAbilities() {
|
|||||||
.attr(FormBlockDamageAbAttr, (target, user, move) => move.category === MoveCategory.PHYSICAL && !!target.getTag(BattlerTagType.ICE_FACE), 0, BattlerTagType.ICE_FACE,
|
.attr(FormBlockDamageAbAttr, (target, user, move) => move.category === MoveCategory.PHYSICAL && !!target.getTag(BattlerTagType.ICE_FACE), 0, BattlerTagType.ICE_FACE,
|
||||||
(pokemon, abilityName) => i18next.t("abilityTriggers:iceFaceAvoidedDamage", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), abilityName: abilityName }))
|
(pokemon, abilityName) => i18next.t("abilityTriggers:iceFaceAvoidedDamage", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), abilityName: abilityName }))
|
||||||
.attr(PostBattleInitFormChangeAbAttr, () => 0)
|
.attr(PostBattleInitFormChangeAbAttr, () => 0)
|
||||||
|
.bypassFaint()
|
||||||
.ignorable(),
|
.ignorable(),
|
||||||
new Ability(Abilities.POWER_SPOT, 8)
|
new Ability(Abilities.POWER_SPOT, 8)
|
||||||
.attr(AllyMoveCategoryPowerBoostAbAttr, [MoveCategory.SPECIAL, MoveCategory.PHYSICAL], 1.3),
|
.attr(AllyMoveCategoryPowerBoostAbAttr, [MoveCategory.SPECIAL, MoveCategory.PHYSICAL], 1.3),
|
||||||
|
@ -4,7 +4,6 @@ import * as Utils from "../utils";
|
|||||||
import { MoveCategory, allMoves, MoveTarget, IncrementMovePriorityAttr, applyMoveAttrs } from "./move";
|
import { MoveCategory, allMoves, MoveTarget, IncrementMovePriorityAttr, applyMoveAttrs } from "./move";
|
||||||
import { getPokemonNameWithAffix } from "../messages";
|
import { getPokemonNameWithAffix } from "../messages";
|
||||||
import Pokemon, { HitResult, PokemonMove } from "../field/pokemon";
|
import Pokemon, { HitResult, PokemonMove } from "../field/pokemon";
|
||||||
import { MoveEffectPhase, PokemonHealPhase, ShowAbilityPhase, StatChangePhase } from "../phases";
|
|
||||||
import { StatusEffect } from "./status-effect";
|
import { StatusEffect } from "./status-effect";
|
||||||
import { BattlerIndex } from "../battle";
|
import { BattlerIndex } from "../battle";
|
||||||
import { BlockNonDirectDamageAbAttr, ChangeMovePriorityAbAttr, ProtectStatAbAttr, applyAbAttrs } from "./ability";
|
import { BlockNonDirectDamageAbAttr, ChangeMovePriorityAbAttr, ProtectStatAbAttr, applyAbAttrs } from "./ability";
|
||||||
@ -15,6 +14,10 @@ import { Abilities } from "#enums/abilities";
|
|||||||
import { ArenaTagType } from "#enums/arena-tag-type";
|
import { ArenaTagType } from "#enums/arena-tag-type";
|
||||||
import { BattlerTagType } from "#enums/battler-tag-type";
|
import { BattlerTagType } from "#enums/battler-tag-type";
|
||||||
import { Moves } from "#enums/moves";
|
import { Moves } from "#enums/moves";
|
||||||
|
import { MoveEffectPhase } from "#app/phases/move-effect-phase.js";
|
||||||
|
import { PokemonHealPhase } from "#app/phases/pokemon-heal-phase.js";
|
||||||
|
import { ShowAbilityPhase } from "#app/phases/show-ability-phase.js";
|
||||||
|
import { StatChangePhase } from "#app/phases/stat-change-phase.js";
|
||||||
|
|
||||||
export enum ArenaTagSide {
|
export enum ArenaTagSide {
|
||||||
BOTH,
|
BOTH,
|
||||||
|
@ -1,5 +1,4 @@
|
|||||||
import { ChargeAnim, CommonAnim, CommonBattleAnim, MoveChargeAnim } from "./battle-anims";
|
import { ChargeAnim, CommonAnim, CommonBattleAnim, MoveChargeAnim } from "./battle-anims";
|
||||||
import { CommonAnimPhase, MoveEffectPhase, MovePhase, PokemonHealPhase, ShowAbilityPhase, StatChangeCallback, StatChangePhase } from "../phases";
|
|
||||||
import { getPokemonNameWithAffix } from "../messages";
|
import { getPokemonNameWithAffix } from "../messages";
|
||||||
import Pokemon, { MoveResult, HitResult } from "../field/pokemon";
|
import Pokemon, { MoveResult, HitResult } from "../field/pokemon";
|
||||||
import { Stat, getStatName } from "./pokemon-stat";
|
import { Stat, getStatName } from "./pokemon-stat";
|
||||||
@ -18,6 +17,12 @@ import { BattlerTagType } from "#enums/battler-tag-type";
|
|||||||
import { Moves } from "#enums/moves";
|
import { Moves } from "#enums/moves";
|
||||||
import { Species } from "#enums/species";
|
import { Species } from "#enums/species";
|
||||||
import i18next from "#app/plugins/i18n.js";
|
import i18next from "#app/plugins/i18n.js";
|
||||||
|
import { CommonAnimPhase } from "#app/phases/common-anim-phase.js";
|
||||||
|
import { MoveEffectPhase } from "#app/phases/move-effect-phase.js";
|
||||||
|
import { MovePhase } from "#app/phases/move-phase.js";
|
||||||
|
import { PokemonHealPhase } from "#app/phases/pokemon-heal-phase.js";
|
||||||
|
import { ShowAbilityPhase } from "#app/phases/show-ability-phase.js";
|
||||||
|
import { StatChangePhase, StatChangeCallback } from "#app/phases/stat-change-phase.js";
|
||||||
|
|
||||||
export enum BattlerTagLapseType {
|
export enum BattlerTagLapseType {
|
||||||
FAINT,
|
FAINT,
|
||||||
|
@ -1,4 +1,3 @@
|
|||||||
import { PokemonHealPhase, StatChangePhase } from "../phases";
|
|
||||||
import { getPokemonNameWithAffix } from "../messages";
|
import { getPokemonNameWithAffix } from "../messages";
|
||||||
import Pokemon, { HitResult } from "../field/pokemon";
|
import Pokemon, { HitResult } from "../field/pokemon";
|
||||||
import { BattleStat } from "./battle-stat";
|
import { BattleStat } from "./battle-stat";
|
||||||
@ -8,6 +7,8 @@ import { DoubleBerryEffectAbAttr, ReduceBerryUseThresholdAbAttr, applyAbAttrs }
|
|||||||
import i18next from "i18next";
|
import i18next from "i18next";
|
||||||
import { BattlerTagType } from "#enums/battler-tag-type";
|
import { BattlerTagType } from "#enums/battler-tag-type";
|
||||||
import { BerryType } from "#enums/berry-type";
|
import { BerryType } from "#enums/berry-type";
|
||||||
|
import { PokemonHealPhase } from "#app/phases/pokemon-heal-phase.js";
|
||||||
|
import { StatChangePhase } from "#app/phases/stat-change-phase.js";
|
||||||
|
|
||||||
export function getBerryName(berryType: BerryType): string {
|
export function getBerryName(berryType: BerryType): string {
|
||||||
return i18next.t(`berry:${BerryType[berryType]}.name`);
|
return i18next.t(`berry:${BerryType[berryType]}.name`);
|
||||||
|
@ -37,7 +37,7 @@ export const speciesEggMoves = {
|
|||||||
[Species.SLOWPOKE]: [ Moves.BOUNCY_BUBBLE, Moves.FLAMETHROWER, Moves.MYSTICAL_POWER, Moves.SHED_TAIL ],
|
[Species.SLOWPOKE]: [ Moves.BOUNCY_BUBBLE, Moves.FLAMETHROWER, Moves.MYSTICAL_POWER, Moves.SHED_TAIL ],
|
||||||
[Species.MAGNEMITE]: [ Moves.PARABOLIC_CHARGE, Moves.BODY_PRESS, Moves.ICE_BEAM, Moves.THUNDERCLAP ],
|
[Species.MAGNEMITE]: [ Moves.PARABOLIC_CHARGE, Moves.BODY_PRESS, Moves.ICE_BEAM, Moves.THUNDERCLAP ],
|
||||||
[Species.FARFETCHD]: [ Moves.IVY_CUDGEL, Moves.TRIPLE_ARROWS, Moves.ROOST, Moves.VICTORY_DANCE ],
|
[Species.FARFETCHD]: [ Moves.IVY_CUDGEL, Moves.TRIPLE_ARROWS, Moves.ROOST, Moves.VICTORY_DANCE ],
|
||||||
[Species.DODUO]: [ Moves.ICE_SPINNER, Moves.MULTI_ATTACK, Moves.FLOATY_FALL, Moves.TRIPLE_ARROWS ],
|
[Species.DODUO]: [ Moves.TRIPLE_AXEL, Moves.MULTI_ATTACK, Moves.FLOATY_FALL, Moves.TRIPLE_ARROWS ],
|
||||||
[Species.SEEL]: [ Moves.FREEZE_DRY, Moves.BOUNCY_BUBBLE, Moves.SLACK_OFF, Moves.STEAM_ERUPTION ],
|
[Species.SEEL]: [ Moves.FREEZE_DRY, Moves.BOUNCY_BUBBLE, Moves.SLACK_OFF, Moves.STEAM_ERUPTION ],
|
||||||
[Species.GRIMER]: [ Moves.SUCKER_PUNCH, Moves.CURSE, Moves.STRENGTH_SAP, Moves.NOXIOUS_TORQUE ],
|
[Species.GRIMER]: [ Moves.SUCKER_PUNCH, Moves.CURSE, Moves.STRENGTH_SAP, Moves.NOXIOUS_TORQUE ],
|
||||||
[Species.SHELLDER]: [ Moves.ROCK_BLAST, Moves.WATER_SHURIKEN, Moves.BANEFUL_BUNKER, Moves.BONE_RUSH ],
|
[Species.SHELLDER]: [ Moves.ROCK_BLAST, Moves.WATER_SHURIKEN, Moves.BANEFUL_BUNKER, Moves.BONE_RUSH ],
|
||||||
@ -198,7 +198,7 @@ export const speciesEggMoves = {
|
|||||||
[Species.KYOGRE]: [ Moves.BOUNCY_BUBBLE, Moves.HURRICANE, Moves.FREEZE_DRY, Moves.ELECTRO_SHOT ],
|
[Species.KYOGRE]: [ Moves.BOUNCY_BUBBLE, Moves.HURRICANE, Moves.FREEZE_DRY, Moves.ELECTRO_SHOT ],
|
||||||
[Species.GROUDON]: [ Moves.STONE_AXE, Moves.SOLAR_BLADE, Moves.MORNING_SUN, Moves.SACRED_FIRE ],
|
[Species.GROUDON]: [ Moves.STONE_AXE, Moves.SOLAR_BLADE, Moves.MORNING_SUN, Moves.SACRED_FIRE ],
|
||||||
[Species.RAYQUAZA]: [ Moves.V_CREATE, Moves.DRAGON_DARTS, Moves.CORE_ENFORCER, Moves.OBLIVION_WING ],
|
[Species.RAYQUAZA]: [ Moves.V_CREATE, Moves.DRAGON_DARTS, Moves.CORE_ENFORCER, Moves.OBLIVION_WING ],
|
||||||
[Species.JIRACHI]: [ Moves.TACHYON_CUTTER, Moves.FLOATY_FALL, Moves.TRIPLE_ARROWS, Moves.SHELL_SMASH ],
|
[Species.JIRACHI]: [ Moves.TACHYON_CUTTER, Moves.TRIPLE_ARROWS, Moves.ROCK_SLIDE, Moves.SHELL_SMASH ],
|
||||||
[Species.DEOXYS]: [ Moves.COLLISION_COURSE, Moves.EARTH_POWER, Moves.PARTING_SHOT, Moves.LUMINA_CRASH ],
|
[Species.DEOXYS]: [ Moves.COLLISION_COURSE, Moves.EARTH_POWER, Moves.PARTING_SHOT, Moves.LUMINA_CRASH ],
|
||||||
[Species.TURTWIG]: [ Moves.SHELL_SMASH, Moves.MIGHTY_CLEAVE, Moves.ICE_SPINNER, Moves.SAPPY_SEED ],
|
[Species.TURTWIG]: [ Moves.SHELL_SMASH, Moves.MIGHTY_CLEAVE, Moves.ICE_SPINNER, Moves.SAPPY_SEED ],
|
||||||
[Species.CHIMCHAR]: [ Moves.FIERY_DANCE, Moves.SECRET_SWORD, Moves.TRIPLE_AXEL, Moves.SACRED_FIRE ],
|
[Species.CHIMCHAR]: [ Moves.FIERY_DANCE, Moves.SECRET_SWORD, Moves.TRIPLE_AXEL, Moves.SACRED_FIRE ],
|
||||||
@ -418,7 +418,7 @@ export const speciesEggMoves = {
|
|||||||
[Species.CELESTEELA]: [ Moves.RECOVER, Moves.BUZZY_BUZZ, Moves.SANDSEAR_STORM, Moves.OBLIVION_WING ],
|
[Species.CELESTEELA]: [ Moves.RECOVER, Moves.BUZZY_BUZZ, Moves.SANDSEAR_STORM, Moves.OBLIVION_WING ],
|
||||||
[Species.KARTANA]: [ Moves.MIGHTY_CLEAVE, Moves.PSYBLADE, Moves.BITTER_BLADE, Moves.BEHEMOTH_BLADE ],
|
[Species.KARTANA]: [ Moves.MIGHTY_CLEAVE, Moves.PSYBLADE, Moves.BITTER_BLADE, Moves.BEHEMOTH_BLADE ],
|
||||||
[Species.GUZZLORD]: [ Moves.SUCKER_PUNCH, Moves.COMEUPPANCE, Moves.SLACK_OFF, Moves.SHED_TAIL ],
|
[Species.GUZZLORD]: [ Moves.SUCKER_PUNCH, Moves.COMEUPPANCE, Moves.SLACK_OFF, Moves.SHED_TAIL ],
|
||||||
[Species.NECROZMA]: [ Moves.CLANGOROUS_SOUL, Moves.SACRED_FIRE, Moves.ASTRAL_BARRAGE, Moves.CLANGOROUS_SOUL ],
|
[Species.NECROZMA]: [ Moves.CLANGOROUS_SOUL, Moves.SACRED_FIRE, Moves.ASTRAL_BARRAGE, Moves.DYNAMAX_CANNON ],
|
||||||
[Species.MAGEARNA]: [ Moves.STRENGTH_SAP, Moves.EARTH_POWER, Moves.MOONBLAST, Moves.MAKE_IT_RAIN ],
|
[Species.MAGEARNA]: [ Moves.STRENGTH_SAP, Moves.EARTH_POWER, Moves.MOONBLAST, Moves.MAKE_IT_RAIN ],
|
||||||
[Species.MARSHADOW]: [ Moves.POWER_UP_PUNCH, Moves.TRIPLE_AXEL, Moves.METEOR_MASH, Moves.STORM_THROW ],
|
[Species.MARSHADOW]: [ Moves.POWER_UP_PUNCH, Moves.TRIPLE_AXEL, Moves.METEOR_MASH, Moves.STORM_THROW ],
|
||||||
[Species.POIPOLE]: [ Moves.CORE_ENFORCER, Moves.ICE_BEAM, Moves.SEARING_SHOT, Moves.MALIGNANT_CHAIN ],
|
[Species.POIPOLE]: [ Moves.CORE_ENFORCER, Moves.ICE_BEAM, Moves.SEARING_SHOT, Moves.MALIGNANT_CHAIN ],
|
||||||
@ -458,7 +458,7 @@ export const speciesEggMoves = {
|
|||||||
[Species.MORPEKO]: [ Moves.TRIPLE_AXEL, Moves.OBSTRUCT, Moves.SWORDS_DANCE, Moves.COLLISION_COURSE ],
|
[Species.MORPEKO]: [ Moves.TRIPLE_AXEL, Moves.OBSTRUCT, Moves.SWORDS_DANCE, Moves.COLLISION_COURSE ],
|
||||||
[Species.CUFANT]: [ Moves.LIQUIDATION, Moves.CURSE, Moves.COMBAT_TORQUE, Moves.GIGATON_HAMMER ],
|
[Species.CUFANT]: [ Moves.LIQUIDATION, Moves.CURSE, Moves.COMBAT_TORQUE, Moves.GIGATON_HAMMER ],
|
||||||
[Species.DRACOZOLT]: [ Moves.TRIPLE_AXEL, Moves.DRAGON_HAMMER, Moves.FIRE_LASH, Moves.DRAGON_DANCE ],
|
[Species.DRACOZOLT]: [ Moves.TRIPLE_AXEL, Moves.DRAGON_HAMMER, Moves.FIRE_LASH, Moves.DRAGON_DANCE ],
|
||||||
[Species.ARCTOZOLT]: [ Moves.TRIPLE_AXEL, Moves.AQUA_STEP, Moves.HIGH_HORSEPOWER, Moves.SHIFT_GEAR ],
|
[Species.ARCTOZOLT]: [ Moves.MOUNTAIN_GALE, Moves.AQUA_STEP, Moves.HIGH_HORSEPOWER, Moves.SHIFT_GEAR ],
|
||||||
[Species.DRACOVISH]: [ Moves.TRIPLE_AXEL, Moves.DRAGON_HAMMER, Moves.THUNDER_FANG, Moves.DRAGON_DANCE ],
|
[Species.DRACOVISH]: [ Moves.TRIPLE_AXEL, Moves.DRAGON_HAMMER, Moves.THUNDER_FANG, Moves.DRAGON_DANCE ],
|
||||||
[Species.ARCTOVISH]: [ Moves.ICE_FANG, Moves.THUNDER_FANG, Moves.HIGH_HORSEPOWER, Moves.SHIFT_GEAR ],
|
[Species.ARCTOVISH]: [ Moves.ICE_FANG, Moves.THUNDER_FANG, Moves.HIGH_HORSEPOWER, Moves.SHIFT_GEAR ],
|
||||||
[Species.DURALUDON]: [ Moves.CORE_ENFORCER, Moves.BODY_PRESS, Moves.RECOVER, Moves.TACHYON_CUTTER ],
|
[Species.DURALUDON]: [ Moves.CORE_ENFORCER, Moves.BODY_PRESS, Moves.RECOVER, Moves.TACHYON_CUTTER ],
|
||||||
|
@ -1,5 +1,4 @@
|
|||||||
import { ChargeAnim, MoveChargeAnim, initMoveAnim, loadMoveAnimAssets } from "./battle-anims";
|
import { ChargeAnim, MoveChargeAnim, initMoveAnim, loadMoveAnimAssets } from "./battle-anims";
|
||||||
import { BattleEndPhase, MoveEndPhase, MovePhase, NewBattlePhase, PartyStatusCurePhase, PokemonHealPhase, StatChangePhase, SwitchPhase, SwitchSummonPhase } from "../phases";
|
|
||||||
import { BattleStat, getBattleStatName } from "./battle-stat";
|
import { BattleStat, getBattleStatName } from "./battle-stat";
|
||||||
import { EncoreTag, GulpMissileTag, HelpingHandTag, SemiInvulnerableTag, ShellTrapTag, StockpilingTag, TrappedTag, TypeBoostTag } from "./battler-tags";
|
import { EncoreTag, GulpMissileTag, HelpingHandTag, SemiInvulnerableTag, ShellTrapTag, StockpilingTag, TrappedTag, TypeBoostTag } from "./battler-tags";
|
||||||
import { getPokemonNameWithAffix } from "../messages";
|
import { getPokemonNameWithAffix } from "../messages";
|
||||||
@ -28,6 +27,15 @@ import { Biome } from "#enums/biome";
|
|||||||
import { Moves } from "#enums/moves";
|
import { Moves } from "#enums/moves";
|
||||||
import { Species } from "#enums/species";
|
import { Species } from "#enums/species";
|
||||||
import { MoveUsedEvent } from "#app/events/battle-scene.js";
|
import { MoveUsedEvent } from "#app/events/battle-scene.js";
|
||||||
|
import { PartyStatusCurePhase } from "#app/phases/party-status-cure-phase.js";
|
||||||
|
import { BattleEndPhase } from "#app/phases/battle-end-phase.js";
|
||||||
|
import { MoveEndPhase } from "#app/phases/move-end-phase.js";
|
||||||
|
import { MovePhase } from "#app/phases/move-phase.js";
|
||||||
|
import { NewBattlePhase } from "#app/phases/new-battle-phase.js";
|
||||||
|
import { PokemonHealPhase } from "#app/phases/pokemon-heal-phase.js";
|
||||||
|
import { StatChangePhase } from "#app/phases/stat-change-phase.js";
|
||||||
|
import { SwitchPhase } from "#app/phases/switch-phase.js";
|
||||||
|
import { SwitchSummonPhase } from "#app/phases/switch-summon-phase.js";
|
||||||
|
|
||||||
export enum MoveCategory {
|
export enum MoveCategory {
|
||||||
PHYSICAL,
|
PHYSICAL,
|
||||||
@ -4441,7 +4449,7 @@ export class CurseAttr extends MoveEffectAttr {
|
|||||||
const curseRecoilDamage = Math.max(1, Math.floor(user.getMaxHp() / 2));
|
const curseRecoilDamage = Math.max(1, Math.floor(user.getMaxHp() / 2));
|
||||||
user.damageAndUpdate(curseRecoilDamage, HitResult.OTHER, false, true, true);
|
user.damageAndUpdate(curseRecoilDamage, HitResult.OTHER, false, true, true);
|
||||||
user.scene.queueMessage(
|
user.scene.queueMessage(
|
||||||
i18next.t("battle:cursedOnAdd", {
|
i18next.t("battlerTags:cursedOnAdd", {
|
||||||
pokemonNameWithAffix: getPokemonNameWithAffix(user),
|
pokemonNameWithAffix: getPokemonNameWithAffix(user),
|
||||||
pokemonName: getPokemonNameWithAffix(target)
|
pokemonName: getPokemonNameWithAffix(target)
|
||||||
})
|
})
|
||||||
|
@ -837,6 +837,8 @@ export const pokemonFormChanges: PokemonFormChanges = {
|
|||||||
new SpeciesFormChange(Species.CRAMORANT, "", "gorging", new SpeciesFormChangeManualTrigger, true, new SpeciesFormChangeCondition(p => p.getHpRatio() < .5)),
|
new SpeciesFormChange(Species.CRAMORANT, "", "gorging", new SpeciesFormChangeManualTrigger, true, new SpeciesFormChangeCondition(p => p.getHpRatio() < .5)),
|
||||||
new SpeciesFormChange(Species.CRAMORANT, "gulping", "", new SpeciesFormChangeManualTrigger, true),
|
new SpeciesFormChange(Species.CRAMORANT, "gulping", "", new SpeciesFormChangeManualTrigger, true),
|
||||||
new SpeciesFormChange(Species.CRAMORANT, "gorging", "", new SpeciesFormChangeManualTrigger, true),
|
new SpeciesFormChange(Species.CRAMORANT, "gorging", "", new SpeciesFormChangeManualTrigger, true),
|
||||||
|
new SpeciesFormChange(Species.CRAMORANT, "gulping", "", new SpeciesFormChangeActiveTrigger(false), true),
|
||||||
|
new SpeciesFormChange(Species.CRAMORANT, "gorging", "", new SpeciesFormChangeActiveTrigger(false), true),
|
||||||
]
|
]
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -3559,7 +3559,7 @@ export const starterPassiveAbilities = {
|
|||||||
[Species.HEATRAN]: Abilities.EARTH_EATER,
|
[Species.HEATRAN]: Abilities.EARTH_EATER,
|
||||||
[Species.REGIGIGAS]: Abilities.MINDS_EYE,
|
[Species.REGIGIGAS]: Abilities.MINDS_EYE,
|
||||||
[Species.GIRATINA]: Abilities.SHADOW_SHIELD,
|
[Species.GIRATINA]: Abilities.SHADOW_SHIELD,
|
||||||
[Species.CRESSELIA]: Abilities.MAGIC_BOUNCE,
|
[Species.CRESSELIA]: Abilities.UNAWARE,
|
||||||
[Species.PHIONE]: Abilities.SIMPLE,
|
[Species.PHIONE]: Abilities.SIMPLE,
|
||||||
[Species.MANAPHY]: Abilities.PRIMORDIAL_SEA,
|
[Species.MANAPHY]: Abilities.PRIMORDIAL_SEA,
|
||||||
[Species.DARKRAI]: Abilities.UNNERVE,
|
[Species.DARKRAI]: Abilities.UNNERVE,
|
||||||
|
@ -1577,11 +1577,11 @@ export const trainerConfigs: TrainerConfigs = {
|
|||||||
})),
|
})),
|
||||||
|
|
||||||
[TrainerType.RIVAL]: new TrainerConfig((t = TrainerType.RIVAL)).setName("Finn").setHasGenders("Ivy").setHasCharSprite().setTitle("Rival").setStaticParty().setEncounterBgm(TrainerType.RIVAL).setBattleBgm("battle_rival").setMixedBattleBgm("battle_rival").setPartyTemplates(trainerPartyTemplates.RIVAL)
|
[TrainerType.RIVAL]: new TrainerConfig((t = TrainerType.RIVAL)).setName("Finn").setHasGenders("Ivy").setHasCharSprite().setTitle("Rival").setStaticParty().setEncounterBgm(TrainerType.RIVAL).setBattleBgm("battle_rival").setMixedBattleBgm("battle_rival").setPartyTemplates(trainerPartyTemplates.RIVAL)
|
||||||
.setModifierRewardFuncs(() => modifierTypes.SUPER_EXP_CHARM, () => modifierTypes.EXP_SHARE)
|
.setModifierRewardFuncs(() => modifierTypes.SUPER_EXP_CHARM, () => modifierTypes.EXP_SHARE, () => modifierTypes.SHINY_CHARM, () => modifierTypes.ABILITY_CHARM)
|
||||||
.setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE, Species.CHIKORITA, Species.CYNDAQUIL, Species.TOTODILE, Species.TREECKO, Species.TORCHIC, Species.MUDKIP, Species.TURTWIG, Species.CHIMCHAR, Species.PIPLUP, Species.SNIVY, Species.TEPIG, Species.OSHAWOTT, Species.CHESPIN, Species.FENNEKIN, Species.FROAKIE, Species.ROWLET, Species.LITTEN, Species.POPPLIO, Species.GROOKEY, Species.SCORBUNNY, Species.SOBBLE, Species.SPRIGATITO, Species.FUECOCO, Species.QUAXLY], TrainerSlot.TRAINER, true))
|
.setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE, Species.CHIKORITA, Species.CYNDAQUIL, Species.TOTODILE, Species.TREECKO, Species.TORCHIC, Species.MUDKIP, Species.TURTWIG, Species.CHIMCHAR, Species.PIPLUP, Species.SNIVY, Species.TEPIG, Species.OSHAWOTT, Species.CHESPIN, Species.FENNEKIN, Species.FROAKIE, Species.ROWLET, Species.LITTEN, Species.POPPLIO, Species.GROOKEY, Species.SCORBUNNY, Species.SOBBLE, Species.SPRIGATITO, Species.FUECOCO, Species.QUAXLY], TrainerSlot.TRAINER, true))
|
||||||
.setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.PIDGEY, Species.HOOTHOOT, Species.TAILLOW, Species.STARLY, Species.PIDOVE, Species.FLETCHLING, Species.PIKIPEK, Species.ROOKIDEE, Species.WATTREL], TrainerSlot.TRAINER, true)),
|
.setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.PIDGEY, Species.HOOTHOOT, Species.TAILLOW, Species.STARLY, Species.PIDOVE, Species.FLETCHLING, Species.PIKIPEK, Species.ROOKIDEE, Species.WATTREL], TrainerSlot.TRAINER, true)),
|
||||||
[TrainerType.RIVAL_2]: new TrainerConfig(++t).setName("Finn").setHasGenders("Ivy").setHasCharSprite().setTitle("Rival").setStaticParty().setMoneyMultiplier(1.25).setEncounterBgm(TrainerType.RIVAL).setBattleBgm("battle_rival").setMixedBattleBgm("battle_rival").setPartyTemplates(trainerPartyTemplates.RIVAL_2)
|
[TrainerType.RIVAL_2]: new TrainerConfig(++t).setName("Finn").setHasGenders("Ivy").setHasCharSprite().setTitle("Rival").setStaticParty().setMoneyMultiplier(1.25).setEncounterBgm(TrainerType.RIVAL).setBattleBgm("battle_rival").setMixedBattleBgm("battle_rival").setPartyTemplates(trainerPartyTemplates.RIVAL_2)
|
||||||
.setModifierRewardFuncs(() => modifierTypes.EXP_SHARE)
|
.setModifierRewardFuncs(() => modifierTypes.EXP_SHARE, () => modifierTypes.SHINY_CHARM)
|
||||||
.setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.IVYSAUR, Species.CHARMELEON, Species.WARTORTLE, Species.BAYLEEF, Species.QUILAVA, Species.CROCONAW, Species.GROVYLE, Species.COMBUSKEN, Species.MARSHTOMP, Species.GROTLE, Species.MONFERNO, Species.PRINPLUP, Species.SERVINE, Species.PIGNITE, Species.DEWOTT, Species.QUILLADIN, Species.BRAIXEN, Species.FROGADIER, Species.DARTRIX, Species.TORRACAT, Species.BRIONNE, Species.THWACKEY, Species.RABOOT, Species.DRIZZILE, Species.FLORAGATO, Species.CROCALOR, Species.QUAXWELL], TrainerSlot.TRAINER, true))
|
.setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.IVYSAUR, Species.CHARMELEON, Species.WARTORTLE, Species.BAYLEEF, Species.QUILAVA, Species.CROCONAW, Species.GROVYLE, Species.COMBUSKEN, Species.MARSHTOMP, Species.GROTLE, Species.MONFERNO, Species.PRINPLUP, Species.SERVINE, Species.PIGNITE, Species.DEWOTT, Species.QUILLADIN, Species.BRAIXEN, Species.FROGADIER, Species.DARTRIX, Species.TORRACAT, Species.BRIONNE, Species.THWACKEY, Species.RABOOT, Species.DRIZZILE, Species.FLORAGATO, Species.CROCALOR, Species.QUAXWELL], TrainerSlot.TRAINER, true))
|
||||||
.setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.PIDGEOTTO, Species.HOOTHOOT, Species.TAILLOW, Species.STARAVIA, Species.TRANQUILL, Species.FLETCHINDER, Species.TRUMBEAK, Species.CORVISQUIRE, Species.WATTREL], TrainerSlot.TRAINER, true))
|
.setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.PIDGEOTTO, Species.HOOTHOOT, Species.TAILLOW, Species.STARAVIA, Species.TRANQUILL, Species.FLETCHINDER, Species.TRUMBEAK, Species.CORVISQUIRE, Species.WATTREL], TrainerSlot.TRAINER, true))
|
||||||
.setPartyMemberFunc(2, getSpeciesFilterRandomPartyMemberFunc((species: PokemonSpecies) => !pokemonEvolutions.hasOwnProperty(species.speciesId) && !pokemonPrevolutions.hasOwnProperty(species.speciesId) && species.baseTotal >= 450)),
|
.setPartyMemberFunc(2, getSpeciesFilterRandomPartyMemberFunc((species: PokemonSpecies) => !pokemonEvolutions.hasOwnProperty(species.speciesId) && !pokemonPrevolutions.hasOwnProperty(species.speciesId) && species.baseTotal >= 450)),
|
||||||
|
@ -4,7 +4,6 @@ import { Constructor } from "#app/utils";
|
|||||||
import * as Utils from "../utils";
|
import * as Utils from "../utils";
|
||||||
import PokemonSpecies, { getPokemonSpecies } from "../data/pokemon-species";
|
import PokemonSpecies, { getPokemonSpecies } from "../data/pokemon-species";
|
||||||
import { Weather, WeatherType, getTerrainClearMessage, getTerrainStartMessage, getWeatherClearMessage, getWeatherStartMessage } from "../data/weather";
|
import { Weather, WeatherType, getTerrainClearMessage, getTerrainStartMessage, getWeatherClearMessage, getWeatherStartMessage } from "../data/weather";
|
||||||
import { CommonAnimPhase } from "../phases";
|
|
||||||
import { CommonAnim } from "../data/battle-anims";
|
import { CommonAnim } from "../data/battle-anims";
|
||||||
import { Type } from "../data/type";
|
import { Type } from "../data/type";
|
||||||
import Move from "../data/move";
|
import Move from "../data/move";
|
||||||
@ -21,6 +20,7 @@ import { Moves } from "#enums/moves";
|
|||||||
import { Species } from "#enums/species";
|
import { Species } from "#enums/species";
|
||||||
import { TimeOfDay } from "#enums/time-of-day";
|
import { TimeOfDay } from "#enums/time-of-day";
|
||||||
import { TrainerType } from "#enums/trainer-type";
|
import { TrainerType } from "#enums/trainer-type";
|
||||||
|
import { CommonAnimPhase } from "#app/phases/common-anim-phase.js";
|
||||||
|
|
||||||
export class Arena {
|
export class Arena {
|
||||||
public scene: BattleScene;
|
public scene: BattleScene;
|
||||||
|
@ -17,7 +17,6 @@ import { initMoveAnim, loadMoveAnimAssets } from "../data/battle-anims";
|
|||||||
import { Status, StatusEffect, getRandomStatus } from "../data/status-effect";
|
import { Status, StatusEffect, getRandomStatus } from "../data/status-effect";
|
||||||
import { pokemonEvolutions, pokemonPrevolutions, SpeciesFormEvolution, SpeciesEvolutionCondition, FusionSpeciesFormEvolution } from "../data/pokemon-evolutions";
|
import { pokemonEvolutions, pokemonPrevolutions, SpeciesFormEvolution, SpeciesEvolutionCondition, FusionSpeciesFormEvolution } from "../data/pokemon-evolutions";
|
||||||
import { reverseCompatibleTms, tmSpecies, tmPoolTiers } from "../data/tms";
|
import { reverseCompatibleTms, tmSpecies, tmPoolTiers } from "../data/tms";
|
||||||
import { DamagePhase, FaintPhase, LearnMovePhase, MoveEffectPhase, ObtainStatusEffectPhase, StatChangePhase, SwitchSummonPhase, ToggleDoublePositionPhase, MoveEndPhase } from "../phases";
|
|
||||||
import { BattleStat } from "../data/battle-stat";
|
import { BattleStat } from "../data/battle-stat";
|
||||||
import { BattlerTag, BattlerTagLapseType, EncoreTag, GroundedTag, HighestStatBoostTag, TypeImmuneTag, getBattlerTag, SemiInvulnerableTag, TypeBoostTag, ExposedTag } from "../data/battler-tags";
|
import { BattlerTag, BattlerTagLapseType, EncoreTag, GroundedTag, HighestStatBoostTag, TypeImmuneTag, getBattlerTag, SemiInvulnerableTag, TypeBoostTag, ExposedTag } from "../data/battler-tags";
|
||||||
import { WeatherType } from "../data/weather";
|
import { WeatherType } from "../data/weather";
|
||||||
@ -51,6 +50,15 @@ import { Biome } from "#enums/biome";
|
|||||||
import { Moves } from "#enums/moves";
|
import { Moves } from "#enums/moves";
|
||||||
import { Species } from "#enums/species";
|
import { Species } from "#enums/species";
|
||||||
import { getPokemonNameWithAffix } from "#app/messages.js";
|
import { getPokemonNameWithAffix } from "#app/messages.js";
|
||||||
|
import { DamagePhase } from "#app/phases/damage-phase.js";
|
||||||
|
import { FaintPhase } from "#app/phases/faint-phase.js";
|
||||||
|
import { LearnMovePhase } from "#app/phases/learn-move-phase.js";
|
||||||
|
import { MoveEffectPhase } from "#app/phases/move-effect-phase.js";
|
||||||
|
import { MoveEndPhase } from "#app/phases/move-end-phase.js";
|
||||||
|
import { ObtainStatusEffectPhase } from "#app/phases/obtain-status-effect-phase.js";
|
||||||
|
import { StatChangePhase } from "#app/phases/stat-change-phase.js";
|
||||||
|
import { SwitchSummonPhase } from "#app/phases/switch-summon-phase.js";
|
||||||
|
import { ToggleDoublePositionPhase } from "#app/phases/toggle-double-position-phase.js";
|
||||||
|
|
||||||
export enum FieldPosition {
|
export enum FieldPosition {
|
||||||
CENTER,
|
CENTER,
|
||||||
@ -1113,8 +1121,8 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
|||||||
* by how many learnable moves there are for the {@linkcode Pokemon}.
|
* by how many learnable moves there are for the {@linkcode Pokemon}.
|
||||||
*/
|
*/
|
||||||
getLearnableLevelMoves(): Moves[] {
|
getLearnableLevelMoves(): Moves[] {
|
||||||
let levelMoves = this.getLevelMoves(1, true).map(lm => lm[1]);
|
let levelMoves = this.getLevelMoves(1, true, false, true).map(lm => lm[1]);
|
||||||
if (this.metBiome === -1 && !this.scene.gameMode.isFreshStartChallenge()) {
|
if (this.metBiome === -1 && !this.scene.gameMode.isFreshStartChallenge() && !this.scene.gameMode.isDaily) {
|
||||||
levelMoves = this.getUnlockedEggMoves().concat(levelMoves);
|
levelMoves = this.getUnlockedEggMoves().concat(levelMoves);
|
||||||
}
|
}
|
||||||
return levelMoves.filter(lm => !this.moveset.some(m => m?.moveId === lm));
|
return levelMoves.filter(lm => !this.moveset.some(m => m?.moveId === lm));
|
||||||
@ -1400,11 +1408,11 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
|||||||
*
|
*
|
||||||
* @param source - The Pokémon using the move.
|
* @param source - The Pokémon using the move.
|
||||||
* @param move - The move being used.
|
* @param move - The move being used.
|
||||||
* @returns The type damage multiplier or undefined if it's a status move
|
* @returns The type damage multiplier or 1 if it's a status move
|
||||||
*/
|
*/
|
||||||
getMoveEffectiveness(source: Pokemon, move: PokemonMove): TypeDamageMultiplier | undefined {
|
getMoveEffectiveness(source: Pokemon, move: PokemonMove): TypeDamageMultiplier {
|
||||||
if (move.getMove().category === MoveCategory.STATUS) {
|
if (move.getMove().category === MoveCategory.STATUS) {
|
||||||
return undefined;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
return this.getAttackMoveEffectiveness(source, move, !this.battleData?.abilityRevealed);
|
return this.getAttackMoveEffectiveness(source, move, !this.battleData?.abilityRevealed);
|
||||||
@ -3416,14 +3424,18 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
|||||||
* Causes a Pokemon to leave the field (such as in preparation for a switch out/escape).
|
* Causes a Pokemon to leave the field (such as in preparation for a switch out/escape).
|
||||||
* @param clearEffects Indicates if effects should be cleared (true) or passed
|
* @param clearEffects Indicates if effects should be cleared (true) or passed
|
||||||
* to the next pokemon, such as during a baton pass (false)
|
* to the next pokemon, such as during a baton pass (false)
|
||||||
|
* @param hideInfo Indicates if this should also play the animation to hide the Pokemon's
|
||||||
|
* info container.
|
||||||
*/
|
*/
|
||||||
leaveField(clearEffects: boolean = true) {
|
leaveField(clearEffects: boolean = true, hideInfo: boolean = true) {
|
||||||
this.resetTurnData();
|
this.resetTurnData();
|
||||||
if (clearEffects) {
|
if (clearEffects) {
|
||||||
this.resetSummonData();
|
this.resetSummonData();
|
||||||
this.resetBattleData();
|
this.resetBattleData();
|
||||||
}
|
}
|
||||||
this.hideInfo();
|
if (hideInfo) {
|
||||||
|
this.hideInfo();
|
||||||
|
}
|
||||||
this.setVisible(false);
|
this.setVisible(false);
|
||||||
this.scene.field.remove(this);
|
this.scene.field.remove(this);
|
||||||
this.scene.triggerPokemonFormChange(this, SpeciesFormChangeActiveTrigger, true);
|
this.scene.triggerPokemonFormChange(this, SpeciesFormChangeActiveTrigger, true);
|
||||||
@ -3973,7 +3985,7 @@ export class EnemyPokemon extends Pokemon {
|
|||||||
this.moveset = (formIndex !== undefined ? formIndex : this.formIndex)
|
this.moveset = (formIndex !== undefined ? formIndex : this.formIndex)
|
||||||
? [
|
? [
|
||||||
new PokemonMove(Moves.DYNAMAX_CANNON),
|
new PokemonMove(Moves.DYNAMAX_CANNON),
|
||||||
new PokemonMove(Moves.CROSS_POISON),
|
new PokemonMove(Moves.SLUDGE_BOMB),
|
||||||
new PokemonMove(Moves.FLAMETHROWER),
|
new PokemonMove(Moves.FLAMETHROWER),
|
||||||
new PokemonMove(Moves.RECOVER, 0, -4)
|
new PokemonMove(Moves.RECOVER, 0, -4)
|
||||||
]
|
]
|
||||||
|
@ -62,7 +62,7 @@ export class GameMode implements GameModeConfig {
|
|||||||
* @returns true if the game mode has that challenge
|
* @returns true if the game mode has that challenge
|
||||||
*/
|
*/
|
||||||
hasChallenge(challenge: Challenges): boolean {
|
hasChallenge(challenge: Challenges): boolean {
|
||||||
return this.challenges.some(c => c.id === challenge);
|
return this.challenges.some(c => c.id === challenge && c.value !== 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -42,6 +42,7 @@ export class LoadingScene extends SceneBase {
|
|||||||
this.loadImage("loading_bg", "arenas");
|
this.loadImage("loading_bg", "arenas");
|
||||||
this.loadImage("logo", "");
|
this.loadImage("logo", "");
|
||||||
// this.loadImage("pride-update", "events");
|
// this.loadImage("pride-update", "events");
|
||||||
|
this.loadImage("august-variant-update", "events");
|
||||||
|
|
||||||
// Load menu images
|
// Load menu images
|
||||||
this.loadAtlas("bg", "ui");
|
this.loadAtlas("bg", "ui");
|
||||||
|
@ -2573,7 +2573,8 @@ export const PGMdialogue: DialogueTranslationEntries = {
|
|||||||
1: `@c{shock}Wow… You cleaned me out.\nAre you actually a beginner?
|
1: `@c{shock}Wow… You cleaned me out.\nAre you actually a beginner?
|
||||||
$@c{smile}Maybe it was a bit of luck but…\nWho knows you might just be able to go all the way.
|
$@c{smile}Maybe it was a bit of luck but…\nWho knows you might just be able to go all the way.
|
||||||
$By the way, the professor asked me to give you these items. They look pretty cool.
|
$By the way, the professor asked me to give you these items. They look pretty cool.
|
||||||
$@c{serious_smile_fists}Good luck out there!`
|
$@c{serious_smile_fists}Good luck out there!
|
||||||
|
$@c{smile}Oh- and I hope you enjoy the event!`
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"rival_female": {
|
"rival_female": {
|
||||||
@ -2587,7 +2588,8 @@ export const PGMdialogue: DialogueTranslationEntries = {
|
|||||||
1: `@c{shock}You just started and you're already this strong?!@d{96}\n@c{angry}You totally cheated, didn't you?
|
1: `@c{shock}You just started and you're already this strong?!@d{96}\n@c{angry}You totally cheated, didn't you?
|
||||||
$@c{smile_wave_wink}Just kidding!@d{64} @c{smile_eclosed}I lost fair and square… I have a feeling you're going to do really well out there.
|
$@c{smile_wave_wink}Just kidding!@d{64} @c{smile_eclosed}I lost fair and square… I have a feeling you're going to do really well out there.
|
||||||
$@c{smile}By the way, the professor wanted me to give you some items. Hopefully they're helpful!
|
$@c{smile}By the way, the professor wanted me to give you some items. Hopefully they're helpful!
|
||||||
$@c{smile_wave}Do your best like always! I believe in you!`
|
$@c{smile_wave}Do your best like always! I believe in you!
|
||||||
|
$@c{smile}Oh- and I hope you enjoy the event!`
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"rival_2": {
|
"rival_2": {
|
||||||
@ -2603,7 +2605,7 @@ export const PGMdialogue: DialogueTranslationEntries = {
|
|||||||
$@c{smile}That's alright, though. I figured this might happen.\n@c{serious_mopen_fists}It just means I need to try harder for next time!\n
|
$@c{smile}That's alright, though. I figured this might happen.\n@c{serious_mopen_fists}It just means I need to try harder for next time!\n
|
||||||
$@c{smile}Oh, not that you really need the help, but I had an extra one of these lying around and figured you might want it.\n
|
$@c{smile}Oh, not that you really need the help, but I had an extra one of these lying around and figured you might want it.\n
|
||||||
$@c{serious_smile_fists}Don't expect another one after this, though!\nI can't keep giving my opponent an advantage after all.
|
$@c{serious_smile_fists}Don't expect another one after this, though!\nI can't keep giving my opponent an advantage after all.
|
||||||
$@c{smile}Anyway, take care!`
|
$@c{smile}Anyway, take care, and enjoy the event!`
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"rival_2_female": {
|
"rival_2_female": {
|
||||||
@ -2619,7 +2621,7 @@ export const PGMdialogue: DialogueTranslationEntries = {
|
|||||||
$@c{smile}Aw well. That just means I'll have to train even harder for next time!
|
$@c{smile}Aw well. That just means I'll have to train even harder for next time!
|
||||||
$@c{smile_wave}I also got you another one of these!\n@c{smile_wave_wink}No need to thank me~.
|
$@c{smile_wave}I also got you another one of these!\n@c{smile_wave_wink}No need to thank me~.
|
||||||
$@c{angry_mopen}This is the last one, though! You won't be getting anymore freebies from me after this!
|
$@c{angry_mopen}This is the last one, though! You won't be getting anymore freebies from me after this!
|
||||||
$@c{smile_wave}Keep at it!`
|
$@c{smile_wave}Keep at it, and enjoy the event!`
|
||||||
},
|
},
|
||||||
"defeat": {
|
"defeat": {
|
||||||
1: "It's OK to lose sometimes…"
|
1: "It's OK to lose sometimes…"
|
||||||
|
@ -2641,7 +2641,8 @@ export const PGMdialogue: DialogueTranslationEntries = {
|
|||||||
$@c{smile}Vielleicht war es einfach etwas Glück, aber…\nWer weiß, vielleicht schaffst du es irgendwann
|
$@c{smile}Vielleicht war es einfach etwas Glück, aber…\nWer weiß, vielleicht schaffst du es irgendwann
|
||||||
$ja wirklich ganz groß raus zu kommen.
|
$ja wirklich ganz groß raus zu kommen.
|
||||||
$Übrigens, der Professor hat mich gebeten dir diese Items zu geben. Die sehen wirklich cool aus.
|
$Übrigens, der Professor hat mich gebeten dir diese Items zu geben. Die sehen wirklich cool aus.
|
||||||
$@c{serious_smile_fists}Viel Glück da draußen!`
|
$@c{serious_smile_fists}Viel Glück da draußen!
|
||||||
|
$@c{smile}Oh-und genieße das Event!`
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"rival_female": {
|
"rival_female": {
|
||||||
@ -2656,7 +2657,8 @@ export const PGMdialogue: DialogueTranslationEntries = {
|
|||||||
1: `@c{shock}Du hast gerade erst angefangen und bist schon so stark?!@d{96} @c{angry}Du hast sowas von betrogen, oder?
|
1: `@c{shock}Du hast gerade erst angefangen und bist schon so stark?!@d{96} @c{angry}Du hast sowas von betrogen, oder?
|
||||||
$@c{smile_wave_wink}Ich mach nur Spaß!@d{64} @c{smile_eclosed}Ich habe ehrlich verloren… Ich habe das Gefühl, dass du es dort draußen weit bringen wirst.
|
$@c{smile_wave_wink}Ich mach nur Spaß!@d{64} @c{smile_eclosed}Ich habe ehrlich verloren… Ich habe das Gefühl, dass du es dort draußen weit bringen wirst.
|
||||||
$@c{smile}Übrigens, der Professor hat mich gebeten dir diese Items zu geben. Ich hoffe sie sind hilfreich!
|
$@c{smile}Übrigens, der Professor hat mich gebeten dir diese Items zu geben. Ich hoffe sie sind hilfreich!
|
||||||
$@c{smile_wave}Gib wie immer dein Bestes! Ich glaube an dich!`
|
$@c{smile_wave}Gib wie immer dein Bestes! Ich glaube an dich!
|
||||||
|
$@c{smile}Oh-und genieße das Event!`
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"rival_2": {
|
"rival_2": {
|
||||||
@ -2674,7 +2676,7 @@ export const PGMdialogue: DialogueTranslationEntries = {
|
|||||||
$@c{smile}Nicht, dass du wirklich Hilfe benötigen würdest, aber ich habe hier noch eins von diesen Dingern herumliegen.
|
$@c{smile}Nicht, dass du wirklich Hilfe benötigen würdest, aber ich habe hier noch eins von diesen Dingern herumliegen.
|
||||||
$Du kannst es haben.\n
|
$Du kannst es haben.\n
|
||||||
$@c{serious_smile_fists}Erwarte aber nicht, dass ich dir noch mehr gebe!\nIch kann meinen Rivalen doch keine Vorteile verschaffen.
|
$@c{serious_smile_fists}Erwarte aber nicht, dass ich dir noch mehr gebe!\nIch kann meinen Rivalen doch keine Vorteile verschaffen.
|
||||||
$@c{smile}Egal, pass auf dich auf!`
|
$@c{smile}Egal, pass auf dich auf und genieße das Event!`
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"rival_2_female": {
|
"rival_2_female": {
|
||||||
@ -2690,7 +2692,7 @@ export const PGMdialogue: DialogueTranslationEntries = {
|
|||||||
$@c{smile}Na gut. Das bedeutet ich muss noch härter tranieren!
|
$@c{smile}Na gut. Das bedeutet ich muss noch härter tranieren!
|
||||||
$@c{smile_wave}Ich habe noch eins von diesen Dingern!\n@c{smile_wave_wink}Kein Grund mir zu danken~.
|
$@c{smile_wave}Ich habe noch eins von diesen Dingern!\n@c{smile_wave_wink}Kein Grund mir zu danken~.
|
||||||
$@c{angry_mopen}Das ist aber das Letzte! Du bekommst ab jett keine Geschenke mehr von mir!
|
$@c{angry_mopen}Das ist aber das Letzte! Du bekommst ab jett keine Geschenke mehr von mir!
|
||||||
$@c{smile_wave}Bleib stark!`
|
$@c{smile_wave}Bleib stark und genieße das Event!`
|
||||||
},
|
},
|
||||||
"defeat": {
|
"defeat": {
|
||||||
1: "Es ist Ok manchmal zu verlieren…"
|
1: "Es ist Ok manchmal zu verlieren…"
|
||||||
|
@ -2574,7 +2574,8 @@ export const PGMdialogue: DialogueTranslationEntries = {
|
|||||||
1: `@c{shock}Wow… You cleaned me out.\nAre you actually a beginner?
|
1: `@c{shock}Wow… You cleaned me out.\nAre you actually a beginner?
|
||||||
$@c{smile}Maybe it was a bit of luck but…\nWho knows you might just be able to go all the way.
|
$@c{smile}Maybe it was a bit of luck but…\nWho knows you might just be able to go all the way.
|
||||||
$By the way, the professor asked me to give you these items. They look pretty cool.
|
$By the way, the professor asked me to give you these items. They look pretty cool.
|
||||||
$@c{serious_smile_fists}Good luck out there!`
|
$@c{serious_smile_fists}Good luck out there!
|
||||||
|
$@c{smile}Oh- and I hope you enjoy the event!`
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"rival_female": {
|
"rival_female": {
|
||||||
@ -2588,7 +2589,8 @@ export const PGMdialogue: DialogueTranslationEntries = {
|
|||||||
1: `@c{shock}You just started and you're already this strong?!@d{96}\n@c{angry}You totally cheated, didn't you?
|
1: `@c{shock}You just started and you're already this strong?!@d{96}\n@c{angry}You totally cheated, didn't you?
|
||||||
$@c{smile_wave_wink}Just kidding!@d{64} @c{smile_eclosed}I lost fair and square… I have a feeling you're going to do really well out there.
|
$@c{smile_wave_wink}Just kidding!@d{64} @c{smile_eclosed}I lost fair and square… I have a feeling you're going to do really well out there.
|
||||||
$@c{smile}By the way, the professor wanted me to give you some items. Hopefully they're helpful!
|
$@c{smile}By the way, the professor wanted me to give you some items. Hopefully they're helpful!
|
||||||
$@c{smile_wave}Do your best like always! I believe in you!`
|
$@c{smile_wave}Do your best like always! I believe in you!
|
||||||
|
$@c{smile}Oh- and I hope you enjoy the event!`
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"rival_2": {
|
"rival_2": {
|
||||||
@ -2602,9 +2604,9 @@ export const PGMdialogue: DialogueTranslationEntries = {
|
|||||||
"victory": {
|
"victory": {
|
||||||
1: `@c{neutral_eclosed}Oh. I guess I was overconfident.
|
1: `@c{neutral_eclosed}Oh. I guess I was overconfident.
|
||||||
$@c{smile}That's alright, though. I figured this might happen.\n@c{serious_mopen_fists}It just means I need to try harder for next time!\n
|
$@c{smile}That's alright, though. I figured this might happen.\n@c{serious_mopen_fists}It just means I need to try harder for next time!\n
|
||||||
$@c{smile}Oh, not that you really need the help, but I had an extra one of these lying around and figured you might want it.\n
|
$@c{smile}Oh, not that you really need the help, but I had an extra one of each of these lying around and figured you might want them.\n
|
||||||
$@c{serious_smile_fists}Don't expect another one after this, though!\nI can't keep giving my opponent an advantage after all.
|
$@c{serious_smile_fists}Don't expect another one after this, though!\nI can't keep giving my opponent an advantage after all.
|
||||||
$@c{smile}Anyway, take care!`
|
$@c{smile}Anyway, take care, and enjoy the event!`
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"rival_2_female": {
|
"rival_2_female": {
|
||||||
@ -2618,9 +2620,9 @@ export const PGMdialogue: DialogueTranslationEntries = {
|
|||||||
"victory": {
|
"victory": {
|
||||||
1: `@c{neutral}I… wasn't supposed to lose that time…
|
1: `@c{neutral}I… wasn't supposed to lose that time…
|
||||||
$@c{smile}Aw well. That just means I'll have to train even harder for next time!
|
$@c{smile}Aw well. That just means I'll have to train even harder for next time!
|
||||||
$@c{smile_wave}I also got you another one of these!\n@c{smile_wave_wink}No need to thank me~.
|
$@c{smile_wave}I also got you another two of these!\n@c{smile_wave_wink}No need to thank me~.
|
||||||
$@c{angry_mopen}This is the last one, though! You won't be getting anymore freebies from me after this!
|
$@c{angry_mopen}This is the last one, though! You won't be getting anymore freebies from me after this!
|
||||||
$@c{smile_wave}Keep at it!`
|
$@c{smile_wave}Keep at it, and enjoy the event!`
|
||||||
},
|
},
|
||||||
"defeat": {
|
"defeat": {
|
||||||
1: "It's OK to lose sometimes…"
|
1: "It's OK to lose sometimes…"
|
||||||
|
@ -2569,7 +2569,8 @@ export const PGMdialogue: DialogueTranslationEntries = {
|
|||||||
1: `@c{shock}Wow… You cleaned me out.\nAre you actually a beginner?
|
1: `@c{shock}Wow… You cleaned me out.\nAre you actually a beginner?
|
||||||
$@c{smile}Maybe it was a bit of luck but…\nWho knows you might just be able to go all the way.
|
$@c{smile}Maybe it was a bit of luck but…\nWho knows you might just be able to go all the way.
|
||||||
$By the way, the professor asked me to give you these items. They look pretty cool.
|
$By the way, the professor asked me to give you these items. They look pretty cool.
|
||||||
$@c{serious_smile_fists}Good luck out there!`
|
$@c{serious_smile_fists}Good luck out there!
|
||||||
|
$@c{smile}Oh- and I hope you enjoy the event!`
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"rival_female": {
|
"rival_female": {
|
||||||
@ -2583,7 +2584,8 @@ export const PGMdialogue: DialogueTranslationEntries = {
|
|||||||
1: `@c{shock}You just started and you're already this strong?!@d{96}\n@c{angry}You totally cheated, didn't you?
|
1: `@c{shock}You just started and you're already this strong?!@d{96}\n@c{angry}You totally cheated, didn't you?
|
||||||
$@c{smile_wave_wink}Just kidding!@d{64} @c{smile_eclosed}I lost fair and square… I have a feeling you're going to do really well out there.
|
$@c{smile_wave_wink}Just kidding!@d{64} @c{smile_eclosed}I lost fair and square… I have a feeling you're going to do really well out there.
|
||||||
$@c{smile}By the way, the professor wanted me to give you some items. Hopefully they're helpful!
|
$@c{smile}By the way, the professor wanted me to give you some items. Hopefully they're helpful!
|
||||||
$@c{smile_wave}Do your best like always! I believe in you!`
|
$@c{smile_wave}Do your best like always! I believe in you!
|
||||||
|
$@c{smile}Oh- and I hope you enjoy the event!`
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"rival_2": {
|
"rival_2": {
|
||||||
@ -2599,7 +2601,7 @@ export const PGMdialogue: DialogueTranslationEntries = {
|
|||||||
$@c{smile}That's alright, though. I figured this might happen.\n@c{serious_mopen_fists}It just means I need to try harder for next time!\n
|
$@c{smile}That's alright, though. I figured this might happen.\n@c{serious_mopen_fists}It just means I need to try harder for next time!\n
|
||||||
$@c{smile}Oh, not that you really need the help, but I had an extra one of these lying around and figured you might want it.\n
|
$@c{smile}Oh, not that you really need the help, but I had an extra one of these lying around and figured you might want it.\n
|
||||||
$@c{serious_smile_fists}Don't expect another one after this, though!\nI can't keep giving my opponent an advantage after all.
|
$@c{serious_smile_fists}Don't expect another one after this, though!\nI can't keep giving my opponent an advantage after all.
|
||||||
$@c{smile}Anyway, take care!`
|
$@c{smile}Anyway, take care, and enjoy the event!`
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"rival_2_female": {
|
"rival_2_female": {
|
||||||
@ -2615,7 +2617,7 @@ export const PGMdialogue: DialogueTranslationEntries = {
|
|||||||
$@c{smile}Aw well. That just means I'll have to train even harder for next time!
|
$@c{smile}Aw well. That just means I'll have to train even harder for next time!
|
||||||
$@c{smile_wave}I also got you another one of these!\n@c{smile_wave_wink}No need to thank me~.
|
$@c{smile_wave}I also got you another one of these!\n@c{smile_wave_wink}No need to thank me~.
|
||||||
$@c{angry_mopen}This is the last one, though! You won't be getting anymore freebies from me after this!
|
$@c{angry_mopen}This is the last one, though! You won't be getting anymore freebies from me after this!
|
||||||
$@c{smile_wave}Keep at it!`
|
$@c{smile_wave}Keep at it, and enjoy the event!`
|
||||||
},
|
},
|
||||||
"defeat": {
|
"defeat": {
|
||||||
1: "It's OK to lose sometimes…"
|
1: "It's OK to lose sometimes…"
|
||||||
|
@ -2372,7 +2372,8 @@ export const PGMdialogue: DialogueTranslationEntries = {
|
|||||||
1: `@c{shock}Wah… Tu m’as vraiment lavé.\nT’es vraiment un débutant ?
|
1: `@c{shock}Wah… Tu m’as vraiment lavé.\nT’es vraiment un débutant ?
|
||||||
$@c{smile}T’as peut-être eu de la chance, mais…\nPeut-être que t’arriveras jusqu’au bout du chemin.
|
$@c{smile}T’as peut-être eu de la chance, mais…\nPeut-être que t’arriveras jusqu’au bout du chemin.
|
||||||
$D’ailleurs, le prof m’a demandé de te filer ces objets.\nIls ont l’air sympas.
|
$D’ailleurs, le prof m’a demandé de te filer ces objets.\nIls ont l’air sympas.
|
||||||
$@c{serious_smile_fists}Bonne chance à toi !`
|
$@c{serious_smile_fists}Bonne chance à toi !
|
||||||
|
$@c{smile}Oh, et profite bien de l’évènement !`
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"rival_female": {
|
"rival_female": {
|
||||||
@ -2386,7 +2387,8 @@ export const PGMdialogue: DialogueTranslationEntries = {
|
|||||||
1: `@c{shock}Tu viens de commencer et t’es déjà si fort ?!@d{96}\n@c{angry}T’as triché non ? Avoue !
|
1: `@c{shock}Tu viens de commencer et t’es déjà si fort ?!@d{96}\n@c{angry}T’as triché non ? Avoue !
|
||||||
$@c{smile_wave_wink}J’déconne !@d{64} @c{smile_eclosed}J’ai perdu dans les règles…\nJ’ai le sentiment que tu vas très bien t’en sortir.
|
$@c{smile_wave_wink}J’déconne !@d{64} @c{smile_eclosed}J’ai perdu dans les règles…\nJ’ai le sentiment que tu vas très bien t’en sortir.
|
||||||
$@c{smile}D’ailleurs, le prof veut que je te donne ces quelques objets. Ils te seront utiles, pour sûr !
|
$@c{smile}D’ailleurs, le prof veut que je te donne ces quelques objets. Ils te seront utiles, pour sûr !
|
||||||
$@c{smile_wave}Fais de ton mieux, comme toujours !\nJe crois fort en toi !`
|
$@c{smile_wave}Fais de ton mieux, comme toujours !\nJe crois fort en toi !
|
||||||
|
$@c{smile}Oh, et profite bien de l’évènement !`
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"rival_2": {
|
"rival_2": {
|
||||||
@ -2402,7 +2404,7 @@ export const PGMdialogue: DialogueTranslationEntries = {
|
|||||||
$@c{smile}Pas grave, c’est OK. Je me doutais que ça arriverait.\n@c{serious_mopen_fists}Je vais juste devoir encore plus m’entrainer !\n
|
$@c{smile}Pas grave, c’est OK. Je me doutais que ça arriverait.\n@c{serious_mopen_fists}Je vais juste devoir encore plus m’entrainer !\n
|
||||||
$@c{smile}Ah, et pas que t’aies réellement besoin d’aide, mais j’ai ça en trop sur moi qui pourrait t’intéresser.\n
|
$@c{smile}Ah, et pas que t’aies réellement besoin d’aide, mais j’ai ça en trop sur moi qui pourrait t’intéresser.\n
|
||||||
$@c{serious_smile_fists}Mais n’espère plus en avoir d’autres !\nJe peux pas passer mon temps à aider mon adversaire.
|
$@c{serious_smile_fists}Mais n’espère plus en avoir d’autres !\nJe peux pas passer mon temps à aider mon adversaire.
|
||||||
$@c{smile}Bref, prends soin de toi !`
|
$@c{smile}Bref, prends soin de toi et profite bien de l’évènement !`
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"rival_2_female": {
|
"rival_2_female": {
|
||||||
@ -2417,8 +2419,8 @@ export const PGMdialogue: DialogueTranslationEntries = {
|
|||||||
1: `@c{neutral}Je… J’étais pas encore supposée perdre…
|
1: `@c{neutral}Je… J’étais pas encore supposée perdre…
|
||||||
$@c{smile}Bon. Ça veut juste dire que je vais devoir encore plus m’entrainer !
|
$@c{smile}Bon. Ça veut juste dire que je vais devoir encore plus m’entrainer !
|
||||||
$@c{smile_wave}J’ai aussi ça en rab pour toi !\n@c{smile_wave_wink}Inutile de me remercier ~.
|
$@c{smile_wave}J’ai aussi ça en rab pour toi !\n@c{smile_wave_wink}Inutile de me remercier ~.
|
||||||
$@c{angry_mopen}C’était le dernier, terminé les cadeaux après celui-là !
|
$@c{angry_mopen}C’étaient les derniers, terminé les cadeaux après ceux-là !
|
||||||
$@c{smile_wave}Allez, tiens le coup !`
|
$@c{smile_wave}Allez, tiens le coup et profite bien de l’évènement !`
|
||||||
},
|
},
|
||||||
"defeat": {
|
"defeat": {
|
||||||
1: "Je suppose que c’est parfois normal de perdre…"
|
1: "Je suppose que c’est parfois normal de perdre…"
|
||||||
@ -5051,7 +5053,8 @@ export const PGFdialogue: DialogueTranslationEntries = {
|
|||||||
1: `@c{shock}Wah… Tu m’as vraiment lavé.\nT’es vraiment une débutante ?
|
1: `@c{shock}Wah… Tu m’as vraiment lavé.\nT’es vraiment une débutante ?
|
||||||
$@c{smile}T’as peut-être eu de la chance, mais…\nPeut-être que t’arriveras jusqu’au bout du chemin.
|
$@c{smile}T’as peut-être eu de la chance, mais…\nPeut-être que t’arriveras jusqu’au bout du chemin.
|
||||||
$D’ailleurs, le prof m’a demandé de te filer ces objets.\nIls ont l’air sympas.
|
$D’ailleurs, le prof m’a demandé de te filer ces objets.\nIls ont l’air sympas.
|
||||||
$@c{serious_smile_fists}Bonne chance à toi !`
|
$@c{serious_smile_fists}Bonne chance à toi !
|
||||||
|
$@c{smile}Oh, et profite bien de l’évènement !`
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"rival_female": {
|
"rival_female": {
|
||||||
@ -5065,7 +5068,8 @@ export const PGFdialogue: DialogueTranslationEntries = {
|
|||||||
1: `@c{shock}Tu viens de commencer et t’es déjà si forte ?!@d{96}\n@c{angry}T’as triché non ? Avoue !
|
1: `@c{shock}Tu viens de commencer et t’es déjà si forte ?!@d{96}\n@c{angry}T’as triché non ? Avoue !
|
||||||
$@c{smile_wave_wink}J’déconne !@d{64} @c{smile_eclosed}J’ai perdu dans les règles…\nJ’ai le sentiment que tu vas très bien t’en sortir.
|
$@c{smile_wave_wink}J’déconne !@d{64} @c{smile_eclosed}J’ai perdu dans les règles…\nJ’ai le sentiment que tu vas très bien t’en sortir.
|
||||||
$@c{smile}D’ailleurs, le prof veut que je te donne ces quelques objets. Ils te seront utiles, pour sûr !
|
$@c{smile}D’ailleurs, le prof veut que je te donne ces quelques objets. Ils te seront utiles, pour sûr !
|
||||||
$@c{smile_wave}Fais de ton mieux, comme toujours !\nJe crois fort en toi !`
|
$@c{smile_wave}Fais de ton mieux, comme toujours !\nJe crois fort en toi !
|
||||||
|
$@c{smile}Oh, et profite bien de l’évènement !`
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"rival_2": {
|
"rival_2": {
|
||||||
@ -5081,7 +5085,7 @@ export const PGFdialogue: DialogueTranslationEntries = {
|
|||||||
$@c{smile}Pas grave, c’est OK. Je me doutais que ça arriverait.\n@c{serious_mopen_fists}Je vais juste devoir encore plus m’entrainer !\n
|
$@c{smile}Pas grave, c’est OK. Je me doutais que ça arriverait.\n@c{serious_mopen_fists}Je vais juste devoir encore plus m’entrainer !\n
|
||||||
$@c{smile}Ah, et pas que t’aies réellement besoin d’aide, mais j’ai ça en trop sur moi qui pourrait t’intéresser.\n
|
$@c{smile}Ah, et pas que t’aies réellement besoin d’aide, mais j’ai ça en trop sur moi qui pourrait t’intéresser.\n
|
||||||
$@c{serious_smile_fists}Mais n’espère plus en avoir d’autres !\nJe peux pas passer mon temps à aider mon adversaire.
|
$@c{serious_smile_fists}Mais n’espère plus en avoir d’autres !\nJe peux pas passer mon temps à aider mon adversaire.
|
||||||
$@c{smile}Bref, prends soin de toi !`
|
$@c{smile}Bref, prends soin de toi et profite bien de l’évènement !`
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"rival_2_female": {
|
"rival_2_female": {
|
||||||
@ -5097,7 +5101,7 @@ export const PGFdialogue: DialogueTranslationEntries = {
|
|||||||
$@c{smile}Bon. Ça veut juste dire que je vais devoir encore plus m’entrainer !
|
$@c{smile}Bon. Ça veut juste dire que je vais devoir encore plus m’entrainer !
|
||||||
$@c{smile_wave}J’ai aussi ça en rab pour toi !\n@c{smile_wave_wink}Inutile de me remercier ~.
|
$@c{smile_wave}J’ai aussi ça en rab pour toi !\n@c{smile_wave_wink}Inutile de me remercier ~.
|
||||||
$@c{angry_mopen}C’était le dernier, terminé les cadeaux après celui-là !
|
$@c{angry_mopen}C’était le dernier, terminé les cadeaux après celui-là !
|
||||||
$@c{smile_wave}Allez, tiens le coup !`
|
$@c{smile_wave}Allez, tiens le coup et profite bien de l’évènement !`
|
||||||
},
|
},
|
||||||
"defeat": {
|
"defeat": {
|
||||||
1: "Je suppose que c’est parfois normal de perdre…"
|
1: "Je suppose que c’est parfois normal de perdre…"
|
||||||
|
@ -2569,7 +2569,8 @@ export const PGMdialogue: DialogueTranslationEntries = {
|
|||||||
1: `@c{shock}Wow… You cleaned me out.\nAre you actually a beginner?
|
1: `@c{shock}Wow… You cleaned me out.\nAre you actually a beginner?
|
||||||
$@c{smile}Maybe it was a bit of luck but…\nWho knows you might just be able to go all the way.
|
$@c{smile}Maybe it was a bit of luck but…\nWho knows you might just be able to go all the way.
|
||||||
$By the way, the professor asked me to give you these items. They look pretty cool.
|
$By the way, the professor asked me to give you these items. They look pretty cool.
|
||||||
$@c{serious_smile_fists}Good luck out there!`
|
$@c{serious_smile_fists}Good luck out there!
|
||||||
|
$@c{smile}Oh- and I hope you enjoy the event!`
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"rival_female": {
|
"rival_female": {
|
||||||
@ -2583,7 +2584,8 @@ export const PGMdialogue: DialogueTranslationEntries = {
|
|||||||
1: `@c{shock}You just started and you're already this strong?!@d{96}\n@c{angry}You totally cheated, didn't you?
|
1: `@c{shock}You just started and you're already this strong?!@d{96}\n@c{angry}You totally cheated, didn't you?
|
||||||
$@c{smile_wave_wink}Just kidding!@d{64} @c{smile_eclosed}I lost fair and square… I have a feeling you're going to do really well out there.
|
$@c{smile_wave_wink}Just kidding!@d{64} @c{smile_eclosed}I lost fair and square… I have a feeling you're going to do really well out there.
|
||||||
$@c{smile}By the way, the professor wanted me to give you some items. Hopefully they're helpful!
|
$@c{smile}By the way, the professor wanted me to give you some items. Hopefully they're helpful!
|
||||||
$@c{smile_wave}Do your best like always! I believe in you!`
|
$@c{smile_wave}Do your best like always! I believe in you!
|
||||||
|
$@c{smile}Oh- and I hope you enjoy the event!`
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"rival_2": {
|
"rival_2": {
|
||||||
@ -2599,7 +2601,7 @@ export const PGMdialogue: DialogueTranslationEntries = {
|
|||||||
$@c{smile}That's alright, though. I figured this might happen.\n@c{serious_mopen_fists}It just means I need to try harder for next time!\n
|
$@c{smile}That's alright, though. I figured this might happen.\n@c{serious_mopen_fists}It just means I need to try harder for next time!\n
|
||||||
$@c{smile}Oh, not that you really need the help, but I had an extra one of these lying around and figured you might want it.\n
|
$@c{smile}Oh, not that you really need the help, but I had an extra one of these lying around and figured you might want it.\n
|
||||||
$@c{serious_smile_fists}Don't expect another one after this, though!\nI can't keep giving my opponent an advantage after all.
|
$@c{serious_smile_fists}Don't expect another one after this, though!\nI can't keep giving my opponent an advantage after all.
|
||||||
$@c{smile}Anyway, take care!`
|
$@c{smile}Anyway, take care, and enjoy the event!`
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"rival_2_female": {
|
"rival_2_female": {
|
||||||
@ -2615,7 +2617,7 @@ export const PGMdialogue: DialogueTranslationEntries = {
|
|||||||
$@c{smile}Aw well. That just means I'll have to train even harder for next time!
|
$@c{smile}Aw well. That just means I'll have to train even harder for next time!
|
||||||
$@c{smile_wave}I also got you another one of these!\n@c{smile_wave_wink}No need to thank me~.
|
$@c{smile_wave}I also got you another one of these!\n@c{smile_wave_wink}No need to thank me~.
|
||||||
$@c{angry_mopen}This is the last one, though! You won't be getting anymore freebies from me after this!
|
$@c{angry_mopen}This is the last one, though! You won't be getting anymore freebies from me after this!
|
||||||
$@c{smile_wave}Keep at it!`
|
$@c{smile_wave}Keep at it, and enjoy the event!`
|
||||||
},
|
},
|
||||||
"defeat": {
|
"defeat": {
|
||||||
1: "It's OK to lose sometimes…"
|
1: "It's OK to lose sometimes…"
|
||||||
|
@ -2573,7 +2573,8 @@ export const PGMdialogue: DialogueTranslationEntries = {
|
|||||||
1: `@c{shock}Wow… You cleaned me out.\nAre you actually a beginner?
|
1: `@c{shock}Wow… You cleaned me out.\nAre you actually a beginner?
|
||||||
$@c{smile}Maybe it was a bit of luck but…\nWho knows you might just be able to go all the way.
|
$@c{smile}Maybe it was a bit of luck but…\nWho knows you might just be able to go all the way.
|
||||||
$By the way, the professor asked me to give you these items. They look pretty cool.
|
$By the way, the professor asked me to give you these items. They look pretty cool.
|
||||||
$@c{serious_smile_fists}Good luck out there!`
|
$@c{serious_smile_fists}Good luck out there!
|
||||||
|
$@c{smile}Oh- and I hope you enjoy the event!`
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"rival_female": {
|
"rival_female": {
|
||||||
@ -2587,7 +2588,8 @@ export const PGMdialogue: DialogueTranslationEntries = {
|
|||||||
1: `@c{shock}You just started and you're already this strong?!@d{96}\n@c{angry}You totally cheated, didn't you?
|
1: `@c{shock}You just started and you're already this strong?!@d{96}\n@c{angry}You totally cheated, didn't you?
|
||||||
$@c{smile_wave_wink}Just kidding!@d{64} @c{smile_eclosed}I lost fair and square… I have a feeling you're going to do really well out there.
|
$@c{smile_wave_wink}Just kidding!@d{64} @c{smile_eclosed}I lost fair and square… I have a feeling you're going to do really well out there.
|
||||||
$@c{smile}By the way, the professor wanted me to give you some items. Hopefully they're helpful!
|
$@c{smile}By the way, the professor wanted me to give you some items. Hopefully they're helpful!
|
||||||
$@c{smile_wave}Do your best like always! I believe in you!`
|
$@c{smile_wave}Do your best like always! I believe in you!
|
||||||
|
$@c{smile}Oh- and I hope you enjoy the event!`
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"rival_2": {
|
"rival_2": {
|
||||||
@ -2603,7 +2605,7 @@ export const PGMdialogue: DialogueTranslationEntries = {
|
|||||||
$@c{smile}That's alright, though. I figured this might happen.\n@c{serious_mopen_fists}It just means I need to try harder for next time!\n
|
$@c{smile}That's alright, though. I figured this might happen.\n@c{serious_mopen_fists}It just means I need to try harder for next time!\n
|
||||||
$@c{smile}Oh, not that you really need the help, but I had an extra one of these lying around and figured you might want it.\n
|
$@c{smile}Oh, not that you really need the help, but I had an extra one of these lying around and figured you might want it.\n
|
||||||
$@c{serious_smile_fists}Don't expect another one after this, though!\nI can't keep giving my opponent an advantage after all.
|
$@c{serious_smile_fists}Don't expect another one after this, though!\nI can't keep giving my opponent an advantage after all.
|
||||||
$@c{smile}Anyway, take care!`
|
$@c{smile}Anyway, take care, and enjoy the event!`
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"rival_2_female": {
|
"rival_2_female": {
|
||||||
@ -2619,7 +2621,7 @@ export const PGMdialogue: DialogueTranslationEntries = {
|
|||||||
$@c{smile}Aw well. That just means I'll have to train even harder for next time!
|
$@c{smile}Aw well. That just means I'll have to train even harder for next time!
|
||||||
$@c{smile_wave}I also got you another one of these!\n@c{smile_wave_wink}No need to thank me~.
|
$@c{smile_wave}I also got you another one of these!\n@c{smile_wave_wink}No need to thank me~.
|
||||||
$@c{angry_mopen}This is the last one, though! You won't be getting anymore freebies from me after this!
|
$@c{angry_mopen}This is the last one, though! You won't be getting anymore freebies from me after this!
|
||||||
$@c{smile_wave}Keep at it!`
|
$@c{smile_wave}Keep at it, and enjoy the event!`
|
||||||
},
|
},
|
||||||
"defeat": {
|
"defeat": {
|
||||||
1: "It's OK to lose sometimes…"
|
1: "It's OK to lose sometimes…"
|
||||||
|
@ -2569,7 +2569,8 @@ export const PGMdialogue: DialogueTranslationEntries = {
|
|||||||
1: `@c{shock}와… 정말 깔끔하게 당했네.\n초보자 맞아?
|
1: `@c{shock}와… 정말 깔끔하게 당했네.\n초보자 맞아?
|
||||||
$@c{smile}운이 따른 건지도 모르겠지만…\n그래도 정말 꿈을 이룰 지도.
|
$@c{smile}운이 따른 건지도 모르겠지만…\n그래도 정말 꿈을 이룰 지도.
|
||||||
$그나저나, 박사님께서 이걸 전해달라고 하시더라.\n좋아 보이던데.
|
$그나저나, 박사님께서 이걸 전해달라고 하시더라.\n좋아 보이던데.
|
||||||
$@c{serious_smile_fists}아무튼, 힘 내는거야!`
|
$@c{serious_smile_fists}아무튼, 힘 내는거야!
|
||||||
|
$@c{smile}아- 그리고 이벤트 즐겁게 보내!`
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"rival_female": {
|
"rival_female": {
|
||||||
@ -2583,7 +2584,8 @@ export const PGMdialogue: DialogueTranslationEntries = {
|
|||||||
1: `@c{shock}왜 벌써 이렇게 센 건데?!@d{96}\n@c{angry}아니면 뭔가 속임수, 그런 거?
|
1: `@c{shock}왜 벌써 이렇게 센 건데?!@d{96}\n@c{angry}아니면 뭔가 속임수, 그런 거?
|
||||||
$@c{smile_wave_wink}농담, 농담!@d{64} @c{smile_eclosed}내가 진 거 맞아…\n너 정말 앞으로도 잘 하겠는데.
|
$@c{smile_wave_wink}농담, 농담!@d{64} @c{smile_eclosed}내가 진 거 맞아…\n너 정말 앞으로도 잘 하겠는데.
|
||||||
$@c{smile}아 그래, 박사님께서 전해달라던 물건.\n도움이 되면 좋겠어!
|
$@c{smile}아 그래, 박사님께서 전해달라던 물건.\n도움이 되면 좋겠어!
|
||||||
$@c{smile_wave}항상 최선을 다 하라구! 믿고 있을게!`
|
$@c{smile_wave}항상 최선을 다 하라구! 믿고 있을게!
|
||||||
|
$@c{smile}아- 그리고 이벤트 즐겁게 보내!`
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"rival_2": {
|
"rival_2": {
|
||||||
@ -2599,7 +2601,7 @@ export const PGMdialogue: DialogueTranslationEntries = {
|
|||||||
$@c{smile}그래, 또 지고 말았네.\n@c{serious_mopen_fists}좀 더 열심히 훈련을 해야겠어!\n
|
$@c{smile}그래, 또 지고 말았네.\n@c{serious_mopen_fists}좀 더 열심히 훈련을 해야겠어!\n
|
||||||
$@c{smile}너한테 도움이 필요할 것 같지는 않지만, 이거.\n남는 게 있어서 말이야.
|
$@c{smile}너한테 도움이 필요할 것 같지는 않지만, 이거.\n남는 게 있어서 말이야.
|
||||||
$@c{serious_smile_fists}물론 이번이 마지막이야, 알겠지?\n공평하게 하지 않으면 그게 내 핑계거리가 되고 말거야.
|
$@c{serious_smile_fists}물론 이번이 마지막이야, 알겠지?\n공평하게 하지 않으면 그게 내 핑계거리가 되고 말거야.
|
||||||
$@c{smile}이제 갈게. 앞으로도 조심하고!`
|
$@c{smile}이제 갈게. 앞으로도 조심하고, 이벤트도 즐겁게 보내!`
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"rival_2_female": {
|
"rival_2_female": {
|
||||||
@ -2615,7 +2617,7 @@ export const PGMdialogue: DialogueTranslationEntries = {
|
|||||||
$@c{smile}으, 그래. 더 열심히 훈련하면 되겠지!
|
$@c{smile}으, 그래. 더 열심히 훈련하면 되겠지!
|
||||||
$@c{smile_wave}이것도 하나 더 챙겨왔으니 받아!\n@c{smile_wave_wink}감사 인사는 됐다구~.
|
$@c{smile_wave}이것도 하나 더 챙겨왔으니 받아!\n@c{smile_wave_wink}감사 인사는 됐다구~.
|
||||||
$@c{angry_mopen}하지만, 마지막이야!\n또 이렇게 공짜로 나눠주진 않을 테니까!
|
$@c{angry_mopen}하지만, 마지막이야!\n또 이렇게 공짜로 나눠주진 않을 테니까!
|
||||||
$@c{smile_wave}그럼!`
|
$@c{smile_wave}그럼! 이벤트 잘 즐기고!`
|
||||||
},
|
},
|
||||||
"defeat": {
|
"defeat": {
|
||||||
1: "가끔은 지는 것도 괜찮아…"
|
1: "가끔은 지는 것도 괜찮아…"
|
||||||
|
@ -2541,7 +2541,8 @@ export const PGMdialogue: DialogueTranslationEntries = {
|
|||||||
1: `@c{shock}Caramba… Você me limpou.\nVocê é mesmo um novato?
|
1: `@c{shock}Caramba… Você me limpou.\nVocê é mesmo um novato?
|
||||||
$@c{smile}Talvez tenha sido um pouco de sorte, mas…\nQuem sabe você consiga chegar até o fim.
|
$@c{smile}Talvez tenha sido um pouco de sorte, mas…\nQuem sabe você consiga chegar até o fim.
|
||||||
$Aliás, o professor me pediu para te dar esses itens. Eles parecem bem legais.
|
$Aliás, o professor me pediu para te dar esses itens. Eles parecem bem legais.
|
||||||
$@c{serious_smile_fists}Boa sorte lá fora!`
|
$@c{serious_smile_fists}Boa sorte lá fora!
|
||||||
|
$@c{smile}Ah- e eu espero que você aproveite o evento!`
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"rival_female": {
|
"rival_female": {
|
||||||
@ -2555,7 +2556,8 @@ export const PGMdialogue: DialogueTranslationEntries = {
|
|||||||
1: `@c{shock}Você acabou de começar e já está tão forte?!@d{96}\n@c{angry}Você trapaceou, não foi?
|
1: `@c{shock}Você acabou de começar e já está tão forte?!@d{96}\n@c{angry}Você trapaceou, não foi?
|
||||||
$@c{smile_wave_wink}Brincadeirinha!@d{64} @c{smile_eclosed}Eu perdi de forma justa… Tenho a sensação de que você vai se sair muito bem lá fora.
|
$@c{smile_wave_wink}Brincadeirinha!@d{64} @c{smile_eclosed}Eu perdi de forma justa… Tenho a sensação de que você vai se sair muito bem lá fora.
|
||||||
$@c{smile}Aliás, o professor pediu para eu te dar alguns itens. Espero que sejam úteis!
|
$@c{smile}Aliás, o professor pediu para eu te dar alguns itens. Espero que sejam úteis!
|
||||||
$@c{smile_wave}Dê o seu melhor, como sempre! Eu acredito em você!`
|
$@c{smile_wave}Dê o seu melhor, como sempre! Eu acredito em você!
|
||||||
|
$@c{smile}Ah- e eu espero que você aproveite o evento!`
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"rival_2": {
|
"rival_2": {
|
||||||
@ -2571,7 +2573,7 @@ export const PGMdialogue: DialogueTranslationEntries = {
|
|||||||
$@c{smile}Tudo bem, no entanto. Eu imaginei que isso poderia acontecer.\n@c{serious_mopen_fists}Isso só significa que preciso me esforçar mais para a próxima vez!\n
|
$@c{smile}Tudo bem, no entanto. Eu imaginei que isso poderia acontecer.\n@c{serious_mopen_fists}Isso só significa que preciso me esforçar mais para a próxima vez!\n
|
||||||
$@c{smile}Ah, não que você precise realmente de ajuda, mas eu tinha um extra desses itens e pensei que você poderia querer.
|
$@c{smile}Ah, não que você precise realmente de ajuda, mas eu tinha um extra desses itens e pensei que você poderia querer.
|
||||||
$@c{serious_smile_fists}Não espere outro depois deste!\nNão posso continuar dando vantagem ao meu oponente.
|
$@c{serious_smile_fists}Não espere outro depois deste!\nNão posso continuar dando vantagem ao meu oponente.
|
||||||
$@c{smile}Enfim, cuide-se!`
|
$@c{smile}Enfim, cuide-se, e aproveite o evento!`
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"rival_2_female": {
|
"rival_2_female": {
|
||||||
@ -2585,9 +2587,9 @@ export const PGMdialogue: DialogueTranslationEntries = {
|
|||||||
"victory": {
|
"victory": {
|
||||||
1: `@c{neutral}Eu… não era para eu perder dessa vez…
|
1: `@c{neutral}Eu… não era para eu perder dessa vez…
|
||||||
$@c{smile}Ah bem. Isso só significa que vou ter que treinar ainda mais para a próxima vez!
|
$@c{smile}Ah bem. Isso só significa que vou ter que treinar ainda mais para a próxima vez!
|
||||||
$@c{smile_wave}Também consegui mais um desses para você!\n@c{smile_wave_wink}Não precisa me agradecer~.
|
$@c{smile_wave}Também consegui mais dois desses para você!\n@c{smile_wave_wink}Não precisa me agradecer~.
|
||||||
$@c{angry_mopen}Este é o último, hein! Você não vai ganhar mais nenhum presente de mim depois desse!
|
$@c{angry_mopen}Estes são os últimos, hein! Você não vai ganhar mais nenhum presente de mim depois desse!
|
||||||
$@c{smile_wave}Continue assim!`
|
$@c{smile_wave}Continue assim, e aproveite o evento!`
|
||||||
},
|
},
|
||||||
"defeat": {
|
"defeat": {
|
||||||
1: "Está tudo bem perder às vezes…"
|
1: "Está tudo bem perder às vezes…"
|
||||||
@ -3819,7 +3821,8 @@ export const PGFdialogue: DialogueTranslationEntries = {
|
|||||||
1: `@c{shock}Caramba… Você me limpou.\nVocê é mesmo uma novata?
|
1: `@c{shock}Caramba… Você me limpou.\nVocê é mesmo uma novata?
|
||||||
$@c{smile}Talvez tenha sido um pouco de sorte, mas…\nQuem sabe você consiga chegar até o fim.
|
$@c{smile}Talvez tenha sido um pouco de sorte, mas…\nQuem sabe você consiga chegar até o fim.
|
||||||
$Aliás, o professor me pediu para te dar esses itens. Eles parecem bem legais.
|
$Aliás, o professor me pediu para te dar esses itens. Eles parecem bem legais.
|
||||||
$@c{serious_smile_fists}Boa sorte lá fora!`
|
$@c{serious_smile_fists}Boa sorte lá fora!
|
||||||
|
$@c{smile}Ah- e eu espero que você aproveite o evento!`
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"rival_female": {
|
"rival_female": {
|
||||||
@ -3833,7 +3836,8 @@ export const PGFdialogue: DialogueTranslationEntries = {
|
|||||||
1: `@c{shock}Você acabou de começar e já está tão forte?!@d{96}\n@c{angry}Você trapaceou, não foi?
|
1: `@c{shock}Você acabou de começar e já está tão forte?!@d{96}\n@c{angry}Você trapaceou, não foi?
|
||||||
$@c{smile_wave_wink}Brincadeirinha!@d{64} @c{smile_eclosed}Eu perdi de forma justa… Tenho a sensação de que você vai se sair muito bem lá fora.
|
$@c{smile_wave_wink}Brincadeirinha!@d{64} @c{smile_eclosed}Eu perdi de forma justa… Tenho a sensação de que você vai se sair muito bem lá fora.
|
||||||
$@c{smile}Aliás, o professor pediu para eu te dar alguns itens. Espero que sejam úteis!
|
$@c{smile}Aliás, o professor pediu para eu te dar alguns itens. Espero que sejam úteis!
|
||||||
$@c{smile_wave}Dê o seu melhor, como sempre! Eu acredito em você!`
|
$@c{smile_wave}Dê o seu melhor, como sempre! Eu acredito em você!
|
||||||
|
$@c{smile}Ah- e eu espero que você aproveite o evento!`
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"rival_2": {
|
"rival_2": {
|
||||||
@ -3849,7 +3853,7 @@ export const PGFdialogue: DialogueTranslationEntries = {
|
|||||||
$@c{smile}Tudo bem, no entanto. Eu imaginei que isso poderia acontecer.\n@c{serious_mopen_fists}Isso só significa que preciso me esforçar mais para a próxima vez!\n
|
$@c{smile}Tudo bem, no entanto. Eu imaginei que isso poderia acontecer.\n@c{serious_mopen_fists}Isso só significa que preciso me esforçar mais para a próxima vez!\n
|
||||||
$@c{smile}Ah, não que você precise realmente de ajuda, mas eu tinha um extra desses itens e pensei que você poderia querer.
|
$@c{smile}Ah, não que você precise realmente de ajuda, mas eu tinha um extra desses itens e pensei que você poderia querer.
|
||||||
$@c{serious_smile_fists}Não espere outro depois deste!\nNão posso continuar dando vantagem ao meu oponente.
|
$@c{serious_smile_fists}Não espere outro depois deste!\nNão posso continuar dando vantagem ao meu oponente.
|
||||||
$@c{smile}Enfim, cuide-se!`
|
$@c{smile}Enfim, cuide-se, e aproveite o evento!`
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"rival_2_female": {
|
"rival_2_female": {
|
||||||
@ -3863,9 +3867,9 @@ export const PGFdialogue: DialogueTranslationEntries = {
|
|||||||
"victory": {
|
"victory": {
|
||||||
1: `@c{neutral}Eu… não era para eu perder dessa vez…
|
1: `@c{neutral}Eu… não era para eu perder dessa vez…
|
||||||
$@c{smile}Ah bem. Isso só significa que vou ter que treinar ainda mais para a próxima vez!
|
$@c{smile}Ah bem. Isso só significa que vou ter que treinar ainda mais para a próxima vez!
|
||||||
$@c{smile_wave}Também consegui mais um desses para você!\n@c{smile_wave_wink}Não precisa me agradecer~.
|
$@c{smile_wave}Também consegui mais dois desses para você!\n@c{smile_wave_wink}Não precisa me agradecer~.
|
||||||
$@c{angry_mopen}Este é o último, hein! Você não vai ganhar mais nenhum presente de mim depois desse!
|
$@c{angry_mopen}Estes são os últimos, hein! Você não vai ganhar mais nenhum presente de mim depois desse!
|
||||||
$@c{smile_wave}Continue assim!`
|
$@c{smile_wave}Continue assim, e aproveite o evento!`
|
||||||
},
|
},
|
||||||
"defeat": {
|
"defeat": {
|
||||||
1: "Está tudo bem perder às vezes…"
|
1: "Está tudo bem perder às vezes…"
|
||||||
|
@ -2463,7 +2463,7 @@ export const PGMdialogue: DialogueTranslationEntries = {
|
|||||||
1: "@c{smile}嘿,我在找你呢!我知道你急着上路,\n但至少说个再见吧…$@c{smile_eclosed}所以你终于要开始追逐梦想了?\n我几乎不敢相信。$@c{serious_smile_fists}来都来了,来一场对战怎么样?\n毕竟,我想看看你是不是准备周全了。$@c{serious_mopen_fists}不要手下留情,我想让你全力以赴!",
|
1: "@c{smile}嘿,我在找你呢!我知道你急着上路,\n但至少说个再见吧…$@c{smile_eclosed}所以你终于要开始追逐梦想了?\n我几乎不敢相信。$@c{serious_smile_fists}来都来了,来一场对战怎么样?\n毕竟,我想看看你是不是准备周全了。$@c{serious_mopen_fists}不要手下留情,我想让你全力以赴!",
|
||||||
},
|
},
|
||||||
"victory": {
|
"victory": {
|
||||||
1: "@c{shock}哇…你彻底击败了我。\n你是真初学者吗?$@c{smile}也许是靠点运气,但是…\n谁知道,你可能真的能一路走下去。$顺便说一下,博士让我给你这些东西。它们看起来可牛了。$@c{serious_smile_fists}祝你好运!",
|
1: "@c{shock}哇…你彻底击败了我。\n你是真初学者吗?$@c{smile}也许是靠点运气,但是…\n谁知道,你可能真的能一路走下去。$顺便说一下,博士让我给你这些东西。它们看起来可牛了。$@c{serious_smile_fists}祝你好运!$@c{smile}哦!我希望你能喜欢这次的活动! ",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"rival_female": {
|
"rival_female": {
|
||||||
@ -2471,7 +2471,7 @@ export const PGMdialogue: DialogueTranslationEntries = {
|
|||||||
1: "@c{smile_wave}你在这儿啊!我到处找你呢!$@c{angry_mopen}你忘了和你最好的朋友说再见了吗?$@c{smile_ehalf}你要去追逐梦想了,对吧?\n从今天开始,是不是…$@c{smile}不管怎样,忘了我的事就原谅你吧,\n但有个条件。@c{smile_wave_wink}你必须和我对战!$@c{angry_mopen}全力以赴!\n你也不想让你的冒险在开始之前就结束了,对吧?",
|
1: "@c{smile_wave}你在这儿啊!我到处找你呢!$@c{angry_mopen}你忘了和你最好的朋友说再见了吗?$@c{smile_ehalf}你要去追逐梦想了,对吧?\n从今天开始,是不是…$@c{smile}不管怎样,忘了我的事就原谅你吧,\n但有个条件。@c{smile_wave_wink}你必须和我对战!$@c{angry_mopen}全力以赴!\n你也不想让你的冒险在开始之前就结束了,对吧?",
|
||||||
},
|
},
|
||||||
"victory": {
|
"victory": {
|
||||||
1: "@c{shock}你刚开始就已经这么强了?!@d{96}$@c{angry}你是不是开了?$@c{smile_wave_wink}只是开个玩笑啦!@d{64} @c{smile_eclosed}我输地心服口服了…\n我感觉你出去挺有天赋的。$@c{smile}顺便说一下,博士想让我给你一些东西。\n希望它们能帮上忙!$@c{smile_wave}像往常一样尽力而为!\n我相信你!",
|
1: "@c{shock}你刚开始就已经这么强了?!@d{96}$@c{angry}你是不是开了?$@c{smile_wave_wink}只是开个玩笑啦!@d{64} @c{smile_eclosed}我输地心服口服了…\n我感觉你出去挺有天赋的。$@c{smile}顺便说一下,博士想让我给你一些东西。\n希望它们能帮上忙!$@c{smile_wave}像往常一样尽力而为!\n我相信你!$@c{smile}哦!我希望你能喜欢这次的活动! ",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"rival_2": {
|
"rival_2": {
|
||||||
@ -2479,7 +2479,7 @@ export const PGMdialogue: DialogueTranslationEntries = {
|
|||||||
1: "@c{smile}嘿,你也在这里吗?$@c{smile_eclosed}一路过关斩将,是吧?$@c{serious_mopen_fists}我知道看起来好像我尾随着你来到这里,\n怎么可能啦。$@c{serious_smile_fists}说真的,自从你在老家打败我后,\n我就一直很渴望再比一场。$我自己也进行了很多训练,\n所以这次我肯定会好好打一场。$@c{serious_mopen_fists}不要手下留情,就像以前一样!$让我们开始吧!",
|
1: "@c{smile}嘿,你也在这里吗?$@c{smile_eclosed}一路过关斩将,是吧?$@c{serious_mopen_fists}我知道看起来好像我尾随着你来到这里,\n怎么可能啦。$@c{serious_smile_fists}说真的,自从你在老家打败我后,\n我就一直很渴望再比一场。$我自己也进行了很多训练,\n所以这次我肯定会好好打一场。$@c{serious_mopen_fists}不要手下留情,就像以前一样!$让我们开始吧!",
|
||||||
},
|
},
|
||||||
"victory": {
|
"victory": {
|
||||||
1: "@c{neutral_eclosed}哦。我过于自信了。$@c{smile}不过没关系。我猜到可能会这样。$@c{serious_mopen_fists}这只意味着我下次需要更努力!$$@c{smile}呃,不是特意帮你,我正好有多余的这个,\n我觉得你可能想要。$$@c{serious_smile_fists}不过这次之后别指望再有了!$我不能一直给我的对手优势。$@c{smile}反正,保重!",
|
1: "@c{neutral_eclosed}哦。我过于自信了。$@c{smile}不过没关系。我猜到可能会这样。$@c{serious_mopen_fists}这只意味着我下次需要更努力!$$@c{smile}呃,不是特意帮你,我正好有多余的这个,\n我觉得你可能想要。$$@c{serious_smile_fists}不过这次之后别指望再有了!$我不能一直给我的对手优势。$@c{smile}反正,保重,要享受活动哦!",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"rival_2_female": {
|
"rival_2_female": {
|
||||||
@ -2487,7 +2487,7 @@ export const PGMdialogue: DialogueTranslationEntries = {
|
|||||||
1: "@c{smile_wave}哦,真巧,在这里遇见你。\n看来你还没输过嘛。@c{angry_mopen}哈……好家伙!$@c{angry_mopen}我知道你在想什么,\n不,我才不会跟踪你什么呢。 @c{smile_eclosed}我只是碰巧在附近。$@c{smile_ehalf}我为你感到高兴,但我只想让你知道\n有时输了是可以接受的。$@c{smile}我们从错误中学到的东西\n往往比我们一直成功时学到的还要多。$@c{angry_mopen}无论如何,我为了我们的复赛已经努力训练了\n所以你最好全力以赴!",
|
1: "@c{smile_wave}哦,真巧,在这里遇见你。\n看来你还没输过嘛。@c{angry_mopen}哈……好家伙!$@c{angry_mopen}我知道你在想什么,\n不,我才不会跟踪你什么呢。 @c{smile_eclosed}我只是碰巧在附近。$@c{smile_ehalf}我为你感到高兴,但我只想让你知道\n有时输了是可以接受的。$@c{smile}我们从错误中学到的东西\n往往比我们一直成功时学到的还要多。$@c{angry_mopen}无论如何,我为了我们的复赛已经努力训练了\n所以你最好全力以赴!",
|
||||||
},
|
},
|
||||||
"victory": {
|
"victory": {
|
||||||
1: "@c{neutral}我……没打算会输来着……$@c{smile}嗷……好吧。看来我要再更加努力训练了!$@c{smile_wave}我还给你带了个这个$@c{smile_wave_wink}不用谢我哦~.$@c{angry_mopen}不过,这是最后一个啦!\n你可别想再从我这赚小便宜了~$@c{smile_wave}要保重哦!",
|
1: "@c{neutral}我……没打算会输来着……$@c{smile}嗷……好吧。看来我要再更加努力训练了!$@c{smile_wave}我还给你带了个这个$@c{smile_wave_wink}不用谢我哦~.$@c{angry_mopen}不过,这是最后一个啦!\n你可别想再从我这赚小便宜了~$@c{smile_wave}要保重哦,要享受活动哦!",
|
||||||
},
|
},
|
||||||
"defeat": {
|
"defeat": {
|
||||||
1: "输了有时候也不要紧的…",
|
1: "输了有时候也不要紧的…",
|
||||||
|
@ -2463,7 +2463,7 @@ export const PGMdialogue: DialogueTranslationEntries = {
|
|||||||
1: "@c{smile}嘿,我在找你呢!我知道你急著上路,\n但至少說個再見吧…$@c{smile_eclosed}所以你終於要開始追逐夢想了?\n我幾乎不敢相信。$@c{serious_smile_fists}來都來了,來一場對戰怎麼樣?\n畢竟,我想看看你是不是準備周全了。$@c{serious_mopen_fists}不要手下留情,我想讓你全力以赴!",
|
1: "@c{smile}嘿,我在找你呢!我知道你急著上路,\n但至少說個再見吧…$@c{smile_eclosed}所以你終於要開始追逐夢想了?\n我幾乎不敢相信。$@c{serious_smile_fists}來都來了,來一場對戰怎麼樣?\n畢竟,我想看看你是不是準備周全了。$@c{serious_mopen_fists}不要手下留情,我想讓你全力以赴!",
|
||||||
},
|
},
|
||||||
"victory": {
|
"victory": {
|
||||||
1: "@c{shock}哇…你徹底擊敗了我。\n你是真初學者嗎?$@c{smile}也許是靠點運氣,但是…\n誰知道,你可能真的能一路走下去。$順便說一下,博士讓我給你這些東西。它們看起來可牛了。$@c{serious_smile_fists}祝你好运!",
|
1: "@c{shock}哇…你徹底擊敗了我。\n你是真初學者嗎?$@c{smile}也許是靠點運氣,但是…\n誰知道,你可能真的能一路走下去。$順便說一下,博士讓我給你這些東西。它們看起來可牛了。$@c{serious_smile_fists}祝你好运!$@c{smile}哦!我希望你能喜歡這次的活動!",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"rival_female": {
|
"rival_female": {
|
||||||
@ -2471,7 +2471,7 @@ export const PGMdialogue: DialogueTranslationEntries = {
|
|||||||
1: "@c{smile_wave}你在這兒啊!我到處找你呢!$@c{angry_mopen}你忘了和你最好的朋友說再見了嗎?$@c{smile_ehalf}你要去追逐夢想了,對吧?\n從今天開始,是不是…$@c{smile}不管怎樣,忘了我的事就原諒你吧,\n但有個條件。@c{smile_wave_wink}你必須和我對戰!$@c{angry_mopen}全力以赴!\n你也不想讓你的冒險在開始之前就結束了,對吧?",
|
1: "@c{smile_wave}你在這兒啊!我到處找你呢!$@c{angry_mopen}你忘了和你最好的朋友說再見了嗎?$@c{smile_ehalf}你要去追逐夢想了,對吧?\n從今天開始,是不是…$@c{smile}不管怎樣,忘了我的事就原諒你吧,\n但有個條件。@c{smile_wave_wink}你必須和我對戰!$@c{angry_mopen}全力以赴!\n你也不想讓你的冒險在開始之前就結束了,對吧?",
|
||||||
},
|
},
|
||||||
"victory": {
|
"victory": {
|
||||||
1: "@c{shock}你剛開始就已經這麼強了?!@d{96}$@c{angry}你是不是開了?$@c{smile_wave_wink}只是開個玩笑啦!@d{64} @c{smile_eclosed}我輸地心服口服了…\n我感覺你出去挺有天賦的。$@c{smile}順便說一下,博士想讓我給你一些東西。\n希望它們能幫上忙!$@c{smile_wave}像往常一樣盡力而為!\n我相信你!",
|
1: "@c{shock}你剛開始就已經這麼強了?!@d{96}$@c{angry}你是不是開了?$@c{smile_wave_wink}只是開個玩笑啦!@d{64} @c{smile_eclosed}我輸地心服口服了…\n我感覺你出去挺有天賦的。$@c{smile}順便說一下,博士想讓我給你一些東西。\n希望它們能幫上忙!$@c{smile_wave}像往常一樣盡力而為!\n我相信你!$@c{smile}哦!我希望你能喜歡這次的活動!",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"rival_2": {
|
"rival_2": {
|
||||||
@ -2479,7 +2479,7 @@ export const PGMdialogue: DialogueTranslationEntries = {
|
|||||||
1: "@c{smile}嘿,你也在這裡嗎?$@c{smile_eclosed}一路過關斬將,是吧?$@c{serious_mopen_fists}我知道看起來好像我尾隨著你來到這裡,\n怎麼可能啦。$@c{serious_smile_fists}說真的,自從你在老家打敗我後,\n我就一直很渴望再比一場。$我自己也進行了很多訓練,\n所以這次我肯定會好好打一場。$@c{serious_mopen_fists}不要手下留情,就像以前一樣!$讓我們開始吧!",
|
1: "@c{smile}嘿,你也在這裡嗎?$@c{smile_eclosed}一路過關斬將,是吧?$@c{serious_mopen_fists}我知道看起來好像我尾隨著你來到這裡,\n怎麼可能啦。$@c{serious_smile_fists}說真的,自從你在老家打敗我後,\n我就一直很渴望再比一場。$我自己也進行了很多訓練,\n所以這次我肯定會好好打一場。$@c{serious_mopen_fists}不要手下留情,就像以前一樣!$讓我們開始吧!",
|
||||||
},
|
},
|
||||||
"victory": {
|
"victory": {
|
||||||
1: "@c{neutral_eclosed}哦。我過於自信了。$@c{smile}不過沒關係。我猜到可能會這樣。$@c{serious_mopen_fists}這只意味著我下次需要更努力!$$@c{smile}呃,不是特意幫你,我正好有多餘的這個,\n我覺得你可能想要。$$@c{serious_smile_fists}不過這次之後別指望再有了!$我不能一直給我的對手優勢。$@c{smile}反正,保重!",
|
1: "@c{neutral_eclosed}哦。我過於自信了。$@c{smile}不過沒關係。我猜到可能會這樣。$@c{serious_mopen_fists}這只意味著我下次需要更努力!$$@c{smile}呃,不是特意幫你,我正好有多餘的這個,\n我覺得你可能想要。$$@c{serious_smile_fists}不過這次之後別指望再有了!$我不能一直給我的對手優勢。$@c{smile}反正,保重, 要享受活動哦!",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"rival_2_female": {
|
"rival_2_female": {
|
||||||
@ -2487,7 +2487,7 @@ export const PGMdialogue: DialogueTranslationEntries = {
|
|||||||
1: "@c{smile_wave}哦,真巧,在這裡遇見你。\n看來你還沒輸過嘛。@c{angry_mopen}哈……好傢伙!$@c{angry_mopen}我知道你在想什麼,\n不,我才不會跟蹤你什麼呢。 @c{smile_eclosed}我只是碰巧在附近。$@c{smile_ehalf}我為你感到高興,但我只想讓你知道\n有時輸了是可以接受的。$@c{smile}我們從錯誤中學到的東西\n往往比我們一直成功時學到的還要多。$@c{angry_mopen}無論如何,我為了我們的複賽已經努力訓練了\n所以你最好全力以赴!",
|
1: "@c{smile_wave}哦,真巧,在這裡遇見你。\n看來你還沒輸過嘛。@c{angry_mopen}哈……好傢伙!$@c{angry_mopen}我知道你在想什麼,\n不,我才不會跟蹤你什麼呢。 @c{smile_eclosed}我只是碰巧在附近。$@c{smile_ehalf}我為你感到高興,但我只想讓你知道\n有時輸了是可以接受的。$@c{smile}我們從錯誤中學到的東西\n往往比我們一直成功時學到的還要多。$@c{angry_mopen}無論如何,我為了我們的複賽已經努力訓練了\n所以你最好全力以赴!",
|
||||||
},
|
},
|
||||||
"victory": {
|
"victory": {
|
||||||
1: "@c{neutral}我……沒打算會輸來著……$@c{smile}嗷……好吧。看來我要再更加努力訓練了!$@c{smile_wave}我還給你帶了個這個$@c{smile_wave_wink}不用謝我哦~.$@c{angry_mopen}不過,這是最後一個啦!\n 你可別想再從我這賺小便宜了~$@c{smile_wave}要保重哦!",
|
1: "@c{neutral}我……沒打算會輸來著……$@c{smile}嗷……好吧。看來我要再更加努力訓練了!$@c{smile_wave}我還給你帶了個這個$@c{smile_wave_wink}不用謝我哦~.$@c{angry_mopen}不過,這是最後一個啦!\n 你可別想再從我這賺小便宜了~$@c{smile_wave}要保重哦,要享受活動哦!",
|
||||||
},
|
},
|
||||||
"defeat": {
|
"defeat": {
|
||||||
1: "輸了有時候也不要緊的…",
|
1: "輸了有時候也不要緊的…",
|
||||||
|
@ -2209,7 +2209,7 @@ export function getDefaultModifierTypeForTier(tier: ModifierTier): ModifierType
|
|||||||
}
|
}
|
||||||
|
|
||||||
export class ModifierTypeOption {
|
export class ModifierTypeOption {
|
||||||
public type: ModifierType | null;
|
public type: ModifierType;
|
||||||
public upgradeCount: integer;
|
public upgradeCount: integer;
|
||||||
public cost: integer;
|
public cost: integer;
|
||||||
|
|
||||||
|
@ -1,5 +1,4 @@
|
|||||||
import * as ModifierTypes from "./modifier-type";
|
import * as ModifierTypes from "./modifier-type";
|
||||||
import { LearnMovePhase, LevelUpPhase, PokemonHealPhase } from "../phases";
|
|
||||||
import BattleScene from "../battle-scene";
|
import BattleScene from "../battle-scene";
|
||||||
import { getLevelTotalExp } from "../data/exp";
|
import { getLevelTotalExp } from "../data/exp";
|
||||||
import { MAX_PER_TYPE_POKEBALLS, PokeballType } from "../data/pokeball";
|
import { MAX_PER_TYPE_POKEBALLS, PokeballType } from "../data/pokeball";
|
||||||
@ -7,7 +6,7 @@ import Pokemon, { PlayerPokemon } from "../field/pokemon";
|
|||||||
import { Stat } from "../data/pokemon-stat";
|
import { Stat } from "../data/pokemon-stat";
|
||||||
import { addTextObject, TextStyle } from "../ui/text";
|
import { addTextObject, TextStyle } from "../ui/text";
|
||||||
import { Type } from "../data/type";
|
import { Type } from "../data/type";
|
||||||
import { EvolutionPhase } from "../evolution-phase";
|
import { EvolutionPhase } from "../phases/evolution-phase";
|
||||||
import { FusionSpeciesFormEvolution, pokemonEvolutions, pokemonPrevolutions } from "../data/pokemon-evolutions";
|
import { FusionSpeciesFormEvolution, pokemonEvolutions, pokemonPrevolutions } from "../data/pokemon-evolutions";
|
||||||
import { getPokemonNameWithAffix } from "../messages";
|
import { getPokemonNameWithAffix } from "../messages";
|
||||||
import * as Utils from "../utils";
|
import * as Utils from "../utils";
|
||||||
@ -28,6 +27,9 @@ import i18next from "i18next";
|
|||||||
|
|
||||||
import { allMoves } from "#app/data/move";
|
import { allMoves } from "#app/data/move";
|
||||||
import { Abilities } from "#app/enums/abilities";
|
import { Abilities } from "#app/enums/abilities";
|
||||||
|
import { LearnMovePhase } from "#app/phases/learn-move-phase.js";
|
||||||
|
import { LevelUpPhase } from "#app/phases/level-up-phase.js";
|
||||||
|
import { PokemonHealPhase } from "#app/phases/pokemon-heal-phase.js";
|
||||||
|
|
||||||
export type ModifierPredicate = (modifier: Modifier) => boolean;
|
export type ModifierPredicate = (modifier: Modifier) => boolean;
|
||||||
|
|
||||||
@ -2338,7 +2340,7 @@ export abstract class HeldItemTransferModifier extends PokemonHeldItemModifier {
|
|||||||
* @see {@linkcode modifierTypes[MINI_BLACK_HOLE]}
|
* @see {@linkcode modifierTypes[MINI_BLACK_HOLE]}
|
||||||
*/
|
*/
|
||||||
export class TurnHeldItemTransferModifier extends HeldItemTransferModifier {
|
export class TurnHeldItemTransferModifier extends HeldItemTransferModifier {
|
||||||
readonly isTransferrable: boolean = true;
|
isTransferrable: boolean = true;
|
||||||
constructor(type: ModifierType, pokemonId: integer, stackCount?: integer) {
|
constructor(type: ModifierType, pokemonId: integer, stackCount?: integer) {
|
||||||
super(type, pokemonId, stackCount);
|
super(type, pokemonId, stackCount);
|
||||||
}
|
}
|
||||||
@ -2362,6 +2364,10 @@ export class TurnHeldItemTransferModifier extends HeldItemTransferModifier {
|
|||||||
getMaxHeldItemCount(pokemon: Pokemon): integer {
|
getMaxHeldItemCount(pokemon: Pokemon): integer {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
setTransferrableFalse(): void {
|
||||||
|
this.isTransferrable = false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -2410,7 +2416,7 @@ export class ContactHeldItemTransferChanceModifier extends HeldItemTransferModif
|
|||||||
}
|
}
|
||||||
|
|
||||||
getTransferMessage(pokemon: Pokemon, targetPokemon: Pokemon, item: ModifierTypes.ModifierType): string {
|
getTransferMessage(pokemon: Pokemon, targetPokemon: Pokemon, item: ModifierTypes.ModifierType): string {
|
||||||
return i18next.t("modifier:contactHeldItemTransferApply", { pokemonNameWithAffix: getPokemonNameWithAffix(targetPokemon), itemName: item.name, pokemonName: pokemon.name, typeName: this.type.name });
|
return i18next.t("modifier:contactHeldItemTransferApply", { pokemonNameWithAffix: getPokemonNameWithAffix(targetPokemon), itemName: item.name, pokemonName: getPokemonNameWithAffix(pokemon), typeName: this.type.name });
|
||||||
}
|
}
|
||||||
|
|
||||||
getMaxHeldItemCount(pokemon: Pokemon): integer {
|
getMaxHeldItemCount(pokemon: Pokemon): integer {
|
||||||
|
5852
src/phases.ts
26
src/phases/add-enemy-buff-modifier-phase.ts
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
import BattleScene from "#app/battle-scene.js";
|
||||||
|
import { ModifierTier } from "#app/modifier/modifier-tier.js";
|
||||||
|
import { regenerateModifierPoolThresholds, ModifierPoolType, getEnemyBuffModifierForWave } from "#app/modifier/modifier-type.js";
|
||||||
|
import { EnemyPersistentModifier } from "#app/modifier/modifier.js";
|
||||||
|
import { Phase } from "#app/phase.js";
|
||||||
|
|
||||||
|
export class AddEnemyBuffModifierPhase extends Phase {
|
||||||
|
constructor(scene: BattleScene) {
|
||||||
|
super(scene);
|
||||||
|
}
|
||||||
|
|
||||||
|
start() {
|
||||||
|
super.start();
|
||||||
|
|
||||||
|
const waveIndex = this.scene.currentBattle.waveIndex;
|
||||||
|
const tier = !(waveIndex % 1000) ? ModifierTier.ULTRA : !(waveIndex % 250) ? ModifierTier.GREAT : ModifierTier.COMMON;
|
||||||
|
|
||||||
|
regenerateModifierPoolThresholds(this.scene.getEnemyParty(), ModifierPoolType.ENEMY_BUFF);
|
||||||
|
|
||||||
|
const count = Math.ceil(waveIndex / 250);
|
||||||
|
for (let i = 0; i < count; i++) {
|
||||||
|
this.scene.addEnemyModifier(getEnemyBuffModifierForWave(tier, this.scene.findModifiers(m => m instanceof EnemyPersistentModifier, false), this.scene), true, true);
|
||||||
|
}
|
||||||
|
this.scene.updateModifiers(false, true).then(() => this.end());
|
||||||
|
}
|
||||||
|
}
|
288
src/phases/attempt-capture-phase.ts
Normal file
@ -0,0 +1,288 @@
|
|||||||
|
import BattleScene from "#app/battle-scene.js";
|
||||||
|
import { BattlerIndex } from "#app/battle.js";
|
||||||
|
import { getPokeballCatchMultiplier, getPokeballAtlasKey, getPokeballTintColor, doPokeballBounceAnim } from "#app/data/pokeball.js";
|
||||||
|
import { getStatusEffectCatchRateMultiplier } from "#app/data/status-effect.js";
|
||||||
|
import { PokeballType } from "#app/enums/pokeball.js";
|
||||||
|
import { StatusEffect } from "#app/enums/status-effect.js";
|
||||||
|
import { addPokeballOpenParticles, addPokeballCaptureStars } from "#app/field/anims.js";
|
||||||
|
import { EnemyPokemon } from "#app/field/pokemon.js";
|
||||||
|
import { getPokemonNameWithAffix } from "#app/messages.js";
|
||||||
|
import { PokemonHeldItemModifier } from "#app/modifier/modifier.js";
|
||||||
|
import { achvs } from "#app/system/achv.js";
|
||||||
|
import { PartyUiMode, PartyOption } from "#app/ui/party-ui-handler.js";
|
||||||
|
import { SummaryUiMode } from "#app/ui/summary-ui-handler.js";
|
||||||
|
import { Mode } from "#app/ui/ui.js";
|
||||||
|
import i18next from "i18next";
|
||||||
|
import { PokemonPhase } from "./pokemon-phase";
|
||||||
|
import { VictoryPhase } from "./victory-phase";
|
||||||
|
|
||||||
|
export class AttemptCapturePhase extends PokemonPhase {
|
||||||
|
private pokeballType: PokeballType;
|
||||||
|
private pokeball: Phaser.GameObjects.Sprite;
|
||||||
|
private originalY: number;
|
||||||
|
|
||||||
|
constructor(scene: BattleScene, targetIndex: integer, pokeballType: PokeballType) {
|
||||||
|
super(scene, BattlerIndex.ENEMY + targetIndex);
|
||||||
|
|
||||||
|
this.pokeballType = pokeballType;
|
||||||
|
}
|
||||||
|
|
||||||
|
start() {
|
||||||
|
super.start();
|
||||||
|
|
||||||
|
const pokemon = this.getPokemon() as EnemyPokemon;
|
||||||
|
|
||||||
|
if (!pokemon?.hp) {
|
||||||
|
return this.end();
|
||||||
|
}
|
||||||
|
|
||||||
|
this.scene.pokeballCounts[this.pokeballType]--;
|
||||||
|
|
||||||
|
this.originalY = pokemon.y;
|
||||||
|
|
||||||
|
const _3m = 3 * pokemon.getMaxHp();
|
||||||
|
const _2h = 2 * pokemon.hp;
|
||||||
|
const catchRate = pokemon.species.catchRate;
|
||||||
|
const pokeballMultiplier = getPokeballCatchMultiplier(this.pokeballType);
|
||||||
|
const statusMultiplier = pokemon.status ? getStatusEffectCatchRateMultiplier(pokemon.status.effect) : 1;
|
||||||
|
const x = Math.round((((_3m - _2h) * catchRate * pokeballMultiplier) / _3m) * statusMultiplier);
|
||||||
|
const y = Math.round(65536 / Math.sqrt(Math.sqrt(255 / x)));
|
||||||
|
const fpOffset = pokemon.getFieldPositionOffset();
|
||||||
|
|
||||||
|
const pokeballAtlasKey = getPokeballAtlasKey(this.pokeballType);
|
||||||
|
this.pokeball = this.scene.addFieldSprite(16, 80, "pb", pokeballAtlasKey);
|
||||||
|
this.pokeball.setOrigin(0.5, 0.625);
|
||||||
|
this.scene.field.add(this.pokeball);
|
||||||
|
|
||||||
|
this.scene.playSound("pb_throw");
|
||||||
|
this.scene.time.delayedCall(300, () => {
|
||||||
|
this.scene.field.moveBelow(this.pokeball as Phaser.GameObjects.GameObject, pokemon);
|
||||||
|
});
|
||||||
|
|
||||||
|
this.scene.tweens.add({
|
||||||
|
targets: this.pokeball,
|
||||||
|
x: { value: 236 + fpOffset[0], ease: "Linear" },
|
||||||
|
y: { value: 16 + fpOffset[1], ease: "Cubic.easeOut" },
|
||||||
|
duration: 500,
|
||||||
|
onComplete: () => {
|
||||||
|
this.pokeball.setTexture("pb", `${pokeballAtlasKey}_opening`);
|
||||||
|
this.scene.time.delayedCall(17, () => this.pokeball.setTexture("pb", `${pokeballAtlasKey}_open`));
|
||||||
|
this.scene.playSound("pb_rel");
|
||||||
|
pokemon.tint(getPokeballTintColor(this.pokeballType));
|
||||||
|
|
||||||
|
addPokeballOpenParticles(this.scene, this.pokeball.x, this.pokeball.y, this.pokeballType);
|
||||||
|
|
||||||
|
this.scene.tweens.add({
|
||||||
|
targets: pokemon,
|
||||||
|
duration: 500,
|
||||||
|
ease: "Sine.easeIn",
|
||||||
|
scale: 0.25,
|
||||||
|
y: 20,
|
||||||
|
onComplete: () => {
|
||||||
|
this.pokeball.setTexture("pb", `${pokeballAtlasKey}_opening`);
|
||||||
|
pokemon.setVisible(false);
|
||||||
|
this.scene.playSound("pb_catch");
|
||||||
|
this.scene.time.delayedCall(17, () => this.pokeball.setTexture("pb", `${pokeballAtlasKey}`));
|
||||||
|
|
||||||
|
const doShake = () => {
|
||||||
|
let shakeCount = 0;
|
||||||
|
const pbX = this.pokeball.x;
|
||||||
|
const shakeCounter = this.scene.tweens.addCounter({
|
||||||
|
from: 0,
|
||||||
|
to: 1,
|
||||||
|
repeat: 4,
|
||||||
|
yoyo: true,
|
||||||
|
ease: "Cubic.easeOut",
|
||||||
|
duration: 250,
|
||||||
|
repeatDelay: 500,
|
||||||
|
onUpdate: t => {
|
||||||
|
if (shakeCount && shakeCount < 4) {
|
||||||
|
const value = t.getValue();
|
||||||
|
const directionMultiplier = shakeCount % 2 === 1 ? 1 : -1;
|
||||||
|
this.pokeball.setX(pbX + value * 4 * directionMultiplier);
|
||||||
|
this.pokeball.setAngle(value * 27.5 * directionMultiplier);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
onRepeat: () => {
|
||||||
|
if (!pokemon.species.isObtainable()) {
|
||||||
|
shakeCounter.stop();
|
||||||
|
this.failCatch(shakeCount);
|
||||||
|
} else if (shakeCount++ < 3) {
|
||||||
|
if (pokeballMultiplier === -1 || pokemon.randSeedInt(65536) < y) {
|
||||||
|
this.scene.playSound("pb_move");
|
||||||
|
} else {
|
||||||
|
shakeCounter.stop();
|
||||||
|
this.failCatch(shakeCount);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
this.scene.playSound("pb_lock");
|
||||||
|
addPokeballCaptureStars(this.scene, this.pokeball);
|
||||||
|
|
||||||
|
const pbTint = this.scene.add.sprite(this.pokeball.x, this.pokeball.y, "pb", "pb");
|
||||||
|
pbTint.setOrigin(this.pokeball.originX, this.pokeball.originY);
|
||||||
|
pbTint.setTintFill(0);
|
||||||
|
pbTint.setAlpha(0);
|
||||||
|
this.scene.field.add(pbTint);
|
||||||
|
this.scene.tweens.add({
|
||||||
|
targets: pbTint,
|
||||||
|
alpha: 0.375,
|
||||||
|
duration: 200,
|
||||||
|
easing: "Sine.easeOut",
|
||||||
|
onComplete: () => {
|
||||||
|
this.scene.tweens.add({
|
||||||
|
targets: pbTint,
|
||||||
|
alpha: 0,
|
||||||
|
duration: 200,
|
||||||
|
easing: "Sine.easeIn",
|
||||||
|
onComplete: () => pbTint.destroy()
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
},
|
||||||
|
onComplete: () => {
|
||||||
|
this.catch();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
this.scene.time.delayedCall(250, () => doPokeballBounceAnim(this.scene, this.pokeball, 16, 72, 350, doShake));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
failCatch(shakeCount: integer) {
|
||||||
|
const pokemon = this.getPokemon();
|
||||||
|
|
||||||
|
this.scene.playSound("pb_rel");
|
||||||
|
pokemon.setY(this.originalY);
|
||||||
|
if (pokemon.status?.effect !== StatusEffect.SLEEP) {
|
||||||
|
pokemon.cry(pokemon.getHpRatio() > 0.25 ? undefined : { rate: 0.85 });
|
||||||
|
}
|
||||||
|
pokemon.tint(getPokeballTintColor(this.pokeballType));
|
||||||
|
pokemon.setVisible(true);
|
||||||
|
pokemon.untint(250, "Sine.easeOut");
|
||||||
|
|
||||||
|
const pokeballAtlasKey = getPokeballAtlasKey(this.pokeballType);
|
||||||
|
this.pokeball.setTexture("pb", `${pokeballAtlasKey}_opening`);
|
||||||
|
this.scene.time.delayedCall(17, () => this.pokeball.setTexture("pb", `${pokeballAtlasKey}_open`));
|
||||||
|
|
||||||
|
this.scene.tweens.add({
|
||||||
|
targets: pokemon,
|
||||||
|
duration: 250,
|
||||||
|
ease: "Sine.easeOut",
|
||||||
|
scale: 1
|
||||||
|
});
|
||||||
|
|
||||||
|
this.scene.currentBattle.lastUsedPokeball = this.pokeballType;
|
||||||
|
this.removePb();
|
||||||
|
this.end();
|
||||||
|
}
|
||||||
|
|
||||||
|
catch() {
|
||||||
|
const pokemon = this.getPokemon() as EnemyPokemon;
|
||||||
|
|
||||||
|
const speciesForm = !pokemon.fusionSpecies ? pokemon.getSpeciesForm() : pokemon.getFusionSpeciesForm();
|
||||||
|
|
||||||
|
if (speciesForm.abilityHidden && (pokemon.fusionSpecies ? pokemon.fusionAbilityIndex : pokemon.abilityIndex) === speciesForm.getAbilityCount() - 1) {
|
||||||
|
this.scene.validateAchv(achvs.HIDDEN_ABILITY);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pokemon.species.subLegendary) {
|
||||||
|
this.scene.validateAchv(achvs.CATCH_SUB_LEGENDARY);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pokemon.species.legendary) {
|
||||||
|
this.scene.validateAchv(achvs.CATCH_LEGENDARY);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pokemon.species.mythical) {
|
||||||
|
this.scene.validateAchv(achvs.CATCH_MYTHICAL);
|
||||||
|
}
|
||||||
|
|
||||||
|
this.scene.pokemonInfoContainer.show(pokemon, true);
|
||||||
|
|
||||||
|
this.scene.gameData.updateSpeciesDexIvs(pokemon.species.getRootSpeciesId(true), pokemon.ivs);
|
||||||
|
|
||||||
|
this.scene.ui.showText(i18next.t("battle:pokemonCaught", { pokemonName: getPokemonNameWithAffix(pokemon) }), null, () => {
|
||||||
|
const end = () => {
|
||||||
|
this.scene.unshiftPhase(new VictoryPhase(this.scene, this.battlerIndex));
|
||||||
|
this.scene.pokemonInfoContainer.hide();
|
||||||
|
this.removePb();
|
||||||
|
this.end();
|
||||||
|
};
|
||||||
|
const removePokemon = () => {
|
||||||
|
this.scene.addFaintedEnemyScore(pokemon);
|
||||||
|
this.scene.getPlayerField().filter(p => p.isActive(true)).forEach(playerPokemon => playerPokemon.removeTagsBySourceId(pokemon.id));
|
||||||
|
pokemon.hp = 0;
|
||||||
|
pokemon.trySetStatus(StatusEffect.FAINT);
|
||||||
|
this.scene.clearEnemyHeldItemModifiers();
|
||||||
|
this.scene.field.remove(pokemon, true);
|
||||||
|
};
|
||||||
|
const addToParty = () => {
|
||||||
|
const newPokemon = pokemon.addToParty(this.pokeballType);
|
||||||
|
const modifiers = this.scene.findModifiers(m => m instanceof PokemonHeldItemModifier, false);
|
||||||
|
if (this.scene.getParty().filter(p => p.isShiny()).length === 6) {
|
||||||
|
this.scene.validateAchv(achvs.SHINY_PARTY);
|
||||||
|
}
|
||||||
|
Promise.all(modifiers.map(m => this.scene.addModifier(m, true))).then(() => {
|
||||||
|
this.scene.updateModifiers(true);
|
||||||
|
removePokemon();
|
||||||
|
if (newPokemon) {
|
||||||
|
newPokemon.loadAssets().then(end);
|
||||||
|
} else {
|
||||||
|
end();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
};
|
||||||
|
Promise.all([pokemon.hideInfo(), this.scene.gameData.setPokemonCaught(pokemon)]).then(() => {
|
||||||
|
if (this.scene.getParty().length === 6) {
|
||||||
|
const promptRelease = () => {
|
||||||
|
this.scene.ui.showText(i18next.t("battle:partyFull", { pokemonName: pokemon.getNameToRender() }), null, () => {
|
||||||
|
this.scene.pokemonInfoContainer.makeRoomForConfirmUi(1, true);
|
||||||
|
this.scene.ui.setMode(Mode.CONFIRM, () => {
|
||||||
|
const newPokemon = this.scene.addPlayerPokemon(pokemon.species, pokemon.level, pokemon.abilityIndex, pokemon.formIndex, pokemon.gender, pokemon.shiny, pokemon.variant, pokemon.ivs, pokemon.nature, pokemon);
|
||||||
|
this.scene.ui.setMode(Mode.SUMMARY, newPokemon, 0, SummaryUiMode.DEFAULT, () => {
|
||||||
|
this.scene.ui.setMode(Mode.MESSAGE).then(() => {
|
||||||
|
promptRelease();
|
||||||
|
});
|
||||||
|
}, false);
|
||||||
|
}, () => {
|
||||||
|
this.scene.ui.setMode(Mode.PARTY, PartyUiMode.RELEASE, this.fieldIndex, (slotIndex: integer, _option: PartyOption) => {
|
||||||
|
this.scene.ui.setMode(Mode.MESSAGE).then(() => {
|
||||||
|
if (slotIndex < 6) {
|
||||||
|
addToParty();
|
||||||
|
} else {
|
||||||
|
promptRelease();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}, () => {
|
||||||
|
this.scene.ui.setMode(Mode.MESSAGE).then(() => {
|
||||||
|
removePokemon();
|
||||||
|
end();
|
||||||
|
});
|
||||||
|
}, "fullParty");
|
||||||
|
});
|
||||||
|
};
|
||||||
|
promptRelease();
|
||||||
|
} else {
|
||||||
|
addToParty();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}, 0, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
removePb() {
|
||||||
|
this.scene.tweens.add({
|
||||||
|
targets: this.pokeball,
|
||||||
|
duration: 250,
|
||||||
|
delay: 250,
|
||||||
|
ease: "Sine.easeIn",
|
||||||
|
alpha: 0,
|
||||||
|
onComplete: () => this.pokeball.destroy()
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
56
src/phases/attempt-run-phase.ts
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
import BattleScene from "#app/battle-scene.js";
|
||||||
|
import { applyAbAttrs, RunSuccessAbAttr } from "#app/data/ability.js";
|
||||||
|
import { Stat } from "#app/enums/stat.js";
|
||||||
|
import { StatusEffect } from "#app/enums/status-effect.js";
|
||||||
|
import Pokemon from "#app/field/pokemon.js";
|
||||||
|
import i18next from "i18next";
|
||||||
|
import * as Utils from "#app/utils.js";
|
||||||
|
import { BattleEndPhase } from "./battle-end-phase";
|
||||||
|
import { NewBattlePhase } from "./new-battle-phase";
|
||||||
|
import { PokemonPhase } from "./pokemon-phase";
|
||||||
|
|
||||||
|
export class AttemptRunPhase extends PokemonPhase {
|
||||||
|
constructor(scene: BattleScene, fieldIndex: integer) {
|
||||||
|
super(scene, fieldIndex);
|
||||||
|
}
|
||||||
|
|
||||||
|
start() {
|
||||||
|
super.start();
|
||||||
|
|
||||||
|
const playerPokemon = this.getPokemon();
|
||||||
|
const enemyField = this.scene.getEnemyField();
|
||||||
|
|
||||||
|
const enemySpeed = enemyField.reduce((total: integer, enemyPokemon: Pokemon) => total + enemyPokemon.getStat(Stat.SPD), 0) / enemyField.length;
|
||||||
|
|
||||||
|
const escapeChance = new Utils.IntegerHolder((((playerPokemon.getStat(Stat.SPD) * 128) / enemySpeed) + (30 * this.scene.currentBattle.escapeAttempts++)) % 256);
|
||||||
|
applyAbAttrs(RunSuccessAbAttr, playerPokemon, null, escapeChance);
|
||||||
|
|
||||||
|
if (playerPokemon.randSeedInt(256) < escapeChance.value) {
|
||||||
|
this.scene.playSound("flee");
|
||||||
|
this.scene.queueMessage(i18next.t("battle:runAwaySuccess"), null, true, 500);
|
||||||
|
|
||||||
|
this.scene.tweens.add({
|
||||||
|
targets: [this.scene.arenaEnemy, enemyField].flat(),
|
||||||
|
alpha: 0,
|
||||||
|
duration: 250,
|
||||||
|
ease: "Sine.easeIn",
|
||||||
|
onComplete: () => enemyField.forEach(enemyPokemon => enemyPokemon.destroy())
|
||||||
|
});
|
||||||
|
|
||||||
|
this.scene.clearEnemyHeldItemModifiers();
|
||||||
|
|
||||||
|
enemyField.forEach(enemyPokemon => {
|
||||||
|
enemyPokemon.hideInfo().then(() => enemyPokemon.destroy());
|
||||||
|
enemyPokemon.hp = 0;
|
||||||
|
enemyPokemon.trySetStatus(StatusEffect.FAINT);
|
||||||
|
});
|
||||||
|
|
||||||
|
this.scene.pushPhase(new BattleEndPhase(this.scene));
|
||||||
|
this.scene.pushPhase(new NewBattlePhase(this.scene));
|
||||||
|
} else {
|
||||||
|
this.scene.queueMessage(i18next.t("battle:runAwayCannotEscape"), null, true, 500);
|
||||||
|
}
|
||||||
|
|
||||||
|
this.end();
|
||||||
|
}
|
||||||
|
}
|
55
src/phases/battle-end-phase.ts
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
import { applyPostBattleAbAttrs, PostBattleAbAttr } from "#app/data/ability.js";
|
||||||
|
import { LapsingPersistentModifier, LapsingPokemonHeldItemModifier } from "#app/modifier/modifier.js";
|
||||||
|
import { BattlePhase } from "./battle-phase";
|
||||||
|
import { GameOverPhase } from "./game-over-phase";
|
||||||
|
|
||||||
|
export class BattleEndPhase extends BattlePhase {
|
||||||
|
start() {
|
||||||
|
super.start();
|
||||||
|
|
||||||
|
this.scene.currentBattle.addBattleScore(this.scene);
|
||||||
|
|
||||||
|
this.scene.gameData.gameStats.battles++;
|
||||||
|
if (this.scene.currentBattle.trainer) {
|
||||||
|
this.scene.gameData.gameStats.trainersDefeated++;
|
||||||
|
}
|
||||||
|
if (this.scene.gameMode.isEndless && this.scene.currentBattle.waveIndex + 1 > this.scene.gameData.gameStats.highestEndlessWave) {
|
||||||
|
this.scene.gameData.gameStats.highestEndlessWave = this.scene.currentBattle.waveIndex + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Endless graceful end
|
||||||
|
if (this.scene.gameMode.isEndless && this.scene.currentBattle.waveIndex >= 5850) {
|
||||||
|
this.scene.clearPhaseQueue();
|
||||||
|
this.scene.unshiftPhase(new GameOverPhase(this.scene, true));
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const pokemon of this.scene.getField()) {
|
||||||
|
if (pokemon) {
|
||||||
|
pokemon.resetBattleSummonData();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const pokemon of this.scene.getParty().filter(p => p.isAllowedInBattle())) {
|
||||||
|
applyPostBattleAbAttrs(PostBattleAbAttr, pokemon);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.scene.currentBattle.moneyScattered) {
|
||||||
|
this.scene.currentBattle.pickUpScatteredMoney(this.scene);
|
||||||
|
}
|
||||||
|
|
||||||
|
this.scene.clearEnemyHeldItemModifiers();
|
||||||
|
|
||||||
|
const lapsingModifiers = this.scene.findModifiers(m => m instanceof LapsingPersistentModifier || m instanceof LapsingPokemonHeldItemModifier) as (LapsingPersistentModifier | LapsingPokemonHeldItemModifier)[];
|
||||||
|
for (const m of lapsingModifiers) {
|
||||||
|
const args: any[] = [];
|
||||||
|
if (m instanceof LapsingPokemonHeldItemModifier) {
|
||||||
|
args.push(this.scene.getPokemonById(m.pokemonId));
|
||||||
|
}
|
||||||
|
if (!m.lapse(args)) {
|
||||||
|
this.scene.removeModifier(m);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
this.scene.updateModifiers().then(() => this.end());
|
||||||
|
}
|
||||||
|
}
|
47
src/phases/battle-phase.ts
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
import BattleScene from "#app/battle-scene.js";
|
||||||
|
import { TrainerSlot } from "#app/data/trainer-config.js";
|
||||||
|
import { Phase } from "#app/phase.js";
|
||||||
|
|
||||||
|
export class BattlePhase extends Phase {
|
||||||
|
constructor(scene: BattleScene) {
|
||||||
|
super(scene);
|
||||||
|
}
|
||||||
|
|
||||||
|
showEnemyTrainer(trainerSlot: TrainerSlot = TrainerSlot.NONE): void {
|
||||||
|
const sprites = this.scene.currentBattle.trainer?.getSprites()!; // TODO: is this bang correct?
|
||||||
|
const tintSprites = this.scene.currentBattle.trainer?.getTintSprites()!; // TODO: is this bang correct?
|
||||||
|
for (let i = 0; i < sprites.length; i++) {
|
||||||
|
const visible = !trainerSlot || !i === (trainerSlot === TrainerSlot.TRAINER) || sprites.length < 2;
|
||||||
|
[sprites[i], tintSprites[i]].map(sprite => {
|
||||||
|
if (visible) {
|
||||||
|
sprite.x = trainerSlot || sprites.length < 2 ? 0 : i ? 16 : -16;
|
||||||
|
}
|
||||||
|
sprite.setVisible(visible);
|
||||||
|
sprite.clearTint();
|
||||||
|
});
|
||||||
|
sprites[i].setVisible(visible);
|
||||||
|
tintSprites[i].setVisible(visible);
|
||||||
|
sprites[i].clearTint();
|
||||||
|
tintSprites[i].clearTint();
|
||||||
|
}
|
||||||
|
this.scene.tweens.add({
|
||||||
|
targets: this.scene.currentBattle.trainer,
|
||||||
|
x: "-=16",
|
||||||
|
y: "+=16",
|
||||||
|
alpha: 1,
|
||||||
|
ease: "Sine.easeInOut",
|
||||||
|
duration: 750
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
hideEnemyTrainer(): void {
|
||||||
|
this.scene.tweens.add({
|
||||||
|
targets: this.scene.currentBattle.trainer,
|
||||||
|
x: "+=16",
|
||||||
|
y: "-=16",
|
||||||
|
alpha: 0,
|
||||||
|
ease: "Sine.easeInOut",
|
||||||
|
duration: 750
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
52
src/phases/berry-phase.ts
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
import { applyAbAttrs, PreventBerryUseAbAttr, HealFromBerryUseAbAttr } from "#app/data/ability.js";
|
||||||
|
import { CommonAnim } from "#app/data/battle-anims.js";
|
||||||
|
import { BerryUsedEvent } from "#app/events/battle-scene.js";
|
||||||
|
import { getPokemonNameWithAffix } from "#app/messages.js";
|
||||||
|
import { BerryModifier } from "#app/modifier/modifier.js";
|
||||||
|
import i18next from "i18next";
|
||||||
|
import * as Utils from "#app/utils.js";
|
||||||
|
import { FieldPhase } from "./field-phase";
|
||||||
|
import { CommonAnimPhase } from "./common-anim-phase";
|
||||||
|
|
||||||
|
/** The phase after attacks where the pokemon eat berries */
|
||||||
|
export class BerryPhase extends FieldPhase {
|
||||||
|
start() {
|
||||||
|
super.start();
|
||||||
|
|
||||||
|
this.executeForAll((pokemon) => {
|
||||||
|
const hasUsableBerry = !!this.scene.findModifier((m) => {
|
||||||
|
return m instanceof BerryModifier && m.shouldApply([pokemon]);
|
||||||
|
}, pokemon.isPlayer());
|
||||||
|
|
||||||
|
if (hasUsableBerry) {
|
||||||
|
const cancelled = new Utils.BooleanHolder(false);
|
||||||
|
pokemon.getOpponents().map((opp) => applyAbAttrs(PreventBerryUseAbAttr, opp, cancelled));
|
||||||
|
|
||||||
|
if (cancelled.value) {
|
||||||
|
pokemon.scene.queueMessage(i18next.t("abilityTriggers:preventBerryUse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }));
|
||||||
|
} else {
|
||||||
|
this.scene.unshiftPhase(
|
||||||
|
new CommonAnimPhase(this.scene, pokemon.getBattlerIndex(), pokemon.getBattlerIndex(), CommonAnim.USE_ITEM)
|
||||||
|
);
|
||||||
|
|
||||||
|
for (const berryModifier of this.scene.applyModifiers(BerryModifier, pokemon.isPlayer(), pokemon) as BerryModifier[]) {
|
||||||
|
if (berryModifier.consumed) {
|
||||||
|
if (!--berryModifier.stackCount) {
|
||||||
|
this.scene.removeModifier(berryModifier);
|
||||||
|
} else {
|
||||||
|
berryModifier.consumed = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.scene.eventTarget.dispatchEvent(new BerryUsedEvent(berryModifier)); // Announce a berry was used
|
||||||
|
}
|
||||||
|
|
||||||
|
this.scene.updateModifiers(pokemon.isPlayer());
|
||||||
|
|
||||||
|
applyAbAttrs(HealFromBerryUseAbAttr, pokemon, new Utils.BooleanHolder(false));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
this.end();
|
||||||
|
}
|
||||||
|
}
|
61
src/phases/check-switch-phase.ts
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
import BattleScene from "#app/battle-scene.js";
|
||||||
|
import { BattleStyle } from "#app/enums/battle-style.js";
|
||||||
|
import { BattlerTagType } from "#app/enums/battler-tag-type.js";
|
||||||
|
import { getPokemonNameWithAffix } from "#app/messages.js";
|
||||||
|
import { Mode } from "#app/ui/ui.js";
|
||||||
|
import i18next from "i18next";
|
||||||
|
import { BattlePhase } from "./battle-phase";
|
||||||
|
import { PostSummonPhase } from "./post-summon-phase";
|
||||||
|
import { SummonMissingPhase } from "./summon-missing-phase";
|
||||||
|
import { SwitchPhase } from "./switch-phase";
|
||||||
|
|
||||||
|
export class CheckSwitchPhase extends BattlePhase {
|
||||||
|
protected fieldIndex: integer;
|
||||||
|
protected useName: boolean;
|
||||||
|
|
||||||
|
constructor(scene: BattleScene, fieldIndex: integer, useName: boolean) {
|
||||||
|
super(scene);
|
||||||
|
|
||||||
|
this.fieldIndex = fieldIndex;
|
||||||
|
this.useName = useName;
|
||||||
|
}
|
||||||
|
|
||||||
|
start() {
|
||||||
|
super.start();
|
||||||
|
|
||||||
|
const pokemon = this.scene.getPlayerField()[this.fieldIndex];
|
||||||
|
|
||||||
|
if (this.scene.battleStyle === BattleStyle.SET) {
|
||||||
|
super.end();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.scene.field.getAll().indexOf(pokemon) === -1) {
|
||||||
|
this.scene.unshiftPhase(new SummonMissingPhase(this.scene, this.fieldIndex));
|
||||||
|
super.end();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!this.scene.getParty().slice(1).filter(p => p.isActive()).length) {
|
||||||
|
super.end();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pokemon.getTag(BattlerTagType.FRENZY)) {
|
||||||
|
super.end();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.scene.ui.showText(i18next.t("battle:switchQuestion", { pokemonName: this.useName ? getPokemonNameWithAffix(pokemon) : i18next.t("battle:pokemon") }), null, () => {
|
||||||
|
this.scene.ui.setMode(Mode.CONFIRM, () => {
|
||||||
|
this.scene.ui.setMode(Mode.MESSAGE);
|
||||||
|
this.scene.tryRemovePhase(p => p instanceof PostSummonPhase && p.player && p.fieldIndex === this.fieldIndex);
|
||||||
|
this.scene.unshiftPhase(new SwitchPhase(this.scene, this.fieldIndex, false, true));
|
||||||
|
this.end();
|
||||||
|
}, () => {
|
||||||
|
this.scene.ui.setMode(Mode.MESSAGE);
|
||||||
|
this.end();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
288
src/phases/command-phase.ts
Normal file
@ -0,0 +1,288 @@
|
|||||||
|
import BattleScene from "#app/battle-scene.js";
|
||||||
|
import { TurnCommand, BattleType } from "#app/battle.js";
|
||||||
|
import { applyCheckTrappedAbAttrs, CheckTrappedAbAttr } from "#app/data/ability.js";
|
||||||
|
import { TrappedTag, EncoreTag } from "#app/data/battler-tags.js";
|
||||||
|
import { MoveTargetSet, getMoveTargets } from "#app/data/move.js";
|
||||||
|
import { speciesStarters } from "#app/data/pokemon-species.js";
|
||||||
|
import { Type } from "#app/data/type.js";
|
||||||
|
import { Abilities } from "#app/enums/abilities.js";
|
||||||
|
import { BattlerTagType } from "#app/enums/battler-tag-type.js";
|
||||||
|
import { Biome } from "#app/enums/biome.js";
|
||||||
|
import { Moves } from "#app/enums/moves.js";
|
||||||
|
import { PokeballType } from "#app/enums/pokeball.js";
|
||||||
|
import { FieldPosition, PlayerPokemon } from "#app/field/pokemon.js";
|
||||||
|
import { getPokemonNameWithAffix } from "#app/messages.js";
|
||||||
|
import { Command } from "#app/ui/command-ui-handler.js";
|
||||||
|
import { Mode } from "#app/ui/ui.js";
|
||||||
|
import i18next from "i18next";
|
||||||
|
import * as Utils from "#app/utils.js";
|
||||||
|
import { FieldPhase } from "./field-phase";
|
||||||
|
import { SelectTargetPhase } from "./select-target-phase";
|
||||||
|
|
||||||
|
export class CommandPhase extends FieldPhase {
|
||||||
|
protected fieldIndex: integer;
|
||||||
|
|
||||||
|
constructor(scene: BattleScene, fieldIndex: integer) {
|
||||||
|
super(scene);
|
||||||
|
|
||||||
|
this.fieldIndex = fieldIndex;
|
||||||
|
}
|
||||||
|
|
||||||
|
start() {
|
||||||
|
super.start();
|
||||||
|
|
||||||
|
if (this.fieldIndex) {
|
||||||
|
// If we somehow are attempting to check the right pokemon but there's only one pokemon out
|
||||||
|
// Switch back to the center pokemon. This can happen rarely in double battles with mid turn switching
|
||||||
|
if (this.scene.getPlayerField().filter(p => p.isActive()).length === 1) {
|
||||||
|
this.fieldIndex = FieldPosition.CENTER;
|
||||||
|
} else {
|
||||||
|
const allyCommand = this.scene.currentBattle.turnCommands[this.fieldIndex - 1];
|
||||||
|
if (allyCommand?.command === Command.BALL || allyCommand?.command === Command.RUN) {
|
||||||
|
this.scene.currentBattle.turnCommands[this.fieldIndex] = { command: allyCommand?.command, skip: true };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.scene.currentBattle.turnCommands[this.fieldIndex]?.skip) {
|
||||||
|
return this.end();
|
||||||
|
}
|
||||||
|
|
||||||
|
const playerPokemon = this.scene.getPlayerField()[this.fieldIndex];
|
||||||
|
|
||||||
|
const moveQueue = playerPokemon.getMoveQueue();
|
||||||
|
|
||||||
|
while (moveQueue.length && moveQueue[0]
|
||||||
|
&& moveQueue[0].move && (!playerPokemon.getMoveset().find(m => m?.moveId === moveQueue[0].move)
|
||||||
|
|| !playerPokemon.getMoveset()[playerPokemon.getMoveset().findIndex(m => m?.moveId === moveQueue[0].move)]!.isUsable(playerPokemon, moveQueue[0].ignorePP))) { // TODO: is the bang correct?
|
||||||
|
moveQueue.shift();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (moveQueue.length) {
|
||||||
|
const queuedMove = moveQueue[0];
|
||||||
|
if (!queuedMove.move) {
|
||||||
|
this.handleCommand(Command.FIGHT, -1, false);
|
||||||
|
} else {
|
||||||
|
const moveIndex = playerPokemon.getMoveset().findIndex(m => m?.moveId === queuedMove.move);
|
||||||
|
if (moveIndex > -1 && playerPokemon.getMoveset()[moveIndex]!.isUsable(playerPokemon, queuedMove.ignorePP)) { // TODO: is the bang correct?
|
||||||
|
this.handleCommand(Command.FIGHT, moveIndex, queuedMove.ignorePP, { targets: queuedMove.targets, multiple: queuedMove.targets.length > 1 });
|
||||||
|
} else {
|
||||||
|
this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
handleCommand(command: Command, cursor: integer, ...args: any[]): boolean {
|
||||||
|
const playerPokemon = this.scene.getPlayerField()[this.fieldIndex];
|
||||||
|
const enemyField = this.scene.getEnemyField();
|
||||||
|
let success: boolean;
|
||||||
|
|
||||||
|
switch (command) {
|
||||||
|
case Command.FIGHT:
|
||||||
|
let useStruggle = false;
|
||||||
|
if (cursor === -1 ||
|
||||||
|
playerPokemon.trySelectMove(cursor, args[0] as boolean) ||
|
||||||
|
(useStruggle = cursor > -1 && !playerPokemon.getMoveset().filter(m => m?.isUsable(playerPokemon)).length)) {
|
||||||
|
const moveId = !useStruggle ? cursor > -1 ? playerPokemon.getMoveset()[cursor]!.moveId : Moves.NONE : Moves.STRUGGLE; // TODO: is the bang correct?
|
||||||
|
const turnCommand: TurnCommand = { command: Command.FIGHT, cursor: cursor, move: { move: moveId, targets: [], ignorePP: args[0] }, args: args };
|
||||||
|
const moveTargets: MoveTargetSet = args.length < 3 ? getMoveTargets(playerPokemon, moveId) : args[2];
|
||||||
|
if (!moveId) {
|
||||||
|
turnCommand.targets = [this.fieldIndex];
|
||||||
|
}
|
||||||
|
console.log(moveTargets, getPokemonNameWithAffix(playerPokemon));
|
||||||
|
if (moveTargets.targets.length > 1 && moveTargets.multiple) {
|
||||||
|
this.scene.unshiftPhase(new SelectTargetPhase(this.scene, this.fieldIndex));
|
||||||
|
}
|
||||||
|
if (moveTargets.targets.length <= 1 || moveTargets.multiple) {
|
||||||
|
turnCommand.move!.targets = moveTargets.targets; //TODO: is the bang correct here?
|
||||||
|
} else if (playerPokemon.getTag(BattlerTagType.CHARGING) && playerPokemon.getMoveQueue().length >= 1) {
|
||||||
|
turnCommand.move!.targets = playerPokemon.getMoveQueue()[0].targets; //TODO: is the bang correct here?
|
||||||
|
} else {
|
||||||
|
this.scene.unshiftPhase(new SelectTargetPhase(this.scene, this.fieldIndex));
|
||||||
|
}
|
||||||
|
this.scene.currentBattle.turnCommands[this.fieldIndex] = turnCommand;
|
||||||
|
success = true;
|
||||||
|
} else if (cursor < playerPokemon.getMoveset().length) {
|
||||||
|
const move = playerPokemon.getMoveset()[cursor]!; //TODO: is this bang correct?
|
||||||
|
this.scene.ui.setMode(Mode.MESSAGE);
|
||||||
|
|
||||||
|
// Decides between a Disabled, Not Implemented, or No PP translation message
|
||||||
|
const errorMessage =
|
||||||
|
playerPokemon.summonData.disabledMove === move.moveId ? "battle:moveDisabled" :
|
||||||
|
move.getName().endsWith(" (N)") ? "battle:moveNotImplemented" : "battle:moveNoPP";
|
||||||
|
const moveName = move.getName().replace(" (N)", ""); // Trims off the indicator
|
||||||
|
|
||||||
|
this.scene.ui.showText(i18next.t(errorMessage, { moveName: moveName }), null, () => {
|
||||||
|
this.scene.ui.clearText();
|
||||||
|
this.scene.ui.setMode(Mode.FIGHT, this.fieldIndex);
|
||||||
|
}, null, true);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case Command.BALL:
|
||||||
|
const notInDex = (this.scene.getEnemyField().filter(p => p.isActive(true)).some(p => !p.scene.gameData.dexData[p.species.speciesId].caughtAttr) && this.scene.gameData.getStarterCount(d => !!d.caughtAttr) < Object.keys(speciesStarters).length - 1);
|
||||||
|
if (this.scene.arena.biomeType === Biome.END && (!this.scene.gameMode.isClassic || this.scene.gameMode.isFreshStartChallenge() || notInDex )) {
|
||||||
|
this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex);
|
||||||
|
this.scene.ui.setMode(Mode.MESSAGE);
|
||||||
|
this.scene.ui.showText(i18next.t("battle:noPokeballForce"), null, () => {
|
||||||
|
this.scene.ui.showText("", 0);
|
||||||
|
this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex);
|
||||||
|
}, null, true);
|
||||||
|
} else if (this.scene.currentBattle.battleType === BattleType.TRAINER) {
|
||||||
|
this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex);
|
||||||
|
this.scene.ui.setMode(Mode.MESSAGE);
|
||||||
|
this.scene.ui.showText(i18next.t("battle:noPokeballTrainer"), null, () => {
|
||||||
|
this.scene.ui.showText("", 0);
|
||||||
|
this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex);
|
||||||
|
}, null, true);
|
||||||
|
} else {
|
||||||
|
const targets = this.scene.getEnemyField().filter(p => p.isActive(true)).map(p => p.getBattlerIndex());
|
||||||
|
if (targets.length > 1) {
|
||||||
|
this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex);
|
||||||
|
this.scene.ui.setMode(Mode.MESSAGE);
|
||||||
|
this.scene.ui.showText(i18next.t("battle:noPokeballMulti"), null, () => {
|
||||||
|
this.scene.ui.showText("", 0);
|
||||||
|
this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex);
|
||||||
|
}, null, true);
|
||||||
|
} else if (cursor < 5) {
|
||||||
|
const targetPokemon = this.scene.getEnemyField().find(p => p.isActive(true));
|
||||||
|
if (targetPokemon?.isBoss() && targetPokemon?.bossSegmentIndex >= 1 && !targetPokemon?.hasAbility(Abilities.WONDER_GUARD, false, true) && cursor < PokeballType.MASTER_BALL) {
|
||||||
|
this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex);
|
||||||
|
this.scene.ui.setMode(Mode.MESSAGE);
|
||||||
|
this.scene.ui.showText(i18next.t("battle:noPokeballStrong"), null, () => {
|
||||||
|
this.scene.ui.showText("", 0);
|
||||||
|
this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex);
|
||||||
|
}, null, true);
|
||||||
|
} else {
|
||||||
|
this.scene.currentBattle.turnCommands[this.fieldIndex] = { command: Command.BALL, cursor: cursor };
|
||||||
|
this.scene.currentBattle.turnCommands[this.fieldIndex]!.targets = targets;
|
||||||
|
if (this.fieldIndex) {
|
||||||
|
this.scene.currentBattle.turnCommands[this.fieldIndex - 1]!.skip = true;
|
||||||
|
}
|
||||||
|
success = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case Command.POKEMON:
|
||||||
|
case Command.RUN:
|
||||||
|
const isSwitch = command === Command.POKEMON;
|
||||||
|
if (!isSwitch && this.scene.arena.biomeType === Biome.END) {
|
||||||
|
this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex);
|
||||||
|
this.scene.ui.setMode(Mode.MESSAGE);
|
||||||
|
this.scene.ui.showText(i18next.t("battle:noEscapeForce"), null, () => {
|
||||||
|
this.scene.ui.showText("", 0);
|
||||||
|
this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex);
|
||||||
|
}, null, true);
|
||||||
|
} else if (!isSwitch && this.scene.currentBattle.battleType === BattleType.TRAINER) {
|
||||||
|
this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex);
|
||||||
|
this.scene.ui.setMode(Mode.MESSAGE);
|
||||||
|
this.scene.ui.showText(i18next.t("battle:noEscapeTrainer"), null, () => {
|
||||||
|
this.scene.ui.showText("", 0);
|
||||||
|
this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex);
|
||||||
|
}, null, true);
|
||||||
|
} else {
|
||||||
|
const trapTag = playerPokemon.findTag(t => t instanceof TrappedTag) as TrappedTag;
|
||||||
|
const trapped = new Utils.BooleanHolder(false);
|
||||||
|
const batonPass = isSwitch && args[0] as boolean;
|
||||||
|
const trappedAbMessages: string[] = [];
|
||||||
|
if (!batonPass) {
|
||||||
|
enemyField.forEach(enemyPokemon => applyCheckTrappedAbAttrs(CheckTrappedAbAttr, enemyPokemon, trapped, playerPokemon, true, trappedAbMessages));
|
||||||
|
}
|
||||||
|
if (batonPass || (!trapTag && !trapped.value)) {
|
||||||
|
this.scene.currentBattle.turnCommands[this.fieldIndex] = isSwitch
|
||||||
|
? { command: Command.POKEMON, cursor: cursor, args: args }
|
||||||
|
: { command: Command.RUN };
|
||||||
|
success = true;
|
||||||
|
if (!isSwitch && this.fieldIndex) {
|
||||||
|
this.scene.currentBattle.turnCommands[this.fieldIndex - 1]!.skip = true;
|
||||||
|
}
|
||||||
|
} else if (trapTag) {
|
||||||
|
if (trapTag.sourceMove === Moves.INGRAIN && trapTag.sourceId && this.scene.getPokemonById(trapTag.sourceId)?.isOfType(Type.GHOST)) {
|
||||||
|
success = true;
|
||||||
|
this.scene.currentBattle.turnCommands[this.fieldIndex] = isSwitch
|
||||||
|
? { command: Command.POKEMON, cursor: cursor, args: args }
|
||||||
|
: { command: Command.RUN };
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (!isSwitch) {
|
||||||
|
this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex);
|
||||||
|
this.scene.ui.setMode(Mode.MESSAGE);
|
||||||
|
}
|
||||||
|
this.scene.ui.showText(
|
||||||
|
i18next.t("battle:noEscapePokemon", {
|
||||||
|
pokemonName: trapTag.sourceId && this.scene.getPokemonById(trapTag.sourceId) ? getPokemonNameWithAffix(this.scene.getPokemonById(trapTag.sourceId)!) : "",
|
||||||
|
moveName: trapTag.getMoveName(),
|
||||||
|
escapeVerb: isSwitch ? i18next.t("battle:escapeVerbSwitch") : i18next.t("battle:escapeVerbFlee")
|
||||||
|
}),
|
||||||
|
null,
|
||||||
|
() => {
|
||||||
|
this.scene.ui.showText("", 0);
|
||||||
|
if (!isSwitch) {
|
||||||
|
this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex);
|
||||||
|
}
|
||||||
|
}, null, true);
|
||||||
|
} else if (trapped.value && trappedAbMessages.length > 0) {
|
||||||
|
if (!isSwitch) {
|
||||||
|
this.scene.ui.setMode(Mode.MESSAGE);
|
||||||
|
}
|
||||||
|
this.scene.ui.showText(trappedAbMessages[0], null, () => {
|
||||||
|
this.scene.ui.showText("", 0);
|
||||||
|
if (!isSwitch) {
|
||||||
|
this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex);
|
||||||
|
}
|
||||||
|
}, null, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (success!) { // TODO: is the bang correct?
|
||||||
|
this.end();
|
||||||
|
}
|
||||||
|
|
||||||
|
return success!; // TODO: is the bang correct?
|
||||||
|
}
|
||||||
|
|
||||||
|
cancel() {
|
||||||
|
if (this.fieldIndex) {
|
||||||
|
this.scene.unshiftPhase(new CommandPhase(this.scene, 0));
|
||||||
|
this.scene.unshiftPhase(new CommandPhase(this.scene, 1));
|
||||||
|
this.end();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
checkFightOverride(): boolean {
|
||||||
|
const pokemon = this.getPokemon();
|
||||||
|
|
||||||
|
const encoreTag = pokemon.getTag(EncoreTag) as EncoreTag;
|
||||||
|
|
||||||
|
if (!encoreTag) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
const moveIndex = pokemon.getMoveset().findIndex(m => m?.moveId === encoreTag.moveId);
|
||||||
|
|
||||||
|
if (moveIndex === -1 || !pokemon.getMoveset()[moveIndex]!.isUsable(pokemon)) { // TODO: is this bang correct?
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.handleCommand(Command.FIGHT, moveIndex, false);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
getFieldIndex(): integer {
|
||||||
|
return this.fieldIndex;
|
||||||
|
}
|
||||||
|
|
||||||
|
getPokemon(): PlayerPokemon {
|
||||||
|
return this.scene.getPlayerField()[this.fieldIndex];
|
||||||
|
}
|
||||||
|
|
||||||
|
end() {
|
||||||
|
this.scene.ui.setMode(Mode.MESSAGE).then(() => super.end());
|
||||||
|
}
|
||||||
|
}
|
26
src/phases/common-anim-phase.ts
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
import BattleScene from "#app/battle-scene.js";
|
||||||
|
import { BattlerIndex } from "#app/battle.js";
|
||||||
|
import { CommonAnim, CommonBattleAnim } from "#app/data/battle-anims.js";
|
||||||
|
import { PokemonPhase } from "./pokemon-phase";
|
||||||
|
|
||||||
|
export class CommonAnimPhase extends PokemonPhase {
|
||||||
|
private anim: CommonAnim | null;
|
||||||
|
private targetIndex: integer | undefined;
|
||||||
|
|
||||||
|
constructor(scene: BattleScene, battlerIndex?: BattlerIndex, targetIndex?: BattlerIndex | undefined, anim?: CommonAnim) {
|
||||||
|
super(scene, battlerIndex);
|
||||||
|
|
||||||
|
this.anim = anim!; // TODO: is this bang correct?
|
||||||
|
this.targetIndex = targetIndex;
|
||||||
|
}
|
||||||
|
|
||||||
|
setAnimation(anim: CommonAnim) {
|
||||||
|
this.anim = anim;
|
||||||
|
}
|
||||||
|
|
||||||
|
start() {
|
||||||
|
new CommonBattleAnim(this.anim, this.getPokemon(), this.targetIndex !== undefined ? (this.player ? this.scene.getEnemyField() : this.scene.getPlayerField())[this.targetIndex] : this.getPokemon()).play(this.scene, () => {
|
||||||
|
this.end();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|