From dff3f606651b0ade719711a6dc8c8018abfd638b Mon Sep 17 00:00:00 2001 From: andrebastosdias Date: Fri, 3 Apr 2026 17:43:13 +0100 Subject: [PATCH 1/8] Fix message timing of damage-reducing berries and interaction with Cheek Pouch --- data/conditions.ts | 9 ++++++++ data/items.ts | 36 ++++++++++++++++---------------- sim/pokemon.ts | 4 +++- test/sim/abilities/cheekpouch.js | 11 ++++++++++ 4 files changed, 41 insertions(+), 19 deletions(-) diff --git a/data/conditions.ts b/data/conditions.ts index cf749e1f66..283f64df97 100644 --- a/data/conditions.ts +++ b/data/conditions.ts @@ -470,6 +470,15 @@ export const Conditions: import('../sim/dex-conditions').ConditionDataTable = { return this.chainModify([5325, 4096]); }, }, + weakenberry: { + name: 'weakenberry', + duration: 1, + onDamagingHit(damage, target, source, move) { + this.add('-enditem', target, this.effect, '[weaken]'); + this.runEvent('EatItem', target, source, this.effectState.sourceEffect, this.dex.items.get(this.effectState.sourceEffect)); + delete target.volatiles['weakenberry']; + }, + }, // weather is implemented here since it's so important to the game diff --git a/data/items.ts b/data/items.ts index b232f73d88..9352d85cba 100644 --- a/data/items.ts +++ b/data/items.ts @@ -367,7 +367,7 @@ export const Items: import('../sim/dex-items').ItemDataTable = { if (target.eatItem()) { this.debug('-50% reduction'); - this.add('-enditem', target, this.effect, '[weaken]'); + target.addVolatile('weakenberry'); return this.chainModify(0.5); } } @@ -824,7 +824,7 @@ export const Items: import('../sim/dex-items').ItemDataTable = { if (target.eatItem()) { this.debug('-50% reduction'); - this.add('-enditem', target, this.effect, '[weaken]'); + target.addVolatile('weakenberry'); return this.chainModify(0.5); } } @@ -910,7 +910,7 @@ export const Items: import('../sim/dex-items').ItemDataTable = { ) { if (target.eatItem()) { this.debug('-50% reduction'); - this.add('-enditem', target, this.effect, '[weaken]'); + target.addVolatile('weakenberry'); return this.chainModify(0.5); } } @@ -1042,7 +1042,7 @@ export const Items: import('../sim/dex-items').ItemDataTable = { if (target.eatItem()) { this.debug('-50% reduction'); - this.add('-enditem', target, this.effect, '[weaken]'); + target.addVolatile('weakenberry'); return this.chainModify(0.5); } } @@ -1121,7 +1121,7 @@ export const Items: import('../sim/dex-items').ItemDataTable = { if (target.eatItem()) { this.debug('-50% reduction'); - this.add('-enditem', target, this.effect, '[weaken]'); + target.addVolatile('weakenberry'); return this.chainModify(0.5); } } @@ -1145,7 +1145,7 @@ export const Items: import('../sim/dex-items').ItemDataTable = { if (target.eatItem()) { this.debug('-50% reduction'); - this.add('-enditem', target, this.effect, '[weaken]'); + target.addVolatile('weakenberry'); return this.chainModify(0.5); } } @@ -2757,7 +2757,7 @@ export const Items: import('../sim/dex-items').ItemDataTable = { if (target.eatItem()) { this.debug('-50% reduction'); - this.add('-enditem', target, this.effect, '[weaken]'); + target.addVolatile('weakenberry'); return this.chainModify(0.5); } } @@ -3136,7 +3136,7 @@ export const Items: import('../sim/dex-items').ItemDataTable = { if (target.eatItem()) { this.debug('-50% reduction'); - this.add('-enditem', target, this.effect, '[weaken]'); + target.addVolatile('weakenberry'); return this.chainModify(0.5); } } @@ -3160,7 +3160,7 @@ export const Items: import('../sim/dex-items').ItemDataTable = { if (target.eatItem()) { this.debug('-50% reduction'); - this.add('-enditem', target, this.effect, '[weaken]'); + target.addVolatile('weakenberry'); return this.chainModify(0.5); } } @@ -4354,7 +4354,7 @@ export const Items: import('../sim/dex-items').ItemDataTable = { if (target.eatItem()) { this.debug('-50% reduction'); - this.add('-enditem', target, this.effect, '[weaken]'); + target.addVolatile('weakenberry'); return this.chainModify(0.5); } } @@ -4456,7 +4456,7 @@ export const Items: import('../sim/dex-items').ItemDataTable = { if (target.eatItem()) { this.debug('-50% reduction'); - this.add('-enditem', target, this.effect, '[weaken]'); + target.addVolatile('weakenberry'); return this.chainModify(0.5); } } @@ -4480,7 +4480,7 @@ export const Items: import('../sim/dex-items').ItemDataTable = { if (target.eatItem()) { this.debug('-50% reduction'); - this.add('-enditem', target, this.effect, '[weaken]'); + target.addVolatile('weakenberry'); return this.chainModify(0.5); } } @@ -5210,7 +5210,7 @@ export const Items: import('../sim/dex-items').ItemDataTable = { if (target.eatItem()) { this.debug('-50% reduction'); - this.add('-enditem', target, this.effect, '[weaken]'); + target.addVolatile('weakenberry'); return this.chainModify(0.5); } } @@ -5367,7 +5367,7 @@ export const Items: import('../sim/dex-items').ItemDataTable = { if (target.eatItem()) { this.debug('-50% reduction'); - this.add('-enditem', target, this.effect, '[weaken]'); + target.addVolatile('weakenberry'); return this.chainModify(0.5); } } @@ -5697,7 +5697,7 @@ export const Items: import('../sim/dex-items').ItemDataTable = { if (target.eatItem()) { this.debug('-50% reduction'); - this.add('-enditem', target, this.effect, '[weaken]'); + target.addVolatile('weakenberry'); return this.chainModify(0.5); } } @@ -6229,7 +6229,7 @@ export const Items: import('../sim/dex-items').ItemDataTable = { if (target.eatItem()) { this.debug('-50% reduction'); - this.add('-enditem', target, this.effect, '[weaken]'); + target.addVolatile('weakenberry'); return this.chainModify(0.5); } } @@ -7499,7 +7499,7 @@ export const Items: import('../sim/dex-items').ItemDataTable = { if (hitSub) return; if (target.eatItem()) { this.debug('-50% reduction'); - this.add('-enditem', target, this.effect, '[weaken]'); + target.addVolatile('weakenberry'); return this.chainModify(0.5); } } @@ -7776,7 +7776,7 @@ export const Items: import('../sim/dex-items').ItemDataTable = { if (target.eatItem()) { this.debug('-50% reduction'); - this.add('-enditem', target, this.effect, '[weaken]'); + target.addVolatile('weakenberry'); return this.chainModify(0.5); } } diff --git a/sim/pokemon.ts b/sim/pokemon.ts index 41ab145863..50c422cde0 100644 --- a/sim/pokemon.ts +++ b/sim/pokemon.ts @@ -1762,7 +1762,9 @@ export class Pokemon { this.battle.add('-enditem', this, item, '[eat]'); this.battle.singleEvent('Eat', item, this.itemState, this, source, sourceEffect); - this.battle.runEvent('EatItem', this, source, sourceEffect, item); + if (!this.volatiles['weakenberry']) { + this.battle.runEvent('EatItem', this, source, sourceEffect, item); + } if (RESTORATIVE_BERRIES.has(item.id)) { switch (this.pendingStaleness) { diff --git a/test/sim/abilities/cheekpouch.js b/test/sim/abilities/cheekpouch.js index 4b769e0813..41774e2f3e 100644 --- a/test/sim/abilities/cheekpouch.js +++ b/test/sim/abilities/cheekpouch.js @@ -30,4 +30,15 @@ describe(`Cheek Pouch`, () => { battle.makeChoices(); assert(battle.log.every(line => !line.startsWith('|-heal'))); }); + + it(`should activate after a damage-reducing Berry is eaten, even if the user was originally at full HP`, () => { + battle = common.createBattle([[ + { species: 'dedenne', item: 'shucaberry', ability: 'cheekpouch', moves: ['sleeptalk'] }, + ], [ + { species: 'pichu', moves: ['earthquake'] }, + ]]); + battle.makeChoices(); + assert.fullHP(battle.p1.active[0]); + console.log(battle.getDebugLog()); + }); }); From ce15620216fce46c6a4ebf471bff4408aa27ef65 Mon Sep 17 00:00:00 2001 From: andrebastosdias Date: Fri, 3 Apr 2026 17:53:41 +0100 Subject: [PATCH 2/8] Clean code --- sim/pokemon.ts | 2 ++ test/sim/abilities/cheekpouch.js | 1 - 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/sim/pokemon.ts b/sim/pokemon.ts index 50c422cde0..0742ac7fa9 100644 --- a/sim/pokemon.ts +++ b/sim/pokemon.ts @@ -1762,6 +1762,8 @@ export class Pokemon { this.battle.add('-enditem', this, item, '[eat]'); this.battle.singleEvent('Eat', item, this.itemState, this, source, sourceEffect); + + // delay activation message of damage-reducing berries if (!this.volatiles['weakenberry']) { this.battle.runEvent('EatItem', this, source, sourceEffect, item); } diff --git a/test/sim/abilities/cheekpouch.js b/test/sim/abilities/cheekpouch.js index 41774e2f3e..81662e2f42 100644 --- a/test/sim/abilities/cheekpouch.js +++ b/test/sim/abilities/cheekpouch.js @@ -39,6 +39,5 @@ describe(`Cheek Pouch`, () => { ]]); battle.makeChoices(); assert.fullHP(battle.p1.active[0]); - console.log(battle.getDebugLog()); }); }); From e16e34deccbc2fbb3f69fc7270b35b4c87a4922b Mon Sep 17 00:00:00 2001 From: andrebastosdias Date: Fri, 3 Apr 2026 17:54:32 +0100 Subject: [PATCH 3/8] Fix comment --- sim/pokemon.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sim/pokemon.ts b/sim/pokemon.ts index 0742ac7fa9..0dd46cfbb7 100644 --- a/sim/pokemon.ts +++ b/sim/pokemon.ts @@ -1763,7 +1763,7 @@ export class Pokemon { this.battle.singleEvent('Eat', item, this.itemState, this, source, sourceEffect); - // delay activation message of damage-reducing berries + // delay weaken message of damage-reducing berries if (!this.volatiles['weakenberry']) { this.battle.runEvent('EatItem', this, source, sourceEffect, item); } From 9b5302174142be7a352a26de11b79b8ad11f3079 Mon Sep 17 00:00:00 2001 From: andrebastosdias Date: Fri, 3 Apr 2026 17:54:55 +0100 Subject: [PATCH 4/8] Remove comment --- sim/pokemon.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/sim/pokemon.ts b/sim/pokemon.ts index 0dd46cfbb7..50c422cde0 100644 --- a/sim/pokemon.ts +++ b/sim/pokemon.ts @@ -1762,8 +1762,6 @@ export class Pokemon { this.battle.add('-enditem', this, item, '[eat]'); this.battle.singleEvent('Eat', item, this.itemState, this, source, sourceEffect); - - // delay weaken message of damage-reducing berries if (!this.volatiles['weakenberry']) { this.battle.runEvent('EatItem', this, source, sourceEffect, item); } From 93f53d225c75ab7d6c9e1c92956b66eda7e24a17 Mon Sep 17 00:00:00 2001 From: andrebastosdias Date: Fri, 3 Apr 2026 17:56:05 +0100 Subject: [PATCH 5/8] I hate mods --- data/mods/gen4/items.ts | 2 +- data/mods/teraoverride/items.ts | 36 ++++++++++++++++----------------- data/mods/thecardgame/items.ts | 16 +++++++-------- 3 files changed, 27 insertions(+), 27 deletions(-) diff --git a/data/mods/gen4/items.ts b/data/mods/gen4/items.ts index 1f61b55399..6fa9bb64e9 100644 --- a/data/mods/gen4/items.ts +++ b/data/mods/gen4/items.ts @@ -64,7 +64,7 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { if (target.eatItem()) { this.debug('-50% reduction'); - this.add('-enditem', target, this.effect, '[weaken]'); + target.addVolatile('weakenberry'); return this.chainModify(0.5); } } diff --git a/data/mods/teraoverride/items.ts b/data/mods/teraoverride/items.ts index 6582075640..40dfbcd263 100644 --- a/data/mods/teraoverride/items.ts +++ b/data/mods/teraoverride/items.ts @@ -32,7 +32,7 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { if (target.eatItem()) { this.debug('-50% reduction'); - this.add('-enditem', target, this.effect, '[weaken]'); + target.addVolatile('weakenberry'); return this.chainModify(0.5); } } @@ -98,7 +98,7 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { if (target.eatItem()) { this.debug('-50% reduction'); - this.add('-enditem', target, this.effect, '[weaken]'); + target.addVolatile('weakenberry'); return this.chainModify(0.5); } } @@ -113,7 +113,7 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { ) { if (target.eatItem()) { this.debug('-50% reduction'); - this.add('-enditem', target, this.effect, '[weaken]'); + target.addVolatile('weakenberry'); return this.chainModify(0.5); } } @@ -128,7 +128,7 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { if (target.eatItem()) { this.debug('-50% reduction'); - this.add('-enditem', target, this.effect, '[weaken]'); + target.addVolatile('weakenberry'); return this.chainModify(0.5); } } @@ -143,7 +143,7 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { if (target.eatItem()) { this.debug('-50% reduction'); - this.add('-enditem', target, this.effect, '[weaken]'); + target.addVolatile('weakenberry'); return this.chainModify(0.5); } } @@ -158,7 +158,7 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { if (target.eatItem()) { this.debug('-50% reduction'); - this.add('-enditem', target, this.effect, '[weaken]'); + target.addVolatile('weakenberry'); return this.chainModify(0.5); } } @@ -335,7 +335,7 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { if (target.eatItem()) { this.debug('-50% reduction'); - this.add('-enditem', target, this.effect, '[weaken]'); + target.addVolatile('weakenberry'); return this.chainModify(0.5); } } @@ -399,7 +399,7 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { if (target.eatItem()) { this.debug('-50% reduction'); - this.add('-enditem', target, this.effect, '[weaken]'); + target.addVolatile('weakenberry'); return this.chainModify(0.5); } } @@ -414,7 +414,7 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { if (target.eatItem()) { this.debug('-50% reduction'); - this.add('-enditem', target, this.effect, '[weaken]'); + target.addVolatile('weakenberry'); return this.chainModify(0.5); } } @@ -518,7 +518,7 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { if (target.eatItem()) { this.debug('-50% reduction'); - this.add('-enditem', target, this.effect, '[weaken]'); + target.addVolatile('weakenberry'); return this.chainModify(0.5); } } @@ -541,7 +541,7 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { if (target.eatItem()) { this.debug('-50% reduction'); - this.add('-enditem', target, this.effect, '[weaken]'); + target.addVolatile('weakenberry'); return this.chainModify(0.5); } } @@ -556,7 +556,7 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { if (target.eatItem()) { this.debug('-50% reduction'); - this.add('-enditem', target, this.effect, '[weaken]'); + target.addVolatile('weakenberry'); return this.chainModify(0.5); } } @@ -605,7 +605,7 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { if (target.eatItem()) { this.debug('-50% reduction'); - this.add('-enditem', target, this.effect, '[weaken]'); + target.addVolatile('weakenberry'); return this.chainModify(0.5); } } @@ -645,7 +645,7 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { if (target.eatItem()) { this.debug('-50% reduction'); - this.add('-enditem', target, this.effect, '[weaken]'); + target.addVolatile('weakenberry'); return this.chainModify(0.5); } } @@ -676,7 +676,7 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { if (target.eatItem()) { this.debug('-50% reduction'); - this.add('-enditem', target, this.effect, '[weaken]'); + target.addVolatile('weakenberry'); return this.chainModify(0.5); } } @@ -783,7 +783,7 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { if (target.eatItem()) { this.debug('-50% reduction'); - this.add('-enditem', target, this.effect, '[weaken]'); + target.addVolatile('weakenberry'); return this.chainModify(0.5); } } @@ -814,7 +814,7 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { if (target.eatItem()) { this.debug('-50% reduction'); - this.add('-enditem', target, this.effect, '[weaken]'); + target.addVolatile('weakenberry'); return this.chainModify(0.5); } } @@ -846,7 +846,7 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { if (target.eatItem()) { this.debug('-50% reduction'); - this.add('-enditem', target, this.effect, '[weaken]'); + target.addVolatile('weakenberry'); return this.chainModify(0.5); } } diff --git a/data/mods/thecardgame/items.ts b/data/mods/thecardgame/items.ts index 85e0c564f5..381ff8d898 100644 --- a/data/mods/thecardgame/items.ts +++ b/data/mods/thecardgame/items.ts @@ -17,7 +17,7 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { if (target.eatItem()) { this.debug('-50% reduction'); - this.add('-enditem', target, this.effect, '[weaken]'); + target.addVolatile('weakenberry'); return this.chainModify(0.5); } } @@ -32,7 +32,7 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { if (target.eatItem()) { this.debug('-50% reduction'); - this.add('-enditem', target, this.effect, '[weaken]'); + target.addVolatile('weakenberry'); return this.chainModify(0.5); } } @@ -148,7 +148,7 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { if (target.eatItem()) { this.debug('-50% reduction'); - this.add('-enditem', target, this.effect, '[weaken]'); + target.addVolatile('weakenberry'); return this.chainModify(0.5); } } @@ -163,7 +163,7 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { if (target.eatItem()) { this.debug('-50% reduction'); - this.add('-enditem', target, this.effect, '[weaken]'); + target.addVolatile('weakenberry'); return this.chainModify(0.5); } } @@ -228,7 +228,7 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { if (target.eatItem()) { this.debug('-50% reduction'); - this.add('-enditem', target, this.effect, '[weaken]'); + target.addVolatile('weakenberry'); return this.chainModify(0.5); } } @@ -251,7 +251,7 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { if (target.eatItem()) { this.debug('-50% reduction'); - this.add('-enditem', target, this.effect, '[weaken]'); + target.addVolatile('weakenberry'); return this.chainModify(0.5); } } @@ -322,7 +322,7 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { if (target.eatItem()) { this.debug('-50% reduction'); - this.add('-enditem', target, this.effect, '[weaken]'); + target.addVolatile('weakenberry'); return this.chainModify(0.5); } } @@ -345,7 +345,7 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { if (target.eatItem()) { this.debug('-50% reduction'); - this.add('-enditem', target, this.effect, '[weaken]'); + target.addVolatile('weakenberry'); return this.chainModify(0.5); } } From 623c052a7af9b80d17174ada442f472a4792325f Mon Sep 17 00:00:00 2001 From: andrebastosdias Date: Sat, 4 Apr 2026 14:56:24 +0100 Subject: [PATCH 6/8] Revert damage-reducing berries in Gens 4 and 5 --- data/abilities.ts | 2 +- data/conditions.ts | 2 +- data/items.ts | 39 +++--- data/mods/gen5/items.ts | 200 +++++++++++++++++++++++++++++++ test/sim/abilities/cheekpouch.js | 13 ++ 5 files changed, 233 insertions(+), 23 deletions(-) diff --git a/data/abilities.ts b/data/abilities.ts index c084ad8b79..d55570b8ad 100644 --- a/data/abilities.ts +++ b/data/abilities.ts @@ -491,7 +491,7 @@ export const Abilities: import('../sim/dex-abilities').AbilityDataTable = { }, cheekpouch: { onEatItem(item, pokemon) { - this.heal(pokemon.baseMaxhp / 3); + this.heal(pokemon.baseMaxhp / 3, pokemon, pokemon); }, flags: {}, name: "Cheek Pouch", diff --git a/data/conditions.ts b/data/conditions.ts index 283f64df97..300f7b4070 100644 --- a/data/conditions.ts +++ b/data/conditions.ts @@ -475,7 +475,7 @@ export const Conditions: import('../sim/dex-conditions').ConditionDataTable = { duration: 1, onDamagingHit(damage, target, source, move) { this.add('-enditem', target, this.effect, '[weaken]'); - this.runEvent('EatItem', target, source, this.effectState.sourceEffect, this.dex.items.get(this.effectState.sourceEffect)); + this.runEvent('EatItem', target, target, this.effectState.sourceEffect, this.dex.items.get(this.effectState.sourceEffect)); delete target.volatiles['weakenberry']; }, }, diff --git a/data/items.ts b/data/items.ts index 9352d85cba..d8a415917e 100644 --- a/data/items.ts +++ b/data/items.ts @@ -362,7 +362,7 @@ export const Items: import('../sim/dex-items').ItemDataTable = { }, onSourceModifyDamage(damage, source, target, move) { if (move.type === 'Steel' && target.getMoveHitData(move).typeMod > 0) { - const hitSub = target.volatiles['substitute'] && !move.flags['bypasssub'] && !(move.infiltrates && this.gen >= 6); + const hitSub = target.volatiles['substitute'] && !move.flags['bypasssub'] && !move.infiltrates; if (hitSub) return; if (target.eatItem()) { @@ -819,7 +819,7 @@ export const Items: import('../sim/dex-items').ItemDataTable = { }, onSourceModifyDamage(damage, source, target, move) { if (move.type === 'Rock' && target.getMoveHitData(move).typeMod > 0) { - const hitSub = target.volatiles['substitute'] && !move.flags['bypasssub'] && !(move.infiltrates && this.gen >= 6); + const hitSub = target.volatiles['substitute'] && !move.flags['bypasssub'] && !move.infiltrates; if (hitSub) return; if (target.eatItem()) { @@ -904,10 +904,7 @@ export const Items: import('../sim/dex-items').ItemDataTable = { type: "Normal", }, onSourceModifyDamage(damage, source, target, move) { - if ( - move.type === 'Normal' && - (!target.volatiles['substitute'] || move.flags['bypasssub'] || (move.infiltrates && this.gen >= 6)) - ) { + if (move.type === 'Normal' && !(target.volatiles['substitute'] && !move.flags['bypasssub'] && !move.infiltrates)) { if (target.eatItem()) { this.debug('-50% reduction'); target.addVolatile('weakenberry'); @@ -1037,7 +1034,7 @@ export const Items: import('../sim/dex-items').ItemDataTable = { }, onSourceModifyDamage(damage, source, target, move) { if (move.type === 'Fighting' && target.getMoveHitData(move).typeMod > 0) { - const hitSub = target.volatiles['substitute'] && !move.flags['bypasssub'] && !(move.infiltrates && this.gen >= 6); + const hitSub = target.volatiles['substitute'] && !move.flags['bypasssub'] && !move.infiltrates; if (hitSub) return; if (target.eatItem()) { @@ -1116,7 +1113,7 @@ export const Items: import('../sim/dex-items').ItemDataTable = { }, onSourceModifyDamage(damage, source, target, move) { if (move.type === 'Flying' && target.getMoveHitData(move).typeMod > 0) { - const hitSub = target.volatiles['substitute'] && !move.flags['bypasssub'] && !(move.infiltrates && this.gen >= 6); + const hitSub = target.volatiles['substitute'] && !move.flags['bypasssub'] && !move.infiltrates; if (hitSub) return; if (target.eatItem()) { @@ -1140,7 +1137,7 @@ export const Items: import('../sim/dex-items').ItemDataTable = { }, onSourceModifyDamage(damage, source, target, move) { if (move.type === 'Dark' && target.getMoveHitData(move).typeMod > 0) { - const hitSub = target.volatiles['substitute'] && !move.flags['bypasssub'] && !(move.infiltrates && this.gen >= 6); + const hitSub = target.volatiles['substitute'] && !move.flags['bypasssub'] && !move.infiltrates; if (hitSub) return; if (target.eatItem()) { @@ -2752,7 +2749,7 @@ export const Items: import('../sim/dex-items').ItemDataTable = { }, onSourceModifyDamage(damage, source, target, move) { if (move.type === 'Dragon' && target.getMoveHitData(move).typeMod > 0) { - const hitSub = target.volatiles['substitute'] && !move.flags['bypasssub'] && !(move.infiltrates && this.gen >= 6); + const hitSub = target.volatiles['substitute'] && !move.flags['bypasssub'] && !move.infiltrates; if (hitSub) return; if (target.eatItem()) { @@ -3131,7 +3128,7 @@ export const Items: import('../sim/dex-items').ItemDataTable = { }, onSourceModifyDamage(damage, source, target, move) { if (move.type === 'Ghost' && target.getMoveHitData(move).typeMod > 0) { - const hitSub = target.volatiles['substitute'] && !move.flags['bypasssub'] && !(move.infiltrates && this.gen >= 6); + const hitSub = target.volatiles['substitute'] && !move.flags['bypasssub'] && !move.infiltrates; if (hitSub) return; if (target.eatItem()) { @@ -3155,7 +3152,7 @@ export const Items: import('../sim/dex-items').ItemDataTable = { }, onSourceModifyDamage(damage, source, target, move) { if (move.type === 'Poison' && target.getMoveHitData(move).typeMod > 0) { - const hitSub = target.volatiles['substitute'] && !move.flags['bypasssub'] && !(move.infiltrates && this.gen >= 6); + const hitSub = target.volatiles['substitute'] && !move.flags['bypasssub'] && !move.infiltrates; if (hitSub) return; if (target.eatItem()) { @@ -4349,7 +4346,7 @@ export const Items: import('../sim/dex-items').ItemDataTable = { }, onSourceModifyDamage(damage, source, target, move) { if (move.type === 'Fire' && target.getMoveHitData(move).typeMod > 0) { - const hitSub = target.volatiles['substitute'] && !move.flags['bypasssub'] && !(move.infiltrates && this.gen >= 6); + const hitSub = target.volatiles['substitute'] && !move.flags['bypasssub'] && !move.infiltrates; if (hitSub) return; if (target.eatItem()) { @@ -4451,7 +4448,7 @@ export const Items: import('../sim/dex-items').ItemDataTable = { }, onSourceModifyDamage(damage, source, target, move) { if (move.type === 'Water' && target.getMoveHitData(move).typeMod > 0) { - const hitSub = target.volatiles['substitute'] && !move.flags['bypasssub'] && !(move.infiltrates && this.gen >= 6); + const hitSub = target.volatiles['substitute'] && !move.flags['bypasssub'] && !move.infiltrates; if (hitSub) return; if (target.eatItem()) { @@ -4475,7 +4472,7 @@ export const Items: import('../sim/dex-items').ItemDataTable = { }, onSourceModifyDamage(damage, source, target, move) { if (move.type === 'Psychic' && target.getMoveHitData(move).typeMod > 0) { - const hitSub = target.volatiles['substitute'] && !move.flags['bypasssub'] && !(move.infiltrates && this.gen >= 6); + const hitSub = target.volatiles['substitute'] && !move.flags['bypasssub'] && !move.infiltrates; if (hitSub) return; if (target.eatItem()) { @@ -5205,7 +5202,7 @@ export const Items: import('../sim/dex-items').ItemDataTable = { }, onSourceModifyDamage(damage, source, target, move) { if (move.type === 'Grass' && target.getMoveHitData(move).typeMod > 0) { - const hitSub = target.volatiles['substitute'] && !move.flags['bypasssub'] && !(move.infiltrates && this.gen >= 6); + const hitSub = target.volatiles['substitute'] && !move.flags['bypasssub'] && !move.infiltrates; if (hitSub) return; if (target.eatItem()) { @@ -5362,7 +5359,7 @@ export const Items: import('../sim/dex-items').ItemDataTable = { }, onSourceModifyDamage(damage, source, target, move) { if (move.type === 'Fairy' && target.getMoveHitData(move).typeMod > 0) { - const hitSub = target.volatiles['substitute'] && !move.flags['bypasssub'] && !(move.infiltrates && this.gen >= 6); + const hitSub = target.volatiles['substitute'] && !move.flags['bypasssub'] && !move.infiltrates; if (hitSub) return; if (target.eatItem()) { @@ -5692,7 +5689,7 @@ export const Items: import('../sim/dex-items').ItemDataTable = { }, onSourceModifyDamage(damage, source, target, move) { if (move.type === 'Ground' && target.getMoveHitData(move).typeMod > 0) { - const hitSub = target.volatiles['substitute'] && !move.flags['bypasssub'] && !(move.infiltrates && this.gen >= 6); + const hitSub = target.volatiles['substitute'] && !move.flags['bypasssub'] && !move.infiltrates; if (hitSub) return; if (target.eatItem()) { @@ -6224,7 +6221,7 @@ export const Items: import('../sim/dex-items').ItemDataTable = { }, onSourceModifyDamage(damage, source, target, move) { if (move.type === 'Bug' && target.getMoveHitData(move).typeMod > 0) { - const hitSub = target.volatiles['substitute'] && !move.flags['bypasssub'] && !(move.infiltrates && this.gen >= 6); + const hitSub = target.volatiles['substitute'] && !move.flags['bypasssub'] && !move.infiltrates; if (hitSub) return; if (target.eatItem()) { @@ -7495,7 +7492,7 @@ export const Items: import('../sim/dex-items').ItemDataTable = { }, onSourceModifyDamage(damage, source, target, move) { if (move.type === 'Electric' && target.getMoveHitData(move).typeMod > 0) { - const hitSub = target.volatiles['substitute'] && !move.flags['bypasssub'] && !(move.infiltrates && this.gen >= 6); + const hitSub = target.volatiles['substitute'] && !move.flags['bypasssub'] && !move.infiltrates; if (hitSub) return; if (target.eatItem()) { this.debug('-50% reduction'); @@ -7771,7 +7768,7 @@ export const Items: import('../sim/dex-items').ItemDataTable = { }, onSourceModifyDamage(damage, source, target, move) { if (move.type === 'Ice' && target.getMoveHitData(move).typeMod > 0) { - const hitSub = target.volatiles['substitute'] && !move.flags['bypasssub'] && !(move.infiltrates && this.gen >= 6); + const hitSub = target.volatiles['substitute'] && !move.flags['bypasssub'] && !move.infiltrates; if (hitSub) return; if (target.eatItem()) { diff --git a/data/mods/gen5/items.ts b/data/mods/gen5/items.ts index 34cfe9b68c..3317382c10 100644 --- a/data/mods/gen5/items.ts +++ b/data/mods/gen5/items.ts @@ -26,6 +26,18 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { basePower: 60, type: "Steel", }, + onSourceModifyDamage(damage, source, target, move) { + if (move.type === 'Steel' && target.getMoveHitData(move).typeMod > 0) { + const hitSub = target.volatiles['substitute'] && !move.flags['bypasssub']; + if (hitSub) return; + + if (target.eatItem()) { + this.debug('-50% reduction'); + this.add('-enditem', target, this.effect, '[weaken]'); + return this.chainModify(0.5); + } + } + }, }, belueberry: { inherit: true, @@ -51,6 +63,18 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { basePower: 60, type: "Rock", }, + onSourceModifyDamage(damage, source, target, move) { + if (move.type === 'Rock' && target.getMoveHitData(move).typeMod > 0) { + const hitSub = target.volatiles['substitute'] && !move.flags['bypasssub']; + if (hitSub) return; + + if (target.eatItem()) { + this.debug('-50% reduction'); + this.add('-enditem', target, this.effect, '[weaken]'); + return this.chainModify(0.5); + } + } + }, }, cheriberry: { inherit: true, @@ -72,6 +96,15 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { basePower: 60, type: "Normal", }, + onSourceModifyDamage(damage, source, target, move) { + if (move.type === 'Normal' && !(target.volatiles['substitute'] && !move.flags['bypasssub'])) { + if (target.eatItem()) { + this.debug('-50% reduction'); + this.add('-enditem', target, this.effect, '[weaken]'); + return this.chainModify(0.5); + } + } + }, }, chopleberry: { inherit: true, @@ -79,6 +112,18 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { basePower: 60, type: "Fighting", }, + onSourceModifyDamage(damage, source, target, move) { + if (move.type === 'Fighting' && target.getMoveHitData(move).typeMod > 0) { + const hitSub = target.volatiles['substitute'] && !move.flags['bypasssub']; + if (hitSub) return; + + if (target.eatItem()) { + this.debug('-50% reduction'); + this.add('-enditem', target, this.effect, '[weaken]'); + return this.chainModify(0.5); + } + } + }, }, cobaberry: { inherit: true, @@ -86,6 +131,18 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { basePower: 60, type: "Flying", }, + onSourceModifyDamage(damage, source, target, move) { + if (move.type === 'Flying' && target.getMoveHitData(move).typeMod > 0) { + const hitSub = target.volatiles['substitute'] && !move.flags['bypasssub']; + if (hitSub) return; + + if (target.eatItem()) { + this.debug('-50% reduction'); + this.add('-enditem', target, this.effect, '[weaken]'); + return this.chainModify(0.5); + } + } + }, }, colburberry: { inherit: true, @@ -93,6 +150,18 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { basePower: 60, type: "Dark", }, + onSourceModifyDamage(damage, source, target, move) { + if (move.type === 'Dark' && target.getMoveHitData(move).typeMod > 0) { + const hitSub = target.volatiles['substitute'] && !move.flags['bypasssub']; + if (hitSub) return; + + if (target.eatItem()) { + this.debug('-50% reduction'); + this.add('-enditem', target, this.effect, '[weaken]'); + return this.chainModify(0.5); + } + } + }, }, cornnberry: { inherit: true, @@ -185,6 +254,18 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { basePower: 60, type: "Dragon", }, + onSourceModifyDamage(damage, source, target, move) { + if (move.type === 'Dragon' && target.getMoveHitData(move).typeMod > 0) { + const hitSub = target.volatiles['substitute'] && !move.flags['bypasssub']; + if (hitSub) return; + + if (target.eatItem()) { + this.debug('-50% reduction'); + this.add('-enditem', target, this.effect, '[weaken]'); + return this.chainModify(0.5); + } + } + }, }, hondewberry: { inherit: true, @@ -217,6 +298,18 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { basePower: 60, type: "Ghost", }, + onSourceModifyDamage(damage, source, target, move) { + if (move.type === 'Ghost' && target.getMoveHitData(move).typeMod > 0) { + const hitSub = target.volatiles['substitute'] && !move.flags['bypasssub']; + if (hitSub) return; + + if (target.eatItem()) { + this.debug('-50% reduction'); + this.add('-enditem', target, this.effect, '[weaken]'); + return this.chainModify(0.5); + } + } + }, }, kebiaberry: { inherit: true, @@ -224,6 +317,18 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { basePower: 60, type: "Poison", }, + onSourceModifyDamage(damage, source, target, move) { + if (move.type === 'Poison' && target.getMoveHitData(move).typeMod > 0) { + const hitSub = target.volatiles['substitute'] && !move.flags['bypasssub']; + if (hitSub) return; + + if (target.eatItem()) { + this.debug('-50% reduction'); + this.add('-enditem', target, this.effect, '[weaken]'); + return this.chainModify(0.5); + } + } + }, }, kelpsyberry: { inherit: true, @@ -305,6 +410,18 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { basePower: 60, type: "Fire", }, + onSourceModifyDamage(damage, source, target, move) { + if (move.type === 'Fire' && target.getMoveHitData(move).typeMod > 0) { + const hitSub = target.volatiles['substitute'] && !move.flags['bypasssub']; + if (hitSub) return; + + if (target.eatItem()) { + this.debug('-50% reduction'); + this.add('-enditem', target, this.effect, '[weaken]'); + return this.chainModify(0.5); + } + } + }, }, oranberry: { inherit: true, @@ -326,6 +443,18 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { basePower: 60, type: "Water", }, + onSourceModifyDamage(damage, source, target, move) { + if (move.type === 'Water' && target.getMoveHitData(move).typeMod > 0) { + const hitSub = target.volatiles['substitute'] && !move.flags['bypasssub']; + if (hitSub) return; + + if (target.eatItem()) { + this.debug('-50% reduction'); + this.add('-enditem', target, this.effect, '[weaken]'); + return this.chainModify(0.5); + } + } + }, }, payapaberry: { inherit: true, @@ -333,6 +462,18 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { basePower: 60, type: "Psychic", }, + onSourceModifyDamage(damage, source, target, move) { + if (move.type === 'Psychic' && target.getMoveHitData(move).typeMod > 0) { + const hitSub = target.volatiles['substitute'] && !move.flags['bypasssub']; + if (hitSub) return; + + if (target.eatItem()) { + this.debug('-50% reduction'); + this.add('-enditem', target, this.effect, '[weaken]'); + return this.chainModify(0.5); + } + } + }, }, pechaberry: { inherit: true, @@ -411,6 +552,18 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { basePower: 60, type: "Grass", }, + onSourceModifyDamage(damage, source, target, move) { + if (move.type === 'Grass' && target.getMoveHitData(move).typeMod > 0) { + const hitSub = target.volatiles['substitute'] && !move.flags['bypasssub']; + if (hitSub) return; + + if (target.eatItem()) { + this.debug('-50% reduction'); + this.add('-enditem', target, this.effect, '[weaken]'); + return this.chainModify(0.5); + } + } + }, }, rockgem: { inherit: true, @@ -436,6 +589,18 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { basePower: 60, type: "Ground", }, + onSourceModifyDamage(damage, source, target, move) { + if (move.type === 'Ground' && target.getMoveHitData(move).typeMod > 0) { + const hitSub = target.volatiles['substitute'] && !move.flags['bypasssub']; + if (hitSub) return; + + if (target.eatItem()) { + this.debug('-50% reduction'); + this.add('-enditem', target, this.effect, '[weaken]'); + return this.chainModify(0.5); + } + } + }, }, sitrusberry: { inherit: true, @@ -475,6 +640,18 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { basePower: 60, type: "Bug", }, + onSourceModifyDamage(damage, source, target, move) { + if (move.type === 'Bug' && target.getMoveHitData(move).typeMod > 0) { + const hitSub = target.volatiles['substitute'] && !move.flags['bypasssub']; + if (hitSub) return; + + if (target.eatItem()) { + this.debug('-50% reduction'); + this.add('-enditem', target, this.effect, '[weaken]'); + return this.chainModify(0.5); + } + } + }, }, wacanberry: { inherit: true, @@ -482,6 +659,17 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { basePower: 60, type: "Electric", }, + onSourceModifyDamage(damage, source, target, move) { + if (move.type === 'Electric' && target.getMoveHitData(move).typeMod > 0) { + const hitSub = target.volatiles['substitute'] && !move.flags['bypasssub']; + if (hitSub) return; + if (target.eatItem()) { + this.debug('-50% reduction'); + this.add('-enditem', target, this.effect, '[weaken]'); + return this.chainModify(0.5); + } + } + }, }, watergem: { inherit: true, @@ -514,5 +702,17 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { basePower: 60, type: "Ice", }, + onSourceModifyDamage(damage, source, target, move) { + if (move.type === 'Ice' && target.getMoveHitData(move).typeMod > 0) { + const hitSub = target.volatiles['substitute'] && !move.flags['bypasssub']; + if (hitSub) return; + + if (target.eatItem()) { + this.debug('-50% reduction'); + this.add('-enditem', target, this.effect, '[weaken]'); + return this.chainModify(0.5); + } + } + }, }, }; diff --git a/test/sim/abilities/cheekpouch.js b/test/sim/abilities/cheekpouch.js index 81662e2f42..e626c20d6d 100644 --- a/test/sim/abilities/cheekpouch.js +++ b/test/sim/abilities/cheekpouch.js @@ -40,4 +40,17 @@ describe(`Cheek Pouch`, () => { battle.makeChoices(); assert.fullHP(battle.p1.active[0]); }); + + it(`can activate multiple times if the user eats multiple Berries in a row`, () => { + battle = common.createBattle([[ + { species: 'darkrai', ability: 'cheekpouch', item: 'sitrusberry', moves: ['fling'] }, + ], [ + { species: 'deoxys', ability: 'cheekpouch', level: 27, item: 'colburberry', moves: ['sleeptalk'] }, + ]]); + battle.makeChoices(); + assert.equal( + battle.getDebugLog().split('\n').filter(line => line.startsWith('|-heal|p2a: Deoxys') && line.endsWith('[from] ability: Cheek Pouch')).length, + 2, + ); + }); }); From d5c080dd79b39d5083ef1ec493ad173ceb6a805e Mon Sep 17 00:00:00 2001 From: andrebastosdias Date: Sat, 4 Apr 2026 14:59:02 +0100 Subject: [PATCH 7/8] Revert Gen 4 Chople Berry --- data/mods/gen4/items.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/mods/gen4/items.ts b/data/mods/gen4/items.ts index 6fa9bb64e9..1f61b55399 100644 --- a/data/mods/gen4/items.ts +++ b/data/mods/gen4/items.ts @@ -64,7 +64,7 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { if (target.eatItem()) { this.debug('-50% reduction'); - target.addVolatile('weakenberry'); + this.add('-enditem', target, this.effect, '[weaken]'); return this.chainModify(0.5); } } From 7a1dfb449c1dce3c58b719ae571b90c4b8c19122 Mon Sep 17 00:00:00 2001 From: andrebastosdias Date: Sat, 4 Apr 2026 15:04:07 +0100 Subject: [PATCH 8/8] Lint --- test/sim/abilities/cheekpouch.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/sim/abilities/cheekpouch.js b/test/sim/abilities/cheekpouch.js index e626c20d6d..b9ea3fba24 100644 --- a/test/sim/abilities/cheekpouch.js +++ b/test/sim/abilities/cheekpouch.js @@ -40,7 +40,7 @@ describe(`Cheek Pouch`, () => { battle.makeChoices(); assert.fullHP(battle.p1.active[0]); }); - + it(`can activate multiple times if the user eats multiple Berries in a row`, () => { battle = common.createBattle([[ { species: 'darkrai', ability: 'cheekpouch', item: 'sitrusberry', moves: ['fling'] }, @@ -50,7 +50,7 @@ describe(`Cheek Pouch`, () => { battle.makeChoices(); assert.equal( battle.getDebugLog().split('\n').filter(line => line.startsWith('|-heal|p2a: Deoxys') && line.endsWith('[from] ability: Cheek Pouch')).length, - 2, + 2 ); }); });