diff --git a/src/@types/rewards.ts b/src/@types/rewards.ts index c4696ba28ed..e6dd7d7e0af 100644 --- a/src/@types/rewards.ts +++ b/src/@types/rewards.ts @@ -44,3 +44,9 @@ export type RewardPool = { export interface RewardPoolWeights { [tier: string]: number[]; } + +export type SilentReward = + | TrainerItemId + | typeof RewardId.VOUCHER + | typeof RewardId.VOUCHER_PLUS + | typeof RewardId.VOUCHER_PREMIUM; diff --git a/src/data/trainers/trainer-config.ts b/src/data/trainers/trainer-config.ts index 14095371f95..1037aaabf10 100644 --- a/src/data/trainers/trainer-config.ts +++ b/src/data/trainers/trainer-config.ts @@ -8,18 +8,17 @@ import { Gender } from "#data/gender"; import type { PokemonSpecies, PokemonSpeciesFilter } from "#data/pokemon-species"; import { AbilityId } from "#enums/ability-id"; import { MoveId } from "#enums/move-id"; -import type { PartyMemberStrength } from "#enums/party-member-strength"; +import { PartyMemberStrength } from "#enums/party-member-strength"; import { PokeballType } from "#enums/pokeball"; import { PokemonType } from "#enums/pokemon-type"; import { SpeciesId } from "#enums/species-id"; import { TeraAIMode } from "#enums/tera-ai-mode"; +import { TrainerItemId } from "#enums/trainer-item-id"; import { TrainerPoolTier } from "#enums/trainer-pool-tier"; import { TrainerSlot } from "#enums/trainer-slot"; import { TrainerType } from "#enums/trainer-type"; import { TrainerVariant } from "#enums/trainer-variant"; import type { EnemyPokemon } from "#field/pokemon"; -import { allRewards } from "#items/all-rewards"; -import type { Reward, RewardGenerator } from "#items/reward"; import { PokemonMove } from "#moves/pokemon-move"; import { getIsInitialized, initI18n } from "#plugins/i18n"; import type { EvilTeam } from "#trainers/evil-admin-trainer-pools"; @@ -29,9 +28,10 @@ import { getGymLeaderPartyTemplate, getWavePartyTemplate, TrainerPartyCompoundTemplate, - type TrainerPartyTemplate, + TrainerPartyTemplate, trainerPartyTemplates, } from "#trainers/trainer-party-template"; +import type { SilentReward } from "#types/rewards"; import type { GenAIFunc, GenTrainerItemsFunc, @@ -109,7 +109,7 @@ export class TrainerConfig { public victoryBgm: string; public genTrainerItemsFunc: GenTrainerItemsFunc; public genAIFuncs: GenAIFunc[] = []; - public rewardFuncs: (Reward | RewardGenerator)[] = []; + public silentRewards: SilentReward[] = []; public partyTemplates: TrainerPartyTemplate[]; public partyTemplateFunc: PartyTemplateFunc; public partyMemberFuncs: PartyMemberFuncs = {}; @@ -501,12 +501,8 @@ export class TrainerConfig { return this; } - setRewardFuncs(...rewardFuncs: (Reward | RewardGenerator)[]): TrainerConfig { - this.rewardFuncs = rewardFuncs.map(func => () => { - const rewardFunc = func(); - const reward = rewardFunc(); - return reward; - }); + setSilentReward(...silentRewards: SilentReward[]): TrainerConfig { + this.silentRewards = silentRewards; return this; } @@ -911,9 +907,9 @@ export class TrainerConfig { clone = this.victoryBgm ? clone.setVictoryBgm(this.victoryBgm) : clone; clone = this.genTrainerItemsFunc ? clone.setGenTrainerItemsFunc(this.genTrainerItemsFunc) : clone; - if (this.rewardFuncs) { + if (this.silentRewards) { // Clones array instead of passing ref - clone.rewardFuncs = this.rewardFuncs.slice(0); + clone.silentRewards = this.silentRewards.slice(0); } if (this.partyTemplates) { @@ -4471,10 +4467,7 @@ export const trainerConfigs: TrainerConfigs = { .setBattleBgm("battle_rival") .setMixedBattleBgm("battle_rival") .setPartyTemplates(trainerPartyTemplates.RIVAL) - .setRewardFuncs( - () => allRewards.SUPER_EXP_CHARM, - () => allRewards.EXP_SHARE, - ) + .setSilentReward(TrainerItemId.SUPER_EXP_CHARM, TrainerItemId.EXP_SHARE) .setPartyMemberFunc( 0, getRandomPartyMemberFunc( @@ -4541,7 +4534,7 @@ export const trainerConfigs: TrainerConfigs = { .setBattleBgm("battle_rival") .setMixedBattleBgm("battle_rival") .setPartyTemplates(trainerPartyTemplates.RIVAL_2) - .setRewardFuncs(() => allRewards.EXP_SHARE) + .setSilentReward(TrainerItemId.EXP_SHARE) .setPartyMemberFunc( 0, getRandomPartyMemberFunc( @@ -4694,7 +4687,7 @@ export const trainerConfigs: TrainerConfigs = { .setBattleBgm("battle_rival_2") .setMixedBattleBgm("battle_rival_2") .setPartyTemplates(trainerPartyTemplates.RIVAL_4) - .setRewardFuncs(() => allRewards.TERA_ORB) + .setSilentReward(TrainerItemId.TERA_ORB) .setPartyMemberFunc( 0, getRandomPartyMemberFunc( diff --git a/src/phases/game-over-reward-phase.ts b/src/phases/game-over-reward-phase.ts index f8a15e05185..ebf7b45b7e3 100644 --- a/src/phases/game-over-reward-phase.ts +++ b/src/phases/game-over-reward-phase.ts @@ -7,15 +7,14 @@ export class GameOverRewardPhase extends RewardPhase { public readonly phaseName = "GameOverRewardPhase"; doReward(): Promise { return new Promise(resolve => { - const newModifier = this.reward.newModifier(); - globalScene.addModifier(newModifier); + globalScene.applyReward(this.reward, {}); // Sound loaded into game as is globalScene.playSound("level_up_fanfare"); globalScene.ui.setMode(UiMode.MESSAGE); globalScene.ui.fadeIn(250).then(() => { globalScene.ui.showText( i18next.t("battle:rewardGain", { - modifierName: newModifier?.type.name, + modifierName: this.reward.name, }), null, () => { diff --git a/src/phases/reward-phase.ts b/src/phases/reward-phase.ts index 6211c627374..1b4183aa6f6 100644 --- a/src/phases/reward-phase.ts +++ b/src/phases/reward-phase.ts @@ -1,6 +1,8 @@ import { globalScene } from "#app/global-scene"; -import type { Reward, RewardGenerator } from "#items/reward"; +import type { Reward } from "#items/reward"; +import { generateRewardOptionFromId } from "#items/reward-utils"; import { BattlePhase } from "#phases/battle-phase"; +import type { SilentReward } from "#types/rewards"; import i18next from "i18next"; export class RewardPhase extends BattlePhase { @@ -9,10 +11,10 @@ export class RewardPhase extends BattlePhase { public readonly phaseName: "RewardPhase" | "RibbonRewardPhase" | "GameOverRewardPhase" = "RewardPhase"; protected reward: Reward; - constructor(rewardFunc: Reward | RewardGenerator) { + constructor(rewardId: SilentReward) { super(); - this.reward = rewardFunc(); + this.reward = generateRewardOptionFromId(rewardId)?.type; } start() { @@ -23,7 +25,7 @@ export class RewardPhase extends BattlePhase { doReward(): Promise { return new Promise(resolve => { - globalScene.applyReward(this.reward); + globalScene.applyReward(this.reward, {}); globalScene.playSound("item_fanfare"); globalScene.ui.showText( i18next.t("battle:rewardGain", { diff --git a/src/phases/ribbon-reward-phase.ts b/src/phases/ribbon-reward-phase.ts index 03c2681f833..1d6c642c438 100644 --- a/src/phases/ribbon-reward-phase.ts +++ b/src/phases/ribbon-reward-phase.ts @@ -1,31 +1,30 @@ import { globalScene } from "#app/global-scene"; import type { PokemonSpecies } from "#data/pokemon-species"; import { UiMode } from "#enums/ui-mode"; -import type { Reward, RewardGenerator } from "#items/reward"; import { RewardPhase } from "#phases/reward-phase"; +import type { SilentReward } from "#types/rewards"; import i18next from "i18next"; export class RibbonRewardPhase extends RewardPhase { public readonly phaseName = "RibbonRewardPhase"; private species: PokemonSpecies; - constructor(rewardFunc: Reward | RewardGenerator, species: PokemonSpecies) { - super(rewardFunc); + constructor(rewardId: SilentReward, species: PokemonSpecies) { + super(rewardId); this.species = species; } doReward(): Promise { return new Promise(resolve => { - const newModifier = this.reward.newModifier(); - globalScene.addModifier(newModifier); + globalScene.applyReward(this.reward, {}); globalScene.playSound("level_up_fanfare"); globalScene.ui.setMode(UiMode.MESSAGE); globalScene.ui.showText( i18next.t("battle:beatModeFirstTime", { speciesName: this.species.name, gameMode: globalScene.gameMode.getName(), - newModifier: newModifier?.type.name, + newModifier: this.reward.name, }), null, () => { diff --git a/src/phases/trainer-item-reward-phase.ts b/src/phases/trainer-item-reward-phase.ts deleted file mode 100644 index 86769636e3e..00000000000 --- a/src/phases/trainer-item-reward-phase.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { globalScene } from "#app/global-scene"; -import { type Reward, RewardGenerator } from "#items/reward"; -import { BattlePhase } from "#phases/battle-phase"; -import i18next from "i18next"; - -export class RewardPhase extends BattlePhase { - // RibbonRewardPhase extends RewardPhase and to make typescript happy - // we need to use a union type here - public readonly phaseName: "RewardPhase" | "RibbonRewardPhase" | "GameOverRewardPhase" = "RewardPhase"; - protected reward: Reward; - - constructor(rewardFunc: Reward | RewardGenerator) { - super(); - - const reward = rewardFunc(); - this.reward = reward instanceof RewardGenerator ? reward.generateReward() : reward; - } - - start() { - super.start(); - - this.doReward().then(() => this.end()); - } - - doReward(): Promise { - return new Promise(resolve => { - globalScene.applyReward(this.reward); - globalScene.playSound("item_fanfare"); - globalScene.ui.showText( - i18next.t("battle:rewardGain", { - modifierName: this.reward.name, - }), - null, - () => resolve(), - null, - true, - ); - }); - } -} diff --git a/src/phases/trainer-victory-phase.ts b/src/phases/trainer-victory-phase.ts index df9026fc536..d4d83f72bbb 100644 --- a/src/phases/trainer-victory-phase.ts +++ b/src/phases/trainer-victory-phase.ts @@ -1,8 +1,8 @@ import { timedEventManager } from "#app/global-event-manager"; import { globalScene } from "#app/global-scene"; -import { allRewards } from "#data/data-lists"; import { getCharVariantFromDialogue } from "#data/dialogue"; import { BiomeId } from "#enums/biome-id"; +import { RewardId } from "#enums/reward-id"; import { TrainerSlot } from "#enums/trainer-slot"; import { TrainerType } from "#enums/trainer-type"; import { BattlePhase } from "#phases/battle-phase"; @@ -20,9 +20,11 @@ export class TrainerVictoryPhase extends BattlePhase { globalScene.phaseManager.unshiftNew("MoneyRewardPhase", globalScene.currentBattle.trainer?.config.moneyMultiplier!); // TODO: is this bang correct? - const rewardFuncs = globalScene.currentBattle.trainer?.config.rewardFuncs!; // TODO: is this bang correct? - for (const rewardFunc of rewardFuncs) { - globalScene.phaseManager.unshiftNew("RewardPhase", rewardFunc); + const silentRewards = globalScene.currentBattle.trainer?.config.silentRewards; // TODO: is this bang correct? + if (silentRewards) { + for (const id of silentRewards) { + globalScene.phaseManager.unshiftNew("RewardPhase", id); + } } const trainerType = globalScene.currentBattle.trainer?.config.trainerType!; // TODO: is this bang correct? @@ -35,14 +37,14 @@ export class TrainerVictoryPhase extends BattlePhase { if (timedEventManager.getUpgradeUnlockedVouchers()) { globalScene.phaseManager.unshiftNew( "RewardPhase", - [allRewards.VOUCHER_PLUS, allRewards.VOUCHER_PLUS, allRewards.VOUCHER_PLUS, allRewards.VOUCHER_PREMIUM][ + [RewardId.VOUCHER_PLUS, RewardId.VOUCHER_PLUS, RewardId.VOUCHER_PLUS, RewardId.VOUCHER_PREMIUM][ vouchers[TrainerType[trainerType]].voucherType ], ); } else { globalScene.phaseManager.unshiftNew( "RewardPhase", - [allRewards.VOUCHER, allRewards.VOUCHER, allRewards.VOUCHER_PLUS, allRewards.VOUCHER_PREMIUM][ + [RewardId.VOUCHER, RewardId.VOUCHER, RewardId.VOUCHER_PLUS, RewardId.VOUCHER_PREMIUM][ vouchers[TrainerType[trainerType]].voucherType ], );