From 4538eebd79cf8cce357e5f3c1997a1546677347d Mon Sep 17 00:00:00 2001 From: Greenlamp Date: Tue, 7 May 2024 17:00:10 +0200 Subject: [PATCH] better code for override of modifiers and held items, for player and opponent. --- src/battle-scene.ts | 32 ++------------------ src/modifier/modifier.ts | 64 +++++++++++++++++----------------------- src/overrides.ts | 4 +-- src/phases.ts | 26 ++-------------- 4 files changed, 35 insertions(+), 91 deletions(-) diff --git a/src/battle-scene.ts b/src/battle-scene.ts index 39fd4d6577a..2d598f369fe 100644 --- a/src/battle-scene.ts +++ b/src/battle-scene.ts @@ -4,7 +4,7 @@ import { NextEncounterPhase, NewBiomeEncounterPhase, SelectBiomePhase, MessagePh import Pokemon, { PlayerPokemon, EnemyPokemon } from './field/pokemon'; import PokemonSpecies, { PokemonSpeciesFilter, allSpecies, getPokemonSpecies, initSpecies, speciesStarters } from './data/pokemon-species'; import * as Utils from './utils'; -import { Modifier, ModifierBar, ConsumablePokemonModifier, ConsumableModifier, PokemonHpRestoreModifier, HealingBoosterModifier, PersistentModifier, PokemonHeldItemModifier, ModifierPredicate, DoubleBattleChanceBoosterModifier, FusePokemonModifier, PokemonFormChangeItemModifier, TerastallizeModifier } from './modifier/modifier'; +import { Modifier, ModifierBar, ConsumablePokemonModifier, ConsumableModifier, PokemonHpRestoreModifier, HealingBoosterModifier, PersistentModifier, PokemonHeldItemModifier, ModifierPredicate, DoubleBattleChanceBoosterModifier, FusePokemonModifier, PokemonFormChangeItemModifier, TerastallizeModifier, modifiersOverride, itemHeldsOverride } from './modifier/modifier'; import { PokeballType } from './data/pokeball'; import { initCommonAnims, initMoveAnim, loadCommonAnimAssets, loadMoveAnimAssets, populateAnims } from './data/battle-anims'; import { Phase } from './phase'; @@ -615,16 +615,8 @@ export default class BattleScene extends SceneBase { if (OPP_SPECIES_OVERRIDE) species = getPokemonSpecies(OPP_SPECIES_OVERRIDE); const pokemon = new EnemyPokemon(this, species, level, trainerSlot, boss, dataSource); - // we get the modifiers override for the opponent - const modifiersOverride = this.getEnemyModifiersOverride(); - // if we have some modifiers override, apply them to the opponent - if (modifiersOverride?.length) { - // we delete all previous modifiers to avoid stack of override - this.enemyModifiers = []; - for (const m of modifiersOverride) { - this.addEnemyModifier(getModifierType(modifierTypes[m]).newModifier(pokemon) as PersistentModifier, true, true); - } - } + modifiersOverride(this, false); + itemHeldsOverride(this, pokemon, false); if (boss && !dataSource) { const secondaryIvs = Utils.getIvsFromId(Utils.randSeedInt(4294967295)); @@ -1733,24 +1725,6 @@ export default class BattleScene extends SceneBase { }); } - getEnemyModifiersOverride(): Array { - // if no override, do nothing - const ret = []; - if (!OPP_MODIFIER_OVERRIDE || OPP_MODIFIER_OVERRIDE.length === 0) return ret; - // we loop through all the modifier name given in the override file - for (const [index, modifierName] of OPP_MODIFIER_OVERRIDE.entries()) { - // if the modifier does not exist, we skip it - if (!modifierTypes.hasOwnProperty(modifierName)) continue; - // We get how many modifiers, if none given, default to 1 - const qty = OPP_MODIFIER_QTY_OVERRIDE[index] || 1 - // for example, if qty is 2, we create an array of size 2 with the modifier on each slot - for (const i of [...Array(qty).keys()]) { - ret.push(modifierName); - } - } - return ret; - } - generateEnemyModifiers(): Promise { return new Promise(resolve => { if (this.currentBattle.battleSpec === BattleSpec.FINAL_BOSS) diff --git a/src/modifier/modifier.ts b/src/modifier/modifier.ts index 82757e080d6..6fc823655d4 100644 --- a/src/modifier/modifier.ts +++ b/src/modifier/modifier.ts @@ -19,7 +19,7 @@ import { VoucherType } from '../system/voucher'; import { FormChangeItem, SpeciesFormChangeItemTrigger } from '../data/pokemon-forms'; import { Nature } from '#app/data/nature'; import { BattlerTagType } from '#app/data/enums/battler-tag-type'; -import { STARTING_MODIFIER_OVERRIDE, STARTING_MODIFIER_QTY_OVERRIDE, OPP_HELD_ITEMS_OVERRIDE, STARTING_HELD_ITEMS_OVERRIDE } from "../overrides"; +import { STARTING_MODIFIER_OVERRIDE, STARTING_MODIFIER_QTY_OVERRIDE, OPP_HELD_ITEMS_OVERRIDE, STARTING_HELD_ITEMS_OVERRIDE, OPP_MODIFIER_OVERRIDE, OPP_MODIFIER_QTY_OVERRIDE } from "../overrides"; import { modifierTypes } from "./modifier-type"; type ModifierType = ModifierTypes.ModifierType; @@ -2179,31 +2179,39 @@ export class EnemyFusionChanceModifier extends EnemyPersistentModifier { } } -export function getModifierOverride(): Modifier[] { +export function modifiersOverride(scene: Phaser.Scene, player: boolean = true): void { // if no override, do nothing - const modifiers: Modifier[] = new Array(); - if (!STARTING_MODIFIER_OVERRIDE || STARTING_MODIFIER_OVERRIDE.length === 0) return modifiers; + const modifierOverride = player ? STARTING_MODIFIER_OVERRIDE : OPP_MODIFIER_OVERRIDE; + const modifierQtyOverride = player ? STARTING_MODIFIER_QTY_OVERRIDE : OPP_MODIFIER_QTY_OVERRIDE; + if (!modifierOverride || modifierOverride.length === 0 || !scene) return; + if (!player) { + scene.enemyModifiers = []; + } // we loop through all the modifier name given in the override file - for (const [index, modifierName] of STARTING_MODIFIER_OVERRIDE.entries()) { + for (const [index, modifierName] of modifierOverride.entries()) { // if the modifier does not exist, we skip it if (!modifierTypes.hasOwnProperty(modifierName)) continue; const modifierType = modifierTypes[modifierName](); // We get how many modifiers, if none given, default to 1 - const qty = STARTING_MODIFIER_QTY_OVERRIDE[index] || 1 + const qty = modifierQtyOverride[index] || 1 for (const i of [...Array(qty).keys()]) { // for example, if qty is 2, we create an array of size 2 with the modifier on each slot - modifiers.push(modifierType.withIdFromFunc(modifierTypes[modifierName]).newModifier()); + const modifier = modifierType.withIdFromFunc(modifierTypes[modifierName]).newModifier(); + if (player) { + scene.addModifier(modifier as PersistentModifier, true, false, false, true); + } else { + scene.addEnemyModifier(modifier as PersistentModifier, true, true); + } } } - return modifiers; } -export function startingItemHeldsOverride(pokemon: Pokemon): Modifier[] { - const ret: Modifier[] = new Array(); - // if no override, do nothing - if (!STARTING_HELD_ITEMS_OVERRIDE || STARTING_HELD_ITEMS_OVERRIDE.length === 0) return ret; - // we loop through all the itemName given in the override file - for (const itemName of STARTING_HELD_ITEMS_OVERRIDE) { +export function itemHeldsOverride(scene: Phaser.Scene, pokemon: Pokemon, player: boolean = true): void { + const heldItemsOverride = player ? STARTING_HELD_ITEMS_OVERRIDE : OPP_HELD_ITEMS_OVERRIDE; + // if no override, do nothing + if (!heldItemsOverride || heldItemsOverride.length === 0 || !scene) return; + // we loop through all the itemName given in the override file + for (const itemName of heldItemsOverride) { // if the item does not exist, we skip it if (!modifierTypes.hasOwnProperty(itemName)) continue; // we retrieve the item in the list @@ -2214,28 +2222,10 @@ export function startingItemHeldsOverride(pokemon: Pokemon): Modifier[] { itemModifier.pokemonId = pokemon.id; // we say how many items we want itemModifier.stackCount = 1; - ret.push(itemModifier); + if (player) { + scene.addModifier(itemModifier as PokemonHeldItemModifier, true, false, false, true); + } else { + scene.addEnemyModifier(itemModifier as PokemonHeldItemModifier, true, true); + } } - return ret; -} - -export function opponentItemHeldsOverride(pokemon: Pokemon): Modifier[] { - const ret: Modifier[] = new Array(); - // if no override, do nothing - if (!OPP_HELD_ITEMS_OVERRIDE || OPP_HELD_ITEMS_OVERRIDE.length === 0) return ret; - // we loop through all the itemName given in the override file - for (const itemName of OPP_HELD_ITEMS_OVERRIDE) { - // if the item does not exist, we skip it - if (!modifierTypes.hasOwnProperty(itemName)) continue; - // we retrieve the item in the list - const modifierType = modifierTypes[itemName](); - // we create the item - const itemModifier = modifierType.withIdFromFunc(modifierTypes[itemName]).newModifier((pokemon) as PersistentModifier) as PokemonHeldItemModifier; - // we assign the created item to the pokemon - itemModifier.pokemonId = pokemon.id; - // we say how many items we want - itemModifier.stackCount = 1; - ret.push(itemModifier); - } - return ret; } \ No newline at end of file diff --git a/src/overrides.ts b/src/overrides.ts index d4557fa33e9..5c7131f8cb0 100644 --- a/src/overrides.ts +++ b/src/overrides.ts @@ -15,7 +15,7 @@ export const STARTING_MODIFIER_OVERRIDE = []; // ['EXP_SHARE', 'GOLDEN_EXP_CHARM export const STARTING_MODIFIER_QTY_OVERRIDE = []; // [5, 10]; export const WEATHER_OVERRIDE = WeatherType.NONE; export const DOUBLE_BATTLE_OVERRIDE = false; -export const STARTING_HELD_ITEMS_OVERRIDE = ['REVIVER_SEED']; +export const STARTING_HELD_ITEMS_OVERRIDE = []; // ['REVIVER_SEED']; export const ABILITY_OVERRIDE = Abilities.NONE; export const PASSIVE_ABILITY_OVERRIDE = Abilities.NONE; @@ -26,7 +26,7 @@ export const OPP_ABILITY_OVERRIDE = Abilities.NONE; export const OPP_PASSIVE_ABILITY_OVERRIDE = Abilities.NONE; export const OPP_MOVE_OVERRIDE = Moves.NONE; export const OPP_MOVE_OVERRIDE_2 = Moves.NONE; -export const OPP_HELD_ITEMS_OVERRIDE = ['LUCKY_EGG']; +export const OPP_HELD_ITEMS_OVERRIDE = []; // ['LUCKY_EGG'] export const OPP_MODIFIER_OVERRIDE = []; // ['ENEMY_DAMAGE_REDUCTION', 'ENEMY_ATTACK_POISON_CHANCE'] export const OPP_MODIFIER_QTY_OVERRIDE = []; // [1, 1]; diff --git a/src/phases.ts b/src/phases.ts index 5682f0a24d9..a6ee6ce6ef0 100644 --- a/src/phases.ts +++ b/src/phases.ts @@ -6,7 +6,7 @@ import { allMoves, applyMoveAttrs, BypassSleepAttr, ChargeAttr, applyFilteredMov import { Mode } from './ui/ui'; import { Command } from "./ui/command-ui-handler"; import { Stat } from "./data/pokemon-stat"; -import { BerryModifier, ContactHeldItemTransferChanceModifier, EnemyAttackStatusEffectChanceModifier, EnemyPersistentModifier, EnemyStatusEffectHealChanceModifier, EnemyTurnHealModifier, ExpBalanceModifier, ExpBoosterModifier, ExpShareModifier, ExtraModifierModifier, FlinchChanceModifier, FusePokemonModifier, HealingBoosterModifier, HitHealModifier, LapsingPersistentModifier, MapModifier, Modifier, MultipleParticipantExpBonusModifier, PersistentModifier, PokemonExpBoosterModifier, PokemonHeldItemModifier, PokemonInstantReviveModifier, SwitchEffectTransferModifier, TempBattleStatBoosterModifier, TurnHealModifier, TurnHeldItemTransferModifier, MoneyMultiplierModifier, MoneyInterestModifier, IvScannerModifier, LapsingPokemonHeldItemModifier, PokemonMultiHitModifier, PokemonMoveAccuracyBoosterModifier, getModifierOverride, startingItemHeldsOverride, opponentItemHeldsOverride } from "./modifier/modifier"; +import { BerryModifier, ContactHeldItemTransferChanceModifier, EnemyAttackStatusEffectChanceModifier, EnemyPersistentModifier, EnemyStatusEffectHealChanceModifier, EnemyTurnHealModifier, ExpBalanceModifier, ExpBoosterModifier, ExpShareModifier, ExtraModifierModifier, FlinchChanceModifier, FusePokemonModifier, HealingBoosterModifier, HitHealModifier, LapsingPersistentModifier, MapModifier, Modifier, MultipleParticipantExpBonusModifier, PersistentModifier, PokemonExpBoosterModifier, PokemonHeldItemModifier, PokemonInstantReviveModifier, SwitchEffectTransferModifier, TempBattleStatBoosterModifier, TurnHealModifier, TurnHeldItemTransferModifier, MoneyMultiplierModifier, MoneyInterestModifier, IvScannerModifier, LapsingPokemonHeldItemModifier, PokemonMultiHitModifier, PokemonMoveAccuracyBoosterModifier, modifiersOverride, itemHeldsOverride } from "./modifier/modifier"; import PartyUiHandler, { PartyOption, PartyUiMode } from "./ui/party-ui-handler"; import { doPokeballBounceAnim, getPokeballAtlasKey, getPokeballCatchMultiplier, getPokeballTintColor, PokeballType } from "./data/pokeball"; import { CommonAnim, CommonBattleAnim, MoveAnim, initMoveAnim, loadMoveAnimAssets } from "./data/battle-anims"; @@ -510,21 +510,8 @@ export class SelectStarterPhase extends Phase { party.push(starterPokemon); loadPokemonAssets.push(starterPokemon.loadAssets()); }); - const itemHeldsOverride = startingItemHeldsOverride(party[0]); - if (itemHeldsOverride?.length) { - for (const itemHeldOverride of itemHeldsOverride) { - this.scene.addModifier(itemHeldOverride, true, false, false, true); - } - } - // we get the modifiers override - const modifiersOverride = getModifierOverride(); - // if we have some modifiers override, apply them to the player - if (modifiersOverride?.length) { - for (const m of modifiersOverride) { - this.scene.addModifier(m, true, false, false, true); - } - this.scene.updateModifiers(true, true); - } + modifiersOverride(this.scene); + itemHeldsOverride(this.scene, party[0]); Promise.all(loadPokemonAssets).then(() => { SoundFade.fadeOut(this.scene, this.scene.sound.get('menu'), 500, true); this.scene.time.delayedCall(500, () => this.scene.playBgm()); @@ -744,13 +731,6 @@ export class EncounterPhase extends BattlePhase { console.log(enemyPokemon.name, enemyPokemon.species.speciesId, enemyPokemon.stats); }); - const itemHeldsOverride = opponentItemHeldsOverride(this.scene.getEnemyParty()[0]); - if (itemHeldsOverride?.length) { - for (const itemHeldOverride of itemHeldsOverride) { - this.scene.addEnemyModifier(itemHeldOverride, true, false, false, true); - } - } - if (this.scene.getParty().filter(p => p.isShiny()).length === 6) this.scene.validateAchv(achvs.SHINY_PARTY);