import { RESTORATIVE_BERRIES } from "../../../sim/pokemon"; export const Scripts: ModdedBattleScriptsData = { gen: 9, inherit: 'gen9', pokemon: { isGrounded(negateImmunity) { if ('gravity' in this.battle.field.pseudoWeather) return true; if ('ingrain' in this.volatiles && this.battle.gen >= 4) return true; if ('smackdown' in this.volatiles) return true; const item = (this.ignoringItem() ? '' : this.item); if (item === 'ironball' || (this.volatiles['item:ironball'] && !this.ignoringItem())) return true; // If a Fire/Flying type uses Burn Up and Roost, it becomes ???/Flying-type, but it's still grounded. if (!negateImmunity && this.hasType('Flying') && !(this.hasType('???') && 'roost' in this.volatiles)) return false; if (this.hasAbility('levitate') && !this.battle.suppressingAbility(this)) return null; if ('magnetrise' in this.volatiles) return false; if ('telekinesis' in this.volatiles) return false; if (item === 'airballoon' || (this.volatiles['item:airballoon'] && !this.ignoringItem())) return false; return true; }, hasItem(item) { if (Array.isArray(item)) { return item.some(i => this.hasItem(i)); } else { if (this.battle.toID(item) !== this.item && !this.volatiles['item:' + this.battle.toID(item)]) return false; } return !this.ignoringItem(); }, useItem(source, sourceEffect) { const hasAnyItem = !!this.item || Object.keys(this.volatiles).some(v => v.startsWith('item:')); // Best to declare everything early because ally might have a gem that needs proccing if (!sourceEffect && this.battle.effect) sourceEffect = this.battle.effect; if (!source && this.battle.event?.target) source = this.battle.event.target; const item = (sourceEffect?.id.startsWith('item:')) ? sourceEffect as Item : this.getItem(); if ((!this.hp && !item.isGem) || !this.isActive) return false; if (!hasAnyItem) return false; if (this.battle.runEvent('UseItem', this, null, null, item)) { switch (item.id.startsWith('item:') ? item.id.slice(5) : item.id) { case 'redcard': this.battle.add('-enditem', this, item.fullname, `[of] ${source}`); break; default: if (item.isGem) { this.battle.add('-enditem', this, item.fullname, '[from] gem'); } else { this.battle.add('-enditem', this, item.fullname); } break; } if (item.boosts) { this.battle.boost(item.boosts, this, source, item); } this.battle.singleEvent('Use', item, this.itemState, this, source, sourceEffect); if (item.id.startsWith('item:')) { delete this.volatiles[item.id]; this.m.sharedItemsUsed.push(item.id.slice(5)); } else { this.lastItem = this.item; this.item = ''; this.battle.clearEffectState(this.itemState); } this.usedItemThisTurn = true; this.battle.runEvent('AfterUseItem', this, null, null, item); return true; } return false; }, eatItem(force, source, sourceEffect) { const hasAnyItem = !!this.item || Object.keys(this.volatiles).some(v => v.startsWith('item:')); if (!sourceEffect && this.battle.effect) sourceEffect = this.battle.effect; if (!source && this.battle.event?.target) source = this.battle.event.target; const item = (sourceEffect?.id.startsWith('item:')) ? sourceEffect as Item : this.getItem(); if (!hasAnyItem) return false; if ((!this.hp && this.battle.toID(item.name) !== 'jabocaberry' && this.battle.toID(item.name) !== 'rowapberry') || !this.isActive) return false; if ( this.battle.runEvent('UseItem', this, null, null, item) && (force || this.battle.runEvent('TryEatItem', this, null, null, item)) ) { this.battle.add('-enditem', this, item.fullname, '[eat]'); this.battle.singleEvent('Eat', item, this.itemState, this, source, sourceEffect); this.battle.runEvent('EatItem', this, null, null, item); if (RESTORATIVE_BERRIES.has(item.id.startsWith('item:') ? item.id.slice(5) as ID : item.id)) { switch (this.pendingStaleness) { case 'internal': if (this.staleness !== 'external') this.staleness = 'internal'; break; case 'external': this.staleness = 'external'; break; } this.pendingStaleness = undefined; } if (item.id.startsWith('item:')) { delete this.volatiles[item.id]; this.m.sharedItemsUsed.push(item.id.slice(5)); } else { this.lastItem = this.item; this.item = ''; this.battle.clearEffectState(this.itemState); } this.usedItemThisTurn = true; this.ateBerry = true; this.battle.runEvent('AfterUseItem', this, null, null, item); return true; } return false; }, setItem(item, source, effect) { if (!this.hp || !this.isActive) return false; if (this.itemState.knockedOff) return false; if (typeof item === 'string') item = this.battle.dex.items.get(item); const effectid = this.battle.effect ? this.battle.effect.id : ''; if (RESTORATIVE_BERRIES.has('leppaberry' as ID)) { const inflicted = ['trick', 'switcheroo'].includes(effectid); const external = inflicted && source && !source.isAlly(this); this.pendingStaleness = external ? 'external' : 'internal'; } else { this.pendingStaleness = undefined; } const oldItem = this.getItem(); const oldItemState = this.itemState; this.item = item.id; this.itemState = this.battle.initEffectState({ id: item.id, target: this }); if (oldItem.exists) this.battle.singleEvent('End', oldItem, oldItemState, this); if (item.id) { this.battle.singleEvent('Start', item, this.itemState, this, source, effect); for (const ally of this.side.pokemon) { if (!ally.m.sharedItemsUsed) continue; ally.m.sharedItemsUsed = ally.m.sharedItemsUsed.filter((i: ID) => i !== item.id); } } return true; }, }, };