Various fixes

This commit is contained in:
Wlowscha 2025-06-09 18:35:06 +02:00
parent 20d4d3aa05
commit 2678535bef
No known key found for this signature in database
GPG Key ID: 3C8F1AD330565D04
4 changed files with 24 additions and 68 deletions

View File

@ -2709,7 +2709,7 @@ export default class BattleScene extends SceneBase {
this.triggerPokemonFormChange(pokemon, SpeciesFormChangeItemTrigger); this.triggerPokemonFormChange(pokemon, SpeciesFormChangeItemTrigger);
pokemon.heldItemManager.formChangeItems[itemId].active = true; pokemon.heldItemManager.toggleActive(itemId);
if (!ignoreUpdate) { if (!ignoreUpdate) {
this.updateModifiers(false); this.updateModifiers(false);

View File

@ -5977,12 +5977,9 @@ export class PlayerPokemon extends Pokemon {
} }
// combine the two mons' held items // combine the two mons' held items
const fusedPartyMemberHeldModifiers = globalScene.findModifiers( const fusedPartyMemberHeldItems = pokemon.getHeldItems();
m => m instanceof PokemonHeldItemModifier && m.pokemonId === pokemon.id, for (const item of fusedPartyMemberHeldItems) {
true, globalScene.tryTransferHeldItem(item, pokemon, this, false, pokemon.heldItemManager.getStack(item), true, false);
) as PokemonHeldItemModifier[];
for (const modifier of fusedPartyMemberHeldModifiers) {
globalScene.tryTransferHeldItem(modifier, pokemon, this, false, modifier.getStackCount(), true, false);
} }
globalScene.updateModifiers(true); globalScene.updateModifiers(true);
globalScene.getPlayerParty().splice(fusedPartyMemberIndex, 1)[0]; globalScene.getPlayerParty().splice(fusedPartyMemberIndex, 1)[0];

View File

@ -106,6 +106,7 @@ import { TYPE_BOOST_ITEM_BOOST_PERCENT } from "#app/constants";
import { attackTypeToHeldItem } from "#app/items/held-items/attack-type-booster"; import { attackTypeToHeldItem } from "#app/items/held-items/attack-type-booster";
import { berryTypeToHeldItem } from "#app/items/held-items/berry"; import { berryTypeToHeldItem } from "#app/items/held-items/berry";
import { permanentStatToHeldItem, statBoostItems } from "#app/items/held-items/base-stat-booster"; import { permanentStatToHeldItem, statBoostItems } from "#app/items/held-items/base-stat-booster";
import { SPECIES_STAT_BOOSTER_ITEMS, type SpeciesStatBoosterItemId } from "#app/items/held-items/stat-booster";
const outputModifierData = false; const outputModifierData = false;
const useMaxWeightForOutput = false; const useMaxWeightForOutput = false;
@ -374,7 +375,7 @@ export class HeldItemReward extends PokemonModifierType {
pokemonName: getPokemonNameWithAffix(pokemon), pokemonName: getPokemonNameWithAffix(pokemon),
}); });
} }
if (hasItem && pokemon.heldItemManager.getItem(this.itemId).stack === maxStackCount) { if (hasItem && pokemon.heldItemManager.getStack(this.itemId) === maxStackCount) {
return i18next.t("modifierType:ModifierType.PokemonHeldItemModifierType.extra.tooMany", { return i18next.t("modifierType:ModifierType.PokemonHeldItemModifierType.extra.tooMany", {
pokemonName: getPokemonNameWithAffix(pokemon), pokemonName: getPokemonNameWithAffix(pokemon),
}); });
@ -1095,7 +1096,7 @@ export class EvolutionItemModifierType extends PokemonModifierType implements Ge
/** /**
* Class that represents form changing items * Class that represents form changing items
*/ */
export class FormChangeItemModifierType extends PokemonModifierType implements GeneratedPersistentModifierType { export class FormChangeItemReward extends PokemonModifierType {
public formChangeItem: FormChangeItem; public formChangeItem: FormChangeItem;
constructor(formChangeItem: FormChangeItem) { constructor(formChangeItem: FormChangeItem) {
@ -1134,10 +1135,6 @@ export class FormChangeItemModifierType extends PokemonModifierType implements G
getDescription(): string { getDescription(): string {
return i18next.t("modifierType:ModifierType.FormChangeItemModifierType.description"); return i18next.t("modifierType:ModifierType.FormChangeItemModifierType.description");
} }
getPregenArgs(): any[] {
return [this.formChangeItem];
}
} }
export class FusePokemonModifierType extends PokemonModifierType { export class FusePokemonModifierType extends PokemonModifierType {
@ -1251,21 +1248,12 @@ class TempStatStageBoosterModifierTypeGenerator extends ModifierTypeGenerator {
* the current list of {@linkcode items}. * the current list of {@linkcode items}.
* @extends ModifierTypeGenerator * @extends ModifierTypeGenerator
*/ */
class SpeciesStatBoosterModifierTypeGenerator extends ModifierTypeGenerator { class SpeciesStatBoosterRewardGenerator extends ModifierTypeGenerator {
/** Object comprised of the currently available species-based stat boosting held items */ /** Object comprised of the currently available species-based stat boosting held items */
public static readonly items = [
HeldItemId.LIGHT_BALL,
HeldItemId.THICK_CLUB,
HeldItemId.METAL_POWDER,
HeldItemId.QUICK_POWDER,
HeldItemId.DEEP_SEA_SCALE,
HeldItemId.DEEP_SEA_TOOTH,
];
constructor(rare: boolean) { constructor(rare: boolean) {
super((party: Pokemon[], pregenArgs?: any[]) => { super((party: Pokemon[], pregenArgs?: any[]) => {
const items = SpeciesStatBoosterModifierTypeGenerator.items; if (pregenArgs && pregenArgs.length === 1 && pregenArgs[0] in SPECIES_STAT_BOOSTER_ITEMS) {
if (pregenArgs && pregenArgs.length === 1 && pregenArgs[0] in items) {
return new HeldItemReward(pregenArgs[0] as HeldItemId); return new HeldItemReward(pregenArgs[0] as HeldItemId);
} }
@ -1410,11 +1398,11 @@ class EvolutionItemModifierTypeGenerator extends ModifierTypeGenerator {
} }
} }
class FormChangeItemModifierTypeGenerator extends ModifierTypeGenerator { class FormChangeItemRewardGenerator extends ModifierTypeGenerator {
constructor(isRareFormChangeItem: boolean) { constructor(isRareFormChangeItem: boolean) {
super((party: Pokemon[], pregenArgs?: any[]) => { super((party: Pokemon[], pregenArgs?: any[]) => {
if (pregenArgs && pregenArgs.length === 1 && pregenArgs[0] in FormChangeItem) { if (pregenArgs && pregenArgs.length === 1 && pregenArgs[0] in FormChangeItem) {
return new FormChangeItemModifierType(pregenArgs[0] as FormChangeItem); return new FormChangeItemReward(pregenArgs[0] as FormChangeItem);
} }
const formChangeItemPool = [ const formChangeItemPool = [
@ -1438,16 +1426,7 @@ class FormChangeItemModifierTypeGenerator extends ModifierTypeGenerator {
fc.preFormKey === p.getFormKey(), fc.preFormKey === p.getFormKey(),
) )
.map(fc => fc.findTrigger(SpeciesFormChangeItemTrigger) as SpeciesFormChangeItemTrigger) .map(fc => fc.findTrigger(SpeciesFormChangeItemTrigger) as SpeciesFormChangeItemTrigger)
.filter( .filter(t => t?.active && !p.heldItemManager.hasFormChangeItem(t.item));
t =>
t?.active &&
!globalScene.findModifier(
m =>
m instanceof PokemonFormChangeItemModifier &&
m.pokemonId === p.id &&
m.formChangeItem === t.item,
),
);
if (p.species.speciesId === SpeciesId.NECROZMA) { if (p.species.speciesId === SpeciesId.NECROZMA) {
// technically we could use a simplified version and check for formChanges.length > 3, but in case any code changes later, this might break... // technically we could use a simplified version and check for formChanges.length > 3, but in case any code changes later, this might break...
@ -1490,7 +1469,7 @@ class FormChangeItemModifierTypeGenerator extends ModifierTypeGenerator {
return null; return null;
} }
return new FormChangeItemModifierType(formChangeItemPool[randSeedInt(formChangeItemPool.length)]); return new FormChangeItemReward(formChangeItemPool[randSeedInt(formChangeItemPool.length)]);
}); });
} }
} }
@ -1612,7 +1591,7 @@ export type GeneratorModifierOverride = {
} & ( } & (
| { | {
name: keyof Pick<typeof modifierTypes, "SPECIES_STAT_BOOSTER" | "RARE_SPECIES_STAT_BOOSTER">; name: keyof Pick<typeof modifierTypes, "SPECIES_STAT_BOOSTER" | "RARE_SPECIES_STAT_BOOSTER">;
type?: SpeciesStatBoosterItem; type?: SpeciesStatBoosterItemId;
} }
| { | {
name: keyof Pick<typeof modifierTypes, "TEMP_STAT_STAGE_BOOSTER">; name: keyof Pick<typeof modifierTypes, "TEMP_STAT_STAGE_BOOSTER">;
@ -1627,7 +1606,7 @@ export type GeneratorModifierOverride = {
type?: Nature; type?: Nature;
} }
| { | {
name: keyof Pick<typeof modifierTypes, "ATTACK_TYPE_BOOSTER_REWARD" | "ATTACK_TYPE_BOOSTER" | "TERA_SHARD">; name: keyof Pick<typeof modifierTypes, "ATTACK_TYPE_BOOSTER" | "TERA_SHARD">;
type?: PokemonType; type?: PokemonType;
} }
| { | {
@ -1665,8 +1644,9 @@ export const modifierTypes = {
EVOLUTION_ITEM: () => new EvolutionItemModifierTypeGenerator(false), EVOLUTION_ITEM: () => new EvolutionItemModifierTypeGenerator(false),
RARE_EVOLUTION_ITEM: () => new EvolutionItemModifierTypeGenerator(true), RARE_EVOLUTION_ITEM: () => new EvolutionItemModifierTypeGenerator(true),
FORM_CHANGE_ITEM: () => new FormChangeItemModifierTypeGenerator(false),
RARE_FORM_CHANGE_ITEM: () => new FormChangeItemModifierTypeGenerator(true), FORM_CHANGE_ITEM: () => new FormChangeItemRewardGenerator(false),
RARE_FORM_CHANGE_ITEM: () => new FormChangeItemRewardGenerator(true),
EVOLUTION_TRACKER_GIMMIGHOUL: () => new HeldItemReward(HeldItemId.GIMMIGHOUL_EVO_TRACKER), EVOLUTION_TRACKER_GIMMIGHOUL: () => new HeldItemReward(HeldItemId.GIMMIGHOUL_EVO_TRACKER),
@ -1728,8 +1708,8 @@ export const modifierTypes = {
SUPER_LURE: () => new DoubleBattleChanceBoosterModifierType("modifierType:ModifierType.SUPER_LURE", "super_lure", 15), SUPER_LURE: () => new DoubleBattleChanceBoosterModifierType("modifierType:ModifierType.SUPER_LURE", "super_lure", 15),
MAX_LURE: () => new DoubleBattleChanceBoosterModifierType("modifierType:ModifierType.MAX_LURE", "max_lure", 30), MAX_LURE: () => new DoubleBattleChanceBoosterModifierType("modifierType:ModifierType.MAX_LURE", "max_lure", 30),
SPECIES_STAT_BOOSTER: () => new SpeciesStatBoosterModifierTypeGenerator(false), SPECIES_STAT_BOOSTER: () => new SpeciesStatBoosterRewardGenerator(false),
RARE_SPECIES_STAT_BOOSTER: () => new SpeciesStatBoosterModifierTypeGenerator(true), RARE_SPECIES_STAT_BOOSTER: () => new SpeciesStatBoosterRewardGenerator(true),
TEMP_STAT_STAGE_BOOSTER: () => new TempStatStageBoosterModifierTypeGenerator(), TEMP_STAT_STAGE_BOOSTER: () => new TempStatStageBoosterModifierTypeGenerator(),
@ -2847,8 +2827,8 @@ export function regenerateModifierPoolThresholds(party: Pokemon[], poolType: Mod
: weightedModifierType.modifierType; : weightedModifierType.modifierType;
const weight = const weight =
!existingModifiers.length || !existingModifiers.length ||
itemModifierType instanceof PokemonHeldItemModifierType || itemModifierType instanceof HeldItemReward ||
itemModifierType instanceof FormChangeItemModifierType || itemModifierType instanceof FormChangeItemReward ||
existingModifiers.find(m => m.stackCount < m.getMaxStackCount(true)) existingModifiers.find(m => m.stackCount < m.getMaxStackCount(true))
? weightedModifierType.weight instanceof Function ? weightedModifierType.weight instanceof Function
? // biome-ignore lint/complexity/noBannedTypes: TODO: refactor to not use Function type ? // biome-ignore lint/complexity/noBannedTypes: TODO: refactor to not use Function type
@ -3146,28 +3126,7 @@ export function getEnemyBuffModifierForWave(
return modifier; return modifier;
} }
export function getEnemyModifierTypesForWave(
waveIndex: number,
count: number,
party: EnemyPokemon[],
poolType: ModifierPoolType.WILD | ModifierPoolType.TRAINER,
upgradeChance = 0,
): PokemonHeldItemModifierType[] {
const ret = new Array(count)
.fill(0)
.map(
() =>
getNewModifierTypeOption(party, poolType, undefined, upgradeChance && !randSeedInt(upgradeChance) ? 1 : 0)
?.type as PokemonHeldItemModifierType,
);
if (!(waveIndex % 1000)) {
ret.push(getModifierType(modifierTypes.MINI_BLACK_HOLE) as PokemonHeldItemModifierType);
}
return ret;
}
// TODO: Add proper documentation to this function (once it fully works...) // TODO: Add proper documentation to this function (once it fully works...)
// TODO: Convert trainer pool to HeldItemId too
export function getEnemyHeldItemsForWave( export function getEnemyHeldItemsForWave(
waveIndex: number, waveIndex: number,
count: number, count: number,

View File

@ -13,7 +13,7 @@ import {
PokemonPpUpModifierType, PokemonPpUpModifierType,
ModifierPoolType, ModifierPoolType,
getPlayerModifierTypeOptions, getPlayerModifierTypeOptions,
PokemonHeldItemReward, HeldItemReward,
} from "#app/modifier/modifier-type"; } from "#app/modifier/modifier-type";
import type { Modifier } from "#app/modifier/modifier"; import type { Modifier } from "#app/modifier/modifier";
import { ExtraModifierModifier, HealShopCostModifier, TempExtraModifierModifier } from "#app/modifier/modifier"; import { ExtraModifierModifier, HealShopCostModifier, TempExtraModifierModifier } from "#app/modifier/modifier";
@ -168,7 +168,7 @@ export class SelectModifierPhase extends BattlePhase {
modifierSelectCallback: ModifierSelectCallback, modifierSelectCallback: ModifierSelectCallback,
): boolean { ): boolean {
if (modifierType instanceof PokemonModifierType) { if (modifierType instanceof PokemonModifierType) {
if (modifierType instanceof PokemonHeldItemReward) { if (modifierType instanceof HeldItemReward) {
this.openGiveHeldItemMenu(modifierType, modifierSelectCallback); this.openGiveHeldItemMenu(modifierType, modifierSelectCallback);
} }
if (modifierType instanceof FusePokemonModifierType) { if (modifierType instanceof FusePokemonModifierType) {