diff --git a/src/battle-scene.ts b/src/battle-scene.ts index f3705815230..a81c485dd24 100644 --- a/src/battle-scene.ts +++ b/src/battle-scene.ts @@ -857,7 +857,7 @@ export default class BattleScene extends SceneBase { return false; } // Evil team no longer shows up after beating the boss - if (waveIndex > 105) { + if (waveIndex >= 105) { return false; } // Evil team always spawns leading up to the boss diff --git a/src/battle.ts b/src/battle.ts index 580bad9a508..fab1676b0f3 100644 --- a/src/battle.ts +++ b/src/battle.ts @@ -312,8 +312,12 @@ export const fixedBattles: FixedBattleConfigs = { .setGetTrainerFunc(scene => new Trainer(scene, TrainerType.RIVAL_3, scene.gameData.gender === PlayerGender.MALE ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT)), [95]: new FixedBattleConfig().setBattleType(BattleType.TRAINER) .setGetTrainerFunc(scene => new Trainer(scene, TrainerType.RIVAL_4, scene.gameData.gender === PlayerGender.MALE ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT)), + [105]: new FixedBattleConfig().setBattleType(BattleType.TRAINER) + .setGetTrainerFunc(scene => new Trainer(scene, TrainerType.ROCKET_BOSS_GIOVANNI_1, TrainerVariant.DEFAULT)), [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) + .setGetTrainerFunc(scene => new Trainer(scene, TrainerType.ROCKET_BOSS_GIOVANNI_2, TrainerVariant.DEFAULT)), [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.RIKA, TrainerType.CRISPIN ])), [184]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(182) diff --git a/src/data/dialogue.ts b/src/data/dialogue.ts index 93c1a12e50f..9682a4ad57a 100644 --- a/src/data/dialogue.ts +++ b/src/data/dialogue.ts @@ -478,6 +478,26 @@ export const trainerTypeDialogue = { ] } ], + [TrainerType.ROCKET_BOSS_GIOVANNI_1]: [ + { + encounter: [ + `So! I must say, I am impressed you got here!` + ], + victory: [ + `You only won since my abilities are (N)` + ] + } + ], + [TrainerType.ROCKET_BOSS_GIOVANNI_2]: [ + { + encounter: [ + `For your insolence, you will feel a world of pain!` + ], + victory: [ + `How is this possible...?` + ] + } + ], [TrainerType.BROCK]: { encounter: [ `My expertise on Rock-type Pokémon will take you down! Come on!`, diff --git a/src/data/enums/trainer-type.ts b/src/data/enums/trainer-type.ts index 72538bf5367..6c1962b46d1 100644 --- a/src/data/enums/trainer-type.ts +++ b/src/data/enums/trainer-type.ts @@ -51,6 +51,8 @@ export enum TrainerType { WORKER, YOUNGSTER, ROCKET_GRUNT, + ROCKET_BOSS_GIOVANNI_1, + ROCKET_BOSS_GIOVANNI_2, MAGMA_GRUNT, AQUA_GRUNT, GALACTIC_GRUNT, diff --git a/src/data/trainer-config.ts b/src/data/trainer-config.ts index b7e24691f52..8208ae5a595 100644 --- a/src/data/trainer-config.ts +++ b/src/data/trainer-config.ts @@ -276,6 +276,10 @@ 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; } return trainerType; @@ -402,7 +406,8 @@ export class TrainerConfig { if (!getIsInitialized()) { initI18n(); } - + this.setPartyTemplates(trainerPartyTemplates.RIVAL_5); + console.log(signatureSpecies); signatureSpecies.forEach((speciesPool, s) => { if (!Array.isArray(speciesPool)) { speciesPool = [speciesPool]; @@ -419,12 +424,8 @@ export class TrainerConfig { this.setMoneyMultiplier(2.5); this.setBoss(); this.setStaticParty(); - this.setBattleBgm('battle_unova_gym'); - this.setVictoryBgm('victory_gym'); - // this.setGenModifiersFunc(party => { - // const waveIndex = party[0].scene.currentBattle.waveIndex; - // return getRandomTeraModifiers(party, waveIndex >= 100 ? 1 : 0, specialtyTypes.length ? specialtyTypes : null); - // }); + this.setBattleBgm('battle_unova_gym'); // TODO: change + this.setVictoryBgm('victory_gym'); // TODO: change return this; } @@ -841,6 +842,7 @@ export const trainerConfigs: TrainerConfigs = { [TrainerPoolTier.SUPER_RARE]: [Species.NOIVERN], [TrainerPoolTier.ULTRA_RARE]: [] }), + [TrainerType.BROCK]: new TrainerConfig((t = TrainerType.BROCK)).initForGymLeader([ Species.GEODUDE, Species.ONIX ], Type.ROCK).setBattleBgm('battle_kanto_gym'), [TrainerType.MISTY]: new TrainerConfig(++t).initForGymLeader([ Species.STARYU, Species.PSYDUCK ], Type.WATER).setBattleBgm('battle_kanto_gym'), [TrainerType.LT_SURGE]: new TrainerConfig(++t).initForGymLeader([ Species.VOLTORB, Species.PIKACHU, Species.ELECTABUZZ ], Type.ELECTRIC).setBattleBgm('battle_kanto_gym'), @@ -1032,8 +1034,43 @@ 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.GIOVANNI).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, Species.WUGTRIO])) + .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, 3); + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.MASTER_BALL; + })), }; + + (function () { initTrainerTypeDialogue(); })(); diff --git a/src/locales/en/trainers.ts b/src/locales/en/trainers.ts index 9a30a0bb6b0..08271a70fe2 100644 --- a/src/locales/en/trainers.ts +++ b/src/locales/en/trainers.ts @@ -9,6 +9,7 @@ export const titles: SimpleTranslationEntries = { "rival": "Rival", "professor": "Professor", "frontier_brain": "Frontier Brain", + "rocket_boss": "Team Rocket 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; @@ -253,4 +254,6 @@ export const trainerNames: SimpleTranslationEntries = { "leon": "Leon", "rival": "Finn", "rival_female": "Ivy", + "rocket_boss_giovanni_1": "Giovanni", + "rocket_boss_giovanni_2": "Giovanni", } as const;