/*

Ratings and how they work:

-1: Detrimental
	  An ability that severely harms the user.
	ex. Defeatist, Slow Start

 0: Useless
	  An ability with no overall benefit in a singles battle.
	ex. Color Change, Plus

 1: Ineffective
	  An ability that has minimal effect or is only useful in niche situations.
	ex. Light Metal, Suction Cups

 2: Useful
	  An ability that can be generally useful.
	ex. Flame Body, Overcoat

 3: Effective
	  An ability with a strong effect on the user or foe.
	ex. Chlorophyll, Sturdy

 4: Very useful
	  One of the more popular abilities. It requires minimal support to be effective.
	ex. Adaptability, Magic Bounce

 5: Essential
	  The sort of ability that defines metagames.
	ex. Imposter, Shadow Tag

*/

export const Abilities: import('../../../sim/dex-abilities').ModdedAbilityDataTable = {
	noability: {
		inherit: true,
		rating: 0.1,
	},
	adaptability: {
		inherit: true,
		rating: 4,
	},
	aerilate: {
		inherit: true,
		rating: 4,
	},
	aftermath: {
		inherit: true,
		rating: 2.5,
	},
	airlock: {
		inherit: true,
		rating: 2,
	},
	analytic: {
		inherit: true,
		rating: 2.5,
	},
	angerpoint: {
		inherit: true,
		rating: 1.5,
	},
	anticipation: {
		inherit: true,
		rating: 0.5,
	},
	arenatrap: {
		inherit: true,
		rating: 5,
	},
	aromaveil: {
		inherit: true,
		rating: 2,
	},
	asoneglastrier: {
		inherit: true,
		rating: 3.5,
	},
	asonespectrier: {
		inherit: true,
		rating: 3.5,
	},
	aurabreak: {
		inherit: true,
		rating: 1,
	},
	baddreams: {
		inherit: true,
		rating: 1.5,
	},
	ballfetch: {
		inherit: true,
		rating: 0,
	},
	battery: {
		inherit: true,
		rating: 0,
	},
	battlearmor: {
		inherit: true,
		rating: 1,
	},
	battlebond: {
		inherit: true,
		onSourceAfterFaint(length, target, source, effect) {
			if (source.bondTriggered) return;
			if (effect?.effectType !== 'Move') {
				return;
			}
			if (source.species.id === 'greninjabond' && source.hp && !source.transformed && source.side.foePokemonLeft()) {
				this.add('-activate', source, 'ability: Battle Bond');
				source.formeChange('Greninja-Ash', this.effect, true);
				source.formeRegression = true;
				source.bondTriggered = true;
			}
		},
		isNonstandard: null,
		rating: 4,
	},
	beastboost: {
		inherit: true,
		rating: 3.5,
	},
	berserk: {
		inherit: true,
		rating: 2,
	},
	bigpecks: {
		inherit: true,
		rating: 0.5,
	},
	blaze: {
		inherit: true,
		rating: 2,
	},
	bulletproof: {
		inherit: true,
		rating: 3,
	},
	cheekpouch: {
		inherit: true,
		rating: 2,
	},
	chillingneigh: {
		inherit: true,
		rating: 3,
	},
	chlorophyll: {
		inherit: true,
		rating: 3,
	},
	clearbody: {
		inherit: true,
		rating: 2,
	},
	cloudnine: {
		inherit: true,
		rating: 2,
	},
	colorchange: {
		inherit: true,
		rating: 0,
	},
	comatose: {
		inherit: true,
		rating: 4,
	},
	competitive: {
		inherit: true,
		onAfterEachBoost(boost, target, source, effect) {
			if (!source || target.isAlly(source)) {
				if (effect.id === 'stickyweb') {
					this.hint("In Gen 8, Court Change Sticky Web counts as lowering your own Speed, and Competitive only affects stats lowered by foes.", true, source.side);
				}
				return;
			}
			let statsLowered = false;
			let i: BoostID;
			for (i in boost) {
				if (boost[i]! < 0) {
					statsLowered = true;
				}
			}
			if (statsLowered) {
				this.boost({ spa: 2 }, target, target, null, false, true);
			}
		},
		rating: 2.5,
	},
	compoundeyes: {
		inherit: true,
		rating: 3,
	},
	contrary: {
		inherit: true,
		rating: 4.5,
	},
	corrosion: {
		inherit: true,
		rating: 2.5,
	},
	cottondown: {
		inherit: true,
		rating: 2,
	},
	curiousmedicine: {
		inherit: true,
		rating: 0,
	},
	cursedbody: {
		inherit: true,
		rating: 2,
	},
	cutecharm: {
		inherit: true,
		rating: 0.5,
	},
	damp: {
		inherit: true,
		rating: 1,
	},
	dancer: {
		inherit: true,
		rating: 1.5,
	},
	darkaura: {
		inherit: true,
		rating: 3,
	},
	dauntlessshield: {
		inherit: true,
		onStart(pokemon) {
			this.boost({ def: 1 }, pokemon);
		},
		rating: 3.5,
	},
	dazzling: {
		inherit: true,
		rating: 2.5,
	},
	defeatist: {
		inherit: true,
		rating: -1,
	},
	defiant: {
		inherit: true,
		onAfterEachBoost(boost, target, source, effect) {
			if (!source || target.isAlly(source)) {
				if (effect.id === 'stickyweb') {
					this.hint("In Gen 8, Court Change Sticky Web counts as lowering your own Speed, and Defiant only affects stats lowered by foes.", true, source.side);
				}
				return;
			}
			let statsLowered = false;
			let i: BoostID;
			for (i in boost) {
				if (boost[i]! < 0) {
					statsLowered = true;
				}
			}
			if (statsLowered) {
				this.boost({ atk: 2 }, target, target, null, false, true);
			}
		},
		rating: 2.5,
	},
	deltastream: {
		inherit: true,
		rating: 4,
	},
	desolateland: {
		inherit: true,
		rating: 4.5,
	},
	disguise: {
		inherit: true,
		onUpdate(pokemon) {
			if (['mimikyu', 'mimikyutotem'].includes(pokemon.species.id) && this.effectState.busted) {
				const speciesid = pokemon.species.id === 'mimikyutotem' ? 'Mimikyu-Busted-Totem' : 'Mimikyu-Busted';
				pokemon.formeChange(speciesid, this.effect, true);
				pokemon.formeRegression = true;
				this.damage(pokemon.baseMaxhp / 8, pokemon, pokemon, this.dex.species.get(speciesid));
			}
		},
		rating: 3.5,
	},
	download: {
		inherit: true,
		rating: 3.5,
	},
	dragonsmaw: {
		inherit: true,
		rating: 3.5,
	},
	drizzle: {
		inherit: true,
		rating: 4,
	},
	drought: {
		inherit: true,
		rating: 4,
	},
	dryskin: {
		inherit: true,
		rating: 3,
	},
	earlybird: {
		inherit: true,
		rating: 1.5,
	},
	effectspore: {
		inherit: true,
		rating: 2,
	},
	electricsurge: {
		inherit: true,
		rating: 4,
	},
	emergencyexit: {
		inherit: true,
		rating: 1,
	},
	fairyaura: {
		inherit: true,
		rating: 3,
	},
	filter: {
		inherit: true,
		rating: 3,
	},
	flamebody: {
		inherit: true,
		rating: 2,
	},
	flareboost: {
		inherit: true,
		rating: 2,
	},
	flashfire: {
		inherit: true,
		rating: 3.5,
	},
	flowergift: {
		inherit: true,
		rating: 1,
	},
	flowerveil: {
		inherit: true,
		rating: 0,
	},
	fluffy: {
		inherit: true,
		rating: 3.5,
	},
	forecast: {
		inherit: true,
		rating: 2,
	},
	forewarn: {
		inherit: true,
		rating: 0.5,
	},
	friendguard: {
		inherit: true,
		rating: 0,
	},
	frisk: {
		inherit: true,
		rating: 1.5,
	},
	fullmetalbody: {
		inherit: true,
		rating: 2,
	},
	furcoat: {
		inherit: true,
		rating: 4,
	},
	galewings: {
		inherit: true,
		rating: 2.5,
	},
	galvanize: {
		inherit: true,
		rating: 4,
	},
	gluttony: {
		inherit: true,
		rating: 1.5,
	},
	gooey: {
		inherit: true,
		rating: 2,
	},
	gorillatactics: {
		inherit: true,
		rating: 4.5,
	},
	grasspelt: {
		inherit: true,
		rating: 0.5,
	},
	grassysurge: {
		inherit: true,
		rating: 4,
	},
	grimneigh: {
		inherit: true,
		rating: 3,
	},
	gulpmissile: {
		inherit: true,
		flags: { failroleplay: 1, noreceiver: 1, noentrain: 1, notrace: 1, failskillswap: 1, cantsuppress: 1, notransform: 1 },
		rating: 2.5,
	},
	guts: {
		inherit: true,
		rating: 3,
	},
	harvest: {
		inherit: true,
		rating: 2.5,
	},
	healer: {
		inherit: true,
		rating: 0,
	},
	heatproof: {
		inherit: true,
		onSourceModifyAtk: undefined, // no inherit
		onSourceModifySpA: undefined, // no inherit
		onSourceBasePowerPriority: 18,
		onSourceBasePower(basePower, attacker, defender, move) {
			if (move.type === 'Fire') {
				this.debug('Heatproof BP weaken');
				return this.chainModify(0.5);
			}
		},
		rating: 2,
	},
	heavymetal: {
		inherit: true,
		rating: 0,
	},
	honeygather: {
		inherit: true,
		rating: 0,
	},
	hugepower: {
		inherit: true,
		rating: 5,
	},
	hungerswitch: {
		inherit: true,
		rating: 1,
	},
	hustle: {
		inherit: true,
		rating: 3.5,
	},
	hydration: {
		inherit: true,
		rating: 1.5,
	},
	hypercutter: {
		inherit: true,
		rating: 1.5,
	},
	icebody: {
		inherit: true,
		rating: 1,
	},
	iceface: {
		inherit: true,
		rating: 3,
	},
	icescales: {
		inherit: true,
		rating: 4,
	},
	illuminate: {
		inherit: true,
		onTryBoost: undefined, // no inherit
		onModifyMove: undefined, // no inherit
		flags: {},
		rating: 0,
	},
	illusion: {
		inherit: true,
		rating: 4.5,
	},
	immunity: {
		inherit: true,
		rating: 2,
	},
	imposter: {
		inherit: true,
		rating: 5,
	},
	infiltrator: {
		inherit: true,
		rating: 2.5,
	},
	innardsout: {
		inherit: true,
		rating: 4,
	},
	innerfocus: {
		inherit: true,
		rating: 1.5,
	},
	insomnia: {
		inherit: true,
		rating: 2,
	},
	intimidate: {
		inherit: true,
		rating: 3.5,
	},
	intrepidsword: {
		inherit: true,
		onStart(pokemon) {
			this.boost({ atk: 1 }, pokemon);
		},
		rating: 4,
	},
	ironbarbs: {
		inherit: true,
		rating: 2.5,
	},
	ironfist: {
		inherit: true,
		rating: 3,
	},
	justified: {
		inherit: true,
		rating: 2.5,
	},
	keeneye: {
		inherit: true,
		rating: 0.5,
	},
	klutz: {
		inherit: true,
		rating: -1,
	},
	leafguard: {
		inherit: true,
		rating: 0.5,
	},
	levitate: {
		inherit: true,
		rating: 3.5,
	},
	libero: {
		inherit: true,
		onPrepareHit(source, target, move) {
			if (move.hasBounced || move.flags['futuremove'] || move.sourceEffect === 'snatch' || move.callsMove) return;
			const type = move.type;
			if (type && type !== '???' && source.getTypes().join() !== type) {
				if (!source.setType(type)) return;
				this.add('-start', source, 'typechange', type, '[from] ability: Libero');
			}
		},
		rating: 4.5,
	},
	lightmetal: {
		inherit: true,
		rating: 1,
	},
	lightningrod: {
		inherit: true,
		rating: 3,
	},
	limber: {
		inherit: true,
		rating: 2,
	},
	liquidooze: {
		inherit: true,
		rating: 1.5,
	},
	liquidvoice: {
		inherit: true,
		rating: 1.5,
	},
	longreach: {
		inherit: true,
		rating: 1,
	},
	magicbounce: {
		inherit: true,
		rating: 4,
	},
	magicguard: {
		inherit: true,
		rating: 4,
	},
	magician: {
		inherit: true,
		rating: 1.5,
	},
	magmaarmor: {
		inherit: true,
		rating: 1,
	},
	magnetpull: {
		inherit: true,
		rating: 4,
	},
	marvelscale: {
		inherit: true,
		rating: 2.5,
	},
	megalauncher: {
		inherit: true,
		rating: 3,
	},
	merciless: {
		inherit: true,
		rating: 1.5,
	},
	mimicry: {
		inherit: true,
		rating: 0.5,
	},
	minus: {
		inherit: true,
		rating: 0,
	},
	mirrorarmor: {
		inherit: true,
		rating: 2.5,
	},
	mistysurge: {
		inherit: true,
		rating: 3.5,
	},
	moldbreaker: {
		inherit: true,
		rating: 3.5,
	},
	moody: {
		inherit: true,
		rating: 5,
	},
	motordrive: {
		inherit: true,
		rating: 3,
	},
	moxie: {
		inherit: true,
		rating: 3,
	},
	multiscale: {
		inherit: true,
		rating: 3.5,
	},
	multitype: {
		inherit: true,
		rating: 4,
	},
	mummy: {
		inherit: true,
		rating: 2,
	},
	naturalcure: {
		inherit: true,
		rating: 2.5,
	},
	neuroforce: {
		inherit: true,
		rating: 2.5,
	},
	neutralizinggas: {
		inherit: true,
		rating: 4,
	},
	noguard: {
		inherit: true,
		rating: 4,
	},
	normalize: {
		inherit: true,
		rating: 0,
	},
	oblivious: {
		inherit: true,
		rating: 1.5,
	},
	overcoat: {
		inherit: true,
		rating: 2,
	},
	overgrow: {
		inherit: true,
		rating: 2,
	},
	owntempo: {
		inherit: true,
		rating: 1.5,
	},
	parentalbond: {
		inherit: true,
		rating: 4.5,
	},
	pastelveil: {
		inherit: true,
		rating: 2,
	},
	perishbody: {
		inherit: true,
		rating: 1,
	},
	pickpocket: {
		inherit: true,
		rating: 1,
	},
	pickup: {
		inherit: true,
		rating: 0.5,
	},
	pixilate: {
		inherit: true,
		rating: 4,
	},
	plus: {
		inherit: true,
		rating: 0,
	},
	poisonheal: {
		inherit: true,
		rating: 4,
	},
	poisonpoint: {
		inherit: true,
		rating: 1.5,
	},
	poisontouch: {
		inherit: true,
		rating: 2,
	},
	powerconstruct: {
		inherit: true,
		rating: 5,
	},
	powerofalchemy: {
		inherit: true,
		rating: 0,
	},
	powerspot: {
		inherit: true,
		rating: 1,
	},
	prankster: {
		inherit: true,
		rating: 4,
	},
	pressure: {
		inherit: true,
		rating: 2.5,
	},
	primordialsea: {
		inherit: true,
		rating: 4.5,
	},
	prismarmor: {
		inherit: true,
		rating: 3,
	},
	propellertail: {
		inherit: true,
		rating: 0,
	},
	protean: {
		inherit: true,
		onPrepareHit(source, target, move) {
			if (move.hasBounced || move.flags['futuremove'] || move.sourceEffect === 'snatch' || move.callsMove) return;
			const type = move.type;
			if (type && type !== '???' && source.getTypes().join() !== type) {
				if (!source.setType(type)) return;
				this.add('-start', source, 'typechange', type, '[from] ability: Protean');
			}
		},
		rating: 4.5,
	},
	psychicsurge: {
		inherit: true,
		rating: 4,
	},
	punkrock: {
		inherit: true,
		rating: 3.5,
	},
	purepower: {
		inherit: true,
		rating: 5,
	},
	queenlymajesty: {
		inherit: true,
		rating: 2.5,
	},
	quickdraw: {
		inherit: true,
		rating: 2.5,
	},
	quickfeet: {
		inherit: true,
		rating: 2.5,
	},
	raindish: {
		inherit: true,
		rating: 1.5,
	},
	rattled: {
		inherit: true,
		rating: 1.5,
	},
	receiver: {
		inherit: true,
		rating: 0,
	},
	reckless: {
		inherit: true,
		rating: 3,
	},
	refrigerate: {
		inherit: true,
		rating: 4,
	},
	regenerator: {
		inherit: true,
		rating: 4.5,
	},
	ripen: {
		inherit: true,
		rating: 2,
	},
	rivalry: {
		inherit: true,
		rating: 0,
	},
	rkssystem: {
		inherit: true,
		rating: 4,
	},
	rockhead: {
		inherit: true,
		rating: 3,
	},
	roughskin: {
		inherit: true,
		rating: 2.5,
	},
	runaway: {
		inherit: true,
		rating: 0,
	},
	sandforce: {
		inherit: true,
		rating: 2,
	},
	sandrush: {
		inherit: true,
		rating: 3,
	},
	sandspit: {
		inherit: true,
		rating: 2,
	},
	sandstream: {
		inherit: true,
		rating: 4,
	},
	sandveil: {
		inherit: true,
		rating: 1.5,
	},
	sapsipper: {
		inherit: true,
		rating: 3,
	},
	schooling: {
		inherit: true,
		rating: 3,
	},
	scrappy: {
		inherit: true,
		rating: 3,
	},
	screencleaner: {
		inherit: true,
		rating: 2,
	},
	serenegrace: {
		inherit: true,
		rating: 3.5,
	},
	shadowshield: {
		inherit: true,
		rating: 3.5,
	},
	shadowtag: {
		inherit: true,
		rating: 5,
	},
	shedskin: {
		inherit: true,
		rating: 3,
	},
	sheerforce: {
		inherit: true,
		rating: 3.5,
	},
	shellarmor: {
		inherit: true,
		rating: 1,
	},
	shielddust: {
		inherit: true,
		rating: 2,
	},
	shieldsdown: {
		inherit: true,
		rating: 3,
	},
	simple: {
		inherit: true,
		rating: 4,
	},
	skilllink: {
		inherit: true,
		rating: 3,
	},
	slowstart: {
		inherit: true,
		rating: -1,
	},
	slushrush: {
		inherit: true,
		rating: 3,
	},
	sniper: {
		inherit: true,
		rating: 2,
	},
	snowcloak: {
		inherit: true,
		rating: 1.5,
	},
	snowwarning: {
		inherit: true,
		onStart(source) {
			this.field.setWeather('hail');
		},
		rating: 4,
	},
	solarpower: {
		inherit: true,
		rating: 2,
	},
	solidrock: {
		inherit: true,
		rating: 3,
	},
	soulheart: {
		inherit: true,
		rating: 3.5,
	},
	soundproof: {
		inherit: true,
		rating: 1.5,
	},
	speedboost: {
		inherit: true,
		rating: 4.5,
	},
	stakeout: {
		inherit: true,
		rating: 4.5,
	},
	stall: {
		inherit: true,
		rating: -1,
	},
	stalwart: {
		inherit: true,
		rating: 0,
	},
	stamina: {
		inherit: true,
		rating: 3.5,
	},
	stancechange: {
		inherit: true,
		rating: 4,
	},
	static: {
		inherit: true,
		rating: 2,
	},
	steadfast: {
		inherit: true,
		rating: 1,
	},
	steamengine: {
		inherit: true,
		rating: 2,
	},
	steelworker: {
		inherit: true,
		rating: 3.5,
	},
	steelyspirit: {
		inherit: true,
		rating: 3.5,
	},
	stench: {
		inherit: true,
		rating: 0.5,
	},
	stickyhold: {
		inherit: true,
		rating: 2,
	},
	stormdrain: {
		inherit: true,
		rating: 3,
	},
	strongjaw: {
		inherit: true,
		rating: 3,
	},
	sturdy: {
		inherit: true,
		rating: 3,
	},
	suctioncups: {
		inherit: true,
		rating: 1,
	},
	superluck: {
		inherit: true,
		rating: 1.5,
	},
	surgesurfer: {
		inherit: true,
		rating: 3,
	},
	swarm: {
		inherit: true,
		rating: 2,
	},
	sweetveil: {
		inherit: true,
		rating: 2,
	},
	swiftswim: {
		inherit: true,
		rating: 3,
	},
	symbiosis: {
		inherit: true,
		rating: 0,
	},
	synchronize: {
		inherit: true,
		rating: 2,
	},
	tangledfeet: {
		inherit: true,
		rating: 1,
	},
	tanglinghair: {
		inherit: true,
		rating: 2,
	},
	technician: {
		inherit: true,
		rating: 3.5,
	},
	telepathy: {
		inherit: true,
		rating: 0,
	},
	teravolt: {
		inherit: true,
		rating: 3.5,
	},
	thickfat: {
		inherit: true,
		rating: 3.5,
	},
	tintedlens: {
		inherit: true,
		rating: 4,
	},
	torrent: {
		inherit: true,
		rating: 2,
	},
	toughclaws: {
		inherit: true,
		rating: 3.5,
	},
	toxicboost: {
		inherit: true,
		rating: 2.5,
	},
	trace: {
		inherit: true,
		rating: 3,
	},
	transistor: {
		inherit: true,
		onModifyAtk(atk, attacker, defender, move) {
			if (move.type === 'Electric') {
				this.debug('Transistor boost');
				return this.chainModify(1.5);
			}
		},
		onModifySpA(atk, attacker, defender, move) {
			if (move.type === 'Electric') {
				this.debug('Transistor boost');
				return this.chainModify(1.5);
			}
		},
		rating: 3.5,
	},
	triage: {
		inherit: true,
		rating: 3.5,
	},
	truant: {
		inherit: true,
		rating: -1,
	},
	turboblaze: {
		inherit: true,
		rating: 3.5,
	},
	unaware: {
		inherit: true,
		rating: 4,
	},
	unburden: {
		inherit: true,
		rating: 3.5,
	},
	unnerve: {
		inherit: true,
		rating: 1.5,
	},
	unseenfist: {
		inherit: true,
		rating: 2,
	},
	victorystar: {
		inherit: true,
		rating: 2,
	},
	vitalspirit: {
		inherit: true,
		rating: 2,
	},
	voltabsorb: {
		inherit: true,
		rating: 3.5,
	},
	wanderingspirit: {
		inherit: true,
		rating: 2.5,
	},
	waterabsorb: {
		inherit: true,
		rating: 3.5,
	},
	waterbubble: {
		inherit: true,
		rating: 4.5,
	},
	watercompaction: {
		inherit: true,
		rating: 1.5,
	},
	waterveil: {
		inherit: true,
		rating: 2,
	},
	weakarmor: {
		inherit: true,
		rating: 1,
	},
	whitesmoke: {
		inherit: true,
		rating: 2,
	},
	wimpout: {
		inherit: true,
		rating: 1,
	},
	wonderguard: {
		inherit: true,
		flags: { failroleplay: 1, noreceiver: 1, failskillswap: 1, breakable: 1 },
		rating: 5,
	},
	wonderskin: {
		inherit: true,
		rating: 2,
	},
	zenmode: {
		inherit: true,
		rating: 0,
	},
	mountaineer: {
		inherit: true,
		rating: 3,
	},
	rebound: {
		inherit: true,
		rating: 3,
	},
	persistent: {
		inherit: true,
		rating: 3,
	},
};
