From ebf9784b1eeb55bf5891b5dbf1e02b2c815b55fb Mon Sep 17 00:00:00 2001 From: Matthew Olker Date: Thu, 9 May 2024 11:22:08 -0400 Subject: [PATCH] Add GreenLamps Modifier Overrides --- src/battle-scene.ts | 11 +++++++++- src/modifier/modifier.ts | 47 +++++++++++++++++++++++++++++++++++++++- src/overrides.ts | 10 +++++++++ src/phases.ts | 4 +++- 4 files changed, 69 insertions(+), 3 deletions(-) diff --git a/src/battle-scene.ts b/src/battle-scene.ts index 03e5f801a81..39149398a4d 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,6 +615,8 @@ export default class BattleScene extends SceneBase { if (Overrides.OPP_SPECIES_OVERRIDE) species = getPokemonSpecies(Overrides.OPP_SPECIES_OVERRIDE); const pokemon = new EnemyPokemon(this, species, level, trainerSlot, boss, dataSource); + modifiersOverride(this, false); + itemHeldsOverride(this, pokemon, false); if (boss && !dataSource) { const secondaryIvs = Utils.getIvsFromId(Utils.randSeedInt(4294967295)); @@ -1767,6 +1769,13 @@ export default class BattleScene extends SceneBase { }); } + clearEnemyModifiers(): void { + const modifiersToRemove = this.enemyModifiers.filter(m => m instanceof PersistentModifier); + for (let m of modifiersToRemove) + this.enemyModifiers.splice(this.enemyModifiers.indexOf(m), 1); + this.updateModifiers(false).then(() => this.updateUIPositions()); + } + clearEnemyHeldItemModifiers(): void { const modifiersToRemove = this.enemyModifiers.filter(m => m instanceof PokemonHeldItemModifier); for (let m of modifiersToRemove) diff --git a/src/modifier/modifier.ts b/src/modifier/modifier.ts index c119ba9c49b..9348b74eae3 100644 --- a/src/modifier/modifier.ts +++ b/src/modifier/modifier.ts @@ -19,8 +19,9 @@ 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 * as Overrides from '../overrides'; +import { ModifierType, modifierTypes } from './modifier-type'; -type ModifierType = ModifierTypes.ModifierType; export type ModifierPredicate = (modifier: Modifier) => boolean; const iconOverflowIndex = 24; @@ -2175,4 +2176,48 @@ export class EnemyFusionChanceModifier extends EnemyPersistentModifier { getMaxStackCount(scene: BattleScene): integer { return 10; } +} + +export function modifiersOverride(scene: BattleScene, player: boolean = true): void { + const modifierOverride = player ? Overrides.STARTING_MODIFIER_OVERRIDE : Overrides.OPP_MODIFIER_OVERRIDE; + if (!modifierOverride || modifierOverride.length === 0 || !scene) return; // if no override, do nothing + // if it's the opponent, we clear all his current modifiers to avoid stacking + if (!player) { + scene.clearEnemyModifiers(); + } + // we loop through all the modifier name given in the override file + modifierOverride.forEach(item => { + const modifierName = item.modifierName; + const qty = item.count || 1; + if (!modifierTypes.hasOwnProperty(modifierName)) return; // if the modifier does not exist, we skip it + const modifierType: ModifierType = modifierTypes[modifierName](); + const modifier: PersistentModifier = modifierType.withIdFromFunc(modifierTypes[modifierName]).newModifier() as PersistentModifier; + modifier.stackCount = qty; + if (player) { + scene.addModifier(modifier, true, false, false, true); + } else { + scene.addEnemyModifier(modifier, true, true); + } + }); +} + +export function itemHeldsOverride(scene: BattleScene, pokemon: Pokemon, player: boolean = true): void { + const heldItemsOverride = player ? Overrides.STARTING_HELD_ITEMS_OVERRIDE : Overrides.OPP_HELD_ITEMS_OVERRIDE; + if (!heldItemsOverride || heldItemsOverride.length === 0 || !scene) return; // if no override, do nothing + // we loop through all the itemName given in the override file + heldItemsOverride.forEach(item => { + const itemName = item.modifierName; + const qty = item.count || 1; + if (!modifierTypes.hasOwnProperty(itemName)) return; // if the item does not exist, we skip it + const modifierType: ModifierType = modifierTypes[itemName](); // we retrieve the item in the list + // we create the item + const itemModifier: PokemonHeldItemModifier = modifierType.withIdFromFunc(modifierTypes[itemName]).newModifier(pokemon) as PokemonHeldItemModifier; + itemModifier.pokemonId = pokemon.id; // we assign the created item to the pokemon + itemModifier.stackCount = qty; // we say how many items we want + if (player) { + scene.addModifier(itemModifier, true, false, false, true); + } else { + scene.addEnemyModifier(itemModifier, true, true); + } + }); } \ No newline at end of file diff --git a/src/overrides.ts b/src/overrides.ts index 6df650553ba..a04b9ee19fa 100644 --- a/src/overrides.ts +++ b/src/overrides.ts @@ -9,6 +9,11 @@ import { Variant } from './data/variant'; * Overrides for testing different in game situations */ +interface ModifierOverride { + modifierName: string, + count?: integer +} + // overall overrides export const SEED_OVERRIDE: string = ''; export const WEATHER_OVERRIDE: WeatherType = WeatherType.NONE; @@ -17,6 +22,7 @@ export const STARTING_WAVE_OVERRIDE: integer = 0; export const STARTING_BIOME_OVERRIDE: Biome = Biome.TOWN; export const STARTING_MONEY_OVERRIDE: integer = 0; + // player overrides export const STARTER_SPECIES_OVERRIDE: Species | 0 = 0; export const STARTER_FORM_OVERRIDE: integer = 0; @@ -24,6 +30,8 @@ export const STARTING_LEVEL_OVERRIDE: integer = 0; export const ABILITY_OVERRIDE: Abilities = Abilities.NONE; export const PASSIVE_ABILITY_OVERRIDE: Abilities = Abilities.NONE; export const MOVESET_OVERRIDE: Array = []; +export const STARTING_MODIFIER_OVERRIDE: Array = []; +export const STARTING_HELD_ITEMS_OVERRIDE: Array = []; // opponent overrides export const OPP_SPECIES_OVERRIDE: Species | 0 = 0; @@ -32,3 +40,5 @@ export const OPP_PASSIVE_ABILITY_OVERRIDE = Abilities.NONE; export const OPP_MOVESET_OVERRIDE: Array = []; export const OPP_SHINY_OVERRIDE: boolean = false; export const OPP_VARIANT_OVERRIDE: Variant = 0; +export const OPP_HELD_ITEMS_OVERRIDE: Array = []; +export const OPP_MODIFIER_OVERRIDE: Array = []; \ No newline at end of file diff --git a/src/phases.ts b/src/phases.ts index fec7c3190c0..edbab388523 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 } 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,6 +510,8 @@ export class SelectStarterPhase extends Phase { party.push(starterPokemon); loadPokemonAssets.push(starterPokemon.loadAssets()); }); + 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());