[Feature] Add evil teams assets (#1577)

* Fix tinted caught icon false positive

* Remove unused import

* Rename and optimize

* Block comment

* Draft of evil team grunt pokemon pools

* Add graphics and music

* Add grunt spawn logic

* Add Giovanni

* Add team leader graphics

Giovanni and Ghetsis already have sprites, so they do not need added.

* Add teams for other evil team bosses

* Fix some typos and change hp bars to 2/2/2

* Fix sprites and add random team boss

* Add forced grunt encounter and update dialogue

* Update locales

* also lint en trainers

* More merge conflicts

* Deleted some duplicate images

* Correctly renamed the grunt files

* Forgot about team rocket

* New Magma Sprites

* Adjusted the trimming. Now they dont have as huge of a shadow bbelow them

* Fix grunt sprites

* Add real dialogue

* German Localization of the Dialogue

* Changes

* Tweak waves grunts spawn on

* Fix some typos in dialogue

* Y is canon

* Disable evil team spawns

* Fix another merge conflict

---------

Co-authored-by: Madmadness65 <blaze.the.fireman@gmail.com>
Co-authored-by: Jannik Tappert <tappertjannik@googlemail.com>
This commit is contained in:
Tempoanon 2024-06-09 19:02:29 -04:00 committed by GitHub
parent 7ce209dd02
commit f6ad30b58f
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
44 changed files with 1689 additions and 4 deletions

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,41 @@
{
"textures": [
{
"image": "aqua_grunt_f.png",
"format": "RGBA8888",
"size": {
"w": 71,
"h": 71
},
"scale": 1,
"frames": [
{
"filename": "0001.png",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 80,
"h": 80
},
"spriteSourceSize": {
"x": 22,
"y": 8,
"w": 36,
"h": 71
},
"frame": {
"x": 0,
"y": 0,
"w": 36,
"h": 71
}
}
]
}
],
"meta": {
"app": "https://www.codeandweb.com/texturepacker",
"version": "3.0",
"smartupdate": "$TexturePacker:SmartUpdate:6db25cb5753163d19bca8e2db45849ae:7d8f51509862bfdf8a78bf42dd0005cd:af0aa9494be37941522487032b556989$"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 767 B

View File

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 787 B

View File

@ -0,0 +1,41 @@
{
"textures": [
{
"image": "archie.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": 21,
"y": 0,
"w": 42,
"h": 80
},
"frame": {
"x": 0,
"y": 0,
"w": 42,
"h": 80
}
}
]
}
],
"meta": {
"app": "https://www.codeandweb.com/texturepacker",
"version": "3.0",
"smartupdate": "$TexturePacker:SmartUpdate:bfa7fdd7b6ac9be68dc9dc562fb8339f:06f87a279450b21b19294ba956b69c26:4b7980be4e3ac1d20c9eaf970913ec63$"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@ -0,0 +1,41 @@
{
"textures": [
{
"image": "cyrus.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": 15,
"y": 0,
"w": 48,
"h": 80
},
"frame": {
"x": 0,
"y": 0,
"w": 48,
"h": 80
}
}
]
}
],
"meta": {
"app": "https://www.codeandweb.com/texturepacker",
"version": "3.0",
"smartupdate": "$TexturePacker:SmartUpdate:5fc65535a23867fca7511cc9d7fc15b3:f328e97821f4faffcbca155cc2c5dc2c:55da82f1e1919212896c9c96b682cbd1$"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 857 B

View File

@ -0,0 +1,41 @@
{
"textures": [
{
"image": "flare_grunt_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": 31,
"y": 0,
"w": 23,
"h": 80
},
"frame": {
"x": 0,
"y": 0,
"w": 23,
"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: 613 B

View File

@ -0,0 +1,41 @@
{
"textures": [
{
"image": "flare_grunt_m.png",
"format": "RGBA8888",
"size": {
"w": 77,
"h": 77
},
"scale": 1,
"frames": [
{
"filename": "0001.png",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 80,
"h": 80
},
"spriteSourceSize": {
"x": 24,
"y": 2,
"w": 31,
"h": 77
},
"frame": {
"x": 0,
"y": 0,
"w": 31,
"h": 77
}
}
]
}
],
"meta": {
"app": "https://www.codeandweb.com/texturepacker",
"version": "3.0",
"smartupdate": "$TexturePacker:SmartUpdate:a26606e70778f88a1a7053b2f2420dde:84abf0d0f6bc90c6a60f660567b2d641:adc35a4070bac9fe828c2605a3b15744$"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 662 B

View File

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 805 B

View File

@ -0,0 +1,41 @@
{
"textures": [
{
"image": "galactic_grunt_m.png",
"format": "RGBA8888",
"size": {
"w": 73,
"h": 73
},
"scale": 1,
"frames": [
{
"filename": "0001.png",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 80,
"h": 80
},
"spriteSourceSize": {
"x": 20,
"y": 6,
"w": 37,
"h": 73
},
"frame": {
"x": 0,
"y": 0,
"w": 37,
"h": 73
}
}
]
}
],
"meta": {
"app": "https://www.codeandweb.com/texturepacker",
"version": "3.0",
"smartupdate": "$TexturePacker:SmartUpdate:856b85bb5d7a1ea2e7a76708ebf82d21:1687dff972369c6248e4aa5b0795fe62:259dd316440c335df5dc6008166d69ca$"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 762 B

View File

@ -0,0 +1,41 @@
{
"textures": [
{
"image": "lysandre.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": 14,
"y": 0,
"w": 52,
"h": 80
},
"frame": {
"x": 0,
"y": 0,
"w": 52,
"h": 80
}
}
]
}
],
"meta": {
"app": "https://www.codeandweb.com/texturepacker",
"version": "3.0",
"smartupdate": "$TexturePacker:SmartUpdate:6b887c8bab74885a1b05f2b382759db6:ba102d9d25ddd794a3a17f029b971daf:e6066149f6ec4ccb9fc28faea3d64a7f$"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 797 B

View File

@ -0,0 +1,41 @@
{
"textures": [
{
"image": "magma_grunt_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": 10,
"y": 0,
"w": 60,
"h": 80
},
"frame": {
"x": 10,
"y": 0,
"w": 60,
"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: 727 B

View File

@ -0,0 +1,41 @@
{
"textures": [
{
"image": "magma_grunt_m.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": 10,
"y": 0,
"w": 60,
"h": 80
},
"frame": {
"x": 10,
"y": 0,
"w": 60,
"h": 80
}
}
]
}
],
"meta": {
"app": "https://www.codeandweb.com/texturepacker",
"version": "3.0",
"smartupdate": "$TexturePacker:SmartUpdate:96aa833d987a01bcdcb6f0e7809f5daf:791cce8d026f92b2e52f0b66df8b8e11:35532fd5d9aea30957d50d06f2d2f9a6$"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 756 B

View File

@ -0,0 +1,41 @@
{
"textures": [
{
"image": "maxie.png",
"format": "RGBA8888",
"size": {
"w": 79,
"h": 79
},
"scale": 1,
"frames": [
{
"filename": "0001.png",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 80,
"h": 80
},
"spriteSourceSize": {
"x": 20,
"y": 0,
"w": 35,
"h": 79
},
"frame": {
"x": 0,
"y": 0,
"w": 35,
"h": 79
}
}
]
}
],
"meta": {
"app": "https://www.codeandweb.com/texturepacker",
"version": "3.0",
"smartupdate": "$TexturePacker:SmartUpdate:a943a18803f18065ae5f19e5089c83bb:33a1c168d314f5fb32f9b34244201178:54a227d24523907b8adf8e907821dcd9$"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 794 B

View File

@ -0,0 +1,41 @@
{
"textures": [
{
"image": "plasma_grunt_f.png",
"format": "RGBA8888",
"size": {
"w": 75,
"h": 75
},
"scale": 1,
"frames": [
{
"filename": "0001.png",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 80,
"h": 80
},
"spriteSourceSize": {
"x": 21,
"y": 4,
"w": 37,
"h": 75
},
"frame": {
"x": 0,
"y": 0,
"w": 37,
"h": 75
}
}
]
}
],
"meta": {
"app": "https://www.codeandweb.com/texturepacker",
"version": "3.0",
"smartupdate": "$TexturePacker:SmartUpdate:c3001e18f1878c01a4825697200e823e:2003e0d4db249f7020c3471872198ac8:b01645b9e941158814978f2126e7e995$"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 764 B

View File

@ -0,0 +1,41 @@
{
"textures": [
{
"image": "plasma_grunt_m.png",
"format": "RGBA8888",
"size": {
"w": 72,
"h": 72
},
"scale": 1,
"frames": [
{
"filename": "0001.png",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 80,
"h": 80
},
"spriteSourceSize": {
"x": 16,
"y": 7,
"w": 47,
"h": 72
},
"frame": {
"x": 0,
"y": 0,
"w": 47,
"h": 72
}
}
]
}
],
"meta": {
"app": "https://www.codeandweb.com/texturepacker",
"version": "3.0",
"smartupdate": "$TexturePacker:SmartUpdate:61f195ebbcde93ab7442408edad7fe7a:28ae203b3cb42a94c4ba4420fdebdccc:9ae0ee174d431d48052a2f6b74e9d40c$"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 914 B

View File

@ -0,0 +1,41 @@
{
"textures": [
{
"image": "rocket_grunt_f.png",
"format": "RGBA8888",
"size": {
"w": 67,
"h": 67
},
"scale": 1,
"frames": [
{
"filename": "0001.png",
"rotated": false,
"trimmed": false,
"sourceSize": {
"w": 80,
"h": 80
},
"spriteSourceSize": {
"x": 18,
"y": 9,
"w": 50,
"h": 67
},
"frame": {
"x": 0,
"y": 0,
"w": 50,
"h": 67
}
}
]
}
],
"meta": {
"app": "https://www.codeandweb.com/texturepacker",
"version": "3.0",
"smartupdate": "$TexturePacker:SmartUpdate:f2e4df704ed3262efeba03b98c4f34b6:856ea7816491331f96e020076871263b:fadb24d665ba1be4d210fe9064954d5b$"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 718 B

View File

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 677 B

View File

@ -1820,6 +1820,8 @@ export default class BattleScene extends SceneBase {
return 13.940;
case "end_summit": //PMD RTDX Sky Tower Summit
return 30.025;
case "battle_plasma_grunt": //BW Team Plasma Battle
return 12.974;
}
return 0;

View File

@ -423,7 +423,14 @@ function getRandomTrainerFunc(trainerPool: (TrainerType | TrainerType[])[]): Get
export interface FixedBattleConfigs {
[key: integer]: FixedBattleConfig
}
/**
* Youngster/Lass on 5
* Rival on 8, 55, 95, 145, 195
* Evil team grunts on 35, 62, 64, 65, 112, 114 (Not currently spawning)
* Evil leader on 115, 165 (Not currently spawning)
* E4 on 182, 184, 186, 188
* Champion on 190
*/
export const classicFixedBattles: FixedBattleConfigs = {
[5]: new FixedBattleConfig().setBattleType(BattleType.TRAINER)
.setGetTrainerFunc(scene => new Trainer(scene, TrainerType.YOUNGSTER, Utils.randSeedInt(2) ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT)),
@ -431,12 +438,28 @@ export const classicFixedBattles: FixedBattleConfigs = {
.setGetTrainerFunc(scene => new Trainer(scene, TrainerType.RIVAL, scene.gameData.gender === PlayerGender.MALE ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT)),
[25]: new FixedBattleConfig().setBattleType(BattleType.TRAINER)
.setGetTrainerFunc(scene => new Trainer(scene, TrainerType.RIVAL_2, scene.gameData.gender === PlayerGender.MALE ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT)),
// [35]: new FixedBattleConfig().setBattleType(BattleType.TRAINER)
// .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_GRUNT, TrainerType.MAGMA_GRUNT, TrainerType.AQUA_GRUNT, TrainerType.GALACTIC_GRUNT, TrainerType.PLASMA_GRUNT, TrainerType.FLARE_GRUNT ])),
[55]: new FixedBattleConfig().setBattleType(BattleType.TRAINER)
.setGetTrainerFunc(scene => new Trainer(scene, TrainerType.RIVAL_3, scene.gameData.gender === PlayerGender.MALE ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT)),
// [62]: 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 ])),
// [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 ])),
// [65]: 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 ])),
[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 ])),
// [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 ])),
// [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)
.setGetTrainerFunc(scene => new Trainer(scene, TrainerType.RIVAL_5, scene.gameData.gender === PlayerGender.MALE ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT)),
// [165]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(35)
// .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_BOSS_GIOVANNI_2, TrainerType.MAXIE_2, TrainerType.ARCHIE_2, TrainerType.CYRUS_2, TrainerType.GHETSIS_2, TrainerType.LYSANDRE_2 ])),
[182]: new FixedBattleConfig().setBattleType(BattleType.TRAINER)
.setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.LORELEI, TrainerType.WILL, TrainerType.SIDNEY, TrainerType.AARON, TrainerType.SHAUNTAL, TrainerType.MALVA, [ TrainerType.HALA, TrainerType.MOLAYNE ], TrainerType.MARNIE_ELITE, TrainerType.RIKA, TrainerType.CRISPIN ])),
[184]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(182)

View File

@ -449,6 +449,222 @@ export const trainerTypeDialogue: TrainerTypeDialogue = {
]
}
],
[TrainerType.ROCKET_GRUNT]: [
{
encounter: [
"dialogue:rocket_grunt.encounter.1"
],
victory: [
"dialogue:rocket_grunt.victory.1"
]
}
],
[TrainerType.MAGMA_GRUNT]: [
{
encounter: [
"dialogue:magma_grunt.encounter.1"
],
victory: [
"dialogue:magma_grunt.victory.1"
]
}
],
[TrainerType.AQUA_GRUNT]: [
{
encounter: [
"dialogue:aqua_grunt.encounter.1"
],
victory: [
"dialogue:aqua_grunt.victory.1"
]
}
],
[TrainerType.GALACTIC_GRUNT]: [
{
encounter: [
"dialogue:galactic_grunt.encounter.1"
],
victory: [
"dialogue:galactic_grunt.victory.1"
]
}
],
[TrainerType.PLASMA_GRUNT]: [
{
encounter: [
"dialogue:plasma_grunt.encounter.1"
],
victory: [
"dialogue:plasma_grunt.victory.1"
]
}
],
[TrainerType.FLARE_GRUNT]: [
{
encounter: [
"dialogue:flare_grunt.encounter.1"
],
victory: [
"dialogue:flare_grunt.victory.1"
]
}
],
[TrainerType.ROCKET_BOSS_GIOVANNI_1]: [
{
encounter: [
"dialogue:rocket_boss_giovanni_1.encounter.1"
],
victory: [
"dialogue:rocket_boss_giovanni_1.victory.1"
],
defeat: [
"dialogue:rocket_boss_giovanni_1.defeat.1"
]
}
],
[TrainerType.ROCKET_BOSS_GIOVANNI_2]: [
{
encounter: [
"dialogue:rocket_boss_giovanni_2.encounter.1"
],
victory: [
"dialogue:rocket_boss_giovanni_2.victory.1"
],
defeat: [
"dialogue:rocket_boss_giovanni_2.defeat.1"
]
}
],
[TrainerType.MAXIE]: [
{
encounter: [
"dialogue:magma_boss_maxie_1.encounter.1"
],
victory: [
"dialogue:magma_boss_maxie_1.victory.1"
],
defeat: [
"dialogue:magma_boss_maxie_1.defeat.1"
]
}
],
[TrainerType.MAXIE_2]: [
{
encounter: [
"dialogue:magma_boss_maxie_2.encounter.1"
],
victory: [
"dialogue:magma_boss_maxie_2.victory.1"
],
defeat: [
"dialogue:magma_boss_maxie_2.defeat.1"
]
}
],
[TrainerType.ARCHIE]: [
{
encounter: [
"dialogue:aqua_boss_archie_1.encounter.1"
],
victory: [
"dialogue:aqua_boss_archie_1.victory.1"
],
defeat: [
"dialogue:aqua_boss_archie_1.defeat.1"
]
}
],
[TrainerType.ARCHIE_2]: [
{
encounter: [
"dialogue:aqua_boss_archie_2.encounter.1"
],
victory: [
"dialogue:aqua_boss_archie_2.victory.1"
],
defeat: [
"dialogue:aqua_boss_archie_2.defeat.1"
]
}
],
[TrainerType.CYRUS]: [
{
encounter: [
"dialogue:galactic_boss_cyrus_1.encounter.1"
],
victory: [
"dialogue:galactic_boss_cyrus_1.victory.1"
],
defeat: [
"dialogue:galactic_boss_cyrus_1.defeat.1"
]
}
],
[TrainerType.CYRUS_2]: [
{
encounter: [
"dialogue:galactic_boss_cyrus_2.encounter.1"
],
victory: [
"dialogue:galactic_boss_cyrus_2.victory.1"
],
defeat: [
"dialogue:galactic_boss_cyrus_2.defeat.1"
]
}
],
[TrainerType.GHETSIS]: [
{
encounter: [
"dialogue:plasma_boss_ghetsis_1.encounter.1"
],
victory: [
"dialogue:plasma_boss_ghetsis_1.victory.1"
],
defeat: [
"dialogue:plasma_boss_ghetsis_1.defeat.1"
]
}
],
[TrainerType.GHETSIS_2]: [
{
encounter: [
"dialogue:plasma_boss_ghetsis_2.encounter.1"
],
victory: [
"dialogue:plasma_boss_ghetsis_2.victory.1"
],
defeat: [
"dialogue:plasma_boss_ghetsis_2.defeat.1"
]
}
],
[TrainerType.LYSANDRE]: [
{
encounter: [
"dialogue:flare_boss_lysandre_1.encounter.1"
],
victory: [
"dialogue:flare_boss_lysandre_1.victory.1"
],
defeat: [
"dialogue:flare_boss_lysandre_1.defeat.1"
]
}
],
[TrainerType.LYSANDRE_2]: [
{
encounter: [
"dialogue:flare_boss_lysandre_2.encounter.1"
],
victory: [
"dialogue:flare_boss_lysandre_2.victory.1"
],
defeat: [
"dialogue:flare_boss_lysandre_2.defeat.1"
]
}
],
[TrainerType.BROCK]: {
encounter: [
"dialogue:brock.encounter.1",

View File

@ -52,6 +52,24 @@ export enum TrainerType {
WAITER,
WORKER,
YOUNGSTER,
ROCKET_GRUNT,
MAGMA_GRUNT,
AQUA_GRUNT,
GALACTIC_GRUNT,
PLASMA_GRUNT,
FLARE_GRUNT,
ROCKET_BOSS_GIOVANNI_1,
ROCKET_BOSS_GIOVANNI_2,
MAXIE,
MAXIE_2,
ARCHIE,
ARCHIE_2,
CYRUS,
CYRUS_2,
GHETSIS,
GHETSIS_2,
LYSANDRE,
LYSANDRE_2,
BROCK = 200,
MISTY,

View File

@ -295,6 +295,25 @@ export class TrainerConfig {
case TrainerType.LARRY_ELITE:
trainerType = TrainerType.LARRY;
break;
case TrainerType.ROCKET_BOSS_GIOVANNI_1:
case TrainerType.ROCKET_BOSS_GIOVANNI_2:
trainerType = TrainerType.GIOVANNI;
break;
case TrainerType.MAXIE_2:
trainerType = TrainerType.MAXIE;
break;
case TrainerType.ARCHIE_2:
trainerType = TrainerType.ARCHIE;
break;
case TrainerType.CYRUS_2:
trainerType = TrainerType.CYRUS;
break;
case TrainerType.GHETSIS_2:
trainerType = TrainerType.GHETSIS;
break;
case TrainerType.LYSANDRE_2:
trainerType = TrainerType.LYSANDRE;
break;
case TrainerType.MARNIE_ELITE:
trainerType = TrainerType.MARNIE;
break;
@ -508,6 +527,40 @@ export class TrainerConfig {
return this;
}
/**
* Initializes the trainer configuration for an evil team leader. Temporarily hardcoding evil leader teams though.
* @param {Species | Species[]} signatureSpecies - The signature species for the evil team leader.
* @param {Type[]} specialtyTypes - The specialty types for the evil team Leader.
* @returns {TrainerConfig} - The updated TrainerConfig instance.
* **/
initForEvilTeamLeader(title: string, signatureSpecies: (Species | Species[])[], ...specialtyTypes: Type[]): TrainerConfig {
if (!getIsInitialized()) {
initI18n();
}
this.setPartyTemplates(trainerPartyTemplates.RIVAL_5);
console.log(signatureSpecies);
signatureSpecies.forEach((speciesPool, s) => {
if (!Array.isArray(speciesPool)) {
speciesPool = [speciesPool];
}
this.setPartyMemberFunc(-(s + 1), getRandomPartyMemberFunc(speciesPool));
});
if (specialtyTypes.length) {
this.setSpeciesFilter(p => specialtyTypes.find(t => p.isOfType(t)) !== undefined);
this.setSpecialtyTypes(...specialtyTypes);
}
const nameForCall = this.name.toLowerCase().replace(/\s/g, "_");
this.name = i18next.t(`trainerNames:${nameForCall}`);
this.setTitle(title);
this.setMoneyMultiplier(2.5);
this.setBoss();
this.setStaticParty();
this.setBattleBgm("battle_unova_gym"); // TODO: change
this.setVictoryBgm("victory_gym"); // TODO: change
return this;
}
/**
* Initializes the trainer configuration for a Gym Leader.
* @param {Species | Species[]} signatureSpecies - The signature species for the Gym Leader.
@ -761,6 +814,34 @@ interface TrainerConfigs {
[key: integer]: TrainerConfig
}
/**
* The function to get variable strength grutns
* @param scene the singleton scene being passed in
* @returns the correct TrainerPartyTemplate
*/
function getEvilGruntPartyTemplate(scene: BattleScene): TrainerPartyTemplate {
const waveIndex = scene.currentBattle?.waveIndex;
if (waveIndex < 40) {
return trainerPartyTemplates.TWO_AVG;
} else if (waveIndex < 80) {
switch (waveIndex) {
case 62:
return trainerPartyTemplates.THREE_AVG;
case 64:
return trainerPartyTemplates.TWO_AVG_ONE_STRONG;
case 65:
return trainerPartyTemplates.GYM_LEADER_4; // 3avg 1 strong 1 stronger
}
} else {
switch (waveIndex) {
case 112:
return trainerPartyTemplates.GYM_LEADER_4; // 3avg 1 strong 1 stronger
case 114:
return trainerPartyTemplates.GYM_LEADER_5; // 3 avg 2 strong 1 stronger
}
}
}
function getWavePartyTemplate(scene: BattleScene, ...templates: TrainerPartyTemplate[]) {
return templates[Math.min(Math.max(Math.ceil((scene.gameMode.getWaveForDifficulty(scene.currentBattle?.waveIndex || startingWave, true) - 20) / 30), 0), templates.length - 1)];
}
@ -1103,6 +1184,54 @@ export const trainerConfigs: TrainerConfigs = {
.setSpeciesPools(
[Species.CATERPIE, Species.WEEDLE, Species.RATTATA, Species.SENTRET, Species.POOCHYENA, Species.ZIGZAGOON, Species.WURMPLE, Species.BIDOOF, Species.PATRAT, Species.LILLIPUP]
),
[TrainerType.ROCKET_GRUNT]: new TrainerConfig(++t).setHasGenders("Rocket Grunt Female").setHasDouble("Rocket Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene))
.setSpeciesPools({
[TrainerPoolTier.COMMON]: [ Species.WEEDLE, Species.RATTATA, Species.EKANS, Species.SANDSHREW, Species.ZUBAT, Species.GEODUDE, Species.KOFFING],
[TrainerPoolTier.UNCOMMON]: [Species.GRIMER, Species.CUBONE, Species.ODDISH, Species.GROWLITHE, Species.MURKROW, Species.GASTLY, Species.EXEGGCUTE, Species.VOLTORB],
[TrainerPoolTier.RARE]: [Species.GYARADOS, Species.TAUROS, Species.SCYTHER],
[TrainerPoolTier.SUPER_RARE]: [Species.PORYGON, Species.ALOLA_RATTATA, Species.ALOLA_SANDSHREW, Species.ALOLA_MEOWTH, Species.ALOLA_GRIMER, Species.ALOLA_GEODUDE],
[TrainerPoolTier.ULTRA_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").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene))
.setSpeciesPools({
[TrainerPoolTier.COMMON]: [Species.SLUGMA, Species.POOCHYENA, Species.NUMEL, Species.ZIGZAGOON, Species.DIGLETT, Species.MAGBY],
[TrainerPoolTier.UNCOMMON]: [Species.PHANPY, Species.SWINUB, Species.GLIGAR, Species.TORKOAL, Species.BALTOY, Species.BARBOACH],
[TrainerPoolTier.RARE]: [Species.SOLROCK, Species.HIPPOPOTAS, Species.SANDACONDA],
[TrainerPoolTier.SUPER_RARE]: [Species.TRAPINCH, Species.HEATMOR],
[TrainerPoolTier.ULTRA_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").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene))
.setSpeciesPools({
[TrainerPoolTier.COMMON]: [ Species.CARVANHA, Species.WAILMER, Species.ZIGZAGOON, Species.LOTAD, Species.CORPHISH],
[TrainerPoolTier.UNCOMMON]: [Species.SPHEAL, Species.CHINCHOU, Species.WOOPER, Species.WINGULL, Species.TENTACOOL ],
[TrainerPoolTier.RARE]: [Species.CLAMPERL, Species.REMORAID, Species.ARROKUDA],
[TrainerPoolTier.SUPER_RARE]: [Species.MANTINE, Species.BASCULEGION],
[TrainerPoolTier.ULTRA_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").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene))
.setSpeciesPools({
[TrainerPoolTier.COMMON]: [ Species.GLAMEOW, Species.STUNKY, Species.CROAGUNK, Species.SHINX, Species.WURMPLE],
[TrainerPoolTier.UNCOMMON]: [Species.BRONZOR, Species.DRIFLOON, Species.BURMY],
[TrainerPoolTier.RARE]: [Species.CARNIVINE],
[TrainerPoolTier.SUPER_RARE]: [Species.HISUI_GROWLITHE, Species.HISUI_QWILFISH, Species.HISUI_SNEASEL],
[TrainerPoolTier.ULTRA_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").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene))
.setSpeciesPools({
[TrainerPoolTier.COMMON]: [ Species.PATRAT, Species.LILLIPUP, Species.PURRLOIN, Species.SCRAFTY, Species.WOOBAT, Species.VANILLITE],
[TrainerPoolTier.UNCOMMON]: [ Species.FRILLISH, Species.VENIPEDE, Species.SANDILE, Species.TRUBBISH, Species.GOLETT],
[TrainerPoolTier.RARE]: [Species.TIMBURR, Species.DARUMAKA, Species.AMOONGUSS, Species.DRILBUR, Species.KLINK, Species.VULLABY],
[TrainerPoolTier.SUPER_RARE]: [Species.PAWNIARD, Species.VULLABY, Species.DRUDDIGON, Species.BOUFFALANT, Species.ZORUA],
[TrainerPoolTier.ULTRA_RARE]: [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").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene))
.setSpeciesPools({
[TrainerPoolTier.COMMON]: [ Species.FLETCHLING, Species.LITLEO, Species.PONYTA, Species.INKAY, Species.HOUNDOUR, Species.SKORUPI],
[TrainerPoolTier.UNCOMMON]: [Species.HELIOPTILE, Species.ELECTRIKE, Species.SKRELP, Species.GULPIN],
[TrainerPoolTier.RARE]: [Species.LITWICK, Species.SNEASEL],
[TrainerPoolTier.SUPER_RARE]: [Species.NOIVERN],
[TrainerPoolTier.ULTRA_RARE]: []
}),
[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"),
@ -1316,7 +1445,6 @@ export const trainerConfigs: TrainerConfigs = {
p.generateAndPopulateMoveset();
})),
[TrainerType.RIVAL]: new TrainerConfig((t = TrainerType.RIVAL)).setName("Finn").setHasGenders("Ivy").setHasCharSprite().setTitle("Rival").setStaticParty().setEncounterBgm(TrainerType.RIVAL).setBattleBgm("battle_rival").setPartyTemplates(trainerPartyTemplates.RIVAL)
.setModifierRewardFuncs(() => modifierTypes.SUPER_EXP_CHARM, () => modifierTypes.EXP_SHARE)
.setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE, Species.CHIKORITA, Species.CYNDAQUIL, Species.TOTODILE, Species.TREECKO, Species.TORCHIC, Species.MUDKIP, Species.TURTWIG, Species.CHIMCHAR, Species.PIPLUP, Species.SNIVY, Species.TEPIG, Species.OSHAWOTT, Species.CHESPIN, Species.FENNEKIN, Species.FROAKIE, Species.ROWLET, Species.LITTEN, Species.POPPLIO, Species.GROOKEY, Species.SCORBUNNY, Species.SOBBLE, Species.SPRIGATITO, Species.FUECOCO, Species.QUAXLY], TrainerSlot.TRAINER, true))
@ -1381,4 +1509,211 @@ export const trainerConfigs: TrainerConfigs = {
const starter = party[0];
return [modifierTypes.TERA_SHARD().generateType(null, [starter.species.type1]).withIdFromFunc(modifierTypes.TERA_SHARD).newModifier(starter) as PersistentModifier];
}),
[TrainerType.ROCKET_BOSS_GIOVANNI_1]: new TrainerConfig(t = TrainerType.ROCKET_BOSS_GIOVANNI_1).setName("Giovanni").initForEvilTeamLeader("Rocket Boss",[])
.setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.PERSIAN , Species.ALOLA_PERSIAN]))
.setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.NIDOKING , Species.NIDOQUEEN ]))
.setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.RHYPERIOR ]))
.setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.DUGTRIO, Species.ALOLA_DUGTRIO ]))
.setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.MAROWAK , Species.ALOLA_MAROWAK]))
.setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.KANGASKHAN ], TrainerSlot.TRAINER, true, p => {
p.setBoss(true, 2);
p.generateAndPopulateMoveset();
p.pokeball = PokeballType.ULTRA_BALL;
p.formIndex = 1;
})),
[TrainerType.ROCKET_BOSS_GIOVANNI_2]: new TrainerConfig(++t).setName("Giovanni").initForEvilTeamLeader("Rocket Boss", [])
.setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.TYRANITAR , Species.IRON_THORNS], TrainerSlot.TRAINER, true, p => {
p.setBoss(true, 2);
p.generateAndPopulateMoveset();
p.pokeball = PokeballType.ULTRA_BALL;
}))
.setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.EXCADRILL ]))
.setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.HIPPOWDON ]))
.setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.KANGASKHAN ], TrainerSlot.TRAINER, true, p => {
p.setBoss(true, 2);
p.generateAndPopulateMoveset();
p.pokeball = PokeballType.ULTRA_BALL;
p.formIndex = 1;
}))
.setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.GASTRODON]))
.setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.MEWTWO ], TrainerSlot.TRAINER, true, p => {
p.setBoss(true, 2);
p.generateAndPopulateMoveset();
p.pokeball = PokeballType.MASTER_BALL;
})),
[TrainerType.MAXIE]: new TrainerConfig(++t).setName("Maxie").initForEvilTeamLeader("Magma Boss",[])
.setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.MIGHTYENA ]))
.setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.CROBAT, Species.GLISCOR ]))
.setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.WEEZING, Species.GALAR_WEEZING ]))
.setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.MAGMORTAR, Species.TORKOAL ]))
.setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.FLYGON]))
.setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.CAMERUPT ], TrainerSlot.TRAINER, true, p => {
p.setBoss(true, 2);
p.generateAndPopulateMoveset();
p.pokeball = PokeballType.ULTRA_BALL;
p.formIndex = 1;
})),
[TrainerType.MAXIE_2]: new TrainerConfig(++t).setName("Maxie").initForEvilTeamLeader("Magma Boss",[])
.setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.SOLROCK, Species.HOUNDOOM ], TrainerSlot.TRAINER, true, p => {
p.setBoss(true, 2);
p.generateAndPopulateMoveset();
p.pokeball = PokeballType.ULTRA_BALL;
}))
.setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.GREAT_TUSK ]))
.setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.SHIFTRY, Species.SCOVILLAIN ], TrainerSlot.TRAINER, true, p => {
p.generateAndPopulateMoveset();
p.abilityIndex = 0; // Chlorophyll
}))
.setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.TORKOAL, Species.NINETALES ], TrainerSlot.TRAINER, true, p => {
p.generateAndPopulateMoveset();
p.abilityIndex = 2; // DROUGHT
}))
.setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.GROUDON ], TrainerSlot.TRAINER, true, p => {
p.setBoss(true, 2);
p.generateAndPopulateMoveset();
p.pokeball = PokeballType.MASTER_BALL;
}))
.setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.CAMERUPT ], TrainerSlot.TRAINER, true, p => {
p.setBoss(true, 2);
p.generateAndPopulateMoveset();
p.pokeball = PokeballType.ULTRA_BALL;
p.formIndex = 1;
})),
[TrainerType.ARCHIE]: new TrainerConfig(++t).setName("Archie").initForEvilTeamLeader("Aqua Boss",[])
.setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.LINOONE ]))
.setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.CROBAT, Species.PELIPPER ]))
.setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.MUK, Species.ALOLA_MUK ]))
.setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.TENTACRUEL ]))
.setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.RELICANTH, Species.WAILORD ]))
.setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.SHARPEDO ], TrainerSlot.TRAINER, true, p => {
p.setBoss(true, 2);
p.generateAndPopulateMoveset();
p.pokeball = PokeballType.ULTRA_BALL;
p.formIndex = 1;
})),
[TrainerType.ARCHIE_2]: new TrainerConfig(++t).setName("Archie").initForEvilTeamLeader("Aqua Boss",[])
.setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.KINGDRA, Species.LUDICOLO ], TrainerSlot.TRAINER, true, p => {
p.setBoss(true, 2);
p.generateAndPopulateMoveset();
p.pokeball = PokeballType.ULTRA_BALL;
}))
.setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.BEARTIC, Species.ARMALDO ], TrainerSlot.TRAINER, true, p => {
p.generateAndPopulateMoveset();
p.abilityIndex = 2; // Swift Swim
}))
.setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.HUNTAIL, Species.GOREBYSS ], TrainerSlot.TRAINER, true, p => {
p.generateAndPopulateMoveset();
p.abilityIndex = 0; // Swift Swim
}))
.setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.POLITOED, Species.PELIPPER ], TrainerSlot.TRAINER, true, p => {
p.generateAndPopulateMoveset();
p.abilityIndex = 2; // Drizzle
}))
.setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.KYOGRE ], TrainerSlot.TRAINER, true, p => {
p.setBoss(true, 2);
p.generateAndPopulateMoveset();
p.pokeball = PokeballType.MASTER_BALL;
}))
.setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.SHARPEDO ], TrainerSlot.TRAINER, true, p => {
p.setBoss(true, 2);
p.generateAndPopulateMoveset();
p.pokeball = PokeballType.ULTRA_BALL;
p.formIndex = 1;
})),
[TrainerType.CYRUS]: new TrainerConfig(++t).setName("Cyrus").initForEvilTeamLeader("Galactic Boss",[])
.setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.GYARADOS, Species.BASCULEGION ]))
.setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.HONCHKROW, Species.HISUI_BRAVIARY ]))
.setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.CROBAT, Species.OVERQWIL ]))
.setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.AZELF, Species.UXIE, Species.MESPRIT ]))
.setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.HOUNDOOM ], TrainerSlot.TRAINER, true, p => {
p.generateAndPopulateMoveset();
p.pokeball = PokeballType.ULTRA_BALL;
p.formIndex = 1;
}))
.setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.WEAVILE ], TrainerSlot.TRAINER, true, p => {
p.setBoss(true, 2);
p.generateAndPopulateMoveset();
p.pokeball = PokeballType.ULTRA_BALL;
})),
[TrainerType.CYRUS_2]: new TrainerConfig(++t).setName("Cyrus").initForEvilTeamLeader("Galactic Boss",[])
.setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.AZELF, Species.UXIE, Species.MESPRIT ], TrainerSlot.TRAINER, true, p => {
p.setBoss(true, 2);
p.generateAndPopulateMoveset();
}))
.setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.ELECTRODE, Species.HISUI_ELECTRODE ]))
.setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.SALAMENCE, Species.ROARING_MOON ]))
.setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.HISUI_ZOROARK ]))
.setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.DARKRAI ], TrainerSlot.TRAINER, true, p => {
p.setBoss(true, 2);
p.generateAndPopulateMoveset();
p.pokeball = PokeballType.MASTER_BALL;
}))
.setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.WEAVILE ], TrainerSlot.TRAINER, true, p => {
p.setBoss(true, 2);
p.generateAndPopulateMoveset();
p.pokeball = PokeballType.ULTRA_BALL;
})),
[TrainerType.GHETSIS]: new TrainerConfig(++t).setName("Ghetsis").initForEvilTeamLeader("Plasma Boss",[])
.setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.COFAGRIGUS, Species.RUNERIGUS ]))
.setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.BOUFFALANT ]))
.setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.SEISMITOAD, Species.CARRACOSTA ]))
.setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.EELEKTROSS, Species.GALVANTULA ]))
.setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.VOLCARONA ]))
.setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.HYDREIGON ], TrainerSlot.TRAINER, true, p => {
p.setBoss(true, 2);
p.generateAndPopulateMoveset();
p.pokeball = PokeballType.ULTRA_BALL;
})),
[TrainerType.GHETSIS_2]: new TrainerConfig(++t).setName("Ghetsis").initForEvilTeamLeader("Plasma Boss",[])
.setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.SLITHER_WING, Species.IRON_MOTH ], TrainerSlot.TRAINER, true, p => {
p.setBoss(true, 2);
p.generateAndPopulateMoveset();
p.pokeball = PokeballType.ULTRA_BALL;
}))
.setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.DURANT ]))
.setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.DARMANITAN, Species.GALAR_DARMANITAN ]))
.setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.KINGAMBIT ]))
.setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.KYUREM ], TrainerSlot.TRAINER, true, p => {
p.setBoss(true, 2);
p.generateAndPopulateMoveset();
p.pokeball = PokeballType.MASTER_BALL;
}))
.setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.HYDREIGON, Species.IRON_JUGULIS ], TrainerSlot.TRAINER, true, p => {
p.setBoss(true, 2);
p.generateAndPopulateMoveset();
p.pokeball = PokeballType.ULTRA_BALL;
})),
[TrainerType.LYSANDRE]: new TrainerConfig(++t).setName("Lysandre").initForEvilTeamLeader("Flare Boss",[])
.setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.MIENSHAO ]))
.setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.HONCHKROW, Species.TALONFLAME ]))
.setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.PYROAR ]))
.setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.MILOTIC ]))
.setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.HELIOLISK ]))
.setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.GYARADOS ], TrainerSlot.TRAINER, true, p => {
p.setBoss(true, 2);
p.generateAndPopulateMoveset();
p.pokeball = PokeballType.ULTRA_BALL;
p.formIndex = 1;
})),
[TrainerType.LYSANDRE_2]: new TrainerConfig(++t).setName("Lysandre").initForEvilTeamLeader("Flare Boss",[])
.setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.SCREAM_TAIL, Species.FLUTTER_MANE ], TrainerSlot.TRAINER, true, p => {
p.setBoss(true, 2);
p.generateAndPopulateMoveset();
p.pokeball = PokeballType.ULTRA_BALL;
}))
.setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.GHOLDENGO, Species.AEGISLASH ]))
.setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.PYROAR ]))
.setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.GOODRA, Species.HISUI_GOODRA ]))
.setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.YVELTAL ], TrainerSlot.TRAINER, true, p => {
p.setBoss(true, 2);
p.generateAndPopulateMoveset();
p.pokeball = PokeballType.MASTER_BALL;
}))
.setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.GYARADOS ], TrainerSlot.TRAINER, true, p => {
p.setBoss(true, 2);
p.generateAndPopulateMoveset();
p.pokeball = PokeballType.ULTRA_BALL;
p.formIndex = 1;
})),
};

View File

@ -122,6 +122,14 @@ 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")) {
// 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);
// Since grunts are not named we can just return the title
return title;
}
// If the trainer has a name (not null or undefined).
if (this.name) {
// If the title should be included.

View File

@ -367,6 +367,17 @@ export const PGMdialogue: DialogueTranslationEntries = {
1: "Ich werde für das nächste Rennen tunen."
},
},
"rocket_grunt": {
"encounter": {
1: `Jetzt gibt es Ärger!…
$und es kommt noch härter!
$Wir wollen über die Erde regieren
$und naja du kennst den Rest!`
},
"victory": {
1: "Das war mal wieder ein Schuss in den Ofen!"
},
},
"firebreather": {
"encounter": {
1: "Meine Flammen werden dich verschlingen!",
@ -391,6 +402,190 @@ export const PGMdialogue: DialogueTranslationEntries = {
3: "Ich glaube, ich bin der der seekrank ist..."
},
},
"magma_grunt": {
"encounter": {
1: "Keiner, der sich Team Magma in den Weg stellt, bekommt Gnade, nicht einmal Kinder!"
},
"victory": {
1: "Wie kann das sein? Ich bin Teil vom mächtigen Team Magma! Wir wollen doch nur die Welt verbessern…"
},
},
"aqua_grunt": {
"encounter": {
1: "Du willst dich also mit Team Aqua anlegen? Du traust dich ja was… Dich werfe ich über Bord!",
},
"victory": {
1: "Vielleicht sollte ich wohl lieber selber über die Planke gehen…",
},
},
"galactic_grunt": {
"encounter": {
1: "Team Galaktik wird die Welt in eine bessere Welt verwandeln! Und du wirst uns nicht aufhalten!"
},
"victory": {
1: "Zyrus wird uns für diese Niederlage bestrafen…"
},
},
"plasma_grunt": {
"encounter": {
1: "Pokémon sollten frei sein! Team Plasma wird sie befreien!"
},
"victory": {
1: "Wie konnte ich verlieren? Ich dachte, ich würde die Welt retten…"
},
},
"flare_grunt": {
"encounter": {
1: `Ich bin ein Mitglied von Team Flare! Das sieht man mir doch an. Mein Stil ist unverkennbar!
$Du kannst definitiv ein Umstyling gebrauchen!`
},
"victory": {
1: "Stil ist wohl doch nicht alles…"
},
},
"rocket_boss_giovanni_1": {
"encounter": {
1: `Ich bin beeindruckt, du hast es bis hierher geschafft!
$Ich bin Giovanni, der Anführer von Team Rocket!
$Wir regieren den Untergrund von Kanto!
$Und wir lassen sicherlich nicht zu, dass ein Kind uns aufhält!`
},
"victory": {
1: "Ich ziehe mich zurück, aber ich werde zurückkehren! Team Rocket wird niemals besiegt werden!"
},
"defeat": {
1: `Merke dir meine Worte. Nicht in der Lage zu sein,
$deine eigene Stärke zu messen, zeigt, dass du immer noch ein Kind bist.`
}
},
"rocket_boss_giovanni_2": {
"encounter": {
1: "Du schon wieder… Wie hast du mich gefunden? Team Rocket wird dich endlich aus der Welt schaffen!"
},
"victory": {
1: "Wie ist das möglich...? Der kostbare Traum von Team Rocket ist nicht mehr als eine Illusion geworden..."
},
"defeat": {
1: "Team Rocket wird niemals besiegt werden! Ich werde zurückkehren!"
}
},
"magma_boss_maxie_1": {
"encounter": {
1: `Die Welt ist nicht perfekt. Ich werde sie verbessern, indem ich sie neu erschaffe!
$Wir brauchen mehr Landmassen um zu leben! Team Magma wird dieses Ziel mit aller Macht erreichen!`
},
"victory": {
1:"Ugh! Das entspricht nicht meinen Berechnungen! Wie konnte ich verlieren? Wir sehen uns wieder!"
},
"defeat": {
1: "Team Magma wird weiterhin die Welt verbessern!"
}
},
"magma_boss_maxie_2": {
"encounter": {
1: `Du bist das letzte Hindernis, das zwischen mir und meinen Zielen steht.
$Mach dich bereit durch die Macht von Team Magma besiegt zu werden!`
},
"victory": {
1: "Das... Das kann nicht sein...",
},
"defeat": {
1: "Und jetzt werde ich diesen Planeten terraformen, um ihn ideal für die Menschheit zu machen."
}
},
"aqua_boss_archie_1": {
"encounter": {
1: "Ich bin Adrian, der Anführer von Team Aqua! Wir werden die Welt mit Wasser überfluten!"
},
"victory": {
1: "Lass uns mal wieder treffen. Ich werde mir sicher sein, dass ich dieses Gesicht wiedererkenne."
},
"defeat": {
1: "Brilliant! Mein Team wird jetzt nicht zurückhalten!"
}
},
"aqua_boss_archie_2": {
"encounter": {
1: "Ich habe lange auf diesen Tag gewartet. Das ist die wahre Macht von Team Aqua!"
},
"victory": {
1: "So habe ich mir das nicht vorgestellt..."
},
"defeat": {
1: "Ich werde alles in dieser Welt in seinen ursprünglichen, reinen Zustand zurückversetzen!!"
}
},
"galactic_boss_cyrus_1": {
"encounter": {
1: `Du wurdest von leerer Gefühlsduselei hierher getrieben.
$Ich werde dich bereuen lassen, auf dein Herz gehört zu haben!`
},
"victory": {
1: "Interessant. Und ziemlich eigenartig."
},
"defeat": {
1: "Ich werde meine neue Welt erschaffen..."
}
},
"galactic_boss_cyrus_2": {
"encounter": {
1: `So sehen wir uns wieder. Es scheint, als wären unsere Schicksale miteinander verflochten.
$Aber hier und jetzt werde ich diese Verbindung brechen!`
},
"victory": {
1: "Wie? Wie? WIE?!"
},
"defeat": {
1: "Bis bald."
}
},
"plasma_boss_ghetsis_1": {
"encounter": {
1:"Ich werde nicht zulassen, dass mich jemand aufhält! Egal wer es auch sein mag!"
},
"victory": {
1: "Wie kann das sein? Ich bin der Schöpfer von Team Plasma! Ich bin perfekt!"
},
"defeat": {
1: "Ich bin der perfekte Herrscher einer perfekten neuen Welt! Mwa ha ha!"
}
},
"plasma_boss_ghetsis_2": {
"encounter": {
1: "Komm schon! Ich will dein Gesicht sehen, in dem Moment, in dem du alle Hoffnung verlierst!"
},
"victory": {
1: "Meine Berechnungen... Nein! Meine sorgfältigen Pläne! Die Welt sollte mir gehören!"
},
"defeat": {
1: "Kyurem! Verwende Absorptionsfusion!"
}
},
"flare_boss_lysandre_1": {
"encounter": {
1: "DU willst mich aufhalten? Dann zeig mir deine Stärke in einem Kampf!"
},
"victory": {
1: `Du bist hier, um mich aufzuhalten. Aber ich bitte dich zu warten.
$Ich bin so kurz davor, meine Vision zu verwirklichen.`
},
"defeat": {
1: "Pokémon... Sollten nicht mehr existieren."
}
},
"flare_boss_lysandre_2": {
"encounter": {
1: `Die Zukunft, die du willst, oder die Zukunft, die ich will...
$Lass uns sehen, welche mehr zu existieren verdient, sollen wir?`
},
"victory": {
1: "Die Zukunft, die ich erschaffen wollte... Es ist vorbei..."
},
"defeat": {
1: "Narren ohne Vision werden weiterhin diese wunderschöne Welt verunreinigen."
}
},
"brock": {
"encounter": {
1: "Meine Expertise in Bezug auf Gesteins-Pokémon wird dich besiegen! Komm schon!",

View File

@ -13,6 +13,12 @@ export const titles: SimpleTranslationEntries = {
"rival": "Rivale",
"professor": "Professor",
"frontier_brain": "Kampfkoryphäen",
"rocket_boss": "Rocket-Boss",
"magma_boss": "Magma-Boss",
"aqua_boss": "Aqua-Boss",
"galactic_boss": "Galaktik-Boss",
"plasma_boss": "Weiser von Team Plasma", // This is on purpose, since "Ghetsis" is never mentioned as the boss of team plasma in the game but as "Weiser"
"flare_boss": "Flare-Boss",
// Maybe if we add the evil teams we can add "Team Rocket" and "Team Aqua" etc. here as well as "Team Rocket Boss" and "Team Aqua Admin" etc.
} as const;
@ -118,7 +124,25 @@ export const trainerClasses: SimpleTranslationEntries = {
"worker": "Arbeiter",
"worker_female": "Arbeiterin",
"workers": "Arbeiter",
"youngster": "Knirps"
"youngster": "Knirps",
"rocket_grunt": "Rüpel von Team Rocket",
"rocket_grunt_female": "Rüpel von Team Rocket",
"rocket_grunts": "Rüpel von Team Rocket",
"magma_grunt": "Rüpel von Team Magma",
"magma_grunt_female": "Rüpel von Team Magma",
"magma_grunts": "Rüpel von Team Magma",
"aqua_grunt": "Rüpel von Team Aqua",
"aqua_grunt_female": "Rüpel von Team Aqua",
"aqua_grunts": "Rüpel von Team Aqua",
"galactic_grunt": "Rüpel von Team Galaktik",
"galactic_grunt_female": "Rüpel von Team Galaktik",
"galactic_grunts": "Rüpel von Team Galaktik",
"plasma_grunt": "Rüpel von Team Plasma",
"plasma_grunt_female": "Rüpel von Team Plasma",
"plasma_grunts": "Rüpel von Team Plasma",
"flare_grunt": "Rüpel von Team Flare",
"flare_grunt_female": "Rüpel von Team Flare",
"flare_grunts": "Rüpel von Team Flare",
} as const;
// Names of special trainers like gym leaders, elite four, and the champion
@ -247,6 +271,11 @@ export const trainerNames: SimpleTranslationEntries = {
"leon": "Delion",
"rival": "Finn",
"rival_female": "Ivy",
"maxie": "Marc",
"archie": "Adrian",
"cyrus": "Zyrus",
"ghetsis": "G-Cis",
"lysandre": "Flordelis",
// Double Names
"blue_red_double": "Blau & Rot",

View File

@ -383,6 +383,186 @@ export const PGMdialogue: DialogueTranslationEntries = {
3: "I think it's me that's seasick..."
},
},
"rocket_grunt": {
"encounter": {
1: "Prepare for trouble!"
},
"victory": {
1: "Team Rocket blasting off again!"
},
},
"magma_grunt": {
"encounter": {
1: " If you get in the way of Team Magma, dont expect any mercy!"
},
"victory": {
1: "Huh? I lost?!"
},
},
"aqua_grunt": {
"encounter": {
1: "No one who crosses Team Aqua gets any mercy, not even kids!"
},
"victory": {
1: "You're kidding me!"
},
},
"galactic_grunt": {
"encounter": {
1: "Don't mess with Team Galactic!"
},
"victory": {
1: "Shut down..."
},
},
"plasma_grunt": {
"encounter": {
1: "We won't tolerate people who have different ideas!"
},
"victory": {
1: "Plasmaaaaaaaaa!"
},
},
"flare_grunt": {
"encounter": {
1: "Fashion is most important to us!"
},
"victory": {
1: "The future doesn't look bright for me."
},
},
"rocket_boss_giovanni_1": {
"encounter": {
1: "So! I must say, I am impressed you got here!"
},
"victory": {
1: "WHAT! This cannot be!"
},
"defeat": {
1: "Mark my words. Not being able to measure your own strength shows that you are still a child."
}
},
"rocket_boss_giovanni_2": {
"encounter": {
1: "My old associates need me... Are you going to get in my way?"
},
"victory": {
1: "How is this possible...?\nThe precious dream of Team Rocket has become little more than an illusion..."
},
"defeat": {
1: "Team Rocket will be reborn again, and I will rule the world!"
}
},
"magma_boss_maxie_1": {
"encounter": {
1: "I will bury you by my own hand. I hope you appreciate this honor!"
},
"victory": {
1: "Ugh! You are... quite capable...\nI fell behind, but only by an inch..."
},
"defeat": {
1: "Team Magma will prevail!"
}
},
"magma_boss_maxie_2": {
"encounter": {
1: "You are the final obstacle remaining between me and my goals.\nBrace yourself for my ultimate attack! Fuhahaha!"
},
"victory": {
1: "This... This is not.. Ngh..."
},
"defeat": {
1: "And now... I will transform this planet to a land ideal for humanity."
}
},
"aqua_boss_archie_1": {
"encounter": {
1: "I'm leader of Team Aqua, so I'm afraid it's the rope's end for you."
},
"victory": {
1: "Let's meet again somewhere. I'll be sure to remember that face."
},
"defeat": {
1: "Brilliant! My team won't hold back now!"
}
},
"aqua_boss_archie_2": {
"encounter": {
1: "I've been waiting so long for this day to come.\nThis is the true power of my team!"
},
"victory": {
1: "Like I figured..."
},
"defeat": {
1: "I'll return everything in this world to its original, pure state!!"
}
},
"galactic_boss_cyrus_1": {
"encounter": {
1: "You were compelled to come here by such vacuous sentimentality\nI will make you regret paying heed to your heart!"
},
"victory": {
1: "Interesting. And quite curious."
},
"defeat": {
1: "I will create my new world..."
}
},
"galactic_boss_cyrus_2": {
"encounter": {
1: "So we meet again. It seems our fates have become intertwined.\nBut here and now, I will finally break that bond!"
},
"victory": {
1: "How? How? HOW?!"
},
"defeat": {
1: "Farewell."
}
},
"plasma_boss_ghetsis_1": {
"encounter": {
1: "I won't allow anyone to stop me! No matter who does what!"
},
"victory": {
1: "How can this be? I'm the creator of Team Plasma! I'm perfect!"
},
"defeat": {
1: "I am the perfect ruler of a perfect new world! Mwa ha ha!"
}
},
"plasma_boss_ghetsis_2": {
"encounter": {
1: "Come now! I want to see your face at the moment you lose all hope!"
},
"victory": {
1: "My calculations... No! My careful schemes! The world should be mine!"
},
"defeat": {
1: "Kyurem! Use Absofusion!"
}
},
"flare_boss_lysandre_1": {
"encounter": {
1: "Do you want to stop me? Show me in battle."
},
"victory": {
1: "You are here to stop me. But I ask you to wait. "
},
"defeat": {
1: "Pokemon...Shall no longer exist."
}
},
"flare_boss_lysandre_2": {
"encounter": {
1: "The future you want, or the future I want... Let us see which one is more deserving, shall we?"
},
"victory": {
1: "Whaugh!"
},
"defeat": {
1: "Fools with no vision will continue to befoul this beautiful world."
}
},
"brock": {
"encounter": {
1: "My expertise on Rock-type Pokémon will take you down! Come on!",

View File

@ -13,6 +13,12 @@ export const titles: SimpleTranslationEntries = {
"rival": "Rival",
"professor": "Professor",
"frontier_brain": "Frontier Brain",
"rocket_boss": "Team Rocket Boss",
"magma_boss": "Team Magma Boss",
"aqua_boss": "Team Aqua Boss",
"galactic_boss": "Team Galactic Boss",
"plasma_boss": "Team Plasma Boss",
"flare_boss": "Team Flare Boss",
// Maybe if we add the evil teams we can add "Team Rocket" and "Team Aqua" etc. here as well as "Team Rocket Boss" and "Team Aqua Admin" etc.
} as const;
@ -118,7 +124,19 @@ export const trainerClasses: SimpleTranslationEntries = {
"worker": "Worker",
"worker_female": "Worker",
"workers": "Workers",
"youngster": "Youngster"
"youngster": "Youngster",
"rocket_grunt": "Rocket Grunt",
"rocket_grunt_female": "Rocket Grunt",
"magma_grunt": "Magma Grunt",
"magma_grunt_female": "Magma Grunt",
"aqua_grunt": "Aqua Grunt",
"aqua_grunt_female": "Aqua Grunt",
"galactic_grunt": "Galactic Grunt",
"galactic_grunt_female": "Galactic Grunt",
"plasma_grunt": "Plasma Grunt",
"plasma_grunt_female": "Plasma Grunt",
"flare_grunt": "Flare Grunt",
"flare_grunt_female": "Flare Grunt",
} as const;
// Names of special trainers like gym leaders, elite four, and the champion
@ -247,6 +265,11 @@ export const trainerNames: SimpleTranslationEntries = {
"leon": "Leon",
"rival": "Finn",
"rival_female": "Ivy",
"maxie": "Maxie",
"archie": "Archie",
"cyrus": "Cyrus",
"ghetsis": "Ghetsis",
"lysandre": "Lysandre",
// Double Names
"blue_red_double": "Blue & Red",