Compare commits

...

45 Commits

Author SHA1 Message Date
Madmadness65
e84bd3ac89 Update for settings menu refactor AGAIN 2024-06-06 10:52:25 -05:00
Madmadness65
ed153f040f Merge branch 'main' into more_music 2024-06-06 10:42:49 -05:00
MrWaterT
ba66f2c916
[Bug] Remove text on summary bg (#1709) 2024-06-06 11:31:31 -04:00
SeafoamQueen
3fea384dc1
[Feature] Added Battle Style setting (#1872)
* Added Battle Style setting with Shift and Set options

* Changed 'Shift' option to 'Switch' to match the Gen 8 setting.
2024-06-06 11:26:04 -04:00
José Ricardo Fleury Oliveira
cb27fc2b06
[Localization] ptBR removing capital letters in battle.ts (#1873) 2024-06-06 11:19:38 -04:00
h44451890
94099e0fba
Fix all ability name and description of zh_tw (#1478) 2024-06-06 10:17:53 -05:00
Lee ByungHoon
081d813540
[Feature] Move to start button when you can't add party anymore (#1673)
* [Feature] Move to start button when you can't add party anymore

* Add comment about #1673

* Update starter-select-ui-handler.ts

---------

Co-authored-by: Benjamin Odom <bennybroseph@gmail.com>
2024-06-06 10:12:19 -05:00
c4vv
e0401a93aa
[Bug] Fix generateVariant to account for forms (#1783)
* Add form check to generateVaraint

* Add index check

* Fix for typedoc
2024-06-06 10:55:50 -04:00
SeafoamQueen
5ac1b7245f
[Feature] Refactored Game Settings UI navigation menu and sorting (#1860)
* Refactored settings UI menu options and added the battle style setting

* Removed the new Battle Style setting. It will be added in a seperate PR.

* Fixed typo and spacing
2024-06-06 10:38:54 -04:00
dorri-riddo
63ce24afb2
[Localization] #1761 Korean trainer dialogue (ramos, viola) (#1868) 2024-06-06 10:22:46 -04:00
José Ricardo Fleury Oliveira
9c4c4005ae
[Localization] ptBr battle.ts translations (#1870) 2024-06-06 10:12:40 -04:00
Greenlamp2
5764324f61
fix display touch control V in battle (#1869) 2024-06-06 09:47:08 -04:00
Laeticia PIERRE
f53dce432b
useMove + pokemon affix localization (#1276)
* useMove + pokemonPrefix localization

* Rename prefix to affix + line break fr

* getPokemonAffix to getPokemonNameWithAffix + remove space + replace

* Better getPokemonNameWithAffix switch

* Ko locale + fix es locale

* Doc getPokemonNameWithAffix + getPokemonMessage + fix

* Ko translate / missing weather changes

* Fix conflicts getPokemonPrefix

---------

Co-authored-by: Benjamin Odom <bennybroseph@gmail.com>
2024-06-06 08:36:12 -05:00
Frede
40328d5712
[BUG] Fix Move Info Overlay Scroll Bug (#1856)
* Added "Skip Dialogues" option (if at least 1 classic win)

* Removed error sound and hide option instead when classic wins = 0

* Add skip dialogues option to Unlockables and show unlocked message on first classic win

* Only skips seen dialogues, removed dialogue option from unlockables, seen dialogues get saved to local storage

* oops

* dont show charSprite when skipping a dialogue, small fixes

* correctly reset move description scrolling when changing move

* override fix

---------

Co-authored-by: Frederik Hobein <frederik.hobein@nterra.com>
2024-06-06 08:22:37 -05:00
José Ricardo Fleury Oliveira
0e9bcfb4fd
[Bug] Minor ptBR mint fix (#1852) 2024-06-06 01:23:44 -04:00
flx-sta
a8489cc707
[Bug] Revert start-label text to translation (#1855) 2024-06-06 01:18:54 -04:00
Benjamin Odom
5e52be676f
[QoL] Add Time of Day Widget to Arena Flyout (#1846)
* Time of Day Sample

* Add Proper Time of Day Tracking

* Add Settings
2024-06-05 22:57:55 -05:00
AJ Fontaine
daa9e1ef0f
[BUG] Fix fullheal, burn/poison, and endure tokens in existing saves not updating after rebalance (#1848)
* Fix tokens not actually updating

* Remove changes to getArgs

* Added parentheses around conditional for safety

* Laid a space betwixt the two and its respective one at the behest of Temp
2024-06-05 23:07:47 -04:00
José Ricardo Fleury Oliveira
c1b4be83d0
translations (#1850) 2024-06-05 21:52:59 -05:00
returntoice
6b31db0bc5
[Localization] Paldean gym leaders and elite 4 dialogue Korean translation (#1838)
* Your commit message

* localization
2024-06-05 21:54:08 -04:00
sodam
19114e4fd3
[Localization] #1761 Korean trainer dialogue (Gym leader in Hoenn region) (#1830)
* localized to korean (Gym leader's dialouge in Houenn region)

* modified the spacing

Co-authored-by: returntoice <dieandbecome@gmail.com>

* modified the spacing

Co-authored-by: returntoice <dieandbecome@gmail.com>

* modified the spelling

Co-authored-by: returntoice <dieandbecome@gmail.com>

---------

Co-authored-by: returntoice <dieandbecome@gmail.com>
2024-06-05 21:52:30 -04:00
prime
1c98106642
[QoL] Move Info Overlay (#1585)
* move info implemented for starter selection

a move info box is displayed when editing the starter moveset.

also menus have now onHover triggers.

todo:
- show ui when selecting TMs
- show ui when selecting moves to remember (memory mushroom)

* More Move Info Overlays

Added overlays during Memory Mushroom use and when viewing TMs.
Furthermore a settings option can enable/disable those overlays.

* Added missing ko language entry

... though translation still remains necessary

* updated ui

also added overrides for item rewards

* minor ui update

moved values to the right in the tm move info box

* fixed typedoc issues

* removed settings in to prepare for merge

* updated settings option

added settings option to new settings implementation

* minor changes

removed unused graphic
moved settings option to accessibility
2024-06-05 20:28:12 -05:00
Matthew
c5689dfc96
dont make api calls when no server is connected in local (#1847)
* dont make api calls in local without a server connected and fix fusionLuck not set by default
2024-06-05 21:24:47 -04:00
Tempoanon
6d35399c31
[Bug] Change confuse chance from 2/3 to 1/3 (#1827) 2024-06-05 20:05:44 -05:00
flx-sta
283714bd0f
[Refactor] Move enums from game-data into their respective files in src/data/enums (#1837)
* move PlayerGender enum into src/data/enums/player-gender.ts

this is necessary to avoid circular dependencies which did crash tests in the past (in PRs)

* Update settings.ts

* Update game-data.ts

* Update summary-ui-handler.ts

* Update ui.ts

* move Passive & GameDataType enums into own files
2024-06-05 19:11:07 -05:00
Blitzy
46dc7e9b01
[Balance] Give Partner Pikachu its Signature Moves and change Cosplay's stats (#1737)
* Update Cosplay Pikachu stats

* Give Partner Pikachu its signature moves in its learnset

* Added a "custom" note next to stats

* Spread out signatures per Brain Frog's request
2024-06-05 16:56:31 -05:00
Xavion3
4b36d38acb
Hotfix for NaN luck (#1840)
Makes luck default to 0 if false-y
2024-06-05 20:42:15 +01:00
Matthew Olker
3855b92237 fix weird luck when catching a fused mon 2024-06-05 15:41:04 -04:00
José Ricardo Fleury Oliveira
4a9fe763a5
[ptBR] Translated text (#1821)
* translated disclaimer

* minor fix
2024-06-05 12:44:48 -05:00
YounesM
e614aec8ca
[Bug] Fix for Dancer activating when enemy in not on field / using a 2 steps charging move (#1708)
* Fixes !1686 and !1450

* Added forbidden tags

* Restored original import indentations

* Restored missing import
2024-06-05 13:10:24 -04:00
Matthew Olker
b532a6b2d0 okay not that lucky 2024-06-05 11:21:47 -04:00
Matthew Olker
6d71db0f13 luck based encounter 2024-06-05 11:02:58 -04:00
NightKev
395fa6e33d
[Bug] Allow second mon of a fusion to learn/remember on-evo moves (#1778)
Fixes #520
2024-06-05 10:36:42 -04:00
GoldTra
dce4518b93
Updated Spanish translations (#1825) 2024-06-05 09:24:33 -05:00
Frede
fe732bbbe6
[QoL] Pokemon Info Container hides Enemy Modifier Bar (#1820)
* Added "Skip Dialogues" option (if at least 1 classic win)

* Removed error sound and hide option instead when classic wins = 0

* Add skip dialogues option to Unlockables and show unlocked message on first classic win

* Only skips seen dialogues, removed dialogue option from unlockables, seen dialogues get saved to local storage

* oops

* dont show charSprite when skipping a dialogue, small fixes

* pokemonInfoContainer always on top of battle UI when shown

* removed setDepth and rather hide enemyModifierBar

---------

Co-authored-by: Frederik Hobein <frederik.hobein@nterra.com>
2024-06-05 10:09:06 -04:00
Lee ByungHoon
e599931ff3
[Localization] Add Korean trainer dialogue (youngster, lass) (#1809)
* [Localization] #1761 Korean trainer dialogue (youngster, lass)

* changed ellipsis character that used 3 character to used 1 character.

* Update src/locales/ko/dialogue.ts

Co-authored-by: returntoice <dieandbecome@gmail.com>

* Update src/locales/ko/dialogue.ts

Co-authored-by: returntoice <dieandbecome@gmail.com>

* Update src/locales/ko/dialogue.ts

Co-authored-by: returntoice <dieandbecome@gmail.com>

---------

Co-authored-by: returntoice <dieandbecome@gmail.com>
2024-06-05 10:00:43 -04:00
Adrian T
bd34fc0b47
[Bug] Fix quick claw message showing if command is not fight (#1819) 2024-06-05 09:38:43 -04:00
Madmadness65
219f227cab Remove basic Voucher from Ultra item pool
It should only be in the Great item pool now.
2024-06-04 21:53:22 -05:00
sodam
7cc5ca1839
[Localization] Korean Kanto gym leader dialogue ( (#1794)
* localized to korean (Gym leader's dialouge at Kanto region)

* modified Brock's dialogue clearly

* Add missed word to lt_surge's dialogue
2024-06-04 22:17:49 -04:00
Madmadness65
1dd7a792d4 Fix Wide Lens being accidentally added to Rogue pool 2024-06-04 21:15:10 -05:00
damocleas
dd3ffb4315
Voucher Item tier changes/addition (#1516)
* Voucher Item tier changes/addition

- Voucher moved from Ultra -> Great Tier, given a weight of 1 and disappears after first reroll, should still appear more often with a healthy team than in ultra tier at all.
- Voucher Plus moved from Master -> Rogue Tier, with weight starting at 9 -> 5 and decreasing with each reroll with 3 -> 2
Should appear just a bit more often than before.
- Voucher Premium added to Master (based on suggestion from Madmadness) with same weight as new Voucher Plus, and disabled in Endless / Endless Spliced
Should appear ~20% of the time with *perfect luck* in a whole average classic run.

Overall would be a 40-45% increase in total eggs in perfect conditions (luck, healthy team, etc.)

* fixed an extra spacebar at the end of 1303

* fixed an extra spacebar at the end of 1360

* fixed to account for Wide Lens being added
2024-06-04 22:05:29 -04:00
Matthew Olker
7eb0e8e77d revert pokemon info container depth change 2024-06-04 21:45:36 -04:00
Matthew Olker
7c9e5e9f52 loading screen disclaimer 2024-06-04 21:41:36 -04:00
Matthew Olker
5464f964c9 add more gameobject names for debugging 2024-06-04 21:06:46 -04:00
Frede
cfe9b3303a
[QoL] Pokemon Info Container always on top of Battle UI (#1782)
* Added "Skip Dialogues" option (if at least 1 classic win)

* Removed error sound and hide option instead when classic wins = 0

* Add skip dialogues option to Unlockables and show unlocked message on first classic win

* Only skips seen dialogues, removed dialogue option from unlockables, seen dialogues get saved to local storage

* oops

* dont show charSprite when skipping a dialogue, small fixes

* pokemonInfoContainer always on top of battle UI when shown

---------

Co-authored-by: Frederik Hobein <frederik.hobein@nterra.com>
2024-06-04 21:05:25 -04:00
114 changed files with 1776 additions and 875 deletions

View File

@ -146,8 +146,8 @@ body {
margin-left: 10%;
}
#touchControls:not([data-ui-mode='STARTER_SELECT']):not([data-ui-mode='SETTINGS']):not([data-ui-mode='SETTINGS_ACCESSIBILITY']):not([data-ui-mode='SETTINGS_GAMEPAD']):not([data-ui-mode='SETTINGS_KEYBOARD']) #apad .apadRectBtnContainer > .apadSqBtn,
#touchControls:not([data-ui-mode='STARTER_SELECT']):not([data-ui-mode='SETTINGS']):not([data-ui-mode='SETTINGS_ACCESSIBILITY']):not([data-ui-mode='SETTINGS_GAMEPAD']):not([data-ui-mode='SETTINGS_KEYBOARD']) #apad .apadSqBtnContainer
#touchControls:not([data-ui-mode='STARTER_SELECT']):not([data-ui-mode='SETTINGS']):not([data-ui-mode='SETTINGS_DISPLAY']):not([data-ui-mode='SETTINGS_AUDIO']):not([data-ui-mode='SETTINGS_GAMEPAD']):not([data-ui-mode='SETTINGS_KEYBOARD']) #apad .apadRectBtnContainer > .apadSqBtn,
#touchControls:not([data-ui-mode='STARTER_SELECT']):not([data-ui-mode='SETTINGS']):not([data-ui-mode='SETTINGS_DISPLAY']):not([data-ui-mode='SETTINGS_AUDIO']):not([data-ui-mode='SETTINGS_GAMEPAD']):not([data-ui-mode='SETTINGS_KEYBOARD']) #apad .apadSqBtnContainer
{
display: none;
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 581 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 186 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 347 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 273 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 593 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 186 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 398 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 245 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 534 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 186 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 388 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 235 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 327 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 150 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 249 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 239 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 285 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 186 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 255 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 151 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 300 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 150 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 252 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 219 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 288 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 150 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 240 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 120 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 686 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 186 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 440 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 271 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

After

Width:  |  Height:  |  Size: 2.1 KiB

View File

@ -20,6 +20,11 @@ export enum BattleSceneEventType {
*/
BERRY_USED = "onBerryUsed",
/**
* Triggers at the start of each new encounter
* @see {@linkcode EncounterPhaseEvent}
*/
ENCOUNTER_PHASE = "onEncounterPhase",
/**
* Triggers on the first turn of a new battle
* @see {@linkcode TurnInitEvent}
@ -85,6 +90,15 @@ export class BerryUsedEvent extends Event {
}
}
/**
* Container class for {@linkcode BattleSceneEventType.ENCOUNTER_PHASE} events
* @extends Event
*/
export class EncounterPhaseEvent extends Event {
constructor() {
super(BattleSceneEventType.ENCOUNTER_PHASE);
}
}
/**
* Container class for {@linkcode BattleSceneEventType.TURN_INIT} events
* @extends Event

View File

@ -11,7 +11,8 @@ import { Phase } from "./phase";
import { initGameSpeed } from "./system/game-speed";
import { Biome } from "./data/enums/biome";
import { Arena, ArenaBase } from "./field/arena";
import { GameData, PlayerGender } from "./system/game-data";
import { GameData } from "./system/game-data";
import { PlayerGender } from "./data/enums/player-gender";
import { TextStyle, addTextObject } from "./ui/text";
import { Moves } from "./data/enums/moves";
import { allMoves } from "./data/move";
@ -59,6 +60,7 @@ import {UiInputs} from "./ui-inputs";
import { MoneyFormat } from "./enums/money-format";
import { NewArenaEvent } from "./battle-scene-events";
import ArenaFlyout from "./ui/arena-flyout";
import { EaseType } from "./ui/enums/ease-type";
export const bypassLogin = import.meta.env.VITE_BYPASS_LOGIN === "1";
@ -70,15 +72,20 @@ const expSpriteKeys: string[] = [];
export let starterColors: StarterColors;
interface StarterColors {
[key: string]: [string, string]
[key: string]: [string, string]
}
export interface PokeballCounts {
[pb: string]: integer;
[pb: string]: integer;
}
export type AnySound = Phaser.Sound.WebAudioSound | Phaser.Sound.HTML5AudioSound | Phaser.Sound.NoAudioSound;
export interface InfoToggle {
toggleInfo(force?: boolean): void;
isActive(): boolean;
}
export default class BattleScene extends SceneBase {
public rexUI: UIPlugin;
public inputController: InputsController;
@ -94,8 +101,11 @@ export default class BattleScene extends SceneBase {
public reroll: boolean = false;
public showMovesetFlyout: boolean = true;
public showArenaFlyout: boolean = true;
public showTimeOfDayWidget: boolean = true;
public timeOfDayAnimation: EaseType = EaseType.NONE;
public showLevelUpStats: boolean = true;
public enableTutorials: boolean = import.meta.env.VITE_BYPASS_TUTORIAL === "1";
public enableMoveInfo: boolean = true;
public enableRetries: boolean = false;
/**
* Determines the condition for a notification should be shown for Candy Upgrades
@ -120,22 +130,28 @@ export default class BattleScene extends SceneBase {
public skipSeenDialogues: boolean = false;
/**
* Defines the experience gain display mode.
*
* @remarks
* The `expParty` can have several modes:
* - `0` - Default: The normal experience gain display, nothing changed.
* - `1` - Level Up Notification: Displays the level up in the small frame instead of a message.
* - `2` - Skip: No level up frame nor message.
*
* Modes `1` and `2` are still compatible with stats display, level up, new move, etc.
* @default 0 - Uses the default normal experience gain display.
*/
* Defines the experience gain display mode.
*
* @remarks
* The `expParty` can have several modes:
* - `0` - Default: The normal experience gain display, nothing changed.
* - `1` - Level Up Notification: Displays the level up in the small frame instead of a message.
* - `2` - Skip: No level up frame nor message.
*
* Modes `1` and `2` are still compatible with stats display, level up, new move, etc.
* @default 0 - Uses the default normal experience gain display.
*/
public expParty: integer = 0;
public hpBarSpeed: integer = 0;
public fusionPaletteSwaps: boolean = true;
public enableTouchControls: boolean = false;
public enableVibration: boolean = false;
/**
* Determines the selected battle style.
* - 0 = 'Shift'
* - 1 = 'Set' - The option to switch the active pokemon at the start of a battle will not display.
*/
public battleStyle: integer = 0;
public disableMenu: boolean = false;
@ -209,6 +225,8 @@ export default class BattleScene extends SceneBase {
public rngSeedOverride: string = "";
public rngOffset: integer = 0;
private infoToggles: InfoToggle[] = [];
/**
* Allows subscribers to listen for events
*
@ -515,7 +533,7 @@ export default class BattleScene extends SceneBase {
this.playTimeTimer = this.time.addEvent({
delay: Utils.fixedInt(1000),
repeat: -1,
callback: () => {
callback: () => {
if (this.gameData) {
this.gameData.gameStats.playTime++;
}
@ -599,25 +617,25 @@ export default class BattleScene extends SceneBase {
/*const loadPokemonAssets: Promise<void>[] = [];
for (let s of Object.keys(speciesStarters)) {
const species = getPokemonSpecies(parseInt(s));
loadPokemonAssets.push(species.loadAssets(this, false, 0, false));
}
for (let s of Object.keys(speciesStarters)) {
const species = getPokemonSpecies(parseInt(s));
loadPokemonAssets.push(species.loadAssets(this, false, 0, false));
}
Promise.all(loadPokemonAssets).then(() => {
const starterCandyColors = {};
const rgbaToHexFunc = (r, g, b) => [r, g, b].map(x => x.toString(16).padStart(2, '0')).join('');
Promise.all(loadPokemonAssets).then(() => {
const starterCandyColors = {};
const rgbaToHexFunc = (r, g, b) => [r, g, b].map(x => x.toString(16).padStart(2, '0')).join('');
for (let s of Object.keys(speciesStarters)) {
const species = getPokemonSpecies(parseInt(s));
for (let s of Object.keys(speciesStarters)) {
const species = getPokemonSpecies(parseInt(s));
starterCandyColors[species.speciesId] = species.generateCandyColors(this).map(c => rgbaToHexFunc(c[0], c[1], c[2]));
}
starterCandyColors[species.speciesId] = species.generateCandyColors(this).map(c => rgbaToHexFunc(c[0], c[1], c[2]));
}
console.log(JSON.stringify(starterCandyColors));
console.log(JSON.stringify(starterCandyColors));
resolve();
});*/
resolve();
});*/
resolve();
});
@ -682,6 +700,16 @@ export default class BattleScene extends SceneBase {
: ret;
}
// store info toggles to be accessible by the ui
addInfoToggle(infoToggle: InfoToggle): void {
this.infoToggles.push(infoToggle);
}
// return the stored info toggles; used by ui-inputs
getInfoToggles(activeOnly: boolean = false): InfoToggle[] {
return activeOnly ? this.infoToggles.filter(t => t?.isActive()) : this.infoToggles;
}
getPokemonById(pokemonId: integer): Pokemon {
const findInParty = (party: Pokemon[]) => party.find(p => p.id === pokemonId);
return findInParty(this.getParty()) || findInParty(this.getEnemyParty());
@ -728,7 +756,7 @@ export default class BattleScene extends SceneBase {
const container = this.add.container(x, y);
const icon = this.add.sprite(0, 0, pokemon.getIconAtlasKey(ignoreOverride));
icon.setFrame(pokemon.getIconId(true));
icon.setFrame(pokemon.getIconId(true));
// Temporary fix to show pokemon's default icon if variant icon doesn't exist
if (icon.frame.name !== pokemon.getIconId(true)) {
console.log(`${pokemon.name}'s variant icon does not exist. Replacing with default.`);
@ -1314,6 +1342,14 @@ export default class BattleScene extends SceneBase {
});
}
showEnemyModifierBar(): void {
this.enemyModifierBar.setVisible(true);
}
hideEnemyModifierBar(): void {
this.enemyModifierBar.setVisible(false);
}
updateBiomeWaveText(): void {
const isBoss = !(this.currentBattle.waveIndex % 10);
const biomeString: string = getBiomeName(this.arena.biomeType);
@ -1328,7 +1364,7 @@ export default class BattleScene extends SceneBase {
return;
}
const formattedMoney =
this.moneyFormat === MoneyFormat.ABBREVIATED ? Utils.formatFancyLargeNumber(this.money, 3) : this.money.toLocaleString();
this.moneyFormat === MoneyFormat.ABBREVIATED ? Utils.formatFancyLargeNumber(this.money, 3) : this.money.toLocaleString();
this.moneyText.setText(`${formattedMoney}`);
this.fieldUI.moveAbove(this.moneyText, this.luckText);
if (forceVisible) {
@ -1419,7 +1455,7 @@ export default class BattleScene extends SceneBase {
randomSpecies(waveIndex: integer, level: integer, fromArenaPool?: boolean, speciesFilter?: PokemonSpeciesFilter, filterAllEvolutions?: boolean): PokemonSpecies {
if (fromArenaPool) {
return this.arena.randomSpecies(waveIndex, level);
return this.arena.randomSpecies(waveIndex, level,null , getPartyLuckValue(this.party));
}
const filteredSpecies = speciesFilter ? [...new Set(allSpecies.filter(s => s.isCatchable()).filter(speciesFilter).map(s => {
if (!filterAllEvolutions) {
@ -1978,7 +2014,7 @@ export default class BattleScene extends SceneBase {
const newItemModifier = itemModifier.clone() as PokemonHeldItemModifier;
newItemModifier.pokemonId = target.id;
const matchingModifier = target.scene.findModifier(m => m instanceof PokemonHeldItemModifier
&& (m as PokemonHeldItemModifier).matchType(itemModifier) && m.pokemonId === target.id, target.isPlayer()) as PokemonHeldItemModifier;
&& (m as PokemonHeldItemModifier).matchType(itemModifier) && m.pokemonId === target.id, target.isPlayer()) as PokemonHeldItemModifier;
let removeOld = true;
if (matchingModifier) {
const maxStackCount = matchingModifier.getMaxStackCount(target.scene);
@ -2082,8 +2118,8 @@ export default class BattleScene extends SceneBase {
}
/**
* Removes all modifiers from enemy of PersistentModifier type
*/
* Removes all modifiers from enemy of PersistentModifier type
*/
clearEnemyModifiers(): void {
const modifiersToRemove = this.enemyModifiers.filter(m => m instanceof PersistentModifier);
for (const m of modifiersToRemove) {
@ -2093,8 +2129,8 @@ export default class BattleScene extends SceneBase {
}
/**
* Removes all modifiers from enemy of PokemonHeldItemModifier type
*/
* Removes all modifiers from enemy of PokemonHeldItemModifier type
*/
clearEnemyHeldItemModifiers(): void {
const modifiersToRemove = this.enemyModifiers.filter(m => m instanceof PokemonHeldItemModifier);
for (const m of modifiersToRemove) {

View File

@ -8,7 +8,7 @@ import { Moves } from "./data/enums/moves";
import { TrainerType } from "./data/enums/trainer-type";
import { GameMode } from "./game-mode";
import { BattleSpec } from "./enums/battle-spec";
import { PlayerGender } from "./system/game-data";
import { PlayerGender } from "./data/enums/player-gender";
import { MoneyMultiplierModifier, PokemonHeldItemModifier } from "./modifier/modifier";
import { PokeballType } from "./data/pokeball";
import {trainerConfigs} from "#app/data/trainer-config";

View File

@ -3,7 +3,7 @@ import { Type } from "./type";
import * as Utils from "../utils";
import { BattleStat, getBattleStatName } from "./battle-stat";
import { MovePhase, PokemonHealPhase, ShowAbilityPhase, StatChangePhase } from "../phases";
import { getPokemonMessage, getPokemonPrefix } from "../messages";
import { getPokemonMessage, getPokemonNameWithAffix } from "../messages";
import { Weather, WeatherType } from "./weather";
import { BattlerTag } from "./battler-tags";
import { BattlerTagType } from "./enums/battler-tag-type";
@ -23,7 +23,7 @@ import { Command } from "../ui/command-ui-handler";
import { BerryModifierType } from "#app/modifier/modifier-type";
import { getPokeballName } from "./pokeball";
import { Species } from "./enums/species";
import {BattlerIndex} from "#app/battle";
import { BattlerIndex } from "#app/battle";
export class Ability implements Localizable {
public id: Abilities;
@ -156,7 +156,7 @@ export class BlockRecoilDamageAttr extends AbAttr {
}
getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]) {
return i18next.t("abilityTriggers:blockRecoilDamage", {pokemonName: `${getPokemonPrefix(pokemon)}${pokemon.name}`, abilityName: abilityName});
return i18next.t("abilityTriggers:blockRecoilDamage", {pokemonName: getPokemonNameWithAffix(pokemon), abilityName: abilityName});
}
}
@ -878,7 +878,7 @@ export class PostDefendPerishSongAbAttr extends PostDefendAbAttr {
}
getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]): string {
return i18next.t("abilityTriggers:perishBody", {pokemonName: `${getPokemonPrefix(pokemon)}${pokemon.name}`, abilityName: abilityName});
return i18next.t("abilityTriggers:perishBody", {pokemonName: getPokemonNameWithAffix(pokemon), abilityName: abilityName});
}
}
@ -2462,7 +2462,7 @@ export class PostTurnStatusHealAbAttr extends PostTurnAbAttr {
* @returns Returns true if healed from status, false if not
*/
applyPostTurn(pokemon: Pokemon, passive: boolean, args: any[]): boolean | Promise<boolean> {
if (this.effects.includes(pokemon.status.effect)) {
if (this.effects.includes(pokemon.status?.effect)) {
if (pokemon.getMaxHp() !== pokemon.hp) {
const scene = pokemon.scene;
const abilityName = (!passive ? pokemon.getAbility() : pokemon.getPassiveAbility()).name;
@ -2666,7 +2666,7 @@ export class PostTurnHurtIfSleepingAbAttr extends PostTurnAbAttr {
for (const opp of pokemon.getOpponents()) {
if (opp.status?.effect === StatusEffect.SLEEP || opp.hasAbility(Abilities.COMATOSE)) {
opp.damageAndUpdate(Math.floor(Math.max(1, opp.getMaxHp() / 8)), HitResult.OTHER);
pokemon.scene.queueMessage(i18next.t("abilityTriggers:badDreams", {pokemonName: `${getPokemonPrefix(opp)}${opp.name}`}));
pokemon.scene.queueMessage(i18next.t("abilityTriggers:badDreams", {pokemonName: getPokemonNameWithAffix(opp)}));
hadEffect = true;
}
@ -2764,8 +2764,12 @@ export class PostDancingMoveAbAttr extends PostMoveUsedAbAttr {
* @return true if the Dancer ability was resolved
*/
applyPostMoveUsed(dancer: Pokemon, move: PokemonMove, source: Pokemon, targets: BattlerIndex[], args: any[]): boolean | Promise<boolean> {
// List of tags that prevent the Dancer from replicating the move
const forbiddenTags = [BattlerTagType.FLYING, BattlerTagType.UNDERWATER,
BattlerTagType.UNDERGROUND, BattlerTagType.HIDDEN];
// The move to replicate cannot come from the Dancer
if (source.getBattlerIndex() !== dancer.getBattlerIndex()) {
if (source.getBattlerIndex() !== dancer.getBattlerIndex()
&& !dancer.summonData.tags.some(tag => forbiddenTags.includes(tag.tagType))) {
// If the move is an AttackMove or a StatusMove the Dancer must replicate the move on the source of the Dance
if (move.getMove() instanceof AttackMove || move.getMove() instanceof StatusMove) {
const target = this.getTarget(dancer, source, targets);
@ -2774,8 +2778,9 @@ export class PostDancingMoveAbAttr extends PostMoveUsedAbAttr {
// If the move is a SelfStatusMove (ie. Swords Dance) the Dancer should replicate it on itself
dancer.scene.unshiftPhase(new MovePhase(dancer.scene, dancer, [dancer.getBattlerIndex()], move, true));
}
return true;
}
return true;
return false;
}
/**

View File

@ -1,6 +1,6 @@
import { CommonAnim, CommonBattleAnim } from "./battle-anims";
import { CommonAnimPhase, MoveEffectPhase, MovePhase, PokemonHealPhase, ShowAbilityPhase, StatChangePhase } from "../phases";
import { getPokemonMessage, getPokemonPrefix } from "../messages";
import { getPokemonMessage, getPokemonNameWithAffix } from "../messages";
import Pokemon, { MoveResult, HitResult } from "../field/pokemon";
import { Stat, getStatName } from "./pokemon-stat";
import { StatusEffect } from "./status-effect";
@ -200,6 +200,9 @@ export class InterruptedTag extends BattlerTag {
}
}
/**
* BattlerTag that represents the {@link https://bulbapedia.bulbagarden.net/wiki/Confusion_(status_condition)}
*/
export class ConfusedTag extends BattlerTag {
constructor(turnCount: integer, sourceMove: Moves) {
super(BattlerTagType.CONFUSED, BattlerTagLapseType.MOVE, turnCount, sourceMove);
@ -235,7 +238,8 @@ export class ConfusedTag extends BattlerTag {
pokemon.scene.queueMessage(getPokemonMessage(pokemon, " is\nconfused!"));
pokemon.scene.unshiftPhase(new CommonAnimPhase(pokemon.scene, pokemon.getBattlerIndex(), undefined, CommonAnim.CONFUSION));
if (pokemon.randSeedInt(3)) {
// 1/3 chance of hitting self with a 40 base power move
if (pokemon.randSeedInt(3) === 0) {
const atk = pokemon.getBattleStat(Stat.ATK);
const def = pokemon.getBattleStat(Stat.DEF);
const damage = Math.ceil(((((2 * pokemon.level / 5 + 2) * 40 * atk / def) / 50) + 2) * (pokemon.randSeedInt(15, 85) / 100));
@ -799,7 +803,7 @@ export class ThunderCageTag extends DamagingTrapTag {
}
getTrapMessage(pokemon: Pokemon): string {
return getPokemonMessage(pokemon.scene.getPokemonById(this.sourceId), ` trapped\n${getPokemonPrefix(pokemon).toLowerCase()}${pokemon.name}!`);
return getPokemonMessage(pokemon.scene.getPokemonById(this.sourceId), ` trapped\n${getPokemonNameWithAffix(pokemon)}!`);
}
}
@ -809,7 +813,7 @@ export class InfestationTag extends DamagingTrapTag {
}
getTrapMessage(pokemon: Pokemon): string {
return getPokemonMessage(pokemon, ` has been afflicted \nwith an infestation by ${getPokemonPrefix(pokemon.scene.getPokemonById(this.sourceId))}${pokemon.scene.getPokemonById(this.sourceId).name}!`);
return getPokemonMessage(pokemon, ` has been afflicted \nwith an infestation by ${getPokemonNameWithAffix(pokemon.scene.getPokemonById(this.sourceId))}!`);
}
}

View File

@ -0,0 +1,10 @@
/**
* enum for the game data types
*/
export enum GameDataType {
SYSTEM,
SESSION,
SETTINGS,
TUTORIALS,
SEEN_DIALOGUES
}

View File

@ -0,0 +1,7 @@
/**
* enum for passive
*/
export enum Passive {
UNLOCKED = 1,
ENABLED = 2
}

View File

@ -0,0 +1,8 @@
/**
* enum for the players gender
*/
export enum PlayerGender {
UNSET,
MALE,
FEMALE
}

View File

@ -18539,12 +18539,14 @@ export const pokemonFormLevelMoves: PokemonSpeciesFormLevelMoves = {
[ 8, Moves.DOUBLE_TEAM ],
[ 12, Moves.ELECTRO_BALL ],
[ 16, Moves.FEINT ],
[ 20, Moves.SPARK ],
[ 20, Moves.ZIPPY_ZAP ], //Custom
[ 24, Moves.AGILITY ],
[ 28, Moves.IRON_TAIL ],
[ 32, Moves.DISCHARGE ],
[ 34, Moves.FLOATY_FALL ], //Custom
[ 36, Moves.THUNDERBOLT ],
[ 40, Moves.LIGHT_SCREEN ],
[ 42, Moves.SPLISHY_SPLASH ], //Custom
[ 44, Moves.THUNDER ],
[ 48, Moves.PIKA_PAPOW ],
],

View File

@ -918,12 +918,12 @@ export function initSpecies() {
new PokemonSpecies(Species.PIKACHU, 1, false, false, false, "Mouse Pokémon", Type.ELECTRIC, null, 0.4, 6, Abilities.STATIC, Abilities.NONE, Abilities.LIGHTNING_ROD, 320, 35, 55, 40, 50, 50, 90, 190, 50, 112, GrowthRate.MEDIUM_FAST, 50, true, true,
new PokemonForm("Normal", "", Type.ELECTRIC, null, 0.4, 6, Abilities.STATIC, Abilities.NONE, Abilities.LIGHTNING_ROD, 320, 35, 55, 40, 50, 50, 90, 190, 50, 112, true, null, true),
new PokemonForm("Partner", "partner", Type.ELECTRIC, null, 0.4, 6, Abilities.STATIC, Abilities.NONE, Abilities.LIGHTNING_ROD, 430, 45, 80, 50, 75, 60, 120, 190, 50, 112, true, "", true),
new PokemonForm("Cosplay", "cosplay", Type.ELECTRIC, null, 0.4, 6, Abilities.STATIC, Abilities.NONE, Abilities.LIGHTNING_ROD, 320, 35, 55, 40, 50, 50, 90, 190, 50, 112, true, null, true),
new PokemonForm("Cool Cosplay", "cool-cosplay", Type.ELECTRIC, null, 0.4, 6, Abilities.STATIC, Abilities.NONE, Abilities.LIGHTNING_ROD, 320, 35, 55, 40, 50, 50, 90, 190, 50, 112, true, null, true),
new PokemonForm("Beauty Cosplay", "beauty-cosplay", Type.ELECTRIC, null, 0.4, 6, Abilities.STATIC, Abilities.NONE, Abilities.LIGHTNING_ROD, 320, 35, 55, 40, 50, 50, 90, 190, 50, 112, true, null, true),
new PokemonForm("Cute Cosplay", "cute-cosplay", Type.ELECTRIC, null, 0.4, 6, Abilities.STATIC, Abilities.NONE, Abilities.LIGHTNING_ROD, 320, 35, 55, 40, 50, 50, 90, 190, 50, 112, true, null, true),
new PokemonForm("Smart Cosplay", "smart-cosplay", Type.ELECTRIC, null, 0.4, 6, Abilities.STATIC, Abilities.NONE, Abilities.LIGHTNING_ROD, 320, 35, 55, 40, 50, 50, 90, 190, 50, 112, true, null, true),
new PokemonForm("Tough Cosplay", "tough-cosplay", Type.ELECTRIC, null, 0.4, 6, Abilities.STATIC, Abilities.NONE, Abilities.LIGHTNING_ROD, 320, 35, 55, 40, 50, 50, 90, 190, 50, 112, true, null, true),
new PokemonForm("Cosplay", "cosplay", Type.ELECTRIC, null, 0.4, 6, Abilities.STATIC, Abilities.NONE, Abilities.LIGHTNING_ROD, 430, 45, 80, 50, 75, 60, 120, 190, 50, 112, true, null, true), //Custom
new PokemonForm("Cool Cosplay", "cool-cosplay", Type.ELECTRIC, null, 0.4, 6, Abilities.STATIC, Abilities.NONE, Abilities.LIGHTNING_ROD, 430, 45, 80, 50, 75, 60, 120, 190, 50, 112, true, null, true), //Custom
new PokemonForm("Beauty Cosplay", "beauty-cosplay", Type.ELECTRIC, null, 0.4, 6, Abilities.STATIC, Abilities.NONE, Abilities.LIGHTNING_ROD, 430, 45, 80, 50, 75, 60, 120, 190, 50, 112, true, null, true), //Custom
new PokemonForm("Cute Cosplay", "cute-cosplay", Type.ELECTRIC, null, 0.4, 6, Abilities.STATIC, Abilities.NONE, Abilities.LIGHTNING_ROD, 430, 45, 80, 50, 75, 60, 120, 190, 50, 112, true, null, true), //Custom
new PokemonForm("Smart Cosplay", "smart-cosplay", Type.ELECTRIC, null, 0.4, 6, Abilities.STATIC, Abilities.NONE, Abilities.LIGHTNING_ROD, 430, 45, 80, 50, 75, 60, 120, 190, 50, 112, true, null, true), //Custom
new PokemonForm("Tough Cosplay", "tough-cosplay", Type.ELECTRIC, null, 0.4, 6, Abilities.STATIC, Abilities.NONE, Abilities.LIGHTNING_ROD, 430, 45, 80, 50, 75, 60, 120, 190, 50, 112, true, null, true), //Custom
new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.ELECTRIC, null, 21, 6, Abilities.STATIC, Abilities.NONE, Abilities.LIGHTNING_ROD, 420, 45, 60, 65, 100, 75, 75, 190, 50, 112),
),
new PokemonSpecies(Species.RAICHU, 1, false, false, false, "Mouse Pokémon", Type.ELECTRIC, null, 0.8, 30, Abilities.STATIC, Abilities.NONE, Abilities.LIGHTNING_ROD, 485, 60, 90, 55, 90, 80, 110, 75, 50, 243, GrowthRate.MEDIUM_FAST, 50, true),

View File

@ -1,5 +1,5 @@
import { Biome } from "./enums/biome";
import { getPokemonMessage, getPokemonPrefix } from "../messages";
import { getPokemonMessage, getPokemonNameWithAffix } from "../messages";
import Pokemon from "../field/pokemon";
import { Type } from "./type";
import Move, { AttackMove } from "./move";
@ -180,9 +180,9 @@ export function getWeatherLapseMessage(weatherType: WeatherType): string {
export function getWeatherDamageMessage(weatherType: WeatherType, pokemon: Pokemon): string {
switch (weatherType) {
case WeatherType.SANDSTORM:
return i18next.t("weather:sandstormDamageMessage", {pokemonPrefix: getPokemonPrefix(pokemon), pokemonName: pokemon.name});
return i18next.t("weather:sandstormDamageMessage", {pokemonNameWithAffix: getPokemonNameWithAffix(pokemon)});
case WeatherType.HAIL:
return i18next.t("weather:hailDamageMessage", {pokemonPrefix: getPokemonPrefix(pokemon), pokemonName: pokemon.name});
return i18next.t("weather:hailDamageMessage", {pokemonNameWithAffix: getPokemonNameWithAffix(pokemon)});
}
return null;

View File

@ -68,14 +68,20 @@ export class Arena {
}
}
randomSpecies(waveIndex: integer, level: integer, attempt?: integer): PokemonSpecies {
randomSpecies(waveIndex: integer, level: integer, attempt?: integer, luckValue?: integer): PokemonSpecies {
const overrideSpecies = this.scene.gameMode.getOverrideSpecies(waveIndex);
if (overrideSpecies) {
return overrideSpecies;
}
const isBoss = !!this.scene.getEncounterBossSegments(waveIndex, level) && !!this.pokemonPool[BiomePoolTier.BOSS].length
&& (this.biomeType !== Biome.END || this.scene.gameMode.isClassic || this.scene.gameMode.isWaveFinal(waveIndex));
const tierValue = Utils.randSeedInt(!isBoss ? 512 : 64);
const randVal = isBoss ? 64 : 512;
// luck influences encounter rarity
let luckModifier = 0;
if (typeof luckValue !== "undefined") {
luckModifier = luckValue * (isBoss ? 0.5 : 2);
}
const tierValue = Utils.randSeedInt(randVal - luckModifier);
let tier = !isBoss
? tierValue >= 156 ? BiomePoolTier.COMMON : tierValue >= 32 ? BiomePoolTier.UNCOMMON : tierValue >= 6 ? BiomePoolTier.RARE : tierValue >= 1 ? BiomePoolTier.SUPER_RARE : BiomePoolTier.ULTRA_RARE
: tierValue >= 20 ? BiomePoolTier.BOSS : tierValue >= 6 ? BiomePoolTier.BOSS_RARE : tierValue >= 1 ? BiomePoolTier.BOSS_SUPER_RARE : BiomePoolTier.BOSS_ULTRA_RARE;

View File

@ -211,8 +211,8 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
this.generateFusionSpecies();
}
}
this.luck = (this.shiny ? this.variant + 1 : 0) + (this.fusionShiny ? this.fusionVariant + 1 : 0);
this.fusionLuck = this.luck;
}
this.generateName();
@ -1168,6 +1168,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
if (this.fusionSpecies) {
const evolutionLevelMoves = levelMoves.slice(0, Math.max(levelMoves.findIndex(lm => !!lm[0]), 0));
const fusionLevelMoves = this.getFusionSpeciesForm(true).getLevelMoves();
const fusionEvolutionLevelMoves = fusionLevelMoves.slice(0, Math.max(fusionLevelMoves.findIndex(flm => !!flm[0]), 0));
const newLevelMoves: LevelMoves = [];
while (levelMoves.length && levelMoves[0][0] < startingLevel) {
levelMoves.shift();
@ -1179,6 +1180,9 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
for (const elm of evolutionLevelMoves.reverse()) {
levelMoves.unshift(elm);
}
for (const felm of fusionEvolutionLevelMoves.reverse()) {
fusionLevelMoves.unshift(felm);
}
}
for (let l = includeEvolutionMoves ? 0 : startingLevel; l <= this.level; l++) {
if (l === 1 && startingLevel > 1) {
@ -1273,7 +1277,16 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
* @returns the shiny variant
*/
generateVariant(): Variant {
if (!this.shiny || !variantData.hasOwnProperty(this.species.speciesId)) {
const formIndex: number = this.formIndex;
let variantDataIndex: string | number = this.species.speciesId;
if (this.species.forms.length > 0) {
const formKey = this.species.forms[formIndex]?.formKey;
if (formKey) {
variantDataIndex = `${variantDataIndex}-${formKey}`;
}
}
// Checks if there is no variant data for both the index or index with form
if (!this.shiny || (!variantData.hasOwnProperty(variantDataIndex) && !variantData.hasOwnProperty(this.species.speciesId))) {
return 0;
}
const rand = Utils.randSeedInt(10);

View File

@ -29,6 +29,7 @@ export class LoadingScene extends SceneBase {
}
preload() {
Utils.localPing();
this.load["manifest"] = this.game["manifest"];
if (!isMobile()) {
@ -95,10 +96,18 @@ export class LoadingScene extends SceneBase {
this.loadImage("type_tera", "ui");
this.loadAtlas("type_bgs", "ui");
this.loadImage("dawn_icon", "ui");
this.loadImage("day_icon", "ui");
this.loadImage("dusk_icon", "ui");
this.loadImage("night_icon", "ui");
this.loadImage("dawn_icon_fg", "ui");
this.loadImage("dawn_icon_mg", "ui");
this.loadImage("dawn_icon_bg", "ui");
this.loadImage("day_icon_fg", "ui");
this.loadImage("day_icon_mg", "ui");
this.loadImage("day_icon_bg", "ui");
this.loadImage("dusk_icon_fg", "ui");
this.loadImage("dusk_icon_mg", "ui");
this.loadImage("dusk_icon_bg", "ui");
this.loadImage("night_icon_fg", "ui");
this.loadImage("night_icon_mg", "ui");
this.loadImage("night_icon_bg", "ui");
this.loadImage("pb_tray_overlay_player", "ui");
this.loadImage("pb_tray_overlay_enemy", "ui");
@ -126,6 +135,7 @@ export class LoadingScene extends SceneBase {
this.loadImage("summary_stats_overlay_exp", "ui");
this.loadImage("summary_moves", "ui");
this.loadImage("summary_moves_effect", "ui");
this.loadImage("summary_moves_effect_type", "ui");
this.loadImage("summary_moves_overlay_row", "ui");
this.loadImage("summary_moves_overlay_pp", "ui");
this.loadAtlas("summary_moves_cursor", "ui");
@ -352,14 +362,17 @@ export class LoadingScene extends SceneBase {
const width = this.cameras.main.width;
const height = this.cameras.main.height;
const logo = this.add.image(width / 2, 240, "");
const midWidth = width / 2;
const midHeight = height / 2;
const logo = this.add.image(midWidth, 240, "");
logo.setVisible(false);
logo.setOrigin(0.5, 0.5);
logo.setScale(4);
const percentText = this.make.text({
x: width / 2,
y: height / 2 - 24,
x: midWidth,
y: midHeight - 24,
text: "0%",
style: {
font: "72px emerald",
@ -369,8 +382,8 @@ export class LoadingScene extends SceneBase {
percentText.setOrigin(0.5, 0.5);
const assetText = this.make.text({
x: width / 2,
y: height / 2 + 48,
x: midWidth,
y: midHeight + 48,
text: "",
style: {
font: "48px emerald",
@ -379,6 +392,32 @@ export class LoadingScene extends SceneBase {
});
assetText.setOrigin(0.5, 0.5);
const disclaimerText = this.make.text({
x: midWidth,
y: assetText.y + 152,
text: i18next.t("menu:disclaimer"),
style: {
font: "72px emerald",
color: "#DA3838",
},
});
disclaimerText.setOrigin(0.5, 0.5);
const disclaimerDescriptionText = this.make.text({
x: midWidth,
y: disclaimerText.y + 120,
text: i18next.t("menu:disclaimerDescription"),
style: {
font: "48px emerald",
color: "#ffffff",
align: "center"
},
});
disclaimerDescriptionText.setOrigin(0.5, 0.5);
disclaimerText.setVisible(false);
disclaimerDescriptionText.setVisible(false);
const intro = this.add.video(0, 0);
intro.setOrigin(0, 0);
intro.setScale(3);
@ -388,7 +427,7 @@ export class LoadingScene extends SceneBase {
percentText.setText(`${Math.floor(parsedValue * 100)}%`);
progressBar.clear();
progressBar.fillStyle(0xffffff, 0.8);
progressBar.fillRect(width / 2 - 320, 360, 640 * parsedValue, 64);
progressBar.fillRect(midWidth - 320, 360, 640 * parsedValue, 64);
});
this.load.on("fileprogress", file => {
@ -423,6 +462,8 @@ export class LoadingScene extends SceneBase {
ease: "Sine.easeIn"
});
loadingGraphics.map(g => g.setVisible(true));
disclaimerText.setVisible(true);
disclaimerDescriptionText.setVisible(true);
});
intro.play();
break;

View File

@ -56,6 +56,9 @@ export const battle: SimpleTranslationEntries = {
"notDisabled": "{{pokemonName}}'s {{moveName}} ist\nnicht mehr deaktiviert!",
"eggHatching": "Oh?",
"ivScannerUseQuestion": "IV-Scanner auf {{pokemonName}} benutzen?",
"wildPokemonWithAffix": "{{pokemonName}} (wild)",
"foePokemonWithAffix": "{{pokemonName}} (Gegner)",
"useMove": "{{pokemonNameWithAffix}} setzt {{moveName}} ein!",
"drainMessage": "{{pokemonName}} wurde Energie abgesaugt",
"regainHealth": "KP von {{pokemonName}} wurden wieder aufgefrischt!"
} as const;

View File

@ -49,4 +49,6 @@ export const menu: SimpleTranslationEntries = {
"empty":"Leer",
"yes":"Ja",
"no":"Nein",
"disclaimer": "DISCLAIMER",
"disclaimerDescription": "This game is an unfinished product; it might have playability issues (including the potential loss of save data),\n change without notice, and may or may not be updated further or completed."
} as const;

View File

@ -99,6 +99,10 @@ export const modifierType: ModifierTypeTranslationEntries = {
name: "TM{{moveId}} - {{moveName}}",
description: "Bringt einem Pokémon {{moveName}} bei",
},
"TmModifierTypeWithInfo": {
name: "TM{{moveId}} - {{moveName}}",
description: "Bringt einem Pokémon {{moveName}} bei\n(Halte C oder Shift für mehr Infos)",
},
"EvolutionItemModifierType": {
description: "Erlaubt es bestimmten Pokémon sich zu entwickeln",
},

View File

@ -15,12 +15,12 @@ export const weather: SimpleTranslationEntries = {
"sandstormStartMessage": "Ein Sandsturm kommt auf!",
"sandstormLapseMessage": "Der Sandsturm tobt.",
"sandstormClearMessage": "Der Sandsturm legt sich.",
"sandstormDamageMessage": " Der Sandsturm fügt {{pokemonPrefix}}{{pokemonName}} Schaden zu!",
"sandstormDamageMessage": " Der Sandsturm fügt {{pokemonNameWithAffix}} Schaden zu!",
"hailStartMessage": "Es fängt an zu hageln!",
"hailLapseMessage": "Der Hagelsturm tobt.",
"hailClearMessage": "Der Hagelsturm legt sich.",
"hailDamageMessage": "{{pokemonPrefix}}{{pokemonName}} wird von Hagelkörnern getroffen!",
"hailDamageMessage": "{{pokemonNameWithAffix}} wird von Hagelkörnern getroffen!",
"snowStartMessage": "Es fängt an zu schneien!",
"snowLapseMessage": "Der Schneesturm tobt.",

View File

@ -56,6 +56,9 @@ export const battle: SimpleTranslationEntries = {
"skipItemQuestion": "Are you sure you want to skip taking an item?",
"eggHatching": "Oh?",
"ivScannerUseQuestion": "Use IV Scanner on {{pokemonName}}?",
"wildPokemonWithAffix": "Wild {{pokemonName}}",
"foePokemonWithAffix": "Foe {{pokemonName}}",
"useMove": "{{pokemonNameWithAffix}} used {{moveName}}!",
"drainMessage": "{{pokemonName}} had its\nenergy drained!",
"regainHealth": "{{pokemonName}} regained\nhealth!"
} as const;

View File

@ -49,4 +49,6 @@ export const menu: SimpleTranslationEntries = {
"empty":"Empty",
"yes":"Yes",
"no":"No",
"disclaimer": "DISCLAIMER",
"disclaimerDescription": "This game is an unfinished product; it might have playability issues (including the potential loss of save data),\n change without notice, and may or may not be updated further or completed."
} as const;

View File

@ -99,6 +99,10 @@ export const modifierType: ModifierTypeTranslationEntries = {
name: "TM{{moveId}} - {{moveName}}",
description: "Teach {{moveName}} to a Pokémon",
},
"TmModifierTypeWithInfo": {
name: "TM{{moveId}} - {{moveName}}",
description: "Teach {{moveName}} to a Pokémon\n(Hold C or Shift for more info)",
},
"EvolutionItemModifierType": {
description: "Causes certain Pokémon to evolve",
},

View File

@ -15,12 +15,12 @@ export const weather: SimpleTranslationEntries = {
"sandstormStartMessage": "A sandstorm brewed!",
"sandstormLapseMessage": "The sandstorm rages.",
"sandstormClearMessage": "The sandstorm subsided.",
"sandstormDamageMessage": "{{pokemonPrefix}}{{pokemonName}} is buffeted\nby the sandstorm!",
"sandstormDamageMessage": "{{pokemonNameWithAffix}} is buffeted\nby the sandstorm!",
"hailStartMessage": "It started to hail!",
"hailLapseMessage": "Hail continues to fall.",
"hailClearMessage": "The hail stopped.",
"hailDamageMessage": "{{pokemonPrefix}}{{pokemonName}} is pelted\nby the hail!",
"hailDamageMessage": "{{pokemonNameWithAffix}} is pelted\nby the hail!",
"snowStartMessage": "It started to snow!",
"snowLapseMessage": "The snow is falling down.",

View File

@ -56,6 +56,9 @@ export const battle: SimpleTranslationEntries = {
"skipItemQuestion": "¿Estás seguro de que no quieres coger un objeto?",
"eggHatching": "¿Y esto?",
"ivScannerUseQuestion": "¿Quieres usar el Escáner de IVs en {{pokemonName}}?",
"wildPokemonWithAffix": "Wild {{pokemonName}}",
"foePokemonWithAffix": "Foe {{pokemonName}}",
"useMove": "{{pokemonNameWithAffix}} used {{moveName}}!",
"drainMessage": "{{pokemonName}} had its\nenergy drained!",
"regainHealth": "{{pokemonName}} regained\nhealth!"
} as const;

View File

@ -49,4 +49,6 @@ export const menu: SimpleTranslationEntries = {
"empty":"Vacío",
"yes":"Sí",
"no":"No",
"disclaimer": "DISCLAIMER",
"disclaimerDescription": "This game is an unfinished product; it might have playability issues (including the potential loss of save data),\n change without notice, and may or may not be updated further or completed."
} as const;

View File

@ -99,6 +99,10 @@ export const modifierType: ModifierTypeTranslationEntries = {
name: "MT{{moveId}} - {{moveName}}",
description: "Enseña {{moveName}} a un Pokémon",
},
"TmModifierTypeWithInfo": {
name: "MT{{moveId}} - {{moveName}}",
description: "Enseña {{moveName}} a un Pokémon\n(Hold C or Shift for more info)",
},
"EvolutionItemModifierType": {
description: "Hace que ciertos Pokémon evolucionen",
},

View File

@ -1,11 +1,11 @@
import { SimpleTranslationEntries } from "#app/plugins/i18n";
export const pokemonInfoContainer: SimpleTranslationEntries = {
"moveset": "Moveset",
"gender": "Gender:",
"ability": "Ability:",
"nature": "Nature:",
"epic": "Epic",
"rare": "Rare",
"common": "Common"
"moveset": "Movimientos",
"gender": "Género:",
"ability": "Habilid:",
"nature": "Natur:",
"epic": "Épico",
"rare": "Raro",
"common": "Común"
} as const;

View File

@ -15,12 +15,12 @@ export const weather: SimpleTranslationEntries = {
"sandstormStartMessage": "¡Se ha desatado una tormenta de arena!",
"sandstormLapseMessage": "La tormenta de arena arrecia...",
"sandstormClearMessage": "La tormenta de arena termino.",
"sandstormDamageMessage": "¡La tormenta de arena zarandea al\n{{pokemonName}}{{pokemonPrefix}}!",
"sandstormDamageMessage": "¡La tormenta de arena zarandea al\n{{pokemonNameWithAffix}}!",
"hailStartMessage": "¡Ha empezado a granizar!",
"hailLapseMessage": "Sigue granizando...",
"hailClearMessage": "Had dejado de granizar.",
"hailDamageMessage": "El granizo golpea al\n{{pokemonName}}{{pokemonPrefix}}!",
"hailDamageMessage": "El granizo golpea al\n{{pokemonNameWithAffix}}!",
"snowStartMessage": "¡Ha empezado a nevar!",
"snowLapseMessage": "Sigue nevando...",

View File

@ -56,6 +56,9 @@ export const battle: SimpleTranslationEntries = {
"skipItemQuestion": "Êtes-vous sûr·e de ne pas vouloir prendre dobjet ?",
"eggHatching": "Oh ?",
"ivScannerUseQuestion": "Utiliser le Scanner dIV sur {{pokemonName}} ?",
"wildPokemonWithAffix": "{{pokemonName}} sauvage",
"foePokemonWithAffix": "{{pokemonName}} ennemi",
"useMove": "{{pokemonNameWithAffix}} utilise\n{{moveName}} !",
"drainMessage": "{{pokemonName}} had its\nenergy drained!",
"regainHealth": "{{pokemonName}} regained\nhealth!"
} as const;

View File

@ -44,4 +44,6 @@ export const menu: SimpleTranslationEntries = {
"empty":"Vide",
"yes":"Oui",
"no":"Non",
"disclaimer": "DISCLAIMER",
"disclaimerDescription": "This game is an unfinished product; it might have playability issues (including the potential loss of save data),\n change without notice, and may or may not be updated further or completed."
} as const;

View File

@ -99,6 +99,10 @@ export const modifierType: ModifierTypeTranslationEntries = {
name: "CT{{moveId}} - {{moveName}}",
description: "Apprend la capacité {{moveName}} à un Pokémon",
},
"TmModifierTypeWithInfo": {
name: "CT{{moveId}} - {{moveName}}",
description: "Apprend la capacité {{moveName}} à un Pokémon\n(Hold C or Shift for more info)",
},
"EvolutionItemModifierType": {
description: "Permet à certains Pokémon dévoluer",
},

View File

@ -15,12 +15,12 @@ export const weather: SimpleTranslationEntries = {
"sandstormStartMessage": "Une tempête de sable se prépare !",
"sandstormLapseMessage": "La tempête de sable fait rage !",
"sandstormClearMessage": "La tempête de sable se calme !",
"sandstormDamageMessage": "La tempête de sable inflige des dégâts\nà {{pokemonPrefix}}{{pokemonName}} !",
"sandstormDamageMessage": "La tempête de sable inflige des dégâts\nà {{pokemonNameWithAffix}} !",
"hailStartMessage": "Il commence à grêler !",
"hailLapseMessage": "La grêle continue de tomber !",
"hailClearMessage": "La grêle sest arrêtée !",
"hailDamageMessage": "La grêle inflige des dégâts\nà {{pokemonPrefix}}{{pokemonName}} !",
"hailDamageMessage": "La grêle inflige des dégâts\nà {{pokemonNameWithAffix}} !",
"snowStartMessage": "Il commence à neiger !",
"snowLapseMessage": "Il y a une tempête de neige !",

View File

@ -56,6 +56,9 @@ export const battle: SimpleTranslationEntries = {
"skipItemQuestion": "Sei sicuro di non voler prendere nessun oggetto?",
"eggHatching": "Oh!",
"ivScannerUseQuestion": "Vuoi usare lo scanner di IV su {{pokemonName}}?",
"wildPokemonWithAffix": "Wild {{pokemonName}}",
"foePokemonWithAffix": "Foe {{pokemonName}}",
"useMove": "{{pokemonNameWithAffix}} used {{moveName}}!",
"drainMessage": "{{pokemonName}} had its\nenergy drained!",
"regainHealth": "{{pokemonName}} regained\nhealth!"
} as const;

View File

@ -49,4 +49,6 @@ export const menu: SimpleTranslationEntries = {
"empty":"Vuoto",
"yes":"Si",
"no":"No",
"disclaimer": "DISCLAIMER",
"disclaimerDescription": "This game is an unfinished product; it might have playability issues (including the potential loss of save data),\n change without notice, and may or may not be updated further or completed."
} as const;

View File

@ -99,6 +99,10 @@ export const modifierType: ModifierTypeTranslationEntries = {
name: "MT{{moveId}} - {{moveName}}",
description: "Insegna {{moveName}} a un Pokémon",
},
"TmModifierTypeWithInfo": {
name: "MT{{moveId}} - {{moveName}}",
description: "Insegna {{moveName}} a un Pokémon\n(Hold C or Shift for more info)",
},
"EvolutionItemModifierType": {
description: "Fa evolvere determinate specie di Pokémon",
},

View File

@ -15,12 +15,12 @@ export const weather: SimpleTranslationEntries = {
"sandstormStartMessage": "Si è scatenata una tempesta di sabbia!",
"sandstormLapseMessage": "La tempesta di sabbia infuria.",
"sandstormClearMessage": "La tempesta di sabbia si è placata.",
"sandstormDamageMessage": "{{pokemonPrefix}}{{pokemonName}} è stato colpito\ndalla tempesta di sabbia!",
"sandstormDamageMessage": "{{pokemonNameWithAffix}} è stato colpito\ndalla tempesta di sabbia!",
"hailStartMessage": "Ha iniziato a grandinare!",
"hailLapseMessage": "La grandine continua a cadere.",
"hailClearMessage": "Ha smesso di grandinare.",
"hailDamageMessage": "{{pokemonPrefix}}{{pokemonName}} è stato colpito\ndalla grandine!",
"hailDamageMessage": "{{pokemonNameWithAffix}} è stato colpito\ndalla grandine!",
"snowStartMessage": "Ha iniziato a nevicare!",
"snowLapseMessage": "La neve sta continuando a cadere.",

View File

@ -55,5 +55,8 @@ export const battle: SimpleTranslationEntries = {
"notDisabled": "{{pokemonName}}의\n{{moveName}} 사슬묶기가 풀렸다!",
"skipItemQuestion": "아이템을 받지 않고 넘어가시겠습니까?",
"eggHatching": "어라…?",
"ivScannerUseQuestion": "{{pokemonName}}에게 개체값탐지기를 사용하시겠습니까?"
"ivScannerUseQuestion": "{{pokemonName}}에게 개체값탐지기를 사용하시겠습니까?",
"wildPokemonWithAffix": "야생 {{pokemonName}}",
"foePokemonWithAffix": "상대 {{pokemonName}}",
"useMove": "{{pokemonNameWithAffix}}의 {{moveName}}!"
} as const;

View File

@ -4,58 +4,58 @@ import { DialogueTranslationEntries, SimpleTranslationEntries } from "#app/plugi
export const PGMdialogue: DialogueTranslationEntries = {
"youngster": {
"encounter": {
1: "Hey, wanna battle?",
2: "Are you a new trainer too?",
3: "Hey, I haven't seen you before. Let's battle!",
4: "I just lost, so I'm trying to find more Pokémon.\nWait! You look weak! Come on, let's battle!",
5: "Have we met or not? I don't really remember. Well, I guess it's nice to meet you anyway!",
6: "All right! Let's go!",
7: "All right! Here I come! I'll show you my power!",
8: "Haw haw haw... I'll show you how hawesome my Pokémon are!",
9: "No need to waste time saying hello. Bring it on whenever you're ready!",
10: "Don't let your guard down, or you may be crying when a kid beats you.",
11: "I've raised my Pokémon with great care. You're not allowed to hurt them!",
12: "Glad you made it! It won't be an easy job from here.",
13: "The battles continue forever! Welcome to the world with no end!"
1: "거기 너! 나와 배틀 어때?",
2: "넌 새내기 트레이너구나. 맞지?",
3: "거기 너! 처음보는 얼굴인데? 나랑 배틀하자!",
4: "방금 배틀에서 져서 새로운 포켓몬을 찾는 중이야.\n잠깐! 넌 약해보이는데? 어서 나와 배틀하자!",
5: "우리 만난 적이 있었던가? 잘 기억은 안나지만 어쨌든 만나서 반가워!",
6: "좋아! 시작하자!",
7: "좋아! 내가 왔다! 내 힘을 보여주지!",
8: "하하하… 내 포켓몬이 얼마나 멋진지 보여주겠어!",
9: "인사할 시간도 없어. 준비가 되었다면 이리 와!",
10: "긴장을 늦추지마. 그렇지 않으면 어린이에게 맞아 울지도 몰라.",
11: "난 내 포켓몬들을 소중히 키웠어. 내 포켓몬에게 상처를 입히게 놔두지 않겠어!",
12: "여기까지 잘 왔구나! 하지만 지금부턴 쉽지 않을거야.",
13: "배틀은 끝나지 않아! 끝없는 배틀의 세계에 온 것을 환영해!"
},
"victory": {
1: "Wow! You're strong!",
2: "I didn't stand a chance, huh?",
3: "I'll find you again when I'm older and beat you!",
4: "Ugh. I don't have any more Pokémon.",
5: "No way… NO WAY! How could I lose again…",
6: "No! I lost!",
7: "Whoa! You are incredible! I'm amazed and surprised!",
8: "Could it be… How… My Pokémon and I are the strongest, though…",
9: "I won't lose next time! Let's battle again sometime!",
10: "Sheesh! Can't you see that I'm just a kid! It wasn't fair of you to go all out like that!",
11: "Your Pokémon are more amazing! Trade with me!",
12: "I got a little carried away earlier, but what job was I talking about?",
13: "Ahaha! There it is! That's right! You're already right at home in this world!"
1: "우와! 넌 강하구나!",
2: "하? 난 기회가 없었어.",
3: "내가 조금 더 큰 다음엔 널 찾아서 때리겠어!",
4: "으.. 더이상 가지고 있는 포켓몬이 없어.",
5: "말도 안돼… 안돼! 내가 또 지다니…",
6: "안돼! 내가 지다니!",
7: "우와! 정말 깜짝 놀랐어! 넌 정말 강하구나!",
8: "이럴수가… 내 포켓몬과 난 최강인데… 어떻게…",
9: "다음엔 지지 않을거야! 다음에 다시 배틀하자!",
10: "쳇! 내가 어린애인게 보이지 않아?! 그렇게 최선을 다하는건 불공평해!",
11: "네 포켓몬은 정말 굉장하구나! 나와 교환하자!",
12: "내가 잠깐 정신이 나갔었나 봐. 내가 무슨 말을 하고 있었지?",
13: "아하! 거기구나! 좋아! 넌 이미 이 세계에 머무를 곳이 있구나!"
}
},
"lass": {
"encounter": {
1: "Let's have a battle, shall we?",
2: "You look like a new trainer. Let's have a battle!",
3: "I don't recognize you. How about a battle?",
4: "Let's have a fun Pokémon battle!",
5: "I'll show you the ropes of how to really use Pokémon!",
6: "A serious battle starts from a serious beginning! Are you sure you're ready?",
7: "You're only young once. And you only get one shot at a given battle. Soon, you'll be nothing but a memory.",
8: "You'd better go easy on me, OK? Though I'll be seriously fighting!",
9: "School is boring. I've got nothing to do. Yawn. I'm only battling to kill the time."
1: "나랑 배틀하자, 어때?",
2: "넌 신입 트레이너구나. 나랑 배틀하자!",
3: "너 거기 있었구나? 나랑 배틀할래?",
4: "재밌는 포켓몬 배틀하자!",
5: "내가 포켓몬을 어떻게 다뤄야하는지 보여줄게!",
6: "진정한 배틀은 진지한 자세부터 시작이야! 준비됐어?",
7: "젊음이 한순간이듯 배틀에서 네 기회도 단 한번만 주어질거야. 곧 넌 추억속으로 사라질거야.",
8: "나에겐 살살해도 돼, 알았지? 그래도 난 진지하게 싸울거야!",
9: "학교는 지겨워. 나는 할 일이 없어. 하암~ 난 그저 시간을 때우기 위해 싸울뿐이야."
},
"victory": {
1: "That was impressive! I've got a lot to learn.",
2: "I didn't think you'd beat me that bad…",
3: "I hope we get to have a rematch some day.",
4: "That was pretty amazingly fun! You've totally exhausted me…",
5: "You actually taught me a lesson! You're pretty amazing!",
6: "Seriously, I lost. That is, like, seriously depressing, but you were seriously cool.",
7: "I don't need memories like this. Deleting memory…",
8: "Hey! I told you to go easy on me! Still, you're pretty cool when you're serious.",
9: "I'm actually getting tired of battling… There's gotta be something new to do…"
1: "인상적이었어! 난 아직 배울게 많구나.",
2: "내가 이렇게까지 크게 질 줄은 몰랐어…",
3: "언젠가 우리가 다시 배틀할 수 있을 날을 기다릴게.",
4: "놀라울 정도로 엄청 재미있었어! 넌 날 완전히 지치게 만들어버렸네…",
5: "넌 나에게 진짜 교훈을 주었어! 넌 정말 대단해!",
6: "세상에, 내가 지다니. 이거 정말 우울하지만… 넌 정말 멋있었어.",
7: "난 이런 기억따윈 필요없어. 잊어버리겠어…",
8: "거기 너! 살살하라고 했지! 그래도 넌 진지할때 정말 멋지구나!",
9: "사실 배틀하는 것이 지루하던 참이야… 뭔가 새로운 것이 없을까?"
}
},
"breeder": {
@ -373,297 +373,297 @@ export const PGMdialogue: DialogueTranslationEntries = {
},
"brock": {
"encounter": {
1: "My expertise on Rock-type Pokémon will take you down! Come on!",
2: "My rock-hard willpower will overwhelm you!",
3: "Allow me to show you the true strength of my Pokémon!"
1: "내 전문인 바위 타입 포켓몬으로 널 쓰러뜨려줄게! 덤벼!",
2: "바위같은 의지로 널 압도하겠어!",
3: "내 포켓몬의 진정한 힘을 보여줄게!"
},
"victory": {
1: "Your Pokémon's strength have overcome my rock-hard defenses!",
2: "The world is huge! I'm glad to have had a chance to battle you.",
3: "Perhaps I should go back to pursuing my dream as a Pokémon Breeder…"
1: "네 포켓몬의 힘이 바위같은 내 방어를 이겼어!",
2: "세상은 넓구나! 너랑 겨뤄볼 수 있어서 즐거웠어.",
3: "아마도 난 포켓몬 브리더의 꿈을 이루러 가야할지도…"
},
"defeat": {
1: "The best offense is a good defense!\nThat's my way of doing things!",
2: "Come study rocks with me next time to better learn how to fight them!",
3: "Hah, all my traveling around the regions is paying off!"
1: "최선의 공격은 적절한 방어지!\n그게 내 방식이야!",
2: "다음에 나한테 더 배우러와. 바위타입과 어떻게 싸워야하는지 알려주지!",
3: "아, 여러 지역을 돌아다니며 여행한 보람이 있군!"
}
},
"misty": {
"encounter": {
1: "My policy is an all out offensive with Water-type Pokémon!",
2: "Hiya, I'll show you the strength of my aquatic Pokémon!",
3: "My dream was to go on a journey and battle powerful trainers…\nWill you be a sufficient challenge?"
1: "내 방침은 물타입 포켓몬으로 공격하고 공격하고 또 공격하는 거!",
2: "아하핫, 너한테 내 물타입 포켓몬들의 힘을 보여줄게!",
3: "내 꿈은 여행을 다니며 강한 트레이너들과 배틀하는 거였어…\n네가 그 충분한 도전자가 될 수 있는지 볼까?"
},
"victory": {
1: "You really are strong… I'll admit that you are skilled…",
2: "Grrr… You know you just got lucky, right?!",
3: "Wow, you're too much! I can't believe you beat me!"
1: "너 정말로 강하구나… 그 실력 인정하도록 할게…",
2: "으으… 너 그냥 운이 좋았던거야, 그치?!",
3: "우와, 너 대단해! 날 이기다니 믿을 수 없어!"
},
"defeat": {
1: "Was the mighty Misty too much for you?",
2: "I hope you saw my Pokémon's elegant swimming techniques!",
3: "Your Pokémon were no match for my pride and joys!"
1: "최강인 최이슬! 너한테 좀 심했나?",
2: "내 포켓몬들의 우아한 수영 테크닉을 봤길 바랄게!",
3: "내 프라이드와 즐거움엔 네 포켓몬들은 상대가 안 돼. "
}
},
"lt_surge": {
"encounter": {
1: "My Electric Pokémon saved me during the war! I'll show you how!",
2: "Ten-hut! I'll shock you into surrender!",
3: "I'll zap you just like I do to all my enemies in battle!"
1: "마이 전기 포켓몬은 전쟁에서 미를 구했어요! 하우를 유에게 보여줄게요!",
2: "헤이! 쇼크로 유를 항복시키겠어요!",
3: "배틀에서 마이 에너미에게 했던 것처럼 유에게도 펀치를 날리겠어요!"
},
"victory": {
1: "Whoa! Your team's the real deal, kid!",
2: "Aaargh, you're strong! Even my electric tricks lost against you.",
3: "That was an absolutely shocking loss!"
1: "와우, 키드! 유어 팀은 진짜 대단하군요!",
2: "으흐흑, 유는 스트롱하네요! 마이 전기 트릭도 유에겐 로스트입니다.",
3: "앱솔루트하고 쇼킹한 패배였어요!"
},
"defeat": {
1: "Oh yeah! When it comes to Electric-type Pokémon, I'm number one in the world!",
2: "Hahaha! That was an electrifying battle, kid!",
3: "A Pokémon battle is war, and I have showed you first-hand combat!"
1: "오우 예! 전기 타입 포켓몬이라면, 미가 월드에서 넘버 원이에요!",
2: "하하하! 키드, 이것이 찌릿찌릿 일렉트릭 배틀입니다!",
3: "포켓몬 배틀은 전쟁, 앤드 나는 유에게 직접 전투를 보여줬습니다!"
}
},
"erika": {
"encounter": {
1: "Ah, the weather is lovely here…\nOh, a battle? Very well then.",
2: "My Pokémon battling skills rival that of my flower arranging skills.",
3: "Oh, I hope the pleasant aroma of my Pokémon doesn't put me to sleep again…",
4: "Seeing flowers in a garden is so soothing."
1: "아, 오늘은 날씨가 좋네요…\n음, 배틀일까요? 그럼 더 좋죠.",
2: "제 포켓몬들의 배틀 실력은 제 꽃꽂이 실력만큼 대단하답니다.",
3: "아, 제 포켓몬의 달콤한 향기가 저를 다시 잠들게 하지 않았으면 좋겠는데……",
4: "정원에서 꽃을 보면 마음이 편안해져요.”."
},
"victory": {
1: "Oh! I concede defeat.",
2: "That match was most delightful.",
3: "Ah, it appears it is my loss…",
4: "Oh, my goodness."
1: "앗! 제 패배를 인정합니다.",
2: "방금 경기 정말 달콤했어요.",
3: "아, 제가 진 것 같네요…",
4: "앗, 맙소사."
},
"defeat": {
1: "I was afraid I would doze off…",
2: "Oh my, it seems my Grass Pokémon overwhelmed you.",
3: "That battle was such a soothing experience.",
4: "Oh… Is that all?"
1: "저 조금 걱정했어요. 너무 졸려서…",
2: "어머, 제 풀 포켓몬이 당신을 압도한 것 같네요.",
3: "이 배틀 정말로 편안한 경험이었네요.",
4: "어머… 이게 끝인가요?"
}
},
"janine": {
"encounter": {
1: "I am mastering the art of poisonous attacks.\nI shall spar with you today!",
2: "Father trusts that I can hold my own.\nI will prove him right!",
3: "My ninja techniques are only second to my Father's!\nCan you keep up?"
1: "난 독을 사용하는 인술을 갈고 닦고 있어.\n오늘 수련에서는 너랑 대련할거야!",
2: "아버지는 내가 잘해낼 수 있다고 신뢰하셔.\n 그게 맞는다는 걸 증명할게!",
3: "내 인술은 아버지한테 뒤처지지 않아! 따라올 수 있겠어? "
},
"victory": {
1: "Even now, I still need training… I understand.",
2: "Your battle technique has outmatched mine.",
3: "I'm going to really apply myself and improve my skills."
1: "역시 아직도, 난 더 수련이 필요해… 납득했어.",
2: "네 배틀 기술이 내 인술보다 한 수위야.",
3: "더 스스로 갈고 닦아서, 내 인술을 향상 시키겠어."
},
"defeat": {
1: "Fufufu… the poison has sapped all your strength to battle.",
2: "Ha! You didn't stand a chance against my superior ninja skills!",
3: "Father's faith in me has proven to not be misplaced."
1: "후후후… 독이 네 기력을 모두 가져가버렸네.",
2: "하핫, 너 내 인술에 맞설 기회를 잡지 못했구나!",
3: "나를 향한 아버지의 신뢰, 틀리지 않았다는 걸 증명해냈어."
}
},
"sabrina": {
"encounter": {
1: "Through my psychic ability, I had a vision of your arrival!",
2: "I dislike fighting, but if you wish, I will show you my powers!",
3: "I can sense great ambition in you. I shall see if it not unfounded."
1: "내 초능력을 통해서, 너의 도착은 예상하고 있었어!",
2: "싸우는 건 좋아하지 않지만 네가 원한다면… 나의 힘을 보여줄게!",
3: "네게서 큰 염원이 느껴져. 그것이 근거 없는 것이 아닌지 지켜보겠어."
},
"victory": {
1: "Your power… It far exceeds what I foresaw…",
2: "I failed to accurately predict your power.",
3: "Even with my immense psychic powers, I cannot sense another as strong as you."
1: "너의 힘은… 내가 예견했던 것보다 훨씬 뛰어나…",
2: "나는 너의 힘을 정확하게 예측하지 못했어.",
3: "나 엄청난 초능력을 가지고도, 너처럼 강한 사람을 느끼지 못했네."
},
"defeat": {
1: "This victory… It is exactly as I foresaw in my visions!",
2: "Perhaps it was another I sensed a great desire in…",
3: "Hone your abilities before recklessly charging into battle.\nYou never know what the future may hold if you do…"
1: "이 승리는… 내가 환상에서 예견한 그대로네!",
2: "아마도 그건, 내가 깊이 느꼈던 또 다른 염원이었을거야…",
3: "무모하게 배틀에 임하기 전에 능력을 갈고닦도록.\n넌 미래가 어떻게 될지 예지할 수 없으니까…"
}
},
"blaine": {
"encounter": {
1: "Hah! Hope you brought a Burn Heal!",
2: "My fiery Pokémon will incinerate all challengers!",
3: "Get ready to play with fire!"
1: "우오오~옷! 화상치료제는 잘 준비했는가!",
2: "나의 포켓몬은 모든 것을 불꽃으로 태워버리는 강한 녀석들뿐이다!",
3: "불꽃과 함께할 준비는 됐는가!"
},
"victory": {
1: "I have burned down to nothing! Not even ashes remain!",
2: "Didn't I stoke the flames high enough?",
3: "I'm all burned out… But this makes my motivation to improve burn even hotter!"
1: "아무것도 남지 않고 불타버렸다! 재조차 남지 않았어!",
2: "내가 불을 너무 세게 피우지 않았나?",
3: "불태웠다… 하지만 이건 불꽃을 향상시키려는 내 동기를 더욱 뜨겁게 만드는군!"
},
"defeat": {
1: "My raging inferno cannot be quelled!",
2: "My Pokémon have been powered up with the heat from this victory!",
3: "Hah! My passion burns brighter than yours!"
1: "나의 타오르는 불길은 진압할 수 없다!",
2: "내 포켓몬은 이번 승리의 열기로 더욱 강해졌다!",
3: "하! 내 열정이 네 것보다 더 밝게 타오르고 있군!"
}
},
"giovanni": {
"encounter": {
1: "I, the leader of Team Rocket, will make you feel a world of pain!",
2: "My training here will be vital before I am to face my old associates again.",
3: "I do not think you are prepared for the level of failure you are about to experience!"
1: "나, 로켓단의 리더가, 고통의 세계를 느끼게 해주마!",
2: "옛 동료들과 다시 만나기 전, 이곳에서의 훈련은 매우 중요하겠군.",
3: "너는 곧 경험하게 될 실패에 대한 준비가 되어 있지 않군!"
},
"victory": {
1: "WHAT! Me, lose?! There is nothing I wish to say to you!",
2: "Hmph… You could never understand what I hope to achieve.",
3: "This defeat is merely delaying the inevitable.\nI will rise Team Rocket from the ashes in due time."
1: "하! 내가 졌다고?! 더 이상 할말이 없군!",
2: "흐음… 넌 내가 이루고자 하는 것을 결코 이해할 수 없을 거다.",
3: "이 패배는 피할 수 없는 것을 단지 지연시킬 뿐.\n때가 되면 잿더미에서 로켓단을 일으켜 세울 것이다."
},
"defeat": {
1: "Not being able to measure your own strength shows that you are still but a child.",
2: "Do not try to interfere with me again.",
3: "I hope you understand how foolish challenging me was."
1: "자신의 힘을 스스로 잴수 없다는 것은 네가 아직 꼬맹이라는 것을 보여준다고 할 수 있지.",
2: "다시는 나를 방해하지 말도록.",
3: "나에게 도전하는 것이 얼마나 어리석은 짓인지 이해했으면 좋겠군."
}
},
"roxanne": {
"encounter": {
1: "Would you kindly demonstrate how you battle?",
2: "You can learn many things by battling many trainers.",
3: "Oh, you caught me strategizing.\nWould you like to battle?"
1: "당신이 어떻게 싸우는지 보여주시겠어요?",
2: "당신은 여러 트레이너와 싸우면서 많은 것을 배울 수 있을거예요.",
3: "아, 전략짜는 거 들켰네요.\n배틀할까요?"
},
"victory": {
1: "Oh, I appear to have lost.\nI understand.",
2: "It seems that I still have so much more to learn when it comes to battle.",
3: "I'll take what I learned here today to heart."
1: "아, 제가 진 것 같네요.\n승복하겠습니다.",
2: "전 아직도 포켓몬 배틀에 대해서 한참 더 배워야할 것 같네요.",
3: "오늘 여기서 배운 것들을 마음에 담아둬야겠어요."
},
"defeat": {
1: "I have learned many things from our battle.\nI hope you have too.",
2: "I look forward to battling you again.\nI hope you'll use what you've learned here.",
3: "I won due to everything I have learned."
1: "전 방금 승부에서 많은 것을 배웠습니다.\n당신도 그랬길 바래요.",
2: "다시 붙을 날이 기대되네요.\n당신이 여기서 배운 걸 활용할 수 있길 바랍니다.",
3: "여태까지 공부해온 것 덕분에 이겼네요."
}
},
"brawly": {
"encounter": {
1: "Oh man, a challenger!\nLet's see what you can do!",
2: "You seem like a big splash.\nLet's battle!",
3: "Time to create a storm!\nLet's go!"
1: "오, 도전자잖아!\n어디 한 번 볼까!",
2: "넌 큰 파란을 일으킬 것 같군.\n승부다!",
3: "폭풍을 일으킬 시간이야!\n가자!"
},
"victory": {
1: "Oh woah, you've washed me out!",
2: "You surfed my wave and crashed me down!",
3: "I feel like I'm lost in Granite Cave!"
1: "우와, 너 날 씻겨버렸네!",
2: "내 파도를 타고, 나까지 밀어내다니!",
3: "바위 동굴에서 길을 잃은 기분이야!"
},
"defeat": {
1: "Haha, I surfed the big wave!\nChallenge me again sometime.",
2: "Surf with me again some time!",
3: "Just like the tides come in and out, I hope you return to challenge me again."
1: "하핫, 난 큰 파도를 탔다고!\n언제 또 도전해주라.",
2: "언젠가 또 같이 서핑하자고!",
3: "파도가 밀려왔다가 밀려나듯, 언젠가 너도 다시 도전하러 와."
}
},
"wattson": {
"encounter": {
1: "Time to get shocked!\nWahahahaha!",
2: "I'll make sparks fly!\nWahahahaha!",
3: "I hope you brought Paralyz Heal!\nWahahahaha!"
1: "찌릿찌릿해질 때가 됐군!\n와하하하핫!",
2: "스파크가 튀도록 해주마!\n와하하하하!",
3: "와하하하하!\n마비 치료제를 가져왔길 바라네!"
},
"victory": {
1: "Seems like I'm out of charge!\nWahahahaha!",
2: "You've completely grounded me!\nWahahahaha!",
3: "Thanks for the thrill!\nWahahahaha!"
1: "이 몸 배터리가 다 됐군!\n와하하하하!",
2: "자네 완전히 날 좌초시켰군!\n와하하하핫!",
3: "스릴 넘치는 배틀, 고맙네!\n와하하하하하!"
},
"defeat": {
1: "Recharge your batteries and challenge me again sometime!\nWahahahaha!",
2: "I hope you found our battle electrifying!\nWahahahaha!",
3: "Aren't you shocked I won?\nWahahahaha!"
1: "자네의 배터리 재충전하게. 그리고 나에게 도전하러 돌아오도록!\n와하하하핫!",
2: "방금 배틀이 자네에게 짜릿짜릿했길 바란다네!\n와하하하하!",
3: "자네 혹시 내가 이겨서 충격 받았나?\n와하하하핫!"
}
},
"flannery": {
"encounter": {
1: "Nice to meet you! Wait, no…\nI will crush you!",
2: "I've only been a leader for a little while, but I'll smoke you!",
3: "It's time to demonstrate the moves my grandfather has taught me! Let's battle!"
1: "어서오세요! 잠깐, 아냐…\n너를 무너뜨려줄게!",
2: "난 체육관 관장이 된지는 얼마 안됐지만, 널 태워버릴거야!",
3: "할아버지에게 배운 기술을 한 수 보여줄게! 승부다!"
},
"victory": {
1: "You remind me of my grandfather…\nNo wonder I lost.",
2: "Am I trying too hard?\nI should relax, can't get too heated.",
3: "Losing isn't going to smother me out.\nTime to reignite training!"
1: "너 우리 할아버지를 생각나게 하네…\n내가 진 게 놀랍진 않아.",
2: "나 너무 열심히 하는 건가?\n너무 열 올리면 안되니깐, 진정해야겠어.",
3: "패배는 날 꺼뜨릴 수 없어.\n트레이닝으로 다시 불을 붙일 때야!"
},
"defeat": {
1: "I hope I've made my grandfather proud…\nLet's battle again some time.",
2: "I…I can't believe I won!\nDoing things my way worked!",
3: "Let's exchange burning hot moves again soon!"
1: "할아버지가 자랑스러워하시길…\n언젠가 다시 배틀하자.",
2: "내…내가 이기다니!\n내 방식대로 한 게 통했어!",
3: "조만간 다시 뜨겁게 불타오르는 배틀을 하자!"
}
},
"norman": {
"encounter": {
1: "I'm surprised you managed to get here.\nLet's battle.",
2: "I'll do everything in my power as a Gym Leader to win.\nLet's go!",
3: "You better give this your all.\nIt's time to battle!"
1: "여기까지 오다니 놀랍군.\n한 번 겨뤄볼까.",
2: "관장으로서 최선을 다해 널 이길 거란다.\n가자!",
3: "최선을 다하는 게 좋을 거야.\n승부할 시간이다!"
},
"victory": {
1: "I lost to you…?\nRules are rules, though.",
2: "Was moving from Olivine a mistake…?",
3: "I can't believe it.\nThat was a great match."
1: "내가 지다니…?\n규칙은 규칙이니, 흐음.",
2: "담청시티에서 이사한 게 문제였나…?",
3: "믿을 수 없구나.\n훌륭한 승부였어."
},
"defeat": {
1: "We both tried our best.\nI hope we can battle again soon.",
2: "You should try challenging my kid instead.\nYou might learn something!",
3: "Thank you for the excellent battle.\nBetter luck next time."
1: "우린 둘 다 최선을 다했지.\n다시 대결할 수 있었으면 좋겠구나.",
2: "우리 집 꼬마에게 도전해보는 것도 좋겠군.\n아마 뭔가 배울 수 있을거다!",
3: "방금 전 배틀 완벽했어.\n다음에도 행운이 함께하길."
}
},
"winona": {
"encounter": {
1: "I've been soaring the skies looking for prey…\nAnd you're my target!",
2: "No matter how our battle is, my Flying Pokémon and I will triumph with grace. Let's battle!",
3: "I hope you aren't scared of heights.\nLet's ascend!"
1: "저는 먹이를 찾아서 하늘을 날아다녔어요…\n그리고 당신은 제 타겟입니다!",
2: "배틀이 어떻게 되든, 전 제 비행 포켓몬과 우아하게 승리하겠어요. 승부합시다!",
3: "당신이 높은 곳을 무서워하지 않기를.\n자, 날아올라요!"
},
"victory": {
1: "You're the first Trainer I've seen with more grace than I.\nExcellently played.",
2: "Oh, my Flying Pokémon have plummeted!\nVery well.",
3: "Though I may have fallen, my Pokémon will continue to fly!"
1: "저보다 우아하게 나서는 트레이너는 처음 봤습니다.\n훌륭하시네요.",
2: "이런, 제 비행 포켓몬이 추락해버렸네요!\n훌륭한 배틀이었습니다.",
3: "비록 전 떨어졌지만, 제 포켓몬은 다시 날아갈 겁니다!"
},
"defeat": {
1: "My Flying Pokémon and I will forever dance elegantly!",
2: "I hope you enjoyed our show.\nOur graceful dance is finished.",
3: "Won't you come see our elegant choreography again?"
1: "제 비행 포켓몬과 영원히 우아하게 춤출게요.",
2: "우리의 쇼가 즐거웠길 바라요.\우아한 춤은 끝났습니다.",
3: "우리의 엘레강스한 안무를 다시 보러오지 않을래요?"
}
},
"tate": {
"encounter": {
1: "Hehehe…\nWere you surprised to see me without my sister?",
2: "I can see what you're thinking…\nYou want to battle!",
3: "How can you defeat someone…\nWho knows your every move?"
1: "헤헤헤…\n내가 란과 같이 있지 않아서 놀랐지?",
2: "네가 무슨 생각을 하는지 알아…\n승부하고 싶은거지!",
3: "네 움직임을 모두 알고 있는데…\n어떻게 이기려고?"
},
"victory": {
1: "It can't be helped…\nI miss Liza…",
2: "Your bond with your Pokémon was stronger than mine.",
3: "If I were with Liza, we would have won.\nWe can finish each other's thoughts!"
1: "어쩔 수 없지…\n란이 보고싶다아…",
2: "너와 네 포켓몬과의 유대, 나보다 더 견고한걸.",
3: "란이랑 함께였다면, 우리가 이겼어.\n둘이선 더 잘 할 수 있다구!"
},
"defeat": {
1: "My Pokémon and I are superior!",
2: "If you can't even defeat me, you'll never be able to defeat Liza either.",
3: "It's all thanks to my strict training with Liza.\nI can make myself one with Pokémon."
1: "내 포켓몬과 나는 우수하다구!",
2: "날 못 이긴다면, 넌 란한테도 절대로 못 이겨.",
3: "란과 함께한 엄격한 훈련 덕이야.\n덕분에 포켓몬과 하나가 될 수 있었어."
}
},
"liza": {
"encounter": {
1: "Fufufu…\nWere you surprised to see me without my brother?",
2: "I can determine what you desire…\nYou want to battle, don't you?",
3: "How can you defeat someone…\nWho's one with their Pokémon?"
1: "후후후…\n내가 풍과 같이 있지 않아서 놀랐지?",
2: "네가 무얼 바라는지 알아…\n포켓몬 배틀, 맞지?",
3: "포켓몬과 하나가 된 사람…\n어떻게 이기려고?"
},
"victory": {
1: "It can't be helped…\nI miss Tate…",
2: "Your bond with your Pokémon…\nIt's stronger than mine.",
3: "If I were with Tate, we would have won.\nWe can finish each other's sentences!"
1: "어쩔 수 없지…\n풍이 보고싶다아…",
2: "너와 네 포켓몬과의 유대, 나보다 더 견고한걸.",
3: "풍이랑 함께였다면, 우리가 이겼어.\n둘이선 더 잘 할 수 있다구!"
},
"defeat": {
1: "My Pokémon and I are victorious.",
2: "If you can't even defeat me, you'll never be able to defeat Tate either.",
3: "It's all thanks to my strict training with Tate.\nI can synchronize myself with my Pokémon."
1: "내 포켓몬과 내가 승리한거야.",
2: "날 못 이긴다면, 넌 풍한테도 절대로 못 이겨.",
3: "풍과 함께한 엄격한 훈련 덕이야.\n덕분에 포켓몬과 싱크로 될 수 있었어."
}
},
"juan": {
"encounter": {
1: "Now's not the time to act coy.\nLet's battle!",
2: "Ahahaha, You'll be witness to my artistry with Water Pokémon!",
3: "A typhoon approaches!\nWill you be able to test me?",
4: "Please, you shall bear witness to our artistry.\nA grand illusion of water sculpted by my Pokémon and myself!"
1: "지금은 겸양을 부릴 때가 아니군요.\n승부합시다!",
2: "아하하하, 물 포켓몬과 함께 아트를 보여드리겠습니다!",
3: "태풍이 다가오는군요!\n저를 테스트해주시겠습니까?",
4: "자, 마음껏 봐주십시오.\n저와 포켓몬이 이루어내는 물의 일루전을!"
},
"victory": {
1: "You may be a genius who can take on Wallace!",
2: "I focused on elegance while you trained.\nIt's only natural that you defeated me.",
3: "Ahahaha!\nVery well, You have won this time.",
4: "From you, I sense the brilliant shine of skill that will overcome all."
1: "당신은 윤진 관장을 뛰어넘을 지니어스군요!",
2: "당신이 훈련할 때 저는 엘레강스에 집중했습니다.\n당신이 이기는 건 당연하죠.",
3: "아하하하하!\n잘했습니다, 이번엔 당신이 이겼네요.",
4: "모든 것을 극복하는 브릴리언트 스킬, 당신에게 느껴지네요."
},
"defeat": {
1: "My Pokémon and I have sculpted an illusion of Water and come out victorious.",
2: "Ahahaha, I have won, and you have lost.",
3: "Shall I loan you my outfit? It may help you battle!\nAhahaha, I jest!",
4: "I'm the winner! Which is to say, you lost."
1: "저와 포켓몬이 이루어내는 물의 일루전이 승리했습니다.",
2: "아하하핫, 저는 이겼고, 당신은 졌습니다.",
3: "겉옷 빌려드릴까요? 아마도 배틀에 도움이 될겁니다!\n아하하하, 농담입니다!",
4: "제가 승리자군요! 그리고, 당신은 졌네요."
}
},
"crasher_wake": {
@ -943,31 +943,31 @@ export const PGMdialogue: DialogueTranslationEntries = {
},
"ramos": {
"encounter": {
1: `Did yeh enjoy the garden playground I made with all these sturdy plants o' mine?
$Their strength is a sign o' my strength as a gardener and a Gym Leader! Yeh sure yer up to facing all that?`,
1: `그래, 올곧게 자란 초목을 모아서 만든 풀 정글짐은 어땠는가?
$자네가 ! ?`,
},
"victory": {
1: "Yeh believe in yer Pokémon… And they believe in yeh, too… It was a fine battle, sprout."
1: "포켓몬은 자네를 믿고, 자네는 그들을 믿는다…가슴이 후련해지는 승부였구먼."
},
"defeat": {
1: "Hohoho… Indeed. Frail little blades o' grass'll break through even concrete."
1: "호호호…연약해 보이는 풀잎은 콘크리트도 뚫을 수 있다네."
}
},
"viola": {
"encounter": {
1: `Whether it's the tears of frustration that follow a loss or the blossoming of joy that comes with victory
$They're both great subjects for my camera! Fantastic! This'll be just fantastic!
$Now come at me!`,
2: "My lens is always focused on victory--I won't let anything ruin this shot!"
1: `패배의 분함도 승리의 순간도
$ ! !
$, !`,
2: "나 비올라는 셔트 찬스를 노리는 것처럼--승리를 노릴 거야!"
},
"victory": {
1: "You and your Pokémon have shown me a whole new depth of field! Fantastic! Just fantastic!",
2: `The world you see through a lens, and the world you see with a Pokémon by your side
$The same world can look entirely different depending on your view.`
1: "너와 네 포켓몬은 최고의 콤비구나! 정말 멋져 멋져!",
2: `렌즈 너머의 세계와 포켓몬의 마음으로 보는 세계
$똑같이 .`
},
"defeat": {
1: "The photo from the moment of my victory will be a real winner, all right!",
2: "Yes! I took some great photos!"
1: "내가 승리한 순간을 찍은 사진은 정말 멋져 멋져!",
2: "좋아! 멋진 사진을 찍었어!"
}
},
"candice": {
@ -1046,24 +1046,24 @@ export const PGMdialogue: DialogueTranslationEntries = {
},
"kofu": {
"encounter": {
1: "I'mma serve you a full course o' Water-type Pokémon! Don't try to eat 'em, though!"
1: "물포켓몬의 풀코스를! 배 터지게 먹여 주도록 하마!"
},
"victory": {
1: "Vaultin' Veluza! Yer a lively one, aren't ya! A little TOO lively, if I do say so myself!"
1: "우옷! 우오오옷! 이렇게 팔팔한 트레이너가 다 있다니!"
},
"defeat": {
1: "You come back to see me again now, ya hear?"
1: "젊은 친구! 다음에 또 만나기를 기대하고 있으마!"
}
},
"tulip": {
"encounter": {
1: "Allow me to put my skills to use to make your cute little Pokémon even more beautiful!"
1: "리파의 기술로 너의 포켓몬들을 지금보다 훨~씬 아름답게 만들어 줄게!"
},
"victory": {
1: "Your strength has a magic to it that cannot be washed away."
1: "너의 강함은 풀 수 없는 매직이구나."
},
"defeat": {
1: "You know, in my line of work, people who lack talent in one area or the other often fade away quickly—never to be heard of again."
1: "…리파의 업계에서는 어중간한 재능을 가진 사람은 대체로 금방 사라져 버려."
}
},
"sidney": {
@ -1193,13 +1193,13 @@ export const PGMdialogue: DialogueTranslationEntries = {
},
"rika": {
"encounter": {
1: "I'd say I'll go easy on you, but… I'd be lying! Think fast!"
1: "실컷 귀여워해 줄 테니까… 한 번 열심히 해 보라고!"
},
"victory": {
1: "Not bad, kiddo."
1: "너, 꽤 하는구나!"
},
"defeat": {
1: "Nahahaha! You really are something else, kiddo!"
1: "아하하! 제법인데! 역시 너는 재밌는 녀석이라니까!"
}
},
"bruno": {
@ -1295,14 +1295,14 @@ export const PGMdialogue: DialogueTranslationEntries = {
},
"poppy": {
"encounter": {
1: "Oooh! Do you wanna have a Pokémon battle with me?"
1: "우와~! 뽀삐와 포켓몬 승부가 하고 싶으세요?"
},
"victory": {
1: "Uagh?! Mmmuuuggghhh…"
1: "훌쩍, 으에엥~"
},
"defeat": {
1: `Yaaay! I did it! I de-feet-ed you! You can come for… For… An avenge match?
$Come for an avenge match anytime you want!`,
1: `만세~! 만세~ 목수, 성공했어요!
$에헴! !`,
}
},
"agatha": {
@ -1390,14 +1390,14 @@ export const PGMdialogue: DialogueTranslationEntries = {
},
"larry_elite": {
"encounter": {
1: `Hello there… It's me, Larry.
$I serve as a member of the Elite Four too, yes Unfortunately for me.`,
1: `…안녕하십니까, 청목입니다.
$귀찮게도 .`,
},
"victory": {
1: "Well, that took the wind from under our wings…"
1: "날고 있는 새포켓몬도 떨어뜨릴 기세로군요."
},
"defeat": {
1: "It's time for a meeting with the boss."
1: "치프와 만나기로 한 시각이군요."
}
},
"lance": {
@ -1483,14 +1483,14 @@ export const PGMdialogue: DialogueTranslationEntries = {
},
"hassel": {
"encounter": {
1: "Prepare to learn firsthand how the fiery breath of ferocious battle feels!"
1: "맹렬하게 몰아치는 승부의 숨결을 직접 가르쳐 드리겠습니다!!"
},
"victory": {
1: `Fortune smiled on me this time, but…
$Judging from how the match went, who knows if I will be so lucky next time.`,
1: `이번에는 당신이 승리를 쟁취했군요.
$하지만, .`,
},
"defeat": {
1: "That was an ace!"
1: "저에게 더 배우고 싶은 것이 있으시다면 또 승부하도록 하죠."
}
},
"blue": {
@ -1662,13 +1662,13 @@ export const PGMdialogue: DialogueTranslationEntries = {
},
"katy": {
"encounter": {
1: "Don't let your guard down unless you would like to find yourself knocked off your feet!"
1: "쓰러지고 싶지 않다면 방심하지 말고 열심히 해 봐~"
},
"victory": {
1: "All of my sweet little Pokémon dropped like flies!"
1: "내 포켓몬들 모두 지쳐서 헤벌레~ 해졌어~"
},
"defeat": {
1: "Eat up, my cute little Vivillon!"
1: "비비용~ 많~이 먹으렴~"
}
},
"pryce": {
@ -1969,60 +1969,60 @@ export const PGMdialogue: DialogueTranslationEntries = {
},
"brassius": {
"encounter": {
1: "I assume you are ready? Let our collaborative work of art begin!"
1: "준비는 됐겠지!? 그럼, 우리 둘의 예술적인 합작품을 한번 만들어 보도록 할까!"
},
"victory": {
1: "Ahhh…vant-garde!"
1: "아… 아방가르드!!"
},
"defeat": {
1: "I will begin on a new piece at once!"
1: "바로 신작을 만들러 가야 하니 이만 실례하겠다!"
}
},
"iono": {
"encounter": {
1: `How're ya feelin' about this battle?
1: `자~ 오늘의 각오는~ 모야모야~?
$...
$Let's get this show on the road! How strong is our challenger?
$I 'unno! Let's find out together!`,
$그럼, !
$도전자님의 ~!?`,
},
"victory": {
1: "You're as flashy and bright as a 10,000,000-volt Thunderbolt, friendo!"
1: "너의 반짝임은 1000만볼트!"
},
"defeat": {
1: "Your eyeballs are MINE!"
1: "당신의 눈길을 일렉트릭네트로 뾰로롱!"
}
},
"larry": {
"encounter": {
1: "When all's said and done, simplicity is strongest."
1: "그렇습니다. 심플한 것이 가장 강한 것입니다!"
},
"victory": {
1: "A serving of defeat, huh?"
1: "허, 이걸로 한 방 먹은 게 되었군요."
},
"defeat": {
1: "I'll call it a day."
1: "오늘은 저는 이만 실례하겠습니다."
}
},
"ryme": {
"encounter": {
1: "Come on, baby! Rattle me down to the bone!"
1: "나의 영혼 흔들어 봐 Come On!"
},
"victory": {
1: "You're cool, my friend—you move my SOUL!"
1: "너의 Cool한 Youth 나의 Soul이 Move!"
},
"defeat": {
1: "Later, baby!"
1: "Bye Bye Baby~!"
}
},
"grusha": {
"encounter": {
1: "All I need to do is make sure the power of my Pokémon chills you to the bone!"
1: "내가 너를 철저하게 얼려 버리면 고민할 것도 없겠지!"
},
"victory": {
1: "Your burning passion… I kinda like it, to be honest."
1: "너의 그 열기… 싫지 않아."
},
"defeat": {
1: "Things didn't heat up for you."
1: "너에겐 아직 열기가 부족하구나."
}
},
"marnie_elite": {

View File

@ -49,4 +49,6 @@ export const menu: SimpleTranslationEntries = {
"empty":"빈 슬롯",
"yes":"예",
"no":"아니오",
"disclaimer": "DISCLAIMER",
"disclaimerDescription": "This game is an unfinished product; it might have playability issues (including the potential loss of save data),\n change without notice, and may or may not be updated further or completed."
} as const;

View File

@ -99,6 +99,10 @@ export const modifierType: ModifierTypeTranslationEntries = {
name: "No.{{moveId}} {{moveName}}",
description: "포켓몬에게 {{moveName}}[[를]] 가르침",
},
"TmModifierTypeWithInfo": {
name: "No.{{moveId}} {{moveName}}",
description: "포켓몬에게 {{moveName}}를(을) 가르침\n(Hold C or Shift for more info)",
},
"EvolutionItemModifierType": {
description: "어느 특정 포켓몬을 진화",
},

View File

@ -15,12 +15,12 @@ export const weather: SimpleTranslationEntries = {
"sandstormStartMessage": "모래바람이 불기 시작했다!",
"sandstormLapseMessage": "모래바람이 세차게 분다",
"sandstormClearMessage": "모래바람이 가라앉았다!",
"sandstormDamageMessage": "모래바람이\n{{pokemonPrefix}}{{pokemonName}}[[를]] 덮쳤다!",
"sandstormDamageMessage": "모래바람이\n{{pokemonNameWithAffix}}[[를]] 덮쳤다!",
"hailStartMessage": "싸라기눈이 내리기 시작했다!",
"hailLapseMessage": "싸라기눈이 계속 내리고 있다",
"hailClearMessage": "싸라기눈이 그쳤다!",
"hailDamageMessage": "싸라기눈이\n{{pokemonPrefix}}{{pokemonName}}[[를]] 덮쳤다!",
"hailDamageMessage": "싸라기눈이\n{{pokemonNameWithAffix}}[[를]] 덮쳤다!",
"snowStartMessage": "눈이 내리기 시작했다!",
"snowLapseMessage": "눈이 계속 내리고 있다",

View File

@ -56,6 +56,9 @@ export const battle: SimpleTranslationEntries = {
"skipItemQuestion": "Tem certeza de que não quer escolher um item?",
"eggHatching": "Opa?",
"ivScannerUseQuestion": "Quer usar o Scanner de IVs em {{pokemonName}}?",
"wildPokemonWithAffix": "{{pokemonName}} selvagem",
"foePokemonWithAffix": "{{pokemonName}} adversário",
"useMove": "{{pokemonNameWithAffix}} usou {{moveName}}!",
"drainMessage": "{{pokemonName}} teve sua\nenergia drenada!",
"regainHealth": "{{pokemonName}} recuperou\npontos de saúde!"
} as const;

View File

@ -27,7 +27,7 @@ export const gameStatsUiHandler: SimpleTranslationEntries = {
"subLegendsHatched": "Sub-Lendários Chocados",
"legendsSeen": "Lendários Vistos",
"legendsCaught": "Lendários Capturados",
"legendsHatched": "Legendários Chocados",
"legendsHatched": "Lendários Chocados",
"mythicalsSeen": "Míticos Vistos",
"mythicalsCaught": "Míticos Capturados",
"mythicalsHatched": "Míticos Chocados",

View File

@ -49,4 +49,6 @@ export const menu: SimpleTranslationEntries = {
"empty": "Vazio",
"yes": "Sim",
"no": "Não",
"disclaimer": "AVISO",
"disclaimerDescription": "Este jogo é um produto inacabado; ele pode ter problemas de jogabilidade (incluindo possíveis perdas de dados salvos),\n sofrer alterações sem aviso prévio e pode ou não ser atualizado ou concluído."
} as const;

View File

@ -46,7 +46,7 @@ export const modifierType: ModifierTypeTranslationEntries = {
},
"PokemonNatureChangeModifierType": {
name: "Hortelã {{natureName}}",
description: "Muda a natureza de um Pokémon para {{natureName}} e a desbloqueia permanentemente para seu inicial",
description: "Muda a natureza do Pokémon para {{natureName}} e a desbloqueia permanentemente",
},
"DoubleBattleChanceBoosterModifierType": {
description: "Dobra as chances de encontrar uma batalha em dupla por {{battleCount}} batalhas",
@ -99,6 +99,10 @@ export const modifierType: ModifierTypeTranslationEntries = {
name: "TM{{moveId}} - {{moveName}}",
description: "Ensina {{moveName}} a um Pokémon",
},
"TmModifierTypeWithInfo": {
name: "TM{{moveId}} - {{moveName}}",
description: "Ensina {{moveName}} a um Pokémon\n(Segure C ou Shift para mais informações)",
},
"EvolutionItemModifierType": {
description: "Faz certos Pokémon evoluírem",
},

View File

@ -9,7 +9,7 @@ export const tutorial: SimpleTranslationEntries = {
$Se o jogo estiver rodando lentamente, certifique-se de que a 'Aceleração de hardware' esteja ativada
$nas configurações do seu navegador.`,
"accessMenu": `Para acessar o menu, aperte M ou Esc.
"accessMenu": `Para acessar o menu, pressione M ou Esc.
$O menu contém configurações e diversas funções.`,
"menu": `A partir deste menu, você pode acessar as configurações.

View File

@ -15,12 +15,12 @@ export const weather: SimpleTranslationEntries = {
"sandstormStartMessage": "Uma tempestade de areia se formou!",
"sandstormLapseMessage": "A tempestade de areia é violenta.",
"sandstormClearMessage": "A tempestade de areia diminuiu.",
"sandstormDamageMessage": "{{pokemonPrefix}}{{pokemonName}} é atingido\npela tempestade de areia!",
"sandstormDamageMessage": "{{pokemonNameWithAffix}} é atingido\npela tempestade de areia!",
"hailStartMessage": "Começou a chover granizo!",
"hailLapseMessage": "Granizo cai do céu.",
"hailClearMessage": "O granizo parou.",
"hailDamageMessage": "{{pokemonPrefix}}{{pokemonName}} é atingido\npelo granizo!",
"hailDamageMessage": "{{pokemonNameWithAffix}} é atingido\npelo granizo!",
"snowStartMessage": "Começou a nevar!",
"snowLapseMessage": "A neve continua caindo.",

View File

@ -56,6 +56,9 @@ export const battle: SimpleTranslationEntries = {
"skipItemQuestion": "你确定要跳过拾取道具吗?",
"eggHatching": "咦?",
"ivScannerUseQuestion": "对 {{pokemonName}} 使用个体值扫描仪?",
"wildPokemonWithAffix": "Wild {{pokemonName}}",
"foePokemonWithAffix": "Foe {{pokemonName}}",
"useMove": "{{pokemonNameWithAffix}} used {{moveName}}!",
"drainMessage": "{{pokemonName}} had its\nenergy drained!",
"regainHealth": "{{pokemonName}} regained\nhealth!"
} as const;

View File

@ -49,4 +49,6 @@ export const menu: SimpleTranslationEntries = {
"empty": "空",
"yes": "是",
"no": "否",
"disclaimer": "DISCLAIMER",
"disclaimerDescription": "This game is an unfinished product; it might have playability issues (including the potential loss of save data),\n change without notice, and may or may not be updated further or completed."
} as const;

View File

@ -99,6 +99,10 @@ export const modifierType: ModifierTypeTranslationEntries = {
name: "招式学习器 {{moveId}} - {{moveName}}",
description: "教会一只宝可梦{{moveName}}",
},
"TmModifierTypeWithInfo": {
name: "招式学习器 {{moveId}} - {{moveName}}",
description: "教会一只宝可梦{{moveName}}\n(Hold C or Shift for more info)",
},
"EvolutionItemModifierType": {
description: "使某些宝可梦进化",
},

View File

@ -15,12 +15,12 @@ export const weather: SimpleTranslationEntries = {
"sandstormStartMessage": "开始刮沙暴了!",
"sandstormLapseMessage": "沙暴肆虐。",
"sandstormClearMessage": "沙暴停止了!",
"sandstormDamageMessage": "沙暴袭击了{{pokemonPrefix}}{{pokemonName}}",
"sandstormDamageMessage": "沙暴袭击了{{pokemonNameWithAffix}}",
"hailStartMessage": "开始下冰雹了!",
"hailLapseMessage": "冰雹继续肆虐。",
"hailClearMessage": "冰雹不再下了。",
"hailDamageMessage": "冰雹袭击了{{pokemonPrefix}}{{pokemonName}}",
"hailDamageMessage": "冰雹袭击了{{pokemonNameWithAffix}}",
"snowStartMessage": "开始下雪了!",
"snowLapseMessage": "雪继续下。",

File diff suppressed because it is too large Load Diff

View File

@ -53,6 +53,9 @@ export const battle: SimpleTranslationEntries = {
"skipItemQuestion": "你要跳過拾取道具嗎?",
"eggHatching": "咦?",
"ivScannerUseQuestion": "對 {{pokemonName}} 使用個體值掃描?",
"wildPokemonWithAffix": "Wild {{pokemonName}}",
"foePokemonWithAffix": "Foe {{pokemonName}}",
"useMove": "{{pokemonNameWithAffix}} used {{moveName}}!",
"drainMessage": "{{pokemonName}} had its\nenergy drained!",
"regainHealth": "{{pokemonName}} regained\nhealth!"
} as const;

View File

@ -49,4 +49,6 @@ export const menu: SimpleTranslationEntries = {
"empty":"空",
"yes":"是",
"no":"否",
"disclaimer": "DISCLAIMER",
"disclaimerDescription": "This game is an unfinished product; it might have playability issues (including the potential loss of save data),\n change without notice, and may or may not be updated further or completed."
} as const;

View File

@ -98,6 +98,10 @@ export const modifierType: ModifierTypeTranslationEntries = {
name: "招式學習器 {{moveId}} - {{moveName}}",
description: "教會一隻寶可夢{{moveName}}",
},
TmModifierTypeWithInfo: {
name: "TM{{moveId}} - {{moveName}}",
description: "教會一隻寶可夢{{moveName}}\n(Hold C or Shift for more info)",
},
EvolutionItemModifierType: { description: "使某些寶可夢進化" },
FormChangeItemModifierType: { description: "使某些寶可夢更改形態" },
FusePokemonModifierType: {

View File

@ -15,12 +15,12 @@ export const weather: SimpleTranslationEntries = {
"sandstormStartMessage": "開始刮沙暴了!",
"sandstormLapseMessage": "沙暴肆虐。",
"sandstormClearMessage": "沙暴停止了。",
"sandstormDamageMessage": "沙暴襲擊了{{pokemonPrefix}}{{pokemonName}}!",
"sandstormDamageMessage": "沙暴襲擊了{{pokemonNameWithAffix}}!",
"hailStartMessage": "開始下冰雹了!",
"hailLapseMessage": "冰雹繼續肆虐。",
"hailClearMessage": "冰雹不再下了。",
"hailDamageMessage": "冰雹襲擊了{{pokemonPrefix}}{{pokemonName}}!",
"hailDamageMessage": "冰雹襲擊了{{pokemonNameWithAffix}}!",
"snowStartMessage": "開始下雪了!",
"snowLapseMessage": "雪繼續下。",

View File

@ -1,19 +1,40 @@
import { BattleSpec } from "./enums/battle-spec";
import Pokemon from "./field/pokemon";
import i18next from "./plugins/i18n";
/**
* Builds a message by concatenating the Pokemon name with its potential affix and the given text
* @param pokemon {@linkcode Pokemon} name and battle context will be retrieved from this instance for {@linkcode getPokemonNameWithAffix}
* @param {string} content any text
* @returns {string} ex: "Wild Gengar fainted!", "Ectoplasma sauvage est K.O!"
* @see {@linkcode getPokemonNameWithAffix} for the Pokemon's name and potentiel affix
*/
export function getPokemonMessage(pokemon: Pokemon, content: string): string {
return `${getPokemonPrefix(pokemon)}${pokemon.name}${content}`;
return `${getPokemonNameWithAffix(pokemon)}${content}`;
}
export function getPokemonPrefix(pokemon: Pokemon): string {
let prefix: string;
/**
* Retrieves the Pokemon's name, potentially with an affix indicating its role (wild or foe) in the current battle context, translated
* @param pokemon {@linkcode Pokemon} name and battle context will be retrieved from this instance
* @returns {string} ex: "Wild Gengar", "Ectoplasma sauvage"
*/
export function getPokemonNameWithAffix(pokemon: Pokemon): string {
switch (pokemon.scene.currentBattle.battleSpec) {
case BattleSpec.DEFAULT:
prefix = !pokemon.isPlayer() ? pokemon.hasTrainer() ? "Foe " : "Wild " : "";
break;
return !pokemon.isPlayer()
? pokemon.hasTrainer()
? i18next.t("battle:foePokemonWithAffix", {
pokemonName: pokemon.name,
})
: i18next.t("battle:wildPokemonWithAffix", {
pokemonName: pokemon.name,
})
: pokemon.name;
case BattleSpec.FINAL_BOSS:
prefix = !pokemon.isPlayer() ? "Foe " : "";
break;
return !pokemon.isPlayer()
? i18next.t("battle:foePokemonWithAffix", { pokemonName: pokemon.name })
: pokemon.name;
default:
return pokemon.name;
}
return prefix;
}

View File

@ -23,6 +23,7 @@ import { ModifierTier } from "./modifier-tier";
import { Nature, getNatureName, getNatureStatMultiplier } from "#app/data/nature";
import i18next from "#app/plugins/i18n";
import { getModifierTierTextTint } from "#app/ui/text";
import * as Overrides from "../overrides";
const outputModifierData = false;
const useMaxWeightForOutput = false;
@ -721,7 +722,7 @@ export class TmModifierType extends PokemonModifierType {
}
getDescription(scene: BattleScene): string {
return i18next.t("modifierType:ModifierType.TmModifierType.description", { moveName: allMoves[this.moveId].name });
return i18next.t(scene.enableMoveInfo ? "modifierType:ModifierType.TmModifierTypeWithInfo.description" : "modifierType:ModifierType.TmModifierType.description", { moveName: allMoves[this.moveId].name });
}
}
@ -1322,6 +1323,7 @@ const modifierPool: ModifierPool = {
new WeightedModifierType(modifierTypes.BASE_STAT_BOOSTER, 3),
new WeightedModifierType(modifierTypes.TERA_SHARD, 1),
new WeightedModifierType(modifierTypes.DNA_SPLICERS, (party: Pokemon[]) => party[0].scene.gameMode.isSplicedOnly && party.filter(p => !p.fusionSpecies).length > 1 ? 4 : 0),
new WeightedModifierType(modifierTypes.VOUCHER, (party: Pokemon[], rerollCount: integer) => !party[0].scene.gameMode.isDaily ? Math.max(1 - rerollCount, 0) : 0, 1),
].map(m => {
m.setTier(ModifierTier.GREAT); return m;
}),
@ -1357,7 +1359,6 @@ const modifierPool: ModifierPool = {
new WeightedModifierType(modifierTypes.EXP_SHARE, 12),
new WeightedModifierType(modifierTypes.EXP_BALANCE, 4),
new WeightedModifierType(modifierTypes.TERA_ORB, (party: Pokemon[]) => Math.min(Math.max(Math.floor(party[0].scene.currentBattle.waveIndex / 50) * 2, 1), 4), 4),
new WeightedModifierType(modifierTypes.VOUCHER, (party: Pokemon[], rerollCount: integer) => !party[0].scene.gameMode.isDaily ? Math.max(3 - rerollCount, 0) : 0, 3),
new WeightedModifierType(modifierTypes.WIDE_LENS, 4),
].map(m => {
m.setTier(ModifierTier.ULTRA); return m;
@ -1382,6 +1383,7 @@ const modifierPool: ModifierPool = {
new WeightedModifierType(modifierTypes.FORM_CHANGE_ITEM, 18),
new WeightedModifierType(modifierTypes.MEGA_BRACELET, (party: Pokemon[]) => Math.min(Math.ceil(party[0].scene.currentBattle.waveIndex / 50), 4) * 8, 32),
new WeightedModifierType(modifierTypes.DYNAMAX_BAND, (party: Pokemon[]) => Math.min(Math.ceil(party[0].scene.currentBattle.waveIndex / 50), 4) * 8, 32),
new WeightedModifierType(modifierTypes.VOUCHER_PLUS, (party: Pokemon[], rerollCount: integer) => !party[0].scene.gameMode.isDaily ? Math.max(5 - rerollCount * 2, 0) : 0, 5),
].map(m => {
m.setTier(ModifierTier.ROGUE); return m;
}),
@ -1390,7 +1392,7 @@ const modifierPool: ModifierPool = {
new WeightedModifierType(modifierTypes.SHINY_CHARM, 14),
new WeightedModifierType(modifierTypes.HEALING_CHARM, 18),
new WeightedModifierType(modifierTypes.MULTI_LENS, 18),
new WeightedModifierType(modifierTypes.VOUCHER_PLUS, (party: Pokemon[], rerollCount: integer) => !party[0].scene.gameMode.isDaily ? Math.max(9 - rerollCount * 3, 0) : 0, 9),
new WeightedModifierType(modifierTypes.VOUCHER_PREMIUM, (party: Pokemon[], rerollCount: integer) => !party[0].scene.gameMode.isDaily && !party[0].scene.gameMode.isEndless && !party[0].scene.gameMode.isSplicedOnly ? Math.max(6 - rerollCount * 2, 0) : 0, 6),
new WeightedModifierType(modifierTypes.DNA_SPLICERS, (party: Pokemon[]) => !party[0].scene.gameMode.isSplicedOnly && party.filter(p => !p.fusionSpecies).length > 1 ? 24 : 0, 24),
new WeightedModifierType(modifierTypes.MINI_BLACK_HOLE, (party: Pokemon[]) => party[0].scene.gameData.unlocks[Unlockables.MINI_BLACK_HOLE] ? 1 : 0, 1),
].map(m => {
@ -1672,6 +1674,14 @@ export function getPlayerModifierTypeOptions(count: integer, party: PlayerPokemo
}
options.push(candidate);
});
// OVERRIDE IF NECESSARY
if (Overrides.ITEM_REWARD_OVERRIDE?.length) {
options.forEach((mod, i) => {
// @ts-ignore: keeps throwing don't use string as index error in typedoc run
const override = modifierTypes[Overrides.ITEM_REWARD_OVERRIDE[i]]?.();
mod.type = (override instanceof ModifierTypeGenerator ? override.generateType(party) : override) || mod.type;
});
}
return options;
}
@ -1874,8 +1884,9 @@ export class ModifierTypeOption {
}
export function getPartyLuckValue(party: Pokemon[]): integer {
return Phaser.Math.Clamp(party.map(p => p.isFainted() ? 0 : p.getLuck())
const luck = Phaser.Math.Clamp(party.map(p => p.isFainted() ? 0 : p.getLuck())
.reduce((total: integer, value: integer) => total += value, 0), 0, 14);
return luck || 0;
}
export function getLuckString(luckValue: integer): string {

View File

@ -22,6 +22,7 @@ import { Nature } from "#app/data/nature";
import { BattlerTagType } from "#app/data/enums/battler-tag-type";
import * as Overrides from "../overrides";
import { ModifierType, modifierTypes } from "./modifier-type";
import { Command } from "#app/ui/command-ui-handler.js";
export type ModifierPredicate = (modifier: Modifier) => boolean;
@ -776,7 +777,10 @@ export class BypassSpeedChanceModifier extends PokemonHeldItemModifier {
if (!bypassSpeed.value && pokemon.randSeedInt(10) < this.getStackCount()) {
bypassSpeed.value = true;
if (this.type instanceof ModifierTypes.PokemonHeldItemModifierType && this.type.id === "QUICK_CLAW") {
const isCommandFight = pokemon.scene.currentBattle.turnCommands[pokemon.getBattlerIndex()]?.command === Command.FIGHT;
const hasQuickClaw = this.type instanceof ModifierTypes.PokemonHeldItemModifierType && this.type.id === "QUICK_CLAW";
if (isCommandFight && hasQuickClaw) {
pokemon.scene.queueMessage(getPokemonMessage(pokemon, " used its quick claw to move faster!"));
}
return true;
@ -2191,7 +2195,8 @@ export class EnemyAttackStatusEffectChanceModifier extends EnemyPersistentModifi
super(type, stackCount);
this.effect = effect;
this.chance = (chancePercent || 5) / 100;
//Hardcode temporarily
this.chance = .025 * ((this.effect === StatusEffect.BURN || this.effect === StatusEffect.POISON) ? 2 : 1);
}
match(modifier: Modifier): boolean {
@ -2226,7 +2231,8 @@ export class EnemyStatusEffectHealChanceModifier extends EnemyPersistentModifier
constructor(type: ModifierType, chancePercent: number, stackCount?: integer) {
super(type, stackCount);
this.chance = (chancePercent || 2.5) / 100;
//Hardcode temporarily
this.chance = .025;
}
match(modifier: Modifier): boolean {
@ -2264,7 +2270,8 @@ export class EnemyEndureChanceModifier extends EnemyPersistentModifier {
constructor(type: ModifierType, chancePercent?: number, stackCount?: integer) {
super(type, stackCount || 10);
this.chance = (chancePercent || 2) / 100;
//Hardcode temporarily
this.chance = .02;
}
match(modifier: Modifier) {

View File

@ -110,3 +110,11 @@ export const OPP_MODIFIER_OVERRIDE: Array<ModifierOverride> = [];
export const STARTING_HELD_ITEMS_OVERRIDE: Array<ModifierOverride> = [];
export const OPP_HELD_ITEMS_OVERRIDE: Array<ModifierOverride> = [];
/**
* An array of items by keys as defined in the "modifierTypes" object in the "modifier/modifier-type.ts" file.
* Items listed will replace the normal rolls.
* If less items are listed than rolled, only some items will be replaced
* If more items are listed than rolled, only the first X items will be shown, where X is the number of items rolled.
*/
export const ITEM_REWARD_OVERRIDE: Array<String> = [];

View File

@ -23,7 +23,7 @@ import { FusePokemonModifierType, ModifierPoolType, ModifierType, ModifierTypeFu
import SoundFade from "phaser3-rex-plugins/plugins/soundfade";
import { BattlerTagLapseType, EncoreTag, HideSpriteTag as HiddenTag, ProtectedTag, TrappedTag } from "./data/battler-tags";
import { BattlerTagType } from "./data/enums/battler-tag-type";
import { getPokemonMessage, getPokemonPrefix } from "./messages";
import { getPokemonMessage, getPokemonNameWithAffix } from "./messages";
import { Starter } from "./ui/starter-select-ui-handler";
import { Gender } from "./data/gender";
import { Weather, WeatherType, getRandomWeatherType, getTerrainBlockMessage, getWeatherDamageMessage, getWeatherLapseMessage } from "./data/weather";
@ -43,7 +43,8 @@ import { EggHatchPhase } from "./egg-hatch-phase";
import { Egg } from "./data/egg";
import { vouchers } from "./system/voucher";
import { loggedInUser, updateUserInfo } from "./account";
import { PlayerGender, SessionSaveData } from "./system/game-data";
import { SessionSaveData } from "./system/game-data";
import { PlayerGender } from "./data/enums/player-gender";
import { addPokeballCaptureStars, addPokeballOpenParticles } from "./field/anims";
import { SpeciesFormChangeActiveTrigger, SpeciesFormChangeManualTrigger, SpeciesFormChangeMoveLearnedTrigger, SpeciesFormChangePostMoveTrigger, SpeciesFormChangePreMoveTrigger } from "./data/pokemon-forms";
import { battleSpecDialogue, getCharVariantFromDialogue, miscDialogue } from "./data/dialogue";
@ -61,7 +62,7 @@ import { Abilities } from "./data/enums/abilities";
import * as Overrides from "./overrides";
import { TextStyle, addTextObject } from "./ui/text";
import { Type } from "./data/type";
import { BerryUsedEvent, MoveUsedEvent, TurnEndEvent, TurnInitEvent } from "./battle-scene-events";
import { BerryUsedEvent, EncounterPhaseEvent, MoveUsedEvent, TurnEndEvent, TurnInitEvent } from "./battle-scene-events";
export class LoginPhase extends Phase {
@ -740,6 +741,8 @@ export class EncounterPhase extends BattlePhase {
this.scene.initSession();
this.scene.eventTarget.dispatchEvent(new EncounterPhaseEvent());
// Failsafe if players somehow skip floor 200 in classic mode
if (this.scene.gameMode.isClassic && this.scene.currentBattle.waveIndex > 200) {
this.scene.unshiftPhase(new GameOverPhase(this.scene));
@ -1664,6 +1667,11 @@ export class CheckSwitchPhase extends BattlePhase {
const pokemon = this.scene.getPlayerField()[this.fieldIndex];
if (this.scene.battleStyle === 1) {
super.end();
return;
}
if (this.scene.field.getAll().indexOf(pokemon) === -1) {
this.scene.unshiftPhase(new SummonMissingPhase(this.scene, this.fieldIndex));
super.end();
@ -2273,7 +2281,7 @@ export class TurnEndPhase extends FieldPhase {
pokemon.lapseTags(BattlerTagLapseType.TURN_END);
if (pokemon.summonData.disabledMove && !--pokemon.summonData.disabledTurns) {
this.scene.pushPhase(new MessagePhase(this.scene, i18next.t("battle:notDisabled", { pokemonName: `${getPokemonPrefix(pokemon)}${pokemon.name}`, moveName: allMoves[pokemon.summonData.disabledMove].name })));
this.scene.pushPhase(new MessagePhase(this.scene, i18next.t("battle:notDisabled", { pokemonName: getPokemonNameWithAffix(pokemon), moveName: allMoves[pokemon.summonData.disabledMove].name })));
pokemon.summonData.disabledMove = Moves.NONE;
}
@ -2583,7 +2591,7 @@ export class MovePhase extends BattlePhase {
this.scene.getPlayerField().forEach(pokemon => {
applyPostMoveUsedAbAttrs(PostMoveUsedAbAttr, pokemon, this.move, this.pokemon, this.targets);
});
this.scene.getEnemyParty().forEach(pokemon => {
this.scene.getEnemyField().forEach(pokemon => {
applyPostMoveUsedAbAttrs(PostMoveUsedAbAttr, pokemon, this.move, this.pokemon, this.targets);
});
}
@ -2640,7 +2648,10 @@ export class MovePhase extends BattlePhase {
if (this.move.getMove().hasAttr(ChargeAttr)) {
const lastMove = this.pokemon.getLastXMoves() as TurnMove[];
if (!lastMove.length || lastMove[0].move !== this.move.getMove().id || lastMove[0].result !== MoveResult.OTHER) {
this.scene.queueMessage(getPokemonMessage(this.pokemon, ` used\n${this.move.getName()}!`), 500);
this.scene.queueMessage(i18next.t("battle:useMove", {
pokemonNameWithAffix: getPokemonNameWithAffix(this.pokemon),
moveName: this.move.getName()
}), 500);
return;
}
}
@ -2649,7 +2660,10 @@ export class MovePhase extends BattlePhase {
return;
}
this.scene.queueMessage(getPokemonMessage(this.pokemon, ` used\n${this.move.getName()}!`), 500);
this.scene.queueMessage(i18next.t("battle:useMove", {
pokemonNameWithAffix: getPokemonNameWithAffix(this.pokemon),
moveName: this.move.getName()
}), 500);
applyMoveAttrs(PreMoveMessageAttr, this.pokemon, this.pokemon.getOpponents().find(() => true), this.move.getMove());
}

View File

@ -36,28 +36,11 @@ import { TerrainChangedEvent, WeatherChangedEvent } from "#app/field/arena-event
import { Device } from "#app/enums/devices.js";
import { EnemyAttackStatusEffectChanceModifier } from "../modifier/modifier";
import { StatusEffect } from "#app/data/status-effect.js";
import { PlayerGender } from "#app/data/enums/player-gender";
import { GameDataType } from "#app/data/enums/game-data-type";
const saveKey = "x0i2O7WRiANTqPmZ"; // Temporary; secure encryption is not yet necessary
export enum GameDataType {
SYSTEM,
SESSION,
SETTINGS,
TUTORIALS,
SEEN_DIALOGUES
}
export enum PlayerGender {
UNSET,
MALE,
FEMALE
}
export enum Passive {
UNLOCKED = 1,
ENABLED = 2
}
export function getDataTypeKey(dataType: GameDataType, slotId: integer = 0): string {
switch (dataType) {
case GameDataType.SYSTEM:

View File

@ -3,10 +3,11 @@ import i18next from "i18next";
import BattleScene from "../../battle-scene";
import { hasTouchscreen } from "../../touch-controls";
import { updateWindowType } from "../../ui/ui-theme";
import { PlayerGender } from "../game-data";
import { PlayerGender } from "#app/data/enums/player-gender";
import { CandyUpgradeNotificationChangedEvent } from "#app/battle-scene-events.js";
import { MoneyFormat } from "../../enums/money-format";
import SettingsUiHandler from "#app/ui/settings/settings-ui-handler";
import { EaseType } from "#app/ui/enums/ease-type.js";
const MUTE = "Mute";
const VOLUME_OPTIONS = new Array(11).fill(null).map((_, i) => i ? (i * 10).toString() : MUTE);
@ -18,7 +19,8 @@ const AUTO_DISABLED = ["Auto", "Disabled"];
*/
export enum SettingType {
GENERAL,
ACCESSIBILITY
DISPLAY,
AUDIO
}
export interface Setting {
@ -36,32 +38,36 @@ export interface Setting {
*/
export const SettingKeys = {
Game_Speed: "GAME_SPEED",
HP_Bar_Speed: "HP_BAR_SPEED",
EXP_Gains_Speed: "EXP_GAINS_SPEED",
EXP_Party_Display: "EXP_PARTY_DISPLAY",
Skip_Seen_Dialogues: "SKIP_SEEN_DIALOGUES",
Battle_Style: "BATTLE_STYLE",
Enable_Retries: "ENABLE_RETRIES",
Tutorials: "TUTORIALS",
Touch_Controls: "TOUCH_CONTROLS",
Vibration: "VIBRATION",
Language: "LANGUAGE",
UI_Theme: "UI_THEME",
Window_Type: "WINDOW_TYPE",
Money_Format: "MONEY_FORMAT",
Damage_Numbers: "DAMAGE_NUMBERS",
Move_Animations: "MOVE_ANIMATIONS",
Show_Stats_on_Level_Up: "SHOW_LEVEL_UP_STATS",
Candy_Upgrade_Notification: "CANDY_UPGRADE_NOTIFICATION",
Candy_Upgrade_Display: "CANDY_UPGRADE_DISPLAY",
Move_Info: "MOVE_INFO",
Show_Moveset_Flyout: "SHOW_MOVESET_FLYOUT",
Show_Arena_Flyout: "SHOW_ARENA_FLYOUT",
Show_Time_Of_Day_Widget: "SHOW_TIME_OF_DAY_WIDGET",
Time_Of_Day_Animation: "TIME_OF_DAY_ANIMATION",
Sprite_Set: "SPRITE_SET",
Fusion_Palette_Swaps: "FUSION_PALETTE_SWAPS",
Player_Gender: "PLAYER_GENDER",
Master_Volume: "MASTER_VOLUME",
BGM_Volume: "BGM_VOLUME",
SE_Volume: "SE_VOLUME",
Language: "LANGUAGE",
Damage_Numbers: "DAMAGE_NUMBERS",
UI_Theme: "UI_THEME",
Window_Type: "WINDOW_TYPE",
Tutorials: "TUTORIALS",
Enable_Retries: "ENABLE_RETRIES",
Skip_Seen_Dialogues: "SKIP_SEEN_DIALOGUES",
Candy_Upgrade_Notification: "CANDY_UPGRADE_NOTIFICATION",
Candy_Upgrade_Display: "CANDY_UPGRADE_DISPLAY",
Money_Format: "MONEY_FORMAT",
Sprite_Set: "SPRITE_SET",
Music_Preference: "MUSIC_PREFERENCE",
Move_Animations: "MOVE_ANIMATIONS",
Show_Moveset_Flyout: "SHOW_MOVESET_FLYOUT",
Show_Arena_Flyout: "SHOW_ARENA_FLYOUT",
Show_Stats_on_Level_Up: "SHOW_LEVEL_UP_STATS",
EXP_Gains_Speed: "EXP_GAINS_SPEED",
EXP_Party_Display: "EXP_PARTY_DISPLAY",
HP_Bar_Speed: "HP_BAR_SPEED",
Fusion_Palette_Swaps: "FUSION_PALETTE_SWAPS",
Player_Gender: "PLAYER_GENDER",
Touch_Controls: "TOUCH_CONTROLS",
Vibration: "VIBRATION"
Music_Preference: "MUSIC_PREFERENCE"
};
/**
@ -76,141 +82,10 @@ export const Setting: Array<Setting> = [
type: SettingType.GENERAL
},
{
key: SettingKeys.Master_Volume,
label: "Master Volume",
options: VOLUME_OPTIONS,
default: 5,
type: SettingType.GENERAL
},
{
key: SettingKeys.BGM_Volume,
label: "BGM Volume",
options: VOLUME_OPTIONS,
default: 10,
type: SettingType.GENERAL
},
{
key: SettingKeys.SE_Volume,
label: "SE Volume",
options: VOLUME_OPTIONS,
default: 10,
type: SettingType.GENERAL
},
{
key: SettingKeys.Language,
label: "Language",
options: ["English", "Change"],
key: SettingKeys.HP_Bar_Speed,
label: "HP Bar Speed",
options: ["Normal", "Fast", "Faster", "Skip"],
default: 0,
type: SettingType.GENERAL,
requireReload: true
},
{
key: SettingKeys.Damage_Numbers,
label: "Damage Numbers",
options: ["Off", "Simple", "Fancy"],
default: 0,
type: SettingType.GENERAL
},
{
key: SettingKeys.UI_Theme,
label: "UI Theme",
options: ["Default", "Legacy"],
default: 0,
type: SettingType.GENERAL,
requireReload: true
},
{
key: SettingKeys.Window_Type,
label: "Window Type",
options: new Array(5).fill(null).map((_, i) => (i + 1).toString()),
default: 0,
type: SettingType.GENERAL
},
{
key: SettingKeys.Tutorials,
label: "Tutorials",
options: OFF_ON,
default: 1,
type: SettingType.GENERAL
},
{
key: SettingKeys.Enable_Retries,
label: "Enable Retries",
options: OFF_ON,
default: 0,
type: SettingType.ACCESSIBILITY
},
{
key: SettingKeys.Skip_Seen_Dialogues,
label: "Skip Seen Dialogues",
options: OFF_ON,
default: 0,
type: SettingType.GENERAL
},
{
key: SettingKeys.Candy_Upgrade_Notification,
label: "Candy Upgrade Notification",
options: ["Off", "Passives Only", "On"],
default: 0,
type: SettingType.ACCESSIBILITY
},
{
key: SettingKeys.Candy_Upgrade_Display,
label: "Candy Upgrade Display",
options: ["Icon", "Animation"],
default: 0,
type: SettingType.ACCESSIBILITY,
requireReload: true
},
{
key: SettingKeys.Money_Format,
label: "Money Format",
options: ["Normal", "Abbreviated"],
default: 0,
type: SettingType.ACCESSIBILITY
},
{
key: SettingKeys.Sprite_Set,
label: "Sprite Set",
options: ["Consistent", "Mixed Animated"],
default: 0,
type: SettingType.GENERAL,
requireReload: true
},
{
key: SettingKeys.Music_Preference,
label: "Music Preference",
options: ["Consistent", "Mixed"],
default: 0,
type: SettingType.GENERAL,
requireReload: true
},
{
key: SettingKeys.Move_Animations,
label: "Move Animations",
options: OFF_ON,
default: 1,
type: SettingType.GENERAL
},
{
key: SettingKeys.Show_Moveset_Flyout,
label: "Show Moveset Flyout",
options: OFF_ON,
default: 1,
type: SettingType.ACCESSIBILITY
},
{
key: SettingKeys.Show_Arena_Flyout,
label: "Show Battle Effects Flyout",
options: OFF_ON,
default: 1,
type: SettingType.ACCESSIBILITY
},
{
key: SettingKeys.Show_Stats_on_Level_Up,
label: "Show Stats on Level Up",
options: OFF_ON,
default: 1,
type: SettingType.GENERAL
},
{
@ -228,26 +103,33 @@ export const Setting: Array<Setting> = [
type: SettingType.GENERAL
},
{
key: SettingKeys.HP_Bar_Speed,
label: "HP Bar Speed",
options: ["Normal", "Fast", "Faster", "Skip"],
key: SettingKeys.Skip_Seen_Dialogues,
label: "Skip Seen Dialogues",
options: OFF_ON,
default: 0,
type: SettingType.GENERAL
},
{
key: SettingKeys.Fusion_Palette_Swaps,
label: "Fusion Palette Swaps",
key: SettingKeys.Battle_Style,
label: "Battle Style",
options: ["Switch", "Set"],
default: 0,
type: SettingType.GENERAL
},
{
key: SettingKeys.Enable_Retries,
label: "Enable Retries",
options: OFF_ON,
default: 0,
type: SettingType.GENERAL
},
{
key: SettingKeys.Tutorials,
label: "Tutorials",
options: OFF_ON,
default: 1,
type: SettingType.GENERAL
},
{
key: SettingKeys.Player_Gender,
label: "Player Gender",
options: ["Boy", "Girl"],
default: 0,
type: SettingType.GENERAL
},
{
key: SettingKeys.Touch_Controls,
label: "Touch Controls",
@ -261,6 +143,159 @@ export const Setting: Array<Setting> = [
options: AUTO_DISABLED,
default: 0,
type: SettingType.GENERAL
},
{
key: SettingKeys.Language,
label: "Language",
options: ["English", "Change"],
default: 0,
type: SettingType.DISPLAY,
requireReload: true
},
{
key: SettingKeys.UI_Theme,
label: "UI Theme",
options: ["Default", "Legacy"],
default: 0,
type: SettingType.DISPLAY,
requireReload: true
},
{
key: SettingKeys.Window_Type,
label: "Window Type",
options: new Array(5).fill(null).map((_, i) => (i + 1).toString()),
default: 0,
type: SettingType.DISPLAY
},
{
key: SettingKeys.Money_Format,
label: "Money Format",
options: ["Normal", "Abbreviated"],
default: 0,
type: SettingType.DISPLAY
},
{
key: SettingKeys.Damage_Numbers,
label: "Damage Numbers",
options: ["Off", "Simple", "Fancy"],
default: 0,
type: SettingType.DISPLAY
},
{
key: SettingKeys.Move_Animations,
label: "Move Animations",
options: OFF_ON,
default: 1,
type: SettingType.DISPLAY
},
{
key: SettingKeys.Show_Stats_on_Level_Up,
label: "Show Stats on Level Up",
options: OFF_ON,
default: 1,
type: SettingType.DISPLAY
},
{
key: SettingKeys.Candy_Upgrade_Notification,
label: "Candy Upgrade Notification",
options: ["Off", "Passives Only", "On"],
default: 0,
type: SettingType.DISPLAY
},
{
key: SettingKeys.Candy_Upgrade_Display,
label: "Candy Upgrade Display",
options: ["Icon", "Animation"],
default: 0,
type: SettingType.DISPLAY,
requireReload: true
},
{
key: SettingKeys.Move_Info,
label: "Move Info",
options: OFF_ON,
default: 1,
type: SettingType.DISPLAY
},
{
key: SettingKeys.Show_Moveset_Flyout,
label: "Show Moveset Flyout",
options: OFF_ON,
default: 1,
type: SettingType.DISPLAY
},
{
key: SettingKeys.Show_Arena_Flyout,
label: "Show Battle Effects Flyout",
options: OFF_ON,
default: 1,
type: SettingType.DISPLAY
},
{
key: SettingKeys.Show_Time_Of_Day_Widget,
label: "Show Time of Day Widget",
options: OFF_ON,
default: 1,
type: SettingType.DISPLAY,
requireReload: true,
},
{
key: SettingKeys.Time_Of_Day_Animation,
label: "Time of Day Animation",
options: ["Bounce", "Back"],
default: 0,
type: SettingType.DISPLAY
},
{
key: SettingKeys.Sprite_Set,
label: "Sprite Set",
options: ["Consistent", "Mixed Animated"],
default: 0,
type: SettingType.DISPLAY,
requireReload: true
},
{
key: SettingKeys.Fusion_Palette_Swaps,
label: "Fusion Palette Swaps",
options: OFF_ON,
default: 1,
type: SettingType.DISPLAY
},
{
key: SettingKeys.Player_Gender,
label: "Player Gender",
options: ["Boy", "Girl"],
default: 0,
type: SettingType.DISPLAY
},
{
key: SettingKeys.Master_Volume,
label: "Master Volume",
options: VOLUME_OPTIONS,
default: 5,
type: SettingType.AUDIO
},
{
key: SettingKeys.BGM_Volume,
label: "BGM Volume",
options: VOLUME_OPTIONS,
default: 10,
type: SettingType.AUDIO
},
{
key: SettingKeys.SE_Volume,
label: "SE Volume",
options: VOLUME_OPTIONS,
default: 10,
type: SettingType.AUDIO
},
{
key: SettingKeys.Music_Preference,
label: "Music Preference",
options: ["Consistent", "Mixed"],
default: 0,
type: SettingType.AUDIO,
requireReload: true
}
];
@ -309,6 +344,9 @@ export function setSetting(scene: BattleScene, setting: string, value: integer):
scene.seVolume = value ? parseInt(Setting[index].options[value]) * 0.01 : 0;
scene.updateSoundVolume();
break;
case SettingKeys.Music_Preference:
scene.musicPreference = value;
break;
case SettingKeys.Damage_Numbers:
scene.damageNumbersMode = value;
break;
@ -321,12 +359,18 @@ export function setSetting(scene: BattleScene, setting: string, value: integer):
case SettingKeys.Tutorials:
scene.enableTutorials = Setting[index].options[value] === "On";
break;
case SettingKeys.Move_Info:
scene.enableMoveInfo = Setting[index].options[value] === "On";
break;
case SettingKeys.Enable_Retries:
scene.enableRetries = Setting[index].options[value] === "On";
break;
case SettingKeys.Skip_Seen_Dialogues:
scene.skipSeenDialogues = Setting[index].options[value] === "On";
break;
case SettingKeys.Battle_Style:
scene.battleStyle = value;
break;
case SettingKeys.Candy_Upgrade_Notification:
if (scene.candyUpgradeNotification === value) {
break;
@ -354,9 +398,6 @@ export function setSetting(scene: BattleScene, setting: string, value: integer):
scene.initExpSprites();
}
break;
case SettingKeys.Music_Preference:
scene.musicPreference = value;
break;
case SettingKeys.Move_Animations:
scene.moveAnimations = Setting[index].options[value] === "On";
break;
@ -366,6 +407,12 @@ export function setSetting(scene: BattleScene, setting: string, value: integer):
case SettingKeys.Show_Arena_Flyout:
scene.showArenaFlyout = Setting[index].options[value] === "On";
break;
case SettingKeys.Show_Time_Of_Day_Widget:
scene.showTimeOfDayWidget = Setting[index].options[value] === "On";
break;
case SettingKeys.Time_Of_Day_Animation:
scene.timeOfDayAnimation = Setting[index].options[value] === "Bounce" ? EaseType.BOUNCE : EaseType.BACK;
break;
case SettingKeys.Show_Stats_on_Level_Up:
scene.showLevelUpStats = Setting[index].options[value] === "On";
break;

View File

@ -9,7 +9,8 @@ import {Button} from "./enums/buttons";
import SettingsGamepadUiHandler from "./ui/settings/settings-gamepad-ui-handler";
import SettingsKeyboardUiHandler from "#app/ui/settings/settings-keyboard-ui-handler";
import BattleScene from "./battle-scene";
import SettingsAccessibilityUiHandler from "./ui/settings/settings-accessiblity-ui-handler";
import SettingsDisplayUiHandler from "./ui/settings/settings-display-ui-handler";
import SettingsAudioUiHandler from "./ui/settings/settings-audio-ui-handler";
type ActionKeys = Record<Button, () => void>;
@ -114,6 +115,11 @@ export class UiInputs {
}
buttonStats(pressed: boolean = true): void {
// allow access to Button.STATS as a toggle for other elements
for (const t of this.scene.getInfoToggles(true)) {
t.toggleInfo(pressed);
}
// handle normal pokemon battle ui
for (const p of this.scene.getField().filter(p => p?.isActive(true))) {
p.toggleStats(pressed);
}
@ -164,7 +170,7 @@ export class UiInputs {
}
buttonCycleOption(button: Button): void {
const whitelist = [StarterSelectUiHandler, SettingsUiHandler, SettingsAccessibilityUiHandler, SettingsGamepadUiHandler, SettingsKeyboardUiHandler];
const whitelist = [StarterSelectUiHandler, SettingsUiHandler, SettingsDisplayUiHandler, SettingsAudioUiHandler, SettingsGamepadUiHandler, SettingsKeyboardUiHandler];
const uiHandler = this.scene.ui?.getHandler();
if (whitelist.some(handler => uiHandler instanceof handler)) {
this.scene.ui.processInput(button);

View File

@ -14,15 +14,17 @@ export interface OptionSelectConfig {
maxOptions?: integer;
delay?: integer;
noCancel?: boolean;
supportHover?: boolean;
}
export interface OptionSelectItem {
label: string;
handler: () => boolean;
onHover?: () => void;
keepOpen?: boolean;
overrideSound?: boolean;
item?: string;
itemArgs?: any[]
itemArgs?: any[];
}
const scrollUpLabel = "↑";
@ -193,6 +195,10 @@ export default abstract class AbstractOptionSelectUiHandler extends UiHandler {
}
break;
}
if (this.config?.supportHover) {
// handle hover code if the element supports hover-handlers and the option has the optional hover-handler set.
this.config?.options[this.cursor + (this.scrollCursor - (this.scrollCursor ? 1 : 0))]?.onHover?.();
}
}
if (success && playSound) {

View File

@ -1,4 +1,3 @@
import * as Utils from "../utils";
import { addTextObject, TextStyle } from "./text";
import BattleScene from "#app/battle-scene.js";
import { ArenaTagSide } from "#app/data/arena-tag.js";
@ -8,7 +7,8 @@ import { addWindow, WindowVariant } from "./ui-theme";
import { ArenaEvent, ArenaEventType, TagAddedEvent, TagRemovedEvent, TerrainChangedEvent, WeatherChangedEvent } from "#app/field/arena-events.js";
import { BattleSceneEventType, TurnEndEvent } from "#app/battle-scene-events.js";
import { ArenaTagType } from "#app/data/enums/arena-tag-type.js";
import { TimeOfDay } from "#app/data/enums/time-of-day.js";
import TimeOfDayWidget from "./time-of-day-widget";
import * as Utils from "../utils";
/** Enum used to differentiate {@linkcode Arena} effects */
enum ArenaEffectType {
@ -60,8 +60,7 @@ export default class ArenaFlyout extends Phaser.GameObjects.Container {
/** The {@linkcode Phaser.GameObjects.Text} that goes inside of the header */
private flyoutTextHeader: Phaser.GameObjects.Text;
/** The {@linkcode Phaser.GameObjects.Sprite} that represents the current time of day */
private timeOfDayIcon: Phaser.GameObjects.Sprite;
private timeOfDayWidget: TimeOfDayWidget;
/** The {@linkcode Phaser.GameObjects.Text} header used to indicate the player's effects */
private flyoutTextHeaderPlayer: Phaser.GameObjects.Text;
@ -82,7 +81,6 @@ export default class ArenaFlyout extends Phaser.GameObjects.Container {
// Stores callbacks in a variable so they can be unsubscribed from when destroyed
private readonly onNewArenaEvent = (event: Event) => this.onNewArena(event);
private readonly onTurnInitEvent = (event: Event) => this.onTurnInit(event);
private readonly onTurnEndEvent = (event: Event) => this.onTurnEnd(event);
private readonly onFieldEffectChangedEvent = (event: Event) => this.onFieldEffectChanged(event);
@ -117,10 +115,8 @@ export default class ArenaFlyout extends Phaser.GameObjects.Container {
this.flyoutContainer.add(this.flyoutTextHeader);
this.timeOfDayIcon = this.scene.add.sprite((this.flyoutWidth / 2) + (this.flyoutWindowHeader.displayWidth / 2), 0, "dawn_icon").setOrigin();
this.timeOfDayIcon.setVisible(false);
this.flyoutContainer.add(this.timeOfDayIcon);
this.timeOfDayWidget = new TimeOfDayWidget(this.scene, (this.flyoutWidth / 2) + (this.flyoutWindowHeader.displayWidth / 2));
this.flyoutContainer.add(this.timeOfDayWidget);
this.flyoutTextHeaderPlayer = addTextObject(this.scene, 6, 5, "Player", TextStyle.SUMMARY_BLUE);
this.flyoutTextHeaderPlayer.setFontSize(54);
@ -172,18 +168,9 @@ export default class ArenaFlyout extends Phaser.GameObjects.Container {
// Subscribes to required events available on game start
this.battleScene.eventTarget.addEventListener(BattleSceneEventType.NEW_ARENA, this.onNewArenaEvent);
this.battleScene.eventTarget.addEventListener(BattleSceneEventType.TURN_INIT, this.onTurnInitEvent);
this.battleScene.eventTarget.addEventListener(BattleSceneEventType.TURN_END, this.onTurnEndEvent);
}
private setTimeOfDayIcon() {
this.timeOfDayIcon.setTexture(TimeOfDay[this.battleScene.arena.getTimeOfDay()].toLowerCase() + "_icon");
}
private onTurnInit(event: Event) {
this.setTimeOfDayIcon();
}
private onNewArena(event: Event) {
this.fieldEffectInfo.length = 0;
@ -192,8 +179,6 @@ export default class ArenaFlyout extends Phaser.GameObjects.Container {
this.battleScene.arena.eventTarget.addEventListener(ArenaEventType.TERRAIN_CHANGED, this.onFieldEffectChangedEvent);
this.battleScene.arena.eventTarget.addEventListener(ArenaEventType.TAG_ADDED, this.onFieldEffectChangedEvent);
this.battleScene.arena.eventTarget.addEventListener(ArenaEventType.TAG_REMOVED, this.onFieldEffectChangedEvent);
this.setTimeOfDayIcon();
}
/**
@ -360,17 +345,18 @@ export default class ArenaFlyout extends Phaser.GameObjects.Container {
* Animates the flyout to either show or hide it by applying a fade and translation
* @param visible Should the flyout be shown?
*/
toggleFlyout(visible: boolean): void {
public toggleFlyout(visible: boolean): void {
this.scene.tweens.add({
targets: this.flyoutParent,
x: visible ? this.anchorX : this.anchorX - this.translationX,
duration: Utils.fixedInt(125),
ease: "Sine.easeInOut",
alpha: visible ? 1 : 0,
onComplete: () => this.timeOfDayWidget.parentVisible = visible,
});
}
destroy(fromScene?: boolean): void {
public destroy(fromScene?: boolean): void {
this.battleScene.eventTarget.removeEventListener(BattleSceneEventType.NEW_ARENA, this.onNewArenaEvent);
this.battleScene.eventTarget.removeEventListener(BattleSceneEventType.TURN_END, this.onTurnEndEvent);

15
src/ui/enums/ease-type.ts Normal file
View File

@ -0,0 +1,15 @@
export enum EaseType {
NONE,
LINEAR = "Linear",
QUADRATIC = "Quad",
CUBIC = "Cubic",
QUARTIC = "Quart",
QUINTIC = "Quint",
SINUSOIDAL = "Sine",
EXPONENTIAL = "Expo",
CIRCULAR = "Circ",
ELASTIC = "Elastic",
BACK = "Back",
BOUNCE = "Bounce",
STEPPED = "Stepped",
}

Some files were not shown because too many files have changed in this diff Show More