Removed RewardFunc from allRewards

This commit is contained in:
Wlowscha 2025-08-07 19:17:49 +02:00
parent acc12318d7
commit c94c500d52
No known key found for this signature in database
GPG Key ID: 3C8F1AD330565D04
6 changed files with 155 additions and 131 deletions

View File

@ -2,9 +2,7 @@ import type { HeldItemId } from "#enums/held-item-id";
import type { RewardId } from "#enums/reward-id"; import type { RewardId } from "#enums/reward-id";
import type { TrainerItemId } from "#enums/trainer-item-id"; import type { TrainerItemId } from "#enums/trainer-item-id";
import type { Pokemon } from "#field/pokemon"; 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 WeightedRewardWeightFunc = (party: Pokemon[], rerollCount?: number) => number;
export type RewardPoolId = RewardId | HeldItemId | TrainerItemId; export type RewardPoolId = RewardId | HeldItemId | TrainerItemId;

View File

@ -4,9 +4,9 @@ import type { HeldItemId } from "#enums/held-item-id";
import type { RewardId } from "#enums/reward-id"; import type { RewardId } from "#enums/reward-id";
import type { TrainerItemId } from "#enums/trainer-item-id"; import type { TrainerItemId } from "#enums/trainer-item-id";
import type { HeldItem } from "#items/held-item"; import type { HeldItem } from "#items/held-item";
import type { Reward, RewardGenerator } from "#items/reward";
import type { TrainerItem } from "#items/trainer-item"; import type { TrainerItem } from "#items/trainer-item";
import type { Move } from "#moves/move"; import type { Move } from "#moves/move";
import type { RewardFunc } from "#types/rewards";
export const allAbilities: Ability[] = []; export const allAbilities: Ability[] = [];
export const allMoves: Move[] = []; export const allMoves: Move[] = [];
@ -14,4 +14,4 @@ export const allSpecies: PokemonSpecies[] = [];
export const allHeldItems: Record<HeldItemId, HeldItem> = {}; export const allHeldItems: Record<HeldItemId, HeldItem> = {};
export const allTrainerItems: Record<TrainerItemId, TrainerItem> = {}; export const allTrainerItems: Record<TrainerItemId, TrainerItem> = {};
export const allRewards: Record<RewardId, RewardFunc> = {}; export const allRewards: Record<RewardId, Reward | RewardGenerator> = {};

View File

@ -34,149 +34,184 @@ import {
export function initRewards() { export function initRewards() {
// Pokeball rewards // Pokeball rewards
allRewards[RewardId.POKEBALL] = () => new AddPokeballReward("pb", PokeballType.POKEBALL, 5, RewardId.POKEBALL); 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.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.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.ROGUE_BALL] = new AddPokeballReward("rb", PokeballType.ROGUE_BALL, 5, RewardId.ROGUE_BALL);
allRewards[RewardId.MASTER_BALL] = () => allRewards[RewardId.MASTER_BALL] = new AddPokeballReward("mb", PokeballType.MASTER_BALL, 1, RewardId.MASTER_BALL);
new AddPokeballReward("mb", PokeballType.MASTER_BALL, 1, RewardId.MASTER_BALL);
// Voucher rewards // Voucher rewards
allRewards[RewardId.VOUCHER] = () => new AddVoucherReward(VoucherType.REGULAR, 1, RewardId.VOUCHER); 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_PLUS] = new AddVoucherReward(VoucherType.PLUS, 1, RewardId.VOUCHER_PLUS);
allRewards[RewardId.VOUCHER_PREMIUM] = () => new AddVoucherReward(VoucherType.PREMIUM, 1, RewardId.VOUCHER_PREMIUM); allRewards[RewardId.VOUCHER_PREMIUM] = new AddVoucherReward(VoucherType.PREMIUM, 1, RewardId.VOUCHER_PREMIUM);
// Money rewards // Money rewards
allRewards[RewardId.NUGGET] = () => allRewards[RewardId.NUGGET] = new AddMoneyReward(
new AddMoneyReward( "modifierType:ModifierType.NUGGET",
"modifierType:ModifierType.NUGGET", "nugget",
"nugget", 1,
1, "modifierType:ModifierType.MoneyRewardModifierType.extra.small",
"modifierType:ModifierType.MoneyRewardModifierType.extra.small", RewardId.NUGGET,
RewardId.NUGGET, );
); allRewards[RewardId.BIG_NUGGET] = new AddMoneyReward(
allRewards[RewardId.BIG_NUGGET] = () => "modifierType:ModifierType.BIG_NUGGET",
new AddMoneyReward( "big_nugget",
"modifierType:ModifierType.BIG_NUGGET", 2.5,
"big_nugget", "modifierType:ModifierType.MoneyRewardModifierType.extra.moderate",
2.5, RewardId.BIG_NUGGET,
"modifierType:ModifierType.MoneyRewardModifierType.extra.moderate", );
RewardId.BIG_NUGGET, allRewards[RewardId.RELIC_GOLD] = new AddMoneyReward(
); "modifierType:ModifierType.RELIC_GOLD",
allRewards[RewardId.RELIC_GOLD] = () => "relic_gold",
new AddMoneyReward( 10,
"modifierType:ModifierType.RELIC_GOLD", "modifierType:ModifierType.MoneyRewardModifierType.extra.large",
"relic_gold", RewardId.RELIC_GOLD,
10, );
"modifierType:ModifierType.MoneyRewardModifierType.extra.large",
RewardId.RELIC_GOLD,
);
// Party-wide consumables // Party-wide consumables
allRewards[RewardId.RARER_CANDY] = () => allRewards[RewardId.RARER_CANDY] = new AllPokemonLevelIncrementReward(
new AllPokemonLevelIncrementReward("modifierType:ModifierType.RARER_CANDY", "rarer_candy"); "modifierType:ModifierType.RARER_CANDY",
allRewards[RewardId.SACRED_ASH] = () => "rarer_candy",
new AllPokemonFullReviveReward("modifierType:ModifierType.SACRED_ASH", "sacred_ash"); );
allRewards[RewardId.SACRED_ASH] = new AllPokemonFullReviveReward(
"modifierType:ModifierType.SACRED_ASH",
"sacred_ash",
);
// Pokemon consumables // Pokemon consumables
allRewards[RewardId.RARE_CANDY] = () => allRewards[RewardId.RARE_CANDY] = new PokemonLevelIncrementReward(
new PokemonLevelIncrementReward("modifierType:ModifierType.RARE_CANDY", "rare_candy"); "modifierType:ModifierType.RARE_CANDY",
"rare_candy",
);
allRewards[RewardId.EVOLUTION_ITEM] = () => new EvolutionItemRewardGenerator(false, RewardId.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.RARE_EVOLUTION_ITEM] = new EvolutionItemRewardGenerator(true, RewardId.RARE_EVOLUTION_ITEM);
allRewards[RewardId.POTION] = () => allRewards[RewardId.POTION] = new PokemonHpRestoreReward(
new PokemonHpRestoreReward("modifierType:ModifierType.POTION", "potion", RewardId.POTION, 20, 10); "modifierType:ModifierType.POTION",
allRewards[RewardId.SUPER_POTION] = () => "potion",
new PokemonHpRestoreReward("modifierType:ModifierType.SUPER_POTION", "super_potion", RewardId.SUPER_POTION, 50, 25); RewardId.POTION,
allRewards[RewardId.HYPER_POTION] = () => 20,
new PokemonHpRestoreReward( 10,
"modifierType:ModifierType.HYPER_POTION", );
"hyper_potion", allRewards[RewardId.SUPER_POTION] = new PokemonHpRestoreReward(
RewardId.HYPER_POTION, "modifierType:ModifierType.SUPER_POTION",
200, "super_potion",
50, RewardId.SUPER_POTION,
); 50,
allRewards[RewardId.MAX_POTION] = () => 25,
new PokemonHpRestoreReward("modifierType:ModifierType.MAX_POTION", "max_potion", RewardId.MAX_POTION, 0, 100); );
allRewards[RewardId.FULL_RESTORE] = () => allRewards[RewardId.HYPER_POTION] = new PokemonHpRestoreReward(
new PokemonHpRestoreReward( "modifierType:ModifierType.HYPER_POTION",
"modifierType:ModifierType.FULL_RESTORE", "hyper_potion",
"full_restore", RewardId.HYPER_POTION,
RewardId.FULL_RESTORE, 200,
0, 50,
100, );
true, 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] = () => allRewards[RewardId.REVIVE] = new PokemonReviveReward(
new PokemonReviveReward("modifierType:ModifierType.REVIVE", "revive", RewardId.REVIVE, 50); "modifierType:ModifierType.REVIVE",
allRewards[RewardId.MAX_REVIVE] = () => "revive",
new PokemonReviveReward("modifierType:ModifierType.MAX_REVIVE", "max_revive", RewardId.MAX_REVIVE, 100); RewardId.REVIVE,
50,
);
allRewards[RewardId.MAX_REVIVE] = new PokemonReviveReward(
"modifierType:ModifierType.MAX_REVIVE",
"max_revive",
RewardId.MAX_REVIVE,
100,
);
allRewards[RewardId.FULL_HEAL] = () => allRewards[RewardId.FULL_HEAL] = new PokemonStatusHealReward("modifierType:ModifierType.FULL_HEAL", "full_heal");
new PokemonStatusHealReward("modifierType:ModifierType.FULL_HEAL", "full_heal");
allRewards[RewardId.ETHER] = () => allRewards[RewardId.ETHER] = new PokemonPpRestoreReward(
new PokemonPpRestoreReward("modifierType:ModifierType.ETHER", "ether", RewardId.ETHER, 10); "modifierType:ModifierType.ETHER",
allRewards[RewardId.MAX_ETHER] = () => "ether",
new PokemonPpRestoreReward("modifierType:ModifierType.MAX_ETHER", "max_ether", RewardId.MAX_ETHER, -1); RewardId.ETHER,
10,
);
allRewards[RewardId.MAX_ETHER] = new PokemonPpRestoreReward(
"modifierType:ModifierType.MAX_ETHER",
"max_ether",
RewardId.MAX_ETHER,
-1,
);
allRewards[RewardId.ELIXIR] = () => allRewards[RewardId.ELIXIR] = new PokemonAllMovePpRestoreReward(
new PokemonAllMovePpRestoreReward("modifierType:ModifierType.ELIXIR", "elixir", RewardId.ELIXIR, 10); "modifierType:ModifierType.ELIXIR",
allRewards[RewardId.MAX_ELIXIR] = () => "elixir",
new PokemonAllMovePpRestoreReward("modifierType:ModifierType.MAX_ELIXIR", "max_elixir", RewardId.MAX_ELIXIR, -1); RewardId.ELIXIR,
10,
);
allRewards[RewardId.MAX_ELIXIR] = new PokemonAllMovePpRestoreReward(
"modifierType:ModifierType.MAX_ELIXIR",
"max_elixir",
RewardId.MAX_ELIXIR,
-1,
);
allRewards[RewardId.PP_UP] = () => allRewards[RewardId.PP_UP] = new PokemonPpUpReward("modifierType:ModifierType.PP_UP", "pp_up", RewardId.PP_UP, 1);
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_MAX] = () =>
new PokemonPpUpReward("modifierType:ModifierType.PP_MAX", "pp_max", RewardId.PP_MAX, 3);
/*REPEL] = () => new DoubleBattleChanceBoosterReward('Repel', 5), /*REPEL] = () => new DoubleBattleChanceBoosterReward('Repel', 5),
SUPER_REPEL] = () => new DoubleBattleChanceBoosterReward('Super Repel', 10), SUPER_REPEL] = () => new DoubleBattleChanceBoosterReward('Super Repel', 10),
MAX_REPEL] = () => new DoubleBattleChanceBoosterReward('Max Repel', 25),*/ 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_COMMON] = new TmRewardGenerator(RarityTier.COMMON);
allRewards[RewardId.TM_GREAT] = () => new TmRewardGenerator(RarityTier.GREAT); allRewards[RewardId.TM_GREAT] = new TmRewardGenerator(RarityTier.GREAT);
allRewards[RewardId.TM_ULTRA] = () => new TmRewardGenerator(RarityTier.ULTRA); allRewards[RewardId.TM_ULTRA] = new TmRewardGenerator(RarityTier.ULTRA);
allRewards[RewardId.MEMORY_MUSHROOM] = () => allRewards[RewardId.MEMORY_MUSHROOM] = new RememberMoveReward(
new RememberMoveReward("modifierType:ModifierType.MEMORY_MUSHROOM", "big_mushroom"); "modifierType:ModifierType.MEMORY_MUSHROOM",
"big_mushroom",
);
allRewards[RewardId.DNA_SPLICERS] = () => allRewards[RewardId.DNA_SPLICERS] = new FusePokemonReward("modifierType:ModifierType.DNA_SPLICERS", "dna_splicers");
new FusePokemonReward("modifierType:ModifierType.DNA_SPLICERS", "dna_splicers");
// Form change items // Form change items
allRewards[RewardId.FORM_CHANGE_ITEM] = () => new FormChangeItemRewardGenerator(false, RewardId.FORM_CHANGE_ITEM); allRewards[RewardId.FORM_CHANGE_ITEM] = new FormChangeItemRewardGenerator(false, RewardId.FORM_CHANGE_ITEM);
allRewards[RewardId.RARE_FORM_CHANGE_ITEM] = () => allRewards[RewardId.RARE_FORM_CHANGE_ITEM] = new FormChangeItemRewardGenerator(true, RewardId.RARE_FORM_CHANGE_ITEM);
new FormChangeItemRewardGenerator(true, RewardId.RARE_FORM_CHANGE_ITEM);
// Held items // Held items
allRewards[RewardId.SPECIES_STAT_BOOSTER] = () => new SpeciesStatBoosterRewardGenerator(false); allRewards[RewardId.SPECIES_STAT_BOOSTER] = new SpeciesStatBoosterRewardGenerator(false);
allRewards[RewardId.RARE_SPECIES_STAT_BOOSTER] = () => new SpeciesStatBoosterRewardGenerator(true); 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(); allRewards[RewardId.BERRY] = new BerryRewardGenerator();
// MINI_BLACK_HOLE] = () => new HeldItemReward(HeldItemId.MINI_BLACK_HOLE),
// Trainer items // Trainer items
allRewards[RewardId.LURE] = () => new LapsingTrainerItemReward(TrainerItemId.LURE, RewardId.LURE); allRewards[RewardId.LURE] = new LapsingTrainerItemReward(TrainerItemId.LURE, RewardId.LURE);
allRewards[RewardId.SUPER_LURE] = () => new LapsingTrainerItemReward(TrainerItemId.SUPER_LURE, RewardId.SUPER_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.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] = () => allRewards[RewardId.DIRE_HIT] = new LapsingTrainerItemReward(
new LapsingTrainerItemReward(TrainerItemId.DIRE_HIT, RewardId.TEMP_STAT_STAGE_BOOSTER); TrainerItemId.DIRE_HIT,
// GOLDEN_POKEBALL] = () => new TrainerItemReward(TrainerItemId.GOLDEN_POKEBALL), RewardId.TEMP_STAT_STAGE_BOOSTER,
);
} }

View File

@ -4,7 +4,7 @@ import type { HeldItemId } from "#enums/held-item-id";
import { getRewardCategory, RewardCategoryId, RewardId } from "#enums/reward-id"; import { getRewardCategory, RewardCategoryId, RewardId } from "#enums/reward-id";
import type { RarityTier } from "#enums/reward-tier"; import type { RarityTier } from "#enums/reward-tier";
import type { TrainerItemId } from "#enums/trainer-item-id"; 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 { heldItemRarities } from "./held-item-default-tiers";
import { import {
HeldItemReward, HeldItemReward,
@ -32,16 +32,6 @@ export function isRememberMoveReward(reward: Reward): reward is RememberMoveRewa
return reward.id === RewardId.MEMORY_MUSHROOM; 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( export function generateRewardOptionFromId(
id: RewardPoolId, id: RewardPoolId,
cost = 0, cost = 0,
@ -61,8 +51,10 @@ export function generateRewardOptionFromId(
return new RewardOption(reward, upgradeCount, tier, cost); return new RewardOption(reward, upgradeCount, tier, cost);
} }
const rewardFunc = allRewards[id]; const reward =
const reward = generateReward(rewardFunc, pregenArgs); allRewards[id] instanceof RewardGenerator
? allRewards[id].generateReward(globalScene.getPlayerParty(), pregenArgs)
: allRewards[id];
if (reward) { if (reward) {
const tier = tierOverride ?? rewardRarities[id]; const tier = tierOverride ?? rewardRarities[id];
return new RewardOption(reward, upgradeCount, tier, cost); return new RewardOption(reward, upgradeCount, tier, cost);

View File

@ -1,16 +1,16 @@
import { globalScene } from "#app/global-scene"; import { globalScene } from "#app/global-scene";
import type { PokemonSpecies } from "#data/pokemon-species"; import type { PokemonSpecies } from "#data/pokemon-species";
import { UiMode } from "#enums/ui-mode"; import { UiMode } from "#enums/ui-mode";
import type { Reward } from "#items/reward";
import { RewardPhase } from "#phases/reward-phase"; import { RewardPhase } from "#phases/reward-phase";
import type { RewardFunc } from "#types/rewards";
import i18next from "i18next"; import i18next from "i18next";
export class RibbonRewardPhase extends RewardPhase { export class RibbonRewardPhase extends RewardPhase {
public readonly phaseName = "RibbonRewardPhase"; public readonly phaseName = "RibbonRewardPhase";
private species: PokemonSpecies; private species: PokemonSpecies;
constructor(rewardFunc: RewardFunc, species: PokemonSpecies) { constructor(reward: Reward, species: PokemonSpecies) {
super(rewardFunc); super(reward);
this.species = species; this.species = species;
} }

View File

@ -1,7 +1,6 @@
import { globalScene } from "#app/global-scene"; import { globalScene } from "#app/global-scene";
import type { Reward } from "#items/reward"; import type { Reward } from "#items/reward";
import { BattlePhase } from "#phases/battle-phase"; import { BattlePhase } from "#phases/battle-phase";
import type { RewardFunc } from "#types/rewards";
import i18next from "i18next"; import i18next from "i18next";
export class RewardPhase extends BattlePhase { export class RewardPhase extends BattlePhase {
@ -10,10 +9,10 @@ export class RewardPhase extends BattlePhase {
public readonly phaseName: "RewardPhase" | "RibbonRewardPhase" | "GameOverRewardPhase" = "RewardPhase"; public readonly phaseName: "RewardPhase" | "RibbonRewardPhase" | "GameOverRewardPhase" = "RewardPhase";
protected reward: Reward; protected reward: Reward;
constructor(rewardFunc: RewardFunc) { constructor(reward: Reward) {
super(); super();
this.reward = rewardFunc(); this.reward = reward;
} }
start() { start() {