diff --git a/src/@types/rewards.ts b/src/@types/rewards.ts index acf4749a3da..e7d480a88e6 100644 --- a/src/@types/rewards.ts +++ b/src/@types/rewards.ts @@ -2,9 +2,7 @@ import type { HeldItemId } from "#enums/held-item-id"; import type { RewardId } from "#enums/reward-id"; import type { TrainerItemId } from "#enums/trainer-item-id"; import type { Pokemon } from "#field/pokemon"; -import type { Reward, RewardGenerator } from "#items/reward"; -export type RewardFunc = () => Reward | RewardGenerator; export type WeightedRewardWeightFunc = (party: Pokemon[], rerollCount?: number) => number; export type RewardPoolId = RewardId | HeldItemId | TrainerItemId; diff --git a/src/data/data-lists.ts b/src/data/data-lists.ts index a8db163fa69..1099e524564 100644 --- a/src/data/data-lists.ts +++ b/src/data/data-lists.ts @@ -4,9 +4,9 @@ import type { HeldItemId } from "#enums/held-item-id"; import type { RewardId } from "#enums/reward-id"; import type { TrainerItemId } from "#enums/trainer-item-id"; import type { HeldItem } from "#items/held-item"; +import type { Reward, RewardGenerator } from "#items/reward"; import type { TrainerItem } from "#items/trainer-item"; import type { Move } from "#moves/move"; -import type { RewardFunc } from "#types/rewards"; export const allAbilities: Ability[] = []; export const allMoves: Move[] = []; @@ -14,4 +14,4 @@ export const allSpecies: PokemonSpecies[] = []; export const allHeldItems: Record = {}; export const allTrainerItems: Record = {}; -export const allRewards: Record = {}; +export const allRewards: Record = {}; diff --git a/src/items/all-rewards.ts b/src/items/all-rewards.ts index 4ab8def39a1..3fbc131fe04 100644 --- a/src/items/all-rewards.ts +++ b/src/items/all-rewards.ts @@ -34,149 +34,184 @@ import { export function initRewards() { // Pokeball rewards - allRewards[RewardId.POKEBALL] = () => new AddPokeballReward("pb", PokeballType.POKEBALL, 5, RewardId.POKEBALL); - allRewards[RewardId.GREAT_BALL] = () => new AddPokeballReward("gb", PokeballType.GREAT_BALL, 5, RewardId.GREAT_BALL); - allRewards[RewardId.ULTRA_BALL] = () => new AddPokeballReward("ub", PokeballType.ULTRA_BALL, 5, RewardId.ULTRA_BALL); - allRewards[RewardId.ROGUE_BALL] = () => new AddPokeballReward("rb", PokeballType.ROGUE_BALL, 5, RewardId.ROGUE_BALL); - allRewards[RewardId.MASTER_BALL] = () => - new AddPokeballReward("mb", PokeballType.MASTER_BALL, 1, RewardId.MASTER_BALL); + allRewards[RewardId.POKEBALL] = new AddPokeballReward("pb", PokeballType.POKEBALL, 5, RewardId.POKEBALL); + allRewards[RewardId.GREAT_BALL] = new AddPokeballReward("gb", PokeballType.GREAT_BALL, 5, RewardId.GREAT_BALL); + allRewards[RewardId.ULTRA_BALL] = new AddPokeballReward("ub", PokeballType.ULTRA_BALL, 5, RewardId.ULTRA_BALL); + allRewards[RewardId.ROGUE_BALL] = new AddPokeballReward("rb", PokeballType.ROGUE_BALL, 5, RewardId.ROGUE_BALL); + allRewards[RewardId.MASTER_BALL] = new AddPokeballReward("mb", PokeballType.MASTER_BALL, 1, RewardId.MASTER_BALL); // Voucher rewards - allRewards[RewardId.VOUCHER] = () => new AddVoucherReward(VoucherType.REGULAR, 1, RewardId.VOUCHER); - allRewards[RewardId.VOUCHER_PLUS] = () => new AddVoucherReward(VoucherType.PLUS, 1, RewardId.VOUCHER_PLUS); - allRewards[RewardId.VOUCHER_PREMIUM] = () => new AddVoucherReward(VoucherType.PREMIUM, 1, RewardId.VOUCHER_PREMIUM); + allRewards[RewardId.VOUCHER] = new AddVoucherReward(VoucherType.REGULAR, 1, RewardId.VOUCHER); + allRewards[RewardId.VOUCHER_PLUS] = new AddVoucherReward(VoucherType.PLUS, 1, RewardId.VOUCHER_PLUS); + allRewards[RewardId.VOUCHER_PREMIUM] = new AddVoucherReward(VoucherType.PREMIUM, 1, RewardId.VOUCHER_PREMIUM); // Money rewards - allRewards[RewardId.NUGGET] = () => - new AddMoneyReward( - "modifierType:ModifierType.NUGGET", - "nugget", - 1, - "modifierType:ModifierType.MoneyRewardModifierType.extra.small", - RewardId.NUGGET, - ); - allRewards[RewardId.BIG_NUGGET] = () => - new AddMoneyReward( - "modifierType:ModifierType.BIG_NUGGET", - "big_nugget", - 2.5, - "modifierType:ModifierType.MoneyRewardModifierType.extra.moderate", - RewardId.BIG_NUGGET, - ); - allRewards[RewardId.RELIC_GOLD] = () => - new AddMoneyReward( - "modifierType:ModifierType.RELIC_GOLD", - "relic_gold", - 10, - "modifierType:ModifierType.MoneyRewardModifierType.extra.large", - RewardId.RELIC_GOLD, - ); + allRewards[RewardId.NUGGET] = new AddMoneyReward( + "modifierType:ModifierType.NUGGET", + "nugget", + 1, + "modifierType:ModifierType.MoneyRewardModifierType.extra.small", + RewardId.NUGGET, + ); + allRewards[RewardId.BIG_NUGGET] = new AddMoneyReward( + "modifierType:ModifierType.BIG_NUGGET", + "big_nugget", + 2.5, + "modifierType:ModifierType.MoneyRewardModifierType.extra.moderate", + RewardId.BIG_NUGGET, + ); + allRewards[RewardId.RELIC_GOLD] = new AddMoneyReward( + "modifierType:ModifierType.RELIC_GOLD", + "relic_gold", + 10, + "modifierType:ModifierType.MoneyRewardModifierType.extra.large", + RewardId.RELIC_GOLD, + ); // Party-wide consumables - allRewards[RewardId.RARER_CANDY] = () => - new AllPokemonLevelIncrementReward("modifierType:ModifierType.RARER_CANDY", "rarer_candy"); - allRewards[RewardId.SACRED_ASH] = () => - new AllPokemonFullReviveReward("modifierType:ModifierType.SACRED_ASH", "sacred_ash"); + allRewards[RewardId.RARER_CANDY] = new AllPokemonLevelIncrementReward( + "modifierType:ModifierType.RARER_CANDY", + "rarer_candy", + ); + allRewards[RewardId.SACRED_ASH] = new AllPokemonFullReviveReward( + "modifierType:ModifierType.SACRED_ASH", + "sacred_ash", + ); // Pokemon consumables - allRewards[RewardId.RARE_CANDY] = () => - new PokemonLevelIncrementReward("modifierType:ModifierType.RARE_CANDY", "rare_candy"); + allRewards[RewardId.RARE_CANDY] = new PokemonLevelIncrementReward( + "modifierType:ModifierType.RARE_CANDY", + "rare_candy", + ); - allRewards[RewardId.EVOLUTION_ITEM] = () => new EvolutionItemRewardGenerator(false, RewardId.EVOLUTION_ITEM); - allRewards[RewardId.RARE_EVOLUTION_ITEM] = () => new EvolutionItemRewardGenerator(true, RewardId.RARE_EVOLUTION_ITEM); + allRewards[RewardId.EVOLUTION_ITEM] = new EvolutionItemRewardGenerator(false, RewardId.EVOLUTION_ITEM); + allRewards[RewardId.RARE_EVOLUTION_ITEM] = new EvolutionItemRewardGenerator(true, RewardId.RARE_EVOLUTION_ITEM); - allRewards[RewardId.POTION] = () => - new PokemonHpRestoreReward("modifierType:ModifierType.POTION", "potion", RewardId.POTION, 20, 10); - allRewards[RewardId.SUPER_POTION] = () => - new PokemonHpRestoreReward("modifierType:ModifierType.SUPER_POTION", "super_potion", RewardId.SUPER_POTION, 50, 25); - allRewards[RewardId.HYPER_POTION] = () => - new PokemonHpRestoreReward( - "modifierType:ModifierType.HYPER_POTION", - "hyper_potion", - RewardId.HYPER_POTION, - 200, - 50, - ); - allRewards[RewardId.MAX_POTION] = () => - new PokemonHpRestoreReward("modifierType:ModifierType.MAX_POTION", "max_potion", RewardId.MAX_POTION, 0, 100); - allRewards[RewardId.FULL_RESTORE] = () => - new PokemonHpRestoreReward( - "modifierType:ModifierType.FULL_RESTORE", - "full_restore", - RewardId.FULL_RESTORE, - 0, - 100, - true, - ); + allRewards[RewardId.POTION] = new PokemonHpRestoreReward( + "modifierType:ModifierType.POTION", + "potion", + RewardId.POTION, + 20, + 10, + ); + allRewards[RewardId.SUPER_POTION] = new PokemonHpRestoreReward( + "modifierType:ModifierType.SUPER_POTION", + "super_potion", + RewardId.SUPER_POTION, + 50, + 25, + ); + allRewards[RewardId.HYPER_POTION] = new PokemonHpRestoreReward( + "modifierType:ModifierType.HYPER_POTION", + "hyper_potion", + RewardId.HYPER_POTION, + 200, + 50, + ); + allRewards[RewardId.MAX_POTION] = new PokemonHpRestoreReward( + "modifierType:ModifierType.MAX_POTION", + "max_potion", + RewardId.MAX_POTION, + 0, + 100, + ); + allRewards[RewardId.FULL_RESTORE] = new PokemonHpRestoreReward( + "modifierType:ModifierType.FULL_RESTORE", + "full_restore", + RewardId.FULL_RESTORE, + 0, + 100, + true, + ); - allRewards[RewardId.REVIVE] = () => - new PokemonReviveReward("modifierType:ModifierType.REVIVE", "revive", RewardId.REVIVE, 50); - allRewards[RewardId.MAX_REVIVE] = () => - new PokemonReviveReward("modifierType:ModifierType.MAX_REVIVE", "max_revive", RewardId.MAX_REVIVE, 100); + allRewards[RewardId.REVIVE] = new PokemonReviveReward( + "modifierType:ModifierType.REVIVE", + "revive", + RewardId.REVIVE, + 50, + ); + allRewards[RewardId.MAX_REVIVE] = new PokemonReviveReward( + "modifierType:ModifierType.MAX_REVIVE", + "max_revive", + RewardId.MAX_REVIVE, + 100, + ); - allRewards[RewardId.FULL_HEAL] = () => - new PokemonStatusHealReward("modifierType:ModifierType.FULL_HEAL", "full_heal"); + allRewards[RewardId.FULL_HEAL] = new PokemonStatusHealReward("modifierType:ModifierType.FULL_HEAL", "full_heal"); - allRewards[RewardId.ETHER] = () => - new PokemonPpRestoreReward("modifierType:ModifierType.ETHER", "ether", RewardId.ETHER, 10); - allRewards[RewardId.MAX_ETHER] = () => - new PokemonPpRestoreReward("modifierType:ModifierType.MAX_ETHER", "max_ether", RewardId.MAX_ETHER, -1); + allRewards[RewardId.ETHER] = new PokemonPpRestoreReward( + "modifierType:ModifierType.ETHER", + "ether", + RewardId.ETHER, + 10, + ); + allRewards[RewardId.MAX_ETHER] = new PokemonPpRestoreReward( + "modifierType:ModifierType.MAX_ETHER", + "max_ether", + RewardId.MAX_ETHER, + -1, + ); - allRewards[RewardId.ELIXIR] = () => - new PokemonAllMovePpRestoreReward("modifierType:ModifierType.ELIXIR", "elixir", RewardId.ELIXIR, 10); - allRewards[RewardId.MAX_ELIXIR] = () => - new PokemonAllMovePpRestoreReward("modifierType:ModifierType.MAX_ELIXIR", "max_elixir", RewardId.MAX_ELIXIR, -1); + allRewards[RewardId.ELIXIR] = new PokemonAllMovePpRestoreReward( + "modifierType:ModifierType.ELIXIR", + "elixir", + RewardId.ELIXIR, + 10, + ); + allRewards[RewardId.MAX_ELIXIR] = new PokemonAllMovePpRestoreReward( + "modifierType:ModifierType.MAX_ELIXIR", + "max_elixir", + RewardId.MAX_ELIXIR, + -1, + ); - allRewards[RewardId.PP_UP] = () => - new PokemonPpUpReward("modifierType:ModifierType.PP_UP", "pp_up", RewardId.PP_UP, 1); - allRewards[RewardId.PP_MAX] = () => - new PokemonPpUpReward("modifierType:ModifierType.PP_MAX", "pp_max", RewardId.PP_MAX, 3); + allRewards[RewardId.PP_UP] = new PokemonPpUpReward("modifierType:ModifierType.PP_UP", "pp_up", RewardId.PP_UP, 1); + allRewards[RewardId.PP_MAX] = new PokemonPpUpReward("modifierType:ModifierType.PP_MAX", "pp_max", RewardId.PP_MAX, 3); /*REPEL] = () => new DoubleBattleChanceBoosterReward('Repel', 5), SUPER_REPEL] = () => new DoubleBattleChanceBoosterReward('Super Repel', 10), MAX_REPEL] = () => new DoubleBattleChanceBoosterReward('Max Repel', 25),*/ - allRewards[RewardId.MINT] = () => new MintRewardGenerator(); + allRewards[RewardId.MINT] = new MintRewardGenerator(); - allRewards[RewardId.TERA_SHARD] = () => new TeraTypeRewardGenerator(); + allRewards[RewardId.TERA_SHARD] = new TeraTypeRewardGenerator(); - allRewards[RewardId.TM_COMMON] = () => new TmRewardGenerator(RarityTier.COMMON); - allRewards[RewardId.TM_GREAT] = () => new TmRewardGenerator(RarityTier.GREAT); - allRewards[RewardId.TM_ULTRA] = () => new TmRewardGenerator(RarityTier.ULTRA); + allRewards[RewardId.TM_COMMON] = new TmRewardGenerator(RarityTier.COMMON); + allRewards[RewardId.TM_GREAT] = new TmRewardGenerator(RarityTier.GREAT); + allRewards[RewardId.TM_ULTRA] = new TmRewardGenerator(RarityTier.ULTRA); - allRewards[RewardId.MEMORY_MUSHROOM] = () => - new RememberMoveReward("modifierType:ModifierType.MEMORY_MUSHROOM", "big_mushroom"); + allRewards[RewardId.MEMORY_MUSHROOM] = new RememberMoveReward( + "modifierType:ModifierType.MEMORY_MUSHROOM", + "big_mushroom", + ); - allRewards[RewardId.DNA_SPLICERS] = () => - new FusePokemonReward("modifierType:ModifierType.DNA_SPLICERS", "dna_splicers"); + allRewards[RewardId.DNA_SPLICERS] = new FusePokemonReward("modifierType:ModifierType.DNA_SPLICERS", "dna_splicers"); // Form change items - allRewards[RewardId.FORM_CHANGE_ITEM] = () => new FormChangeItemRewardGenerator(false, RewardId.FORM_CHANGE_ITEM); - allRewards[RewardId.RARE_FORM_CHANGE_ITEM] = () => - new FormChangeItemRewardGenerator(true, RewardId.RARE_FORM_CHANGE_ITEM); + allRewards[RewardId.FORM_CHANGE_ITEM] = new FormChangeItemRewardGenerator(false, RewardId.FORM_CHANGE_ITEM); + allRewards[RewardId.RARE_FORM_CHANGE_ITEM] = new FormChangeItemRewardGenerator(true, RewardId.RARE_FORM_CHANGE_ITEM); // Held items - allRewards[RewardId.SPECIES_STAT_BOOSTER] = () => new SpeciesStatBoosterRewardGenerator(false); - allRewards[RewardId.RARE_SPECIES_STAT_BOOSTER] = () => new SpeciesStatBoosterRewardGenerator(true); + allRewards[RewardId.SPECIES_STAT_BOOSTER] = new SpeciesStatBoosterRewardGenerator(false); + allRewards[RewardId.RARE_SPECIES_STAT_BOOSTER] = new SpeciesStatBoosterRewardGenerator(true); - allRewards[RewardId.BASE_STAT_BOOSTER] = () => new BaseStatBoosterRewardGenerator(); + allRewards[RewardId.BASE_STAT_BOOSTER] = new BaseStatBoosterRewardGenerator(); - allRewards[RewardId.ATTACK_TYPE_BOOSTER] = () => new AttackTypeBoosterRewardGenerator(); + allRewards[RewardId.ATTACK_TYPE_BOOSTER] = new AttackTypeBoosterRewardGenerator(); - allRewards[RewardId.BERRY] = () => new BerryRewardGenerator(); - - // MINI_BLACK_HOLE] = () => new HeldItemReward(HeldItemId.MINI_BLACK_HOLE), + allRewards[RewardId.BERRY] = new BerryRewardGenerator(); // Trainer items - allRewards[RewardId.LURE] = () => new LapsingTrainerItemReward(TrainerItemId.LURE, RewardId.LURE); - allRewards[RewardId.SUPER_LURE] = () => new LapsingTrainerItemReward(TrainerItemId.SUPER_LURE, RewardId.SUPER_LURE); - allRewards[RewardId.MAX_LURE] = () => new LapsingTrainerItemReward(TrainerItemId.MAX_LURE, RewardId.MAX_LURE); + allRewards[RewardId.LURE] = new LapsingTrainerItemReward(TrainerItemId.LURE, RewardId.LURE); + allRewards[RewardId.SUPER_LURE] = new LapsingTrainerItemReward(TrainerItemId.SUPER_LURE, RewardId.SUPER_LURE); + allRewards[RewardId.MAX_LURE] = new LapsingTrainerItemReward(TrainerItemId.MAX_LURE, RewardId.MAX_LURE); - allRewards[RewardId.TEMP_STAT_STAGE_BOOSTER] = () => new TempStatStageBoosterRewardGenerator(); + allRewards[RewardId.TEMP_STAT_STAGE_BOOSTER] = new TempStatStageBoosterRewardGenerator(); - allRewards[RewardId.DIRE_HIT] = () => - new LapsingTrainerItemReward(TrainerItemId.DIRE_HIT, RewardId.TEMP_STAT_STAGE_BOOSTER); - // GOLDEN_POKEBALL] = () => new TrainerItemReward(TrainerItemId.GOLDEN_POKEBALL), + allRewards[RewardId.DIRE_HIT] = new LapsingTrainerItemReward( + TrainerItemId.DIRE_HIT, + RewardId.TEMP_STAT_STAGE_BOOSTER, + ); } diff --git a/src/items/reward-utils.ts b/src/items/reward-utils.ts index 7f229b65c94..89e0d61e912 100644 --- a/src/items/reward-utils.ts +++ b/src/items/reward-utils.ts @@ -4,7 +4,7 @@ import type { HeldItemId } from "#enums/held-item-id"; import { getRewardCategory, RewardCategoryId, RewardId } from "#enums/reward-id"; import type { RarityTier } from "#enums/reward-tier"; import type { TrainerItemId } from "#enums/trainer-item-id"; -import type { RewardFunc, RewardPoolId, RewardSpecs } from "#types/rewards"; +import type { RewardPoolId, RewardSpecs } from "#types/rewards"; import { heldItemRarities } from "./held-item-default-tiers"; import { HeldItemReward, @@ -32,16 +32,6 @@ export function isRememberMoveReward(reward: Reward): reward is RememberMoveRewa return reward.id === RewardId.MEMORY_MUSHROOM; } -/** - * Generates a Reward from a given function - * @param rewardFunc - * @param pregenArgs Can specify BerryType for berries, TM for TMs, AttackBoostType for item, etc. - */ -export function generateReward(rewardFunc: RewardFunc, pregenArgs?: any[]): Reward | null { - const reward = rewardFunc(); - return reward instanceof RewardGenerator ? reward.generateReward(globalScene.getPlayerParty(), pregenArgs) : reward; -} - export function generateRewardOptionFromId( id: RewardPoolId, cost = 0, @@ -61,8 +51,10 @@ export function generateRewardOptionFromId( return new RewardOption(reward, upgradeCount, tier, cost); } - const rewardFunc = allRewards[id]; - const reward = generateReward(rewardFunc, pregenArgs); + const reward = + allRewards[id] instanceof RewardGenerator + ? allRewards[id].generateReward(globalScene.getPlayerParty(), pregenArgs) + : allRewards[id]; if (reward) { const tier = tierOverride ?? rewardRarities[id]; return new RewardOption(reward, upgradeCount, tier, cost); diff --git a/src/phases/ribbon-reward-phase.ts b/src/phases/ribbon-reward-phase.ts index 42e5bd826a3..60af2ee35e3 100644 --- a/src/phases/ribbon-reward-phase.ts +++ b/src/phases/ribbon-reward-phase.ts @@ -1,16 +1,16 @@ import { globalScene } from "#app/global-scene"; import type { PokemonSpecies } from "#data/pokemon-species"; import { UiMode } from "#enums/ui-mode"; +import type { Reward } from "#items/reward"; import { RewardPhase } from "#phases/reward-phase"; -import type { RewardFunc } from "#types/rewards"; import i18next from "i18next"; export class RibbonRewardPhase extends RewardPhase { public readonly phaseName = "RibbonRewardPhase"; private species: PokemonSpecies; - constructor(rewardFunc: RewardFunc, species: PokemonSpecies) { - super(rewardFunc); + constructor(reward: Reward, species: PokemonSpecies) { + super(reward); this.species = species; } diff --git a/src/phases/trainer-item-reward-phase.ts b/src/phases/trainer-item-reward-phase.ts index 033a022958f..146169f22c9 100644 --- a/src/phases/trainer-item-reward-phase.ts +++ b/src/phases/trainer-item-reward-phase.ts @@ -1,7 +1,6 @@ import { globalScene } from "#app/global-scene"; import type { Reward } from "#items/reward"; import { BattlePhase } from "#phases/battle-phase"; -import type { RewardFunc } from "#types/rewards"; import i18next from "i18next"; export class RewardPhase extends BattlePhase { @@ -10,10 +9,10 @@ export class RewardPhase extends BattlePhase { public readonly phaseName: "RewardPhase" | "RibbonRewardPhase" | "GameOverRewardPhase" = "RewardPhase"; protected reward: Reward; - constructor(rewardFunc: RewardFunc) { + constructor(reward: Reward) { super(); - this.reward = rewardFunc(); + this.reward = reward; } start() {