Move berry puch back (not a held item)

This commit is contained in:
Wlowscha 2025-05-29 19:18:56 +02:00
parent b6ac8a53e4
commit 1dc95c05eb
No known key found for this signature in database
GPG Key ID: 3C8F1AD330565D04
14 changed files with 61 additions and 50 deletions

View File

@ -73,7 +73,6 @@ import {
PokemonHeldItemModifier, PokemonHeldItemModifier,
PokemonMoveAccuracyBoosterModifier, PokemonMoveAccuracyBoosterModifier,
PokemonMultiHitModifier, PokemonMultiHitModifier,
PreserveBerryModifier,
} from "../../modifier/held-item-modifier"; } from "../../modifier/held-item-modifier";
import type { BattlerIndex } from "../../battle"; import type { BattlerIndex } from "../../battle";
import { BattleType } from "#enums/battle-type"; import { BattleType } from "#enums/battle-type";
@ -123,6 +122,7 @@ import { MoveEffectTrigger } from "#enums/MoveEffectTrigger";
import { MultiHitType } from "#enums/MultiHitType"; import { MultiHitType } from "#enums/MultiHitType";
import { invalidAssistMoves, invalidCopycatMoves, invalidMetronomeMoves, invalidMirrorMoveMoves, invalidSleepTalkMoves } from "./invalid-moves"; import { invalidAssistMoves, invalidCopycatMoves, invalidMetronomeMoves, invalidMirrorMoveMoves, invalidSleepTalkMoves } from "./invalid-moves";
import { SelectBiomePhase } from "#app/phases/select-biome-phase"; import { SelectBiomePhase } from "#app/phases/select-biome-phase";
import { PreserveBerryModifier } from "#app/modifier/modifier";
type MoveConditionFunc = (user: Pokemon, target: Pokemon, move: Move) => boolean; type MoveConditionFunc = (user: Pokemon, target: Pokemon, move: Move) => boolean;
type UserMoveConditionFunc = (user: Pokemon, move: Move) => boolean; type UserMoveConditionFunc = (user: Pokemon, move: Move) => boolean;

View File

@ -23,9 +23,13 @@ import {
BerryModifier, BerryModifier,
type PokemonHeldItemModifier, type PokemonHeldItemModifier,
type PokemonInstantReviveModifier, type PokemonInstantReviveModifier,
PreserveBerryModifier,
} from "#app/modifier/held-item-modifier"; } from "#app/modifier/held-item-modifier";
import { HealingBoosterModifier, LevelIncrementBoosterModifier, MoneyMultiplierModifier } from "#app/modifier/modifier"; import {
HealingBoosterModifier,
LevelIncrementBoosterModifier,
MoneyMultiplierModifier,
PreserveBerryModifier,
} from "#app/modifier/modifier";
import type { PokemonHeldItemModifierType } from "#app/modifier/modifier-type"; import type { PokemonHeldItemModifierType } from "#app/modifier/modifier-type";
import { modifierTypes } from "#app/modifier/modifier-type"; import { modifierTypes } from "#app/modifier/modifier-type";
import { ModifierRewardPhase } from "#app/phases/modifier-reward-phase"; import { ModifierRewardPhase } from "#app/phases/modifier-reward-phase";

View File

@ -28,6 +28,7 @@ import {
type Modifier, type Modifier,
MoneyMultiplierModifier, MoneyMultiplierModifier,
PersistentModifier, PersistentModifier,
PreserveBerryModifier,
TempExtraModifierModifier, TempExtraModifierModifier,
} from "./modifier"; } from "./modifier";
import { import {
@ -1252,42 +1253,6 @@ export class BerryModifier extends PokemonHeldItemModifier {
} }
} }
export class PreserveBerryModifier extends PersistentModifier {
match(modifier: Modifier) {
return modifier instanceof PreserveBerryModifier;
}
clone() {
return new PreserveBerryModifier(this.type, this.stackCount);
}
/**
* Checks if all prequired conditions are met to apply {@linkcode PreserveBerryModifier}
* @param pokemon {@linkcode Pokemon} that holds the berry
* @param doPreserve {@linkcode BooleanHolder} that is `true` if the berry should be preserved
* @returns `true` if {@linkcode PreserveBerryModifier} should be applied
*/
override shouldApply(pokemon?: Pokemon, doPreserve?: BooleanHolder): boolean {
return !!pokemon && !!doPreserve;
}
/**
* Applies {@linkcode PreserveBerryModifier}
* @param pokemon The {@linkcode Pokemon} that holds the berry
* @param doPreserve {@linkcode BooleanHolder} that is `true` if the berry should be preserved
* @returns always `true`
*/
override apply(pokemon: Pokemon, doPreserve: BooleanHolder): boolean {
doPreserve.value ||= pokemon.randBattleSeedInt(10) < this.getStackCount() * 3;
return true;
}
getMaxStackCount(): number {
return 3;
}
}
export class PokemonInstantReviveModifier extends PokemonHeldItemModifier { export class PokemonInstantReviveModifier extends PokemonHeldItemModifier {
matchType(modifier: Modifier) { matchType(modifier: Modifier) {
return modifier instanceof PokemonInstantReviveModifier; return modifier instanceof PokemonInstantReviveModifier;

View File

@ -65,6 +65,7 @@ import {
type Modifier, type Modifier,
TempExtraModifierModifier, TempExtraModifierModifier,
CriticalCatchChanceBoosterModifier, CriticalCatchChanceBoosterModifier,
PreserveBerryModifier,
} from "#app/modifier/modifier"; } from "#app/modifier/modifier";
import { import {
AttackTypeBoosterModifier, AttackTypeBoosterModifier,
@ -89,7 +90,6 @@ import {
PokemonMoveAccuracyBoosterModifier, PokemonMoveAccuracyBoosterModifier,
PokemonMultiHitModifier, PokemonMultiHitModifier,
PokemonNatureWeightModifier, PokemonNatureWeightModifier,
PreserveBerryModifier,
ResetNegativeStatStageModifier, ResetNegativeStatStageModifier,
SpeciesCritBoosterModifier, SpeciesCritBoosterModifier,
SpeciesStatBoosterModifier, SpeciesStatBoosterModifier,

View File

@ -1281,6 +1281,42 @@ export class CriticalCatchChanceBoosterModifier extends PersistentModifier {
} }
} }
export class PreserveBerryModifier extends PersistentModifier {
match(modifier: Modifier) {
return modifier instanceof PreserveBerryModifier;
}
clone() {
return new PreserveBerryModifier(this.type, this.stackCount);
}
/**
* Checks if all prequired conditions are met to apply {@linkcode PreserveBerryModifier}
* @param pokemon {@linkcode Pokemon} that holds the berry
* @param doPreserve {@linkcode BooleanHolder} that is `true` if the berry should be preserved
* @returns `true` if {@linkcode PreserveBerryModifier} should be applied
*/
override shouldApply(pokemon?: Pokemon, doPreserve?: BooleanHolder): boolean {
return !!pokemon && !!doPreserve;
}
/**
* Applies {@linkcode PreserveBerryModifier}
* @param pokemon The {@linkcode Pokemon} that holds the berry
* @param doPreserve {@linkcode BooleanHolder} that is `true` if the berry should be preserved
* @returns always `true`
*/
override apply(pokemon: Pokemon, doPreserve: BooleanHolder): boolean {
doPreserve.value ||= pokemon.randBattleSeedInt(10) < this.getStackCount() * 3;
return true;
}
getMaxStackCount(): number {
return 3;
}
}
export class LockModifierTiersModifier extends PersistentModifier { export class LockModifierTiersModifier extends PersistentModifier {
match(modifier: Modifier): boolean { match(modifier: Modifier): boolean {
return modifier instanceof LockModifierTiersModifier; return modifier instanceof LockModifierTiersModifier;

View File

@ -5,7 +5,7 @@ import { Abilities } from "#app/enums/abilities";
import { Stat } from "#app/enums/stat"; import { Stat } from "#app/enums/stat";
import type Pokemon from "#app/field/pokemon"; import type Pokemon from "#app/field/pokemon";
import { PokemonMove } from "#app/field/pokemon"; import { PokemonMove } from "#app/field/pokemon";
import { BypassSpeedChanceModifier } from "#app/modifier/modifier"; import { BypassSpeedChanceModifier } from "#app/modifier/held-item-modifier";
import { Command } from "#app/ui/command-ui-handler"; import { Command } from "#app/ui/command-ui-handler";
import { randSeedShuffle, BooleanHolder } from "#app/utils/common"; import { randSeedShuffle, BooleanHolder } from "#app/utils/common";
import { AttemptCapturePhase } from "./attempt-capture-phase"; import { AttemptCapturePhase } from "./attempt-capture-phase";

View File

@ -1,5 +1,5 @@
import type { Modifier } from "typescript"; import type { Modifier } from "typescript";
import { TurnHeldItemTransferModifier } from "../modifier/modifier"; import { TurnHeldItemTransferModifier } from "../modifier/held-item-modifier";
import { pokemonEvolutions } from "#app/data/balance/pokemon-evolutions"; import { pokemonEvolutions } from "#app/data/balance/pokemon-evolutions";
import i18next from "i18next"; import i18next from "i18next";
import { NumberHolder } from "#app/utils/common"; import { NumberHolder } from "#app/utils/common";

View File

@ -12,6 +12,7 @@ import { TextStyle, addTextObject } from "./text";
import { UiMode } from "#enums/ui-mode"; import { UiMode } from "#enums/ui-mode";
import { addWindow } from "./ui-theme"; import { addWindow } from "./ui-theme";
import { RunDisplayMode } from "#app/ui/run-info-ui-handler"; import { RunDisplayMode } from "#app/ui/run-info-ui-handler";
import { PokemonHeldItemModifier } from "#app/modifier/held-item-modifier";
const SESSION_SLOTS_COUNT = 5; const SESSION_SLOTS_COUNT = 5;
const SLOTS_ON_SCREEN = 3; const SLOTS_ON_SCREEN = 3;
@ -445,7 +446,7 @@ class SessionSlot extends Phaser.GameObjects.Container {
let visibleModifierIndex = 0; let visibleModifierIndex = 0;
for (const m of data.modifiers) { for (const m of data.modifiers) {
const modifier = m.toModifier(Modifier[m.className]); const modifier = m.toModifier(Modifier[m.className]);
if (modifier instanceof Modifier.PokemonHeldItemModifier) { if (modifier instanceof PokemonHeldItemModifier) {
continue; continue;
} }
const icon = modifier?.getIcon(false); const icon = modifier?.getIcon(false);

View File

@ -1,7 +1,8 @@
import { BattlerIndex } from "#app/battle"; import { BattlerIndex } from "#app/battle";
import { PostTurnRestoreBerryAbAttr } from "#app/data/abilities/ability"; import { PostTurnRestoreBerryAbAttr } from "#app/data/abilities/ability";
import type Pokemon from "#app/field/pokemon"; import type Pokemon from "#app/field/pokemon";
import { BerryModifier, PreserveBerryModifier } from "#app/modifier/held-item-modifier"; import { BerryModifier } from "#app/modifier/held-item-modifier";
import { PreserveBerryModifier } from "#app/modifier/modifier";
import type { ModifierOverride } from "#app/modifier/modifier-type"; import type { ModifierOverride } from "#app/modifier/modifier-type";
import type { BooleanHolder } from "#app/utils/common"; import type { BooleanHolder } from "#app/utils/common";
import { Abilities } from "#enums/abilities"; import { Abilities } from "#enums/abilities";

View File

@ -1,4 +1,4 @@
import { TurnHeldItemTransferModifier } from "#app/modifier/modifier"; import { TurnHeldItemTransferModifier } from "#app/modifier/held-item-modifier";
import { import {
Achv, Achv,
AchvTier, AchvTier,

View File

@ -1,5 +1,5 @@
import { GameModes } from "#app/game-mode"; import { GameModes } from "#app/game-mode";
import { TurnHeldItemTransferModifier } from "#app/modifier/modifier"; import { TurnHeldItemTransferModifier } from "#app/modifier/held-item-modifier";
import { Abilities } from "#enums/abilities"; import { Abilities } from "#enums/abilities";
import { Biome } from "#enums/biome"; import { Biome } from "#enums/biome";
import { Moves } from "#enums/moves"; import { Moves } from "#enums/moves";

View File

@ -1,4 +1,4 @@
import { StatBoosterModifier } from "#app/modifier/modifier"; import { StatBoosterModifier } from "#app/modifier/held-item-modifier";
import { NumberHolder, randItem } from "#app/utils/common"; import { NumberHolder, randItem } from "#app/utils/common";
import { Species } from "#enums/species"; import { Species } from "#enums/species";
import { Stat } from "#enums/stat"; import { Stat } from "#enums/stat";

View File

@ -1,5 +1,5 @@
import { Abilities } from "#app/enums/abilities"; import { Abilities } from "#app/enums/abilities";
import { PokemonExpBoosterModifier } from "#app/modifier/modifier"; import { PokemonExpBoosterModifier } from "#app/modifier/held-item-modifier";
import { NumberHolder } from "#app/utils/common"; import { NumberHolder } from "#app/utils/common";
import GameManager from "#test/testUtils/gameManager"; import GameManager from "#test/testUtils/gameManager";
import Phase from "phaser"; import Phase from "phaser";

View File

@ -19,13 +19,17 @@ import {
HitHealModifier, HitHealModifier,
PokemonInstantReviveModifier, PokemonInstantReviveModifier,
PokemonNatureWeightModifier, PokemonNatureWeightModifier,
PreserveBerryModifier,
} from "#app/modifier/held-item-modifier"; } from "#app/modifier/held-item-modifier";
import { MysteryEncounterPhase } from "#app/phases/mystery-encounter-phases"; import { MysteryEncounterPhase } from "#app/phases/mystery-encounter-phases";
import { generateModifierType } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { generateModifierType } from "#app/data/mystery-encounters/utils/encounter-phase-utils";
import { modifierTypes } from "#app/modifier/modifier-type"; import { modifierTypes } from "#app/modifier/modifier-type";
import { BerryType } from "#enums/berry-type"; import { BerryType } from "#enums/berry-type";
import { HealingBoosterModifier, LevelIncrementBoosterModifier, MoneyMultiplierModifier } from "#app/modifier/modifier"; import {
HealingBoosterModifier,
LevelIncrementBoosterModifier,
MoneyMultiplierModifier,
PreserveBerryModifier,
} from "#app/modifier/modifier";
const namespace = "mysteryEncounters/delibirdy"; const namespace = "mysteryEncounters/delibirdy";
const defaultParty = [Species.LAPRAS, Species.GENGAR, Species.ABRA]; const defaultParty = [Species.LAPRAS, Species.GENGAR, Species.ABRA];