More various fixes; introduced isMaxStack(item) method to heldItemManager

This commit is contained in:
Wlowscha 2025-06-10 23:29:29 +02:00
parent c198297abd
commit 64b1cf1669
No known key found for this signature in database
GPG Key ID: 3C8F1AD330565D04
4 changed files with 42 additions and 75 deletions

View File

@ -67,7 +67,6 @@ import {
} from "../abilities/ability";
import { allAbilities, allMoves } from "../data-lists";
import {
PokemonHeldItemModifier,
PreserveBerryModifier,
} from "../../modifier/modifier";
import type { BattlerIndex } from "#enums/battler-index";
@ -118,7 +117,6 @@ import { MoveFlags } from "#enums/MoveFlags";
import { MoveEffectTrigger } from "#enums/MoveEffectTrigger";
import { MultiHitType } from "#enums/MultiHitType";
import { invalidAssistMoves, invalidCopycatMoves, invalidMetronomeMoves, invalidMirrorMoveMoves, invalidSleepTalkMoves } from "./invalid-moves";
import { TrainerVariant } from "#app/field/trainer";
import { SelectBiomePhase } from "#app/phases/select-biome-phase";
import { allHeldItems, applyHeldItems } from "#app/items/all-held-items";
import { ITEM_EFFECT } from "#app/items/held-item";
@ -2735,19 +2733,14 @@ export class RemoveHeldItemAttr extends MoveEffectAttr {
return true;
}
getTargetHeldItems(target: Pokemon): PokemonHeldItemModifier[] {
return globalScene.findModifiers(m => m instanceof PokemonHeldItemModifier
&& m.pokemonId === target.id, target.isPlayer()) as PokemonHeldItemModifier[];
}
getUserBenefitScore(user: Pokemon, target: Pokemon, move: Move): number {
const heldItems = this.getTargetHeldItems(target);
const heldItems = target.getHeldItems();
return heldItems.length ? 5 : 0;
}
getTargetBenefitScore(user: Pokemon, target: Pokemon, move: Move): number {
const heldItems = this.getTargetHeldItems(target);
const heldItems = target.getHeldItems();
return heldItems.length ? -5 : 0;
}
}

View File

@ -73,6 +73,11 @@ export class PokemonItemManager {
return item ? item.stack : 0;
}
isMaxStack(itemType: HeldItemId): boolean {
const item = this.heldItems[itemType];
return item ? item.stack >= allHeldItems[itemType].getMaxStackCount() : false;
}
overrideItems(newItems: HeldItemPropertyMap) {
this.heldItems = newItems;
}

View File

@ -60,7 +60,6 @@ import {
EnemyDamageReducerModifier,
EnemyFusionChanceModifier,
HiddenAbilityRateBoosterModifier,
PokemonHeldItemModifier,
ShinyRateBoosterModifier,
TempStatStageBoosterModifier,
TempCritBoosterModifier,
@ -5823,14 +5822,10 @@ export class PlayerPokemon extends Pokemon {
globalScene.getPlayerParty().push(newPokemon);
newPokemon.evolve(!isFusion ? newEvolution : new FusionSpeciesFormEvolution(this.id, newEvolution), evoSpecies);
const modifiers = globalScene.findModifiers(
m => m instanceof PokemonHeldItemModifier && m.pokemonId === this.id,
true,
) as PokemonHeldItemModifier[];
modifiers.forEach(m => {
const clonedModifier = m.clone() as PokemonHeldItemModifier;
clonedModifier.pokemonId = newPokemon.id;
globalScene.addModifier(clonedModifier, true);
//TODO: This currently does not consider any values associated with the items e.g. disabled
const heldItems = this.getHeldItems();
heldItems.forEach(item => {
newPokemon.heldItemManager.add(item, this.heldItemManager.getStack(item));
});
globalScene.updateModifiers(true);
}

View File

@ -7,7 +7,6 @@ import { Command } from "#enums/command";
import MessageUiHandler from "#app/ui/message-ui-handler";
import { UiMode } from "#enums/ui-mode";
import { BooleanHolder, toReadableString, randInt, getLocalizedSpriteKey } from "#app/utils/common";
import { PokemonHeldItemModifier } from "#app/modifier/modifier";
import { allMoves } from "#app/data/data-lists";
import { Gender, getGenderColor, getGenderSymbol } from "#app/data/gender";
import { StatusEffect } from "#enums/status-effect";
@ -30,6 +29,7 @@ import type { CommandPhase } from "#app/phases/command-phase";
import { globalScene } from "#app/global-scene";
import { HeldItemId } from "#enums/held-item-id";
import { formChangeItemName } from "#app/data/pokemon-forms";
import { allHeldItems } from "#app/items/all-held-items";
const defaultMessage = i18next.t("partyUiHandler:choosePokemon");
@ -140,10 +140,7 @@ export type PartyModifierTransferSelectCallback = (
) => void;
export type PartyModifierSpliceSelectCallback = (fromCursor: number, toCursor?: number) => void;
export type PokemonSelectFilter = (pokemon: PlayerPokemon) => string | null;
export type PokemonModifierTransferSelectFilter = (
pokemon: PlayerPokemon,
modifier: PokemonHeldItemModifier,
) => string | null;
export type PokemonModifierTransferSelectFilter = (pokemon: PlayerPokemon, item: HeldItemId) => string | null;
export type PokemonMoveSelectFilter = (pokemonMove: PokemonMove) => string | null;
export default class PartyUiHandler extends MessageUiHandler {
@ -222,11 +219,8 @@ export default class PartyUiHandler extends MessageUiHandler {
private static FilterAllMoves = (_pokemonMove: PokemonMove) => null;
public static FilterItemMaxStacks = (pokemon: PlayerPokemon, modifier: PokemonHeldItemModifier) => {
const matchingModifier = globalScene.findModifier(
m => m instanceof PokemonHeldItemModifier && m.pokemonId === pokemon.id && m.matchType(modifier),
) as PokemonHeldItemModifier;
if (matchingModifier && matchingModifier.stackCount === matchingModifier.getMaxStackCount()) {
public static FilterItemMaxStacks = (pokemon: PlayerPokemon, item: HeldItemId) => {
if (pokemon.heldItemManager.isMaxStack(item)) {
return i18next.t("partyUiHandler:tooManyItems", { pokemonName: getPokemonNameWithAffix(pokemon, false) });
}
return null;
@ -505,8 +499,10 @@ export default class PartyUiHandler extends MessageUiHandler {
const ui = this.getUi();
if (this.transferCursor !== this.cursor) {
if (this.transferAll) {
this.getTransferrableItemsFromPokemon(globalScene.getPlayerParty()[this.transferCursor]).forEach(
(_, i, array) => {
globalScene
.getPlayerParty()
[this.transferCursor].heldItemManager.getTransferableHeldItems()
.forEach((_, i, array) => {
const invertedIndex = array.length - 1 - i;
(this.selectCallback as PartyModifierTransferSelectCallback)(
this.transferCursor,
@ -514,8 +510,7 @@ export default class PartyUiHandler extends MessageUiHandler {
this.transferQuantitiesMax[invertedIndex],
this.cursor,
);
},
);
});
} else {
(this.selectCallback as PartyModifierTransferSelectCallback)(
this.transferCursor,
@ -550,18 +545,15 @@ export default class PartyUiHandler extends MessageUiHandler {
const newPokemon = globalScene.getPlayerParty()[p];
// this next bit checks to see if the the selected item from the original transfer pokemon exists on the new pokemon `p`
// this returns `undefined` if the new pokemon doesn't have the item at all, otherwise it returns the `pokemonHeldItemModifier` for that item
const matchingModifier = globalScene.findModifier(
m =>
m instanceof PokemonHeldItemModifier &&
m.pokemonId === newPokemon.id &&
m.matchType(this.getTransferrableItemsFromPokemon(pokemon)[this.transferOptionCursor]),
) as PokemonHeldItemModifier;
const transferItem = pokemon.heldItemManager.getTransferableHeldItems()[this.transferOptionCursor];
const matchingItem = newPokemon.heldItemManager.hasItem(transferItem);
const partySlot = this.partySlots.filter(m => m.getPokemon() === newPokemon)[0]; // this gets pokemon [p] for us
if (p !== this.transferCursor) {
// this skips adding the able/not able labels on the pokemon doing the transfer
if (matchingModifier) {
if (matchingItem) {
// if matchingModifier exists then the item exists on the new pokemon
if (matchingModifier.getMaxStackCount() === matchingModifier.stackCount) {
if (newPokemon.heldItemManager.isMaxStack(transferItem)) {
// checks to see if the stack of items is at max stack; if so, set the description label to "Not able"
ableToTransferText = i18next.t("partyUiHandler:notAble");
} else {
@ -683,12 +675,6 @@ export default class PartyUiHandler extends MessageUiHandler {
return success;
}
private getTransferrableItemsFromPokemon(pokemon: PlayerPokemon) {
return globalScene.findModifiers(
m => m instanceof PokemonHeldItemModifier && m.isTransferable && m.pokemonId === pokemon.id,
) as PokemonHeldItemModifier[];
}
private getFilterResult(option: number, pokemon: PlayerPokemon): string | null {
let filterResult: string | null;
if (option !== PartyOption.TRANSFER && option !== PartyOption.SPLICE) {
@ -702,7 +688,7 @@ export default class PartyUiHandler extends MessageUiHandler {
} else {
filterResult = (this.selectFilter as PokemonModifierTransferSelectFilter)(
pokemon,
this.getTransferrableItemsFromPokemon(globalScene.getPlayerParty()[this.transferCursor])[
globalScene.getPlayerParty()[this.transferCursor].heldItemManager.getTransferableHeldItems()[
this.transferOptionCursor
],
);
@ -924,14 +910,10 @@ export default class PartyUiHandler extends MessageUiHandler {
if (this.cursor < 6) {
if (this.partyUiMode === PartyUiMode.MODIFIER_TRANSFER && !this.transferMode) {
/** Initialize item quantities for the selected Pokemon */
const itemModifiers = globalScene.findModifiers(
m =>
m instanceof PokemonHeldItemModifier &&
m.isTransferable &&
m.pokemonId === globalScene.getPlayerParty()[this.cursor].id,
) as PokemonHeldItemModifier[];
this.transferQuantities = itemModifiers.map(item => item.getStackCount());
this.transferQuantitiesMax = itemModifiers.map(item => item.getStackCount());
const pokemon = globalScene.getPlayerParty()[this.cursor];
const items = pokemon.heldItemManager.getTransferableHeldItems();
this.transferQuantities = items.map(item => pokemon.heldItemManager.getStack(item));
this.transferQuantitiesMax = items.map(item => pokemon.heldItemManager.getStack(item));
}
this.showOptions();
ui.playSelect();
@ -1177,14 +1159,6 @@ export default class PartyUiHandler extends MessageUiHandler {
);
}
private getItemModifiers(pokemon: Pokemon): PokemonHeldItemModifier[] {
return (
(globalScene.findModifiers(
m => m instanceof PokemonHeldItemModifier && m.isTransferable && m.pokemonId === pokemon.id,
) as PokemonHeldItemModifier[]) ?? []
);
}
private updateOptionsWithRememberMoveModifierMode(pokemon): void {
const learnableMoves = pokemon.getLearnableLevelMoves();
for (let m = 0; m < learnableMoves.length; m++) {
@ -1204,11 +1178,11 @@ export default class PartyUiHandler extends MessageUiHandler {
}
private updateOptionsWithModifierTransferMode(pokemon): void {
const itemModifiers = this.getItemModifiers(pokemon);
for (let im = 0; im < itemModifiers.length; im++) {
const items = pokemon.getHeldItems();
for (let im = 0; im < items.length; im++) {
this.options.push(im);
}
if (itemModifiers.length > 1) {
if (items.length > 1) {
this.options.push(PartyOption.ALL);
}
}
@ -1422,9 +1396,9 @@ export default class PartyUiHandler extends MessageUiHandler {
} else if (option === PartyOption.ALL) {
optionName = i18next.t("partyUiHandler:ALL");
} else {
const itemModifiers = this.getItemModifiers(pokemon);
const itemModifier = itemModifiers[option];
optionName = itemModifier.type.name;
const items = pokemon.getHeldItems();
const item = items[option];
optionName = allHeldItems[item].name;
}
const yCoord = -6 - 16 * o;
@ -1436,19 +1410,19 @@ export default class PartyUiHandler extends MessageUiHandler {
optionText.setOrigin(0, 0);
/** For every item that has stack bigger than 1, display the current quantity selection */
const itemModifiers = this.getItemModifiers(pokemon);
const itemModifier = itemModifiers[option];
const items = pokemon.getHeldItems();
const item = items[option];
if (
this.partyUiMode === PartyUiMode.MODIFIER_TRANSFER &&
this.transferQuantitiesMax[option] > 1 &&
!this.transferMode &&
itemModifier !== undefined &&
itemModifier.type.name === optionName
item !== undefined &&
allHeldItems[item].name === optionName
) {
let amountText = ` (${this.transferQuantities[option]})`;
/** If the amount held is the maximum, display the count in red */
if (this.transferQuantitiesMax[option] === itemModifier.getMaxHeldItemCount(undefined)) {
if (this.transferQuantitiesMax[option] === allHeldItems[item].maxStackCount) {
amountText = `[color=${getTextColor(TextStyle.SUMMARY_RED)}]${amountText}[/color]`;
}