Compare commits

..

12 Commits

Author SHA1 Message Date
NightKev
10aa85e9db
Fix name of files for Aqua Admin (M) (#3323) 2024-08-03 17:04:57 -05:00
Tempoanon
7048fbe06f
[Feature] Implement generic evil team admins (#3234)
* [Hotfix] Fix interactions of some moves not changing types (#3183)

* [Hotfix] Fix wild spawns not having their HA (#3190)

* Add evil admin placeholder images

* Add admin names to locale files

* Add evil team admin dialogue

* Added new sprites

* Make simple admin trainer pools

* Add Korean localization

* Increase evil boss money multiplier from 2.25 to 2.5

---------

Co-authored-by: Adrian T. <68144167+torranx@users.noreply.github.com>
Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com>
2024-08-03 16:34:05 -04:00
Madmadness65
153d8ba557
[Sprite] Move Victini graphics to Generation 5 atlases (#3320)
* Move Victini graphics to Generation 5 atlases

* Minor change
2024-08-03 15:03:59 -05:00
Mumble
3fa2088f5b
[Refactor] Merged implementation of CutHpStatBoostAttr moves (#3255)
* Merged implementation of CutHpStatBoostAttr moves

* Fixed failure check

* Fixed Belly Drum details

* Moved comment

* Tests for involved moves

* Fixed belly drum reference

* Added localization

* Manual merge

* Fixed issues discovered by Temp

* Updated moveset overrides to match new format

* Implementing Torranx's fixes

* Localized Belly Drum message to Belly Drum's initialization

* Post Caffeine Activation

* Actual Caffeine Fix-TypeDoc Test

---------

Co-authored-by: Frutescens <info@laptop>
2024-08-03 15:20:19 -04:00
Blitzy
cd1c810c5a
[Balance] Give Dipplin Dragon Cheer as a relearn move, give Applin Matcha Gotcha as egg move instead (#3291)
* Change Relearn Move

* Change Egg Move
2024-08-03 15:18:03 -04:00
Leo Kim
d20b7553ef
[Enhancement] Add confirm exit popup in starter select UI (#3316)
* add confirmExit popup

* add translation entries for `confirmExit`

* Update src/ui/starter-select-ui-handler.ts

Co-authored-by: Adrian T. <68144167+torranx@users.noreply.github.com>

---------

Co-authored-by: Adrian T. <68144167+torranx@users.noreply.github.com>
2024-08-03 15:16:29 -04:00
Leo Kim
800abc4767
[QoL] Auto filter for challenge mode in starter select (#3312) 2024-08-03 15:14:42 -04:00
Alex Van Liew
a2a1f3ec24
[Refactor] Refactored duplicated code into a common Pokemon#leaveField() function (#3310)
* refactor duplicated code into leaveField function

* replace bugfix code
2024-08-03 15:13:42 -04:00
chaosgrimmon
bb6ec94c02
[Sprite/Misc] Repo Icon cleanup (#3311)
* [Sprite] Missing Gen 7 variant icons

Taken from current icon spritesheet

* [Sprite] Remove non-Gen 6 icon

* Delete public/images/pokemon/icons/variant/6/742_3.png

* Delete public/images/pokemon/icons/variant/6/743_2.png

* Delete public/images/pokemon/icons/variant/6/743_3.png

* Delete public/images/pokemon/icons/variant/6/777_2.png

* Delete public/images/pokemon/icons/variant/6/777_3.png

* Delete public/images/pokemon/icons/variant/6/779_2.png

* Delete public/images/pokemon/icons/variant/6/779_3.png

* Delete public/images/pokemon/icons/variant/6/354-mega_2.png

* Delete public/images/pokemon/icons/variant/6/354-mega_3.png

* [Sprite] Missing Mega Banette variant icons

Taken from the Gen 6 variant icon folder

* [Sprite] Missing Poltchageist/Sinistcha form icons

Renamed duplicates of alternate forms
2024-08-03 15:12:32 -04:00
Leo Kim
32496fa585
[Misc] Move victini from gen 4 to gen 5 (#3306) 2024-08-03 15:11:05 -04:00
Lugiad
67babd0e83
[Localization] Fresh Start challenge entries added to French locales (#3317)
* Update achv.ts

* Update challenges.ts

* Update achv.ts
2024-08-03 15:09:58 -04:00
hayuna
cdc4826018
[Localization] Update fr locales in challenge (#3319) 2024-08-03 15:09:06 -04:00
93 changed files with 14100 additions and 10432 deletions

View File

Before

Width:  |  Height:  |  Size: 303 B

After

Width:  |  Height:  |  Size: 303 B

View File

Before

Width:  |  Height:  |  Size: 342 B

After

Width:  |  Height:  |  Size: 342 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 353 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 359 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 346 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 352 B

View File

Before

Width:  |  Height:  |  Size: 846 B

After

Width:  |  Height:  |  Size: 846 B

View File

Before

Width:  |  Height:  |  Size: 938 B

After

Width:  |  Height:  |  Size: 938 B

View File

Before

Width:  |  Height:  |  Size: 510 B

After

Width:  |  Height:  |  Size: 510 B

View File

Before

Width:  |  Height:  |  Size: 513 B

After

Width:  |  Height:  |  Size: 513 B

View File

Before

Width:  |  Height:  |  Size: 3.1 KiB

After

Width:  |  Height:  |  Size: 3.1 KiB

View File

Before

Width:  |  Height:  |  Size: 3.1 KiB

After

Width:  |  Height:  |  Size: 3.1 KiB

View File

Before

Width:  |  Height:  |  Size: 3.2 KiB

After

Width:  |  Height:  |  Size: 3.2 KiB

View File

Before

Width:  |  Height:  |  Size: 3.2 KiB

After

Width:  |  Height:  |  Size: 3.2 KiB

View File

Before

Width:  |  Height:  |  Size: 541 B

After

Width:  |  Height:  |  Size: 541 B

View File

Before

Width:  |  Height:  |  Size: 557 B

After

Width:  |  Height:  |  Size: 557 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 471 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 482 B

View File

Before

Width:  |  Height:  |  Size: 697 B

After

Width:  |  Height:  |  Size: 697 B

View File

Before

Width:  |  Height:  |  Size: 661 B

After

Width:  |  Height:  |  Size: 661 B

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 53 KiB

After

Width:  |  Height:  |  Size: 53 KiB

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

After

Width:  |  Height:  |  Size: 29 KiB

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 64 KiB

After

Width:  |  Height:  |  Size: 63 KiB

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

After

Width:  |  Height:  |  Size: 31 KiB

View File

@ -0,0 +1,41 @@
{
"textures": [
{
"image": "aqua_admin_f.png",
"format": "RGBA8888",
"size": {
"w": 80,
"h": 80
},
"scale": 1,
"frames": [
{
"filename": "0001.png",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 80,
"h": 80
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 80,
"h": 80
},
"frame": {
"x": 0,
"y": 0,
"w": 80,
"h": 80
}
}
]
}
],
"meta": {
"app": "https://www.codeandweb.com/texturepacker",
"version": "3.0",
"smartupdate": "$TexturePacker:SmartUpdate:efd07ff3ed1e610150a4b8ca18974343:d9b85b9eb11182e9e4669e2bd8b08694:72b7b50231708a9486d5f315824e4df1$"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 865 B

View File

@ -0,0 +1,41 @@
{
"textures": [
{
"image": "aqua_admin_m.png",
"format": "RGBA8888",
"size": {
"w": 80,
"h": 80
},
"scale": 1,
"frames": [
{
"filename": "0001.png",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 80,
"h": 80
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 80,
"h": 80
},
"frame": {
"x": 0,
"y": 0,
"w": 80,
"h": 80
}
}
]
}
],
"meta": {
"app": "https://www.codeandweb.com/texturepacker",
"version": "3.0",
"smartupdate": "$TexturePacker:SmartUpdate:831f5748dad92911b10a1cb358ee2dae:a3bf81bbaa3b49cad5e0e549cf94563b:bb6befc9383c9c08837183ae2a7a80c1$"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 671 B

View File

@ -0,0 +1,41 @@
{
"textures": [
{
"image": "flare_admin_f.png",
"format": "RGBA8888",
"size": {
"w": 80,
"h": 80
},
"scale": 1,
"frames": [
{
"filename": "0001.png",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 80,
"h": 80
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 80,
"h": 80
},
"frame": {
"x": 0,
"y": 0,
"w": 80,
"h": 80
}
}
]
}
],
"meta": {
"app": "https://www.codeandweb.com/texturepacker",
"version": "3.0",
"smartupdate": "$TexturePacker:SmartUpdate:831f5748dad92911b10a1cb358ee2dae:a3bf81bbaa3b49cad5e0e549cf94563b:bb6befc9383c9c08837183ae2a7a80c1$"
}
}

View File

@ -0,0 +1,41 @@
{
"textures": [
{
"image": "flare_admin_m.png",
"format": "RGBA8888",
"size": {
"w": 80,
"h": 80
},
"scale": 1,
"frames": [
{
"filename": "0001.png",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 80,
"h": 80
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 80,
"h": 80
},
"frame": {
"x": 0,
"y": 0,
"w": 80,
"h": 80
}
}
]
}
],
"meta": {
"app": "https://www.codeandweb.com/texturepacker",
"version": "3.0",
"smartupdate": "$TexturePacker:SmartUpdate:c30bf82452209a923f4becf13d275a9a:a6355b09f92c9c0388d0b919010f587f:0638dbf213f8a974eb5af76eb1e5ddeb$"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 789 B

View File

@ -0,0 +1,41 @@
{
"textures": [
{
"image": "galactic_admin_f.png",
"format": "RGBA8888",
"size": {
"w": 80,
"h": 80
},
"scale": 1,
"frames": [
{
"filename": "0001.png",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 80,
"h": 80
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 80,
"h": 80
},
"frame": {
"x": 0,
"y": 0,
"w": 80,
"h": 80
}
}
]
}
],
"meta": {
"app": "https://www.codeandweb.com/texturepacker",
"version": "3.0",
"smartupdate": "$TexturePacker:SmartUpdate:831f5748dad92911b10a1cb358ee2dae:a3bf81bbaa3b49cad5e0e549cf94563b:bb6befc9383c9c08837183ae2a7a80c1$"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 621 B

View File

@ -0,0 +1,41 @@
{
"textures": [
{
"image": "galactic_admin_m.png",
"format": "RGBA8888",
"size": {
"w": 80,
"h": 80
},
"scale": 1,
"frames": [
{
"filename": "0001.png",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 80,
"h": 80
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 80,
"h": 80
},
"frame": {
"x": 0,
"y": 0,
"w": 80,
"h": 80
}
}
]
}
],
"meta": {
"app": "https://www.codeandweb.com/texturepacker",
"version": "3.0",
"smartupdate": "$TexturePacker:SmartUpdate:3012867f03f02c4ee67a8ab3ad5a000e:77a5f60f1adc158664b3b2ee17bf30fe:7e8259b5177c0a76e5d02d6bdc66affe$"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 689 B

View File

@ -0,0 +1,41 @@
{
"textures": [
{
"image": "magma_admin_m.png",
"format": "RGBA8888",
"size": {
"w": 80,
"h": 80
},
"scale": 1,
"frames": [
{
"filename": "0001.png",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 80,
"h": 80
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 80,
"h": 80
},
"frame": {
"x": 0,
"y": 0,
"w": 80,
"h": 80
}
}
]
}
],
"meta": {
"app": "https://www.codeandweb.com/texturepacker",
"version": "3.0",
"smartupdate": "$TexturePacker:SmartUpdate:831f5748dad92911b10a1cb358ee2dae:a3bf81bbaa3b49cad5e0e549cf94563b:bb6befc9383c9c08837183ae2a7a80c1$"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 847 B

View File

@ -0,0 +1,41 @@
{
"textures": [
{
"image": "magma_admin_f.png",
"format": "RGBA8888",
"size": {
"w": 80,
"h": 80
},
"scale": 1,
"frames": [
{
"filename": "0001.png",
"rotated": false,
"trimmed": true,
"sourceSize": {
"w": 80,
"h": 80
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 80,
"h": 80
},
"frame": {
"x": 0,
"y": 0,
"w": 80,
"h": 80
}
}
]
}
],
"meta": {
"app": "https://www.codeandweb.com/texturepacker",
"version": "3.0",
"smartupdate": "$TexturePacker:SmartUpdate:f63ad48affc076f60fae78992c96a2bf:80928b32710abcb28c07c6fc5a425d99:3b961d8852b62aaf24ceb2030c036515$"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 845 B

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

View File

@ -0,0 +1,41 @@
{
"textures": [
{
"image": "rocket_admin_f.png",
"format": "RGBA8888",
"size": {
"w": 80,
"h": 80
},
"scale": 1,
"frames": [
{
"filename": "0001.png",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 80,
"h": 80
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 80,
"h": 80
},
"frame": {
"x": 0,
"y": 0,
"w": 80,
"h": 80
}
}
]
}
],
"meta": {
"app": "https://www.codeandweb.com/texturepacker",
"version": "3.0",
"smartupdate": "$TexturePacker:SmartUpdate:831f5748dad92911b10a1cb358ee2dae:a3bf81bbaa3b49cad5e0e549cf94563b:bb6befc9383c9c08837183ae2a7a80c1$"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 736 B

View File

@ -0,0 +1,41 @@
{
"textures": [
{
"image": "rocket_admin_m.png",
"format": "RGBA8888",
"size": {
"w": 80,
"h": 80
},
"scale": 1,
"frames": [
{
"filename": "0001.png",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 80,
"h": 80
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 80,
"h": 80
},
"frame": {
"x": 0,
"y": 0,
"w": 80,
"h": 80
}
}
]
}
],
"meta": {
"app": "https://www.codeandweb.com/texturepacker",
"version": "3.0",
"smartupdate": "$TexturePacker:SmartUpdate:831f5748dad92911b10a1cb358ee2dae:a3bf81bbaa3b49cad5e0e549cf94563b:bb6befc9383c9c08837183ae2a7a80c1$"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 645 B

View File

@ -464,7 +464,8 @@ export interface FixedBattleConfigs {
/**
* Youngster/Lass on 5
* Rival on 8, 55, 95, 145, 195
* Evil team grunts on 35, 62, 64, 66, 112, 114
* Evil team grunts on 35, 62, 64, and 112
* Evil team admin on 66 and 114
* Evil leader on 115, 165
* E4 on 182, 184, 186, 188
* Champion on 190
@ -485,13 +486,13 @@ export const classicFixedBattles: FixedBattleConfigs = {
[64]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(35)
.setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_GRUNT, TrainerType.MAGMA_GRUNT, TrainerType.AQUA_GRUNT, TrainerType.GALACTIC_GRUNT, TrainerType.PLASMA_GRUNT, TrainerType.FLARE_GRUNT ], true)),
[66]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(35)
.setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_GRUNT, TrainerType.MAGMA_GRUNT, TrainerType.AQUA_GRUNT, TrainerType.GALACTIC_GRUNT, TrainerType.PLASMA_GRUNT, TrainerType.FLARE_GRUNT ], true)),
.setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_ADMIN, TrainerType.MAGMA_ADMIN, TrainerType.AQUA_ADMIN, TrainerType.GALACTIC_ADMIN, TrainerType.PLASMA_SAGE, TrainerType.FLARE_ADMIN ], true)),
[95]: new FixedBattleConfig().setBattleType(BattleType.TRAINER)
.setGetTrainerFunc(scene => new Trainer(scene, TrainerType.RIVAL_4, scene.gameData.gender === PlayerGender.MALE ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT)),
[112]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(35)
.setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_GRUNT, TrainerType.MAGMA_GRUNT, TrainerType.AQUA_GRUNT, TrainerType.GALACTIC_GRUNT, TrainerType.PLASMA_GRUNT, TrainerType.FLARE_GRUNT ], true)),
[114]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(35)
.setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_GRUNT, TrainerType.MAGMA_GRUNT, TrainerType.AQUA_GRUNT, TrainerType.GALACTIC_GRUNT, TrainerType.PLASMA_GRUNT, TrainerType.FLARE_GRUNT ], true)),
.setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_ADMIN, TrainerType.MAGMA_ADMIN, TrainerType.AQUA_ADMIN, TrainerType.GALACTIC_ADMIN, TrainerType.PLASMA_SAGE, TrainerType.FLARE_ADMIN ], true)),
[115]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(35)
.setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_BOSS_GIOVANNI_1, TrainerType.MAXIE, TrainerType.ARCHIE, TrainerType.CYRUS, TrainerType.GHETSIS, TrainerType.LYSANDRE ])),
[145]: new FixedBattleConfig().setBattleType(BattleType.TRAINER)

View File

@ -406,14 +406,7 @@ export class SingleGenerationChallenge extends Challenge {
}
applyStarterChoice(pokemon: PokemonSpecies, valid: Utils.BooleanHolder, dexAttr: DexAttrProps, soft: boolean = false, checkEvolutions?: boolean): boolean {
/**
* We have special code below for victini because it is classed as a generation 4 pokemon in the code
* despite being a generation 5 pokemon. This is due to UI constraints, the starter select screen has
* no more room for pokemon so victini is put in the gen 4 section instead. This code just overrides the
* normal generation check to correctly treat victini as gen 5.
*/
const starterGeneration = pokemon.speciesId === Species.VICTINI ? 5 : pokemon.generation;
const generations = [starterGeneration];
const generations = [pokemon.generation];
const checkPokemonEvolutions = checkEvolutions ?? true as boolean;
if (soft) {
const speciesToCheck = [pokemon.speciesId];

View File

@ -459,6 +459,20 @@ export const trainerTypeDialogue: TrainerTypeDialogue = {
]
}
],
[TrainerType.ROCKET_ADMIN]: [
{
encounter: [
"dialogue:rocket_admin.encounter.1",
"dialogue:rocket_admin.encounter.2",
"dialogue:rocket_admin.encounter.3",
],
victory: [
"dialogue:rocket_admin.victory.1",
"dialogue:rocket_admin.victory.2",
"dialogue:rocket_admin.victory.3",
]
}
],
[TrainerType.MAGMA_GRUNT]: [
{
encounter: [
@ -469,6 +483,20 @@ export const trainerTypeDialogue: TrainerTypeDialogue = {
]
}
],
[TrainerType.MAGMA_ADMIN]: [
{
encounter: [
"dialogue:magma_admin.encounter.1",
"dialogue:magma_admin.encounter.2",
"dialogue:magma_admin.encounter.3",
],
victory: [
"dialogue:magma_admin.victory.1",
"dialogue:magma_admin.victory.2",
"dialogue:magma_admin.victory.3",
]
}
],
[TrainerType.AQUA_GRUNT]: [
{
encounter: [
@ -479,6 +507,20 @@ export const trainerTypeDialogue: TrainerTypeDialogue = {
]
}
],
[TrainerType.AQUA_ADMIN]: [
{
encounter: [
"dialogue:aqua_admin.encounter.1",
"dialogue:aqua_admin.encounter.2",
"dialogue:aqua_admin.encounter.3",
],
victory: [
"dialogue:aqua_admin.victory.1",
"dialogue:aqua_admin.victory.2",
"dialogue:aqua_admin.victory.3",
]
}
],
[TrainerType.GALACTIC_GRUNT]: [
{
encounter: [
@ -489,6 +531,20 @@ export const trainerTypeDialogue: TrainerTypeDialogue = {
]
}
],
[TrainerType.GALACTIC_ADMIN]: [
{
encounter: [
"dialogue:galactic_admin.encounter.1",
"dialogue:galactic_admin.encounter.2",
"dialogue:galactic_admin.encounter.3",
],
victory: [
"dialogue:galactic_admin.victory.1",
"dialogue:galactic_admin.victory.2",
"dialogue:galactic_admin.victory.3",
]
}
],
[TrainerType.PLASMA_GRUNT]: [
{
encounter: [
@ -499,6 +555,20 @@ export const trainerTypeDialogue: TrainerTypeDialogue = {
]
}
],
[TrainerType.PLASMA_SAGE]: [
{
encounter: [
"dialogue:plasma_sage.encounter.1",
"dialogue:plasma_sage.encounter.2",
"dialogue:plasma_sage.encounter.3",
],
victory: [
"dialogue:plasma_sage.victory.1",
"dialogue:plasma_sage.victory.2",
"dialogue:plasma_sage.victory.3",
]
}
],
[TrainerType.FLARE_GRUNT]: [
{
encounter: [
@ -509,6 +579,20 @@ export const trainerTypeDialogue: TrainerTypeDialogue = {
]
}
],
[TrainerType.FLARE_ADMIN]: [
{
encounter: [
"dialogue:flare_admin.encounter.1",
"dialogue:flare_admin.encounter.2",
"dialogue:flare_admin.encounter.3",
],
victory: [
"dialogue:flare_admin.victory.1",
"dialogue:flare_admin.victory.2",
"dialogue:flare_admin.victory.3",
]
}
],
[TrainerType.ROCKET_BOSS_GIOVANNI_1]: [
{
encounter: [

View File

@ -438,7 +438,7 @@ export const speciesEggMoves = {
[Species.CHEWTLE]: [ Moves.FIRE_FANG, Moves.ACCELEROCK, Moves.SHELL_SMASH, Moves.FISHIOUS_REND ],
[Species.YAMPER]: [ Moves.ICE_FANG, Moves.SWORDS_DANCE, Moves.THUNDER_FANG, Moves.ZIPPY_ZAP ],
[Species.ROLYCOLY]: [ Moves.BITTER_BLADE, Moves.BODY_PRESS, Moves.BULK_UP, Moves.DIAMOND_STORM ],
[Species.APPLIN]: [ Moves.DRAGON_CHEER, Moves.DRAGON_HAMMER, Moves.FLOWER_TRICK, Moves.STRENGTH_SAP ],
[Species.APPLIN]: [ Moves.MATCHA_GOTCHA, Moves.DRAGON_HAMMER, Moves.FLOWER_TRICK, Moves.STRENGTH_SAP ],
[Species.SILICOBRA]: [ Moves.SHORE_UP, Moves.SHED_TAIL, Moves.STONE_EDGE, Moves.PRECIPICE_BLADES ],
[Species.CRAMORANT]: [ Moves.APPLE_ACID, Moves.SURF, Moves.SCORCHING_SANDS, Moves.OBLIVION_WING ],
[Species.ARROKUDA]: [ Moves.SUPERCELL_SLAM, Moves.KNOCK_OFF, Moves.ICE_SPINNER, Moves.FILLET_AWAY ],

View File

@ -13,10 +13,9 @@ import { ArenaTagSide, ArenaTrapTag, WeakenMoveTypeTag } from "./arena-tag";
import { UnswappableAbilityAbAttr, UncopiableAbilityAbAttr, UnsuppressableAbilityAbAttr, BlockRecoilDamageAttr, BlockOneHitKOAbAttr, IgnoreContactAbAttr, MaxMultiHitAbAttr, applyAbAttrs, BlockNonDirectDamageAbAttr, applyPreSwitchOutAbAttrs, PreSwitchOutAbAttr, applyPostDefendAbAttrs, PostDefendContactApplyStatusEffectAbAttr, MoveAbilityBypassAbAttr, ReverseDrainAbAttr, FieldPreventExplosiveMovesAbAttr, ForceSwitchOutImmunityAbAttr, BlockItemTheftAbAttr, applyPostAttackAbAttrs, ConfusionOnStatusEffectAbAttr, HealFromBerryUseAbAttr, IgnoreProtectOnContactAbAttr, IgnoreMoveEffectsAbAttr, applyPreDefendAbAttrs, MoveEffectChanceMultiplierAbAttr, WonderSkinAbAttr, applyPreAttackAbAttrs, MoveTypeChangeAttr, UserFieldMoveTypePowerBoostAbAttr, FieldMoveTypePowerBoostAbAttr, AllyMoveCategoryPowerBoostAbAttr, VariableMovePowerAbAttr } from "./ability";
import { allAbilities } from "./ability";
import { PokemonHeldItemModifier, BerryModifier, PreserveBerryModifier, PokemonMoveAccuracyBoosterModifier, AttackTypeBoosterModifier, PokemonMultiHitModifier } from "../modifier/modifier";
import { BattlerIndex } from "../battle";
import { BattlerIndex, BattleType } from "../battle";
import { Stat } from "./pokemon-stat";
import { TerrainType } from "./terrain";
import { SpeciesFormChangeActiveTrigger } from "./pokemon-forms";
import { ModifierPoolType } from "#app/modifier/modifier-type";
import { Command } from "../ui/command-ui-handler";
import i18next from "i18next";
@ -1817,13 +1816,10 @@ export class MultiHitAttr extends MoveAttr {
}
case MultiHitType._2:
return 2;
break;
case MultiHitType._3:
return 3;
break;
case MultiHitType._10:
return 10;
break;
case MultiHitType.BEAT_UP:
const party = user.isPlayer() ? user.scene.getParty() : user.scene.getEnemyParty();
// No status means the ally pokemon can contribute to Beat Up
@ -2631,36 +2627,15 @@ export class GrowthStatChangeAttr extends StatChangeAttr {
}
}
export class HalfHpStatMaxAttr extends StatChangeAttr {
constructor(stat: BattleStat) {
super(stat, 12, true, null, false);
}
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): Promise<boolean> {
return new Promise<boolean>(resolve => {
user.damageAndUpdate(Math.floor(user.getMaxHp() / 2), HitResult.OTHER, false, true);
user.updateInfo().then(() => {
const ret = super.apply(user, target, move, args);
user.scene.queueMessage(i18next.t("moveTriggers:cutOwnHpAndMaximizedStat", {pokemonName: getPokemonNameWithAffix(user), statName: getBattleStatName(this.stats[BattleStat.ATK])}));
resolve(ret);
});
});
}
getCondition(): MoveConditionFunc {
return (user, target, move) => user.getHpRatio() > 0.5 && user.summonData.battleStats[this.stats[BattleStat.ATK]] < 6;
}
// TODO: Add benefit score that considers HP cut
}
export class CutHpStatBoostAttr extends StatChangeAttr {
private cutRatio: integer;
private messageCallback: ((user: Pokemon) => void) | undefined;
constructor(stat: BattleStat | BattleStat[], levels: integer, cutRatio: integer) {
constructor(stat: BattleStat | BattleStat[], levels: integer, cutRatio: integer, messageCallback?: ((user: Pokemon) => void) | undefined) {
super(stat, levels, true, null, true);
this.cutRatio = cutRatio;
this.messageCallback = messageCallback;
}
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): Promise<boolean> {
@ -2668,13 +2643,16 @@ export class CutHpStatBoostAttr extends StatChangeAttr {
user.damageAndUpdate(Math.floor(user.getMaxHp() / this.cutRatio), HitResult.OTHER, false, true);
user.updateInfo().then(() => {
const ret = super.apply(user, target, move, args);
if (this.messageCallback) {
this.messageCallback(user);
}
resolve(ret);
});
});
}
getCondition(): MoveConditionFunc {
return (user, target, move) => user.getHpRatio() > 1 / this.cutRatio;
return (user, target, move) => user.getHpRatio() > 1 / this.cutRatio && this.stats.some(s => user.summonData.battleStats[s] < 6);
}
}
@ -4780,19 +4758,14 @@ export class ForceSwitchOutAttr extends MoveEffectAttr {
if (switchOutTarget.hp > 0) {
applyPreSwitchOutAbAttrs(PreSwitchOutAbAttr, switchOutTarget);
// switchOut below sets the UI to select party(this is not a separate Phase), then adds a SwitchSummonPhase with selected 'mon
(switchOutTarget as PlayerPokemon).switchOut(this.batonPass, true).then(() => resolve(true));
(switchOutTarget as PlayerPokemon).switchOut(this.batonPass).then(() => resolve(true));
} else {
resolve(false);
}
return;
} else if (user.scene.currentBattle.battleType) {
// Switch out logic for the battle type
switchOutTarget.resetTurnData();
switchOutTarget.resetSummonData();
switchOutTarget.hideInfo();
switchOutTarget.setVisible(false);
switchOutTarget.scene.field.remove(switchOutTarget);
user.scene.triggerPokemonFormChange(switchOutTarget, SpeciesFormChangeActiveTrigger, true);
} else if (user.scene.currentBattle.battleType !== BattleType.WILD) {
// Switch out logic for trainer battles
switchOutTarget.leaveField(!this.batonPass);
if (switchOutTarget.hp > 0) {
// for opponent switching out
@ -6486,7 +6459,9 @@ export function initMoves() {
new StatusMove(Moves.SWEET_KISS, Type.FAIRY, 75, 10, -1, 0, 2)
.attr(ConfuseAttr),
new SelfStatusMove(Moves.BELLY_DRUM, Type.NORMAL, -1, 10, -1, 0, 2)
.attr(HalfHpStatMaxAttr, BattleStat.ATK),
.attr(CutHpStatBoostAttr, [BattleStat.ATK], 12, 2, (user) => {
user.scene.queueMessage(i18next.t("moveTriggers:cutOwnHpAndMaximizedStat", {pokemonName: getPokemonNameWithAffix(user), statName: getBattleStatName(BattleStat.ATK)}));
}),
new AttackMove(Moves.SLUDGE_BOMB, Type.POISON, MoveCategory.SPECIAL, 90, 100, 10, 30, 0, 2)
.attr(StatusEffectAttr, StatusEffect.POISON)
.ballBombMove(),

View File

@ -17287,7 +17287,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = {
],
[Species.DIPPLIN]: [
[ EVOLVE_MOVE, Moves.DOUBLE_HIT ],
[ RELEARN_MOVE, Moves.INFESTATION ],
[ RELEARN_MOVE, Moves.DRAGON_CHEER ], // Custom
[ 1, Moves.WITHDRAW ],
[ 1, Moves.SWEET_SCENT ],
[ 1, Moves.RECYCLE ],

View File

@ -1671,7 +1671,7 @@ export function initSpecies() {
new PokemonForm("Fairy", "fairy", Type.FAIRY, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 324),
new PokemonForm("???", "unknown", Type.UNKNOWN, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 324),
),
new PokemonSpecies(Species.VICTINI, 4, false, false, true, "Victory Pokémon", Type.PSYCHIC, Type.FIRE, 0.4, 4, Abilities.VICTORY_STAR, Abilities.NONE, Abilities.NONE, 600, 100, 100, 100, 100, 100, 100, 3, 100, 300, GrowthRate.SLOW, null, false),
new PokemonSpecies(Species.VICTINI, 5, false, false, true, "Victory Pokémon", Type.PSYCHIC, Type.FIRE, 0.4, 4, Abilities.VICTORY_STAR, Abilities.NONE, Abilities.NONE, 600, 100, 100, 100, 100, 100, 100, 3, 100, 300, GrowthRate.SLOW, null, false),
new PokemonSpecies(Species.SNIVY, 5, false, false, false, "Grass Snake Pokémon", Type.GRASS, null, 0.6, 8.1, Abilities.OVERGROW, Abilities.NONE, Abilities.CONTRARY, 308, 45, 45, 55, 45, 55, 63, 45, 70, 62, GrowthRate.MEDIUM_SLOW, 87.5, false),
new PokemonSpecies(Species.SERVINE, 5, false, false, false, "Grass Snake Pokémon", Type.GRASS, null, 0.8, 16, Abilities.OVERGROW, Abilities.NONE, Abilities.CONTRARY, 413, 60, 60, 75, 60, 75, 83, 45, 70, 145, GrowthRate.MEDIUM_SLOW, 87.5, false),
new PokemonSpecies(Species.SERPERIOR, 5, false, false, false, "Regal Pokémon", Type.GRASS, null, 3.3, 63, Abilities.OVERGROW, Abilities.NONE, Abilities.CONTRARY, 528, 75, 75, 95, 75, 95, 113, 45, 70, 238, GrowthRate.MEDIUM_SLOW, 87.5, false),
@ -2946,8 +2946,8 @@ export const speciesStarters = {
[Species.DARKRAI]: 6,
[Species.SHAYMIN]: 6,
[Species.ARCEUS]: 9,
[Species.VICTINI]: 7,
[Species.VICTINI]: 7,
[Species.SNIVY]: 3,
[Species.TEPIG]: 3,
[Species.OSHAWOTT]: 3,

View File

@ -556,7 +556,7 @@ export class TrainerConfig {
const nameForCall = this.name.toLowerCase().replace(/\s/g, "_");
this.name = i18next.t(`trainerNames:${nameForCall}`);
this.setTitle(title);
this.setMoneyMultiplier(2.25);
this.setMoneyMultiplier(2.5);
this.setBoss();
this.setStaticParty();
this.setBattleBgm("battle_plasma_boss");
@ -1187,6 +1187,12 @@ export const trainerConfigs: TrainerConfigs = {
[TrainerPoolTier.RARE]: [Species.PORYGON, Species.ALOLA_RATTATA, Species.ALOLA_SANDSHREW, Species.ALOLA_MEOWTH, Species.ALOLA_GRIMER, Species.ALOLA_GEODUDE],
[TrainerPoolTier.SUPER_RARE]: [Species.DRATINI, Species.LARVITAR]
}),
[TrainerType.ROCKET_ADMIN]: new TrainerConfig(++t).setHasGenders().setMoneyMultiplier(1.5).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_rocket_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene))
.setSpeciesPools({
[TrainerPoolTier.COMMON]: [ Species.RATTATA, Species.KOFFING, Species.EKANS, Species.GYARADOS, Species.TAUROS, Species.SCYTHER, Species.CUBONE, Species.GROWLITHE, Species.MURKROW, Species.GASTLY, Species.EXEGGCUTE, Species.VOLTORB],
[TrainerPoolTier.UNCOMMON]: [Species.PORYGON, Species.ALOLA_RATTATA, Species.ALOLA_SANDSHREW, Species.ALOLA_MEOWTH, Species.ALOLA_GRIMER, Species.ALOLA_GEODUDE],
[TrainerPoolTier.RARE]: [Species.DRATINI, Species.LARVITAR]
}),
[TrainerType.MAGMA_GRUNT]: new TrainerConfig(++t).setHasGenders("Magma Grunt Female").setHasDouble("Magma Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_aqua_magma_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene))
.setSpeciesPools({
[TrainerPoolTier.COMMON]: [Species.SLUGMA, Species.POOCHYENA, Species.NUMEL, Species.ZIGZAGOON, Species.DIGLETT, Species.MAGBY, Species.TORKOAL, Species.BALTOY, Species.BARBOACH],
@ -1194,6 +1200,12 @@ export const trainerConfigs: TrainerConfigs = {
[TrainerPoolTier.RARE]: [Species.TRAPINCH, Species.HEATMOR],
[TrainerPoolTier.SUPER_RARE]: [Species.TURTONATOR, Species.CHARCADET]
}),
[TrainerType.MAGMA_ADMIN]: new TrainerConfig(++t).setHasGenders().setMoneyMultiplier(1.5).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_aqua_magma_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene))
.setSpeciesPools({
[TrainerPoolTier.COMMON]: [ Species.NUMEL, Species.POOCHYENA, Species.SLUGMA, Species.SOLROCK, Species.HIPPOPOTAS, Species.SANDACONDA, Species.PHANPY, Species.SWINUB, Species.GLIGAR],
[TrainerPoolTier.UNCOMMON]: [Species.TRAPINCH, Species.HEATMOR],
[TrainerPoolTier.RARE]: [Species.TURTONATOR, Species.CHARCADET]
}),
[TrainerType.AQUA_GRUNT]: new TrainerConfig(++t).setHasGenders("Aqua Grunt Female").setHasDouble("Aqua Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_aqua_magma_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene))
.setSpeciesPools({
[TrainerPoolTier.COMMON]: [ Species.CARVANHA, Species.WAILMER, Species.ZIGZAGOON, Species.LOTAD, Species.CORPHISH, Species.SPHEAL ],
@ -1201,6 +1213,12 @@ export const trainerConfigs: TrainerConfigs = {
[TrainerPoolTier.RARE]: [Species.MANTINE, Species.BASCULEGION, Species.REMORAID, Species.ARROKUDA],
[TrainerPoolTier.SUPER_RARE]: [Species.DONDOZO]
}),
[TrainerType.AQUA_ADMIN]: new TrainerConfig(++t).setHasGenders().setMoneyMultiplier(1.5).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_aqua_magma_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene))
.setSpeciesPools({
[TrainerPoolTier.COMMON]: [ Species.CARVANHA, Species.CORPHISH, Species.ZIGZAGOON, Species.CLAMPERL, Species.CHINCHOU, Species.WOOPER, Species.WINGULL, Species.TENTACOOL, Species.QWILFISH ],
[TrainerPoolTier.UNCOMMON]: [Species.MANTINE, Species.BASCULEGION, Species.REMORAID, Species.ARROKUDA],
[TrainerPoolTier.RARE]: [Species.DONDOZO]
}),
[TrainerType.GALACTIC_GRUNT]: new TrainerConfig(++t).setHasGenders("Galactic Grunt Female").setHasDouble("Galactic Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_galactic_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene))
.setSpeciesPools({
[TrainerPoolTier.COMMON]: [ Species.GLAMEOW, Species.STUNKY, Species.CROAGUNK, Species.SHINX, Species.WURMPLE, Species.BRONZOR, Species.DRIFLOON, Species.BURMY],
@ -1208,6 +1226,12 @@ export const trainerConfigs: TrainerConfigs = {
[TrainerPoolTier.RARE]: [Species.HISUI_GROWLITHE, Species.HISUI_QWILFISH, Species.HISUI_SNEASEL],
[TrainerPoolTier.SUPER_RARE]: [Species.HISUI_ZORUA, Species.HISUI_SLIGGOO]
}),
[TrainerType.GALACTIC_ADMIN]: new TrainerConfig(++t).setHasGenders().setMoneyMultiplier(1.5).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_galactic_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene))
.setSpeciesPools({
[TrainerPoolTier.COMMON]: [ Species.GLAMEOW, Species.STUNKY, Species.BRONZOR, Species.CARNIVINE, Species.GROWLITHE, Species.QWILFISH, Species.SNEASEL ],
[TrainerPoolTier.UNCOMMON]: [Species.HISUI_GROWLITHE, Species.HISUI_QWILFISH, Species.HISUI_SNEASEL],
[TrainerPoolTier.RARE]: [Species.HISUI_ZORUA, Species.HISUI_SLIGGOO]
}),
[TrainerType.PLASMA_GRUNT]: new TrainerConfig(++t).setHasGenders("Plasma Grunt Female").setHasDouble("Plasma Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_plasma_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene))
.setSpeciesPools({
[TrainerPoolTier.COMMON]: [ Species.PATRAT, Species.LILLIPUP, Species.PURRLOIN, Species.SCRAFTY, Species.WOOBAT, Species.VANILLITE, Species.SANDILE, Species.TRUBBISH],
@ -1215,6 +1239,12 @@ export const trainerConfigs: TrainerConfigs = {
[TrainerPoolTier.RARE]: [Species.PAWNIARD, Species.VULLABY, Species.ZORUA, Species.DRILBUR, Species.KLINK],
[TrainerPoolTier.SUPER_RARE]: [Species.DRUDDIGON, Species.BOUFFALANT, Species.AXEW, Species.DEINO, Species.DURANT]
}),
[TrainerType.PLASMA_SAGE]: new TrainerConfig(++t).setMoneyMultiplier(1.5).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_plasma_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene))
.setSpeciesPools({
[TrainerPoolTier.COMMON]: [ Species.SCRAFTY, Species.LILLIPUP, Species.PURRLOIN, Species.FRILLISH, Species.VENIPEDE, Species.GOLETT, Species.TIMBURR, Species.DARUMAKA, Species.AMOONGUSS],
[TrainerPoolTier.UNCOMMON]: [Species.PAWNIARD, Species.VULLABY, Species.ZORUA, Species.DRILBUR, Species.KLINK],
[TrainerPoolTier.RARE]: [Species.DRUDDIGON, Species.BOUFFALANT, Species.AXEW, Species.DEINO, Species.DURANT]
}),
[TrainerType.FLARE_GRUNT]: new TrainerConfig(++t).setHasGenders("Flare Grunt Female").setHasDouble("Flare Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_flare_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene))
.setSpeciesPools({
[TrainerPoolTier.COMMON]: [ Species.FLETCHLING, Species.LITLEO, Species.PONYTA, Species.INKAY, Species.HOUNDOUR, Species.SKORUPI, Species.SCRAFTY, Species.CROAGUNK],
@ -1222,6 +1252,12 @@ export const trainerConfigs: TrainerConfigs = {
[TrainerPoolTier.RARE]: [Species.LITWICK, Species.SNEASEL, Species.PANCHAM, Species.PAWNIARD],
[TrainerPoolTier.SUPER_RARE]: [Species.NOIVERN, Species.DRUDDIGON]
}),
[TrainerType.FLARE_ADMIN]: new TrainerConfig(++t).setHasGenders().setMoneyMultiplier(1.5).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_flare_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene))
.setSpeciesPools({
[TrainerPoolTier.COMMON]: [ Species.FLETCHLING, Species.LITLEO, Species.INKAY, Species.HELIOPTILE, Species.ELECTRIKE, Species.SKRELP, Species.GULPIN, Species.PURRLOIN, Species.POOCHYENA, Species.SCATTERBUG],
[TrainerPoolTier.UNCOMMON]: [Species.LITWICK, Species.SNEASEL, Species.PANCHAM, Species.PAWNIARD],
[TrainerPoolTier.RARE]: [Species.NOIVERN, Species.DRUDDIGON]
}),
[TrainerType.BROCK]: new TrainerConfig((t = TrainerType.BROCK)).initForGymLeader(signatureSpecies["BROCK"],true, Type.ROCK).setBattleBgm("battle_kanto_gym").setMixedBattleBgm("battle_kanto_gym"),
[TrainerType.MISTY]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["MISTY"],false, Type.WATER).setBattleBgm("battle_kanto_gym").setMixedBattleBgm("battle_kanto_gym"),
[TrainerType.LT_SURGE]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["LT_SURGE"],true, Type.ELECTRIC).setBattleBgm("battle_kanto_gym").setMixedBattleBgm("battle_kanto_gym"),

View File

@ -53,11 +53,17 @@ export enum TrainerType {
WORKER,
YOUNGSTER,
ROCKET_GRUNT,
ROCKET_ADMIN,
MAGMA_GRUNT,
MAGMA_ADMIN,
AQUA_GRUNT,
AQUA_ADMIN,
GALACTIC_GRUNT,
GALACTIC_ADMIN,
PLASMA_GRUNT,
PLASMA_SAGE,
FLARE_GRUNT,
FLARE_ADMIN,
ROCKET_BOSS_GIOVANNI_1,
ROCKET_BOSS_GIOVANNI_2,
MAXIE,

View File

@ -3161,6 +3161,23 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
return this.randSeedInt((max - min) + 1, min);
}
/**
* Causes a Pokemon to leave the field (such as in preparation for a switch out/escape).
* @param clearEffects Indicates if effects should be cleared (true) or passed
* to the next pokemon, such as during a baton pass (false)
*/
leaveField(clearEffects: boolean = true) {
this.resetTurnData();
if (clearEffects) {
this.resetSummonData();
this.resetBattleData();
}
this.hideInfo();
this.setVisible(false);
this.scene.field.remove(this);
this.scene.triggerPokemonFormChange(this, SpeciesFormChangeActiveTrigger, true);
}
destroy(): void {
this.battleInfo?.destroy();
super.destroy();
@ -3272,25 +3289,21 @@ export class PlayerPokemon extends Pokemon {
return true;
}
switchOut(batonPass: boolean, removeFromField: boolean = false): Promise<void> {
/**
* Causes this mon to leave the field (via {@linkcode leaveField}) and then
* opens the party switcher UI to switch a new mon in
* @param batonPass Indicates if this switch was caused by a baton pass (and
* thus should maintain active mon effects)
*/
switchOut(batonPass: boolean): Promise<void> {
return new Promise(resolve => {
this.resetTurnData();
if (!batonPass) {
this.resetSummonData();
}
this.hideInfo();
this.setVisible(false);
this.leaveField(!batonPass);
this.scene.ui.setMode(Mode.PARTY, PartyUiMode.FAINT_SWITCH, this.getFieldIndex(), (slotIndex: integer, option: PartyOption) => {
if (slotIndex >= this.scene.currentBattle.getBattlerCount() && slotIndex < 6) {
this.scene.prependToPhase(new SwitchSummonPhase(this.scene, this.getFieldIndex(), slotIndex, false, batonPass), MoveEndPhase);
}
if (removeFromField) {
this.setVisible(false);
this.scene.field.remove(this);
this.scene.triggerPokemonFormChange(this, SpeciesFormChangeActiveTrigger, true);
}
this.scene.ui.setMode(Mode.MESSAGE).then(() => resolve());
this.scene.ui.setMode(Mode.MESSAGE).then(resolve);
}, PartyUiHandler.FilterNonFainted);
});
}

View File

@ -121,8 +121,8 @@ export default class Trainer extends Phaser.GameObjects.Container {
// Determine the title to include based on the configuration and includeTitle flag.
let title = includeTitle && this.config.title ? this.config.title : null;
if (this.name === "" && name.toLowerCase().includes("grunt")) {
const evilTeamTitles = ["grunt", "admin", "sage"];
if (this.name === "" && evilTeamTitles.some(t => name.toLocaleLowerCase().includes(t))) {
// This is a evil team grunt so we localize it by only using the "name" as the title
title = i18next.t(`trainerClasses:${name.toLowerCase().replace(/\s/g, "_")}`);
console.log("Localized grunt name: " + title);

View File

@ -378,6 +378,18 @@ export const PGMdialogue: DialogueTranslationEntries = {
1: "Das war mal wieder ein Schuss in den Ofen!"
},
},
"rocket_admin": {
"encounter": {
1: "Oh? You managed to get this far? You must be quite the trainer.",
2: "That's quite enough of you playing hero, kid.",
3: "I'll show you how scary an angry adult can be!"
},
"victory": {
1: "No! Forgive me Giovanni!",
2: "How could this be?",
3: "Urgh... You were too strong..."
},
},
"firebreather": {
"encounter": {
1: "Meine Flammen werden dich verschlingen!",
@ -410,6 +422,18 @@ export const PGMdialogue: DialogueTranslationEntries = {
1: "Wie kann das sein? Ich bin Teil vom mächtigen Team Magma! Wir wollen doch nur die Welt verbessern…"
},
},
"magma_admin": {
"encounter": {
1: "Hehehe! So you've come all the way here! But you're too late!",
2: "You're going to meddle in Team Magma's affairs? You're so cute you're disgusting! I'll put you down kiddy!",
3: "I'm going to give you a little taste of pain! Resign yourself to it!"
},
"victory": {
1: "Hehehe... So I lost...",
2: "You're disgustingly strong!",
3: "Ahahaha! Ouch!"
},
},
"aqua_grunt": {
"encounter": {
1: "Du willst dich also mit Team Aqua anlegen? Du traust dich ja was… Dich werfe ich über Bord!",
@ -418,6 +442,18 @@ export const PGMdialogue: DialogueTranslationEntries = {
1: "Vielleicht sollte ich wohl lieber selber über die Planke gehen…",
},
},
"aqua_admin": {
"encounter": {
1: "I'm a cut above the grunts you've seen so far. I'm going to puvlerize you!",
2: "Hahn? What's this? Who's this spoiled brat?",
3: "What are you doing here? Did you follow us?"
},
"victory": {
1: "So I lost too...",
2: "Ahhh?! Did I go too easy on you?!",
3: "Wh-what was that?"
},
},
"galactic_grunt": {
"encounter": {
1: "Team Galaktik wird die Welt in eine bessere Welt verwandeln! Und du wirst uns nicht aufhalten!"
@ -426,6 +462,18 @@ export const PGMdialogue: DialogueTranslationEntries = {
1: "Zyrus wird uns für diese Niederlage bestrafen…"
},
},
"galactic_admin": {
"encounter": {
1: "I'm one of Team Galactic's Commanders.",
2: "Anything that opposes Team Galactic must be crushed! Even the very thought of opposition will not be tolerated!",
3: "What's the matter? Don't tell me you're shaking?"
},
"victory": {
1: "This can't be?! I lost?! You... you uppity brat!",
2: "You, my friend, are tough!",
3: "Losing to some child... Being careless cost me too much."
},
},
"plasma_grunt": {
"encounter": {
1: "Pokémon sollten frei sein! Team Plasma wird sie befreien!"
@ -434,6 +482,18 @@ export const PGMdialogue: DialogueTranslationEntries = {
1: "Wie konnte ich verlieren? Ich dachte, ich würde die Welt retten…"
},
},
"plasma_sage": {
"encounter": {
1: "You could become a threat to Team Plasma, so we will eliminate you here!",
2: "Oh, for crying out loud... I didn't expect to have to fight!",
3: "You're an impressive Trainer to have made it this far."
},
"victory": {
1: "Ghetsis...",
2: "It's bitter cold. I'm shivering. I'm suffering.",
3: "Hmph. You're a smarter Trainer than I expected."
},
},
"flare_grunt": {
"encounter": {
1: `Ich bin ein Mitglied von Team Flare! Das sieht man mir doch an. Mein Stil ist unverkennbar!
@ -443,6 +503,18 @@ export const PGMdialogue: DialogueTranslationEntries = {
1: "Stil ist wohl doch nicht alles…"
},
},
"flare_admin": {
"encounter": {
1: "Ah ha ha! It would be my pleasure. Come on, little Trainer! Let's see what you've got!",
2: "Hmm... You're more powerful than you look. I wonder how much energy there is inside you.",
3: "I've been waiting for you! I need to do a little research on you! Come, let us begin!"
},
"victory": {
1: "You're quite strong. Oh yes-very strong, indeed.",
2: "Ding-ding-ding! Yup, you did it! To the victor goes the spoils!",
3: "Wonderful! Amazing! You have tremendous skill and bravery!"
},
},
"rocket_boss_giovanni_1": {
"encounter": {
1: `Ich bin beeindruckt, du hast es bis hierher geschafft!

View File

@ -7,6 +7,7 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales";
*/
export const starterSelectUiHandler: SimpleTranslationEntries = {
"confirmStartTeam": "Mit diesen Pokémon losziehen?",
"confirmExit": "Do you want to exit?",
"invalidParty": "Das ist kein gültiges Team!",
"gen1": "I",
"gen2": "II",

View File

@ -128,21 +128,32 @@ export const trainerClasses: SimpleTranslationEntries = {
"rocket_grunt": "Rüpel von Team Rocket",
"rocket_grunt_female": "Rüpel von Team Rocket",
"rocket_grunts": "Rüpel von Team Rocket",
"rocket_admin": "Rocket Admin",
"rocket_admin_female": "Rocket Admin",
"magma_grunt": "Rüpel von Team Magma",
"magma_grunt_female": "Rüpel von Team Magma",
"magma_grunts": "Rüpel von Team Magma",
"magma_admin": "Magma Admin",
"magma_admin_female": "Magma Admin",
"aqua_grunt": "Rüpel von Team Aqua",
"aqua_grunt_female": "Rüpel von Team Aqua",
"aqua_grunts": "Rüpel von Team Aqua",
"aqua_admin": "Aqua Admin",
"aqua_admin_female": "Aqua Admin",
"galactic_grunt": "Rüpel von Team Galaktik",
"galactic_grunt_female": "Rüpel von Team Galaktik",
"galactic_grunts": "Rüpel von Team Galaktik",
"galactic_admin": "Galactic Admin",
"galactic_admin_female": "Galactic Admin",
"plasma_grunt": "Rüpel von Team Plasma",
"plasma_grunt_female": "Rüpel von Team Plasma",
"plasma_grunts": "Rüpel von Team Plasma",
"plasma_sage": "Plasma Sage",
"flare_grunt": "Rüpel von Team Flare",
"flare_grunt_female": "Rüpel von Team Flare",
"flare_grunts": "Rüpel von Team Flare",
"flare_admin": "Flare Admin",
"flare_admin_female": "Flare Admin",
} as const;
// Names of special trainers like gym leaders, elite four, and the champion

View File

@ -391,6 +391,18 @@ export const PGMdialogue: DialogueTranslationEntries = {
1: "Team Rocket blasting off again!"
},
},
"rocket_admin": {
"encounter": {
1: "Oh? You managed to get this far? You must be quite the trainer.",
2: "That's quite enough of you playing hero, kid.",
3: "I'll show you how scary an angry adult can be!"
},
"victory": {
1: "No! Forgive me Giovanni!",
2: "How could this be?",
3: "Urgh... You were too strong..."
},
},
"magma_grunt": {
"encounter": {
1: " If you get in the way of Team Magma, dont expect any mercy!"
@ -399,6 +411,18 @@ export const PGMdialogue: DialogueTranslationEntries = {
1: "Huh? I lost?!"
},
},
"magma_admin": {
"encounter": {
1: "Hehehe! So you've come all the way here! But you're too late!",
2: "You're going to meddle in Team Magma's affairs? You're so cute you're disgusting! I'll put you down kiddy!",
3: "I'm going to give you a little taste of pain! Resign yourself to it!"
},
"victory": {
1: "Hehehe... So I lost...",
2: "You're disgustingly strong!",
3: "Ahahaha! Ouch!"
},
},
"aqua_grunt": {
"encounter": {
1: "No one who crosses Team Aqua gets any mercy, not even kids!"
@ -407,6 +431,18 @@ export const PGMdialogue: DialogueTranslationEntries = {
1: "You're kidding me!"
},
},
"aqua_admin": {
"encounter": {
1: "I'm a cut above the grunts you've seen so far. I'm going to puvlerize you!",
2: "Hahn? What's this? Who's this spoiled brat?",
3: "What are you doing here? Did you follow us?"
},
"victory": {
1: "So I lost too...",
2: "Ahhh?! Did I go too easy on you?!",
3: "Wh-what was that?"
},
},
"galactic_grunt": {
"encounter": {
1: "Don't mess with Team Galactic!"
@ -415,6 +451,18 @@ export const PGMdialogue: DialogueTranslationEntries = {
1: "Shut down..."
},
},
"galactic_admin": {
"encounter": {
1: "I'm one of Team Galactic's Commanders.",
2: "Anything that opposes Team Galactic must be crushed! Even the very thought of opposition will not be tolerated!",
3: "What's the matter? Don't tell me you're shaking?"
},
"victory": {
1: "This can't be?! I lost?! You... you uppity brat!",
2: "You, my friend, are tough!",
3: "Losing to some child... Being careless cost me too much."
},
},
"plasma_grunt": {
"encounter": {
1: "We won't tolerate people who have different ideas!"
@ -423,6 +471,18 @@ export const PGMdialogue: DialogueTranslationEntries = {
1: "Plasmaaaaaaaaa!"
},
},
"plasma_sage": {
"encounter": {
1: "You could become a threat to Team Plasma, so we will eliminate you here!",
2: "Oh, for crying out loud... I didn't expect to have to fight!",
3: "You're an impressive Trainer to have made it this far."
},
"victory": {
1: "Ghetsis...",
2: "It's bitter cold. I'm shivering. I'm suffering.",
3: "Hmph. You're a smarter Trainer than I expected."
},
},
"flare_grunt": {
"encounter": {
1: "Fashion is most important to us!"
@ -431,6 +491,18 @@ export const PGMdialogue: DialogueTranslationEntries = {
1: "The future doesn't look bright for me."
},
},
"flare_admin": {
"encounter": {
1: "Ah ha ha! It would be my pleasure. Come on, little Trainer! Let's see what you've got!",
2: "Hmm... You're more powerful than you look. I wonder how much energy there is inside you.",
3: "I've been waiting for you! I need to do a little research on you! Come, let us begin!"
},
"victory": {
1: "You're quite strong. Oh yes-very strong, indeed.",
2: "Ding-ding-ding! Yup, you did it! To the victor goes the spoils!",
3: "Wonderful! Amazing! You have tremendous skill and bravery!"
},
},
"rocket_boss_giovanni_1": {
"encounter": {
1: "So! I must say, I am impressed you got here!"

View File

@ -7,6 +7,7 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales";
*/
export const starterSelectUiHandler: SimpleTranslationEntries = {
"confirmStartTeam": "Begin with these Pokémon?",
"confirmExit": "Do you want to exit?",
"invalidParty": "This is not a valid starting party!",
"gen1": "I",
"gen2": "II",

View File

@ -128,21 +128,32 @@ export const trainerClasses: SimpleTranslationEntries = {
"rocket_grunt": "Rocket Grunt",
"rocket_grunts": "Rocket Grunts",
"rocket_grunt_female": "Rocket Grunt",
"rocket_admin": "Rocket Admin",
"rocket_admin_female": "Rocket Admin",
"magma_grunt": "Magma Grunt",
"magma_grunt_female": "Magma Grunt",
"magma_grunts": "Magma Grunts",
"magma_admin": "Magma Admin",
"magma_admin_female": "Magma Admin",
"aqua_grunt": "Aqua Grunt",
"aqua_grunt_female": "Aqua Grunt",
"aqua_grunts": "Aqua Grunts",
"aqua_admin": "Aqua Admin",
"aqua_admin_female": "Aqua Admin",
"galactic_grunt": "Galactic Grunt",
"galactic_grunt_female": "Galactic Grunt",
"galactic_grunts": "Galactic Grunts",
"galactic_admin": "Galactic Admin",
"galactic_admin_female": "Galactic Admin",
"plasma_grunt": "Plasma Grunt",
"plasma_grunt_female": "Plasma Grunt",
"plasma_grunts": "Plasma Grunts",
"plasma_sage": "Plasma Sage",
"flare_grunt": "Flare Grunt",
"flare_grunt_female": "Flare Grunt",
"flare_grunts": "Flare Grunts",
"flare_admin": "Flare Admin",
"flare_admin_female": "Flare Admin",
} as const;
// Names of special trainers like gym leaders, elite four, and the champion

View File

@ -7,6 +7,7 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales";
*/
export const starterSelectUiHandler: SimpleTranslationEntries = {
"confirmStartTeam": "¿Comenzar con estos Pokémon?",
"confirmExit": "Do you want to exit?",
"invalidParty": "¡Este equipo no es válido!",
"gen1": "I",
"gen2": "II",

View File

@ -121,21 +121,31 @@ export const trainerClasses: SimpleTranslationEntries = {
"rocket_grunt": "Rocket Grunt",
"rocket_grunts": "Rocket Grunts",
"rocket_grunt_female": "Rocket Grunt",
"rocket_admin": "Rocket Admin",
"rocket_admin_female": "Rocket Admin",
"magma_grunt": "Magma Grunt",
"magma_grunt_female": "Magma Grunt",
"magma_grunts": "Magma Grunts",
"magma_admin": "Magma Admin",
"magma_admin_female": "Magma Admin",
"aqua_grunt": "Aqua Grunt",
"aqua_grunt_female": "Aqua Grunt",
"aqua_grunts": "Aqua Grunts",
"aqua_admin": "Aqua Admin",
"aqua_admin_female": "Aqua Admin",
"galactic_grunt": "Galactic Grunt",
"galactic_grunt_female": "Galactic Grunt",
"galactic_grunts": "Galactic Grunts",
"galactic_admin": "Galactic Admin",
"galactic_admin_female": "Galactic Admin",
"plasma_grunt": "Plasma Grunt",
"plasma_grunt_female": "Plasma Grunt",
"plasma_grunts": "Plasma Grunts",
"flare_grunt": "Flare Grunt",
"flare_grunt_female": "Flare Grunt",
"flare_grunts": "Flare Grunts",
"flare_admin": "Flare Admin",
"flare_admin_female": "Flare Admin",
} as const;
// Names of special trainers like gym leaders, elite four, and the champion

View File

@ -264,6 +264,10 @@ export const PGMachv: AchievementTranslationEntries = {
"MONO_FAIRY": {
name: "Hey ! Listen !",
},
"FRESH_START": {
name: "Du premier coup !",
description: "Terminer un challenge « Nouveau départ »."
}
} as const;
// Achievement translations for the when the player character is female (it for now uses the same translations as the male version)
@ -530,4 +534,8 @@ export const PGFachv: AchievementTranslationEntries = {
"MONO_FAIRY": {
name: "Hey ! Listen !",
},
"FRESH_START": {
name: "Du premier coup !",
description: "Terminer un challenge « Nouveau départ »."
}
} as const;

View File

@ -2,7 +2,7 @@ import { TranslationEntries } from "#app/interfaces/locales";
export const challenges: TranslationEntries = {
"title": "Paramètres du Challenge",
"illegalEvolution": "{{pokemon}} sest transformé en Pokémon\ninéligible pour ce challenge !",
"illegalEvolution": "{{pokemon}} est devenu\ninéligible pour ce challenge !",
"singleGeneration": {
"name": "Mono-génération",
"desc": "Vous ne pouvez choisir que des Pokémon de {{gen}} génération.",
@ -23,4 +23,10 @@ export const challenges: TranslationEntries = {
"desc_default": "Vous ne pouvez choisir que des Pokémon du type sélectionné."
//type in pokemon-info
},
"freshStart": {
"name": "Nouveau départ",
"desc": "Vous ne pouvez choisir que les starters de base du jeu, comme si vous le recommenciez.",
"value.0": "Non",
"value.1": "Oui",
}
} as const;

View File

@ -2898,6 +2898,18 @@ export const PGFdialogue: DialogueTranslationEntries = {
1: "Une fois de plus la Team Rocket senvole vers dautres cieux !"
},
},
"rocket_admin": {
"encounter": {
1: "Oh? You managed to get this far? You must be quite the trainer.",
2: "That's quite enough of you playing hero, kid.",
3: "I'll show you how scary an angry adult can be!"
},
"victory": {
1: "No! Forgive me Giovanni!",
2: "How could this be?",
3: "Urgh... You were too strong..."
},
},
"magma_grunt": {
"encounter": {
1: "Nespère pas recevoir de la pitié si tu te mets sur le chemin de la Team Magma !"
@ -2906,6 +2918,18 @@ export const PGFdialogue: DialogueTranslationEntries = {
1: "Je…?\nJai perdu ?!"
},
},
"magma_admin": {
"encounter": {
1: "Hehehe! So you've come all the way here! But you're too late!",
2: "You're going to meddle in Team Magma's affairs? You're so cute you're disgusting! I'll put you down kiddy!",
3: "I'm going to give you a little taste of pain! Resign yourself to it!"
},
"victory": {
1: "Hehehe... So I lost...",
2: "You're disgustingly strong!",
3: "Ahahaha! Ouch!"
},
},
"aqua_grunt": {
"encounter": {
1: "Aucune pitié si tu te mets sur le chemin de la Team Aqua, même pour une gamine !"
@ -2914,6 +2938,18 @@ export const PGFdialogue: DialogueTranslationEntries = {
1: "Comment ça ?"
},
},
"aqua_admin": {
"encounter": {
1: "I'm a cut above the grunts you've seen so far. I'm going to puvlerize you!",
2: "Hahn? What's this? Who's this spoiled brat?",
3: "What are you doing here? Did you follow us?"
},
"victory": {
1: "So I lost too...",
2: "Ahhh?! Did I go too easy on you?!",
3: "Wh-what was that?"
},
},
"galactic_grunt": {
"encounter": {
1: "Ne te mets pas en travers de la Team Galaxie !"
@ -2922,6 +2958,18 @@ export const PGFdialogue: DialogueTranslationEntries = {
1: "Désactivation…"
},
},
"galactic_admin": {
"encounter": {
1: "I'm one of Team Galactic's Commanders.",
2: "Anything that opposes Team Galactic must be crushed! Even the very thought of opposition will not be tolerated!",
3: "What's the matter? Don't tell me you're shaking?"
},
"victory": {
1: "This can't be?! I lost?! You... you uppity brat!",
2: "You, my friend, are tough!",
3: "Losing to some child... Being careless cost me too much."
},
},
"plasma_grunt": {
"encounter": {
1: "Pas de quatiers à ceux qui ne suivent pas notre idéal !"
@ -2930,6 +2978,18 @@ export const PGFdialogue: DialogueTranslationEntries = {
1: "Plasmaaaaaaaaa !"
},
},
"plasma_sage": {
"encounter": {
1: "You could become a threat to Team Plasma, so we will eliminate you here!",
2: "Oh, for crying out loud... I didn't expect to have to fight!",
3: "You're an impressive Trainer to have made it this far."
},
"victory": {
1: "Ghetsis...",
2: "It's bitter cold. I'm shivering. I'm suffering.",
3: "Hmph. You're a smarter Trainer than I expected."
},
},
"flare_grunt": {
"encounter": {
1: "Le style et le bon gout, il ny a que ça qui compte !"
@ -2938,6 +2998,18 @@ export const PGFdialogue: DialogueTranslationEntries = {
1: "Mon futur me semble guère radieux."
},
},
"flare_admin": {
"encounter": {
1: "Ah ha ha! It would be my pleasure. Come on, little Trainer! Let's see what you've got!",
2: "Hmm... You're more powerful than you look. I wonder how much energy there is inside you.",
3: "I've been waiting for you! I need to do a little research on you! Come, let us begin!"
},
"victory": {
1: "You're quite strong. Oh yes-very strong, indeed.",
2: "Ding-ding-ding! Yup, you did it! To the victor goes the spoils!",
3: "Wonderful! Amazing! You have tremendous skill and bravery!"
},
},
"rocket_boss_giovanni_1": {
"encounter": {
1: "Bien. Je dois admettre que je suis impressionné de te voir ici !"

View File

@ -7,6 +7,7 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales";
*/
export const starterSelectUiHandler: SimpleTranslationEntries = {
"confirmStartTeam": "Commencer avec ces Pokémon ?",
"confirmExit": "Do you want to exit?",
"invalidParty": "Cette équipe de départ est invalide !",
"gen1": "1G",
"gen2": "2G",

View File

@ -128,21 +128,32 @@ export const trainerClasses: SimpleTranslationEntries = {
"rocket_grunt": "Sbire de la Team Rocket",
"rocket_grunt_female": "Sbire de la Team Rocket",
"rocket_grunts": "Sbires de la Team Rocket",
"rocket_admin": "Rocket Admin",
"rocket_admin_female": "Rocket Admin",
"magma_grunt": "Sbire de la Team Magma",
"magma_grunt_female": "Sbire de la Team Magma",
"magma_grunts": "Sbires de la Team Magma",
"magma_admin": "Magma Admin",
"magma_admin_female": "Magma Admin",
"aqua_grunt": "Sbire de la Team Aqua",
"aqua_grunt_female": "Sbire de la Team Aqua",
"aqua_grunts": "Sbires de la Team Aqua",
"aqua_admin": "Aqua Admin",
"aqua_admin_female": "Aqua Admin",
"galactic_grunt": "Sbire de la Team Galaxie",
"galactic_grunt_female": "Sbire de la Team Galaxie",
"galactic_grunts": "Sbires de la Team Galaxie",
"galactic_admin": "Galactic Admin",
"galactic_admin_female": "Galactic Admin",
"plasma_grunt": "Sbire de la Team Plasma",
"plasma_grunt_female": "Sbire de la Team Plasma",
"plasma_grunts": "Sbires de la Team Plasma",
"plasma_sage": "Plasma Sage",
"flare_grunt": "Sbire de la Team Flare",
"flare_grunt_female": "Sbire de la Team Flare",
"flare_grunts": "Sbires de la Team Flare",
"flare_admin": "Flare Admin",
"flare_admin_female": "Flare Admin",
} as const;
// Names of special trainers like gym leaders, elite four, and the champion

View File

@ -391,6 +391,18 @@ export const PGMdialogue: DialogueTranslationEntries = {
1: "Team Rocket blasting off again!"
},
},
"rocket_admin": {
"encounter": {
1: "Oh? You managed to get this far? You must be quite the trainer.",
2: "That's quite enough of you playing hero, kid.",
3: "I'll show you how scary an angry adult can be!"
},
"victory": {
1: "No! Forgive me Giovanni!",
2: "How could this be?",
3: "Urgh... You were too strong..."
},
},
"magma_grunt": {
"encounter": {
1: " If you get in the way of Team Magma, dont expect any mercy!"
@ -399,6 +411,18 @@ export const PGMdialogue: DialogueTranslationEntries = {
1: "Huh? I lost?!"
},
},
"magma_admin": {
"encounter": {
1: "Hehehe! So you've come all the way here! But you're too late!",
2: "You're going to meddle in Team Magma's affairs? You're so cute you're disgusting! I'll put you down kiddy!",
3: "I'm going to give you a little taste of pain! Resign yourself to it!"
},
"victory": {
1: "Hehehe... So I lost...",
2: "You're disgustingly strong!",
3: "Ahahaha! Ouch!"
},
},
"aqua_grunt": {
"encounter": {
1: "No one who crosses Team Aqua gets any mercy, not even kids!"
@ -407,6 +431,18 @@ export const PGMdialogue: DialogueTranslationEntries = {
1: "You're kidding me!"
},
},
"aqua_admin": {
"encounter": {
1: "I'm a cut above the grunts you've seen so far. I'm going to puvlerize you!",
2: "Hahn? What's this? Who's this spoiled brat?",
3: "What are you doing here? Did you follow us?"
},
"victory": {
1: "So I lost too...",
2: "Ahhh?! Did I go too easy on you?!",
3: "Wh-what was that?"
},
},
"galactic_grunt": {
"encounter": {
1: "Don't mess with Team Galactic!"
@ -415,6 +451,18 @@ export const PGMdialogue: DialogueTranslationEntries = {
1: "Shut down..."
},
},
"galactic_admin": {
"encounter": {
1: "I'm one of Team Galactic's Commanders.",
2: "Anything that opposes Team Galactic must be crushed! Even the very thought of opposition will not be tolerated!",
3: "What's the matter? Don't tell me you're shaking?"
},
"victory": {
1: "This can't be?! I lost?! You... you uppity brat!",
2: "You, my friend, are tough!",
3: "Losing to some child... Being careless cost me too much."
},
},
"plasma_grunt": {
"encounter": {
1: "We won't tolerate people who have different ideas!"
@ -423,6 +471,18 @@ export const PGMdialogue: DialogueTranslationEntries = {
1: "Plasmaaaaaaaaa!"
},
},
"plasma_sage": {
"encounter": {
1: "You could become a threat to Team Plasma, so we will eliminate you here!",
2: "Oh, for crying out loud... I didn't expect to have to fight!",
3: "You're an impressive Trainer to have made it this far."
},
"victory": {
1: "Ghetsis...",
2: "It's bitter cold. I'm shivering. I'm suffering.",
3: "Hmph. You're a smarter Trainer than I expected."
},
},
"flare_grunt": {
"encounter": {
1: "Fashion is most important to us!"
@ -431,6 +491,18 @@ export const PGMdialogue: DialogueTranslationEntries = {
1: "The future doesn't look bright for me."
},
},
"flare_admin": {
"encounter": {
1: "Ah ha ha! It would be my pleasure. Come on, little Trainer! Let's see what you've got!",
2: "Hmm... You're more powerful than you look. I wonder how much energy there is inside you.",
3: "I've been waiting for you! I need to do a little research on you! Come, let us begin!"
},
"victory": {
1: "You're quite strong. Oh yes-very strong, indeed.",
2: "Ding-ding-ding! Yup, you did it! To the victor goes the spoils!",
3: "Wonderful! Amazing! You have tremendous skill and bravery!"
},
},
"rocket_boss_giovanni_1": {
"encounter": {
1: "So! I must say, I am impressed you got here!"

View File

@ -7,6 +7,7 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales";
*/
export const starterSelectUiHandler: SimpleTranslationEntries = {
"confirmStartTeam": "Vuoi iniziare con questi Pokémon?",
"confirmExit": "Do you want to exit?",
"invalidParty": "Questo squadra iniziale non è valida!",
"gen1": "1ª",
"gen2": "2ª",

View File

@ -120,23 +120,33 @@ export const trainerClasses: SimpleTranslationEntries = {
"workers": "Lavoratori",
"youngster": "Bullo",
"rocket_grunt": "Recluta Team Rocket",
"rocket_grunts": "Reclute Team Rocket",
"rocket_grunt_female": "Recluta Team Rocket",
"rocket_grunts": "Reclute Team Rocket",
"rocket_admin": "Rocket Admin",
"rocket_admin_female": "Rocket Admin",
"magma_grunt": "Recluta Team Magma",
"magma_grunt_female": "Recluta Team Magma",
"magma_grunts": "Reclute Team Magma",
"magma_admin": "Magma Admin",
"magma_admin_female": "Magma Admin",
"aqua_grunt": "Recluta Team Idro",
"aqua_grunt_female": "Recluta Team Idro",
"aqua_grunts": "Recluta Team Idro",
"aqua_admin": "Aqua Admin",
"aqua_admin_female": "Aqua Admin",
"galactic_grunt": "Recluta Team Galassia",
"galactic_grunt_female": "Recluta Team Galassia",
"galactic_grunts": "Reclute Team Galassia",
"galactic_admin": "Galactic Admin",
"galactic_admin_female": "Galactic Admin",
"plasma_grunt": "Seguace Plasma",
"plasma_grunt_female": "Seguace Plasma",
"plasma_grunts": "Seguaci Plasma",
"flare_grunt": "Recluta Team Flare",
"flare_grunt_female": "Recluta Team Flare",
"flare_grunts": "Reclute Team Flare",
"flare_admin": "Flare Admin",
"flare_admin_female": "Flare Admin",
} as const;
// Names of special trainers like gym leaders, elite four, and the champion

View File

@ -391,6 +391,18 @@ export const PGMdialogue: DialogueTranslationEntries = {
1: "로켓단은 다시 떠오를 거니까!"
},
},
"rocket_admin": {
"encounter": {
1: "어라 어라… 결국 여기까지 오셨습니까? 꽤 우수한 트레이너인가 보군요.",
2: "영웅 놀이는 여기까지랍니다, 꼬마야.",
3: "어른이 화를 내면 무섭다는 걸 보여 드리죠!"
},
"victory": {
1: "크으… 비주기님 용서해 주세요…!",
2: "어떻게 이런 일이…",
3: "아아… 넌 너무 강하다…"
},
},
"magma_grunt": {
"encounter": {
1: " 마그마단을 방해한다면, 자비는 없닷!"
@ -399,6 +411,18 @@ export const PGMdialogue: DialogueTranslationEntries = {
1: "하? 내가 졌어?!"
},
},
"magma_admin": {
"encounter": {
1: "……아하… ……역시 왔네…그치만 안타깝게 됐어……다 끝났거든",
2: "……남은……내 일은……너를……막는 것",
3: "……너랑……인게이지……하고 싶어……아하하하"
},
"victory": {
1: "……룰루리",
2: "……재밌쪄",
3: "…하아하아……으…하아하아…"
},
},
"aqua_grunt": {
"encounter": {
1: "아쿠아단을 넘본 사람에게는 자비는 없다, 꼬마도 마찬가지야!"
@ -407,6 +431,18 @@ export const PGMdialogue: DialogueTranslationEntries = {
1: "말도 안돼!"
},
},
"aqua_admin": {
"encounter": {
1: "각오하는 게 좋을 거야! 네 얼굴이 눈물로 범벅이 되게 해주겠어!",
2: "아앙? 뭐야? 이 건방진 꼬맹이는…",
3: "…아니 넌!? 일부러 여기까지 쫓아온 거야?"
},
"victory": {
1: "하아… 하아…완전 지쳤어",
2: "크윽…!? 너무 봐줬나…!",
3: "뭐…뭐라고!?"
},
},
"galactic_grunt": {
"encounter": {
1: "갤럭시단을 방해하지 마!"
@ -415,6 +451,18 @@ export const PGMdialogue: DialogueTranslationEntries = {
1: "사격 중지…… "
},
},
"galactic_admin": {
"encounter": {
1: "나는 갤럭시단에 있는 간부 중의 한 명.",
2: "갤럭시단을 방해한다면 일말의 가능성도 모두 제거한다!!",
3: "왜 그래? 설마 떨고 있는 거야?"
},
"victory": {
1: "설마! 내가 졌다고!? 건방진 아이로구나!!",
2: "…역시 강해!",
3: "어린아이에게 지다니… 방심이란 무섭구나."
},
},
"plasma_grunt": {
"encounter": {
1: "다른 생각을 가진사람들은 용납하지 않겠다!"
@ -423,6 +471,18 @@ export const PGMdialogue: DialogueTranslationEntries = {
1: "플라-스마-!"
},
},
"plasma_sage": {
"encounter": {
1: "너는 플라스마단에게 있어 불안요소가 될 것이다. 여기서 제거하겠다!",
2: "이런 이런… 내가 싸워야만 하다니.",
3: "여기까지 오다니 대단한 트레이너군."
},
"victory": {
1: "게치스…",
2: "그건 그렇고 춥구먼. 나는 떨고 있다. 괴롭지만 살아 있다.",
3: "흐음. 의외로 똑똑한 트레이너군."
},
},
"flare_grunt": {
"encounter": {
1: "패션이 우리한텐 가장 중요하다고!"
@ -431,6 +491,18 @@ export const PGMdialogue: DialogueTranslationEntries = {
1: "미래가 밝아 보이질 않네."
},
},
"flare_admin": {
"encounter": {
1: "왔다! 왔구나! 자! 자! 아직 끝나지 않았다!",
2: "너 강하구나. 에너지를 얼마나 갖고 있지?",
3: "기다리고 있었어! 너를 조사하겠다. 자 시작한다!"
},
"victory": {
1: "강하구나, 너는. 응, 정말 강해, 너는.",
2: "그렇지만 보스의 꿈이 이루어져 아름다운 세상이 태어날 것이다!",
3: "굉장하구나 너! 아주 굉장해! 나는 너를 인정하겠다"
},
},
"rocket_boss_giovanni_1": {
"encounter": {
1: "그래서! 여기까지 오다니, 감탄이 절로 나오는군!"

View File

@ -7,6 +7,7 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales";
*/
export const starterSelectUiHandler: SimpleTranslationEntries = {
"confirmStartTeam": "이 포켓몬들로 시작하시겠습니까?",
"confirmExit": "Do you want to exit?",
"invalidParty": "스타팅 포켓몬 파티에 적합하지 않습니다!",
"gen1": "1세대",
"gen2": "2세대",

View File

@ -128,21 +128,32 @@ export const trainerClasses: SimpleTranslationEntries = {
"rocket_grunt": "로켓단 조무래기",
"rocket_grunt_female": "로켓단 조무래기",
"rocket_grunts": "로켓단 조무래기들",
"rocket_admin": "로켓단 간부",
"rocket_admin_female": "로켓단 간부",
"magma_grunt": "마그마단 조무래기",
"magma_grunt_female": "마그마단 조무래기",
"magma_grunts": "마그마단 조무래기들",
"magma_admin": "마그마단 간부",
"magma_admin_female": "마그마단 간부",
"aqua_grunt": "아쿠아단 조무래기",
"aqua_grunt_female": "아쿠아단 조무래기",
"aqua_grunts": "아쿠아단 조무래기들",
"aqua_admin": "아쿠아단 간부",
"aqua_admin_female": "아쿠아단 간부",
"galactic_grunt": "갤럭시단 조무래기",
"galactic_grunt_female": "갤럭시단 조무래기",
"galactic_grunts": "갤럭시단 조무래기들",
"galactic_admin": "갤럭시단 간부",
"galactic_admin_female": "갤럭시단 간부",
"plasma_grunt": "플라스마단 조무래기",
"plasma_grunt_female": "플라스마단 조무래기",
"plasma_grunts": "플라스마단 조무래기들",
"plasma_sage": "플라스마단 현인",
"flare_grunt": "플레어단 조무래기",
"flare_grunt_female": "플레어단 조무래기",
"flare_grunts": "플레어단 조무래기들",
"flare_admin": "플레어단 간부",
"flare_admin_female": "플레어단 간부",
} as const;
// Names of special trainers like gym leaders, elite four, and the champion

View File

@ -7,6 +7,7 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales";
*/
export const starterSelectUiHandler: SimpleTranslationEntries = {
"confirmStartTeam": "Começar com esses Pokémon?",
"confirmExit": "Do you want to exit?",
"invalidParty": "Essa equipe de iniciais não é válida!",
"gen1": "G1",
"gen2": "G2",

View File

@ -128,21 +128,32 @@ export const trainerClasses: SimpleTranslationEntries = {
"rocket_grunt": "Recruta da Equipe Rocket",
"rocket_grunt_female": "Recruta da Equipe Rocket",
"rocket_grunts": "Recrutas da Equipe Rocket",
"rocket_admin": "Rocket Admin",
"rocket_admin_female": "Rocket Admin",
"magma_grunt": "Recruta da Equipe Magma",
"magma_grunt_female": "Recruta da Equipe Magma",
"magma_grunts": "Recrutas da Equipe Magma",
"magma_admin": "Magma Admin",
"magma_admin_female": "Magma Admin",
"aqua_grunt": "Recruta da Equipe Aqua",
"aqua_grunt_female": "Recruta da Equipe Aqua",
"aqua_grunts": "Recrutas da Equipe Aqua",
"aqua_admin": "Aqua Admin",
"aqua_admin_female": "Aqua Admin",
"galactic_grunt": "Recruta da Equipe Galáctica",
"galactic_grunt_female": "Recruta da Equipe Galáctica",
"galactic_grunts": "Recrutas da Equipe Galáctica",
"galactic_admin": "Galactic Admin",
"galactic_admin_female": "Galactic Admin",
"plasma_grunt": "Recruta da Equipe Plasma",
"plasma_grunt_female": "Recruta da Equipe Plasma",
"plasma_grunts": "Recrutas da Equipe Plasma",
"plasma_sage": "Plasma Sage",
"flare_grunt": "Recruta da Equipe Flare",
"flare_grunt_female": "Recruta da Equipe Flare",
"flare_grunts": "Recrutas da Equipe Flare",
"flare_admin": "Flare Admin",
"flare_admin_female": "Flare Admin",
} as const;
// Names of special trainers like gym leaders, elite four, and the champion

View File

@ -390,6 +390,18 @@ export const PGMdialogue: DialogueTranslationEntries = {
1: "好讨厌的感觉啊!"
},
},
"rocket_admin": {
"encounter": {
1: "Oh? You managed to get this far? You must be quite the trainer.",
2: "That's quite enough of you playing hero, kid.",
3: "I'll show you how scary an angry adult can be!"
},
"victory": {
1: "No! Forgive me Giovanni!",
2: "How could this be?",
3: "Urgh... You were too strong..."
},
},
"magma_grunt": {
"encounter": {
1: "如果你挡在熔岩队路上,那就别指望我们手下留情!"
@ -398,6 +410,18 @@ export const PGMdialogue: DialogueTranslationEntries = {
1: "哈?我输了?!"
},
},
"magma_admin": {
"encounter": {
1: "Hehehe! So you've come all the way here! But you're too late!",
2: "You're going to meddle in Team Magma's affairs? You're so cute you're disgusting! I'll put you down kiddy!",
3: "I'm going to give you a little taste of pain! Resign yourself to it!"
},
"victory": {
1: "Hehehe... So I lost...",
2: "You're disgustingly strong!",
3: "Ahahaha! Ouch!"
},
},
"aqua_grunt": {
"encounter": {
1: "即使是小孩,如果要和海洋队作对,也别指望我们手下留情!"
@ -406,6 +430,18 @@ export const PGMdialogue: DialogueTranslationEntries = {
1: "你在开玩笑吧?"
},
},
"aqua_admin": {
"encounter": {
1: "I'm a cut above the grunts you've seen so far. I'm going to puvlerize you!",
2: "Hahn? What's this? Who's this spoiled brat?",
3: "What are you doing here? Did you follow us?"
},
"victory": {
1: "So I lost too...",
2: "Ahhh?! Did I go too easy on you?!",
3: "Wh-what was that?"
},
},
"galactic_grunt": {
"encounter": {
1: "别惹银河队!"
@ -414,6 +450,18 @@ export const PGMdialogue: DialogueTranslationEntries = {
1: "停机了…"
},
},
"galactic_admin": {
"encounter": {
1: "I'm one of Team Galactic's Commanders.",
2: "Anything that opposes Team Galactic must be crushed! Even the very thought of opposition will not be tolerated!",
3: "What's the matter? Don't tell me you're shaking?"
},
"victory": {
1: "This can't be?! I lost?! You... you uppity brat!",
2: "You, my friend, are tough!",
3: "Losing to some child... Being careless cost me too much."
},
},
"plasma_grunt": {
"encounter": {
1: "异端不共戴天!"
@ -422,6 +470,18 @@ export const PGMdialogue: DialogueTranslationEntries = {
1: "等离子子子子子子!"
},
},
"plasma_sage": {
"encounter": {
1: "You could become a threat to Team Plasma, so we will eliminate you here!",
2: "Oh, for crying out loud... I didn't expect to have to fight!",
3: "You're an impressive Trainer to have made it this far."
},
"victory": {
1: "Ghetsis...",
2: "It's bitter cold. I'm shivering. I'm suffering.",
3: "Hmph. You're a smarter Trainer than I expected."
},
},
"flare_grunt": {
"encounter": {
1: "时尚最重要!"
@ -430,6 +490,18 @@ export const PGMdialogue: DialogueTranslationEntries = {
1: "未来一片黑暗啊…"
},
},
"flare_admin": {
"encounter": {
1: "Ah ha ha! It would be my pleasure. Come on, little Trainer! Let's see what you've got!",
2: "Hmm... You're more powerful than you look. I wonder how much energy there is inside you.",
3: "I've been waiting for you! I need to do a little research on you! Come, let us begin!"
},
"victory": {
1: "You're quite strong. Oh yes-very strong, indeed.",
2: "Ding-ding-ding! Yup, you did it! To the victor goes the spoils!",
3: "Wonderful! Amazing! You have tremendous skill and bravery!"
},
},
"rocket_boss_giovanni_1": {
"encounter": {
1: "我不得不说,能来到这里,你的确很不简单!"

View File

@ -7,6 +7,7 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales";
*/
export const starterSelectUiHandler: SimpleTranslationEntries = {
"confirmStartTeam": "使用这些宝可梦开始游戏吗?",
"confirmExit": "Do you want to exit?",
"invalidParty": "初始队伍不可用!",
"gen1": "I",
"gen2": "II",

View File

@ -128,21 +128,32 @@ export const trainerClasses: SimpleTranslationEntries = {
"rocket_grunt": "火箭队手下",
"rocket_grunt_female": "火箭队手下",
"rocket_grunts": "火箭队手下们",
"rocket_admin": "Rocket Admin",
"rocket_admin_female": "Rocket Admin",
"magma_grunt": "熔岩队手下",
"magma_grunt_female": "熔岩队手下",
"magma_grunts": "熔岩队手下们",
"magma_admin": "Magma Admin",
"magma_admin_female": "Magma Admin",
"aqua_grunt": "海洋队手下",
"aqua_grunt_female": "海洋队手下",
"aqua_grunts": "海洋队手下们",
"aqua_admin": "Aqua Admin",
"aqua_admin_female": "Aqua Admin",
"galactic_grunt": "银河队手下",
"galactic_grunt_female": "银河队手下",
"galactic_grunts": "银河队手下们",
"galactic_admin": "Galactic Admin",
"galactic_admin_female": "Galactic Admin",
"plasma_grunt": "等离子队手下",
"plasma_grunt_female": "等离子队手下",
"plasma_grunts": "等离子队手下们",
"plasma_sage": "Plasma Sage",
"flare_grunt": "闪焰队手下",
"flare_grunt_female": "闪焰队手下",
"flare_grunts": "闪焰队手下们",
"flare_admin": "Flare Admin",
"flare_admin_female": "Flare Admin",
} as const;
// Names of special trainers like gym leaders, elite four, and the champion

View File

@ -390,6 +390,18 @@ export const PGMdialogue: DialogueTranslationEntries = {
1: "Team Rocket blasting off again!"
},
},
"rocket_admin": {
"encounter": {
1: "Oh? You managed to get this far? You must be quite the trainer.",
2: "That's quite enough of you playing hero, kid.",
3: "I'll show you how scary an angry adult can be!"
},
"victory": {
1: "No! Forgive me Giovanni!",
2: "How could this be?",
3: "Urgh... You were too strong..."
},
},
"magma_grunt": {
"encounter": {
1: " If you get in the way of Team Magma, dont expect any mercy!"
@ -398,6 +410,18 @@ export const PGMdialogue: DialogueTranslationEntries = {
1: "Huh? I lost?!"
},
},
"magma_admin": {
"encounter": {
1: "Hehehe! So you've come all the way here! But you're too late!",
2: "You're going to meddle in Team Magma's affairs? You're so cute you're disgusting! I'll put you down kiddy!",
3: "I'm going to give you a little taste of pain! Resign yourself to it!"
},
"victory": {
1: "Hehehe... So I lost...",
2: "You're disgustingly strong!",
3: "Ahahaha! Ouch!"
},
},
"aqua_grunt": {
"encounter": {
1: "No one who crosses Team Aqua gets any mercy, not even kids!"
@ -406,6 +430,18 @@ export const PGMdialogue: DialogueTranslationEntries = {
1: "You're kidding me!"
},
},
"aqua_admin": {
"encounter": {
1: "I'm a cut above the grunts you've seen so far. I'm going to puvlerize you!",
2: "Hahn? What's this? Who's this spoiled brat?",
3: "What are you doing here? Did you follow us?"
},
"victory": {
1: "So I lost too...",
2: "Ahhh?! Did I go too easy on you?!",
3: "Wh-what was that?"
},
},
"galactic_grunt": {
"encounter": {
1: "Don't mess with Team Galactic!"
@ -414,6 +450,18 @@ export const PGMdialogue: DialogueTranslationEntries = {
1: "Shut down..."
},
},
"galactic_admin": {
"encounter": {
1: "I'm one of Team Galactic's Commanders.",
2: "Anything that opposes Team Galactic must be crushed! Even the very thought of opposition will not be tolerated!",
3: "What's the matter? Don't tell me you're shaking?"
},
"victory": {
1: "This can't be?! I lost?! You... you uppity brat!",
2: "You, my friend, are tough!",
3: "Losing to some child... Being careless cost me too much."
},
},
"plasma_grunt": {
"encounter": {
1: "We won't tolerate people who have different ideas!"
@ -422,6 +470,18 @@ export const PGMdialogue: DialogueTranslationEntries = {
1: "Plasmaaaaaaaaa!"
},
},
"plasma_sage": {
"encounter": {
1: "You could become a threat to Team Plasma, so we will eliminate you here!",
2: "Oh, for crying out loud... I didn't expect to have to fight!",
3: "You're an impressive Trainer to have made it this far."
},
"victory": {
1: "Ghetsis...",
2: "It's bitter cold. I'm shivering. I'm suffering.",
3: "Hmph. You're a smarter Trainer than I expected."
},
},
"flare_grunt": {
"encounter": {
1: "Fashion is most important to us!"
@ -430,6 +490,18 @@ export const PGMdialogue: DialogueTranslationEntries = {
1: "The future doesn't look bright for me."
},
},
"flare_admin": {
"encounter": {
1: "Ah ha ha! It would be my pleasure. Come on, little Trainer! Let's see what you've got!",
2: "Hmm... You're more powerful than you look. I wonder how much energy there is inside you.",
3: "I've been waiting for you! I need to do a little research on you! Come, let us begin!"
},
"victory": {
1: "You're quite strong. Oh yes-very strong, indeed.",
2: "Ding-ding-ding! Yup, you did it! To the victor goes the spoils!",
3: "Wonderful! Amazing! You have tremendous skill and bravery!"
},
},
"rocket_boss_giovanni_1": {
"encounter": {
1: "So! I must say, I am impressed you got here!"

View File

@ -7,6 +7,7 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales";
*/
export const starterSelectUiHandler: SimpleTranslationEntries = {
"confirmStartTeam": "使用這些寶可夢開始嗎?",
"confirmExit": "Do you want to exit?",
"invalidParty": "此為無效隊伍!",
"gen1": "I",
"gen2": "II",

View File

@ -120,21 +120,32 @@ export const trainerClasses: SimpleTranslationEntries = {
"workers": "工人組合",
"youngster": "短褲小子",
"rocket_grunts": "火箭队手下們",
"rocket_admin": "Rocket Admin",
"rocket_admin_female": "Rocket Admin",
"magma_grunt": "熔岩队手下",
"magma_grunt_female": "熔岩队手下",
"magma_grunts": "熔岩队手下們",
"magma_admin": "Magma Admin",
"magma_admin_female": "Magma Admin",
"aqua_grunt": "海洋队手下",
"aqua_grunt_female": "海洋队手下",
"aqua_grunts": "海洋队手下們",
"aqua_admin": "Aqua Admin",
"aqua_admin_female": "Aqua Admin",
"galactic_grunt": "银河队手下",
"galactic_grunt_female": "银河队手下",
"galactic_grunts": "银河队手下們",
"galactic_admin": "Galactic Admin",
"galactic_admin_female": "Galactic Admin",
"plasma_grunt": "等离子队手下",
"plasma_grunt_female": "等离子队手下",
"plasma_grunts": "等离子队手下們",
"plasma_sage": "Plasma Sage",
"flare_grunt": "闪焰队手下",
"flare_grunt_female": "闪焰队手下",
"flare_grunts": "闪焰队手下們",
"flare_admin": "Flare Admin",
"flare_admin_female": "Flare Admin",
} as const;
// Names of special trainers like gym leaders, elite four, and the champion

View File

@ -1392,10 +1392,7 @@ export class SummonPhase extends PartyMemberPokemonPhase {
// First check if they're somehow still in play, if so remove them.
if (partyMember.isOnField()) {
partyMember.hideInfo();
partyMember.setVisible(false);
this.scene.field.remove(partyMember);
this.scene.triggerPokemonFormChange(partyMember, SpeciesFormChangeActiveTrigger, true);
partyMember.leaveField();
}
const party = this.getParty();
@ -1611,7 +1608,7 @@ export class SwitchSummonPhase extends SummonPhase {
})
);
this.scene.playSound("pb_rel");
pokemon.hideInfo();
pokemon.hideInfo(); // this is also done by pokemon.leaveField(), but needs to go earlier for animation purposes
pokemon.tint(getPokeballTintColor(pokemon.pokeball), 1, 250, "Sine.easeIn");
this.scene.tweens.add({
targets: pokemon,
@ -1619,9 +1616,9 @@ export class SwitchSummonPhase extends SummonPhase {
ease: "Sine.easeIn",
scale: 0.5,
onComplete: () => {
pokemon.setVisible(false);
this.scene.field.remove(pokemon);
this.scene.triggerPokemonFormChange(pokemon, SpeciesFormChangeActiveTrigger, true);
// 250ms delay on leaveField is necessary to avoid calling hideInfo() twice
// and double-animating the stats panel slideout
this.scene.time.delayedCall(250, () => pokemon.leaveField(!this.batonPass));
this.scene.time.delayedCall(750, () => this.switchAndSummon());
}
});
@ -1629,25 +1626,25 @@ export class SwitchSummonPhase extends SummonPhase {
switchAndSummon() {
const party = this.player ? this.getParty() : this.scene.getEnemyParty();
const switchedPokemon = party[this.slotIndex];
const switchedInPokemon = party[this.slotIndex];
this.lastPokemon = this.getPokemon();
applyPreSwitchOutAbAttrs(PreSwitchOutAbAttr, this.lastPokemon);
if (this.batonPass && switchedPokemon) {
(this.player ? this.scene.getEnemyField() : this.scene.getPlayerField()).forEach(enemyPokemon => enemyPokemon.transferTagsBySourceId(this.lastPokemon.id, switchedPokemon.id));
if (!this.scene.findModifier(m => m instanceof SwitchEffectTransferModifier && (m as SwitchEffectTransferModifier).pokemonId === switchedPokemon.id)) {
if (this.batonPass && switchedInPokemon) {
(this.player ? this.scene.getEnemyField() : this.scene.getPlayerField()).forEach(enemyPokemon => enemyPokemon.transferTagsBySourceId(this.lastPokemon.id, switchedInPokemon.id));
if (!this.scene.findModifier(m => m instanceof SwitchEffectTransferModifier && (m as SwitchEffectTransferModifier).pokemonId === switchedInPokemon.id)) {
const batonPassModifier = this.scene.findModifier(m => m instanceof SwitchEffectTransferModifier
&& (m as SwitchEffectTransferModifier).pokemonId === this.lastPokemon.id) as SwitchEffectTransferModifier;
if (batonPassModifier && !this.scene.findModifier(m => m instanceof SwitchEffectTransferModifier && (m as SwitchEffectTransferModifier).pokemonId === switchedPokemon.id)) {
this.scene.tryTransferHeldItemModifier(batonPassModifier, switchedPokemon, false);
if (batonPassModifier && !this.scene.findModifier(m => m instanceof SwitchEffectTransferModifier && (m as SwitchEffectTransferModifier).pokemonId === switchedInPokemon.id)) {
this.scene.tryTransferHeldItemModifier(batonPassModifier, switchedInPokemon, false);
}
}
}
if (switchedPokemon) {
if (switchedInPokemon) {
party[this.slotIndex] = this.lastPokemon;
party[this.fieldIndex] = switchedPokemon;
party[this.fieldIndex] = switchedInPokemon;
const showTextAndSummon = () => {
this.scene.ui.showText(this.player ?
i18next.t("battle:playerGo", { pokemonName: getPokemonNameWithAffix(switchedPokemon) }) :
i18next.t("battle:playerGo", { pokemonName: getPokemonNameWithAffix(switchedInPokemon) }) :
i18next.t("battle:trainerGo", {
trainerName: this.scene.currentBattle.trainer.getName(!(this.fieldIndex % 2) ? TrainerSlot.TRAINER : TrainerSlot.TRAINER_PARTNER),
pokemonName: this.getPokemon().getNameToRender()
@ -1655,8 +1652,8 @@ export class SwitchSummonPhase extends SummonPhase {
);
// Ensure improperly persisted summon data (such as tags) is cleared upon switching
if (!this.batonPass) {
party[this.fieldIndex].resetBattleData();
party[this.fieldIndex].resetSummonData();
switchedInPokemon.resetBattleData();
switchedInPokemon.resetSummonData();
}
this.summon();
};
@ -1876,14 +1873,11 @@ export class TurnInitPhase extends FieldPhase {
this.scene.unshiftPhase(new GameOverPhase(this.scene));
} else if (allowedPokemon.length >= this.scene.currentBattle.getBattlerCount() || (this.scene.currentBattle.double && !allowedPokemon[0].isActive(true))) {
// If there is at least one pokemon in the back that is legal to switch in, force a switch.
p.switchOut(false, true);
p.switchOut(false);
} else {
// If there are no pokemon in the back but we're not game overing, just hide the pokemon.
// This should only happen in double battles.
p.hideInfo();
p.setVisible(false);
this.scene.field.remove(p);
this.scene.triggerPokemonFormChange(p, SpeciesFormChangeActiveTrigger, true);
p.leaveField();
}
if (allowedPokemon.length === 1 && this.scene.currentBattle.double) {
this.scene.unshiftPhase(new ToggleDoublePositionPhase(this.scene, true));

View File

@ -0,0 +1,115 @@
import {afterEach, beforeAll, beforeEach, describe, expect, test, vi} from "vitest";
import Phaser from "phaser";
import GameManager from "#app/test/utils/gameManager";
import overrides from "#app/overrides";
import {
TurnEndPhase,
} from "#app/phases";
import {getMovePosition} from "#app/test/utils/gameManagerUtils";
import { Moves } from "#enums/moves";
import { Species } from "#enums/species";
import { BattleStat } from "#app/data/battle-stat";
const TIMEOUT = 20 * 1000;
// RATIO : HP Cost of Move
const RATIO = 2;
// PREDAMAGE : Amount of extra HP lost
const PREDAMAGE = 15;
describe("Moves - BELLY DRUM", () => {
let phaserGame: Phaser.Game;
let game: GameManager;
beforeAll(() => {
phaserGame = new Phaser.Game({
type: Phaser.HEADLESS,
});
});
afterEach(() => {
game.phaseInterceptor.restoreOg();
});
beforeEach(() => {
game = new GameManager(phaserGame);
vi.spyOn(overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP);
vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SNORLAX);
vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100);
vi.spyOn(overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100);
game.override.moveset([Moves.BELLY_DRUM]);
game.override.enemyMoveset([Moves.SPLASH]);
});
// Bulbapedia Reference: https://bulbapedia.bulbagarden.net/wiki/Belly_Drum_(move)
test("Belly Drum raises the user's Attack to its max, at the cost of 1/2 of its maximum HP",
async() => {
await game.startBattle([Species.MAGIKARP]);
const leadPokemon = game.scene.getPlayerPokemon();
expect(leadPokemon).toBeDefined();
const hpLost = Math.floor(leadPokemon.getMaxHp() / RATIO);
game.doAttack(getMovePosition(game.scene, 0, Moves.BELLY_DRUM));
await game.phaseInterceptor.to(TurnEndPhase);
expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp() - hpLost);
expect(leadPokemon.summonData.battleStats[BattleStat.ATK]).toBe(6);
}, TIMEOUT
);
test("Belly Drum will still take effect if an uninvolved stat is at max",
async() => {
await game.startBattle([Species.MAGIKARP]);
const leadPokemon = game.scene.getPlayerPokemon();
expect(leadPokemon).toBeDefined();
const hpLost = Math.floor(leadPokemon.getMaxHp() / RATIO);
// Here - BattleStat.ATK -> -3 and BattleStat.SPATK -> 6
leadPokemon.summonData.battleStats[BattleStat.ATK] = -3;
leadPokemon.summonData.battleStats[BattleStat.SPATK] = 6;
game.doAttack(getMovePosition(game.scene, 0, Moves.BELLY_DRUM));
await game.phaseInterceptor.to(TurnEndPhase);
expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp() - hpLost);
expect(leadPokemon.summonData.battleStats[BattleStat.ATK]).toBe(6);
expect(leadPokemon.summonData.battleStats[BattleStat.SPATK]).toBe(6);
}, TIMEOUT
);
test("Belly Drum fails if the pokemon's attack stat is at its maximum",
async() => {
await game.startBattle([Species.MAGIKARP]);
const leadPokemon = game.scene.getPlayerPokemon();
expect(leadPokemon).toBeDefined();
leadPokemon.summonData.battleStats[BattleStat.ATK] = 6;
game.doAttack(getMovePosition(game.scene, 0, Moves.BELLY_DRUM));
await game.phaseInterceptor.to(TurnEndPhase);
expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp());
expect(leadPokemon.summonData.battleStats[BattleStat.ATK]).toBe(6);
}, TIMEOUT
);
test("Belly Drum fails if the user's health is less than 1/2",
async() => {
await game.startBattle([Species.MAGIKARP]);
const leadPokemon = game.scene.getPlayerPokemon();
expect(leadPokemon).toBeDefined();
const hpLost = Math.floor(leadPokemon.getMaxHp() / RATIO);
leadPokemon.hp = hpLost - PREDAMAGE;
game.doAttack(getMovePosition(game.scene, 0, Moves.BELLY_DRUM));
await game.phaseInterceptor.to(TurnEndPhase);
expect(leadPokemon.hp).toBe(hpLost - PREDAMAGE);
expect(leadPokemon.summonData.battleStats[BattleStat.ATK]).toBe(0);
}, TIMEOUT
);
});

View File

@ -0,0 +1,136 @@
import {afterEach, beforeAll, beforeEach, describe, expect, test, vi} from "vitest";
import Phaser from "phaser";
import GameManager from "#app/test/utils/gameManager";
import overrides from "#app/overrides";
import {
TurnEndPhase,
} from "#app/phases";
import {getMovePosition} from "#app/test/utils/gameManagerUtils";
import { Moves } from "#enums/moves";
import { Species } from "#enums/species";
import { BattleStat } from "#app/data/battle-stat";
const TIMEOUT = 20 * 1000;
// RATIO : HP Cost of Move
const RATIO = 3;
// PREDAMAGE : Amount of extra HP lost
const PREDAMAGE = 15;
describe("Moves - CLANGOROUS_SOUL", () => {
let phaserGame: Phaser.Game;
let game: GameManager;
beforeAll(() => {
phaserGame = new Phaser.Game({
type: Phaser.HEADLESS,
});
});
afterEach(() => {
game.phaseInterceptor.restoreOg();
});
beforeEach(() => {
game = new GameManager(phaserGame);
vi.spyOn(overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP);
vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SNORLAX);
vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100);
vi.spyOn(overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100);
game.override.moveset([Moves.CLANGOROUS_SOUL]);
game.override.enemyMoveset([Moves.SPLASH]);
});
//Bulbapedia Reference: https://bulbapedia.bulbagarden.net/wiki/Clangorous_Soul_(move)
test("Clangorous Soul raises the user's Attack, Defense, Special Attack, Special Defense and Speed by one stage each, at the cost of 1/3 of its maximum HP",
async() => {
await game.startBattle([Species.MAGIKARP]);
const leadPokemon = game.scene.getPlayerPokemon();
expect(leadPokemon).toBeDefined();
const hpLost = Math.floor(leadPokemon.getMaxHp() / RATIO);
game.doAttack(getMovePosition(game.scene, 0, Moves.CLANGOROUS_SOUL));
await game.phaseInterceptor.to(TurnEndPhase);
expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp() - hpLost);
expect(leadPokemon.summonData.battleStats[BattleStat.ATK]).toBe(1);
expect(leadPokemon.summonData.battleStats[BattleStat.DEF]).toBe(1);
expect(leadPokemon.summonData.battleStats[BattleStat.SPATK]).toBe(1);
expect(leadPokemon.summonData.battleStats[BattleStat.SPDEF]).toBe(1);
expect(leadPokemon.summonData.battleStats[BattleStat.SPD]).toBe(1);
}, TIMEOUT
);
test("Clangorous Soul will still take effect if one or more of the involved stats are not at max",
async() => {
await game.startBattle([Species.MAGIKARP]);
const leadPokemon = game.scene.getPlayerPokemon();
expect(leadPokemon).toBeDefined();
const hpLost = Math.floor(leadPokemon.getMaxHp() / RATIO);
//Here - BattleStat.SPD -> 0 and BattleStat.SPDEF -> 4
leadPokemon.summonData.battleStats[BattleStat.ATK] = 6;
leadPokemon.summonData.battleStats[BattleStat.DEF] = 6;
leadPokemon.summonData.battleStats[BattleStat.SPATK] = 6;
leadPokemon.summonData.battleStats[BattleStat.SPDEF] = 4;
game.doAttack(getMovePosition(game.scene, 0, Moves.CLANGOROUS_SOUL));
await game.phaseInterceptor.to(TurnEndPhase);
expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp() - hpLost);
expect(leadPokemon.summonData.battleStats[BattleStat.ATK]).toBe(6);
expect(leadPokemon.summonData.battleStats[BattleStat.DEF]).toBe(6);
expect(leadPokemon.summonData.battleStats[BattleStat.SPATK]).toBe(6);
expect(leadPokemon.summonData.battleStats[BattleStat.SPDEF]).toBe(5);
expect(leadPokemon.summonData.battleStats[BattleStat.SPD]).toBe(1);
}, TIMEOUT
);
test("Clangorous Soul fails if all stats involved are at max",
async() => {
await game.startBattle([Species.MAGIKARP]);
const leadPokemon = game.scene.getPlayerPokemon();
expect(leadPokemon).toBeDefined();
leadPokemon.summonData.battleStats[BattleStat.ATK] = 6;
leadPokemon.summonData.battleStats[BattleStat.DEF] = 6;
leadPokemon.summonData.battleStats[BattleStat.SPATK] = 6;
leadPokemon.summonData.battleStats[BattleStat.SPDEF] = 6;
leadPokemon.summonData.battleStats[BattleStat.SPD] = 6;
game.doAttack(getMovePosition(game.scene, 0, Moves.CLANGOROUS_SOUL));
await game.phaseInterceptor.to(TurnEndPhase);
expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp());
expect(leadPokemon.summonData.battleStats[BattleStat.ATK]).toBe(6);
expect(leadPokemon.summonData.battleStats[BattleStat.DEF]).toBe(6);
expect(leadPokemon.summonData.battleStats[BattleStat.SPATK]).toBe(6);
expect(leadPokemon.summonData.battleStats[BattleStat.SPDEF]).toBe(6);
expect(leadPokemon.summonData.battleStats[BattleStat.SPD]).toBe(6);
}, TIMEOUT
);
test("Clangorous Soul fails if the user's health is less than 1/3",
async() => {
await game.startBattle([Species.MAGIKARP]);
const leadPokemon = game.scene.getPlayerPokemon();
expect(leadPokemon).toBeDefined();
const hpLost = Math.floor(leadPokemon.getMaxHp() / RATIO);
leadPokemon.hp = hpLost - PREDAMAGE;
game.doAttack(getMovePosition(game.scene, 0, Moves.CLANGOROUS_SOUL));
await game.phaseInterceptor.to(TurnEndPhase);
expect(leadPokemon.hp).toBe(hpLost - PREDAMAGE);
expect(leadPokemon.summonData.battleStats[BattleStat.ATK]).toBe(0);
expect(leadPokemon.summonData.battleStats[BattleStat.DEF]).toBe(0);
expect(leadPokemon.summonData.battleStats[BattleStat.SPATK]).toBe(0);
expect(leadPokemon.summonData.battleStats[BattleStat.SPDEF]).toBe(0);
expect(leadPokemon.summonData.battleStats[BattleStat.SPD]).toBe(0);
}, TIMEOUT
);
});

View File

@ -0,0 +1,124 @@
import {afterEach, beforeAll, beforeEach, describe, expect, test, vi} from "vitest";
import Phaser from "phaser";
import GameManager from "#app/test/utils/gameManager";
import overrides from "#app/overrides";
import {
TurnEndPhase,
} from "#app/phases";
import {getMovePosition} from "#app/test/utils/gameManagerUtils";
import { Moves } from "#enums/moves";
import { Species } from "#enums/species";
import { BattleStat } from "#app/data/battle-stat";
const TIMEOUT = 20 * 1000;
// RATIO : HP Cost of Move
const RATIO = 2;
// PREDAMAGE : Amount of extra HP lost
const PREDAMAGE = 15;
describe("Moves - FILLET AWAY", () => {
let phaserGame: Phaser.Game;
let game: GameManager;
beforeAll(() => {
phaserGame = new Phaser.Game({
type: Phaser.HEADLESS,
});
});
afterEach(() => {
game.phaseInterceptor.restoreOg();
});
beforeEach(() => {
game = new GameManager(phaserGame);
vi.spyOn(overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP);
vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SNORLAX);
vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100);
vi.spyOn(overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100);
game.override.moveset([Moves.FILLET_AWAY]);
game.override.enemyMoveset([Moves.SPLASH]);
});
//Bulbapedia Reference: https://bulbapedia.bulbagarden.net/wiki/fillet_away_(move)
test("Fillet Away raises the user's Attack, Special Attack, and Speed by two stages each, at the cost of 1/2 of its maximum HP",
async() => {
await game.startBattle([Species.MAGIKARP]);
const leadPokemon = game.scene.getPlayerPokemon();
expect(leadPokemon).toBeDefined();
const hpLost = Math.floor(leadPokemon.getMaxHp() / RATIO);
game.doAttack(getMovePosition(game.scene, 0, Moves.FILLET_AWAY));
await game.phaseInterceptor.to(TurnEndPhase);
expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp() - hpLost);
expect(leadPokemon.summonData.battleStats[BattleStat.ATK]).toBe(2);
expect(leadPokemon.summonData.battleStats[BattleStat.SPATK]).toBe(2);
expect(leadPokemon.summonData.battleStats[BattleStat.SPD]).toBe(2);
}, TIMEOUT
);
test("Fillet Away will still take effect if one or more of the involved stats are not at max",
async() => {
await game.startBattle([Species.MAGIKARP]);
const leadPokemon = game.scene.getPlayerPokemon();
expect(leadPokemon).toBeDefined();
const hpLost = Math.floor(leadPokemon.getMaxHp() / RATIO);
//Here - BattleStat.SPD -> 0 and BattleStat.SPATK -> 3
leadPokemon.summonData.battleStats[BattleStat.ATK] = 6;
leadPokemon.summonData.battleStats[BattleStat.SPATK] = 3;
game.doAttack(getMovePosition(game.scene, 0, Moves.FILLET_AWAY));
await game.phaseInterceptor.to(TurnEndPhase);
expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp() - hpLost);
expect(leadPokemon.summonData.battleStats[BattleStat.ATK]).toBe(6);
expect(leadPokemon.summonData.battleStats[BattleStat.SPATK]).toBe(5);
expect(leadPokemon.summonData.battleStats[BattleStat.SPD]).toBe(2);
}, TIMEOUT
);
test("Fillet Away fails if all stats involved are at max",
async() => {
await game.startBattle([Species.MAGIKARP]);
const leadPokemon = game.scene.getPlayerPokemon();
expect(leadPokemon).toBeDefined();
leadPokemon.summonData.battleStats[BattleStat.ATK] = 6;
leadPokemon.summonData.battleStats[BattleStat.SPATK] = 6;
leadPokemon.summonData.battleStats[BattleStat.SPD] = 6;
game.doAttack(getMovePosition(game.scene, 0, Moves.FILLET_AWAY));
await game.phaseInterceptor.to(TurnEndPhase);
expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp());
expect(leadPokemon.summonData.battleStats[BattleStat.ATK]).toBe(6);
expect(leadPokemon.summonData.battleStats[BattleStat.SPATK]).toBe(6);
expect(leadPokemon.summonData.battleStats[BattleStat.SPD]).toBe(6);
}, TIMEOUT
);
test("Fillet Away fails if the user's health is less than 1/2",
async() => {
await game.startBattle([Species.MAGIKARP]);
const leadPokemon = game.scene.getPlayerPokemon();
expect(leadPokemon).toBeDefined();
const hpLost = Math.floor(leadPokemon.getMaxHp() / RATIO);
leadPokemon.hp = hpLost - PREDAMAGE;
game.doAttack(getMovePosition(game.scene, 0, Moves.FILLET_AWAY));
await game.phaseInterceptor.to(TurnEndPhase);
expect(leadPokemon.hp).toBe(hpLost - PREDAMAGE);
expect(leadPokemon.summonData.battleStats[BattleStat.ATK]).toBe(0);
expect(leadPokemon.summonData.battleStats[BattleStat.SPATK]).toBe(0);
expect(leadPokemon.summonData.battleStats[BattleStat.SPD]).toBe(0);
}, TIMEOUT
);
});

View File

@ -151,8 +151,9 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
private filterBarContainer: Phaser.GameObjects.Container;
private filterBar: FilterBar;
private shinyOverlay: Phaser.GameObjects.Image;
private starterContainer: StarterContainer[] = [];
private starterContainers: StarterContainer[] = [];
private filteredStarterContainers: StarterContainer[] = [];
private validStarterContainers: StarterContainer[] = [];
private pokemonNumberText: Phaser.GameObjects.Text;
private pokemonSprite: Phaser.GameObjects.Sprite;
private pokemonNameText: Phaser.GameObjects.Text;
@ -536,7 +537,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
const starterContainer = new StarterContainer(this.scene, species).setVisible(false);
this.iconAnimHandler.addOrUpdate(starterContainer.icon, PokemonIconAnimMode.NONE);
this.starterContainer.push(starterContainer);
this.starterContainers.push(starterContainer);
starterBoxContainer.add(starterContainer);
}
@ -820,7 +821,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
this.starterSelectContainer.setVisible(true);
this.allSpecies.forEach((species, s) => {
const icon = this.starterContainer[s].icon;
const icon = this.starterContainers[s].icon;
const dexEntry = this.scene.gameData.dexData[species.speciesId];
if (dexEntry.caughtAttr) {
@ -1062,14 +1063,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
success = true;
this.updateInstructions();
} else {
this.blockInput = true;
this.scene.clearPhaseQueue();
if (this.scene.gameMode.isChallenge) {
this.scene.pushPhase(new SelectChallengePhase(this.scene));
} else {
this.scene.pushPhase(new TitlePhase(this.scene));
}
this.scene.getCurrentPhase().end();
this.tryExit();
success = true;
}
} else if (this.startCursorObj.visible) { // this checks to see if the start button is selected
@ -1956,14 +1950,31 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
updateStarters = () => {
this.scrollCursor = 0;
this.filteredStarterContainers = [];
this.validStarterContainers = [];
this.pokerusCursorObjs.forEach(cursor => cursor.setVisible(false));
this.starterCursorObjs.forEach(cursor => cursor.setVisible(false));
this.filterBar.updateFilterLabels();
// pre filter for challenges
if (this.scene.gameMode.modeId === GameModes.CHALLENGE) {
console.log("this.scene.gameMode.modeId", this.scene.gameMode.modeId);
this.starterContainers.forEach(container => {
const isValidForChallenge = new Utils.BooleanHolder(true);
Challenge.applyChallenges(this.scene.gameMode, Challenge.ChallengeType.STARTER_CHOICE, container.species, isValidForChallenge, this.scene.gameData.getSpeciesDexAttrProps(container.species, this.scene.gameData.getSpeciesDefaultDexAttr(container.species, false, true)), true);
if (isValidForChallenge.value) {
this.validStarterContainers.push(container);
} else {
container.setVisible(false);
}
});
} else {
this.validStarterContainers = this.starterContainers;
}
// filter
this.starterContainer.forEach(container => {
this.validStarterContainers.forEach(container => {
container.setVisible(false);
container.cost = this.scene.gameData.getSpeciesStarterValue(container.species.speciesId);
@ -2275,12 +2286,12 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
const dexAttr = this.scene.gameData.getSpeciesDefaultDexAttr(this.lastSpecies, false, true);
const props = this.scene.gameData.getSpeciesDexAttrProps(this.lastSpecies, dexAttr);
const speciesIndex = this.allSpecies.indexOf(this.lastSpecies);
const lastSpeciesIcon = this.starterContainer[speciesIndex].icon;
const lastSpeciesIcon = this.starterContainers[speciesIndex].icon;
this.checkIconId(lastSpeciesIcon, this.lastSpecies, props.female, props.formIndex, props.shiny, props.variant);
this.iconAnimHandler.addOrUpdate(lastSpeciesIcon, PokemonIconAnimMode.NONE);
// Resume the animation for the previously selected species
const icon = this.starterContainer[speciesIndex].icon;
const icon = this.starterContainers[speciesIndex].icon;
this.scene.tweens.getTweensOf(icon).forEach(tween => tween.resume());
}
@ -2376,7 +2387,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
// Pause the animation when the species is selected
const speciesIndex = this.allSpecies.indexOf(species);
const icon = this.starterContainer[speciesIndex].icon;
const icon = this.starterContainers[speciesIndex].icon;
if (this.isUpgradeAnimationEnabled()) {
this.scene.tweens.getTweensOf(icon).forEach(tween => tween.pause());
@ -2813,7 +2824,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
/** Used to detect if this pokemon is registered in starter */
const speciesStarterDexEntry = this.scene.gameData.dexData[this.allSpecies[s].speciesId];
/** {@linkcode Phaser.GameObjects.Sprite} object of Pokémon for setting the alpha value */
const speciesSprite = this.starterContainer[s].icon;
const speciesSprite = this.starterContainers[s].icon;
/**
* If remainValue greater than or equal pokemon species and the pokemon is legal for this challenge, the user can select.
@ -2862,6 +2873,32 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
return true;
}
tryExit(): boolean {
this.blockInput = true;
const ui = this.getUi();
const cancel = () => {
ui.setMode(Mode.STARTER_SELECT);
this.clearText();
this.blockInput = false;
};
ui.showText(i18next.t("starterSelectUiHandler:confirmExit"), null, () => {
ui.setModeWithoutClear(Mode.CONFIRM, () => {
ui.setMode(Mode.STARTER_SELECT);
this.scene.clearPhaseQueue();
if (this.scene.gameMode.isChallenge) {
this.scene.pushPhase(new SelectChallengePhase(this.scene));
} else {
this.scene.pushPhase(new TitlePhase(this.scene));
}
this.clearText();
this.scene.getCurrentPhase().end();
}, cancel, null, null, 19);
});
return true;
}
tryStart(manualTrigger: boolean = false): boolean {
if (!this.starterSpecies.length) {
return false;