Spaces:
Running
Running
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; | |
}, | |
}, | |
}; | |