Splitting held items to their own file

This commit is contained in:
Wlowscha 2025-05-29 16:10:59 +02:00
parent 908c78ae03
commit 604c216e12
No known key found for this signature in database
GPG Key ID: 3C8F1AD330565D04
11 changed files with 2152 additions and 2115 deletions

View File

@ -19,7 +19,7 @@ import {
type Constructor, type Constructor,
} from "#app/utils/common"; } from "#app/utils/common";
import { deepMergeSpriteData } from "#app/utils/data"; import { deepMergeSpriteData } from "#app/utils/data";
import type { Modifier, ModifierPredicate, TurnHeldItemTransferModifier } from "./modifier/modifier"; import type { Modifier, ModifierPredicate } from "./modifier/modifier";
import { import {
ConsumableModifier, ConsumableModifier,
ConsumablePokemonModifier, ConsumablePokemonModifier,
@ -28,14 +28,9 @@ import {
ExpShareModifier, ExpShareModifier,
FusePokemonModifier, FusePokemonModifier,
HealingBoosterModifier, HealingBoosterModifier,
ModifierBar,
MultipleParticipantExpBonusModifier, MultipleParticipantExpBonusModifier,
PersistentModifier, PersistentModifier,
PokemonExpBoosterModifier,
PokemonFormChangeItemModifier,
PokemonHeldItemModifier,
PokemonHpRestoreModifier, PokemonHpRestoreModifier,
PokemonIncrementingStatModifier,
RememberMoveModifier, RememberMoveModifier,
} from "./modifier/modifier"; } from "./modifier/modifier";
import { PokeballType } from "#enums/pokeball"; import { PokeballType } from "#enums/pokeball";
@ -182,6 +177,14 @@ import { hasExpSprite } from "./sprites/sprite-utils";
import { timedEventManager } from "./global-event-manager"; import { timedEventManager } from "./global-event-manager";
import { starterColors } from "./global-vars/starter-colors"; import { starterColors } from "./global-vars/starter-colors";
import { startingWave } from "./starting-wave"; import { startingWave } from "./starting-wave";
import { ModifierBar } from "./modifier/modifier-bar";
import {
PokemonExpBoosterModifier,
PokemonFormChangeItemModifier,
PokemonHeldItemModifier,
PokemonIncrementingStatModifier,
type TurnHeldItemTransferModifier,
} from "./modifier/held-item-modifier";
const DEBUG_RNG = false; const DEBUG_RNG = false;

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,82 @@
import { globalScene } from "#app/global-scene";
import { modifierSortFunc, type PokemonHeldItemModifier } from "./held-item-modifier";
import type { PersistentModifier } from "./modifier";
const iconOverflowIndex = 24;
export class ModifierBar extends Phaser.GameObjects.Container {
private player: boolean;
private modifierCache: PersistentModifier[];
constructor(enemy?: boolean) {
super(globalScene, 1 + (enemy ? 302 : 0), 2);
this.player = !enemy;
this.setScale(0.5);
}
/**
* Method to update content displayed in {@linkcode ModifierBar}
* @param {PersistentModifier[]} modifiers - The list of modifiers to be displayed in the {@linkcode ModifierBar}
* @param {boolean} hideHeldItems - If set to "true", only modifiers not assigned to a Pokémon are displayed
*/
updateModifiers(modifiers: PersistentModifier[], hideHeldItems = false) {
this.removeAll(true);
const visibleIconModifiers = modifiers.filter(m => m.isIconVisible());
const nonPokemonSpecificModifiers = visibleIconModifiers
.filter(m => !(m as PokemonHeldItemModifier).pokemonId)
.sort(modifierSortFunc);
const pokemonSpecificModifiers = visibleIconModifiers
.filter(m => (m as PokemonHeldItemModifier).pokemonId)
.sort(modifierSortFunc);
const sortedVisibleIconModifiers = hideHeldItems
? nonPokemonSpecificModifiers
: nonPokemonSpecificModifiers.concat(pokemonSpecificModifiers);
sortedVisibleIconModifiers.forEach((modifier: PersistentModifier, i: number) => {
const icon = modifier.getIcon();
if (i >= iconOverflowIndex) {
icon.setVisible(false);
}
this.add(icon);
this.setModifierIconPosition(icon, sortedVisibleIconModifiers.length);
icon.setInteractive(new Phaser.Geom.Rectangle(0, 0, 32, 24), Phaser.Geom.Rectangle.Contains);
icon.on("pointerover", () => {
globalScene.ui.showTooltip(modifier.type.name, modifier.type.getDescription());
if (this.modifierCache && this.modifierCache.length > iconOverflowIndex) {
this.updateModifierOverflowVisibility(true);
}
});
icon.on("pointerout", () => {
globalScene.ui.hideTooltip();
if (this.modifierCache && this.modifierCache.length > iconOverflowIndex) {
this.updateModifierOverflowVisibility(false);
}
});
});
for (const icon of this.getAll()) {
this.sendToBack(icon);
}
this.modifierCache = modifiers;
}
updateModifierOverflowVisibility(ignoreLimit: boolean) {
const modifierIcons = this.getAll().reverse();
for (const modifier of modifierIcons.map(m => m as Phaser.GameObjects.Container).slice(iconOverflowIndex)) {
modifier.setVisible(ignoreLimit);
}
}
setModifierIconPosition(icon: Phaser.GameObjects.Container, modifierCount: number) {
const rowIcons: number = 12 + 6 * Math.max(Math.ceil(Math.min(modifierCount, 24) / 12) - 2, 0);
const x = ((this.getIndex(icon) % rowIcons) * 26) / (rowIcons / 12);
const y = Math.floor(this.getIndex(icon) / rowIcons) * 20;
icon.setPosition(this.player ? x : -x, y);
}
}

View File

@ -11,14 +11,13 @@ import { Moves } from "#enums/moves";
import { PokeballType } from "#enums/pokeball"; import { PokeballType } from "#enums/pokeball";
import { Species } from "#enums/species"; import { Species } from "#enums/species";
import { StatusEffect } from "#enums/status-effect"; import { StatusEffect } from "#enums/status-effect";
import type { EnemyPersistentModifier, PersistentModifier } from "./modifier";
import { import {
BerryModifier, BerryModifier,
type EnemyPersistentModifier,
type PersistentModifier,
type PokemonHeldItemModifier, type PokemonHeldItemModifier,
SpeciesCritBoosterModifier, SpeciesCritBoosterModifier,
TurnStatusEffectModifier, TurnStatusEffectModifier,
} from "./modifier"; } from "./held-item-modifier";
import { ModifierTier } from "./modifier-tier"; import { ModifierTier } from "./modifier-tier";
import { import {
FormChangeItemModifierType, FormChangeItemModifierType,

View File

@ -20,14 +20,7 @@ import { getPokemonNameWithAffix } from "#app/messages";
import { import {
AddPokeballModifier, AddPokeballModifier,
AddVoucherModifier, AddVoucherModifier,
AttackTypeBoosterModifier,
BaseStatModifier,
BerryModifier,
BoostBugSpawnModifier, BoostBugSpawnModifier,
BypassSpeedChanceModifier,
ContactHeldItemTransferChanceModifier,
CritBoosterModifier,
DamageMoneyRewardModifier,
DoubleBattleChanceBoosterModifier, DoubleBattleChanceBoosterModifier,
EnemyAttackStatusEffectChanceModifier, EnemyAttackStatusEffectChanceModifier,
EnemyDamageBoosterModifier, EnemyDamageBoosterModifier,
@ -37,19 +30,15 @@ import {
EnemyStatusEffectHealChanceModifier, EnemyStatusEffectHealChanceModifier,
EnemyTurnHealModifier, EnemyTurnHealModifier,
EvolutionItemModifier, EvolutionItemModifier,
EvolutionStatBoosterModifier,
EvoTrackerModifier,
ExpBalanceModifier, ExpBalanceModifier,
ExpBoosterModifier, ExpBoosterModifier,
ExpShareModifier, ExpShareModifier,
ExtraModifierModifier, ExtraModifierModifier,
FlinchChanceModifier,
FusePokemonModifier, FusePokemonModifier,
GigantamaxAccessModifier, GigantamaxAccessModifier,
HealingBoosterModifier, HealingBoosterModifier,
HealShopCostModifier, HealShopCostModifier,
HiddenAbilityRateBoosterModifier, HiddenAbilityRateBoosterModifier,
HitHealModifier,
IvScannerModifier, IvScannerModifier,
LevelIncrementBoosterModifier, LevelIncrementBoosterModifier,
LockModifierTiersModifier, LockModifierTiersModifier,
@ -60,44 +49,57 @@ import {
MoneyRewardModifier, MoneyRewardModifier,
MultipleParticipantExpBonusModifier, MultipleParticipantExpBonusModifier,
PokemonAllMovePpRestoreModifier, PokemonAllMovePpRestoreModifier,
PokemonHpRestoreModifier,
PokemonLevelIncrementModifier,
PokemonNatureChangeModifier,
PokemonPpRestoreModifier,
PokemonPpUpModifier,
PokemonStatusHealModifier,
RememberMoveModifier,
ShinyRateBoosterModifier,
TempCritBoosterModifier,
TempStatStageBoosterModifier,
TerastallizeAccessModifier,
TerrastalizeModifier,
TmModifier,
type Modifier,
TempExtraModifierModifier,
CriticalCatchChanceBoosterModifier,
} from "#app/modifier/modifier";
import {
AttackTypeBoosterModifier,
BaseStatModifier,
BerryModifier,
BypassSpeedChanceModifier,
ContactHeldItemTransferChanceModifier,
CritBoosterModifier,
DamageMoneyRewardModifier,
EvolutionStatBoosterModifier,
EvoTrackerModifier,
FlinchChanceModifier,
HitHealModifier,
PokemonBaseStatFlatModifier, PokemonBaseStatFlatModifier,
PokemonBaseStatTotalModifier, PokemonBaseStatTotalModifier,
PokemonExpBoosterModifier, PokemonExpBoosterModifier,
PokemonFormChangeItemModifier, PokemonFormChangeItemModifier,
PokemonFriendshipBoosterModifier, PokemonFriendshipBoosterModifier,
PokemonHeldItemModifier, PokemonHeldItemModifier,
PokemonHpRestoreModifier,
PokemonIncrementingStatModifier, PokemonIncrementingStatModifier,
PokemonInstantReviveModifier, PokemonInstantReviveModifier,
PokemonLevelIncrementModifier,
PokemonMoveAccuracyBoosterModifier, PokemonMoveAccuracyBoosterModifier,
PokemonMultiHitModifier, PokemonMultiHitModifier,
PokemonNatureChangeModifier,
PokemonNatureWeightModifier, PokemonNatureWeightModifier,
PokemonPpRestoreModifier,
PokemonPpUpModifier,
PokemonStatusHealModifier,
PreserveBerryModifier, PreserveBerryModifier,
RememberMoveModifier,
ResetNegativeStatStageModifier, ResetNegativeStatStageModifier,
ShinyRateBoosterModifier,
SpeciesCritBoosterModifier, SpeciesCritBoosterModifier,
SpeciesStatBoosterModifier, SpeciesStatBoosterModifier,
SurviveDamageModifier, SurviveDamageModifier,
SwitchEffectTransferModifier, SwitchEffectTransferModifier,
TempCritBoosterModifier,
TempStatStageBoosterModifier,
TerastallizeAccessModifier,
TerrastalizeModifier,
TmModifier,
TurnHealModifier, TurnHealModifier,
TurnHeldItemTransferModifier, TurnHeldItemTransferModifier,
TurnStatusEffectModifier, TurnStatusEffectModifier,
type Modifier,
TempExtraModifierModifier,
CriticalCatchChanceBoosterModifier,
FieldEffectModifier, FieldEffectModifier,
} from "#app/modifier/modifier"; } from "#app/modifier/held-item-modifier";
import { ModifierTier } from "#app/modifier/modifier-tier"; import { ModifierTier } from "#app/modifier/modifier-tier";
import { getVoucherTypeIcon, getVoucherTypeName, VoucherType } from "#app/system/voucher"; import { getVoucherTypeIcon, getVoucherTypeName, VoucherType } from "#app/system/voucher";
import type { PokemonMoveSelectFilter, PokemonSelectFilter } from "#app/ui/party-ui-handler"; import type { PokemonMoveSelectFilter, PokemonSelectFilter } from "#app/ui/party-ui-handler";

File diff suppressed because it is too large Load Diff

View File

@ -19,7 +19,7 @@ import { EncounterPhaseEvent } from "#app/events/battle-scene";
import type Pokemon from "#app/field/pokemon"; import type Pokemon from "#app/field/pokemon";
import { FieldPosition } from "#app/field/pokemon"; import { FieldPosition } from "#app/field/pokemon";
import { getPokemonNameWithAffix } from "#app/messages"; import { getPokemonNameWithAffix } from "#app/messages";
import { BoostBugSpawnModifier, IvScannerModifier, TurnHeldItemTransferModifier } from "#app/modifier/modifier"; import { BoostBugSpawnModifier, IvScannerModifier } from "#app/modifier/modifier";
import { ModifierPoolType, regenerateModifierPoolThresholds } from "#app/modifier/modifier-pool"; import { ModifierPoolType, regenerateModifierPoolThresholds } from "#app/modifier/modifier-pool";
import Overrides from "#app/overrides"; import Overrides from "#app/overrides";
import { BattlePhase } from "#app/phases/battle-phase"; import { BattlePhase } from "#app/phases/battle-phase";
@ -41,10 +41,11 @@ import { Biome } from "#enums/biome";
import { MysteryEncounterMode } from "#enums/mystery-encounter-mode"; import { MysteryEncounterMode } from "#enums/mystery-encounter-mode";
import { PlayerGender } from "#enums/player-gender"; import { PlayerGender } from "#enums/player-gender";
import { Species } from "#enums/species"; import { Species } from "#enums/species";
import { overrideHeldItems, overrideModifiers } from "#app/modifier/modifier"; import { overrideModifiers } from "#app/modifier/modifier";
import i18next from "i18next"; import i18next from "i18next";
import { WEIGHT_INCREMENT_ON_SPAWN_MISS } from "#app/data/mystery-encounters/mystery-encounters"; import { WEIGHT_INCREMENT_ON_SPAWN_MISS } from "#app/data/mystery-encounters/mystery-encounters";
import { getNatureName } from "#app/data/nature"; import { getNatureName } from "#app/data/nature";
import { overrideHeldItems, TurnHeldItemTransferModifier } from "#app/modifier/held-item-modifier";
export class EncounterPhase extends BattlePhase { export class EncounterPhase extends BattlePhase {
private loaded: boolean; private loaded: boolean;

View File

@ -5,7 +5,7 @@ import { getPokeballAtlasKey } from "#app/data/pokeball";
import { addTextObject, getTextStyleOptions, getModifierTierTextTint, getTextColor, TextStyle } from "./text"; import { addTextObject, getTextStyleOptions, getModifierTierTextTint, getTextColor, TextStyle } from "./text";
import AwaitableUiHandler from "./awaitable-ui-handler"; import AwaitableUiHandler from "./awaitable-ui-handler";
import { UiMode } from "#enums/ui-mode"; import { UiMode } from "#enums/ui-mode";
import { LockModifierTiersModifier, PokemonHeldItemModifier, HealShopCostModifier } from "../modifier/modifier"; import { LockModifierTiersModifier, HealShopCostModifier } from "../modifier/modifier";
import { handleTutorial, Tutorial } from "../tutorial"; import { handleTutorial, Tutorial } from "../tutorial";
import { Button } from "#enums/buttons"; import { Button } from "#enums/buttons";
import MoveInfoOverlay from "./move-info-overlay"; import MoveInfoOverlay from "./move-info-overlay";
@ -17,6 +17,7 @@ import { ShopCursorTarget } from "#app/enums/shop-cursor-target";
import Phaser from "phaser"; import Phaser from "phaser";
import type { PokeballType } from "#enums/pokeball"; import type { PokeballType } from "#enums/pokeball";
import { getPlayerShopModifierTypeOptionsForWave } from "#app/modifier/modifier-pool"; import { getPlayerShopModifierTypeOptionsForWave } from "#app/modifier/modifier-pool";
import { PokemonHeldItemModifier } from "#app/modifier/held-item-modifier";
export const SHOP_OPTIONS_ROW_LIMIT = 7; export const SHOP_OPTIONS_ROW_LIMIT = 7;
const SINGLE_SHOP_ROW_YOFFSET = 12; const SINGLE_SHOP_ROW_YOFFSET = 12;

View File

@ -27,6 +27,7 @@ import { SettingKeyboard } from "#app/system/settings/settings-keyboard";
import { getBiomeName } from "#app/data/balance/biomes"; import { getBiomeName } from "#app/data/balance/biomes";
import type { MysteryEncounterType } from "#enums/mystery-encounter-type"; import type { MysteryEncounterType } from "#enums/mystery-encounter-type";
import { globalScene } from "#app/global-scene"; import { globalScene } from "#app/global-scene";
import { modifierSortFunc, PokemonHeldItemModifier } from "#app/modifier/held-item-modifier";
/** /**
* RunInfoUiMode indicates possible overlays of RunInfoUiHandler. * RunInfoUiMode indicates possible overlays of RunInfoUiHandler.
@ -650,7 +651,7 @@ export default class RunInfoUiHandler extends UiHandler {
modifierIconsContainer.setScale(0.45); modifierIconsContainer.setScale(0.45);
for (const m of this.runInfo.modifiers) { for (const m of this.runInfo.modifiers) {
const modifier = m.toModifier(this.modifiersModule[m.className]); const modifier = m.toModifier(this.modifiersModule[m.className]);
if (modifier instanceof Modifier.PokemonHeldItemModifier) { if (modifier instanceof PokemonHeldItemModifier) {
continue; continue;
} }
const icon = modifier?.getIcon(false); const icon = modifier?.getIcon(false);
@ -881,17 +882,17 @@ export default class RunInfoUiHandler extends UiHandler {
const heldItemsScale = const heldItemsScale =
this.runInfo.gameMode === GameModes.SPLICED_ENDLESS || this.runInfo.gameMode === GameModes.ENDLESS ? 0.25 : 0.5; this.runInfo.gameMode === GameModes.SPLICED_ENDLESS || this.runInfo.gameMode === GameModes.ENDLESS ? 0.25 : 0.5;
const heldItemsContainer = globalScene.add.container(-82, 2); const heldItemsContainer = globalScene.add.container(-82, 2);
const heldItemsList: Modifier.PokemonHeldItemModifier[] = []; const heldItemsList: PokemonHeldItemModifier[] = [];
if (this.runInfo.modifiers.length) { if (this.runInfo.modifiers.length) {
for (const m of this.runInfo.modifiers) { for (const m of this.runInfo.modifiers) {
const modifier = m.toModifier(this.modifiersModule[m.className]); const modifier = m.toModifier(this.modifiersModule[m.className]);
if (modifier instanceof Modifier.PokemonHeldItemModifier && modifier.pokemonId === pokemon.id) { if (modifier instanceof PokemonHeldItemModifier && modifier.pokemonId === pokemon.id) {
modifier.stackCount = m["stackCount"]; modifier.stackCount = m["stackCount"];
heldItemsList.push(modifier); heldItemsList.push(modifier);
} }
} }
if (heldItemsList.length > 0) { if (heldItemsList.length > 0) {
(heldItemsList as Modifier.PokemonHeldItemModifier[]).sort(Modifier.modifierSortFunc); (heldItemsList as PokemonHeldItemModifier[]).sort(modifierSortFunc);
let row = 0; let row = 0;
for (const [index, item] of heldItemsList.entries()) { for (const [index, item] of heldItemsList.entries()) {
if (index > 36) { if (index > 36) {

View File

@ -24,7 +24,6 @@ import { MoveCategory } from "#enums/MoveCategory";
import { getPokeballAtlasKey } from "#app/data/pokeball"; import { getPokeballAtlasKey } from "#app/data/pokeball";
import { getGenderColor, getGenderSymbol } from "#app/data/gender"; import { getGenderColor, getGenderSymbol } from "#app/data/gender";
import { getLevelRelExp, getLevelTotalExp } from "#app/data/exp"; import { getLevelRelExp, getLevelTotalExp } from "#app/data/exp";
import { PokemonHeldItemModifier } from "#app/modifier/modifier";
import { StatusEffect } from "#enums/status-effect"; import { StatusEffect } from "#enums/status-effect";
import { getBiomeName } from "#app/data/balance/biomes"; import { getBiomeName } from "#app/data/balance/biomes";
import { getNatureName, getNatureStatMultiplier } from "#app/data/nature"; import { getNatureName, getNatureStatMultiplier } from "#app/data/nature";
@ -34,11 +33,11 @@ import { getVariantTint } from "#app/sprites/variant";
import { Button } from "#enums/buttons"; import { Button } from "#enums/buttons";
import type { Ability } from "#app/data/abilities/ability-class"; import type { Ability } from "#app/data/abilities/ability-class";
import i18next from "i18next"; import i18next from "i18next";
import { modifierSortFunc } from "#app/modifier/modifier";
import { PlayerGender } from "#enums/player-gender"; import { PlayerGender } from "#enums/player-gender";
import { Stat, PERMANENT_STATS, getStatKey } from "#enums/stat"; import { Stat, PERMANENT_STATS, getStatKey } from "#enums/stat";
import { Nature } from "#enums/nature"; import { Nature } from "#enums/nature";
import { achvs } from "#app/system/achv"; import { achvs } from "#app/system/achv";
import { modifierSortFunc, PokemonHeldItemModifier } from "#app/modifier/held-item-modifier";
enum Page { enum Page {
PROFILE, PROFILE,

View File

@ -6,7 +6,7 @@ import { getMoveTargets } from "../data/moves/move";
import { Button } from "#enums/buttons"; import { Button } from "#enums/buttons";
import type { Moves } from "#enums/moves"; import type { Moves } from "#enums/moves";
import type Pokemon from "#app/field/pokemon"; import type Pokemon from "#app/field/pokemon";
import type { ModifierBar } from "#app/modifier/modifier"; import type { ModifierBar } from "#app/modifier/modifier-bar";
import { SubstituteTag } from "#app/data/battler-tags"; import { SubstituteTag } from "#app/data/battler-tags";
import { globalScene } from "#app/global-scene"; import { globalScene } from "#app/global-scene";