2023-04-14 04:04:51 +01:00
import { ChargeAnim , MoveChargeAnim , initMoveAnim , loadMoveAnimAssets } from "./battle-anims" ;
2023-04-20 20:46:05 +01:00
import { DamagePhase , EnemyMovePhase , MessagePhase , ObtainStatusEffectPhase , PlayerMovePhase , PokemonHealPhase , StatChangePhase } from "../battle-phases" ;
2023-04-11 04:15:06 +01:00
import { BattleStat } from "./battle-stat" ;
2023-04-22 00:30:04 +01:00
import { BattlerTagType } from "./battler-tag" ;
2023-04-20 20:46:05 +01:00
import { getPokemonMessage } from "../messages" ;
import Pokemon , { EnemyPokemon , MoveResult , PlayerPokemon , PokemonMove , TurnMove } from "../pokemon" ;
2023-04-19 21:52:14 +01:00
import { StatusEffect , getStatusEffectDescriptor } from "./status-effect" ;
2023-04-04 04:38:31 +01:00
import { Type } from "./type" ;
2023-04-20 20:46:05 +01:00
import * as Utils from "../utils" ;
2023-04-17 05:46:50 +01:00
import { WeatherType } from "./weather" ;
2023-04-22 00:30:04 +01:00
import { ArenaTagType } from "./arena-tag" ;
2023-03-28 19:54:52 +01:00
2023-04-01 03:31:20 +01:00
export enum MoveCategory {
2023-04-11 04:15:06 +01:00
PHYSICAL ,
2023-03-28 19:54:52 +01:00
SPECIAL ,
STATUS
2023-04-14 04:04:51 +01:00
}
2023-03-28 19:54:52 +01:00
2023-04-18 17:30:47 +01:00
export enum MoveFlags {
IGNORE_PROTECT = 1
}
2023-03-28 19:54:52 +01:00
export default class Move {
2023-04-04 01:47:41 +01:00
public id : Moves ;
2023-03-28 19:54:52 +01:00
public name : string ;
2023-04-04 01:47:41 +01:00
public type : Type ;
2023-04-04 04:38:31 +01:00
public category : MoveCategory ;
2023-04-18 17:30:47 +01:00
public selfTarget : boolean ;
2023-03-28 19:54:52 +01:00
public power : integer ;
public accuracy : integer ;
public pp : integer ;
2023-04-08 02:48:14 +01:00
public tm : integer ;
2023-03-28 19:54:52 +01:00
public effect : string ;
public chance : integer ;
2023-04-15 22:40:18 +01:00
public priority : integer ;
2023-03-28 19:54:52 +01:00
public generation : integer ;
2023-04-04 04:38:31 +01:00
public attrs : MoveAttr [ ] ;
2023-04-18 17:30:47 +01:00
private flags : integer ;
2023-03-28 19:54:52 +01:00
2023-04-18 17:30:47 +01:00
constructor ( id : Moves , name : string , type : Type , category : MoveCategory , selfTarget : boolean , power : integer , accuracy : integer , pp : integer , tm : integer , effect : string , chance : integer , priority : integer , generation : integer , . . . attrs : MoveAttr [ ] ) {
2023-03-28 19:54:52 +01:00
this . id = id ;
2023-04-08 05:21:44 +01:00
this . name = name . toUpperCase ( ) ;
2023-03-28 19:54:52 +01:00
this . type = type ;
this . category = category ;
2023-04-18 17:30:47 +01:00
this . selfTarget = selfTarget ;
2023-03-28 19:54:52 +01:00
this . power = power ;
this . accuracy = accuracy ;
this . pp = pp ;
this . tm = tm ;
this . effect = effect ;
this . chance = chance ;
2023-04-15 22:40:18 +01:00
this . priority = priority ;
2023-03-28 19:54:52 +01:00
this . generation = generation ;
2023-04-04 04:38:31 +01:00
this . attrs = attrs ;
2023-04-18 17:30:47 +01:00
this . flags = ( this . selfTarget ? MoveFlags.IGNORE_PROTECT : 0 ) ;
2023-03-28 19:54:52 +01:00
}
2023-04-11 04:15:06 +01:00
getAttrs ( attrType : { new ( . . . args : any [ ] ) : MoveAttr } ) : MoveAttr [ ] {
return this . attrs . filter ( a = > a instanceof attrType ) ;
}
2023-04-18 17:30:47 +01:00
hasFlag ( flag : MoveFlags ) : boolean {
return ! ! ( this . flags & flag ) ;
}
ignoreProtect ( ignoreProtect? : boolean ) : Move {
if ( ignoreProtect )
this . flags |= MoveFlags . IGNORE_PROTECT ;
else
this . flags ^= MoveFlags . IGNORE_PROTECT ;
return this ;
}
2023-03-28 19:54:52 +01:00
}
2023-04-14 04:04:51 +01:00
export class AttackMove extends Move {
2023-04-15 22:40:18 +01:00
constructor ( id : Moves , name : string , type : Type , category : MoveCategory , power : integer , accuracy : integer , pp : integer , tm : integer , effect : string , chance : integer , priority : integer , generation : integer , . . . attrs : MoveAttr [ ] ) {
2023-04-18 17:30:47 +01:00
super ( id , name , type , category , false , power , accuracy , pp , tm , effect , chance , priority , generation , . . . attrs ) ;
2023-04-14 04:04:51 +01:00
}
}
export class StatusMove extends Move {
2023-04-15 22:40:18 +01:00
constructor ( id : Moves , name : string , type : Type , accuracy : integer , pp : integer , tm : integer , effect : string , chance : integer , priority : integer , generation : integer , . . . attrs : MoveAttr [ ] ) {
2023-04-18 17:30:47 +01:00
super ( id , name , type , MoveCategory . STATUS , false , - 1 , accuracy , pp , tm , effect , chance , priority , generation , . . . attrs ) ;
}
}
export class SelfStatusMove extends Move {
constructor ( id : Moves , name : string , type : Type , accuracy : integer , pp : integer , tm : integer , effect : string , chance : integer , priority : integer , generation : integer , . . . attrs : MoveAttr [ ] ) {
super ( id , name , type , MoveCategory . STATUS , true , - 1 , accuracy , pp , tm , effect , chance , priority , generation , . . . attrs ) ;
2023-04-14 04:04:51 +01:00
}
}
2023-03-28 19:54:52 +01:00
export enum Moves {
2023-04-21 02:32:48 +01:00
NONE ,
POUND ,
2023-03-28 19:54:52 +01:00
KARATE_CHOP ,
DOUBLE_SLAP ,
COMET_PUNCH ,
MEGA_PUNCH ,
PAY_DAY ,
FIRE_PUNCH ,
ICE_PUNCH ,
THUNDER_PUNCH ,
SCRATCH ,
VISE_GRIP ,
GUILLOTINE ,
RAZOR_WIND ,
SWORDS_DANCE ,
CUT ,
GUST ,
WING_ATTACK ,
WHIRLWIND ,
FLY ,
BIND ,
SLAM ,
VINE_WHIP ,
STOMP ,
DOUBLE_KICK ,
MEGA_KICK ,
JUMP_KICK ,
ROLLING_KICK ,
SAND_ATTACK ,
HEADBUTT ,
HORN_ATTACK ,
FURY_ATTACK ,
HORN_DRILL ,
TACKLE ,
BODY_SLAM ,
WRAP ,
TAKE_DOWN ,
THRASH ,
DOUBLE_EDGE ,
TAIL_WHIP ,
POISON_STING ,
TWINEEDLE ,
PIN_MISSILE ,
LEER ,
BITE ,
GROWL ,
ROAR ,
SING ,
SUPERSONIC ,
SONIC_BOOM ,
DISABLE ,
ACID ,
EMBER ,
FLAMETHROWER ,
MIST ,
WATER_GUN ,
HYDRO_PUMP ,
SURF ,
ICE_BEAM ,
BLIZZARD ,
PSYBEAM ,
BUBBLE_BEAM ,
AURORA_BEAM ,
HYPER_BEAM ,
PECK ,
DRILL_PECK ,
SUBMISSION ,
LOW_KICK ,
COUNTER ,
SEISMIC_TOSS ,
STRENGTH ,
ABSORB ,
MEGA_DRAIN ,
LEECH_SEED ,
GROWTH ,
RAZOR_LEAF ,
SOLAR_BEAM ,
POISON_POWDER ,
STUN_SPORE ,
SLEEP_POWDER ,
PETAL_DANCE ,
STRING_SHOT ,
DRAGON_RAGE ,
FIRE_SPIN ,
THUNDER_SHOCK ,
THUNDERBOLT ,
THUNDER_WAVE ,
THUNDER ,
ROCK_THROW ,
EARTHQUAKE ,
FISSURE ,
DIG ,
TOXIC ,
CONFUSION ,
PSYCHIC ,
HYPNOSIS ,
MEDITATE ,
AGILITY ,
QUICK_ATTACK ,
RAGE ,
TELEPORT ,
NIGHT_SHADE ,
MIMIC ,
SCREECH ,
DOUBLE_TEAM ,
RECOVER ,
HARDEN ,
MINIMIZE ,
SMOKESCREEN ,
CONFUSE_RAY ,
WITHDRAW ,
DEFENSE_CURL ,
BARRIER ,
LIGHT_SCREEN ,
HAZE ,
REFLECT ,
FOCUS_ENERGY ,
BIDE ,
METRONOME ,
MIRROR_MOVE ,
SELF_DESTRUCT ,
EGG_BOMB ,
LICK ,
SMOG ,
SLUDGE ,
BONE_CLUB ,
FIRE_BLAST ,
WATERFALL ,
CLAMP ,
SWIFT ,
SKULL_BASH ,
SPIKE_CANNON ,
CONSTRICT ,
AMNESIA ,
KINESIS ,
SOFT_BOILED ,
HIGH_JUMP_KICK ,
GLARE ,
DREAM_EATER ,
POISON_GAS ,
BARRAGE ,
LEECH_LIFE ,
LOVELY_KISS ,
SKY_ATTACK ,
TRANSFORM ,
BUBBLE ,
DIZZY_PUNCH ,
SPORE ,
FLASH ,
PSYWAVE ,
SPLASH ,
ACID_ARMOR ,
CRABHAMMER ,
EXPLOSION ,
FURY_SWIPES ,
BONEMERANG ,
REST ,
ROCK_SLIDE ,
HYPER_FANG ,
SHARPEN ,
CONVERSION ,
TRI_ATTACK ,
SUPER_FANG ,
SLASH ,
SUBSTITUTE ,
STRUGGLE ,
SKETCH ,
TRIPLE_KICK ,
THIEF ,
SPIDER_WEB ,
MIND_READER ,
NIGHTMARE ,
FLAME_WHEEL ,
SNORE ,
CURSE ,
FLAIL ,
CONVERSION_2 ,
AEROBLAST ,
COTTON_SPORE ,
REVERSAL ,
SPITE ,
POWDER_SNOW ,
PROTECT ,
MACH_PUNCH ,
SCARY_FACE ,
2023-03-29 05:31:25 +01:00
FEINT_ATTACK ,
2023-03-28 19:54:52 +01:00
SWEET_KISS ,
BELLY_DRUM ,
SLUDGE_BOMB ,
MUD_SLAP ,
OCTAZOOKA ,
SPIKES ,
ZAP_CANNON ,
FORESIGHT ,
DESTINY_BOND ,
PERISH_SONG ,
ICY_WIND ,
DETECT ,
BONE_RUSH ,
LOCK_ON ,
OUTRAGE ,
SANDSTORM ,
GIGA_DRAIN ,
ENDURE ,
CHARM ,
ROLLOUT ,
FALSE_SWIPE ,
SWAGGER ,
MILK_DRINK ,
SPARK ,
FURY_CUTTER ,
STEEL_WING ,
MEAN_LOOK ,
ATTRACT ,
SLEEP_TALK ,
HEAL_BELL ,
RETURN ,
PRESENT ,
FRUSTRATION ,
SAFEGUARD ,
PAIN_SPLIT ,
SACRED_FIRE ,
MAGNITUDE ,
DYNAMIC_PUNCH ,
MEGAHORN ,
DRAGON_BREATH ,
BATON_PASS ,
ENCORE ,
PURSUIT ,
RAPID_SPIN ,
SWEET_SCENT ,
IRON_TAIL ,
METAL_CLAW ,
VITAL_THROW ,
MORNING_SUN ,
SYNTHESIS ,
MOONLIGHT ,
HIDDEN_POWER ,
CROSS_CHOP ,
TWISTER ,
RAIN_DANCE ,
SUNNY_DAY ,
CRUNCH ,
MIRROR_COAT ,
PSYCH_UP ,
EXTREME_SPEED ,
ANCIENT_POWER ,
SHADOW_BALL ,
FUTURE_SIGHT ,
ROCK_SMASH ,
WHIRLPOOL ,
BEAT_UP ,
FAKE_OUT ,
UPROAR ,
STOCKPILE ,
SPIT_UP ,
SWALLOW ,
HEAT_WAVE ,
HAIL ,
TORMENT ,
FLATTER ,
WILL_O_WISP ,
MEMENTO ,
FACADE ,
FOCUS_PUNCH ,
SMELLING_SALTS ,
FOLLOW_ME ,
NATURE_POWER ,
CHARGE ,
TAUNT ,
HELPING_HAND ,
TRICK ,
ROLE_PLAY ,
WISH ,
ASSIST ,
INGRAIN ,
SUPERPOWER ,
MAGIC_COAT ,
RECYCLE ,
REVENGE ,
BRICK_BREAK ,
YAWN ,
KNOCK_OFF ,
ENDEAVOR ,
ERUPTION ,
SKILL_SWAP ,
IMPRISON ,
REFRESH ,
GRUDGE ,
SNATCH ,
SECRET_POWER ,
DIVE ,
ARM_THRUST ,
CAMOUFLAGE ,
TAIL_GLOW ,
LUSTER_PURGE ,
MIST_BALL ,
FEATHER_DANCE ,
TEETER_DANCE ,
BLAZE_KICK ,
MUD_SPORT ,
ICE_BALL ,
NEEDLE_ARM ,
SLACK_OFF ,
HYPER_VOICE ,
POISON_FANG ,
CRUSH_CLAW ,
BLAST_BURN ,
HYDRO_CANNON ,
METEOR_MASH ,
ASTONISH ,
WEATHER_BALL ,
AROMATHERAPY ,
FAKE_TEARS ,
AIR_CUTTER ,
OVERHEAT ,
ODOR_SLEUTH ,
ROCK_TOMB ,
SILVER_WIND ,
METAL_SOUND ,
GRASS_WHISTLE ,
TICKLE ,
COSMIC_POWER ,
WATER_SPOUT ,
SIGNAL_BEAM ,
SHADOW_PUNCH ,
EXTRASENSORY ,
SKY_UPPERCUT ,
SAND_TOMB ,
SHEER_COLD ,
MUDDY_WATER ,
BULLET_SEED ,
AERIAL_ACE ,
ICICLE_SPEAR ,
IRON_DEFENSE ,
BLOCK ,
HOWL ,
DRAGON_CLAW ,
FRENZY_PLANT ,
BULK_UP ,
BOUNCE ,
MUD_SHOT ,
POISON_TAIL ,
COVET ,
VOLT_TACKLE ,
MAGICAL_LEAF ,
WATER_SPORT ,
CALM_MIND ,
LEAF_BLADE ,
DRAGON_DANCE ,
ROCK_BLAST ,
SHOCK_WAVE ,
WATER_PULSE ,
DOOM_DESIRE ,
PSYCHO_BOOST ,
ROOST ,
GRAVITY ,
MIRACLE_EYE ,
WAKE_UP_SLAP ,
HAMMER_ARM ,
GYRO_BALL ,
HEALING_WISH ,
BRINE ,
NATURAL_GIFT ,
FEINT ,
PLUCK ,
TAILWIND ,
ACUPRESSURE ,
METAL_BURST ,
U_TURN ,
CLOSE_COMBAT ,
PAYBACK ,
ASSURANCE ,
EMBARGO ,
FLING ,
PSYCHO_SHIFT ,
TRUMP_CARD ,
HEAL_BLOCK ,
WRING_OUT ,
POWER_TRICK ,
GASTRO_ACID ,
LUCKY_CHANT ,
ME_FIRST ,
COPYCAT ,
POWER_SWAP ,
GUARD_SWAP ,
PUNISHMENT ,
LAST_RESORT ,
WORRY_SEED ,
SUCKER_PUNCH ,
TOXIC_SPIKES ,
HEART_SWAP ,
AQUA_RING ,
MAGNET_RISE ,
FLARE_BLITZ ,
FORCE_PALM ,
AURA_SPHERE ,
ROCK_POLISH ,
POISON_JAB ,
DARK_PULSE ,
NIGHT_SLASH ,
AQUA_TAIL ,
SEED_BOMB ,
AIR_SLASH ,
X_SCISSOR ,
BUG_BUZZ ,
DRAGON_PULSE ,
DRAGON_RUSH ,
POWER_GEM ,
DRAIN_PUNCH ,
VACUUM_WAVE ,
FOCUS_BLAST ,
ENERGY_BALL ,
BRAVE_BIRD ,
EARTH_POWER ,
SWITCHEROO ,
GIGA_IMPACT ,
NASTY_PLOT ,
BULLET_PUNCH ,
AVALANCHE ,
ICE_SHARD ,
SHADOW_CLAW ,
THUNDER_FANG ,
ICE_FANG ,
FIRE_FANG ,
SHADOW_SNEAK ,
MUD_BOMB ,
PSYCHO_CUT ,
ZEN_HEADBUTT ,
MIRROR_SHOT ,
FLASH_CANNON ,
ROCK_CLIMB ,
DEFOG ,
TRICK_ROOM ,
DRACO_METEOR ,
DISCHARGE ,
LAVA_PLUME ,
LEAF_STORM ,
POWER_WHIP ,
ROCK_WRECKER ,
CROSS_POISON ,
GUNK_SHOT ,
IRON_HEAD ,
MAGNET_BOMB ,
STONE_EDGE ,
CAPTIVATE ,
STEALTH_ROCK ,
GRASS_KNOT ,
CHATTER ,
JUDGMENT ,
BUG_BITE ,
CHARGE_BEAM ,
WOOD_HAMMER ,
AQUA_JET ,
ATTACK_ORDER ,
DEFEND_ORDER ,
HEAL_ORDER ,
HEAD_SMASH ,
DOUBLE_HIT ,
ROAR_OF_TIME ,
SPACIAL_REND ,
LUNAR_DANCE ,
CRUSH_GRIP ,
MAGMA_STORM ,
DARK_VOID ,
SEED_FLARE ,
OMINOUS_WIND ,
SHADOW_FORCE ,
HONE_CLAWS ,
WIDE_GUARD ,
GUARD_SPLIT ,
POWER_SPLIT ,
WONDER_ROOM ,
PSYSHOCK ,
VENOSHOCK ,
AUTOTOMIZE ,
RAGE_POWDER ,
TELEKINESIS ,
MAGIC_ROOM ,
SMACK_DOWN ,
STORM_THROW ,
FLAME_BURST ,
SLUDGE_WAVE ,
QUIVER_DANCE ,
HEAVY_SLAM ,
SYNCHRONOISE ,
ELECTRO_BALL ,
SOAK ,
FLAME_CHARGE ,
COIL ,
LOW_SWEEP ,
ACID_SPRAY ,
FOUL_PLAY ,
SIMPLE_BEAM ,
ENTRAINMENT ,
AFTER_YOU ,
ROUND ,
ECHOED_VOICE ,
CHIP_AWAY ,
CLEAR_SMOG ,
STORED_POWER ,
QUICK_GUARD ,
ALLY_SWITCH ,
SCALD ,
SHELL_SMASH ,
HEAL_PULSE ,
HEX ,
SKY_DROP ,
SHIFT_GEAR ,
CIRCLE_THROW ,
INCINERATE ,
QUASH ,
ACROBATICS ,
REFLECT_TYPE ,
RETALIATE ,
FINAL_GAMBIT ,
BESTOW ,
INFERNO ,
WATER_PLEDGE ,
FIRE_PLEDGE ,
GRASS_PLEDGE ,
VOLT_SWITCH ,
STRUGGLE_BUG ,
BULLDOZE ,
FROST_BREATH ,
DRAGON_TAIL ,
WORK_UP ,
ELECTROWEB ,
WILD_CHARGE ,
DRILL_RUN ,
DUAL_CHOP ,
HEART_STAMP ,
HORN_LEECH ,
SACRED_SWORD ,
RAZOR_SHELL ,
HEAT_CRASH ,
LEAF_TORNADO ,
STEAMROLLER ,
COTTON_GUARD ,
NIGHT_DAZE ,
PSYSTRIKE ,
TAIL_SLAP ,
HURRICANE ,
HEAD_CHARGE ,
GEAR_GRIND ,
SEARING_SHOT ,
TECHNO_BLAST ,
RELIC_SONG ,
SECRET_SWORD ,
GLACIATE ,
BOLT_STRIKE ,
BLUE_FLARE ,
FIERY_DANCE ,
FREEZE_SHOCK ,
ICE_BURN ,
SNARL ,
ICICLE_CRASH ,
V_CREATE ,
FUSION_FLARE ,
FUSION_BOLT
2023-04-17 05:46:50 +01:00
}
2023-03-28 19:54:52 +01:00
2023-04-16 05:29:55 +01:00
type MoveAttrFunc = ( user : Pokemon , target : Pokemon , move : Move ) = > boolean ;
2023-04-10 21:17:25 +01:00
2023-04-04 04:38:31 +01:00
export abstract class MoveAttr {
2023-04-16 05:29:55 +01:00
apply ( user : Pokemon , target : Pokemon , move : Move , args : any [ ] ) : boolean | Promise < boolean > {
2023-04-04 04:38:31 +01:00
return true ;
}
}
2023-04-13 17:16:36 +01:00
export class MoveEffectAttr extends MoveAttr {
2023-04-15 06:32:16 +01:00
public selfTarget : boolean ;
constructor ( selfTarget? : boolean ) {
super ( ) ;
this . selfTarget = ! ! selfTarget ;
}
2023-04-16 05:29:55 +01:00
canApply ( user : Pokemon , target : Pokemon , move : Move , args : any [ ] ) {
2023-04-22 00:30:04 +01:00
return ! ! ( this . selfTarget ? user . hp && ! user . getTag ( BattlerTagType . FRENZY ) : target . hp )
&& ( this . selfTarget || ! target . getTag ( BattlerTagType . PROTECTED ) || move . hasFlag ( MoveFlags . IGNORE_PROTECT ) ) ;
2023-04-15 06:32:16 +01:00
}
2023-04-16 05:29:55 +01:00
apply ( user : Pokemon , target : Pokemon , move : Move , args : any [ ] ) {
return this . canApply ( user , target , move , args ) ;
2023-04-15 06:32:16 +01:00
}
2023-04-13 17:16:36 +01:00
}
2023-04-11 04:15:06 +01:00
export class MoveHitEffectAttr extends MoveAttr {
}
2023-04-04 04:38:31 +01:00
2023-04-11 04:15:06 +01:00
export class HighCritAttr extends MoveAttr {
2023-04-16 05:29:55 +01:00
apply ( user : Pokemon , target : Pokemon , move : Move , args : any [ ] ) : boolean {
2023-04-19 03:09:37 +01:00
( args [ 0 ] as Utils . IntegerHolder ) . value ++ ;
2023-04-12 00:08:03 +01:00
2023-04-11 04:15:06 +01:00
return true ;
}
2023-04-04 04:38:31 +01:00
}
2023-04-15 22:40:18 +01:00
export class FixedDamageAttr extends MoveAttr {
private damage : integer ;
constructor ( damage : integer ) {
super ( ) ;
this . damage = damage ;
}
2023-04-16 05:29:55 +01:00
apply ( user : Pokemon , target : Pokemon , move : Move , args : any [ ] ) : boolean {
2023-04-15 22:40:18 +01:00
( args [ 0 ] as Utils . IntegerHolder ) . value = this . damage ;
return true ;
}
2023-04-18 18:36:11 +01:00
getDamage ( ) : integer {
return this . damage ;
}
}
export class UserHpDamageAttr extends FixedDamageAttr {
constructor ( ) {
super ( 0 ) ;
}
apply ( user : Pokemon , target : Pokemon , move : Move , args : any [ ] ) : boolean {
( args [ 0 ] as Utils . IntegerHolder ) . value = user . hp ;
return true ;
}
}
2023-04-22 15:56:17 +01:00
export class TargetHalfHpDamageAttr extends FixedDamageAttr {
constructor ( ) {
super ( 0 ) ;
}
apply ( user : Pokemon , target : Pokemon , move : Move , args : any [ ] ) : boolean {
( args [ 0 ] as Utils . IntegerHolder ) . value = Math . floor ( target . hp / 2 ) ;
return true ;
}
}
2023-04-18 18:36:11 +01:00
export class RecoilAttr extends MoveEffectAttr {
constructor ( ) {
super ( true ) ;
}
apply ( user : Pokemon , target : Pokemon , move : Move , args : any [ ] ) : boolean {
if ( ! super . apply ( user , target , move , args ) )
return false ;
const recoilDamage = Math . max ( Math . floor ( user . turnData . damageDealt / 4 ) , 1 ) ;
user . damage ( recoilDamage ) ;
user . scene . unshiftPhase ( new DamagePhase ( user . scene , user . isPlayer ( ) , MoveResult . OTHER ) ) ;
2023-04-22 00:30:04 +01:00
user . scene . queueMessage ( getPokemonMessage ( user , ' is hit\nwith recoil!' ) ) ;
2023-04-18 18:36:11 +01:00
return true ;
}
}
export class SacrificialAttr extends MoveEffectAttr {
constructor ( ) {
super ( true ) ;
}
apply ( user : Pokemon , target : Pokemon , move : Move , args : any [ ] ) : boolean {
if ( ! super . apply ( user , target , move , args ) )
return false ;
user . damage ( user . getMaxHp ( ) ) ;
user . scene . unshiftPhase ( new DamagePhase ( user . scene , user . isPlayer ( ) , MoveResult . OTHER ) ) ;
return true ;
}
2023-04-15 22:40:18 +01:00
}
2023-04-17 05:46:50 +01:00
export enum MultiHitType {
2023-04-10 21:17:25 +01:00
_2 ,
_2_TO_5 ,
_3_INCR
}
2023-04-17 05:46:50 +01:00
export class HealAttr extends MoveEffectAttr {
private healRatio : number ;
2023-04-16 23:40:32 +01:00
private showAnim : boolean ;
2023-04-18 17:30:47 +01:00
constructor ( healRatio? : number , showAnim? : boolean , selfTarget? : boolean ) {
super ( selfTarget === undefined || selfTarget ) ;
2023-04-16 23:40:32 +01:00
2023-04-17 05:46:50 +01:00
this . healRatio = healRatio || 1 ;
2023-04-16 23:40:32 +01:00
this . showAnim = ! ! showAnim ;
}
2023-04-16 05:29:55 +01:00
apply ( user : Pokemon , target : Pokemon , move : Move , args : any [ ] ) : boolean {
2023-04-17 05:46:50 +01:00
this . addHealPhase ( user , this . healRatio ) ;
2023-04-16 05:29:55 +01:00
return true ;
}
2023-04-17 05:46:50 +01:00
addHealPhase ( user : Pokemon , healRatio : number ) {
user . scene . unshiftPhase ( new PokemonHealPhase ( user . scene , user . isPlayer ( ) , Math . max ( Math . floor ( user . getMaxHp ( ) * healRatio ) , 1 ) , getPokemonMessage ( user , ' regained\nhealth!' ) , true , ! this . showAnim ) ) ;
}
2023-04-16 05:29:55 +01:00
}
2023-04-17 05:46:50 +01:00
export class WeatherHealAttr extends HealAttr {
constructor ( ) {
super ( 0.5 ) ;
}
apply ( user : Pokemon , target : Pokemon , move : Move , args : any [ ] ) : boolean {
let healRatio = 0.5 ;
const weatherType = user . scene . arena . weather ? . weatherType || WeatherType . NONE ;
switch ( weatherType ) {
case WeatherType . SUNNY :
case WeatherType . HARSH_SUN :
healRatio = 2 / 3 ;
break ;
case WeatherType . RAIN :
case WeatherType . SANDSTORM :
case WeatherType . HAIL :
case WeatherType . HEAVY_RAIN :
healRatio = 0.25 ;
break ;
}
this . addHealPhase ( user , healRatio ) ;
return true ;
}
}
export class HitHealAttr extends MoveHitEffectAttr {
2023-04-16 05:29:55 +01:00
apply ( user : Pokemon , target : Pokemon , move : Move , args : any [ ] ) : boolean {
user . scene . unshiftPhase ( new PokemonHealPhase ( user . scene , user . isPlayer ( ) , Math . max ( Math . floor ( user . turnData . damageDealt / 2 ) , 1 ) , getPokemonMessage ( target , ` had its \ nenergy drained! ` ) , false , true ) ) ;
return true ;
}
}
2023-04-10 21:17:25 +01:00
export class MultiHitAttr extends MoveAttr {
private multiHitType : MultiHitType ;
constructor ( multiHitType? : MultiHitType ) {
2023-04-04 04:38:31 +01:00
super ( ) ;
2023-04-10 21:17:25 +01:00
this . multiHitType = multiHitType !== undefined ? multiHitType : MultiHitType._2_TO_5 ;
2023-04-04 04:38:31 +01:00
}
2023-04-16 05:29:55 +01:00
apply ( user : Pokemon , target : Pokemon , move : Move , args : any [ ] ) : boolean {
2023-04-04 04:38:31 +01:00
let hitTimes : integer ;
2023-04-10 21:17:25 +01:00
switch ( this . multiHitType ) {
case MultiHitType . _2_TO_5 :
const rand = Utils . randInt ( 16 ) ;
if ( rand >= 10 )
hitTimes = 2 ;
else if ( rand >= 4 )
hitTimes = 3 ;
else if ( rand >= 2 )
hitTimes = 4 ;
else
hitTimes = 5 ;
break ;
case MultiHitType . _2 :
hitTimes = 2 ;
break ;
2023-04-11 04:15:06 +01:00
case MultiHitType . _3_INCR :
hitTimes = 3 ;
// TODO: Add power increase for every hit
break ;
2023-04-10 21:17:25 +01:00
}
2023-04-04 04:38:31 +01:00
( args [ 0 ] as Utils . IntegerHolder ) . value = hitTimes ;
return true ;
}
}
2023-04-17 05:46:50 +01:00
export class StatusEffectAttr extends MoveHitEffectAttr {
2023-04-04 04:38:31 +01:00
public effect : StatusEffect ;
2023-04-16 23:40:32 +01:00
public selfTarget : boolean ;
public cureTurn : integer ;
2023-04-04 04:38:31 +01:00
2023-04-16 23:40:32 +01:00
constructor ( effect : StatusEffect , selfTarget? : boolean , cureTurn? : integer ) {
2023-04-04 04:38:31 +01:00
super ( ) ;
2023-04-16 23:40:32 +01:00
2023-04-04 04:38:31 +01:00
this . effect = effect ;
2023-04-16 23:40:32 +01:00
this . selfTarget = ! ! selfTarget ;
this . cureTurn = cureTurn ;
2023-04-04 04:38:31 +01:00
}
2023-04-16 05:29:55 +01:00
apply ( user : Pokemon , target : Pokemon , move : Move , args : any [ ] ) : boolean {
2023-04-04 04:38:31 +01:00
const statusCheck = move . chance < 0 || move . chance === 100 || Utils . randInt ( 100 ) < move . chance ;
2023-04-12 00:08:03 +01:00
if ( statusCheck ) {
2023-04-16 23:40:32 +01:00
const pokemon = this . selfTarget ? user : target ;
if ( ! pokemon . status || ( pokemon . status . effect === this . effect && move . chance < 0 ) ) {
user . scene . unshiftPhase ( new ObtainStatusEffectPhase ( user . scene , pokemon . isPlayer ( ) , this . effect , this . cureTurn ) ) ;
2023-04-15 06:32:16 +01:00
return true ;
}
2023-04-12 00:08:03 +01:00
}
2023-04-15 06:32:16 +01:00
return false ;
2023-04-04 04:38:31 +01:00
}
}
2023-04-19 21:52:14 +01:00
export class HealStatusEffectAttr extends MoveEffectAttr {
private effects : StatusEffect [ ] ;
constructor ( selfTarget : boolean , . . . effects : StatusEffect [ ] ) {
super ( selfTarget ) ;
this . effects = effects ;
}
apply ( user : Pokemon , target : Pokemon , move : Move , args : any [ ] ) : boolean {
if ( ! super . apply ( user , target , move , args ) )
return false ;
const pokemon = this . selfTarget ? user : target ;
if ( pokemon . status && this . effects . indexOf ( pokemon . status . effect ) > - 1 ) {
2023-04-22 00:30:04 +01:00
pokemon . scene . queueMessage ( getPokemonMessage ( pokemon , ` was cured of its \ n ${ getStatusEffectDescriptor ( pokemon . status . effect ) } ! ` ) ) ;
2023-04-19 21:52:14 +01:00
pokemon . resetStatus ( ) ;
pokemon . updateInfo ( ) ;
}
return false ;
}
}
2023-04-16 23:40:32 +01:00
export class BypassSleepAttr extends MoveAttr {
apply ( user : Pokemon , target : Pokemon , move : Move , args : any [ ] ) : boolean {
if ( user . status ? . effect === StatusEffect . SLEEP ) {
2023-04-22 00:30:04 +01:00
user . addTag ( BattlerTagType . BYPASS_SLEEP , 1 ) ;
2023-04-16 23:40:32 +01:00
return true ;
}
return false ;
}
}
2023-04-17 05:46:50 +01:00
export class WeatherChangeAttr extends MoveEffectAttr {
private weatherType : WeatherType ;
constructor ( weatherType : WeatherType ) {
super ( ) ;
this . weatherType = weatherType ;
}
apply ( user : Pokemon , target : Pokemon , move : Move , args : any [ ] ) : boolean {
return user . scene . arena . trySetWeather ( this . weatherType , true ) ;
}
}
export class ClearWeatherAttr extends MoveEffectAttr {
private weatherType : WeatherType ;
constructor ( weatherType : WeatherType ) {
super ( ) ;
this . weatherType = weatherType ;
}
apply ( user : Pokemon , target : Pokemon , move : Move , args : any [ ] ) : boolean {
if ( user . scene . arena . weather ? . weatherType === this . weatherType )
return user . scene . arena . trySetWeather ( WeatherType . NONE , true ) ;
return false ;
}
}
export class OneHitKOAttr extends MoveHitEffectAttr {
2023-04-16 05:29:55 +01:00
apply ( user : Pokemon , target : Pokemon , move : Move , args : any [ ] ) : boolean {
2023-04-04 04:38:31 +01:00
target . hp = 0 ;
2023-04-22 00:30:04 +01:00
user . scene . queueMessage ( 'It\'s a one-hit KO!' ) ;
2023-04-04 04:38:31 +01:00
return true ;
}
}
2023-04-13 17:16:36 +01:00
export class OverrideMoveEffectAttr extends MoveAttr { }
2023-04-11 04:15:06 +01:00
2023-04-13 17:16:36 +01:00
export class ChargeAttr extends OverrideMoveEffectAttr {
public chargeAnim : ChargeAnim ;
private chargeText : string ;
2023-04-22 00:30:04 +01:00
private tagType : BattlerTagType ;
2023-04-13 17:16:36 +01:00
public chargeEffect : boolean ;
2023-04-22 00:30:04 +01:00
constructor ( chargeAnim : ChargeAnim , chargeText : string , tagType? : BattlerTagType , chargeEffect? : boolean ) {
2023-04-11 04:15:06 +01:00
super ( ) ;
2023-04-13 17:16:36 +01:00
this . chargeAnim = chargeAnim ;
this . chargeText = chargeText ;
this . tagType = tagType ;
2023-04-11 04:15:06 +01:00
this . chargeEffect = ! ! chargeEffect ;
}
2023-04-16 05:29:55 +01:00
apply ( user : Pokemon , target : Pokemon , move : Move , args : any [ ] ) : Promise < boolean > {
2023-04-13 17:16:36 +01:00
return new Promise ( resolve = > {
const lastMove = user . getLastXMoves ( 1 ) as TurnMove [ ] ;
if ( ! lastMove . length || lastMove [ 0 ] . move !== move . id || lastMove [ 0 ] . result !== MoveResult . OTHER ) {
( args [ 0 ] as Utils . BooleanHolder ) . value = true ;
2023-04-16 05:29:55 +01:00
new MoveChargeAnim ( this . chargeAnim , move . id , user , target ) . play ( user . scene , ( ) = > {
2023-04-22 00:30:04 +01:00
user . scene . queueMessage ( getPokemonMessage ( user , ` ${ this . chargeText . replace ( '{TARGET}' , target . name ) } ` ) ) ;
2023-04-13 17:16:36 +01:00
if ( this . tagType )
2023-04-15 22:40:18 +01:00
user . addTag ( this . tagType , 1 ) ;
2023-04-13 17:16:36 +01:00
if ( this . chargeEffect )
2023-04-16 05:29:55 +01:00
applyMoveAttrs ( MoveEffectAttr , user , target , move ) ;
2023-04-21 02:32:48 +01:00
user . getMoveHistory ( ) . push ( { move : move.id , result : MoveResult.OTHER } ) ;
user . getMoveQueue ( ) . push ( { move : move.id , ignorePP : true } ) ;
2023-04-13 17:16:36 +01:00
resolve ( true ) ;
} ) ;
} else
2023-04-15 06:32:16 +01:00
resolve ( false ) ;
2023-04-13 17:16:36 +01:00
} ) ;
2023-04-04 04:38:31 +01:00
}
}
2023-04-17 05:46:50 +01:00
export class SolarBeamChargeAttr extends ChargeAttr {
constructor ( ) {
super ( ChargeAnim . SOLAR_BEAM_CHARGING , 'took\nin sunlight!' ) ;
}
apply ( user : Pokemon , target : Pokemon , move : Move , args : any [ ] ) : Promise < boolean > {
return new Promise ( resolve = > {
const weatherType = user . scene . arena . weather ? . weatherType ;
if ( weatherType === WeatherType . SUNNY || weatherType === WeatherType . HARSH_SUN )
resolve ( false ) ;
else
super . apply ( user , target , move , args ) . then ( result = > resolve ( result ) ) ;
} ) ;
}
}
2023-04-13 17:16:36 +01:00
export class StatChangeAttr extends MoveEffectAttr {
2023-04-11 04:15:06 +01:00
public stats : BattleStat [ ] ;
2023-04-04 04:38:31 +01:00
public levels : integer ;
2023-04-11 04:15:06 +01:00
constructor ( stats : BattleStat | BattleStat [ ] , levels : integer , selfTarget? : boolean ) {
2023-04-15 06:32:16 +01:00
super ( selfTarget ) ;
2023-04-11 04:15:06 +01:00
this . stats = typeof ( stats ) === 'number'
? [ stats as BattleStat ]
: stats as BattleStat [ ] ;
this . levels = levels ;
2023-04-04 04:38:31 +01:00
}
2023-04-16 05:29:55 +01:00
apply ( user : Pokemon , target : Pokemon , move : Move , args : any [ ] ) : boolean {
if ( ! super . apply ( user , target , move , args ) )
2023-04-15 06:32:16 +01:00
return false ;
if ( move . chance < 0 || move . chance === 100 || Utils . randInt ( 100 ) < move . chance ) {
2023-04-17 05:46:50 +01:00
const levels = this . getLevels ( user ) ;
user . scene . unshiftPhase ( new StatChangePhase ( user . scene , user . isPlayer ( ) === this . selfTarget , this . stats , levels ) ) ;
return true ;
}
return false ;
}
getLevels ( _user : Pokemon ) : integer {
return this . levels ;
}
}
export class GrowthStatChangeAttr extends StatChangeAttr {
constructor ( ) {
super ( [ BattleStat . ATK , BattleStat . SPATK ] , 1 , true ) ;
}
getLevels ( user : Pokemon ) : number {
const weatherType = user . scene . arena . weather ? . weatherType ;
if ( weatherType === WeatherType . SUNNY || weatherType === WeatherType . HARSH_SUN )
return this . levels + 1 ;
return this . levels ;
}
}
export class VariablePowerAttr extends MoveAttr {
apply ( user : Pokemon , target : Pokemon , move : Move , args : any [ ] ) : boolean {
//const power = args[0] as Utils.NumberHolder;
return false ;
}
}
2023-04-19 21:52:14 +01:00
export class MovePowerMultiplierAttr extends VariablePowerAttr {
private powerMultiplierFunc : ( user : Pokemon , target : Pokemon , move : Move ) = > number ;
constructor ( powerMultiplier : ( user : Pokemon , target : Pokemon , move : Move ) = > number ) {
super ( ) ;
this . powerMultiplierFunc = powerMultiplier ;
}
apply ( user : Pokemon , target : Pokemon , move : Move , args : any [ ] ) : boolean {
const power = args [ 0 ] as Utils . NumberHolder ;
power . value *= this . powerMultiplierFunc ( user , target , move ) ;
return true ;
}
}
2023-04-22 15:56:17 +01:00
export abstract class ConsecutiveUsePowerMultiplierAttr extends MovePowerMultiplierAttr {
constructor ( limit : integer , resetOnFail : boolean , resetOnLimit? : boolean ) {
super ( ( user : Pokemon , target : Pokemon , move : Move ) : number = > {
const moveHistory = user . getMoveHistory ( ) . reverse ( ) . slice ( 0 ) ;
let count = 0 ;
let turnMove : TurnMove ;
while ( ( turnMove = moveHistory . shift ( ) ) ? . move === move . id && ( ! resetOnFail || turnMove . result < MoveResult . NO_EFFECT ) ) {
if ( count < ( limit - 1 ) )
count ++ ;
else if ( resetOnLimit )
count = 0 ;
else
break ;
}
return this . getMultiplier ( count ) ;
} ) ;
}
abstract getMultiplier ( count : integer ) : number ;
}
export class ConsecutiveUseDoublePowerAttr extends ConsecutiveUsePowerMultiplierAttr {
getMultiplier ( count : number ) : number {
return Math . pow ( 2 , count ) ;
}
}
export class ConsecutiveUseMultiBasePowerAttr extends ConsecutiveUsePowerMultiplierAttr {
getMultiplier ( count : number ) : number {
return ( count + 1 ) ;
}
}
export class LevelPowerAttr extends VariablePowerAttr {
apply ( user : Pokemon , target : Pokemon , move : Move , args : any [ ] ) : boolean {
( args [ 0 ] as Utils . NumberHolder ) . value = Math . min ( user . level , 150 ) ;
return true ;
}
}
export class RandomLevelPowerAttr extends VariablePowerAttr {
apply ( user : Pokemon , target : Pokemon , move : Move , args : any [ ] ) : boolean {
( args [ 0 ] as Utils . NumberHolder ) . value = Math . min ( user . level , 150 ) * Utils . randInt ( 100 , 50 ) ;
return true ;
}
}
2023-04-21 06:17:43 +01:00
export class WeightPowerAttr extends VariablePowerAttr {
apply ( user : Pokemon , target : Pokemon , move : Move , args : any [ ] ) : boolean {
const power = args [ 0 ] as Utils . NumberHolder ;
const targetWeight = target . species . weight ;
const weightThresholds = [ 10 , 25 , 50 , 100 , 200 ] ;
let w = 0 ;
while ( targetWeight >= weightThresholds [ w ] ) {
if ( ++ w === weightThresholds . length )
break ;
}
power . value = ( w + 1 ) * 20 ;
return true ;
}
}
2023-04-22 15:56:17 +01:00
export class LowHpPowerAttr extends VariablePowerAttr {
apply ( user : Pokemon , target : Pokemon , move : Move , args : any [ ] ) : boolean {
const power = args [ 0 ] as Utils . NumberHolder ;
const hpRatio = user . getHpRatio ( ) ;
switch ( true ) {
case ( hpRatio < 0.6875 ) :
power . value = 40 ;
break ;
case ( hpRatio < 0.3542 ) :
power . value = 80 ;
break ;
case ( hpRatio < 0.2083 ) :
power . value = 100 ;
break ;
case ( hpRatio < 0.1042 ) :
power . value = 150 ;
break ;
case ( hpRatio < 0.0417 ) :
power . value = 200 ;
break ;
default :
power . value = 20 ;
break ;
}
return true ;
}
}
2023-04-22 00:30:04 +01:00
export class HpPowerAttr extends VariablePowerAttr {
apply ( user : Pokemon , target : Pokemon , move : Move , args : any [ ] ) : boolean {
( args [ 0 ] as Utils . NumberHolder ) . value = Math . max ( Math . floor ( 150 * user . getHpRatio ( ) ) , 1 ) ;
return true ;
}
}
2023-04-17 05:46:50 +01:00
export class SolarBeamPowerAttr extends VariablePowerAttr {
apply ( user : Pokemon , target : Pokemon , move : Move , args : any [ ] ) : boolean {
const power = args [ 0 ] as Utils . NumberHolder ;
const weatherType = user . scene . arena . weather ? . weatherType || WeatherType . NONE ;
switch ( weatherType ) {
case WeatherType . RAIN :
case WeatherType . SANDSTORM :
case WeatherType . HAIL :
case WeatherType . HEAVY_RAIN :
power . value *= 0.5 ;
return true ;
}
return false ;
}
}
export class VariableAccuracyAttr extends MoveAttr {
apply ( user : Pokemon , target : Pokemon , move : Move , args : any [ ] ) : boolean {
//const accuracy = args[0] as Utils.NumberHolder;
return false ;
}
}
export class ThunderAccuracyAttr extends VariableAccuracyAttr {
apply ( user : Pokemon , target : Pokemon , move : Move , args : any [ ] ) : boolean {
const accuracy = args [ 0 ] as Utils . NumberHolder ;
const weatherType = user . scene . arena . weather ? . weatherType || WeatherType . NONE ;
switch ( weatherType ) {
case WeatherType . SUNNY :
case WeatherType . SANDSTORM :
case WeatherType . HARSH_SUN :
accuracy . value = 50 ;
return true ;
case WeatherType . RAIN :
case WeatherType . HEAVY_RAIN :
accuracy . value = - 1 ;
return true ;
}
return false ;
}
}
export class BlizzardAccuracyAttr extends VariableAccuracyAttr {
apply ( user : Pokemon , target : Pokemon , move : Move , args : any [ ] ) : boolean {
const accuracy = args [ 0 ] as Utils . NumberHolder ;
const weatherType = user . scene . arena . weather ? . weatherType || WeatherType . NONE ;
if ( weatherType === WeatherType . HAIL ) {
accuracy . value = - 1 ;
2023-04-15 06:32:16 +01:00
return true ;
}
return false ;
2023-04-04 04:38:31 +01:00
}
}
2023-04-16 23:40:32 +01:00
export class ConditionalMoveAttr extends MoveAttr {
2023-04-15 22:40:18 +01:00
private successFunc : MoveAttrFunc ;
constructor ( successFunc : MoveAttrFunc ) {
super ( ) ;
this . successFunc = successFunc ;
}
2023-04-16 05:29:55 +01:00
apply ( user : Pokemon , target : Pokemon , move : Move , args : any [ ] ) : boolean {
if ( ! ( args [ 0 ] as Utils . BooleanHolder ) . value && ! this . successFunc ( user , target , move ) ) {
2023-04-15 22:40:18 +01:00
( args [ 0 ] as Utils . BooleanHolder ) . value = true ;
2023-04-15 06:32:16 +01:00
return true ;
}
2023-04-15 22:40:18 +01:00
2023-04-15 06:32:16 +01:00
return false ;
2023-04-04 04:38:31 +01:00
}
}
2023-04-18 17:30:47 +01:00
export class WaningConsecutiveUseConditionalMoveAttr extends ConditionalMoveAttr {
constructor ( ) {
super ( ( ( user : Pokemon , target : Pokemon , move : Move ) : boolean = > {
let timesUsed = 0 ;
const moveHistory = user . getLastXMoves ( - 1 ) ;
let turnMove : TurnMove ;
while ( moveHistory . length && ( turnMove = moveHistory . shift ( ) ) . move === move . id && turnMove . result === MoveResult . STATUS )
timesUsed ++ ;
if ( timesUsed )
return ! Utils . randInt ( Math . pow ( 2 , timesUsed ) ) ;
return true ;
} ) ) ;
}
}
2023-04-17 05:46:50 +01:00
export class WeatherConditionalMoveAttr extends ConditionalMoveAttr {
constructor ( weatherType : WeatherType ) {
super ( ( user : Pokemon , target : Pokemon , move : Move ) = > ! user . scene . arena . weather || ( user . scene . arena . weather . weatherType !== weatherType && ! user . scene . arena . weather . isImmutable ( ) ) ) ;
}
}
2023-04-11 04:15:06 +01:00
export class MissEffectAttr extends MoveAttr {
2023-04-10 21:17:25 +01:00
private missEffectFunc : MoveAttrFunc ;
constructor ( missEffectFunc : MoveAttrFunc ) {
super ( ) ;
this . missEffectFunc = missEffectFunc ;
}
2023-04-16 05:29:55 +01:00
apply ( user : Pokemon , target : Pokemon , move : Move , args : any [ ] ) : boolean {
this . missEffectFunc ( user , target , move ) ;
2023-04-10 21:17:25 +01:00
return true ;
}
}
2023-04-19 23:19:55 +01:00
export class DisableMoveAttr extends MoveEffectAttr {
constructor ( ) {
super ( false ) ;
}
apply ( user : Pokemon , target : Pokemon , move : Move , args : any [ ] ) : boolean {
if ( ! super . apply ( user , target , move , args ) )
return false ;
const moveQueue = target . getLastXMoves ( ) ;
let turnMove : TurnMove ;
while ( moveQueue . length ) {
turnMove = moveQueue . shift ( ) ;
if ( turnMove . virtual )
continue ;
const moveIndex = target . moveset . findIndex ( m = > m . moveId === turnMove . move ) ;
if ( moveIndex === - 1 )
return false ;
const disabledMove = target . moveset [ moveIndex ] ;
disabledMove . disableTurns = 4 ;
2023-04-22 00:30:04 +01:00
user . scene . queueMessage ( getPokemonMessage ( target , ` 's ${ disabledMove . getName ( ) } \ nwas disabled! ` ) ) ;
2023-04-19 23:19:55 +01:00
return true ;
}
return false ;
}
}
export class DisableMoveConditionalMoveAttr extends ConditionalMoveAttr {
constructor ( ) {
super ( ( user : Pokemon , target : Pokemon , move : Move ) = > {
const moveQueue = target . getLastXMoves ( ) ;
let turnMove : TurnMove ;
while ( moveQueue . length ) {
turnMove = moveQueue . shift ( ) ;
if ( turnMove . virtual )
continue ;
const move = target . moveset . find ( m = > m . moveId === turnMove . move ) ;
if ( ! move )
continue ;
return ! move . isDisabled ( ) ;
}
} ) ;
}
}
2023-04-15 06:32:16 +01:00
export class FrenzyAttr extends MoveEffectAttr {
constructor ( ) {
super ( true ) ;
}
2023-04-16 05:29:55 +01:00
canApply ( user : Pokemon , target : Pokemon , move : Move , args : any [ ] ) {
2023-04-15 06:32:16 +01:00
return ! ! ( this . selfTarget ? user.hp : target.hp ) ;
}
2023-04-16 05:29:55 +01:00
apply ( user : Pokemon , target : Pokemon , move : Move , args : any [ ] ) : boolean {
if ( ! super . apply ( user , target , move , args ) )
2023-04-15 06:32:16 +01:00
return false ;
2023-04-21 02:32:48 +01:00
if ( ! user . getMoveQueue ( ) . length ) {
2023-04-22 00:30:04 +01:00
if ( ! user . getTag ( BattlerTagType . FRENZY ) ) {
2023-04-15 06:32:16 +01:00
const turnCount = Utils . randInt ( 2 ) + 1 ;
2023-04-21 02:32:48 +01:00
new Array ( turnCount ) . fill ( null ) . map ( ( ) = > user . getMoveQueue ( ) . push ( { move : move.id , ignorePP : true } ) ) ;
2023-04-22 00:30:04 +01:00
user . addTag ( BattlerTagType . FRENZY , 1 ) ;
2023-04-15 06:32:16 +01:00
} else {
2023-04-22 00:30:04 +01:00
applyMoveAttrs ( AddBattlerTagAttr , user , target , move , args ) ;
user . lapseTag ( BattlerTagType . FRENZY ) ;
2023-04-15 06:32:16 +01:00
}
return true ;
}
return false ;
}
}
2023-04-17 05:46:50 +01:00
export const frenzyMissFunc = ( user : Pokemon , target : Pokemon , move : Move ) = > {
2023-04-21 02:32:48 +01:00
while ( user . getMoveQueue ( ) . length && user . getMoveQueue ( ) [ 0 ] . move === move . id )
user . getMoveQueue ( ) . shift ( ) ;
2023-04-22 00:30:04 +01:00
user . lapseTag ( BattlerTagType . FRENZY )
2023-04-15 06:32:16 +01:00
} ;
2023-04-22 00:30:04 +01:00
export class AddBattlerTagAttr extends MoveEffectAttr {
public tagType : BattlerTagType ;
2023-04-15 06:32:16 +01:00
public turnCount : integer ;
2023-04-22 00:30:04 +01:00
constructor ( tagType : BattlerTagType , selfTarget? : boolean , turnCount? : integer ) {
2023-04-15 06:32:16 +01:00
super ( selfTarget ) ;
this . tagType = tagType ;
this . turnCount = turnCount ;
}
2023-04-16 05:29:55 +01:00
apply ( user : Pokemon , target : Pokemon , move : Move , args : any [ ] ) : boolean {
if ( ! super . apply ( user , target , move , args ) )
2023-04-15 06:32:16 +01:00
return false ;
if ( move . chance < 0 || move . chance === 100 || Utils . randInt ( 100 ) < move . chance ) {
2023-04-23 03:14:53 +01:00
( this . selfTarget ? user : target ) . addTag ( this . tagType , this . turnCount , user . id , move . id ) ;
2023-04-15 06:32:16 +01:00
return true ;
}
return false ;
}
}
2023-04-22 20:01:48 +01:00
export class LapseBattlerTagAttr extends MoveEffectAttr {
public tagTypes : BattlerTagType [ ] ;
constructor ( tagTypes : BattlerTagType [ ] , selfTarget? : boolean ) {
super ( selfTarget ) ;
this . tagTypes = tagTypes ;
}
apply ( user : Pokemon , target : Pokemon , move : Move , args : any [ ] ) : boolean {
if ( ! super . apply ( user , target , move , args ) )
return false ;
for ( let tagType of this . tagTypes )
( this . selfTarget ? user : target ) . lapseTag ( tagType ) ;
return true ;
}
}
2023-04-22 00:30:04 +01:00
export class FlinchAttr extends AddBattlerTagAttr {
2023-04-15 22:40:18 +01:00
constructor ( ) {
2023-04-22 00:30:04 +01:00
super ( BattlerTagType . FLINCHED , false ) ;
2023-04-15 22:40:18 +01:00
}
}
2023-04-22 00:30:04 +01:00
export class ConfuseAttr extends AddBattlerTagAttr {
2023-04-15 06:32:16 +01:00
constructor ( selfTarget? : boolean ) {
2023-04-22 00:30:04 +01:00
super ( BattlerTagType . CONFUSED , selfTarget , Utils . randInt ( 4 , 1 ) ) ;
2023-04-19 21:52:14 +01:00
}
}
2023-04-22 20:01:48 +01:00
export class TrapAttr extends AddBattlerTagAttr {
constructor ( tagType : BattlerTagType ) {
super ( tagType , false , Utils . randInt ( 2 , 5 ) ) ;
}
}
2023-04-19 21:52:14 +01:00
export class NoTagOverlapConditionalAttr extends ConditionalMoveAttr {
2023-04-22 00:30:04 +01:00
constructor ( tagType : BattlerTagType , selfTarget? : boolean ) {
2023-04-19 21:52:14 +01:00
super ( ( user : Pokemon , target : Pokemon , move : Move ) = > ! ( selfTarget ? user : target ) . getTag ( tagType ) ) ;
2023-04-15 06:32:16 +01:00
}
}
2023-04-13 17:16:36 +01:00
export class HitsTagAttr extends MoveAttr {
2023-04-22 00:30:04 +01:00
public tagType : BattlerTagType ;
2023-04-13 17:16:36 +01:00
public doubleDamage : boolean ;
2023-04-22 00:30:04 +01:00
constructor ( tagType : BattlerTagType , doubleDamage? : boolean ) {
2023-04-13 17:16:36 +01:00
super ( ) ;
this . tagType = tagType ;
this . doubleDamage = ! ! doubleDamage ;
2023-04-04 04:38:31 +01:00
}
}
2023-04-22 00:30:04 +01:00
export class AddArenaTagAttr extends MoveEffectAttr {
public tagType : ArenaTagType ;
public turnCount : integer ;
constructor ( tagType : ArenaTagType , turnCount? : integer ) {
super ( true ) ;
this . tagType = tagType ;
this . turnCount = turnCount ;
}
apply ( user : Pokemon , target : Pokemon , move : Move , args : any [ ] ) : boolean {
if ( ! super . apply ( user , target , move , args ) )
return false ;
if ( move . chance < 0 || move . chance === 100 || Utils . randInt ( 100 ) < move . chance ) {
user . scene . arena . addTag ( this . tagType , this . turnCount ) ;
return true ;
2023-04-13 17:16:36 +01:00
}
2023-04-22 00:30:04 +01:00
return false ;
}
}
export class CopyTypeAttr extends MoveEffectAttr {
constructor ( ) {
super ( true ) ;
}
apply ( user : Pokemon , target : Pokemon , move : Move , args : any [ ] ) : boolean {
if ( ! super . apply ( user , target , move , args ) )
return false ;
user . summonData . types = target . getTypes ( ) ;
user . scene . queueMessage ( getPokemonMessage ( user , ` 's type \ nchanged to match ${ target . name } 's! ` ) ) ;
return true ;
}
}
export class CopyBiomeTypeAttr extends MoveEffectAttr {
constructor ( ) {
super ( true ) ;
}
apply ( user : Pokemon , target : Pokemon , move : Move , args : any [ ] ) : boolean {
if ( ! super . apply ( user , target , move , args ) )
return false ;
const biomeType = user . scene . arena . getTypeForBiome ( ) ;
user . summonData . types = [ biomeType ] ;
user . scene . queueMessage ( getPokemonMessage ( user , ` transformed \ ninto the ${ Type [ biomeType ] . toUpperCase ( ) } type! ` ) ) ;
return true ;
}
2023-04-13 17:16:36 +01:00
}
2023-04-17 05:46:50 +01:00
export class RandomMovesetMoveAttr extends OverrideMoveEffectAttr {
2023-04-16 23:40:32 +01:00
apply ( user : Pokemon , target : Pokemon , move : Move , args : any [ ] ) : boolean {
const moves = user . moveset . filter ( m = > m . moveId !== move . id ) ;
if ( moves . length ) {
const move = moves [ Utils . randInt ( moves . length ) ] ;
const moveIndex = user . moveset . findIndex ( m = > m . moveId === move . moveId ) ;
2023-04-21 02:32:48 +01:00
user . getMoveQueue ( ) . push ( { move : move.moveId } ) ;
2023-04-16 23:40:32 +01:00
user . scene . unshiftPhase ( user . isPlayer ( ) ? new PlayerMovePhase ( user . scene , user as PlayerPokemon , user . moveset [ moveIndex ] , true ) : new EnemyMovePhase ( user . scene , user as EnemyPokemon , user . moveset [ moveIndex ] , true ) ) ;
return true ;
}
return false ;
}
}
2023-04-17 05:46:50 +01:00
export class RandomMoveAttr extends OverrideMoveEffectAttr {
2023-04-16 05:29:55 +01:00
apply ( user : Pokemon , target : Pokemon , move : Move , args : any [ ] ) : Promise < boolean > {
2023-04-14 04:04:51 +01:00
return new Promise ( resolve = > {
2023-04-21 02:32:48 +01:00
const moveIds = Utils . getEnumValues ( Moves ) . filter ( m = > m && m !== move . id ) ;
2023-04-14 04:04:51 +01:00
const moveId = moveIds [ Utils . randInt ( moveIds . length ) ] ;
2023-04-21 02:32:48 +01:00
user . getMoveQueue ( ) . push ( { move : moveId , ignorePP : true } ) ;
2023-04-22 00:30:04 +01:00
user . scene . unshiftPhase ( user . isPlayer ( )
? new PlayerMovePhase ( user . scene , user as PlayerPokemon , new PokemonMove ( moveId , 0 , 0 , true ) , true )
: new EnemyMovePhase ( user . scene , user as EnemyPokemon , new PokemonMove ( moveId , 0 , 0 , true ) , true ) ) ;
2023-04-14 04:04:51 +01:00
initMoveAnim ( moveId ) . then ( ( ) = > {
2023-04-16 05:29:55 +01:00
loadMoveAnimAssets ( user . scene , [ moveId ] , true )
2023-04-14 04:04:51 +01:00
. then ( ( ) = > resolve ( true ) ) ;
} ) ;
} ) ;
}
}
2023-04-22 00:30:04 +01:00
const targetMoveCopiableCondition = ( user : Pokemon , target : Pokemon , move : Move ) = > {
const targetMoves = target . getMoveHistory ( ) . filter ( m = > ! m . virtual ) ;
if ( ! targetMoves . length )
return false ;
const copiableMove = targetMoves [ 0 ] ;
if ( ! copiableMove . move )
return false ;
if ( allMoves [ copiableMove . move ] . getAttrs ( ChargeAttr ) && copiableMove . result === MoveResult . OTHER )
return false ;
// TODO: Add last turn of Bide
return true ;
} ;
export class CopyMoveAttr extends OverrideMoveEffectAttr {
apply ( user : Pokemon , target : Pokemon , move : Move , args : any [ ] ) : boolean {
const targetMoves = target . getMoveHistory ( ) . filter ( m = > ! m . virtual ) ;
if ( ! targetMoves . length )
return false ;
const copiedMove = targetMoves [ 0 ] ;
user . getMoveQueue ( ) . push ( { move : copiedMove.move , ignorePP : true } ) ;
user . scene . unshiftPhase ( user . isPlayer ( )
? new PlayerMovePhase ( user . scene , user as PlayerPokemon , new PokemonMove ( copiedMove . move , 0 , 0 , true ) , true )
: new EnemyMovePhase ( user . scene , user as EnemyPokemon , new PokemonMove ( copiedMove . move , 0 , 0 , true ) , true ) ) ;
return true ;
}
}
const targetMoveSketchableCondition = ( user : Pokemon , target : Pokemon , move : Move ) = > {
if ( ! targetMoveCopiableCondition ( user , target , move ) )
return false ;
const targetMoves = target . getMoveHistory ( ) . filter ( m = > ! m . virtual ) ;
if ( ! targetMoves . length )
return false ;
const sketchableMove = targetMoves [ 0 ] ;
if ( user . moveset . find ( m = > m . moveId === sketchableMove . move ) )
return false ;
return true ;
} ;
export class SketchAttr extends MoveEffectAttr {
constructor ( ) {
super ( true ) ;
}
apply ( user : Pokemon , target : Pokemon , move : Move , args : any [ ] ) : boolean {
if ( ! super . apply ( user , target , move , args ) )
return false ;
const targetMoves = target . getMoveHistory ( ) . filter ( m = > ! m . virtual ) ;
if ( ! targetMoves . length )
return false ;
const sketchedMove = allMoves [ targetMoves [ 0 ] . move ] ;
const sketchIndex = user . moveset . findIndex ( m = > m . moveId === move . id ) ;
if ( sketchIndex === - 1 )
return false ;
user . moveset [ sketchIndex ] = new PokemonMove ( sketchedMove . id , 0 , 0 ) ;
user . scene . queueMessage ( getPokemonMessage ( user , ` sketched \ n ${ sketchedMove . name } ! ` ) ) ;
return true ;
}
}
export function applyMoveAttrs ( attrType : { new ( . . . args : any [ ] ) : MoveAttr } , user : Pokemon , target : Pokemon , move : Move , . . . args : any [ ] ) : Promise < void > {
return new Promise ( resolve = > {
const attrPromises : Promise < boolean > [ ] = [ ] ;
const moveAttrs = move . attrs . filter ( a = > a instanceof attrType ) ;
for ( let attr of moveAttrs ) {
const result = attr . apply ( user , target , move , args ) ;
if ( result instanceof Promise < boolean > )
attrPromises . push ( result ) ;
}
Promise . allSettled ( attrPromises ) . then ( ( ) = > resolve ( ) ) ;
} ) ;
}
2023-03-28 19:54:52 +01:00
export const allMoves = [
2023-04-21 02:32:48 +01:00
new StatusMove ( Moves . NONE , "-" , Type . NORMAL , MoveCategory . STATUS , - 1 , - 1 , "" , - 1 , 0 , 1 ) ,
2023-04-16 02:51:08 +01:00
new AttackMove ( Moves . POUND , "Pound" , Type . NORMAL , MoveCategory . PHYSICAL , 40 , 100 , 35 , - 1 , "" , - 1 , 0 , 1 ) ,
new AttackMove ( Moves . KARATE_CHOP , "Karate Chop" , Type . FIGHTING , MoveCategory . PHYSICAL , 50 , 100 , 25 , - 1 , "High critical hit ratio." , - 1 , 0 , 1 , new HighCritAttr ( ) ) ,
new AttackMove ( Moves . DOUBLE_SLAP , "Double Slap" , Type . NORMAL , MoveCategory . PHYSICAL , 15 , 85 , 10 , - 1 , "Hits 2-5 times in one turn." , - 1 , 0 , 1 , new MultiHitAttr ( ) ) ,
new AttackMove ( Moves . COMET_PUNCH , "Comet Punch" , Type . NORMAL , MoveCategory . PHYSICAL , 18 , 85 , 15 , - 1 , "Hits 2-5 times in one turn." , - 1 , 0 , 1 , new MultiHitAttr ( ) ) ,
new AttackMove ( Moves . MEGA_PUNCH , "Mega Punch" , Type . NORMAL , MoveCategory . PHYSICAL , 80 , 85 , 20 , - 1 , "" , - 1 , 0 , 1 ) ,
2023-04-22 06:09:35 +01:00
new AttackMove ( Moves . PAY_DAY , "Pay Day (N)" , Type . NORMAL , MoveCategory . PHYSICAL , 40 , 100 , 20 , - 1 , "Money is earned after the battle." , - 1 , 0 , 1 ) ,
2023-04-16 02:51:08 +01:00
new AttackMove ( Moves . FIRE_PUNCH , "Fire Punch" , Type . FIRE , MoveCategory . PHYSICAL , 75 , 100 , 15 , 67 , "May burn opponent." , 10 , 0 , 1 , new StatusEffectAttr ( StatusEffect . BURN ) ) ,
new AttackMove ( Moves . ICE_PUNCH , "Ice Punch" , Type . ICE , MoveCategory . PHYSICAL , 75 , 100 , 15 , 69 , "May freeze opponent." , 10 , 0 , 1 , new StatusEffectAttr ( StatusEffect . FREEZE ) ) ,
new AttackMove ( Moves . THUNDER_PUNCH , "Thunder Punch" , Type . ELECTRIC , MoveCategory . PHYSICAL , 75 , 100 , 15 , 68 , "May paralyze opponent." , 10 , 0 , 1 , new StatusEffectAttr ( StatusEffect . PARALYSIS ) ) ,
new AttackMove ( Moves . SCRATCH , "Scratch" , Type . NORMAL , MoveCategory . PHYSICAL , 40 , 100 , 35 , - 1 , "" , - 1 , 0 , 1 ) ,
new AttackMove ( Moves . VISE_GRIP , "Vise Grip" , Type . NORMAL , MoveCategory . PHYSICAL , 55 , 100 , 30 , - 1 , "" , - 1 , 0 , 1 ) ,
new AttackMove ( Moves . GUILLOTINE , "Guillotine" , Type . NORMAL , MoveCategory . PHYSICAL , - 1 , 30 , 5 , - 1 , "One-Hit-KO, if it hits." , - 1 , 0 , 1 , new OneHitKOAttr ( ) ) ,
new AttackMove ( Moves . RAZOR_WIND , "Razor Wind" , Type . NORMAL , MoveCategory . SPECIAL , 80 , 100 , 10 , - 1 , "Charges on first turn, attacks on second. High critical hit ratio." , - 1 , 0 , 1 ,
2023-04-13 17:16:36 +01:00
new ChargeAttr ( ChargeAnim . RAZOR_WIND_CHARGING , 'whipped\nup a whirlwind!' ) , new HighCritAttr ( ) ) ,
2023-04-18 17:30:47 +01:00
new SelfStatusMove ( Moves . SWORDS_DANCE , "Swords Dance" , Type . NORMAL , - 1 , 20 , 88 , "Sharply raises user's Attack." , - 1 , 0 , 1 , new StatChangeAttr ( BattleStat . ATK , 2 , true ) ) ,
2023-04-16 02:51:08 +01:00
new AttackMove ( Moves . CUT , "Cut" , Type . NORMAL , MoveCategory . PHYSICAL , 50 , 95 , 30 , - 1 , "" , - 1 , 0 , 1 ) ,
new AttackMove ( Moves . GUST , "Gust" , Type . FLYING , MoveCategory . SPECIAL , 40 , 100 , 35 , - 1 , "Hits Pokémon using Fly/Bounce/Sky Drop with double power." , - 1 , 0 , 1 ,
2023-04-22 00:30:04 +01:00
new HitsTagAttr ( BattlerTagType . FLYING , true ) ) ,
2023-04-16 02:51:08 +01:00
new AttackMove ( Moves . WING_ATTACK , "Wing Attack" , Type . FLYING , MoveCategory . PHYSICAL , 60 , 100 , 35 , - 1 , "" , - 1 , 0 , 1 ) ,
2023-04-22 06:09:35 +01:00
new StatusMove ( Moves . WHIRLWIND , "Whirlwind (N)" , Type . NORMAL , - 1 , 20 , - 1 , "In battles, the opponent switches. In the wild, the Pokémon runs." , - 1 , - 6 , 1 ) , // TODO
2023-04-16 02:51:08 +01:00
new AttackMove ( Moves . FLY , "Fly" , Type . FLYING , MoveCategory . PHYSICAL , 90 , 95 , 15 , 97 , "Flies up on first turn, attacks on second turn." , - 1 , 0 , 1 ,
2023-04-22 00:30:04 +01:00
new ChargeAttr ( ChargeAnim . FLY_CHARGING , 'flew\nup high!' , BattlerTagType . FLYING ) ) ,
2023-04-22 20:01:48 +01:00
new AttackMove ( Moves . BIND , "Bind" , Type . NORMAL , MoveCategory . PHYSICAL , 15 , 85 , 20 , - 1 , "Traps opponent, damaging them for 4-5 turns." , 100 , 0 , 1 , new TrapAttr ( BattlerTagType . BIND ) ) ,
2023-04-16 02:51:08 +01:00
new AttackMove ( Moves . SLAM , "Slam" , Type . NORMAL , MoveCategory . PHYSICAL , 80 , 75 , 20 , - 1 , "" , - 1 , 0 , 1 ) ,
new AttackMove ( Moves . VINE_WHIP , "Vine Whip" , Type . GRASS , MoveCategory . PHYSICAL , 45 , 100 , 25 , - 1 , "" , - 1 , 0 , 1 ) ,
new AttackMove ( Moves . STOMP , "Stomp" , Type . NORMAL , MoveCategory . PHYSICAL , 65 , 100 , 20 , - 1 , "May cause flinching." , 30 , 0 , 1 , new FlinchAttr ( ) ) ,
new AttackMove ( Moves . DOUBLE_KICK , "Double Kick" , Type . FIGHTING , MoveCategory . PHYSICAL , 30 , 100 , 30 , - 1 , "Hits twice in one turn." , - 1 , 0 , 1 , new MultiHitAttr ( MultiHitType . _2 ) ) ,
new AttackMove ( Moves . MEGA_KICK , "Mega Kick" , Type . NORMAL , MoveCategory . PHYSICAL , 120 , 75 , 5 , - 1 , "" , - 1 , 0 , 1 ) ,
2023-04-22 06:09:35 +01:00
new AttackMove ( Moves . JUMP_KICK , "Jump Kick" , Type . FIGHTING , MoveCategory . PHYSICAL , 100 , 95 , 10 , - 1 , "If it misses, the user loses half their HP." , - 1 , 0 , 1 ,
new MissEffectAttr ( ( user : Pokemon , target : Pokemon , move : Move ) = > { user . damage ( Math . floor ( user . getMaxHp ( ) / 2 ) ) ; return true ; } ) ) ,
2023-04-16 02:51:08 +01:00
new AttackMove ( Moves . ROLLING_KICK , "Rolling Kick" , Type . FIGHTING , MoveCategory . PHYSICAL , 60 , 85 , 15 , - 1 , "May cause flinching." , 30 , 0 , 1 , new FlinchAttr ( ) ) ,
new StatusMove ( Moves . SAND_ATTACK , "Sand Attack" , Type . GROUND , 100 , 15 , - 1 , "Lowers opponent's Accuracy." , - 1 , 0 , 1 , new StatChangeAttr ( BattleStat . ACC , - 1 ) ) ,
new AttackMove ( Moves . HEADBUTT , "Headbutt" , Type . NORMAL , MoveCategory . PHYSICAL , 70 , 100 , 15 , - 1 , "May cause flinching." , 30 , 0 , 1 , new FlinchAttr ( ) ) ,
new AttackMove ( Moves . HORN_ATTACK , "Horn Attack" , Type . NORMAL , MoveCategory . PHYSICAL , 65 , 100 , 25 , - 1 , "" , - 1 , 0 , 1 ) ,
new AttackMove ( Moves . FURY_ATTACK , "Fury Attack" , Type . NORMAL , MoveCategory . PHYSICAL , 15 , 85 , 20 , - 1 , "Hits 2-5 times in one turn." , - 1 , 0 , 1 , new MultiHitAttr ( ) ) ,
new AttackMove ( Moves . HORN_DRILL , "Horn Drill" , Type . NORMAL , MoveCategory . PHYSICAL , - 1 , 30 , 5 , - 1 , "One-Hit-KO, if it hits." , - 1 , 0 , 1 , new OneHitKOAttr ( ) ) ,
new AttackMove ( Moves . TACKLE , "Tackle" , Type . NORMAL , MoveCategory . PHYSICAL , 40 , 100 , 35 , - 1 , "" , - 1 , 0 , 1 ) ,
new AttackMove ( Moves . BODY_SLAM , "Body Slam" , Type . NORMAL , MoveCategory . PHYSICAL , 85 , 100 , 15 , 66 , "May paralyze opponent." , 30 , 0 , 1 , new StatusEffectAttr ( StatusEffect . PARALYSIS ) ) ,
2023-04-22 20:01:48 +01:00
new AttackMove ( Moves . WRAP , "Wrap" , Type . NORMAL , MoveCategory . PHYSICAL , 15 , 90 , 20 , - 1 , "Traps opponent, damaging them for 4-5 turns." , 100 , 0 , 1 , new TrapAttr ( BattlerTagType . WRAP ) ) ,
2023-04-18 18:36:11 +01:00
new AttackMove ( Moves . TAKE_DOWN , "Take Down" , Type . NORMAL , MoveCategory . PHYSICAL , 90 , 85 , 20 , 1 , "User receives recoil damage." , - 1 , 0 , 1 , new RecoilAttr ( ) ) ,
2023-04-16 02:51:08 +01:00
new AttackMove ( Moves . THRASH , "Thrash" , Type . NORMAL , MoveCategory . PHYSICAL , 120 , 100 , 10 , - 1 , "User attacks for 2-3 turns but then becomes confused." , - 1 , 0 , 1 ,
2023-04-15 06:32:16 +01:00
new FrenzyAttr ( ) , frenzyMissFunc , new ConfuseAttr ( true ) ) , // TODO: Update to still confuse if last hit misses
2023-04-18 18:36:11 +01:00
new AttackMove ( Moves . DOUBLE_EDGE , "Double-Edge" , Type . NORMAL , MoveCategory . PHYSICAL , 120 , 100 , 15 , - 1 , "User receives recoil damage." , - 1 , 0 , 1 , new RecoilAttr ( ) ) ,
2023-04-16 02:51:08 +01:00
new StatusMove ( Moves . TAIL_WHIP , "Tail Whip" , Type . NORMAL , 100 , 30 , - 1 , "Lowers opponent's Defense." , - 1 , 0 , 1 , new StatChangeAttr ( BattleStat . DEF , - 1 ) ) ,
new AttackMove ( Moves . POISON_STING , "Poison Sting" , Type . POISON , MoveCategory . PHYSICAL , 15 , 100 , 35 , - 1 , "May poison the opponent." , 30 , 0 , 1 , new StatusEffectAttr ( StatusEffect . POISON ) ) ,
new AttackMove ( Moves . TWINEEDLE , "Twineedle" , Type . BUG , MoveCategory . PHYSICAL , 25 , 100 , 20 , - 1 , "Hits twice in one turn. May poison opponent." , 20 , 0 , 1 , new MultiHitAttr ( MultiHitType . _2 ) , new StatusEffectAttr ( StatusEffect . POISON ) ) ,
2023-04-15 22:40:18 +01:00
new AttackMove ( Moves . PIN_MISSILE , "Pin Missile" , Type . BUG , MoveCategory . PHYSICAL , 25 , 95 , 20 , - 1 , "Hits 2-5 times in one turn." , - 1 , 1 , 0 , new MultiHitAttr ( ) ) ,
2023-04-16 02:51:08 +01:00
new StatusMove ( Moves . LEER , "Leer" , Type . NORMAL , 100 , 30 , - 1 , "Lowers opponent's Defense." , 100 , 0 , 1 , new StatChangeAttr ( BattleStat . DEF , - 1 ) ) ,
new AttackMove ( Moves . BITE , "Bite" , Type . DARK , MoveCategory . PHYSICAL , 60 , 100 , 25 , - 1 , "May cause flinching." , 30 , 0 , 1 , new FlinchAttr ( ) ) ,
new StatusMove ( Moves . GROWL , "Growl" , Type . NORMAL , 100 , 40 , - 1 , "Lowers opponent's Attack." , - 1 , 0 , 1 , new StatChangeAttr ( BattleStat . ATK , - 1 ) ) ,
2023-04-22 06:09:35 +01:00
new StatusMove ( Moves . ROAR , "Roar (N)" , Type . NORMAL , - 1 , 20 , - 1 , "In battles, the opponent switches. In the wild, the Pokémon runs." , - 1 , - 6 , 1 ) ,
2023-04-16 02:51:08 +01:00
new StatusMove ( Moves . SING , "Sing" , Type . NORMAL , 55 , 15 , - 1 , "Puts opponent to sleep." , - 1 , 0 , 1 , new StatusEffectAttr ( StatusEffect . SLEEP ) ) ,
new StatusMove ( Moves . SUPERSONIC , "Supersonic" , Type . NORMAL , 55 , 20 , - 1 , "Confuses opponent." , - 1 , 0 , 1 , new ConfuseAttr ( ) ) ,
new AttackMove ( Moves . SONIC_BOOM , "Sonic Boom" , Type . NORMAL , MoveCategory . SPECIAL , - 1 , 90 , 20 , - 1 , "Always inflicts 20 HP." , - 1 , 0 , 1 , new FixedDamageAttr ( 20 ) ) ,
2023-04-19 23:19:55 +01:00
new StatusMove ( Moves . DISABLE , "Disable" , Type . NORMAL , 100 , 20 , - 1 , "Opponent can't use its last attack for a few turns." , - 1 , 0 , 1 , new DisableMoveConditionalMoveAttr ( ) , new DisableMoveAttr ( ) ) ,
2023-04-16 02:51:08 +01:00
new AttackMove ( Moves . ACID , "Acid" , Type . POISON , MoveCategory . SPECIAL , 40 , 100 , 30 , - 1 , "May lower opponent's Special Defense." , 10 , 0 , 1 , new StatChangeAttr ( BattleStat . SPDEF , - 1 ) ) ,
new AttackMove ( Moves . EMBER , "Ember" , Type . FIRE , MoveCategory . SPECIAL , 40 , 100 , 25 , - 1 , "May burn opponent." , 10 , 0 , 1 , new StatusEffectAttr ( StatusEffect . BURN ) ) ,
new AttackMove ( Moves . FLAMETHROWER , "Flamethrower" , Type . FIRE , MoveCategory . SPECIAL , 90 , 100 , 15 , 125 , "May burn opponent." , 10 , 0 , 1 , new StatusEffectAttr ( StatusEffect . BURN ) ) ,
2023-04-22 06:09:35 +01:00
new SelfStatusMove ( Moves . MIST , "Mist (N)" , Type . ICE , - 1 , 30 , - 1 , "User's stats cannot be changed for a period of time." , - 1 , 0 , 1 ) ,
2023-04-16 02:51:08 +01:00
new AttackMove ( Moves . WATER_GUN , "Water Gun" , Type . WATER , MoveCategory . SPECIAL , 40 , 100 , 25 , - 1 , "" , - 1 , 0 , 1 ) ,
new AttackMove ( Moves . HYDRO_PUMP , "Hydro Pump" , Type . WATER , MoveCategory . SPECIAL , 110 , 80 , 5 , 142 , "" , - 1 , 0 , 1 ) ,
2023-04-22 06:09:35 +01:00
new AttackMove ( Moves . SURF , "Surf" , Type . WATER , MoveCategory . SPECIAL , 90 , 100 , 15 , 123 , "Hits all adjacent Pokémon." , - 1 , 0 , 1 ) , // TODO
2023-04-16 02:51:08 +01:00
new AttackMove ( Moves . ICE_BEAM , "Ice Beam" , Type . ICE , MoveCategory . SPECIAL , 90 , 100 , 10 , 135 , "May freeze opponent." , 10 , 0 , 1 , new StatusEffectAttr ( StatusEffect . FREEZE ) ) ,
2023-04-17 05:46:50 +01:00
new AttackMove ( Moves . BLIZZARD , "Blizzard" , Type . ICE , MoveCategory . SPECIAL , 110 , 70 , 5 , 143 , "May freeze opponent." , 10 , 0 , 1 , new BlizzardAccuracyAttr ( ) , new StatusEffectAttr ( StatusEffect . FREEZE ) ) , // TODO: 30% chance to hit protect/detect in hail
2023-04-16 02:51:08 +01:00
new AttackMove ( Moves . PSYBEAM , "Psybeam" , Type . PSYCHIC , MoveCategory . SPECIAL , 65 , 100 , 20 , 16 , "May confuse opponent." , 10 , 0 , 1 , new ConfuseAttr ( ) ) ,
new AttackMove ( Moves . BUBBLE_BEAM , "Bubble Beam" , Type . WATER , MoveCategory . SPECIAL , 65 , 100 , 20 , - 1 , "May lower opponent's Speed." , 10 , 0 , 1 , new StatChangeAttr ( BattleStat . SPD , - 1 ) ) ,
new AttackMove ( Moves . AURORA_BEAM , "Aurora Beam" , Type . ICE , MoveCategory . SPECIAL , 65 , 100 , 20 , - 1 , "May lower opponent's Attack." , 10 , 0 , 1 , new StatChangeAttr ( BattleStat . ATK , - 1 ) ) ,
2023-04-22 00:30:04 +01:00
new AttackMove ( Moves . HYPER_BEAM , "Hyper Beam" , Type . NORMAL , MoveCategory . SPECIAL , 150 , 90 , 5 , 163 , "User must recharge next turn." , - 1 , 0 , 1 , new AddBattlerTagAttr ( BattlerTagType . RECHARGING , true ) ) ,
2023-04-16 02:51:08 +01:00
new AttackMove ( Moves . PECK , "Peck" , Type . FLYING , MoveCategory . PHYSICAL , 35 , 100 , 35 , - 1 , "" , - 1 , 0 , 1 ) ,
new AttackMove ( Moves . DRILL_PECK , "Drill Peck" , Type . FLYING , MoveCategory . PHYSICAL , 80 , 100 , 20 , - 1 , "" , - 1 , 0 , 1 ) ,
2023-04-18 18:36:11 +01:00
new AttackMove ( Moves . SUBMISSION , "Submission" , Type . FIGHTING , MoveCategory . PHYSICAL , 80 , 80 , 20 , - 1 , "User receives recoil damage." , - 1 , 0 , 1 , new RecoilAttr ( ) ) ,
2023-04-21 06:17:43 +01:00
new AttackMove ( Moves . LOW_KICK , "Low Kick" , Type . FIGHTING , MoveCategory . PHYSICAL , - 1 , 100 , 20 , 12 , "The heavier the opponent, the stronger the attack." , - 1 , 0 , 1 , new WeightPowerAttr ( ) ) ,
2023-04-22 06:09:35 +01:00
new AttackMove ( Moves . COUNTER , "Counter (N)" , Type . FIGHTING , MoveCategory . PHYSICAL , - 1 , 100 , 20 , - 1 , "When hit by a Physical Attack, user strikes back with 2x power." , - 1 , - 5 , 1 ) ,
2023-04-22 15:56:17 +01:00
new AttackMove ( Moves . SEISMIC_TOSS , "Seismic Toss" , Type . FIGHTING , MoveCategory . PHYSICAL , - 1 , 100 , 20 , - 1 , "Inflicts damage equal to user's level (maximum 150)." , - 1 , 0 , 1 , new LevelPowerAttr ( ) ) ,
2023-04-16 02:51:08 +01:00
new AttackMove ( Moves . STRENGTH , "Strength" , Type . NORMAL , MoveCategory . PHYSICAL , 80 , 100 , 15 , - 1 , "" , - 1 , 0 , 1 ) ,
2023-04-16 05:29:55 +01:00
new AttackMove ( Moves . ABSORB , "Absorb" , Type . GRASS , MoveCategory . SPECIAL , 20 , 100 , 25 , - 1 , "User recovers half the HP inflicted on opponent." , - 1 , 0 , 1 , new HitHealAttr ( ) ) ,
new AttackMove ( Moves . MEGA_DRAIN , "Mega Drain" , Type . GRASS , MoveCategory . SPECIAL , 40 , 100 , 15 , - 1 , "User recovers half the HP inflicted on opponent." , - 1 , 0 , 1 , new HitHealAttr ( ) ) ,
2023-04-18 17:30:47 +01:00
new StatusMove ( Moves . LEECH_SEED , "Leech Seed" , Type . GRASS , 90 , 10 , - 1 , "Drains HP from opponent each turn." , - 1 , 0 , 1 ,
2023-04-23 03:14:53 +01:00
new ConditionalMoveAttr ( ( user : Pokemon , target : Pokemon , move : Move ) = > ! target . getTag ( BattlerTagType . SEEDED ) && ! target . isOfType ( Type . GRASS ) ) , new AddBattlerTagAttr ( BattlerTagType . SEEDED ) ) ,
2023-04-18 17:30:47 +01:00
new SelfStatusMove ( Moves . GROWTH , "Growth" , Type . NORMAL , - 1 , 20 , - 1 , "Raises user's Attack and Special Attack." , - 1 , 0 , 1 , new GrowthStatChangeAttr ( ) ) ,
2023-04-16 05:29:55 +01:00
new AttackMove ( Moves . RAZOR_LEAF , "Razor Leaf" , Type . GRASS , MoveCategory . PHYSICAL , 55 , 95 , 25 , - 1 , "High critical hit ratio." , - 1 , 0 , 1 , new HighCritAttr ( ) ) ,
2023-04-16 02:51:08 +01:00
new AttackMove ( Moves . SOLAR_BEAM , "Solar Beam" , Type . GRASS , MoveCategory . SPECIAL , 120 , 100 , 10 , 168 , "Charges on first turn, attacks on second." , - 1 , 0 , 1 ,
2023-04-17 05:46:50 +01:00
new SolarBeamChargeAttr ( ) , new SolarBeamPowerAttr ( ) ) ,
2023-04-16 02:51:08 +01:00
new StatusMove ( Moves . POISON_POWDER , "Poison Powder" , Type . POISON , 75 , 35 , - 1 , "Poisons opponent." , - 1 , 0 , 1 , new StatusEffectAttr ( StatusEffect . POISON ) ) ,
new StatusMove ( Moves . STUN_SPORE , "Stun Spore" , Type . GRASS , 75 , 30 , - 1 , "Paralyzes opponent." , - 1 , 0 , 1 , new StatusEffectAttr ( StatusEffect . PARALYSIS ) ) ,
new StatusMove ( Moves . SLEEP_POWDER , "Sleep Powder" , Type . GRASS , 75 , 15 , - 1 , "Puts opponent to sleep." , - 1 , 0 , 1 , new StatusEffectAttr ( StatusEffect . SLEEP ) ) ,
new AttackMove ( Moves . PETAL_DANCE , "Petal Dance" , Type . GRASS , MoveCategory . SPECIAL , 120 , 100 , 10 , - 1 , "User attacks for 2-3 turns but then becomes confused." , - 1 , 0 , 1 ,
2023-04-15 06:32:16 +01:00
new FrenzyAttr ( ) , frenzyMissFunc , new ConfuseAttr ( true ) ) , // TODO: Update to still confuse if last hit misses
2023-04-16 02:51:08 +01:00
new StatusMove ( Moves . STRING_SHOT , "String Shot" , Type . BUG , 95 , 40 , - 1 , "Sharply lowers opponent's Speed." , - 1 , 0 , 1 , new StatChangeAttr ( BattleStat . SPD , - 2 ) ) ,
new AttackMove ( Moves . DRAGON_RAGE , "Dragon Rage" , Type . DRAGON , MoveCategory . SPECIAL , - 1 , 100 , 10 , - 1 , "Always inflicts 40 HP." , - 1 , 0 , 1 , new FixedDamageAttr ( 40 ) ) ,
2023-04-22 20:01:48 +01:00
new AttackMove ( Moves . FIRE_SPIN , "Fire Spin" , Type . FIRE , MoveCategory . SPECIAL , 35 , 85 , 15 , 24 , "Traps opponent, damaging them for 4-5 turns." , 100 , 0 , 1 , new TrapAttr ( BattlerTagType . FIRE_SPIN ) ) ,
2023-04-16 02:51:08 +01:00
new AttackMove ( Moves . THUNDER_SHOCK , "Thunder Shock" , Type . ELECTRIC , MoveCategory . SPECIAL , 40 , 100 , 30 , - 1 , "May paralyze opponent." , 10 , 0 , 1 , new StatusEffectAttr ( StatusEffect . PARALYSIS ) ) ,
new AttackMove ( Moves . THUNDERBOLT , "Thunderbolt" , Type . ELECTRIC , MoveCategory . SPECIAL , 90 , 100 , 15 , 126 , "May paralyze opponent." , 10 , 0 , 1 , new StatusEffectAttr ( StatusEffect . PARALYSIS ) ) ,
2023-04-17 05:46:50 +01:00
new StatusMove ( Moves . THUNDER_WAVE , "Thunder Wave" , Type . ELECTRIC , 90 , 20 , 82 , "Paralyzes opponent." , - 1 , 0 , 1 , new StatusEffectAttr ( StatusEffect . PARALYSIS ) , new ThunderAccuracyAttr ( ) ) ,
2023-04-16 02:51:08 +01:00
new AttackMove ( Moves . THUNDER , "Thunder" , Type . ELECTRIC , MoveCategory . SPECIAL , 110 , 70 , 10 , 166 , "May paralyze opponent." , 30 , 0 , 1 , new StatusEffectAttr ( StatusEffect . PARALYSIS ) ) ,
new AttackMove ( Moves . ROCK_THROW , "Rock Throw" , Type . ROCK , MoveCategory . PHYSICAL , 50 , 90 , 15 , - 1 , "" , - 1 , 0 , 1 ) ,
new AttackMove ( Moves . EARTHQUAKE , "Earthquake" , Type . GROUND , MoveCategory . PHYSICAL , 100 , 100 , 10 , 149 , "Power is doubled if opponent is underground from using Dig." , - 1 , 0 , 1 ,
2023-04-22 00:30:04 +01:00
new HitsTagAttr ( BattlerTagType . UNDERGROUND , true ) ) ,
2023-04-16 02:51:08 +01:00
new AttackMove ( Moves . FISSURE , "Fissure" , Type . GROUND , MoveCategory . PHYSICAL , - 1 , 30 , 5 , - 1 , "One-Hit-KO, if it hits." , - 1 , 0 , 1 , new OneHitKOAttr ( ) ) ,
new AttackMove ( Moves . DIG , "Dig" , Type . GROUND , MoveCategory . PHYSICAL , 80 , 100 , 10 , 55 , "Digs underground on first turn, attacks on second. Can also escape from caves." , - 1 , 0 , 1 ,
2023-04-22 00:30:04 +01:00
new ChargeAttr ( ChargeAnim . DIG_CHARGING , 'dug a hole!' , BattlerTagType . UNDERGROUND ) ) ,
2023-04-16 02:51:08 +01:00
new StatusMove ( Moves . TOXIC , "Toxic" , Type . POISON , 90 , 10 , - 1 , "Badly poisons opponent." , - 1 , 0 , 1 , new StatusEffectAttr ( StatusEffect . TOXIC ) ) ,
new AttackMove ( Moves . CONFUSION , "Confusion" , Type . PSYCHIC , MoveCategory . SPECIAL , 50 , 100 , 25 , - 1 , "May confuse opponent." , 10 , 0 , 1 , new ConfuseAttr ( ) ) ,
new AttackMove ( Moves . PSYCHIC , "Psychic" , Type . PSYCHIC , MoveCategory . SPECIAL , 90 , 100 , 10 , 120 , "May lower opponent's Special Defense." , 10 , 0 , 1 , new StatChangeAttr ( BattleStat . SPDEF , - 1 ) ) ,
new StatusMove ( Moves . HYPNOSIS , "Hypnosis" , Type . PSYCHIC , 60 , 20 , - 1 , "Puts opponent to sleep." , - 1 , 0 , 1 , new StatusEffectAttr ( StatusEffect . SLEEP ) ) ,
2023-04-18 17:30:47 +01:00
new SelfStatusMove ( Moves . MEDITATE , "Meditate" , Type . PSYCHIC , - 1 , 40 , - 1 , "Raises user's Attack." , - 1 , 0 , 1 , new StatChangeAttr ( BattleStat . ATK , 1 , true ) ) ,
new SelfStatusMove ( Moves . AGILITY , "Agility" , Type . PSYCHIC , - 1 , 30 , 4 , "Sharply raises user's Speed." , - 1 , 0 , 1 , new StatChangeAttr ( BattleStat . SPD , 2 , true ) ) ,
2023-04-15 22:40:18 +01:00
new AttackMove ( Moves . QUICK_ATTACK , "Quick Attack" , Type . NORMAL , MoveCategory . PHYSICAL , 40 , 100 , 30 , - 1 , "User attacks first." , - 1 , 1 , 1 ) ,
2023-04-22 06:09:35 +01:00
new AttackMove ( Moves . RAGE , "Rage (N)" , Type . NORMAL , MoveCategory . PHYSICAL , 20 , 100 , 20 , - 1 , "Raises user's Attack when hit." , - 1 , 0 , 1 ) , // TODO
new SelfStatusMove ( Moves . TELEPORT , "Teleport (N)" , Type . PSYCHIC , - 1 , 20 , - 1 , "Allows user to flee wild battles." , - 1 , 0 , 1 ) ,
2023-04-22 15:56:17 +01:00
new AttackMove ( Moves . NIGHT_SHADE , "Night Shade" , Type . GHOST , MoveCategory . SPECIAL , - 1 , 100 , 15 , 42 , "Inflicts damage equal to user's level (maximum 150)." , - 1 , 0 , 1 , new LevelPowerAttr ( ) ) ,
2023-04-22 00:30:04 +01:00
new StatusMove ( Moves . MIMIC , "Mimic" , Type . NORMAL , - 1 , 10 , - 1 , "Copies the opponent's last move." , - 1 , 0 , 1 , new ConditionalMoveAttr ( targetMoveCopiableCondition ) , new CopyMoveAttr ( ) ) ,
2023-04-16 02:51:08 +01:00
new StatusMove ( Moves . SCREECH , "Screech" , Type . NORMAL , 85 , 40 , - 1 , "Sharply lowers opponent's Defense." , - 1 , 0 , 1 , new StatChangeAttr ( BattleStat . DEF , - 2 ) ) ,
2023-04-18 17:30:47 +01:00
new SelfStatusMove ( Moves . DOUBLE_TEAM , "Double Team" , Type . NORMAL , - 1 , 15 , - 1 , "Raises user's Evasiveness." , - 1 , 0 , 1 , new StatChangeAttr ( BattleStat . EVA , 1 , true ) ) ,
new SelfStatusMove ( Moves . RECOVER , "Recover" , Type . NORMAL , - 1 , 5 , - 1 , "User recovers half its max HP." , - 1 , 0 , 1 , new HealAttr ( 0.5 ) ) ,
new SelfStatusMove ( Moves . HARDEN , "Harden" , Type . NORMAL , - 1 , 30 , - 1 , "Raises user's Defense." , - 1 , 0 , 1 , new StatChangeAttr ( BattleStat . DEF , 1 , true ) ) ,
new SelfStatusMove ( Moves . MINIMIZE , "Minimize" , Type . NORMAL , - 1 , 10 , - 1 , "Sharply raises user's Evasiveness." , - 1 , 0 , 1 , new StatChangeAttr ( BattleStat . EVA , 1 , true ) ) ,
2023-04-16 02:51:08 +01:00
new StatusMove ( Moves . SMOKESCREEN , "Smokescreen" , Type . NORMAL , 100 , 20 , - 1 , "Lowers opponent's Accuracy." , - 1 , 0 , 1 , new StatChangeAttr ( BattleStat . ACC , - 1 ) ) ,
new StatusMove ( Moves . CONFUSE_RAY , "Confuse Ray" , Type . GHOST , 100 , 10 , 17 , "Confuses opponent." , - 1 , 0 , 1 , new ConfuseAttr ( ) ) ,
2023-04-18 17:30:47 +01:00
new SelfStatusMove ( Moves . WITHDRAW , "Withdraw" , Type . WATER , - 1 , 40 , - 1 , "Raises user's Defense." , - 1 , 0 , 1 , new StatChangeAttr ( BattleStat . DEF , 1 , true ) ) ,
new SelfStatusMove ( Moves . DEFENSE_CURL , "Defense Curl" , Type . NORMAL , - 1 , 40 , - 1 , "Raises user's Defense." , - 1 , 0 , 1 , new StatChangeAttr ( BattleStat . DEF , 1 , true ) ) ,
new SelfStatusMove ( Moves . BARRIER , "Barrier" , Type . PSYCHIC , - 1 , 20 , - 1 , "Sharply raises user's Defense." , - 1 , 0 , 1 , new StatChangeAttr ( BattleStat . DEF , 2 , true ) ) ,
2023-04-22 06:09:35 +01:00
new SelfStatusMove ( Moves . LIGHT_SCREEN , "Light Screen (N)" , Type . PSYCHIC , - 1 , 30 , 75 , "Halves damage from Special attacks for 5 turns." , - 1 , 0 , 1 ) ,
new SelfStatusMove ( Moves . HAZE , "Haze (N)" , Type . ICE , - 1 , 30 , - 1 , "Resets all stat changes." , - 1 , 0 , 1 ) ,
new SelfStatusMove ( Moves . REFLECT , "Reflect (N)" , Type . PSYCHIC , - 1 , 20 , 74 , "Halves damage from Physical attacks for 5 turns." , - 1 , 0 , 1 ) ,
new SelfStatusMove ( Moves . FOCUS_ENERGY , "Focus Energy (N)" , Type . NORMAL , - 1 , 30 , - 1 , "Increases critical hit ratio." , - 1 , 0 , 1 ) ,
new AttackMove ( Moves . BIDE , "Bide (N)" , Type . NORMAL , MoveCategory . PHYSICAL , - 1 , - 1 , 10 , - 1 , "User takes damage for two turns then strikes back double." , - 1 , 0 , 1 ) ,
2023-04-18 17:30:47 +01:00
new SelfStatusMove ( Moves . METRONOME , "Metronome" , Type . NORMAL , - 1 , 10 , 80 , "User performs almost any move in the game at random." , - 1 , 0 , 1 , new RandomMoveAttr ( ) ) ,
2023-04-22 06:09:35 +01:00
new SelfStatusMove ( Moves . MIRROR_MOVE , "Mirror Move (N)" , Type . FLYING , - 1 , 20 , - 1 , "User performs the opponent's last move." , - 1 , 0 , 1 ) ,
2023-04-18 18:36:11 +01:00
new AttackMove ( Moves . SELF_DESTRUCT , "Self-Destruct" , Type . NORMAL , MoveCategory . PHYSICAL , 200 , 100 , 5 , - 1 , "User faints." , - 1 , 0 , 1 , new SacrificialAttr ( ) ) ,
2023-04-16 02:51:08 +01:00
new AttackMove ( Moves . EGG_BOMB , "Egg Bomb" , Type . NORMAL , MoveCategory . PHYSICAL , 100 , 75 , 10 , - 1 , "" , - 1 , 0 , 1 ) ,
new AttackMove ( Moves . LICK , "Lick" , Type . GHOST , MoveCategory . PHYSICAL , 30 , 100 , 30 , - 1 , "May paralyze opponent." , 30 , 0 , 1 , new StatusEffectAttr ( StatusEffect . PARALYSIS ) ) ,
new AttackMove ( Moves . SMOG , "Smog" , Type . POISON , MoveCategory . SPECIAL , 30 , 70 , 20 , - 1 , "May poison opponent." , 40 , 0 , 1 , new StatusEffectAttr ( StatusEffect . POISON ) ) ,
new AttackMove ( Moves . SLUDGE , "Sludge" , Type . POISON , MoveCategory . SPECIAL , 65 , 100 , 20 , - 1 , "May poison opponent." , 30 , 0 , 1 , new StatusEffectAttr ( StatusEffect . POISON ) ) ,
new AttackMove ( Moves . BONE_CLUB , "Bone Club" , Type . GROUND , MoveCategory . PHYSICAL , 65 , 85 , 20 , - 1 , "May cause flinching." , 10 , 0 , 1 , new FlinchAttr ( ) ) ,
new AttackMove ( Moves . FIRE_BLAST , "Fire Blast" , Type . FIRE , MoveCategory . SPECIAL , 110 , 85 , 5 , 141 , "May burn opponent." , 10 , 0 , 1 , new StatusEffectAttr ( StatusEffect . BURN ) ) ,
new AttackMove ( Moves . WATERFALL , "Waterfall" , Type . WATER , MoveCategory . PHYSICAL , 80 , 100 , 15 , 77 , "May cause flinching." , 20 , 0 , 1 , new FlinchAttr ( ) ) ,
2023-04-22 20:01:48 +01:00
new AttackMove ( Moves . CLAMP , "Clamp" , Type . WATER , MoveCategory . PHYSICAL , 35 , 85 , 15 , - 1 , "Traps opponent, damaging them for 4-5 turns." , 100 , 0 , 1 , new TrapAttr ( BattlerTagType . CLAMP ) ) ,
2023-04-19 21:52:14 +01:00
new AttackMove ( Moves . SWIFT , "Swift" , Type . NORMAL , MoveCategory . SPECIAL , 60 , - 1 , 20 , 32 , "Ignores Accuracy and Evasiveness." , - 1 , 0 , 1 ) ,
2023-04-16 02:51:08 +01:00
new AttackMove ( Moves . SKULL_BASH , "Skull Bash" , Type . NORMAL , MoveCategory . PHYSICAL , 130 , 100 , 10 , - 1 , "Raises Defense on first turn, attacks on second." , 100 , 0 , 1 ,
2023-04-13 17:16:36 +01:00
new ChargeAttr ( ChargeAnim . SKULL_BASH_CHARGING , 'lowered\nits head!' , null , true ) , new StatChangeAttr ( BattleStat . DEF , 1 , true ) ) ,
2023-04-16 02:51:08 +01:00
new AttackMove ( Moves . SPIKE_CANNON , "Spike Cannon" , Type . NORMAL , MoveCategory . PHYSICAL , 20 , 100 , 15 , - 1 , "Hits 2-5 times in one turn." , - 1 , 0 , 1 , new MultiHitAttr ( ) ) ,
new AttackMove ( Moves . CONSTRICT , "Constrict" , Type . NORMAL , MoveCategory . PHYSICAL , 10 , 100 , 35 , - 1 , "May lower opponent's Speed by one stage." , 10 , 0 , 1 , new StatChangeAttr ( BattleStat . SPD , - 1 ) ) ,
2023-04-18 17:30:47 +01:00
new SelfStatusMove ( Moves . AMNESIA , "Amnesia" , Type . PSYCHIC , - 1 , 20 , 128 , "Sharply raises user's Special Defense." , - 1 , 0 , 1 , new StatChangeAttr ( BattleStat . SPDEF , 2 , true ) ) ,
2023-04-16 02:51:08 +01:00
new StatusMove ( Moves . KINESIS , "Kinesis" , Type . PSYCHIC , 80 , 15 , - 1 , "Lowers opponent's Accuracy." , - 1 , 0 , 1 , new StatChangeAttr ( BattleStat . ACC , - 1 ) ) ,
2023-04-18 17:30:47 +01:00
new SelfStatusMove ( Moves . SOFT_BOILED , "Soft-Boiled" , Type . NORMAL , - 1 , 5 , - 1 , "User recovers half its max HP." , - 1 , 0 , 1 , new HealAttr ( 0.5 ) ) ,
2023-04-16 02:51:08 +01:00
new AttackMove ( Moves . HIGH_JUMP_KICK , "High Jump Kick" , Type . FIGHTING , MoveCategory . PHYSICAL , 130 , 90 , 10 , - 1 , "If it misses, the user loses half their HP." , - 1 , 0 , 1 ,
2023-04-22 06:09:35 +01:00
new MissEffectAttr ( ( user : Pokemon , target : Pokemon , move : Move ) = > { user . damage ( Math . floor ( user . getMaxHp ( ) / 2 ) ) ; return true ; } ) ) ,
2023-04-16 02:51:08 +01:00
new StatusMove ( Moves . GLARE , "Glare" , Type . NORMAL , 100 , 30 , - 1 , "Paralyzes opponent." , - 1 , 0 , 1 , new StatusEffectAttr ( StatusEffect . PARALYSIS ) ) ,
2023-04-16 23:40:32 +01:00
new AttackMove ( Moves . DREAM_EATER , "Dream Eater" , Type . PSYCHIC , MoveCategory . SPECIAL , 100 , 100 , 15 , - 1 , "User recovers half the HP inflicted on a sleeping opponent." , - 1 , 0 , 1 ,
new ConditionalMoveAttr ( ( user : Pokemon , target : Pokemon , move : Move ) = > target . status ? . effect === StatusEffect . SLEEP ) , new HitHealAttr ( ) ) ,
2023-04-16 02:51:08 +01:00
new StatusMove ( Moves . POISON_GAS , "Poison Gas" , Type . POISON , 90 , 40 , - 1 , "Poisons opponent." , - 1 , 0 , 1 , new StatusEffectAttr ( StatusEffect . POISON ) ) ,
new AttackMove ( Moves . BARRAGE , "Barrage" , Type . NORMAL , MoveCategory . PHYSICAL , 15 , 85 , 20 , - 1 , "Hits 2-5 times in one turn." , - 1 , 0 , 1 , new MultiHitAttr ( ) ) ,
2023-04-16 05:29:55 +01:00
new AttackMove ( Moves . LEECH_LIFE , "Leech Life" , Type . BUG , MoveCategory . PHYSICAL , 80 , 100 , 10 , 95 , "User recovers half the HP inflicted on opponent." , - 1 , 0 , 1 , new HitHealAttr ( ) ) ,
2023-04-16 02:51:08 +01:00
new StatusMove ( Moves . LOVELY_KISS , "Lovely Kiss" , Type . NORMAL , 75 , 10 , - 1 , "Puts opponent to sleep." , - 1 , 0 , 1 , new StatusEffectAttr ( StatusEffect . SLEEP ) ) ,
new AttackMove ( Moves . SKY_ATTACK , "Sky Attack" , Type . FLYING , MoveCategory . PHYSICAL , 140 , 90 , 5 , - 1 , "Charges on first turn, attacks on second. May cause flinching. High critical hit ratio." , 30 , 0 , 1 ,
2023-04-13 17:16:36 +01:00
new ChargeAttr ( ChargeAnim . SKY_ATTACK_CHARGING , 'is glowing!' ) , new HighCritAttr ( ) , new FlinchAttr ( ) ) ,
2023-04-22 06:09:35 +01:00
new SelfStatusMove ( Moves . TRANSFORM , "Transform (N)" , Type . NORMAL , - 1 , 10 , - 1 , "User takes on the form and attacks of the opponent." , - 1 , 0 , 1 ) ,
2023-04-16 02:51:08 +01:00
new AttackMove ( Moves . BUBBLE , "Bubble" , Type . WATER , MoveCategory . SPECIAL , 40 , 100 , 30 , - 1 , "May lower opponent's Speed." , 10 , 0 , 1 , new StatChangeAttr ( BattleStat . SPD , - 1 ) ) ,
new AttackMove ( Moves . DIZZY_PUNCH , "Dizzy Punch" , Type . NORMAL , MoveCategory . PHYSICAL , 70 , 100 , 10 , - 1 , "May confuse opponent." , 20 , 0 , 1 , new ConfuseAttr ( ) ) ,
new StatusMove ( Moves . SPORE , "Spore" , Type . GRASS , 100 , 15 , - 1 , "Puts opponent to sleep." , - 1 , 0 , 1 , new StatusEffectAttr ( StatusEffect . SLEEP ) ) ,
new StatusMove ( Moves . FLASH , "Flash" , Type . NORMAL , 100 , 20 , - 1 , "Lowers opponent's Accuracy." , - 1 , 0 , 1 , new StatChangeAttr ( BattleStat . ACC , - 1 ) ) ,
2023-04-22 15:56:17 +01:00
new AttackMove ( Moves . PSYWAVE , "Psywave" , Type . PSYCHIC , MoveCategory . SPECIAL , - 1 , 100 , 15 , - 1 , "Inflicts damage 50-150% of user's level (maximum 150)." , - 1 , 0 , 1 , new RandomLevelPowerAttr ( ) ) ,
2023-04-18 17:30:47 +01:00
new SelfStatusMove ( Moves . SPLASH , "Splash" , Type . NORMAL , - 1 , 40 , - 1 , "Doesn't do ANYTHING." , - 1 , 0 , 1 ) ,
new SelfStatusMove ( Moves . ACID_ARMOR , "Acid Armor" , Type . POISON , - 1 , 20 , - 1 , "Sharply raises user's Defense." , - 1 , 0 , 1 , new StatChangeAttr ( BattleStat . DEF , 2 , true ) ) ,
2023-04-16 02:51:08 +01:00
new AttackMove ( Moves . CRABHAMMER , "Crabhammer" , Type . WATER , MoveCategory . PHYSICAL , 100 , 90 , 10 , - 1 , "High critical hit ratio." , - 1 , 0 , 1 , new HighCritAttr ( ) ) ,
2023-04-18 18:36:11 +01:00
new AttackMove ( Moves . EXPLOSION , "Explosion" , Type . NORMAL , MoveCategory . PHYSICAL , 250 , 100 , 5 , - 1 , "User faints." , - 1 , 0 , 1 , new SacrificialAttr ( ) ) ,
2023-04-16 02:51:08 +01:00
new AttackMove ( Moves . FURY_SWIPES , "Fury Swipes" , Type . NORMAL , MoveCategory . PHYSICAL , 18 , 80 , 15 , - 1 , "Hits 2-5 times in one turn." , - 1 , 0 , 1 , new MultiHitAttr ( ) ) ,
new AttackMove ( Moves . BONEMERANG , "Bonemerang" , Type . GROUND , MoveCategory . PHYSICAL , 50 , 90 , 10 , - 1 , "Hits twice in one turn." , - 1 , 0 , 1 , new MultiHitAttr ( MultiHitType . _2 ) ) ,
2023-04-18 17:30:47 +01:00
new SelfStatusMove ( Moves . REST , "Rest" , Type . PSYCHIC , - 1 , 5 , 85 , "User sleeps for 2 turns, but user is fully healed." , - 1 , 0 , 1 ,
2023-04-17 05:46:50 +01:00
new ConditionalMoveAttr ( ( user : Pokemon , target : Pokemon , move : Move ) = > user . status ? . effect !== StatusEffect . SLEEP ) , new StatusEffectAttr ( StatusEffect . SLEEP , true , 3 ) , new HealAttr ( 1 , true ) ) ,
2023-04-16 02:51:08 +01:00
new AttackMove ( Moves . ROCK_SLIDE , "Rock Slide" , Type . ROCK , MoveCategory . PHYSICAL , 75 , 90 , 10 , 86 , "May cause flinching." , 30 , 0 , 1 , new FlinchAttr ( ) ) ,
new AttackMove ( Moves . HYPER_FANG , "Hyper Fang" , Type . NORMAL , MoveCategory . PHYSICAL , 80 , 90 , 15 , - 1 , "May cause flinching." , 10 , 0 , 1 , new FlinchAttr ( ) ) ,
2023-04-18 17:30:47 +01:00
new SelfStatusMove ( Moves . SHARPEN , "Sharpen" , Type . NORMAL , - 1 , 30 , - 1 , "Raises user's Attack." , - 1 , 0 , 1 , new StatChangeAttr ( BattleStat . ATK , 1 , true ) ) ,
2023-04-22 06:09:35 +01:00
new SelfStatusMove ( Moves . CONVERSION , "Conversion (N)" , Type . NORMAL , - 1 , 30 , - 1 , "Changes user's type to that of its first move." , - 1 , 0 , 1 ) ,
2023-04-16 02:51:08 +01:00
new AttackMove ( Moves . TRI_ATTACK , "Tri Attack" , Type . NORMAL , MoveCategory . SPECIAL , 80 , 100 , 10 , - 1 , "May paralyze, burn or freeze opponent." , 20 , 0 , 1 , new StatusEffectAttr ( StatusEffect . PARALYSIS ) , new StatusEffectAttr ( StatusEffect . BURN ) , new StatusEffectAttr ( StatusEffect . FREEZE ) ) , // TODO: Check if independent
2023-04-22 15:56:17 +01:00
new AttackMove ( Moves . SUPER_FANG , "Super Fang" , Type . NORMAL , MoveCategory . PHYSICAL , - 1 , 90 , 10 , - 1 , "Always takes off half of the opponent's HP." , - 1 , 0 , 1 , new TargetHalfHpDamageAttr ( ) ) ,
2023-04-16 02:51:08 +01:00
new AttackMove ( Moves . SLASH , "Slash" , Type . NORMAL , MoveCategory . PHYSICAL , 70 , 100 , 20 , - 1 , "High critical hit ratio." , - 1 , 0 , 1 , new HighCritAttr ( ) ) ,
2023-04-22 06:09:35 +01:00
new SelfStatusMove ( Moves . SUBSTITUTE , "Substitute (N)" , Type . NORMAL , - 1 , 10 , 103 , "Uses HP to creates a decoy that takes hits." , - 1 , 0 , 1 ) ,
2023-04-16 02:51:08 +01:00
new AttackMove ( Moves . STRUGGLE , "Struggle" , Type . NORMAL , MoveCategory . PHYSICAL , 50 , - 1 , - 1 , - 1 , "Only usable when all PP are gone. Hurts the user." , - 1 , 0 , 1 ) ,
2023-04-22 00:30:04 +01:00
new SelfStatusMove ( Moves . SKETCH , "Sketch" , Type . NORMAL , - 1 , 1 , - 1 , "Permanently copies the opponent's last move." , - 1 , 0 , 2 ,
new ConditionalMoveAttr ( targetMoveSketchableCondition ) , new SketchAttr ( ) ) ,
2023-04-16 02:51:08 +01:00
new AttackMove ( Moves . TRIPLE_KICK , "Triple Kick" , Type . FIGHTING , MoveCategory . PHYSICAL , 10 , 90 , 10 , - 1 , "Hits thrice in one turn at increasing power." , - 1 , 0 , 2 ,
2023-04-16 05:29:55 +01:00
new MultiHitAttr ( MultiHitType . _3_INCR ) , new MissEffectAttr ( ( user : Pokemon , target : Pokemon , move : Move ) = > {
2023-04-15 22:40:18 +01:00
user . turnData . hitsLeft = 0 ;
return true ;
} ) ) ,
2023-04-22 06:09:35 +01:00
new AttackMove ( Moves . THIEF , "Thief (N)" , Type . DARK , MoveCategory . PHYSICAL , 60 , 100 , 25 , 18 , "Also steals opponent's held item." , - 1 , 0 , 2 ) ,
new StatusMove ( Moves . SPIDER_WEB , "Spider Web (N)" , Type . BUG , - 1 , 10 , - 1 , "Opponent cannot escape/switch." , - 1 , 0 , 2 ) ,
new SelfStatusMove ( Moves . MIND_READER , "Mind Reader (N)" , Type . NORMAL , - 1 , 5 , - 1 , "User's next attack is guaranteed to hit." , - 1 , 0 , 2 ) ,
2023-04-16 23:40:32 +01:00
new StatusMove ( Moves . NIGHTMARE , "Nightmare" , Type . GHOST , 100 , 15 , - 1 , "The sleeping opponent loses 25% of its max HP each turn." , - 1 , 0 , 2 ,
2023-04-22 00:30:04 +01:00
new ConditionalMoveAttr ( ( user : Pokemon , target : Pokemon , move : Move ) = > target . status ? . effect === StatusEffect . SLEEP ) , new AddBattlerTagAttr ( BattlerTagType . NIGHTMARE ) ) ,
2023-04-16 02:51:08 +01:00
new AttackMove ( Moves . FLAME_WHEEL , "Flame Wheel" , Type . FIRE , MoveCategory . PHYSICAL , 60 , 100 , 25 , - 1 , "May burn opponent." , 10 , 0 , 2 , new StatusEffectAttr ( StatusEffect . BURN ) ) ,
2023-04-16 23:40:32 +01:00
new AttackMove ( Moves . SNORE , "Snore" , Type . NORMAL , MoveCategory . SPECIAL , 50 , 100 , 15 , - 1 , "Can only be used if asleep. May cause flinching." , 30 , 0 , 2 ,
new BypassSleepAttr ( ) , new ConditionalMoveAttr ( ( user : Pokemon , target : Pokemon , move : Move ) = > user . status ? . effect === StatusEffect . SLEEP ) , new FlinchAttr ( ) ) ,
2023-04-22 06:09:35 +01:00
new StatusMove ( Moves . CURSE , "Curse (N)" , Type . GHOST , - 1 , 10 , - 1 , "Ghosts lose 50% of max HP and curse the opponent; Non-Ghosts raise Attack, Defense and lower Speed." , - 1 , 0 , 2 ) ,
new AttackMove ( Moves . FLAIL , "Flail (N)" , Type . NORMAL , MoveCategory . PHYSICAL , - 1 , 100 , 15 , - 1 , "The lower the user's HP, the higher the power." , - 1 , 0 , 2 ) ,
new SelfStatusMove ( Moves . CONVERSION_2 , "Conversion 2 (N)" , Type . NORMAL , - 1 , 30 , - 1 , "User changes type to become resistant to opponent's last move." , - 1 , 0 , 2 ) ,
2023-04-16 02:51:08 +01:00
new AttackMove ( Moves . AEROBLAST , "Aeroblast" , Type . FLYING , MoveCategory . SPECIAL , 100 , 95 , 5 , - 1 , "High critical hit ratio." , - 1 , 0 , 2 , new HighCritAttr ( ) ) ,
new StatusMove ( Moves . COTTON_SPORE , "Cotton Spore" , Type . GRASS , 100 , 40 , - 1 , "Sharply lowers opponent's Speed." , - 1 , 0 , 2 , new StatChangeAttr ( BattleStat . SPD , - 2 ) ) ,
2023-04-22 15:56:17 +01:00
new AttackMove ( Moves . REVERSAL , "Reversal" , Type . FIGHTING , MoveCategory . PHYSICAL , - 1 , 100 , 15 , 134 , "The lower the user's HP, the higher the power." , - 1 , 0 , 2 , new LowHpPowerAttr ( ) ) ,
2023-04-22 06:09:35 +01:00
new StatusMove ( Moves . SPITE , "Spite (N)" , Type . GHOST , 100 , 10 , - 1 , "The opponent's last move loses 2-5 PP." , - 1 , 0 , 2 ) ,
2023-04-16 02:51:08 +01:00
new AttackMove ( Moves . POWDER_SNOW , "Powder Snow" , Type . ICE , MoveCategory . SPECIAL , 40 , 100 , 25 , - 1 , "May freeze opponent." , 10 , 0 , 2 , new StatusEffectAttr ( StatusEffect . FREEZE ) ) ,
2023-04-18 17:30:47 +01:00
new SelfStatusMove ( Moves . PROTECT , "Protect" , Type . NORMAL , - 1 , 10 , 7 , "Protects the user, but may fail if used consecutively." , - 1 , 4 , 2 ,
2023-04-22 00:30:04 +01:00
new WaningConsecutiveUseConditionalMoveAttr ( ) , new AddBattlerTagAttr ( BattlerTagType . PROTECTED , true ) ) ,
2023-04-16 02:51:08 +01:00
new AttackMove ( Moves . MACH_PUNCH , "Mach Punch" , Type . FIGHTING , MoveCategory . PHYSICAL , 40 , 100 , 30 , - 1 , "User attacks first." , - 1 , 1 , 2 ) ,
new StatusMove ( Moves . SCARY_FACE , "Scary Face" , Type . NORMAL , 100 , 10 , 6 , "Sharply lowers opponent's Speed." , - 1 , 0 , 2 , new StatChangeAttr ( BattleStat . SPD , - 2 ) ) ,
2023-04-19 21:52:14 +01:00
new AttackMove ( Moves . FEINT_ATTACK , "Feint Attack" , Type . DARK , MoveCategory . PHYSICAL , 60 , - 1 , 20 , - 1 , "Ignores Accuracy and Evasiveness." , - 1 , 0 , 2 ) ,
2023-04-16 02:51:08 +01:00
new StatusMove ( Moves . SWEET_KISS , "Sweet Kiss" , Type . FAIRY , 75 , 10 , - 1 , "Confuses opponent." , - 1 , 0 , 2 , new ConfuseAttr ( ) ) ,
2023-04-22 06:09:35 +01:00
new SelfStatusMove ( Moves . BELLY_DRUM , "Belly Drum (N)" , Type . NORMAL , - 1 , 10 , - 1 , "User loses 50% of its max HP, but Attack raises to maximum." , - 1 , 0 , 2 ) ,
2023-04-16 02:51:08 +01:00
new AttackMove ( Moves . SLUDGE_BOMB , "Sludge Bomb" , Type . POISON , MoveCategory . SPECIAL , 90 , 100 , 10 , 148 , "May poison opponent." , 30 , 0 , 2 , new StatusEffectAttr ( StatusEffect . POISON ) ) ,
new AttackMove ( Moves . MUD_SLAP , "Mud-Slap" , Type . GROUND , MoveCategory . SPECIAL , 20 , 100 , 10 , 5 , "Lowers opponent's Accuracy." , 100 , 0 , 2 , new StatChangeAttr ( BattleStat . ACC , - 1 ) ) ,
new AttackMove ( Moves . OCTAZOOKA , "Octazooka" , Type . WATER , MoveCategory . SPECIAL , 65 , 85 , 10 , - 1 , "May lower opponent's Accuracy." , 50 , 0 , 2 , new StatChangeAttr ( BattleStat . ACC , - 1 ) ) ,
2023-04-22 06:09:35 +01:00
new StatusMove ( Moves . SPIKES , "Spikes (N)" , Type . GROUND , - 1 , 20 , 90 , "Hurts opponents when they switch into battle." , - 1 , 0 , 2 ) ,
2023-04-16 02:51:08 +01:00
new AttackMove ( Moves . ZAP_CANNON , "Zap Cannon" , Type . ELECTRIC , MoveCategory . SPECIAL , 120 , 50 , 5 , - 1 , "Paralyzes opponent." , 100 , 0 , 2 , new StatusEffectAttr ( StatusEffect . PARALYSIS ) ) ,
2023-04-22 06:09:35 +01:00
new StatusMove ( Moves . FORESIGHT , "Foresight (N)" , Type . NORMAL , - 1 , 40 , - 1 , "Resets opponent's Evasiveness, and allows Normal- and Fighting-type attacks to hit Ghosts." , - 1 , 0 , 2 ) , // TODO
new StatusMove ( Moves . DESTINY_BOND , "Destiny Bond (N)" , Type . GHOST , - 1 , 5 , - 1 , "If the user faints, the opponent also faints." , - 1 , 0 , 2 ) . ignoreProtect ( ) ,
new StatusMove ( Moves . PERISH_SONG , "Perish Song (N)" , Type . NORMAL , - 1 , 5 , - 1 , "Any Pokémon in play when this attack is used faints in 3 turns." , - 1 , 0 , 2 ) . ignoreProtect ( ) ,
2023-04-16 02:51:08 +01:00
new AttackMove ( Moves . ICY_WIND , "Icy Wind" , Type . ICE , MoveCategory . SPECIAL , 55 , 95 , 15 , 34 , "Lowers opponent's Speed." , 100 , 0 , 2 , new StatChangeAttr ( BattleStat . SPD , - 1 ) ) ,
2023-04-18 17:30:47 +01:00
new SelfStatusMove ( Moves . DETECT , "Detect" , Type . FIGHTING , - 1 , 5 , - 1 , "Protects the user, but may fail if used consecutively." , - 1 , 4 , 2 ,
2023-04-22 00:30:04 +01:00
new WaningConsecutiveUseConditionalMoveAttr ( ) , new AddBattlerTagAttr ( BattlerTagType . PROTECTED , true ) ) ,
2023-04-16 02:51:08 +01:00
new AttackMove ( Moves . BONE_RUSH , "Bone Rush" , Type . GROUND , MoveCategory . PHYSICAL , 25 , 90 , 10 , - 1 , "Hits 2-5 times in one turn." , - 1 , 0 , 2 , new MultiHitAttr ( ) ) ,
2023-04-22 06:09:35 +01:00
new SelfStatusMove ( Moves . LOCK_ON , "Lock-On (N)" , Type . NORMAL , - 1 , 5 , - 1 , "User's next attack is guaranteed to hit." , - 1 , 0 , 2 ) ,
2023-04-16 02:51:08 +01:00
new AttackMove ( Moves . OUTRAGE , "Outrage" , Type . DRAGON , MoveCategory . PHYSICAL , 120 , 100 , 10 , 156 , "User attacks for 2-3 turns but then becomes confused." , - 1 , 0 , 2 ,
2023-04-15 06:32:16 +01:00
new FrenzyAttr ( ) , frenzyMissFunc , new ConfuseAttr ( true ) ) , // TODO: Update to still confuse if last hit misses
2023-04-17 05:46:50 +01:00
new StatusMove ( Moves . SANDSTORM , "Sandstorm" , Type . ROCK , - 1 , 10 , 51 , "Creates a sandstorm for 5 turns." , - 1 , 0 , 2 , new WeatherConditionalMoveAttr ( WeatherType . SANDSTORM ) , new WeatherChangeAttr ( WeatherType . SANDSTORM ) ) ,
2023-04-16 05:29:55 +01:00
new AttackMove ( Moves . GIGA_DRAIN , "Giga Drain" , Type . GRASS , MoveCategory . SPECIAL , 75 , 100 , 10 , 111 , "User recovers half the HP inflicted on opponent." , - 1 , 4 , 2 , new HitHealAttr ( ) ) ,
2023-04-22 06:09:35 +01:00
new SelfStatusMove ( Moves . ENDURE , "Endure (N)" , Type . NORMAL , - 1 , 10 , 47 , "Always left with at least 1 HP, but may fail if used consecutively." , - 1 , 0 , 2 ) ,
2023-04-16 02:51:08 +01:00
new StatusMove ( Moves . CHARM , "Charm" , Type . FAIRY , 100 , 20 , 2 , "Sharply lowers opponent's Attack." , - 1 , 0 , 2 , new StatChangeAttr ( BattleStat . ATK , - 2 ) ) ,
2023-04-23 06:37:58 +01:00
new AttackMove ( Moves . ROLLOUT , "Rollout" , Type . ROCK , MoveCategory . PHYSICAL , 30 , 90 , 20 , - 1 , "Doubles in power each turn for 5 turns." , - 1 , 0 , 2 , new ConsecutiveUseDoublePowerAttr ( 5 , true , true ) ) , // TODO: Defense Curl logic
2023-04-22 06:09:35 +01:00
new AttackMove ( Moves . FALSE_SWIPE , "False Swipe (N)" , Type . NORMAL , MoveCategory . PHYSICAL , 40 , 100 , 40 , 57 , "Always leaves opponent with at least 1 HP." , - 1 , 0 , 2 ) ,
2023-04-16 02:51:08 +01:00
new StatusMove ( Moves . SWAGGER , "Swagger" , Type . NORMAL , 85 , 15 , - 1 , "Confuses opponent, but sharply raises its Attack." , - 1 , 0 , 2 , new StatChangeAttr ( BattleStat . ATK , 2 ) , new ConfuseAttr ( ) ) ,
2023-04-18 17:30:47 +01:00
new SelfStatusMove ( Moves . MILK_DRINK , "Milk Drink" , Type . NORMAL , - 1 , 5 , - 1 , "User recovers half its max HP." , - 1 , 0 , 2 , new HealAttr ( 0.5 ) ) ,
2023-04-16 02:51:08 +01:00
new AttackMove ( Moves . SPARK , "Spark" , Type . ELECTRIC , MoveCategory . PHYSICAL , 65 , 100 , 20 , - 1 , "May paralyze opponent." , 30 , 0 , 2 , new StatusEffectAttr ( StatusEffect . PARALYSIS ) ) ,
2023-04-22 15:56:17 +01:00
new AttackMove ( Moves . FURY_CUTTER , "Fury Cutter" , Type . BUG , MoveCategory . PHYSICAL , 40 , 95 , 20 , - 1 , "Power increases each turn." , - 1 , 0 , 2 , new ConsecutiveUseDoublePowerAttr ( 3 , true ) ) ,
2023-04-16 02:51:08 +01:00
new AttackMove ( Moves . STEEL_WING , "Steel Wing" , Type . STEEL , MoveCategory . PHYSICAL , 70 , 90 , 25 , - 1 , "May raise user's Defense." , 10 , 0 , 2 , new StatChangeAttr ( BattleStat . DEF , 1 , true ) ) ,
2023-04-23 03:14:53 +01:00
new StatusMove ( Moves . MEAN_LOOK , "Mean Look" , Type . NORMAL , - 1 , 5 , - 1 , "Opponent cannot flee or switch." , - 1 , 0 , 2 ,
new ConditionalMoveAttr ( ( user : Pokemon , target : Pokemon , move : Move ) = > ! target . getTag ( BattlerTagType . TRAPPED ) ) , new AddBattlerTagAttr ( BattlerTagType . TRAPPED , false , 1 ) ) ,
2023-04-22 06:09:35 +01:00
new StatusMove ( Moves . ATTRACT , "Attract (N)" , Type . NORMAL , 100 , 15 , - 1 , "If opponent is the opposite gender, it's less likely to attack." , - 1 , 0 , 2 ) ,
2023-04-18 17:30:47 +01:00
new SelfStatusMove ( Moves . SLEEP_TALK , "Sleep Talk" , Type . NORMAL , - 1 , 10 , 70 , "User performs one of its own moves while sleeping." , - 1 , 0 , 2 ,
2023-04-16 23:40:32 +01:00
new BypassSleepAttr ( ) , new ConditionalMoveAttr ( ( user : Pokemon , target : Pokemon , move : Move ) = > user . status ? . effect === StatusEffect . SLEEP ) , new RandomMovesetMoveAttr ( ) ) ,
2023-04-22 06:09:35 +01:00
new SelfStatusMove ( Moves . HEAL_BELL , "Heal Bell (N)" , Type . NORMAL , - 1 , 5 , - 1 , "Heals the user's party's status conditions." , - 1 , 0 , 2 ) ,
new AttackMove ( Moves . RETURN , "Return (N)" , Type . NORMAL , MoveCategory . PHYSICAL , - 1 , 100 , 20 , - 1 , "Power increases with higher Friendship." , - 1 , 0 , 2 ) ,
new AttackMove ( Moves . PRESENT , "Present (N)" , Type . NORMAL , MoveCategory . PHYSICAL , - 1 , 90 , 15 , - 1 , "Either deals damage or heals." , - 1 , 0 , 2 ) ,
new AttackMove ( Moves . FRUSTRATION , "Frustration (N)" , Type . NORMAL , MoveCategory . PHYSICAL , - 1 , 100 , 20 , - 1 , "Power decreases with higher Friendship." , - 1 , 0 , 2 ) ,
new SelfStatusMove ( Moves . SAFEGUARD , "Safeguard (N)" , Type . NORMAL , - 1 , 25 , - 1 , "The user's party is protected from status conditions." , - 1 , 0 , 2 ) ,
new StatusMove ( Moves . PAIN_SPLIT , "Pain Split (N)" , Type . NORMAL , - 1 , 20 , - 1 , "The user's and opponent's HP becomes the average of both." , - 1 , 0 , 2 ) ,
2023-04-16 02:51:08 +01:00
new AttackMove ( Moves . SACRED_FIRE , "Sacred Fire" , Type . FIRE , MoveCategory . PHYSICAL , 100 , 95 , 5 , - 1 , "May burn opponent." , 50 , 0 , 2 , new StatusEffectAttr ( StatusEffect . BURN ) ) ,
2023-04-22 06:09:35 +01:00
new AttackMove ( Moves . MAGNITUDE , "Magnitude (N)" , Type . GROUND , MoveCategory . PHYSICAL , - 1 , 100 , 30 , - 1 , "Hits with random power." , - 1 , 0 , 2 ) ,
2023-04-16 02:51:08 +01:00
new AttackMove ( Moves . DYNAMIC_PUNCH , "Dynamic Punch" , Type . FIGHTING , MoveCategory . PHYSICAL , 100 , 50 , 5 , - 1 , "Confuses opponent." , 100 , 0 , 2 , new ConfuseAttr ( ) ) ,
new AttackMove ( Moves . MEGAHORN , "Megahorn" , Type . BUG , MoveCategory . PHYSICAL , 120 , 85 , 10 , - 1 , "" , - 1 , 0 , 2 ) ,
new AttackMove ( Moves . DRAGON_BREATH , "Dragon Breath" , Type . DRAGON , MoveCategory . SPECIAL , 60 , 100 , 20 , - 1 , "May paralyze opponent." , 30 , 0 , 2 , new StatusEffectAttr ( StatusEffect . PARALYSIS ) ) ,
2023-04-22 06:09:35 +01:00
new SelfStatusMove ( Moves . BATON_PASS , "Baton Pass (N)" , Type . NORMAL , - 1 , 40 , 132 , "User switches out and gives stat changes to the incoming Pokémon." , - 1 , 0 , 2 ) ,
new StatusMove ( Moves . ENCORE , "Encore (N)" , Type . NORMAL , 100 , 5 , 122 , "Forces opponent to keep using its last move for 3 turns." , - 1 , 0 , 2 ) ,
new AttackMove ( Moves . PURSUIT , "Pursuit (N)" , Type . DARK , MoveCategory . PHYSICAL , 40 , 100 , 20 , - 1 , "Double power if the opponent is switching out." , - 1 , 0 , 2 ) ,
2023-04-22 20:01:48 +01:00
new AttackMove ( Moves . RAPID_SPIN , "Rapid Spin" , Type . NORMAL , MoveCategory . PHYSICAL , 50 , 100 , 40 , - 1 , "Raises user's Speed and removes entry hazards and trap move effects." , 100 , 0 , 2 ,
new StatChangeAttr ( BattleStat . SPD , 1 , true ) , new LapseBattlerTagAttr ( [ BattlerTagType . BIND , BattlerTagType . WRAP , BattlerTagType . FIRE_SPIN , BattlerTagType . WHIRLPOOL , BattlerTagType . CLAMP , BattlerTagType . SAND_TOMB , BattlerTagType . MAGMA_STORM ] , true ) ) ,
2023-04-16 02:51:08 +01:00
new StatusMove ( Moves . SWEET_SCENT , "Sweet Scent" , Type . NORMAL , 100 , 20 , - 1 , "Lowers opponent's Evasiveness." , - 1 , 0 , 2 , new StatChangeAttr ( BattleStat . EVA , - 1 ) ) ,
new AttackMove ( Moves . IRON_TAIL , "Iron Tail" , Type . STEEL , MoveCategory . PHYSICAL , 100 , 75 , 15 , - 1 , "May lower opponent's Defense." , 30 , 0 , 2 , new StatChangeAttr ( BattleStat . DEF , - 1 ) ) ,
new AttackMove ( Moves . METAL_CLAW , "Metal Claw" , Type . STEEL , MoveCategory . PHYSICAL , 50 , 95 , 35 , 31 , "May raise user's Attack." , 10 , 0 , 2 , new StatChangeAttr ( BattleStat . ATK , 1 , true ) ) ,
2023-04-19 21:52:14 +01:00
new AttackMove ( Moves . VITAL_THROW , "Vital Throw" , Type . FIGHTING , MoveCategory . PHYSICAL , 70 , - 1 , 10 , - 1 , "User attacks last, but ignores Accuracy and Evasiveness." , - 1 , - 1 , 2 ) ,
2023-04-18 17:30:47 +01:00
new SelfStatusMove ( Moves . MORNING_SUN , "Morning Sun" , Type . NORMAL , - 1 , 5 , - 1 , "User recovers HP. Amount varies with the weather." , - 1 , 0 , 2 , new WeatherHealAttr ( ) ) ,
new SelfStatusMove ( Moves . SYNTHESIS , "Synthesis" , Type . GRASS , - 1 , 5 , - 1 , "User recovers HP. Amount varies with the weather." , - 1 , 0 , 2 , new WeatherHealAttr ( ) ) ,
new SelfStatusMove ( Moves . MOONLIGHT , "Moonlight" , Type . FAIRY , - 1 , 5 , - 1 , "User recovers HP. Amount varies with the weather." , - 1 , 0 , 2 , new WeatherHealAttr ( ) ) ,
2023-04-22 06:09:35 +01:00
new AttackMove ( Moves . HIDDEN_POWER , "Hidden Power (N)" , Type . NORMAL , MoveCategory . SPECIAL , 60 , 100 , 15 , - 1 , "Type and power depends on user's IVs." , - 1 , 0 , 2 ) ,
2023-04-16 02:51:08 +01:00
new AttackMove ( Moves . CROSS_CHOP , "Cross Chop" , Type . FIGHTING , MoveCategory . PHYSICAL , 100 , 80 , 5 , - 1 , "High critical hit ratio." , - 1 , 0 , 2 , new HighCritAttr ( ) ) ,
2023-04-22 06:09:35 +01:00
new AttackMove ( Moves . TWISTER , "Twister (P)" , Type . DRAGON , MoveCategory . SPECIAL , 40 , 100 , 20 , - 1 , "May cause flinching. Hits Pokémon using Fly/Bounce with double power." , 20 , 0 , 2 ,
2023-04-22 00:30:04 +01:00
new HitsTagAttr ( BattlerTagType . FLYING , true ) , new FlinchAttr ( ) ) , // TODO
2023-04-18 17:30:47 +01:00
new SelfStatusMove ( Moves . RAIN_DANCE , "Rain Dance" , Type . WATER , - 1 , 5 , 50 , "Makes it rain for 5 turns." , - 1 , 0 , 2 , new WeatherConditionalMoveAttr ( WeatherType . RAIN ) , new WeatherChangeAttr ( WeatherType . RAIN ) ) ,
new SelfStatusMove ( Moves . SUNNY_DAY , "Sunny Day" , Type . FIRE , - 1 , 5 , 49 , "Makes it sunny for 5 turns." , - 1 , 0 , 2 , new WeatherConditionalMoveAttr ( WeatherType . SUNNY ) , new WeatherChangeAttr ( WeatherType . SUNNY ) ) ,
2023-04-16 02:51:08 +01:00
new AttackMove ( Moves . CRUNCH , "Crunch" , Type . DARK , MoveCategory . PHYSICAL , 80 , 100 , 15 , 108 , "May lower opponent's Defense." , 20 , 0 , 2 , new StatChangeAttr ( BattleStat . DEF , - 1 ) ) ,
2023-04-22 06:09:35 +01:00
new AttackMove ( Moves . MIRROR_COAT , "Mirror Coat (N)" , Type . PSYCHIC , MoveCategory . SPECIAL , - 1 , 100 , 20 , - 1 , "When hit by a Special Attack, user strikes back with 2x power." , - 1 , - 5 , 2 ) ,
new SelfStatusMove ( Moves . PSYCH_UP , "Psych Up (N)" , Type . NORMAL , - 1 , 10 , - 1 , "Copies the opponent's stat changes." , - 1 , 0 , 2 ) ,
2023-04-15 22:40:18 +01:00
new AttackMove ( Moves . EXTREME_SPEED , "Extreme Speed" , Type . NORMAL , MoveCategory . PHYSICAL , 80 , 100 , 5 , - 1 , "User attacks first." , - 1 , 2 , 2 ) ,
2023-04-16 02:51:08 +01:00
new AttackMove ( Moves . ANCIENT_POWER , "Ancient Power" , Type . ROCK , MoveCategory . SPECIAL , 60 , 100 , 5 , - 1 , "May raise all user's stats at once." , 10 , 0 , 2 ,
2023-04-11 04:15:06 +01:00
new StatChangeAttr ( [ BattleStat . ATK , BattleStat . DEF , BattleStat . SPATK , BattleStat . SPDEF , BattleStat . SPD ] , 1 , true ) ) ,
2023-04-16 02:51:08 +01:00
new AttackMove ( Moves . SHADOW_BALL , "Shadow Ball" , Type . GHOST , MoveCategory . SPECIAL , 80 , 100 , 15 , 114 , "May lower opponent's Special Defense." , 20 , 0 , 2 , new StatChangeAttr ( BattleStat . SPDEF , - 1 ) ) ,
2023-04-22 06:09:35 +01:00
new AttackMove ( Moves . FUTURE_SIGHT , "Future Sight (N)" , Type . PSYCHIC , MoveCategory . SPECIAL , 120 , 100 , 10 , - 1 , "Damage occurs 2 turns later." , - 1 , 0 , 2 ) ,
2023-04-16 02:51:08 +01:00
new AttackMove ( Moves . ROCK_SMASH , "Rock Smash" , Type . FIGHTING , MoveCategory . PHYSICAL , 40 , 100 , 15 , - 1 , "May lower opponent's Defense." , 50 , 0 , 2 , new StatChangeAttr ( BattleStat . DEF , - 1 ) ) ,
2023-04-22 20:01:48 +01:00
new AttackMove ( Moves . WHIRLPOOL , "Whirlpool" , Type . WATER , MoveCategory . SPECIAL , 35 , 85 , 15 , - 1 , "Traps opponent, damaging them for 4-5 turns." , 100 , 0 , 2 , new TrapAttr ( BattlerTagType . WHIRLPOOL ) ) ,
2023-04-22 06:09:35 +01:00
new AttackMove ( Moves . BEAT_UP , "Beat Up (N)" , Type . DARK , MoveCategory . PHYSICAL , - 1 , 100 , 10 , - 1 , "Each Pokémon in user's party attacks." , - 1 , 0 , 2 ) ,
2023-04-15 22:40:18 +01:00
new AttackMove ( Moves . FAKE_OUT , "Fake Out" , Type . NORMAL , MoveCategory . PHYSICAL , 40 , 100 , 10 , - 1 , "User attacks first, foe flinches. Only usable on first turn." , 100 , 3 , 3 ,
2023-04-22 00:30:04 +01:00
new ConditionalMoveAttr ( ( user : Pokemon , target : Pokemon , move : Move ) = > user . scene . currentBattle . turn === 1 ) , new FlinchAttr ( ) ) ,
2023-04-22 06:09:35 +01:00
new AttackMove ( Moves . UPROAR , "Uproar (N)" , Type . NORMAL , MoveCategory . SPECIAL , 90 , 100 , 10 , - 1 , "User attacks for 3 turns and prevents sleep." , - 1 , 0 , 3 ) , // TODO
new SelfStatusMove ( Moves . STOCKPILE , "Stockpile (N)" , Type . NORMAL , - 1 , 20 , - 1 , "Stores energy for use with Spit Up and Swallow." , - 1 , 0 , 3 ) ,
new AttackMove ( Moves . SPIT_UP , "Spit Up (N)" , Type . NORMAL , MoveCategory . SPECIAL , - 1 , 100 , 10 , - 1 , "Power depends on how many times the user performed Stockpile." , - 1 , 0 , 3 ) ,
new SelfStatusMove ( Moves . SWALLOW , "Swallow (N)" , Type . NORMAL , - 1 , 10 , - 1 , "The more times the user has performed Stockpile, the more HP is recovered." , - 1 , 0 , 3 ) ,
2023-04-16 02:51:08 +01:00
new AttackMove ( Moves . HEAT_WAVE , "Heat Wave" , Type . FIRE , MoveCategory . SPECIAL , 95 , 90 , 10 , 118 , "May burn opponent." , 10 , 0 , 3 , new StatusEffectAttr ( StatusEffect . BURN ) ) ,
2023-04-18 17:30:47 +01:00
new SelfStatusMove ( Moves . HAIL , "Hail" , Type . ICE , - 1 , 10 , - 1 , "Non-Ice types are damaged for 5 turns." , - 1 , 0 , 3 , new WeatherConditionalMoveAttr ( WeatherType . HAIL ) , new WeatherChangeAttr ( WeatherType . HAIL ) ) ,
2023-04-22 06:09:35 +01:00
new StatusMove ( Moves . TORMENT , "Torment (N)" , Type . DARK , 100 , 15 , - 1 , "Opponent cannot use the same move in a row." , - 1 , 0 , 3 ) ,
2023-04-16 02:51:08 +01:00
new StatusMove ( Moves . FLATTER , "Flatter" , Type . DARK , 100 , 15 , - 1 , "Confuses opponent, but raises its Special Attack." , - 1 , 0 , 3 , new StatChangeAttr ( BattleStat . SPATK , 1 ) , new ConfuseAttr ( ) ) ,
new StatusMove ( Moves . WILL_O_WISP , "Will-O-Wisp" , Type . FIRE , 85 , 15 , 107 , "Burns opponent." , - 1 , 0 , 3 , new StatusEffectAttr ( StatusEffect . BURN ) ) ,
new StatusMove ( Moves . MEMENTO , "Memento" , Type . DARK , 100 , 10 , - 1 , "User faints, sharply lowers opponent's Attack and Special Attack." , - 1 , 0 , 3 ,
2023-04-22 06:09:35 +01:00
new SacrificialAttr ( ) , new StatChangeAttr ( [ BattleStat . ATK , BattleStat . SPATK ] , - 2 ) ) ,
new AttackMove ( Moves . FACADE , "Facade (N)" , Type . NORMAL , MoveCategory . PHYSICAL , 70 , 100 , 20 , 25 , "Power doubles if user is burned, poisoned, or paralyzed." , - 1 , 0 , 3 ) ,
new AttackMove ( Moves . FOCUS_PUNCH , "Focus Punch (N)" , Type . FIGHTING , MoveCategory . PHYSICAL , 150 , 100 , 20 , - 1 , "If the user is hit before attacking, it flinches instead." , - 1 , - 3 , 3 ) ,
2023-04-19 21:52:14 +01:00
new AttackMove ( Moves . SMELLING_SALTS , "Smelling Salts" , Type . NORMAL , MoveCategory . PHYSICAL , 70 , 100 , 10 , - 1 , "Power doubles if opponent is paralyzed, but cures it." , - 1 , 0 , 3 ,
new MovePowerMultiplierAttr ( ( user : Pokemon , target : Pokemon , move : Move ) = > target . status ? . effect === StatusEffect . PARALYSIS ? 2 : 1 ) , new HealStatusEffectAttr ( false , StatusEffect . PARALYSIS ) ) ,
2023-04-22 06:09:35 +01:00
new SelfStatusMove ( Moves . FOLLOW_ME , "Follow Me (N)" , Type . NORMAL , - 1 , 20 , - 1 , "In Double Battle, the user takes all the attacks." , - 1 , 3 , 3 ) ,
new SelfStatusMove ( Moves . NATURE_POWER , "Nature Power (N)" , Type . NORMAL , - 1 , 20 , - 1 , "Uses a certain move based on the current terrain." , - 1 , 0 , 3 ) ,
2023-04-18 17:30:47 +01:00
new SelfStatusMove ( Moves . CHARGE , "Charge" , Type . ELECTRIC , - 1 , 20 , - 1 , "Raises user's Special Defense and next Electric move's power increases." , - 1 , 0 , 3 , new StatChangeAttr ( BattleStat . SPDEF , 1 , true ) ) , // TODO
2023-04-22 06:09:35 +01:00
new StatusMove ( Moves . TAUNT , "Taunt (N)" , Type . DARK , 100 , 20 , 87 , "Opponent can only use moves that attack." , - 1 , 0 , 3 ) ,
new SelfStatusMove ( Moves . HELPING_HAND , "Helping Hand (N)" , Type . NORMAL , - 1 , 20 , 130 , "In Double Battles, boosts the power of the partner's move." , - 1 , 5 , 3 ) , // TODO
new StatusMove ( Moves . TRICK , "Trick (N)" , Type . PSYCHIC , 100 , 10 , 109 , "Swaps held items with the opponent." , - 1 , 0 , 3 ) ,
new SelfStatusMove ( Moves . ROLE_PLAY , "Role Play (N)" , Type . PSYCHIC , - 1 , 10 , - 1 , "User copies the opponent's Ability." , - 1 , 0 , 3 ) ,
new SelfStatusMove ( Moves . WISH , "Wish (N)" , Type . NORMAL , - 1 , 10 , - 1 , "The user recovers HP in the following turn." , - 1 , 0 , 3 ) ,
new SelfStatusMove ( Moves . ASSIST , "Assist (N)" , Type . NORMAL , - 1 , 20 , - 1 , "User performs a move known by its allies at random." , - 1 , 0 , 3 ) ,
2023-04-22 18:16:45 +01:00
new SelfStatusMove ( Moves . INGRAIN , "Ingrain" , Type . GRASS , - 1 , 20 , - 1 , "User restores HP each turn. User cannot escape/switch." , - 1 , 0 , 3 ,
2023-04-23 03:14:53 +01:00
new NoTagOverlapConditionalAttr ( BattlerTagType . INGRAIN , true ) , new AddBattlerTagAttr ( BattlerTagType . INGRAIN , true ) ) ,
2023-04-16 02:51:08 +01:00
new AttackMove ( Moves . SUPERPOWER , "Superpower" , Type . FIGHTING , MoveCategory . PHYSICAL , 120 , 100 , 5 , - 1 , "Lowers user's Attack and Defense." , 100 , 0 , 3 ,
2023-04-11 04:15:06 +01:00
new StatChangeAttr ( [ BattleStat . ATK , BattleStat . DEF ] , - 1 , true ) ) ,
2023-04-22 06:09:35 +01:00
new SelfStatusMove ( Moves . MAGIC_COAT , "Magic Coat (N)" , Type . PSYCHIC , - 1 , 15 , - 1 , "Reflects moves that cause status conditions back to the attacker." , - 1 , 4 , 3 ) ,
new SelfStatusMove ( Moves . RECYCLE , "Recycle (N)" , Type . NORMAL , - 1 , 10 , - 1 , "User's used hold item is restored." , - 1 , 0 , 3 ) ,
new AttackMove ( Moves . REVENGE , "Revenge (N)" , Type . FIGHTING , MoveCategory . PHYSICAL , 60 , 100 , 10 , - 1 , "Power increases if user was hit first." , - 1 , - 4 , 3 ) ,
new AttackMove ( Moves . BRICK_BREAK , "Brick Break (N)" , Type . FIGHTING , MoveCategory . PHYSICAL , 75 , 100 , 15 , 58 , "Breaks through Reflect and Light Screen barriers." , - 1 , 0 , 3 ) ,
2023-04-19 21:52:14 +01:00
new StatusMove ( Moves . YAWN , "Yawn" , Type . NORMAL , - 1 , 10 , - 1 , "Puts opponent to sleep in the next turn." , - 1 , 0 , 3 ,
2023-04-22 00:30:04 +01:00
new ConditionalMoveAttr ( ( user : Pokemon , target : Pokemon , move : Move ) = > ! target . status ) , new NoTagOverlapConditionalAttr ( BattlerTagType . DROWSY ) , new AddBattlerTagAttr ( BattlerTagType . DROWSY ) ) ,
2023-04-22 06:09:35 +01:00
new AttackMove ( Moves . KNOCK_OFF , "Knock Off (N)" , Type . DARK , MoveCategory . PHYSICAL , 65 , 100 , 20 , - 1 , "Removes opponent's held item for the rest of the battle." , - 1 , 0 , 3 ) ,
new AttackMove ( Moves . ENDEAVOR , "Endeavor (N)" , Type . NORMAL , MoveCategory . PHYSICAL , - 1 , 100 , 5 , - 1 , "Reduces opponent's HP to same as user's." , - 1 , 0 , 3 ) ,
2023-04-22 00:30:04 +01:00
new AttackMove ( Moves . ERUPTION , "Eruption" , Type . FIRE , MoveCategory . SPECIAL , 150 , 100 , 5 , - 1 , "Stronger when the user's HP is higher." , - 1 , 0 , 3 , new HpPowerAttr ( ) ) ,
2023-04-22 06:09:35 +01:00
new StatusMove ( Moves . SKILL_SWAP , "Skill Swap (N)" , Type . PSYCHIC , - 1 , 10 , 98 , "The user swaps Abilities with the opponent." , - 1 , 0 , 3 ) ,
new StatusMove ( Moves . IMPRISON , "Imprison (N)" , Type . PSYCHIC , - 1 , 10 , 92 , "Opponent is unable to use moves that the user also knows." , - 1 , 0 , 3 ) ,
2023-04-19 21:52:14 +01:00
new SelfStatusMove ( Moves . REFRESH , "Refresh" , Type . NORMAL , - 1 , 20 , - 1 , "Cures paralysis, poison, and burns." , - 1 , 0 , 3 ,
new ConditionalMoveAttr ( ( user : Pokemon , target : Pokemon , move : Move ) = > user . status && ( user . status . effect === StatusEffect . PARALYSIS || user . status . effect === StatusEffect . POISON || user . status . effect === StatusEffect . TOXIC || user . status . effect === StatusEffect . BURN ) ) ,
new HealStatusEffectAttr ( true , StatusEffect . PARALYSIS , StatusEffect . POISON , StatusEffect . TOXIC , StatusEffect . BURN ) ) ,
2023-04-22 06:09:35 +01:00
new SelfStatusMove ( Moves . GRUDGE , "Grudge (N)" , Type . GHOST , - 1 , 5 , - 1 , "If the users faints after using this move, the PP for the opponent's last move is depleted." , - 1 , 0 , 3 ) ,
new SelfStatusMove ( Moves . SNATCH , "Snatch (N)" , Type . DARK , - 1 , 10 , - 1 , "Steals the effects of the opponent's next move." , - 1 , 4 , 3 ) ,
new AttackMove ( Moves . SECRET_POWER , "Secret Power (N)" , Type . NORMAL , MoveCategory . PHYSICAL , 70 , 100 , 20 , - 1 , "Effects of the attack vary with the location." , 30 , 0 , 3 ) ,
2023-04-16 02:51:08 +01:00
new AttackMove ( Moves . DIVE , "Dive" , Type . WATER , MoveCategory . PHYSICAL , 80 , 100 , 10 , - 1 , "Dives underwater on first turn, attacks on second turn." , - 1 , 0 , 3 ,
2023-04-13 17:16:36 +01:00
new ChargeAttr ( ChargeAnim . DIVE_CHARGING , 'hid\nunderwater!' ) ) ,
2023-04-16 02:51:08 +01:00
new AttackMove ( Moves . ARM_THRUST , "Arm Thrust" , Type . FIGHTING , MoveCategory . PHYSICAL , 15 , 100 , 20 , - 1 , "Hits 2-5 times in one turn." , - 1 , 0 , 3 , new MultiHitAttr ( ) ) ,
2023-04-22 00:30:04 +01:00
new SelfStatusMove ( Moves . CAMOUFLAGE , "Camouflage" , Type . NORMAL , - 1 , 20 , - 1 , "Changes user's type according to the location." , - 1 , 0 , 3 , new CopyBiomeTypeAttr ( ) ) ,
2023-04-18 17:30:47 +01:00
new SelfStatusMove ( Moves . TAIL_GLOW , "Tail Glow" , Type . BUG , - 1 , 20 , - 1 , "Drastically raises user's Special Attack." , - 1 , 0 , 3 , new StatChangeAttr ( BattleStat . SPATK , 3 , true ) ) ,
2023-04-16 02:51:08 +01:00
new AttackMove ( Moves . LUSTER_PURGE , "Luster Purge" , Type . PSYCHIC , MoveCategory . SPECIAL , 70 , 100 , 5 , - 1 , "May lower opponent's Special Defense." , 50 , 0 , 3 , new StatChangeAttr ( BattleStat . SPDEF , - 1 ) ) ,
new AttackMove ( Moves . MIST_BALL , "Mist Ball" , Type . PSYCHIC , MoveCategory . SPECIAL , 70 , 100 , 5 , - 1 , "May lower opponent's Special Attack." , 50 , 0 , 3 , new StatChangeAttr ( BattleStat . SPATK , - 1 ) ) ,
new StatusMove ( Moves . FEATHER_DANCE , "Feather Dance" , Type . FLYING , 100 , 15 , - 1 , "Sharply lowers opponent's Attack." , - 1 , 0 , 3 , new StatChangeAttr ( BattleStat . ATK , - 2 ) ) ,
new StatusMove ( Moves . TEETER_DANCE , "Teeter Dance" , Type . NORMAL , 100 , 20 , - 1 , "Confuses all Pokémon." , - 1 , 0 , 3 , new ConfuseAttr ( true ) , new ConfuseAttr ( ) ) ,
new AttackMove ( Moves . BLAZE_KICK , "Blaze Kick" , Type . FIRE , MoveCategory . PHYSICAL , 85 , 90 , 10 , - 1 , "High critical hit ratio. May burn opponent." , 10 , 0 , 3 , new HighCritAttr ( ) , new StatusEffectAttr ( StatusEffect . BURN ) ) ,
2023-04-22 00:30:04 +01:00
new SelfStatusMove ( Moves . MUD_SPORT , "Mud Sport" , Type . GROUND , - 1 , 15 , - 1 , "Weakens the power of Electric-type moves." , - 1 , 0 , 3 , new AddArenaTagAttr ( ArenaTagType . MUD_SPORT , 5 ) ) ,
2023-04-22 15:56:17 +01:00
new AttackMove ( Moves . ICE_BALL , "Ice Ball" , Type . ICE , MoveCategory . PHYSICAL , 30 , 90 , 20 , - 1 , "Doubles in power each turn for 5 turns." , - 1 , 0 , 3 , new ConsecutiveUseDoublePowerAttr ( 5 , true , true ) ) ,
2023-04-16 02:51:08 +01:00
new AttackMove ( Moves . NEEDLE_ARM , "Needle Arm" , Type . GRASS , MoveCategory . PHYSICAL , 60 , 100 , 15 , - 1 , "May cause flinching." , 30 , 0 , 3 , new FlinchAttr ( ) ) ,
2023-04-18 17:30:47 +01:00
new SelfStatusMove ( Moves . SLACK_OFF , "Slack Off" , Type . NORMAL , - 1 , 5 , - 1 , "User recovers half its max HP." , - 1 , 0 , 3 , new HealAttr ( ) ) ,
2023-04-16 02:51:08 +01:00
new AttackMove ( Moves . HYPER_VOICE , "Hyper Voice" , Type . NORMAL , MoveCategory . SPECIAL , 90 , 100 , 10 , 117 , "" , - 1 , 0 , 3 ) ,
new AttackMove ( Moves . POISON_FANG , "Poison Fang" , Type . POISON , MoveCategory . PHYSICAL , 50 , 100 , 15 , - 1 , "May badly poison opponent." , 50 , 0 , 3 , new StatusEffectAttr ( StatusEffect . TOXIC ) ) ,
new AttackMove ( Moves . CRUSH_CLAW , "Crush Claw" , Type . NORMAL , MoveCategory . PHYSICAL , 75 , 95 , 10 , - 1 , "May lower opponent's Defense." , 50 , 0 , 3 , new StatChangeAttr ( BattleStat . DEF , - 1 ) ) ,
2023-04-22 00:30:04 +01:00
new AttackMove ( Moves . BLAST_BURN , "Blast Burn" , Type . FIRE , MoveCategory . SPECIAL , 150 , 90 , 5 , 153 , "User must recharge next turn." , - 1 , 0 , 3 , new AddBattlerTagAttr ( BattlerTagType . RECHARGING , true ) ) ,
new AttackMove ( Moves . HYDRO_CANNON , "Hydro Cannon" , Type . WATER , MoveCategory . SPECIAL , 150 , 90 , 5 , 154 , "User must recharge next turn." , - 1 , 0 , 3 , new AddBattlerTagAttr ( BattlerTagType . RECHARGING , true ) ) ,
2023-04-16 02:51:08 +01:00
new AttackMove ( Moves . METEOR_MASH , "Meteor Mash" , Type . STEEL , MoveCategory . PHYSICAL , 90 , 90 , 10 , - 1 , "May raise user's Attack." , 20 , 0 , 3 , new StatChangeAttr ( BattleStat . ATK , 1 , true ) ) ,
new AttackMove ( Moves . ASTONISH , "Astonish" , Type . GHOST , MoveCategory . PHYSICAL , 30 , 100 , 15 , - 1 , "May cause flinching." , 30 , 0 , 3 , new FlinchAttr ( ) ) ,
2023-04-22 06:09:35 +01:00
new AttackMove ( Moves . WEATHER_BALL , "Weather Ball (N)" , Type . NORMAL , MoveCategory . SPECIAL , 50 , 100 , 10 , - 1 , "Move's power and type changes with the weather." , - 1 , 0 , 3 ) ,
new SelfStatusMove ( Moves . AROMATHERAPY , "Aromatherapy (N)" , Type . GRASS , - 1 , 5 , - 1 , "Cures all status problems in your party." , - 1 , 0 , 3 ) ,
2023-04-16 02:51:08 +01:00
new StatusMove ( Moves . FAKE_TEARS , "Fake Tears" , Type . DARK , 100 , 20 , 3 , "Sharply lowers opponent's Special Defense." , - 1 , 0 , 3 , new StatChangeAttr ( BattleStat . SPDEF , - 2 ) ) ,
new AttackMove ( Moves . AIR_CUTTER , "Air Cutter" , Type . FLYING , MoveCategory . SPECIAL , 60 , 95 , 25 , 40 , "High critical hit ratio." , - 1 , 0 , 3 , new HighCritAttr ( ) ) ,
new AttackMove ( Moves . OVERHEAT , "Overheat" , Type . FIRE , MoveCategory . SPECIAL , 130 , 90 , 5 , 157 , "Sharply lowers user's Special Attack." , 100 , 0 , 3 , new StatChangeAttr ( BattleStat . SPATK , - 2 , true ) ) ,
2023-04-22 06:09:35 +01:00
new StatusMove ( Moves . ODOR_SLEUTH , "Odor Sleuth (N)" , Type . NORMAL , - 1 , 40 , - 1 , "Resets opponent's Evasiveness, and allows Normal- and Fighting-type attacks to hit Ghosts." , - 1 , 0 , 3 ) ,
2023-04-16 02:51:08 +01:00
new AttackMove ( Moves . ROCK_TOMB , "Rock Tomb" , Type . ROCK , MoveCategory . PHYSICAL , 60 , 95 , 15 , 36 , "Lowers opponent's Speed." , 100 , 0 , 3 , new StatChangeAttr ( BattleStat . SPD , - 1 ) ) ,
new AttackMove ( Moves . SILVER_WIND , "Silver Wind" , Type . BUG , MoveCategory . SPECIAL , 60 , 100 , 5 , - 1 , "May raise all stats of user at once." , 10 , 0 , 3 ,
2023-04-11 04:15:06 +01:00
new StatChangeAttr ( [ BattleStat . ATK , BattleStat . DEF , BattleStat . SPATK , BattleStat . SPDEF , BattleStat . SPD ] , 1 , true ) ) ,
2023-04-16 02:51:08 +01:00
new StatusMove ( Moves . METAL_SOUND , "Metal Sound" , Type . STEEL , 85 , 40 , - 1 , "Sharply lowers opponent's Special Defense." , - 1 , 0 , 3 , new StatChangeAttr ( BattleStat . SPDEF , - 2 ) ) ,
new StatusMove ( Moves . GRASS_WHISTLE , "Grass Whistle" , Type . GRASS , 55 , 15 , - 1 , "Puts opponent to sleep." , - 1 , 0 , 3 , new StatusEffectAttr ( StatusEffect . SLEEP ) ) ,
new StatusMove ( Moves . TICKLE , "Tickle" , Type . NORMAL , 100 , 20 , - 1 , "Lowers opponent's Attack and Defense." , - 1 , 0 , 3 ,
2023-04-11 04:15:06 +01:00
new StatChangeAttr ( BattleStat . ATK , - 1 ) , new StatChangeAttr ( BattleStat . DEF , - 1 ) ) ,
2023-04-18 17:30:47 +01:00
new SelfStatusMove ( Moves . COSMIC_POWER , "Cosmic Power" , Type . PSYCHIC , - 1 , 20 , - 1 , "Raises user's Defense and Special Defense." , - 1 , 0 , 3 ,
2023-04-11 04:15:06 +01:00
new StatChangeAttr ( [ BattleStat . DEF , BattleStat . SPDEF ] , 1 , true ) ) ,
2023-04-22 00:30:04 +01:00
new AttackMove ( Moves . WATER_SPOUT , "Water Spout" , Type . WATER , MoveCategory . SPECIAL , 150 , 100 , 5 , - 1 , "The higher the user's HP, the higher the damage caused." , - 1 , 0 , 3 , new HpPowerAttr ( ) ) ,
2023-04-16 02:51:08 +01:00
new AttackMove ( Moves . SIGNAL_BEAM , "Signal Beam" , Type . BUG , MoveCategory . SPECIAL , 75 , 100 , 15 , - 1 , "May confuse opponent." , 10 , 0 , 3 , new ConfuseAttr ( ) ) ,
2023-04-19 21:52:14 +01:00
new AttackMove ( Moves . SHADOW_PUNCH , "Shadow Punch" , Type . GHOST , MoveCategory . PHYSICAL , 60 , - 1 , 20 , - 1 , "Ignores Accuracy and Evasiveness." , - 1 , 0 , 3 ) ,
2023-04-16 02:51:08 +01:00
new AttackMove ( Moves . EXTRASENSORY , "Extrasensory" , Type . PSYCHIC , MoveCategory . SPECIAL , 80 , 100 , 20 , - 1 , "May cause flinching." , 10 , 0 , 3 , new FlinchAttr ( ) ) ,
2023-04-22 00:30:04 +01:00
new AttackMove ( Moves . SKY_UPPERCUT , "Sky Uppercut" , Type . FIGHTING , MoveCategory . PHYSICAL , 85 , 90 , 15 , - 1 , "Hits the opponent, even during Fly." , - 1 , 0 , 3 , new HitsTagAttr ( BattlerTagType . FLYING ) ) ,
2023-04-22 20:01:48 +01:00
new AttackMove ( Moves . SAND_TOMB , "Sand Tomb" , Type . GROUND , MoveCategory . PHYSICAL , 35 , 85 , 15 , - 1 , "Traps opponent, damaging them for 4-5 turns." , 100 , 0 , 3 , new TrapAttr ( BattlerTagType . SAND_TOMB ) ) ,
2023-04-22 06:09:35 +01:00
new AttackMove ( Moves . SHEER_COLD , "Sheer Cold" , Type . ICE , MoveCategory . SPECIAL , - 1 , 30 , 5 , - 1 , "One-Hit-KO, if it hits." , - 1 , 0 , 3 , new OneHitKOAttr ( ) ) ,
2023-04-16 02:51:08 +01:00
new AttackMove ( Moves . MUDDY_WATER , "Muddy Water" , Type . WATER , MoveCategory . SPECIAL , 90 , 85 , 10 , - 1 , "May lower opponent's Accuracy." , 30 , 0 , 3 , new StatChangeAttr ( BattleStat . ACC , - 1 ) ) ,
new AttackMove ( Moves . BULLET_SEED , "Bullet Seed" , Type . GRASS , MoveCategory . PHYSICAL , 25 , 100 , 30 , 56 , "Hits 2-5 times in one turn." , - 1 , 0 , 3 , new MultiHitAttr ( ) ) ,
2023-04-19 21:52:14 +01:00
new AttackMove ( Moves . AERIAL_ACE , "Aerial Ace" , Type . FLYING , MoveCategory . PHYSICAL , 60 , - 1 , 20 , 27 , "Ignores Accuracy and Evasiveness." , - 1 , 0 , 3 ) ,
2023-04-16 02:51:08 +01:00
new AttackMove ( Moves . ICICLE_SPEAR , "Icicle Spear" , Type . ICE , MoveCategory . PHYSICAL , 25 , 100 , 30 , - 1 , "Hits 2-5 times in one turn." , - 1 , 0 , 3 , new MultiHitAttr ( ) ) ,
2023-04-18 17:30:47 +01:00
new SelfStatusMove ( Moves . IRON_DEFENSE , "Iron Defense" , Type . STEEL , - 1 , 15 , 104 , "Sharply raises user's Defense." , - 1 , 0 , 3 , new StatChangeAttr ( BattleStat . DEF , 2 , true ) ) ,
2023-04-23 03:14:53 +01:00
new StatusMove ( Moves . BLOCK , "Block" , Type . NORMAL , - 1 , 5 , - 1 , "Opponent cannot flee or switch." , - 1 , 0 , 3 ,
new ConditionalMoveAttr ( ( user : Pokemon , target : Pokemon , move : Move ) = > ! target . getTag ( BattlerTagType . TRAPPED ) ) , new AddBattlerTagAttr ( BattlerTagType . TRAPPED , false , 1 ) ) ,
2023-04-18 17:30:47 +01:00
new SelfStatusMove ( Moves . HOWL , "Howl" , Type . NORMAL , - 1 , 40 , - 1 , "Raises Attack of allies." , - 1 , 0 , 3 , new StatChangeAttr ( BattleStat . ATK , 1 , true ) ) , // TODO
2023-04-16 02:51:08 +01:00
new AttackMove ( Moves . DRAGON_CLAW , "Dragon Claw" , Type . DRAGON , MoveCategory . PHYSICAL , 80 , 100 , 15 , 78 , "" , - 1 , 0 , 3 ) ,
2023-04-22 00:30:04 +01:00
new AttackMove ( Moves . FRENZY_PLANT , "Frenzy Plant" , Type . GRASS , MoveCategory . SPECIAL , 150 , 90 , 5 , 155 , "User must recharge next turn." , - 1 , 0 , 3 , new AddBattlerTagAttr ( BattlerTagType . RECHARGING , true ) ) ,
2023-04-18 17:30:47 +01:00
new SelfStatusMove ( Moves . BULK_UP , "Bulk Up" , Type . FIGHTING , - 1 , 20 , 64 , "Raises user's Attack and Defense." , - 1 , 0 , 3 ,
2023-04-11 04:15:06 +01:00
new StatChangeAttr ( [ BattleStat . ATK , BattleStat . DEF ] , 1 , true ) ) ,
2023-04-16 02:51:08 +01:00
new AttackMove ( Moves . BOUNCE , "Bounce" , Type . FLYING , MoveCategory . PHYSICAL , 85 , 85 , 5 , - 1 , "Springs up on first turn, attacks on second. May paralyze opponent." , 30 , 0 , 3 ,
2023-04-22 00:30:04 +01:00
new ChargeAttr ( ChargeAnim . BOUNCE_CHARGING , 'sprang up!' , BattlerTagType . FLYING ) , new StatusEffectAttr ( StatusEffect . PARALYSIS ) ) ,
2023-04-16 02:51:08 +01:00
new AttackMove ( Moves . MUD_SHOT , "Mud Shot" , Type . GROUND , MoveCategory . SPECIAL , 55 , 95 , 15 , 35 , "Lowers opponent's Speed." , 100 , 0 , 3 , new StatChangeAttr ( BattleStat . SPD , - 1 ) ) ,
new AttackMove ( Moves . POISON_TAIL , "Poison Tail" , Type . POISON , MoveCategory . PHYSICAL , 50 , 100 , 25 , 26 , "High critical hit ratio. May poison opponent." , 10 , 0 , 3 , new HighCritAttr ( ) , new StatusEffectAttr ( StatusEffect . POISON ) ) ,
2023-04-22 06:09:35 +01:00
new AttackMove ( Moves . COVET , "Covet (N)" , Type . NORMAL , MoveCategory . PHYSICAL , 60 , 100 , 25 , - 1 , "Opponent's item is stolen by the user." , - 1 , 0 , 3 ) ,
2023-04-16 02:51:08 +01:00
new AttackMove ( Moves . VOLT_TACKLE , "Volt Tackle" , Type . ELECTRIC , MoveCategory . PHYSICAL , 120 , 100 , 15 , - 1 , "User receives recoil damage. May paralyze opponent." , 10 , 0 , 3 ,
2023-04-18 18:36:11 +01:00
new RecoilAttr ( ) , new StatusEffectAttr ( StatusEffect . PARALYSIS ) ) ,
2023-04-19 21:52:14 +01:00
new AttackMove ( Moves . MAGICAL_LEAF , "Magical Leaf" , Type . GRASS , MoveCategory . SPECIAL , 60 , - 1 , 20 , 33 , "Ignores Accuracy and Evasiveness." , - 1 , 0 , 3 ) ,
2023-04-22 00:30:04 +01:00
new SelfStatusMove ( Moves . WATER_SPORT , "Water Sport" , Type . WATER , - 1 , 15 , - 1 , "Weakens the power of Fire-type moves." , - 1 , 0 , 3 , new AddArenaTagAttr ( ArenaTagType . WATER_SPORT , 5 ) ) ,
2023-04-18 17:30:47 +01:00
new SelfStatusMove ( Moves . CALM_MIND , "Calm Mind" , Type . PSYCHIC , - 1 , 20 , 129 , "Raises user's Special Attack and Special Defense." , - 1 , 0 , 3 ,
2023-04-11 04:15:06 +01:00
new StatChangeAttr ( [ BattleStat . SPATK , BattleStat . SPDEF ] , 1 , true ) ) ,
2023-04-16 02:51:08 +01:00
new AttackMove ( Moves . LEAF_BLADE , "Leaf Blade" , Type . GRASS , MoveCategory . PHYSICAL , 90 , 100 , 15 , - 1 , "High critical hit ratio." , - 1 , 0 , 3 , new HighCritAttr ( ) ) ,
2023-04-18 17:30:47 +01:00
new SelfStatusMove ( Moves . DRAGON_DANCE , "Dragon Dance" , Type . DRAGON , - 1 , 20 , 100 , "Raises user's Attack and Speed." , - 1 , 0 , 3 ,
2023-04-11 04:15:06 +01:00
new StatChangeAttr ( [ BattleStat . ATK , BattleStat . SPD ] , 1 , true ) ) ,
2023-04-16 02:51:08 +01:00
new AttackMove ( Moves . ROCK_BLAST , "Rock Blast" , Type . ROCK , MoveCategory . PHYSICAL , 25 , 90 , 10 , 76 , "Hits 2-5 times in one turn." , - 1 , 0 , 3 , new MultiHitAttr ( ) ) ,
2023-04-19 21:52:14 +01:00
new AttackMove ( Moves . SHOCK_WAVE , "Shock Wave" , Type . ELECTRIC , MoveCategory . SPECIAL , 60 , - 1 , 20 , - 1 , "Ignores Accuracy and Evasiveness." , - 1 , 0 , 3 ) ,
2023-04-16 02:51:08 +01:00
new AttackMove ( Moves . WATER_PULSE , "Water Pulse" , Type . WATER , MoveCategory . SPECIAL , 60 , 100 , 20 , 11 , "May confuse opponent." , 20 , 0 , 3 , new ConfuseAttr ( ) ) ,
new AttackMove ( Moves . DOOM_DESIRE , "Doom Desire" , Type . STEEL , MoveCategory . SPECIAL , 140 , 100 , 5 , - 1 , "Damage occurs 2 turns later." , - 1 , 0 , 3 ,
2023-04-20 00:55:22 +01:00
new ChargeAttr ( ChargeAnim . DOOM_DESIRE_CHARGING , 'chose\nDOOM DESIRE as its destiny!' ) ) , // Fix this move to work properly
2023-04-16 02:51:08 +01:00
new AttackMove ( Moves . PSYCHO_BOOST , "Psycho Boost" , Type . PSYCHIC , MoveCategory . SPECIAL , 140 , 90 , 5 , - 1 , "Sharply lowers user's Special Attack." , 100 , 0 , 3 , new StatChangeAttr ( BattleStat . SPATK , - 2 , true ) ) ,
2023-04-22 00:30:04 +01:00
new SelfStatusMove ( Moves . ROOST , "Roost" , Type . FLYING , - 1 , 5 , - 1 , "User recovers half of its max HP and loses the Flying type temporarily." , - 1 , 0 , 4 , new HitHealAttr ( ) , new AddBattlerTagAttr ( BattlerTagType . IGNORE_FLYING , true , 1 ) ) ,
2023-04-22 06:09:35 +01:00
new SelfStatusMove ( Moves . GRAVITY , "Gravity (N)" , Type . PSYCHIC , - 1 , 5 , - 1 , "Prevents moves like Fly and Bounce and the Ability Levitate for 5 turns." , - 1 , 0 , 4 ) ,
new StatusMove ( Moves . MIRACLE_EYE , "Miracle Eye (N)" , Type . PSYCHIC , - 1 , 40 , - 1 , "Resets opponent's Evasiveness, removes Dark's Psychic immunity." , - 1 , 0 , 4 ) ,
new AttackMove ( Moves . WAKE_UP_SLAP , "Wake-Up Slap (N)" , Type . FIGHTING , MoveCategory . PHYSICAL , 70 , 100 , 10 , - 1 , "Power doubles if opponent is asleep, but wakes it up." , - 1 , 0 , 4 ) ,
2023-04-16 02:51:08 +01:00
new AttackMove ( Moves . HAMMER_ARM , "Hammer Arm" , Type . FIGHTING , MoveCategory . PHYSICAL , 100 , 90 , 10 , - 1 , "Lowers user's Speed." , 100 , 0 , 4 , new StatChangeAttr ( BattleStat . SPD , - 1 , true ) ) ,
2023-04-22 06:09:35 +01:00
new AttackMove ( Moves . GYRO_BALL , "Gyro Ball (N)" , Type . STEEL , MoveCategory . PHYSICAL , - 1 , 100 , 5 , - 1 , "The slower the user, the stronger the attack." , - 1 , 0 , 4 ) ,
2023-04-18 18:36:11 +01:00
new SelfStatusMove ( Moves . HEALING_WISH , "Healing Wish" , Type . PSYCHIC , - 1 , 10 , - 1 , "The user faints and the next Pokémon released is fully healed." , - 1 , 0 , 4 , new SacrificialAttr ( ) ) , // TODO
2023-04-20 00:55:22 +01:00
new AttackMove ( Moves . BRINE , "Brine" , Type . WATER , MoveCategory . SPECIAL , 65 , 100 , 10 , - 1 , "Power doubles if opponent's HP is less than 50%." , - 1 , 0 , 4 , new MovePowerMultiplierAttr ( ( user : Pokemon , target : Pokemon , move : Move ) = > target . getHpRatio ( ) < 0.5 ? 2 : 1 ) ) ,
2023-04-22 06:09:35 +01:00
new AttackMove ( Moves . NATURAL_GIFT , "Natural Gift (N)" , Type . NORMAL , MoveCategory . PHYSICAL , - 1 , 100 , 15 , - 1 , "Power and type depend on the user's held berry." , - 1 , 0 , 4 ) ,
2023-04-18 17:30:47 +01:00
new AttackMove ( Moves . FEINT , "Feint" , Type . NORMAL , MoveCategory . PHYSICAL , 30 , 100 , 10 , - 1 , "Only hits if opponent uses Protect or Detect in the same turn." , - 1 , 2 , 4 ,
2023-04-22 00:30:04 +01:00
new ConditionalMoveAttr ( ( user : Pokemon , target : Pokemon , move : Move ) = > ! ! target . getTag ( BattlerTagType . PROTECTED ) ) ) . ignoreProtect ( ) ,
2023-04-22 06:09:35 +01:00
new AttackMove ( Moves . PLUCK , "Pluck (N)" , Type . FLYING , MoveCategory . PHYSICAL , 60 , 100 , 20 , - 1 , "If the opponent is holding a berry, its effect is stolen by user." , - 1 , 0 , 4 ) ,
new SelfStatusMove ( Moves . TAILWIND , "Tailwind (N)" , Type . FLYING , - 1 , 15 , 113 , "Doubles Speed for 4 turns." , - 1 , 0 , 4 ) ,
2023-04-18 17:30:47 +01:00
new SelfStatusMove ( Moves . ACUPRESSURE , "Acupressure" , Type . NORMAL , - 1 , 30 , - 1 , "Sharply raises a random stat." , - 1 , 0 , 4 , new StatChangeAttr ( BattleStat . RAND , 2 , true ) ) ,
2023-04-22 06:09:35 +01:00
new AttackMove ( Moves . METAL_BURST , "Metal Burst (N)" , Type . STEEL , MoveCategory . PHYSICAL , - 1 , 100 , 10 , - 1 , "Deals damage equal to 1.5x opponent's attack." , - 1 , 0 , 4 ) ,
new AttackMove ( Moves . U_TURN , "U-turn (N)" , Type . BUG , MoveCategory . PHYSICAL , 70 , 100 , 20 , 60 , "User switches out immediately after attacking." , - 1 , 0 , 4 ) ,
2023-04-16 02:51:08 +01:00
new AttackMove ( Moves . CLOSE_COMBAT , "Close Combat" , Type . FIGHTING , MoveCategory . PHYSICAL , 120 , 100 , 5 , 167 , "Lowers user's Defense and Special Defense." , 100 , 0 , 4 ,
2023-04-11 04:15:06 +01:00
new StatChangeAttr ( [ BattleStat . DEF , BattleStat . SPDEF ] , - 1 , true ) ) ,
2023-04-22 06:09:35 +01:00
new AttackMove ( Moves . PAYBACK , "Payback (N)" , Type . DARK , MoveCategory . PHYSICAL , 50 , 100 , 10 , - 1 , "Power doubles if the user was attacked first." , - 1 , 0 , 4 ) ,
new AttackMove ( Moves . ASSURANCE , "Assurance (N)" , Type . DARK , MoveCategory . PHYSICAL , 60 , 100 , 10 , - 1 , "Power doubles if opponent already took damage in the same turn." , - 1 , 0 , 4 ) ,
new StatusMove ( Moves . EMBARGO , "Embargo (N)" , Type . DARK , 100 , 15 , - 1 , "Opponent cannot use items." , - 1 , 0 , 4 ) ,
new AttackMove ( Moves . FLING , "Fling (N)" , Type . DARK , MoveCategory . PHYSICAL , - 1 , 100 , 10 , 43 , "Power depends on held item." , - 1 , 0 , 4 ) ,
new StatusMove ( Moves . PSYCHO_SHIFT , "Psycho Shift (N)" , Type . PSYCHIC , 100 , 10 , - 1 , "Transfers user's status condition to the opponent." , - 1 , 0 , 4 ) ,
new AttackMove ( Moves . TRUMP_CARD , "Trump Card (N)" , Type . NORMAL , MoveCategory . SPECIAL , - 1 , - 1 , 5 , - 1 , "The lower the PP, the higher the power." , - 1 , 0 , 4 ) ,
new StatusMove ( Moves . HEAL_BLOCK , "Heal Block (N)" , Type . PSYCHIC , 100 , 15 , - 1 , "Prevents the opponent from restoring HP for 5 turns." , - 1 , 0 , 4 ) ,
new AttackMove ( Moves . WRING_OUT , "Wring Out (N)" , Type . NORMAL , MoveCategory . SPECIAL , - 1 , 100 , 5 , - 1 , "The higher the opponent's HP, the higher the damage." , - 1 , 0 , 4 ) ,
new SelfStatusMove ( Moves . POWER_TRICK , "Power Trick (N)" , Type . PSYCHIC , - 1 , 10 , - 1 , "User's own Attack and Defense switch." , - 1 , 0 , 4 ) ,
new StatusMove ( Moves . GASTRO_ACID , "Gastro Acid (N)" , Type . POISON , 100 , 10 , - 1 , "Cancels out the effect of the opponent's Ability." , - 1 , 0 , 4 ) ,
new StatusMove ( Moves . LUCKY_CHANT , "Lucky Chant (N)" , Type . NORMAL , - 1 , 30 , - 1 , "Opponent cannot land critical hits for 5 turns." , - 1 , 0 , 4 , new AddBattlerTagAttr ( BattlerTagType . NO_CRIT , false , 5 ) ) ,
new StatusMove ( Moves . ME_FIRST , "Me First (N)" , Type . NORMAL , - 1 , 20 , - 1 , "User copies the opponent's attack with 1.5× power." , - 1 , 0 , 4 ) ,
2023-04-22 00:30:04 +01:00
new SelfStatusMove ( Moves . COPYCAT , "Copycat" , Type . NORMAL , - 1 , 20 , - 1 , "Copies opponent's last move." , - 1 , 0 , 4 , new ConditionalMoveAttr ( targetMoveCopiableCondition ) , new CopyMoveAttr ( ) ) ,
2023-04-22 06:09:35 +01:00
new StatusMove ( Moves . POWER_SWAP , "Power Swap (N)" , Type . PSYCHIC , - 1 , 10 , - 1 , "User and opponent swap Attack and Special Attack." , - 1 , 0 , 4 ) ,
new StatusMove ( Moves . GUARD_SWAP , "Guard Swap (N)" , Type . PSYCHIC , - 1 , 10 , - 1 , "User and opponent swap Defense and Special Defense." , - 1 , 0 , 4 ) ,
new AttackMove ( Moves . PUNISHMENT , "Punishment (N)" , Type . DARK , MoveCategory . PHYSICAL , - 1 , 100 , 5 , - 1 , "Power increases when opponent's stats have been raised." , - 1 , 0 , 4 ) ,
new AttackMove ( Moves . LAST_RESORT , "Last Resort (N)" , Type . NORMAL , MoveCategory . PHYSICAL , 140 , 100 , 5 , - 1 , "Can only be used after all other moves are used." , - 1 , 0 , 4 ) ,
new StatusMove ( Moves . WORRY_SEED , "Worry Seed (N)" , Type . GRASS , 100 , 10 , - 1 , "Changes the opponent's Ability to Insomnia." , - 1 , 0 , 4 ) ,
new AttackMove ( Moves . SUCKER_PUNCH , "Sucker Punch (N)" , Type . DARK , MoveCategory . PHYSICAL , 70 , 100 , 5 , - 1 , "User attacks first, but only works if opponent is readying an attack." , - 1 , 0 , 4 ) ,
new StatusMove ( Moves . TOXIC_SPIKES , "Toxic Spikes (N)" , Type . POISON , - 1 , 20 , 91 , "Poisons opponents when they switch into battle." , - 1 , 0 , 4 ) ,
new StatusMove ( Moves . HEART_SWAP , "Heart Swap (N)" , Type . PSYCHIC , - 1 , 10 , - 1 , "Stat changes are swapped with the opponent." , - 1 , 0 , 4 ) ,
2023-04-19 21:52:14 +01:00
new SelfStatusMove ( Moves . AQUA_RING , "Aqua Ring" , Type . WATER , - 1 , 20 , - 1 , "Restores a little HP each turn." , - 1 , 0 , 4 ,
2023-04-22 18:16:45 +01:00
new NoTagOverlapConditionalAttr ( BattlerTagType . AQUA_RING , true ) , new AddBattlerTagAttr ( BattlerTagType . AQUA_RING , true ) ) ,
2023-04-22 06:09:35 +01:00
new SelfStatusMove ( Moves . MAGNET_RISE , "Magnet Rise (N)" , Type . ELECTRIC , - 1 , 10 , - 1 , "User becomes immune to Ground-type moves for 5 turns." , - 1 , 0 , 4 ) ,
2023-04-18 18:36:11 +01:00
new AttackMove ( Moves . FLARE_BLITZ , "Flare Blitz" , Type . FIRE , MoveCategory . PHYSICAL , 120 , 100 , 15 , 165 , "User receives recoil damage. May burn opponent." , 10 , 0 , 4 ,
new RecoilAttr ( ) , new StatusEffectAttr ( StatusEffect . BURN ) ) ,
2023-04-16 02:51:08 +01:00
new AttackMove ( Moves . FORCE_PALM , "Force Palm" , Type . FIGHTING , MoveCategory . PHYSICAL , 60 , 100 , 10 , - 1 , "May paralyze opponent." , 30 , 0 , 4 , new StatusEffectAttr ( StatusEffect . PARALYSIS ) ) ,
2023-04-19 21:52:14 +01:00
new AttackMove ( Moves . AURA_SPHERE , "Aura Sphere" , Type . FIGHTING , MoveCategory . SPECIAL , 80 , - 1 , 20 , 112 , "Ignores Accuracy and Evasiveness." , - 1 , 0 , 4 ) ,
2023-04-18 17:30:47 +01:00
new SelfStatusMove ( Moves . ROCK_POLISH , "Rock Polish" , Type . ROCK , - 1 , 20 , - 1 , "Sharply raises user's Speed." , - 1 , 0 , 4 , new StatChangeAttr ( BattleStat . SPD , 2 , true ) ) ,
2023-04-16 02:51:08 +01:00
new AttackMove ( Moves . POISON_JAB , "Poison Jab" , Type . POISON , MoveCategory . PHYSICAL , 80 , 100 , 20 , 83 , "May poison the opponent." , 30 , 0 , 4 , new StatusEffectAttr ( StatusEffect . POISON ) ) ,
new AttackMove ( Moves . DARK_PULSE , "Dark Pulse" , Type . DARK , MoveCategory . SPECIAL , 80 , 100 , 15 , 94 , "May cause flinching." , 20 , 0 , 4 , new FlinchAttr ( ) ) ,
2023-04-16 05:29:55 +01:00
new AttackMove ( Moves . NIGHT_SLASH , "Night Slash" , Type . DARK , MoveCategory . PHYSICAL , 70 , 100 , 15 , - 1 , "High critical hit ratio." , - 1 , 0 , 4 , new HighCritAttr ( ) ) ,
2023-04-16 02:51:08 +01:00
new AttackMove ( Moves . AQUA_TAIL , "Aqua Tail" , Type . WATER , MoveCategory . PHYSICAL , 90 , 90 , 10 , - 1 , "" , - 1 , 0 , 4 ) ,
new AttackMove ( Moves . SEED_BOMB , "Seed Bomb" , Type . GRASS , MoveCategory . PHYSICAL , 80 , 100 , 15 , 71 , "" , - 1 , 0 , 4 ) ,
new AttackMove ( Moves . AIR_SLASH , "Air Slash" , Type . FLYING , MoveCategory . SPECIAL , 75 , 95 , 15 , 65 , "May cause flinching." , 30 , 0 , 4 , new FlinchAttr ( ) ) ,
new AttackMove ( Moves . X_SCISSOR , "X-Scissor" , Type . BUG , MoveCategory . PHYSICAL , 80 , 100 , 15 , 105 , "" , - 1 , 0 , 4 ) ,
new AttackMove ( Moves . BUG_BUZZ , "Bug Buzz" , Type . BUG , MoveCategory . SPECIAL , 90 , 100 , 10 , 162 , "May lower opponent's Special Defense." , 10 , 0 , 4 , new StatChangeAttr ( BattleStat . SPDEF , - 1 ) ) ,
new AttackMove ( Moves . DRAGON_PULSE , "Dragon Pulse" , Type . DRAGON , MoveCategory . SPECIAL , 85 , 100 , 10 , 115 , "" , - 1 , 0 , 4 ) ,
new AttackMove ( Moves . DRAGON_RUSH , "Dragon Rush" , Type . DRAGON , MoveCategory . PHYSICAL , 100 , 75 , 10 , - 1 , "May cause flinching." , 20 , 0 , 4 , new FlinchAttr ( ) ) ,
new AttackMove ( Moves . POWER_GEM , "Power Gem" , Type . ROCK , MoveCategory . SPECIAL , 80 , 100 , 20 , 101 , "" , - 1 , 0 , 4 ) ,
2023-04-16 05:29:55 +01:00
new AttackMove ( Moves . DRAIN_PUNCH , "Drain Punch" , Type . FIGHTING , MoveCategory . PHYSICAL , 75 , 100 , 10 , 73 , "User recovers half the HP inflicted on opponent." , - 1 , 0 , 4 , new HitHealAttr ( ) ) ,
2023-04-16 02:51:08 +01:00
new AttackMove ( Moves . VACUUM_WAVE , "Vacuum Wave" , Type . FIGHTING , MoveCategory . SPECIAL , 40 , 100 , 30 , - 1 , "User attacks first." , - 1 , 0 , 4 ) ,
new AttackMove ( Moves . FOCUS_BLAST , "Focus Blast" , Type . FIGHTING , MoveCategory . SPECIAL , 120 , 70 , 5 , 158 , "May lower opponent's Special Defense." , 10 , 0 , 4 , new StatChangeAttr ( BattleStat . SPDEF , - 1 ) ) ,
new AttackMove ( Moves . ENERGY_BALL , "Energy Ball" , Type . GRASS , MoveCategory . SPECIAL , 90 , 100 , 10 , 119 , "May lower opponent's Special Defense." , 10 , 0 , 4 , new StatChangeAttr ( BattleStat . SPDEF , - 1 ) ) ,
2023-04-18 18:36:11 +01:00
new AttackMove ( Moves . BRAVE_BIRD , "Brave Bird" , Type . FLYING , MoveCategory . PHYSICAL , 120 , 100 , 15 , 164 , "User receives recoil damage." , - 1 , 0 , 4 , new RecoilAttr ( ) ) ,
2023-04-16 02:51:08 +01:00
new AttackMove ( Moves . EARTH_POWER , "Earth Power" , Type . GROUND , MoveCategory . SPECIAL , 90 , 100 , 10 , 133 , "May lower opponent's Special Defense." , 10 , 0 , 4 , new StatChangeAttr ( BattleStat . SPDEF , - 1 ) ) ,
2023-04-22 06:09:35 +01:00
new StatusMove ( Moves . SWITCHEROO , "Switcheroo (N)" , Type . DARK , 100 , 10 , - 1 , "Swaps held items with the opponent." , - 1 , 0 , 4 ) ,
2023-04-22 00:30:04 +01:00
new AttackMove ( Moves . GIGA_IMPACT , "Giga Impact" , Type . NORMAL , MoveCategory . PHYSICAL , 150 , 90 , 5 , 152 , "User must recharge next turn." , - 1 , 0 , 4 , new AddBattlerTagAttr ( BattlerTagType . RECHARGING , true ) ) ,
2023-04-18 17:30:47 +01:00
new SelfStatusMove ( Moves . NASTY_PLOT , "Nasty Plot" , Type . DARK , - 1 , 20 , 140 , "Sharply raises user's Special Attack." , - 1 , 0 , 4 , new StatChangeAttr ( BattleStat . SPATK , 2 , true ) ) ,
2023-04-16 02:51:08 +01:00
new AttackMove ( Moves . BULLET_PUNCH , "Bullet Punch" , Type . STEEL , MoveCategory . PHYSICAL , 40 , 100 , 30 , - 1 , "User attacks first." , - 1 , 1 , 4 ) ,
2023-04-22 06:09:35 +01:00
new AttackMove ( Moves . AVALANCHE , "Avalanche (N)" , Type . ICE , MoveCategory . PHYSICAL , 60 , 100 , 10 , 46 , "Power doubles if user took damage first." , - 1 , - 4 , 4 ) ,
new AttackMove ( Moves . ICE_SHARD , "Ice Shard (N)" , Type . ICE , MoveCategory . PHYSICAL , 40 , 100 , 30 , - 1 , "User attacks first." , - 1 , 1 , 4 ) ,
2023-04-16 05:29:55 +01:00
new AttackMove ( Moves . SHADOW_CLAW , "Shadow Claw" , Type . GHOST , MoveCategory . PHYSICAL , 70 , 100 , 15 , 61 , "High critical hit ratio." , - 1 , 0 , 4 , new HighCritAttr ( ) ) ,
2023-04-16 02:51:08 +01:00
new AttackMove ( Moves . THUNDER_FANG , "Thunder Fang" , Type . ELECTRIC , MoveCategory . PHYSICAL , 65 , 95 , 15 , 9 , "May cause flinching and/or paralyze opponent." , 10 , 0 , 4 , new FlinchAttr ( ) , new StatusEffectAttr ( StatusEffect . PARALYSIS ) ) ,
new AttackMove ( Moves . ICE_FANG , "Ice Fang" , Type . ICE , MoveCategory . PHYSICAL , 65 , 95 , 15 , 10 , "May cause flinching and/or freeze opponent." , 10 , 0 , 4 , new FlinchAttr ( ) , new StatusEffectAttr ( StatusEffect . FREEZE ) ) ,
new AttackMove ( Moves . FIRE_FANG , "Fire Fang" , Type . FIRE , MoveCategory . PHYSICAL , 65 , 95 , 15 , 8 , "May cause flinching and/or burn opponent." , 10 , 0 , 4 , new FlinchAttr ( ) , new StatusEffectAttr ( StatusEffect . BURN ) ) ,
new AttackMove ( Moves . SHADOW_SNEAK , "Shadow Sneak" , Type . GHOST , MoveCategory . PHYSICAL , 40 , 100 , 30 , - 1 , "User attacks first." , - 1 , 1 , 4 ) ,
new AttackMove ( Moves . MUD_BOMB , "Mud Bomb" , Type . GROUND , MoveCategory . SPECIAL , 65 , 85 , 10 , - 1 , "May lower opponent's Accuracy." , 30 , 0 , 4 , new StatChangeAttr ( BattleStat . ACC , - 1 ) ) ,
2023-04-16 05:29:55 +01:00
new AttackMove ( Moves . PSYCHO_CUT , "Psycho Cut" , Type . PSYCHIC , MoveCategory . PHYSICAL , 70 , 100 , 20 , - 1 , "High critical hit ratio." , - 1 , 0 , 4 , new HighCritAttr ( ) ) ,
2023-04-16 02:51:08 +01:00
new AttackMove ( Moves . ZEN_HEADBUTT , "Zen Headbutt" , Type . PSYCHIC , MoveCategory . PHYSICAL , 80 , 90 , 15 , 59 , "May cause flinching." , 20 , 0 , 4 , new FlinchAttr ( ) ) ,
new AttackMove ( Moves . MIRROR_SHOT , "Mirror Shot" , Type . STEEL , MoveCategory . SPECIAL , 65 , 85 , 10 , - 1 , "May lower opponent's Accuracy." , 30 , 0 , 4 , new StatChangeAttr ( BattleStat . ACC , - 1 ) ) ,
new AttackMove ( Moves . FLASH_CANNON , "Flash Cannon" , Type . STEEL , MoveCategory . SPECIAL , 80 , 100 , 10 , 93 , "May lower opponent's Special Defense." , 10 , 0 , 4 , new StatChangeAttr ( BattleStat . SPDEF , - 1 ) ) ,
new AttackMove ( Moves . ROCK_CLIMB , "Rock Climb" , Type . NORMAL , MoveCategory . PHYSICAL , 90 , 85 , 20 , - 1 , "May confuse opponent." , 20 , 0 , 4 , new ConfuseAttr ( ) ) ,
2023-04-17 05:46:50 +01:00
new StatusMove ( Moves . DEFOG , "Defog" , Type . FLYING , - 1 , 15 , - 1 , "Lowers opponent's Evasiveness and clears fog." , - 1 , 0 , 4 , new StatChangeAttr ( BattleStat . EVA , - 1 ) , new ClearWeatherAttr ( WeatherType . FOG ) ) ,
2023-04-22 06:09:35 +01:00
new StatusMove ( Moves . TRICK_ROOM , "Trick Room (N)" , Type . PSYCHIC , - 1 , 5 , 161 , "Slower Pokémon move first in the turn for 5 turns." , - 1 , 0 , 4 ) . ignoreProtect ( ) ,
2023-04-16 02:51:08 +01:00
new AttackMove ( Moves . DRACO_METEOR , "Draco Meteor" , Type . DRAGON , MoveCategory . SPECIAL , 130 , 90 , 5 , 169 , "Sharply lowers user's Special Attack." , 100 , - 7 , 4 , new StatChangeAttr ( BattleStat . SPATK , - 2 , true ) ) ,
new AttackMove ( Moves . DISCHARGE , "Discharge" , Type . ELECTRIC , MoveCategory . SPECIAL , 80 , 100 , 15 , - 1 , "May paralyze opponent." , 30 , 0 , 4 , new StatusEffectAttr ( StatusEffect . PARALYSIS ) ) ,
new AttackMove ( Moves . LAVA_PLUME , "Lava Plume" , Type . FIRE , MoveCategory . SPECIAL , 80 , 100 , 15 , - 1 , "May burn opponent." , 30 , 0 , 4 , new StatusEffectAttr ( StatusEffect . BURN ) ) ,
new AttackMove ( Moves . LEAF_STORM , "Leaf Storm" , Type . GRASS , MoveCategory . SPECIAL , 130 , 90 , 5 , 159 , "Sharply lowers user's Special Attack." , 100 , 0 , 4 , new StatChangeAttr ( BattleStat . SPATK , - 2 , true ) ) ,
new AttackMove ( Moves . POWER_WHIP , "Power Whip" , Type . GRASS , MoveCategory . PHYSICAL , 120 , 85 , 10 , - 1 , "" , - 1 , 0 , 4 ) ,
2023-04-22 00:30:04 +01:00
new AttackMove ( Moves . ROCK_WRECKER , "Rock Wrecker" , Type . ROCK , MoveCategory . PHYSICAL , 150 , 90 , 5 , - 1 , "User must recharge next turn." , - 1 , 0 , 4 , new AddBattlerTagAttr ( BattlerTagType . RECHARGING , true ) ) ,
2023-04-16 02:51:08 +01:00
new AttackMove ( Moves . CROSS_POISON , "Cross Poison" , Type . POISON , MoveCategory . PHYSICAL , 70 , 100 , 20 , - 1 , "High critical hit ratio. May poison opponent." , 10 , 0 , 4 ,
2023-04-11 04:15:06 +01:00
new HighCritAttr ( ) , new StatusEffectAttr ( StatusEffect . POISON ) ) ,
2023-04-16 02:51:08 +01:00
new AttackMove ( Moves . GUNK_SHOT , "Gunk Shot" , Type . POISON , MoveCategory . PHYSICAL , 120 , 80 , 5 , 102 , "May poison opponent." , 30 , 0 , 4 , new StatusEffectAttr ( StatusEffect . POISON ) ) ,
new AttackMove ( Moves . IRON_HEAD , "Iron Head" , Type . STEEL , MoveCategory . PHYSICAL , 80 , 100 , 15 , 99 , "May cause flinching." , 30 , 0 , 4 , new FlinchAttr ( ) ) ,
2023-04-19 21:52:14 +01:00
new AttackMove ( Moves . MAGNET_BOMB , "Magnet Bomb" , Type . STEEL , MoveCategory . PHYSICAL , 60 , - 1 , 20 , - 1 , "Ignores Accuracy and Evasiveness." , - 1 , 0 , 4 ) ,
2023-04-16 02:51:08 +01:00
new AttackMove ( Moves . STONE_EDGE , "Stone Edge" , Type . ROCK , MoveCategory . PHYSICAL , 100 , 80 , 5 , 150 , "High critical hit ratio." , - 1 , 0 , 4 , new HighCritAttr ( ) ) ,
2023-04-22 06:09:35 +01:00
new StatusMove ( Moves . CAPTIVATE , "Captivate (N)" , Type . NORMAL , 100 , 20 , - 1 , "Sharply lowers opponent's Special Attack if opposite gender." , - 1 , 0 , 4 ) , // TODO
new StatusMove ( Moves . STEALTH_ROCK , "Stealth Rock (N)" , Type . ROCK , - 1 , 20 , 116 , "Damages opponent switching into battle." , - 1 , 0 , 4 ) ,
2023-04-21 06:17:43 +01:00
new AttackMove ( Moves . GRASS_KNOT , "Grass Knot" , Type . GRASS , MoveCategory . SPECIAL , - 1 , 100 , 20 , 81 , "The heavier the opponent, the stronger the attack." , - 1 , 0 , 4 , new WeightPowerAttr ( ) ) ,
2023-04-16 02:51:08 +01:00
new AttackMove ( Moves . CHATTER , "Chatter" , Type . FLYING , MoveCategory . SPECIAL , 65 , 100 , 20 , - 1 , "Confuses opponent." , 100 , 0 , 4 , new ConfuseAttr ( ) ) ,
2023-04-22 06:09:35 +01:00
new AttackMove ( Moves . JUDGMENT , "Judgment (N)" , Type . NORMAL , MoveCategory . SPECIAL , 100 , 100 , 10 , - 1 , "Type depends on the Arceus Plate being held." , - 1 , 0 , 4 ) ,
new AttackMove ( Moves . BUG_BITE , "Bug Bite (N)" , Type . BUG , MoveCategory . PHYSICAL , 60 , 100 , 20 , - 1 , "Receives the effect from the opponent's held berry." , - 1 , 0 , 4 ) ,
2023-04-16 02:51:08 +01:00
new AttackMove ( Moves . CHARGE_BEAM , "Charge Beam" , Type . ELECTRIC , MoveCategory . SPECIAL , 50 , 90 , 10 , 23 , "May raise user's Special Attack." , 70 , 0 , 4 , new StatChangeAttr ( BattleStat . SPATK , 1 , true ) ) ,
2023-04-18 18:36:11 +01:00
new AttackMove ( Moves . WOOD_HAMMER , "Wood Hammer" , Type . GRASS , MoveCategory . PHYSICAL , 120 , 100 , 15 , - 1 , "User receives recoil damage." , - 1 , 0 , 4 , new RecoilAttr ( ) ) ,
2023-04-16 02:51:08 +01:00
new AttackMove ( Moves . AQUA_JET , "Aqua Jet" , Type . WATER , MoveCategory . PHYSICAL , 40 , 100 , 20 , - 1 , "User attacks first." , - 1 , 1 , 4 ) ,
2023-04-16 05:29:55 +01:00
new AttackMove ( Moves . ATTACK_ORDER , "Attack Order" , Type . BUG , MoveCategory . PHYSICAL , 90 , 100 , 15 , - 1 , "High critical hit ratio." , - 1 , 0 , 4 , new HighCritAttr ( ) ) ,
2023-04-18 17:30:47 +01:00
new SelfStatusMove ( Moves . DEFEND_ORDER , "Defend Order" , Type . BUG , - 1 , 10 , - 1 , "Raises user's Defense and Special Defense." , - 1 , 0 , 4 ,
2023-04-11 04:15:06 +01:00
new StatChangeAttr ( [ BattleStat . DEF , BattleStat . SPDEF ] , 1 , true ) ) ,
2023-04-18 17:30:47 +01:00
new SelfStatusMove ( Moves . HEAL_ORDER , "Heal Order" , Type . BUG , - 1 , 10 , - 1 , "User recovers half its max HP." , - 1 , 0 , 4 , new HealAttr ( 0.5 ) ) ,
2023-04-18 18:36:11 +01:00
new AttackMove ( Moves . HEAD_SMASH , "Head Smash" , Type . ROCK , MoveCategory . PHYSICAL , 150 , 80 , 5 , - 1 , "User receives recoil damage." , - 1 , 0 , 4 , new RecoilAttr ( ) ) ,
2023-04-16 02:51:08 +01:00
new AttackMove ( Moves . DOUBLE_HIT , "Double Hit" , Type . NORMAL , MoveCategory . PHYSICAL , 35 , 90 , 10 , - 1 , "Hits twice in one turn." , - 1 , 0 , 4 , new MultiHitAttr ( MultiHitType . _2 ) ) ,
2023-04-22 00:30:04 +01:00
new AttackMove ( Moves . ROAR_OF_TIME , "Roar of Time" , Type . DRAGON , MoveCategory . SPECIAL , 150 , 90 , 5 , - 1 , "User must recharge next turn." , - 1 , 0 , 4 , new AddBattlerTagAttr ( BattlerTagType . RECHARGING , true ) ) ,
2023-04-16 02:51:08 +01:00
new AttackMove ( Moves . SPACIAL_REND , "Spacial Rend" , Type . DRAGON , MoveCategory . SPECIAL , 100 , 95 , 5 , - 1 , "High critical hit ratio." , - 1 , 0 , 4 , new HighCritAttr ( ) ) ,
2023-04-18 18:36:11 +01:00
new SelfStatusMove ( Moves . LUNAR_DANCE , "Lunar Dance" , Type . PSYCHIC , - 1 , 10 , - 1 , "The user faints but the next Pokémon released is fully healed." , - 1 , 0 , 4 , new SacrificialAttr ( ) ) , // TODO
2023-04-22 06:09:35 +01:00
new AttackMove ( Moves . CRUSH_GRIP , "Crush Grip (N)" , Type . NORMAL , MoveCategory . PHYSICAL , - 1 , 100 , 5 , - 1 , "More powerful when opponent has higher HP." , - 1 , 0 , 4 ) ,
2023-04-22 20:01:48 +01:00
new AttackMove ( Moves . MAGMA_STORM , "Magma Storm" , Type . FIRE , MoveCategory . SPECIAL , 100 , 75 , 5 , - 1 , "Traps opponent, damaging them for 4-5 turns." , 100 , 0 , 4 , new TrapAttr ( BattlerTagType . MAGMA_STORM ) ) ,
2023-04-16 02:51:08 +01:00
new StatusMove ( Moves . DARK_VOID , "Dark Void" , Type . DARK , 50 , 10 , - 1 , "Puts all adjacent opponents to sleep." , - 1 , 0 , 4 , new StatusEffectAttr ( StatusEffect . SLEEP ) ) ,
new AttackMove ( Moves . SEED_FLARE , "Seed Flare" , Type . GRASS , MoveCategory . SPECIAL , 120 , 85 , 5 , - 1 , "May lower opponent's Special Defense." , 40 , 0 , 4 , new StatChangeAttr ( BattleStat . SPDEF , - 1 ) ) ,
new AttackMove ( Moves . OMINOUS_WIND , "Ominous Wind" , Type . GHOST , MoveCategory . SPECIAL , 60 , 100 , 5 , - 1 , "May raise all user's stats at once." , 10 , 0 , 4 ,
2023-04-11 04:15:06 +01:00
new StatChangeAttr ( [ BattleStat . ATK , BattleStat . DEF , BattleStat . SPATK , BattleStat . SPDEF , BattleStat . SPD ] , 1 , true ) ) ,
2023-04-16 02:51:08 +01:00
new AttackMove ( Moves . SHADOW_FORCE , "Shadow Force" , Type . GHOST , MoveCategory . PHYSICAL , 120 , 100 , 5 , - 1 , "Disappears on first turn, attacks on second. Can strike through Protect/Detect." , - 1 , 0 , 4 ,
2023-04-18 17:30:47 +01:00
new ChargeAttr ( ChargeAnim . SHADOW_FORCE_CHARGING , 'vanished\ninstantly!' ) ) . ignoreProtect ( ) ,
new SelfStatusMove ( Moves . HONE_CLAWS , "Hone Claws" , Type . DARK , - 1 , 15 , - 1 , "Raises user's Attack and Accuracy." , - 1 , 0 , 5 ,
2023-04-11 04:15:06 +01:00
new StatChangeAttr ( [ BattleStat . ATK , BattleStat . ACC ] , 1 , true ) ) ,
2023-04-22 06:09:35 +01:00
new SelfStatusMove ( Moves . WIDE_GUARD , "Wide Guard (N)" , Type . ROCK , - 1 , 10 , - 1 , "Protects the user's team from multi-target attacks." , - 1 , 3 , 5 ) ,
new StatusMove ( Moves . GUARD_SPLIT , "Guard Split (N)" , Type . PSYCHIC , - 1 , 10 , - 1 , "Averages Defense and Special Defense with the target." , - 1 , 0 , 5 ) ,
new StatusMove ( Moves . POWER_SPLIT , "Power Split (N)" , Type . PSYCHIC , - 1 , 10 , - 1 , "Averages Attack and Special Attack with the target." , - 1 , 0 , 5 ) ,
new StatusMove ( Moves . WONDER_ROOM , "Wonder Room (N)" , Type . PSYCHIC , - 1 , 10 , - 1 , "Swaps every Pokémon's Defense and Special Defense for 5 turns." , - 1 , - 7 , 5 ) . ignoreProtect ( ) ,
new AttackMove ( Moves . PSYSHOCK , "Psyshock (N)" , Type . PSYCHIC , MoveCategory . SPECIAL , 80 , 100 , 10 , 54 , "Inflicts damage based on the target's Defense, not Special Defense." , - 1 , 0 , 5 ) ,
new AttackMove ( Moves . VENOSHOCK , "Venoshock (N)" , Type . POISON , MoveCategory . SPECIAL , 65 , 100 , 10 , 45 , "Inflicts double damage if the target is poisoned." , - 1 , 0 , 5 ) ,
2023-04-18 17:30:47 +01:00
new SelfStatusMove ( Moves . AUTOTOMIZE , "Autotomize" , Type . STEEL , - 1 , 15 , - 1 , "Reduces weight and sharply raises Speed." , - 1 , 0 , 5 , new StatChangeAttr ( BattleStat . SPD , 2 , true ) ) , // TODO
2023-04-22 06:09:35 +01:00
new SelfStatusMove ( Moves . RAGE_POWDER , "Rage Powder (N)" , Type . BUG , - 1 , 20 , - 1 , "Forces attacks to hit user, not team-mates." , - 1 , 3 , 5 ) ,
new StatusMove ( Moves . TELEKINESIS , "Telekinesis (N)" , Type . PSYCHIC , - 1 , 15 , - 1 , "Ignores opponent's Evasiveness for three turns, add Ground immunity." , - 1 , 0 , 5 ) ,
new StatusMove ( Moves . MAGIC_ROOM , "Magic Room (N)" , Type . PSYCHIC , - 1 , 10 , - 1 , "Suppresses the effects of held items for five turns." , - 1 , - 7 , 5 ) . ignoreProtect ( ) ,
new AttackMove ( Moves . SMACK_DOWN , "Smack Down (N)" , Type . ROCK , MoveCategory . PHYSICAL , 50 , 100 , 15 , - 1 , "Makes Flying-type Pokémon vulnerable to Ground moves." , 100 , 0 , 5 ) , // TODO, logic with fly
new AttackMove ( Moves . STORM_THROW , "Storm Throw (N)" , Type . FIGHTING , MoveCategory . PHYSICAL , 60 , 100 , 10 , - 1 , "Always results in a critical hit." , 100 , 0 , 5 ) , // TODO
new AttackMove ( Moves . FLAME_BURST , "Flame Burst" , Type . FIRE , MoveCategory . SPECIAL , 70 , 100 , 15 , - 1 , "May also injure nearby Pokémon." , - 1 , 0 , 5 ) , // TODO
2023-04-16 02:51:08 +01:00
new AttackMove ( Moves . SLUDGE_WAVE , "Sludge Wave" , Type . POISON , MoveCategory . SPECIAL , 95 , 100 , 10 , - 1 , "May poison opponent." , 10 , 0 , 5 , new StatusEffectAttr ( StatusEffect . POISON ) ) ,
2023-04-18 17:30:47 +01:00
new SelfStatusMove ( Moves . QUIVER_DANCE , "Quiver Dance" , Type . BUG , - 1 , 20 , - 1 , "Raises user's Special Attack, Special Defense and Speed." , - 1 , 0 , 5 ,
2023-04-11 04:15:06 +01:00
new StatChangeAttr ( [ BattleStat . SPATK , BattleStat . SPDEF , BattleStat . SPD ] , 1 , true ) ) ,
2023-04-22 06:09:35 +01:00
new AttackMove ( Moves . HEAVY_SLAM , "Heavy Slam (N)" , Type . STEEL , MoveCategory . PHYSICAL , - 1 , 100 , 10 , 121 , "The heavier the user, the stronger the attack." , - 1 , 0 , 5 ) ,
new AttackMove ( Moves . SYNCHRONOISE , "Synchronoise (N)" , Type . PSYCHIC , MoveCategory . SPECIAL , 120 , 100 , 10 , - 1 , "Hits any Pokémon that shares a type with the user." , - 1 , 0 , 5 ) ,
new AttackMove ( Moves . ELECTRO_BALL , "Electro Ball (N)" , Type . ELECTRIC , MoveCategory . SPECIAL , - 1 , 100 , 10 , 72 , "The faster the user, the stronger the attack." , - 1 , 0 , 5 ) ,
new StatusMove ( Moves . SOAK , "Soak (N)" , Type . WATER , 100 , 20 , - 1 , "Changes the target's type to water." , - 1 , 0 , 5 ) ,
2023-04-16 02:51:08 +01:00
new AttackMove ( Moves . FLAME_CHARGE , "Flame Charge" , Type . FIRE , MoveCategory . PHYSICAL , 50 , 100 , 20 , 38 , "Raises user's Speed." , 100 , 0 , 5 , new StatChangeAttr ( BattleStat . SPD , 1 , true ) ) ,
2023-04-18 17:30:47 +01:00
new SelfStatusMove ( Moves . COIL , "Coil" , Type . POISON , - 1 , 20 , - 1 , "Raises user's Attack, Defense and Accuracy." , - 1 , 0 , 5 ,
2023-04-11 04:15:06 +01:00
new StatChangeAttr ( [ BattleStat . ATK , BattleStat . DEF , BattleStat . ACC ] , 1 , true ) ) ,
2023-04-16 02:51:08 +01:00
new AttackMove ( Moves . LOW_SWEEP , "Low Sweep" , Type . FIGHTING , MoveCategory . PHYSICAL , 65 , 100 , 20 , 39 , "Lowers opponent's Speed." , 100 , 0 , 5 , new StatChangeAttr ( BattleStat . SPD , - 1 ) ) ,
new AttackMove ( Moves . ACID_SPRAY , "Acid Spray" , Type . POISON , MoveCategory . SPECIAL , 40 , 100 , 20 , 13 , "Sharply lowers opponent's Special Defense." , 100 , 0 , 5 , new StatChangeAttr ( BattleStat . SPDEF , - 2 ) ) ,
2023-04-22 06:09:35 +01:00
new AttackMove ( Moves . FOUL_PLAY , "Foul Play (N)" , Type . DARK , MoveCategory . PHYSICAL , 95 , 100 , 15 , 62 , "Uses the opponent's Attack stat." , - 1 , 0 , 5 ) ,
new StatusMove ( Moves . SIMPLE_BEAM , "Simple Beam (N)" , Type . NORMAL , 100 , 15 , - 1 , "Changes target's ability to Simple." , - 1 , 0 , 5 ) ,
new StatusMove ( Moves . ENTRAINMENT , "Entrainment (N)" , Type . NORMAL , 100 , 15 , - 1 , "Makes target's ability same as user's." , - 1 , 0 , 5 ) ,
new StatusMove ( Moves . AFTER_YOU , "After You (N)" , Type . NORMAL , - 1 , 15 , - 1 , "Gives target priority in the next turn." , - 1 , 0 , 5 ) . ignoreProtect ( ) ,
new AttackMove ( Moves . ROUND , "Round" , Type . NORMAL , MoveCategory . SPECIAL , 60 , 100 , 15 , - 1 , "Power increases if teammates use it in the same turn." , - 1 , 0 , 5 ) , // TODO
2023-04-22 15:56:17 +01:00
new AttackMove ( Moves . ECHOED_VOICE , "Echoed Voice" , Type . NORMAL , MoveCategory . SPECIAL , 40 , 100 , 15 , - 1 , "Power increases each turn." , - 1 , 0 , 5 , new ConsecutiveUseMultiBasePowerAttr ( 5 , false ) ) ,
2023-04-22 06:09:35 +01:00
new AttackMove ( Moves . CHIP_AWAY , "Chip Away (N)" , Type . NORMAL , MoveCategory . PHYSICAL , 70 , 100 , 20 , - 1 , "Ignores opponent's stat changes." , - 1 , 0 , 5 ) ,
new AttackMove ( Moves . CLEAR_SMOG , "Clear Smog (N)" , Type . POISON , MoveCategory . SPECIAL , 50 , - 1 , 15 , - 1 , "Removes all of the target's stat changes." , - 1 , 0 , 5 ) ,
new AttackMove ( Moves . STORED_POWER , "Stored Power (N)" , Type . PSYCHIC , MoveCategory . SPECIAL , 20 , 100 , 10 , 41 , "Power increases when user's stats have been raised." , - 1 , 0 , 5 ) ,
new SelfStatusMove ( Moves . QUICK_GUARD , "Quick Guard (N)" , Type . FIGHTING , - 1 , 15 , - 1 , "Protects the user's team from high-priority moves." , - 1 , 3 , 5 ) ,
new StatusMove ( Moves . ALLY_SWITCH , "Ally Switch (N)" , Type . PSYCHIC , - 1 , 15 , - 1 , "User switches with opposite teammate." , - 1 , 0 , 5 ) . ignoreProtect ( ) , // TODO
2023-04-16 02:51:08 +01:00
new AttackMove ( Moves . SCALD , "Scald" , Type . WATER , MoveCategory . SPECIAL , 80 , 100 , 15 , - 1 , "May burn opponent." , 30 , 1 , 5 , new StatusEffectAttr ( StatusEffect . BURN ) ) ,
2023-04-18 17:30:47 +01:00
new SelfStatusMove ( Moves . SHELL_SMASH , "Shell Smash" , Type . NORMAL , - 1 , 15 , - 1 , "Sharply raises user's Attack, Special Attack and Speed but lowers Defense and Special Defense." , - 1 , 0 , 5 ,
2023-04-11 04:15:06 +01:00
new StatChangeAttr ( [ BattleStat . ATK , BattleStat . SPATK ] , 2 , true ) , new StatChangeAttr ( [ BattleStat . DEF , BattleStat . SPDEF ] , - 1 , true ) ) ,
2023-04-18 17:30:47 +01:00
new StatusMove ( Moves . HEAL_PULSE , "Heal Pulse" , Type . PSYCHIC , - 1 , 10 , - 1 , "Restores half the target's max HP." , - 1 , 0 , 5 , new HealAttr ( 0.5 , false , false ) ) ,
2023-04-22 00:30:04 +01:00
new AttackMove ( Moves . HEX , "Hex" , Type . GHOST , MoveCategory . SPECIAL , 65 , 100 , 10 , 29 , "Inflicts more damage if the target has a status condition." , - 1 , 0 , 5 ,
new MovePowerMultiplierAttr ( ( user : Pokemon , target : Pokemon , move : Move ) = > target . status ? 2 : 1 ) ) ,
2023-04-16 02:51:08 +01:00
new AttackMove ( Moves . SKY_DROP , "Sky Drop" , Type . FLYING , MoveCategory . PHYSICAL , 60 , 100 , 10 , - 1 , "Takes opponent into the air on first turn, drops them on second turn." , - 1 , 0 , 5 ,
2023-04-22 00:30:04 +01:00
new ChargeAttr ( ChargeAnim . SKY_DROP_CHARGING , 'took {TARGET}\ninto the sky!' , BattlerTagType . FLYING ) ) , // TODO: Add 2nd turn message
2023-04-18 17:30:47 +01:00
new SelfStatusMove ( Moves . SHIFT_GEAR , "Shift Gear" , Type . STEEL , - 1 , 10 , - 1 , "Raises user's Attack and sharply raises Speed." , - 1 , 0 , 5 ,
2023-04-11 04:15:06 +01:00
new StatChangeAttr ( BattleStat . ATK , 1 , true ) , new StatChangeAttr ( BattleStat . SPD , 2 , true ) ) ,
2023-04-22 06:09:35 +01:00
new AttackMove ( Moves . CIRCLE_THROW , "Circle Throw (N)" , Type . FIGHTING , MoveCategory . PHYSICAL , 60 , 90 , 10 , - 1 , "In battles, the opponent switches. In the wild, the Pokémon runs." , - 1 , - 6 , 5 ) ,
new AttackMove ( Moves . INCINERATE , "Incinerate (N)" , Type . FIRE , MoveCategory . SPECIAL , 60 , 100 , 15 , - 1 , "Destroys the target's held berry." , - 1 , 0 , 5 ) ,
2023-04-16 02:51:08 +01:00
new StatusMove ( Moves . QUASH , "Quash" , Type . DARK , 100 , 15 , - 1 , "Makes the target act last this turn." , - 1 , 0 , 5 ) ,
2023-04-22 06:09:35 +01:00
new AttackMove ( Moves . ACROBATICS , "Acrobatics (N)" , Type . FLYING , MoveCategory . PHYSICAL , 55 , 100 , 15 , 14 , "Stronger when the user does not have a held item." , - 1 , 0 , 5 ) ,
2023-04-22 00:30:04 +01:00
new StatusMove ( Moves . REFLECT_TYPE , "Reflect Type" , Type . NORMAL , - 1 , 15 , - 1 , "User becomes the target's type." , - 1 , 0 , 5 , new CopyTypeAttr ( ) ) ,
2023-04-22 06:09:35 +01:00
new AttackMove ( Moves . RETALIATE , "Retaliate (N)" , Type . NORMAL , MoveCategory . PHYSICAL , 70 , 100 , 5 , - 1 , "Inflicts double damage if a teammate fainted on the last turn." , - 1 , 0 , 5 ) ,
2023-04-18 18:36:11 +01:00
new AttackMove ( Moves . FINAL_GAMBIT , "Final Gambit" , Type . FIGHTING , MoveCategory . SPECIAL , - 1 , 100 , 5 , - 1 , "Inflicts damage equal to the user's remaining HP. User faints." , - 1 , 0 , 5 , new UserHpDamageAttr ( ) , new SacrificialAttr ( ) ) ,
2023-04-22 06:09:35 +01:00
new StatusMove ( Moves . BESTOW , "Bestow (N)" , Type . NORMAL , - 1 , 15 , - 1 , "Gives the user's held item to the target." , - 1 , 0 , 5 ) . ignoreProtect ( ) ,
2023-04-16 02:51:08 +01:00
new AttackMove ( Moves . INFERNO , "Inferno" , Type . FIRE , MoveCategory . SPECIAL , 100 , 50 , 5 , - 1 , "Burns opponent." , 100 , 0 , 5 , new StatusEffectAttr ( StatusEffect . BURN ) ) ,
2023-04-22 06:09:35 +01:00
new AttackMove ( Moves . WATER_PLEDGE , "Water Pledge (N)" , Type . WATER , MoveCategory . SPECIAL , 80 , 100 , 10 , 145 , "Added effects appear if preceded by Fire Pledge or succeeded by Grass Pledge." , - 1 , 0 , 5 ) ,
new AttackMove ( Moves . FIRE_PLEDGE , "Fire Pledge (N)" , Type . FIRE , MoveCategory . SPECIAL , 80 , 100 , 10 , 144 , "Added effects appear if combined with Grass Pledge or Water Pledge." , - 1 , 0 , 5 ) ,
new AttackMove ( Moves . GRASS_PLEDGE , "Grass Pledge (N)" , Type . GRASS , MoveCategory . SPECIAL , 80 , 100 , 10 , 146 , "Added effects appear if preceded by Water Pledge or succeeded by Fire Pledge." , - 1 , 0 , 5 ) ,
new AttackMove ( Moves . VOLT_SWITCH , "Volt Switch (N)" , Type . ELECTRIC , MoveCategory . SPECIAL , 70 , 100 , 20 , 48 , "User must switch out after attacking." , - 1 , 0 , 5 ) ,
2023-04-16 02:51:08 +01:00
new AttackMove ( Moves . STRUGGLE_BUG , "Struggle Bug" , Type . BUG , MoveCategory . SPECIAL , 50 , 100 , 20 , 15 , "Lowers opponent's Special Attack." , 100 , 0 , 5 , new StatChangeAttr ( BattleStat . SPATK , - 1 ) ) ,
new AttackMove ( Moves . BULLDOZE , "Bulldoze" , Type . GROUND , MoveCategory . PHYSICAL , 60 , 100 , 20 , 28 , "Lowers opponent's Speed." , 100 , 0 , 5 , new StatChangeAttr ( BattleStat . SPD , - 1 ) ) ,
2023-04-22 06:09:35 +01:00
new AttackMove ( Moves . FROST_BREATH , "Frost Breath (N)" , Type . ICE , MoveCategory . SPECIAL , 60 , 90 , 10 , - 1 , "Always results in a critical hit." , 100 , 0 , 5 ) , // TODO
new AttackMove ( Moves . DRAGON_TAIL , "Dragon Tail (N)" , Type . DRAGON , MoveCategory . PHYSICAL , 60 , 90 , 10 , 44 , "In battles, the opponent switches. In the wild, the Pokémon runs." , - 1 , - 6 , 5 ) ,
2023-04-18 17:30:47 +01:00
new SelfStatusMove ( Moves . WORK_UP , "Work Up" , Type . NORMAL , - 1 , 30 , - 1 , "Raises user's Attack and Special Attack." , - 1 , 0 , 5 ,
2023-04-11 04:15:06 +01:00
new StatChangeAttr ( [ BattleStat . ATK , BattleStat . SPATK ] , 1 , true ) ) ,
2023-04-16 02:51:08 +01:00
new AttackMove ( Moves . ELECTROWEB , "Electroweb" , Type . ELECTRIC , MoveCategory . SPECIAL , 55 , 95 , 15 , - 1 , "Lowers opponent's Speed." , 100 , 0 , 5 , new StatChangeAttr ( BattleStat . SPD , - 1 ) ) ,
2023-04-18 18:36:11 +01:00
new AttackMove ( Moves . WILD_CHARGE , "Wild Charge" , Type . ELECTRIC , MoveCategory . PHYSICAL , 90 , 100 , 15 , 147 , "User receives recoil damage." , - 1 , 0 , 5 , new RecoilAttr ( ) ) ,
2023-04-16 05:29:55 +01:00
new AttackMove ( Moves . DRILL_RUN , "Drill Run" , Type . GROUND , MoveCategory . PHYSICAL , 80 , 95 , 10 , 106 , "High critical hit ratio." , - 1 , 0 , 5 , new HighCritAttr ( ) ) ,
2023-04-16 02:51:08 +01:00
new AttackMove ( Moves . DUAL_CHOP , "Dual Chop" , Type . DRAGON , MoveCategory . PHYSICAL , 40 , 90 , 15 , - 1 , "Hits twice in one turn." , - 1 , 0 , 5 , new MultiHitAttr ( MultiHitType . _2 ) ) ,
new AttackMove ( Moves . HEART_STAMP , "Heart Stamp" , Type . PSYCHIC , MoveCategory . PHYSICAL , 60 , 100 , 25 , - 1 , "May cause flinching." , 30 , 0 , 5 , new FlinchAttr ( ) ) ,
2023-04-16 05:29:55 +01:00
new AttackMove ( Moves . HORN_LEECH , "Horn Leech" , Type . GRASS , MoveCategory . PHYSICAL , 75 , 100 , 10 , - 1 , "User recovers half the HP inflicted on opponent." , - 1 , 0 , 5 , new HitHealAttr ( ) ) ,
2023-04-22 06:09:35 +01:00
new AttackMove ( Moves . SACRED_SWORD , "Sacred Sword (N)" , Type . FIGHTING , MoveCategory . PHYSICAL , 90 , 100 , 15 , - 1 , "Ignores opponent's stat changes." , - 1 , 0 , 5 ) ,
2023-04-16 02:51:08 +01:00
new AttackMove ( Moves . RAZOR_SHELL , "Razor Shell" , Type . WATER , MoveCategory . PHYSICAL , 75 , 95 , 10 , - 1 , "May lower opponent's Defense." , 50 , 0 , 5 , new StatChangeAttr ( BattleStat . DEF , - 1 ) ) ,
2023-04-22 06:09:35 +01:00
new AttackMove ( Moves . HEAT_CRASH , "Heat Crash (N)" , Type . FIRE , MoveCategory . PHYSICAL , - 1 , 100 , 10 , - 1 , "The heavier the user, the stronger the attack." , - 1 , 0 , 5 ) ,
2023-04-16 02:51:08 +01:00
new AttackMove ( Moves . LEAF_TORNADO , "Leaf Tornado" , Type . GRASS , MoveCategory . SPECIAL , 65 , 90 , 10 , - 1 , "May lower opponent's Accuracy." , 50 , 0 , 5 , new StatChangeAttr ( BattleStat . ACC , - 1 ) ) ,
new AttackMove ( Moves . STEAMROLLER , "Steamroller" , Type . BUG , MoveCategory . PHYSICAL , 65 , 100 , 20 , - 1 , "May cause flinching." , 30 , 0 , 5 , new FlinchAttr ( ) ) ,
2023-04-18 17:30:47 +01:00
new SelfStatusMove ( Moves . COTTON_GUARD , "Cotton Guard" , Type . GRASS , - 1 , 10 , - 1 , "Drastically raises user's Defense." , - 1 , 0 , 5 , new StatChangeAttr ( BattleStat . DEF , 3 , true ) ) ,
2023-04-16 02:51:08 +01:00
new AttackMove ( Moves . NIGHT_DAZE , "Night Daze" , Type . DARK , MoveCategory . SPECIAL , 85 , 95 , 10 , - 1 , "May lower opponent's Accuracy." , 40 , 0 , 5 , new StatChangeAttr ( BattleStat . ACC , - 1 ) ) ,
2023-04-22 06:09:35 +01:00
new AttackMove ( Moves . PSYSTRIKE , "Psystrike (N)" , Type . PSYCHIC , MoveCategory . SPECIAL , 100 , 100 , 10 , - 1 , "Inflicts damage based on the target's Defense, not Special Defense." , - 1 , 0 , 5 ) ,
2023-04-16 02:51:08 +01:00
new AttackMove ( Moves . TAIL_SLAP , "Tail Slap" , Type . NORMAL , MoveCategory . PHYSICAL , 25 , 85 , 10 , - 1 , "Hits 2-5 times in one turn." , - 1 , 0 , 5 , new MultiHitAttr ( ) ) ,
2023-04-17 05:46:50 +01:00
new AttackMove ( Moves . HURRICANE , "Hurricane" , Type . FLYING , MoveCategory . SPECIAL , 110 , 70 , 10 , 160 , "May confuse opponent." , 30 , 0 , 5 , new ThunderAccuracyAttr ( ) , new ConfuseAttr ( ) ) ,
2023-04-18 18:36:11 +01:00
new AttackMove ( Moves . HEAD_CHARGE , "Head Charge" , Type . NORMAL , MoveCategory . PHYSICAL , 120 , 100 , 15 , - 1 , "User receives recoil damage." , - 1 , 0 , 5 , new RecoilAttr ( ) ) ,
2023-04-16 02:51:08 +01:00
new AttackMove ( Moves . GEAR_GRIND , "Gear Grind" , Type . STEEL , MoveCategory . PHYSICAL , 50 , 85 , 15 , - 1 , "Hits twice in one turn." , - 1 , 0 , 5 , new MultiHitAttr ( MultiHitType . _2 ) ) ,
new AttackMove ( Moves . SEARING_SHOT , "Searing Shot" , Type . FIRE , MoveCategory . SPECIAL , 100 , 100 , 5 , - 1 , "May burn opponent." , 30 , 0 , 5 , new StatusEffectAttr ( StatusEffect . BURN ) ) ,
2023-04-22 06:09:35 +01:00
new AttackMove ( Moves . TECHNO_BLAST , "Techno Blast (N)" , Type . NORMAL , MoveCategory . SPECIAL , 120 , 100 , 5 , - 1 , "Type depends on the Drive being held." , - 1 , 0 , 5 ) ,
2023-04-16 02:51:08 +01:00
new AttackMove ( Moves . RELIC_SONG , "Relic Song" , Type . NORMAL , MoveCategory . SPECIAL , 75 , 100 , 10 , - 1 , "May put the target to sleep." , 10 , 0 , 5 , new StatusEffectAttr ( StatusEffect . SLEEP ) ) ,
2023-04-22 06:09:35 +01:00
new AttackMove ( Moves . SECRET_SWORD , "Secret Sword (N)" , Type . FIGHTING , MoveCategory . SPECIAL , 85 , 100 , 10 , - 1 , "Inflicts damage based on the target's Defense, not Special Defense." , - 1 , 0 , 5 ) ,
2023-04-16 02:51:08 +01:00
new AttackMove ( Moves . GLACIATE , "Glaciate" , Type . ICE , MoveCategory . SPECIAL , 65 , 95 , 10 , - 1 , "Lowers opponent's Speed." , 100 , 0 , 5 , new StatChangeAttr ( BattleStat . SPD , - 1 ) ) ,
new AttackMove ( Moves . BOLT_STRIKE , "Bolt Strike" , Type . ELECTRIC , MoveCategory . PHYSICAL , 130 , 85 , 5 , - 1 , "May paralyze opponent." , 20 , 0 , 5 , new StatusEffectAttr ( StatusEffect . PARALYSIS ) ) ,
new AttackMove ( Moves . BLUE_FLARE , "Blue Flare" , Type . FIRE , MoveCategory . SPECIAL , 130 , 85 , 5 , - 1 , "May burn opponent." , 20 , 0 , 5 , new StatusEffectAttr ( StatusEffect . BURN ) ) ,
new AttackMove ( Moves . FIERY_DANCE , "Fiery Dance" , Type . FIRE , MoveCategory . SPECIAL , 80 , 100 , 10 , - 1 , "May raise user's Special Attack." , 50 , 0 , 5 , new StatChangeAttr ( BattleStat . SPATK , 1 , true ) ) ,
new AttackMove ( Moves . FREEZE_SHOCK , "Freeze Shock" , Type . ICE , MoveCategory . PHYSICAL , 140 , 90 , 5 , - 1 , "Charges on first turn, attacks on second. May paralyze opponent." , 30 , 0 , 5 , new StatusEffectAttr ( StatusEffect . PARALYSIS ) ) ,
new AttackMove ( Moves . ICE_BURN , "Ice Burn" , Type . ICE , MoveCategory . SPECIAL , 140 , 90 , 5 , - 1 , "Charges on first turn, attacks on second. May burn opponent." , 30 , 0 , 5 ,
2023-04-13 17:16:36 +01:00
new ChargeAttr ( ChargeAnim . ICE_BURN_CHARGING , 'became cloaked\nin freezing air!' ) , new StatusEffectAttr ( StatusEffect . BURN ) ) ,
2023-04-16 02:51:08 +01:00
new AttackMove ( Moves . SNARL , "Snarl" , Type . DARK , MoveCategory . SPECIAL , 55 , 95 , 15 , 30 , "Lowers opponent's Special Attack." , 100 , 0 , 5 , new StatChangeAttr ( BattleStat . SPATK , - 1 ) ) ,
new AttackMove ( Moves . ICICLE_CRASH , "Icicle Crash" , Type . ICE , MoveCategory . PHYSICAL , 85 , 90 , 10 , - 1 , "May cause flinching." , 30 , 0 , 5 , new FlinchAttr ( ) ) ,
new AttackMove ( Moves . V_CREATE , "V-create" , Type . FIRE , MoveCategory . PHYSICAL , 180 , 95 , 5 , - 1 , "Lowers user's Defense, Special Defense and Speed." , 100 , 0 , 5 ,
2023-04-15 22:40:18 +01:00
new StatChangeAttr ( [ BattleStat . DEF , BattleStat . SPDEF , BattleStat . SPD ] , - 1 , true ) ) ,
2023-04-22 06:09:35 +01:00
new AttackMove ( Moves . FUSION_FLARE , "Fusion Flare (N)" , Type . FIRE , MoveCategory . SPECIAL , 100 , 100 , 5 , - 1 , "Power increases if Fusion Bolt is used in the same turn." , - 1 , 0 , 5 ) ,
new AttackMove ( Moves . FUSION_BOLT , "Fusion Bolt (N)" , Type . ELECTRIC , MoveCategory . PHYSICAL , 100 , 100 , 5 , - 1 , "Power increases if Fusion Flare is used in the same turn." , - 1 , 0 , 5 )
2023-04-04 04:38:31 +01:00
] ;